Compare commits

..

16 Commits
master ... i18n

Author SHA1 Message Date
jacob1
d90a718818 Some uncomitted warning fixes I had 2020-04-06 23:38:36 -04:00
mniip
6aeb0aa74b remove _ascii and undeprecate conversions from string literals 2020-03-31 06:30:56 +03:00
mniip
e317164c2b Fixes for msvc warnings 2020-03-25 00:07:10 +03:00
mniip
8e67a6ff89 i18n for everything else 2020-03-24 22:56:27 +03:00
mniip
7f4aae7e99 Refactor even more stuff 2020-03-24 21:50:04 +03:00
mniip
56f2872104 Add plurals for saves/stamps 2020-03-24 19:17:34 +03:00
mniip
bb4f242e0b Add support for plural forms 2020-03-24 19:17:34 +03:00
mniip
a16a4936a5 Refactor more stuff 2020-03-24 19:17:18 +03:00
mniip
18cd57006b Remove swear words from the source 2020-03-24 19:17:16 +03:00
mniip
cae041cdee Refactor introtext and rules into the locale 2020-03-24 13:01:53 +03:00
mniip
53c5487abe Refactor stuff for i18n 2020-03-24 12:00:47 +03:00
mniip
5b20bc534f i18n headers 2020-03-20 08:40:01 +03:00
mniip
51f77f08b7 Internationalize simulation data (element names, descriptions, tools, walls, menus) 2020-03-20 07:32:07 +03:00
mniip
131accb5ac Add i18n debug stuff 2020-03-20 07:02:16 +03:00
mniip
bf05a14ef5 Temporarily deprecate character literal to string conversions. 2020-03-20 05:45:13 +03:00
mniip
4726f55c3e Initial i18n/l10n support 2020-03-11 07:14:40 +03:00
912 changed files with 53215 additions and 51669 deletions

2
.github/.gitignore vendored
View File

@ -1,2 +0,0 @@
build_init.bat
jdk.ini

515
.github/build.sh vendored
View File

@ -1,515 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
if [[ -z ${BSH_BUILD_PLATFORM-} ]]; then >&2 echo "BSH_BUILD_PLATFORM not set"; exit 1; fi
if [[ -z ${BSH_HOST_ARCH-} ]]; then >&2 echo "BSH_HOST_ARCH not set"; exit 1; fi
if [[ -z ${BSH_HOST_PLATFORM-} ]]; then >&2 echo "BSH_HOST_PLATFORM not set"; exit 1; fi
if [[ -z ${BSH_HOST_LIBC-} ]]; then >&2 echo "BSH_HOST_LIBC not set"; exit 1; fi
if [[ -z ${BSH_STATIC_DYNAMIC-} ]]; then >&2 echo "BSH_STATIC_DYNAMIC not set"; exit 1; fi
if [[ -z ${BSH_DEBUG_RELEASE-} ]]; then >&2 echo "BSH_DEBUG_RELEASE not set"; exit 1; fi
if [[ -z ${RELEASE_NAME-} ]]; then >&2 echo "RELEASE_NAME not set"; exit 1; fi
if [[ -z ${RELEASE_TYPE-} ]]; then >&2 echo "RELEASE_TYPE not set"; exit 1; fi
if [[ -z ${MOD_ID-} ]]; then >&2 echo "MOD_ID not set"; exit 1; fi
if [[ -z ${SEPARATE_DEBUG-} ]]; then >&2 echo "SEPARATE_DEBUG not set"; exit 1; fi
if [[ -z ${PACKAGE_MODE-} ]]; then >&2 echo "PACKAGE_MODE not set"; exit 1; fi
if [[ -z ${ASSET_PATH-} ]]; then >&2 echo "ASSET_PATH not set"; exit 1; fi
if [[ -z ${DEBUG_ASSET_PATH-} ]]; then >&2 echo "DEBUG_ASSET_PATH not set"; exit 1; fi
if [[ -z ${APP_NAME-} ]]; then >&2 echo "APP_NAME not set"; exit 1; fi
if [[ -z ${APP_COMMENT-} ]]; then >&2 echo "APP_COMMENT not set"; exit 1; fi
if [[ -z ${APP_EXE-} ]]; then >&2 echo "APP_EXE not set"; exit 1; fi
if [[ -z ${APP_ID-} ]]; then >&2 echo "APP_ID not set"; exit 1; fi
if [[ -z ${APP_DATA-} ]]; then >&2 echo "APP_DATA not set"; exit 1; fi
if [[ -z ${APP_VENDOR-} ]]; then >&2 echo "APP_VENDOR not set"; exit 1; fi
case $BSH_HOST_ARCH-$BSH_HOST_PLATFORM-$BSH_HOST_LIBC-$BSH_STATIC_DYNAMIC in
x86_64-linux-gnu-static) ;;
x86_64-linux-gnu-dynamic) ;;
x86_64-windows-mingw-static) ;;
x86_64-windows-mingw-dynamic) ;;
x86_64-windows-msvc-static) ;;
x86_64-windows-msvc-dynamic) ;;
x86-windows-msvc-static) ;;
x86-windows-msvc-dynamic) ;;
x86_64-darwin-macos-static) ;;
x86_64-darwin-macos-dynamic) ;;
aarch64-darwin-macos-static) ;;
aarch64-darwin-macos-dynamic) ;;
x86-android-bionic-static) ;;
x86_64-android-bionic-static) ;;
arm-android-bionic-static) ;;
aarch64-android-bionic-static) ;;
wasm32-emscripten-emscripten-static) ;;
*) >&2 echo "configuration $BSH_HOST_ARCH-$BSH_HOST_PLATFORM-$BSH_HOST_LIBC-$BSH_STATIC_DYNAMIC is not supported" && exit 1;;
esac
if [[ $BSH_HOST_PLATFORM == android ]]; then
android_platform=android-31
if [[ -z "${JAVA_HOME_8_X64-}" ]]; then
>&2 echo "JAVA_HOME_8_X64 not set"
exit 1
fi
if [[ -z "${ANDROID_SDK_ROOT-}" ]]; then
>&2 echo "ANDROID_SDK_ROOT not set"
exit 1
fi
if [[ -z "${ANDROID_NDK_LATEST_HOME-}" ]]; then
>&2 echo "ANDROID_NDK_LATEST_HOME not set"
exit 1
fi
fi
if [[ -z ${BSH_NO_PACKAGES-} ]]; then
case $BSH_HOST_PLATFORM in
android)
(
export PATH=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/tools/bin:$PATH
sdkmanager "platforms;$android_platform"
)
;;
windows)
if [[ $BSH_BUILD_PLATFORM-$BSH_HOST_LIBC == windows-mingw ]]; then
pacman -S --noconfirm --needed mingw-w64-ucrt-x86_64-gcc
if [[ $BSH_STATIC_DYNAMIC == static ]]; then
pacman -S --noconfirm --needed mingw-w64-ucrt-x86_64-{cmake,7zip,jq} patch
else
pacman -S --noconfirm --needed mingw-w64-ucrt-x86_64-{pkgconf,bzip2,luajit,jsoncpp,curl,SDL2,libpng,meson,fftw,jq}
fi
export PKG_CONFIG=$(which pkg-config.exe)
fi
;;
linux)
sudo apt update
if [[ $BSH_STATIC_DYNAMIC == static ]]; then
sudo apt install libc6-dev libc6-dev-i386
else
sudo apt install libluajit-5.1-dev libcurl4-openssl-dev libfftw3-dev zlib1g-dev libsdl2-dev libbz2-dev libjsoncpp-dev
fi
;;
darwin)
brew install pkg-config binutils
if [[ $BSH_STATIC_DYNAMIC != static ]]; then
brew install luajit curl fftw zlib sdl2 bzip2 jsoncpp
fi
;;
emscripten)
git clone https://github.com/emscripten-core/emsdk.git --branch 3.1.30
cd emsdk
./emsdk install latest
./emsdk activate latest
. ./emsdk_env.sh
cd ..
;;
esac
fi
function inplace_sed() {
local subst=$1
local path=$2
if [[ $BSH_BUILD_PLATFORM == darwin ]]; then
sed -i "" -e $subst $path
else
sed -i $subst $path
fi
}
if [[ $BSH_HOST_PLATFORM-$BSH_HOST_LIBC == windows-msvc ]]; then
case $BSH_HOST_ARCH in
x86_64) vs_env_arch=x64;;
x86) vs_env_arch=x86;;
esac
VS_ENV_PARAMS=$vs_env_arch$'\t'-vcvars_ver=14.1
. ./.github/vs-env.sh
elif [[ $BSH_HOST_PLATFORM == darwin ]]; then
# may need export SDKROOT=$(xcrun --show-sdk-path --sdk macosx11.1)
CC=clang
CXX=clang++
if [[ $BSH_HOST_ARCH == aarch64 ]]; then
macos_min_ver=11.0
CC+=" -arch arm64"
CXX+=" -arch arm64"
else
macos_min_ver=10.13
CC+=" -arch x86_64"
CXX+=" -arch x86_64"
fi
if [[ $BSH_STATIC_DYNAMIC == static ]]; then
export MACOSX_DEPLOYMENT_TARGET=$macos_min_ver
fi
export CC
export CXX
elif [[ $BSH_HOST_PLATFORM == android ]]; then
case $BSH_HOST_ARCH in
x86_64) android_toolchain_prefix=x86_64-linux-android ; android_system_version=21; android_arch_abi=x86_64 ;;
x86) android_toolchain_prefix=i686-linux-android ; android_system_version=21; android_arch_abi=x86 ;;
aarch64) android_toolchain_prefix=aarch64-linux-android ; android_system_version=21; android_arch_abi=arm64-v8a ;;
arm) android_toolchain_prefix=armv7a-linux-androideabi; android_system_version=21; android_arch_abi=armeabi-v7a;;
esac
android_toolchain_dir=$ANDROID_NDK_LATEST_HOME/toolchains/llvm/prebuilt/linux-x86_64
CC=$android_toolchain_dir/bin/$android_toolchain_prefix$android_system_version-clang
CXX=$android_toolchain_dir/bin/$android_toolchain_prefix$android_system_version-clang++
LD=$android_toolchain_dir/bin/$android_toolchain_prefix-ld
AR=$android_toolchain_dir/bin/llvm-ar
echo $AR
CC+=" -fPIC"
CXX+=" -fPIC"
LD+=" -fPIC"
export CC
export CXX
export LD
export AR
else
export CC=gcc
export CXX=g++
fi
if [[ -d build ]]; then
rm -r build
fi
c_args=
c_link_args=
if [[ $BSH_HOST_PLATFORM-$BSH_HOST_LIBC != windows-msvc ]]; then
c_args+=\'-ffunction-sections\',
c_args+=\'-fdata-sections\',
if [[ $BSH_HOST_PLATFORM == darwin ]]; then
c_link_args+=\'-Wl,-dead_strip\',
else
c_link_args+=\'-Wl,--gc-sections\',
fi
fi
if [[ $BSH_HOST_PLATFORM-$BSH_STATIC_DYNAMIC == darwin-static ]]; then
c_args+=\'-mmacosx-version-min=$macos_min_ver\',
c_link_args+=\'-mmacosx-version-min=$macos_min_ver\',
fi
meson_configure=meson$'\t'setup
if [[ $BSH_DEBUG_RELEASE == release ]]; then
meson_configure+=$'\t'-Dbuildtype=debugoptimized
fi
if [[ $BSH_HOST_PLATFORM == darwin ]]; then
meson_configure+=$'\t'-Dmanifest_macos_min_ver=$macos_min_ver
else
meson_configure+=$'\t'-Dmanifest_date=$(date --iso-8601)
fi
meson_configure+=$'\t'-Dapp_name=$APP_NAME
meson_configure+=$'\t'-Dapp_comment=$APP_COMMENT
meson_configure+=$'\t'-Dapp_exe=$APP_EXE
meson_configure+=$'\t'-Dapp_id=$APP_ID
meson_configure+=$'\t'-Dapp_data=$APP_DATA
meson_configure+=$'\t'-Dapp_vendor=$APP_VENDOR
meson_configure+=$'\t'-Dstrip=false
meson_configure+=$'\t'-Db_staticpic=false
meson_configure+=$'\t'-Dmod_id=$MOD_ID
case $BSH_HOST_ARCH-$BSH_HOST_PLATFORM-$BSH_HOST_LIBC-$BSH_DEBUG_RELEASE in
x86_64-linux-gnu-debug) ;&
x86_64-windows-mingw-debug) ;&
x86_64-windows-msvc-debug) ;&
x86_64-darwin-macos-debug)
meson_configure+=$'\t'-Dbuild_render=true
meson_configure+=$'\t'-Dbuild_font=true
;;
esac
if [[ $PACKAGE_MODE == nohttp ]]; then
meson_configure+=$'\t'-Dhttp=false
fi
if [[ $PACKAGE_MODE == nolua ]]; then
meson_configure+=$'\t'-Dlua=none
fi
if [[ $PACKAGE_MODE == backendvs ]]; then
meson_configure+=$'\t'-Dbackend=vs
# meson 1.2.3 configures vs projects that bring their own manifest, which conflicts with ours
# TODO: remove this patch once https://github.com/mesonbuild/meson/pull/12472 makes it into a release that we can use
meson_configure+=$'\t'-Dwindows_utf8cp=false
fi
if [[ $BSH_STATIC_DYNAMIC == static ]]; then
meson_configure+=$'\t'-Dstatic=prebuilt
if [[ $BSH_HOST_PLATFORM == windows ]]; then
if [[ $BSH_HOST_LIBC == msvc ]]; then
meson_configure+=$'\t'-Db_vscrt=static_from_buildtype
else
c_link_args+=\'-static\',
c_link_args+=\'-static-libgcc\',
c_link_args+=\'-static-libstdc++\',
fi
elif [[ $BSH_HOST_PLATFORM == linux ]]; then
c_link_args+=\'-static-libgcc\',
c_link_args+=\'-static-libstdc++\',
fi
else
if [[ "$BSH_HOST_PLATFORM-$BSH_HOST_LIBC $BSH_BUILD_PLATFORM" == "windows-mingw windows" ]]; then
meson_configure+=$'\t'-Dworkaround_elusive_bzip2=true
meson_configure+=$'\t'-Dworkaround_elusive_bzip2_include_dir=/ucrt64/include
meson_configure+=$'\t'-Dworkaround_elusive_bzip2_lib_dir=/ucrt64/lib
fi
if [[ $BSH_BUILD_PLATFORM == linux ]]; then
meson_configure+=$'\t'-Dworkaround_elusive_bzip2=true
fi
if [[ $BSH_BUILD_PLATFORM == darwin ]]; then
meson_configure+=$'\t'-Dworkaround_elusive_bzip2=true
meson_configure+=$'\t'-Dworkaround_elusive_bzip2_lib_dir=/usr/local/opt/bzip2/lib
meson_configure+=$'\t'-Dworkaround_elusive_bzip2_include_dir=/usr/local/opt/bzip2/include
meson_configure+=$'\t'-Dworkaround_elusive_bzip2_static=true
fi
fi
if [[ $BSH_HOST_PLATFORM == linux ]] && [[ $BSH_HOST_ARCH != aarch64 ]]; then
# certain file managers can't run PIEs https://bugzilla.gnome.org/show_bug.cgi?id=737849
meson_configure+=$'\t'-Db_pie=false
c_link_args+=\'-no-pie\',
fi
stable_or_beta=no
if [[ $RELEASE_TYPE == beta ]]; then
meson_configure+=$'\t'-Dbeta=true
stable_or_beta=yes
fi
if [[ $RELEASE_TYPE == stable ]]; then
stable_or_beta=yes
fi
if [[ $stable_or_beta == yes ]]; then
xyz=$(echo $RELEASE_NAME | cut -d 'v' -f 2 | cut -d 'b' -f 1) # $RELEASE_NAME is vX.Y.Z or vX.Y.Zb
display_version_major=$(echo $xyz | cut -d '.' -f 1)
display_version_minor=$(echo $xyz | cut -d '.' -f 2)
build_num=$(echo $xyz | cut -d '.' -f 3)
if [[ $MOD_ID != 0 ]]; then
meson_configure+=$'\t'-Ddisplay_version_major=$display_version_major
meson_configure+=$'\t'-Ddisplay_version_minor=$display_version_minor
meson_configure+=$'\t'-Dbuild_num=$build_num
fi
fi
if [[ $RELEASE_TYPE == snapshot ]]; then
build_num=$(echo $RELEASE_NAME | cut -d '-' -f 2) # $RELEASE_NAME is snapshot-X
meson_configure+=$'\t'-Dsnapshot=true
if [[ $MOD_ID != 0 ]]; then
meson_configure+=$'\t'-Dbuild_num=$build_num
fi
fi
if [[ $RELEASE_TYPE == snapshot ]] && [[ $MOD_ID != 0 ]]; then
>&2 echo "mods and snapshots do not mix"
exit 1
fi
if [[ $RELEASE_TYPE == snapshot ]] || [[ $MOD_ID != 0 ]]; then
meson_configure+=$'\t'-Dupdate_server=starcatcher.us/TPT
if [[ $BSH_HOST_PLATFORM == emscripten ]]; then
meson_configure+=$'\t'-Dserver=tptserv.starcatcher.us
meson_configure+=$'\t'-Dstatic_server=tptserv.starcatcher.us/Static
fi
fi
if [[ $RELEASE_TYPE != dev ]]; then
meson_configure+=$'\t'-Dignore_updates=false
fi
if [[ "$BSH_HOST_PLATFORM-$BSH_HOST_LIBC" == "windows-mingw" ]]; then
meson_configure+=$'\t'--cross-file=.github/mingw-ghactions.ini
# there is some mingw bug that only ever manifests on ghactions which makes MakeIco.exe use tons of memory and fail
# TODO: remove this hack once we figure out how to fix that
meson_configure+=$'\t'-Dwindows_icons=false
fi
if [[ $BSH_DEBUG_RELEASE-$BSH_STATIC_DYNAMIC == release-static ]]; then
meson_configure+=$'\t'-Db_lto=true
fi
if [[ $BSH_HOST_PLATFORM-$BSH_HOST_ARCH == darwin-aarch64 ]]; then
meson_configure+=$'\t'--cross-file=.github/macaa64-ghactions.ini
fi
if [[ $BSH_HOST_PLATFORM == emscripten ]]; then
meson_configure+=$'\t'--cross-file=.github/emscripten-ghactions.ini
fi
if [[ $RELEASE_TYPE == tptlibsdev ]] && ([[ $BSH_HOST_PLATFORM-$BSH_HOST_LIBC == windows-msvc ]] || [[ $BSH_STATIC_DYNAMIC == static ]]); then
if [[ -z ${TPTLIBSREMOTE-} ]]; then
if [[ -z "${GITHUB_REPOSITORY_OWNER-}" ]]; then
>&2 echo "GITHUB_REPOSITORY_OWNER not set"
exit 1
fi
tptlibsremote=https://github.com/$GITHUB_REPOSITORY_OWNER/tpt-libs
else
tptlibsremote=$TPTLIBSREMOTE
fi
tptlibsbranch=$(echo $RELEASE_NAME | cut -d '-' -f 2-) # $RELEASE_NAME is tptlibsdev-BRANCH
if [[ -d build-tpt-libs ]] && [[ ${TPTLIBSRESET-} == yes ]]; then
rm -rf build-tpt-libs
fi
if [[ ! -d build-tpt-libs/tpt-libs ]]; then
mkdir -p build-tpt-libs
cd build-tpt-libs
git clone $tptlibsremote --branch $tptlibsbranch --depth 1
cd ..
fi
tpt_libs_vtag=v00000000000000
if [[ ! -f build-tpt-libs/tpt-libs/.ok ]]; then
cd build-tpt-libs/tpt-libs
BSH_VTAG=$tpt_libs_vtag ./.github/build.sh
touch .ok
cd ../../subprojects
for i in tpt-libs-prebuilt-*; do
if [[ -d $i ]]; then
rm -r $i
fi
done
7z x ../build-tpt-libs/tpt-libs/temp/libraries.zip
cd ..
fi
meson_configure+=$'\t'-Dtpt_libs_vtag=$tpt_libs_vtag
fi
if [[ $BSH_HOST_PLATFORM == android ]]; then
android_platform_jar=$ANDROID_SDK_ROOT/platforms/$android_platform/android.jar
if ! [[ -f $android_platform_jar ]]; then
>&2 echo "$android_platform_jar not found"
exit 1
fi
meson_configure+=$'\t'--cross-file=android/cross/$BSH_HOST_ARCH.ini
cat << ANDROID_INI > .github/android-ghactions.ini
[constants]
andriod_ndk_toolchain_bin = '$ANDROID_NDK_LATEST_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin'
andriod_sdk_build_tools = '$ANDROID_SDK_ROOT/build-tools/32.0.0'
[properties]
# android_ndk_toolchain_prefix comes from the correct cross-file in ./android/cross
android_ndk_toolchain_prefix = android_ndk_toolchain_prefix
android_platform = '$android_platform'
android_platform_jar = '$android_platform_jar'
java_runtime_jar = '$JAVA_HOME_8_X64/jre/lib/rt.jar'
[binaries]
# android_ndk_toolchain_prefix comes from the correct cross-file in ./android/cross
c = andriod_ndk_toolchain_bin / (android_ndk_toolchain_prefix + 'clang')
cpp = andriod_ndk_toolchain_bin / (android_ndk_toolchain_prefix + 'clang++')
strip = andriod_ndk_toolchain_bin / 'llvm-strip'
javac = '$JAVA_HOME_8_X64/bin/javac'
jar = '$JAVA_HOME_8_X64/bin/jar'
d8 = andriod_sdk_build_tools / 'd8'
aapt = andriod_sdk_build_tools / 'aapt'
aapt2 = andriod_sdk_build_tools / 'aapt2'
zipalign = andriod_sdk_build_tools / 'zipalign'
apksigner = andriod_sdk_build_tools / 'apksigner'
ANDROID_INI
meson_configure+=$'\t'--cross-file=.github/android-ghactions.ini
fi
meson_configure+=$'\t'-Dc_args=[$c_args]
meson_configure+=$'\t'-Dcpp_args=[$c_args]
meson_configure+=$'\t'-Dc_link_args=[$c_link_args]
meson_configure+=$'\t'-Dcpp_link_args=[$c_link_args]
$meson_configure build
cd build
function verify_version_component() {
local key=$1
local expected=$2
local actual=$(jq -r '.[] | select(.name == "'$key'") | .value' < meson-info/intro-buildoptions.json)
if [[ $actual != $expected ]]; then
>&2 echo "meson option $key expected to be $expected, is instead $actual"
exit 1
fi
}
if [[ $stable_or_beta == yes ]] && [[ $MOD_ID == 0 ]]; then
verify_version_component display_version_major $display_version_major
verify_version_component display_version_minor $display_version_minor
verify_version_component build_num $build_num
verify_version_component upstream_version_major $display_version_major
verify_version_component upstream_version_minor $display_version_minor
verify_version_component upstream_build_num $build_num
fi
if [[ $RELEASE_TYPE == snapshot ]] && [[ $MOD_ID == 0 ]]; then
verify_version_component build_num $build_num
verify_version_component upstream_build_num $build_num
fi
strip=strip
objcopy=objcopy
strip_target=$ASSET_PATH
if [[ $BSH_HOST_PLATFORM == android ]]; then
strip=$ANDROID_NDK_LATEST_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-$strip
objcopy=$ANDROID_NDK_LATEST_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-$objcopy
strip_target=lib$APP_EXE.so
fi
if [[ $PACKAGE_MODE == appimage ]]; then
# so far this can only happen with $BSH_HOST_PLATFORM-$BSH_HOST_LIBC == linux-gnu, but this may change later
meson configure -Dcan_install=no -Dignore_updates=true -Dbuild_render=false -Dbuild_font=false
strip_target=$APP_EXE
fi
meson_compile=meson$'\t'compile
meson_compile+=$'\t'-v
if [[ $BSH_BUILD_PLATFORM == windows ]] && [[ $PACKAGE_MODE != backendvs ]]; then
set +e
meson_compile+=$'\t'--ninja-args='["-d","keeprsp"]'
$meson_compile
ninja_code=$?
set -e
cat $APP_EXE.exe.rsp
[[ $ninja_code == 0 ]];
echo # rsps don't usually have a newline at the end
if [[ "$BSH_HOST_PLATFORM-$BSH_STATIC_DYNAMIC $BSH_BUILD_PLATFORM" == "windows-dynamic windows" ]]; then
# on windows we provide the dynamic dependencies also; makes sense to check for their presence
# msys ldd works fine but only on windows build machines
if ldd $APP_EXE | grep "not found"; then
exit 1 # ldd | grep will have printed missing deps
fi
fi
else
$meson_compile
fi
if [[ $SEPARATE_DEBUG == yes ]] && [[ $BSH_HOST_PLATFORM-$BSH_HOST_LIBC != windows-msvc ]]; then
$objcopy --only-keep-debug $strip_target $DEBUG_ASSET_PATH
$strip --strip-debug --strip-unneeded $strip_target
$objcopy --add-gnu-debuglink $DEBUG_ASSET_PATH $strip_target
chmod -x $DEBUG_ASSET_PATH
fi
if [[ $BSH_HOST_PLATFORM == android ]]; then
$JAVA_HOME_8_X64/bin/keytool -genkeypair -keystore keystore.jks -alias androidkey -validity 10000 -keyalg RSA -keysize 2048 -keypass bagelsbagels -storepass bagelsbagels -dname "CN=nobody"
meson configure -Dandroid_keystore=$(realpath keystore.jks)
ANDROID_KEYSTORE_PASS=bagelsbagels ninja android/$APP_EXE.apk
mv android/$APP_EXE.apk $APP_EXE.apk
fi
if [[ $PACKAGE_MODE == dmg ]]; then
# so far this can only happen with $BSH_HOST_PLATFORM-$BSH_HOST_LIBC == darwin-macos
appdir=$APP_NAME.app
mkdir $appdir
mkdir $appdir/Contents
cp resources/Info.plist $appdir/Contents/Info.plist
mkdir $appdir/Contents/MacOS
cp $APP_EXE $appdir/Contents/MacOS/$APP_EXE
mkdir $appdir/Contents/Resources
mkdir icon_exe.iconset
cp ../resources/generated_icons/icon_exe_16.png icon_exe.iconset/icon_16x16.png
cp ../resources/generated_icons/icon_exe_32.png icon_exe.iconset/icon_32x32.png
cp ../resources/generated_icons/icon_exe.png icon_exe.iconset/icon_128x128.png
iconutil -c icns icon_exe.iconset
cp icon_exe.icns $appdir/Contents/Resources/icon_exe.icns
mkdir icon_cps.iconset
cp ../resources/generated_icons/icon_cps_16.png icon_cps.iconset/icon_16x16.png
cp ../resources/generated_icons/icon_cps_32.png icon_cps.iconset/icon_32x32.png
cp ../resources/generated_icons/icon_cps.png icon_cps.iconset/icon_128x128.png
iconutil -c icns icon_cps.iconset
cp icon_cps.icns $appdir/Contents/Resources/icon_cps.icns
mkdir dmgroot
mv $appdir dmgroot/$appdir
cp ../LICENSE dmgroot/LICENSE
cp ../README.md dmgroot/README.md
hdiutil create -format UDZO -volname $APP_NAME -fs HFS+ -srcfolder dmgroot -o $ASSET_PATH
elif [[ $PACKAGE_MODE == emscripten ]]; then
tar cvf $ASSET_PATH $APP_EXE.js $APP_EXE.worker.js $APP_EXE.wasm
elif [[ $PACKAGE_MODE == appimage ]]; then
# so far this can only happen with $BSH_HOST_PLATFORM-$BSH_HOST_LIBC == linux-gnu, but this may change later
case $BSH_HOST_ARCH in
aarch64) appimage_arch=aarch64;;
arm) appimage_arch=armhf ;;
x86) appimage_arch=i686 ;;
x86_64) appimage_arch=x86_64 ;;
esac
curl -fsSLo appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-$appimage_arch.AppImage"
curl -fsSLo AppRun "https://github.com/AppImage/AppImageKit/releases/download/continuous/AppRun-$appimage_arch"
chmod +x appimagetool
chmod +x AppRun
appdir=bagels.AppDir # doesn't matter, won't be visible in the resulting appimage
mkdir -p $appdir/usr/bin
mkdir -p $appdir/usr/share/metainfo
mkdir -p $appdir/usr/share/applications
mkdir -p $appdir/usr/share/icons
cp $APP_EXE $appdir/usr/bin/$APP_EXE
mv AppRun $appdir/AppRun
cp ../resources/icon_exe.svg $appdir/$APP_VENDOR-$APP_EXE.svg
cp resources/powder.desktop $appdir/$APP_ID.desktop
cp resources/appdata.xml $appdir/usr/share/metainfo/$APP_ID.appdata.xml
cp $appdir/$APP_VENDOR-$APP_EXE.svg $appdir/usr/share/icons/$APP_VENDOR-$APP_EXE.svg
cp $appdir/$APP_ID.desktop $appdir/usr/share/applications/$APP_ID.desktop
./appimagetool $appdir $ASSET_PATH
fi

View File

@ -1,4 +0,0 @@
set -euo pipefail
IFS=$'\t\n'
gh release create --draft --verify-tag --title $RELEASE_NAME $GITHUB_REF_NAME

View File

@ -1,11 +0,0 @@
[binaries]
c = 'emcc'
cpp = 'em++'
strip = 'emstrip'
ar = 'emar'
[host_machine]
system = 'emscripten'
cpu_family = 'wasm32'
cpu = 'wasm32'
endian = 'little'

View File

@ -1,11 +0,0 @@
[binaries]
c = [ 'clang', '-arch', 'arm64' ]
cpp = [ 'clang++', '-arch', 'arm64' ]
objcpp = [ 'clang++', '-arch', 'arm64' ]
strip = 'strip'
[host_machine]
system = 'darwin'
cpu_family = 'aarch64'
cpu = 'armv8'
endian = 'little'

View File

@ -1,14 +0,0 @@
[constants]
prefix = 'x86_64-w64-mingw32'
[binaries]
c = prefix + '-gcc'
cpp = prefix + '-g++'
strip = prefix + '-strip'
windres = prefix + '-windres'
[host_machine]
system = 'windows'
cpu_family = 'x86_64'
cpu = 'x86_64'
endian = 'little'

1
.github/mod_id.txt vendored
View File

@ -1 +0,0 @@
0

216
.github/prepare.py vendored
View File

@ -1,216 +0,0 @@
import datetime
import json
import os
import re
import subprocess
import sys
ref = os.getenv('GITHUB_REF')
event_name = os.getenv('GITHUB_EVENT_NAME')
publish_hostport = os.getenv('PUBLISH_HOSTPORT')
def set_output(key, value):
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
f.write(f"{key}={value}\n")
match_stable = re.fullmatch(r'refs/tags/v([0-9]+)\.([0-9]+)\.([0-9]+)', ref)
match_beta = re.fullmatch(r'refs/tags/v([0-9]+)\.([0-9]+)\.([0-9]+)b', ref)
match_snapshot = re.fullmatch(r'refs/tags/snapshot-([0-9]+)', ref)
match_tptlibsdev = re.fullmatch(r'refs/heads/tptlibsdev-(.*)', ref)
match_alljobs = re.fullmatch(r'refs/heads/(.*)-alljobs', ref)
do_release = False
do_priority = 10
if event_name == 'pull_request':
do_priority = 0
if match_stable:
release_type = 'stable'
release_name = 'v%s.%s.%s' % (match_stable.group(1), match_stable.group(2), match_stable.group(3))
do_release = True
do_priority = 0
elif match_beta:
release_type = 'beta'
release_name = 'v%s.%s.%sb' % (match_beta.group(1), match_beta.group(2), match_beta.group(3))
do_release = True
do_priority = 0
elif match_snapshot:
release_type = 'snapshot'
release_name = 'snapshot-%s' % match_snapshot.group(1)
do_release = True
do_priority = 0
elif match_tptlibsdev:
release_type = 'tptlibsdev'
release_name = 'tptlibsdev-%s' % match_tptlibsdev.group(1)
do_priority = 0
else:
release_type = 'dev'
release_name = 'dev'
if match_alljobs:
do_priority = 0
do_publish = publish_hostport and do_release
set_output('release_type', release_type)
set_output('release_name', release_name)
subprocess.run([ 'meson', 'setup', '-Dprepare=true', 'build-prepare' ], check = True)
build_options = {}
with open('build-prepare/meson-info/intro-buildoptions.json') as f:
for option in json.loads(f.read()):
build_options[option['name']] = option['value']
if int(build_options['mod_id']) == 0 and os.path.exists('.github/mod_id.txt'):
with open('.github/mod_id.txt') as f:
build_options['mod_id'] = f.read()
if int(build_options['mod_id']) == 0:
if release_type == 'stable':
pass
elif release_type == 'beta':
build_options['app_name' ] += ' Beta'
build_options['app_comment'] += ' - Beta'
build_options['app_exe' ] += 'beta'
build_options['app_id' ] += 'beta'
elif release_type == 'snapshot':
build_options['app_name' ] += ' Snapshot'
build_options['app_comment'] += ' - Snapshot'
build_options['app_exe' ] += 'snapshot'
build_options['app_id' ] += 'snapshot'
else:
build_options['app_name' ] += ' Dev'
build_options['app_comment'] += ' - Dev'
build_options['app_exe' ] += 'dev'
build_options['app_id' ] += 'dev'
set_output('mod_id' , build_options['mod_id' ])
set_output('app_name' , build_options['app_name' ])
set_output('app_comment', build_options['app_comment'])
set_output('app_exe' , build_options['app_exe' ])
set_output('app_id' , build_options['app_id' ])
set_output('app_data' , build_options['app_data' ])
set_output('app_vendor' , build_options['app_vendor' ])
app_exe = build_options['app_exe']
app_name = build_options['app_name']
app_name_slug = re.sub('[^A-Za-z0-9]', '_', app_name)
build_matrix = []
publish_matrix = []
# consider disabling line wrapping to edit this monstrosity
for arch, platform, libc, statdyn, bplatform, runson, suffix, publish, artifact, dbgsuffix, mode, starcatcher, dbgrel, priority in [
( 'x86_64', 'linux', 'gnu', 'static', 'linux', 'ubuntu-20.04', '', False, False, None, None, None, 'debug', 0 ), # priority = 0: static debug build
( 'x86_64', 'linux', 'gnu', 'static', 'linux', 'ubuntu-20.04', '', True, True, '.dbg', None, 'x86_64-lin-gcc-static', 'release', 10 ),
( 'x86_64', 'linux', 'gnu', 'static', 'linux', 'ubuntu-20.04', '', False, True, '.dbg', 'appimage', None, 'release', 0 ), # priority = 0: appimage release
( 'x86_64', 'linux', 'gnu', 'dynamic', 'linux', 'ubuntu-20.04', '', False, False, None, None, None, 'debug', 10 ),
( 'x86_64', 'linux', 'gnu', 'dynamic', 'linux', 'ubuntu-20.04', '', False, False, None, 'nohttp', None, 'debug', 10 ),
( 'x86_64', 'linux', 'gnu', 'dynamic', 'linux', 'ubuntu-20.04', '', False, False, None, 'nolua', None, 'debug', 10 ),
( 'x86_64', 'linux', 'gnu', 'dynamic', 'linux', 'ubuntu-20.04', '', False, False, None, None, None, 'release', 10 ),
# ( 'x86_64', 'windows', 'mingw', 'static', 'linux', 'ubuntu-20.04', '', False, False, None, None, None, 'debug', 10 ), # ubuntu-20.04 doesn't have windows TLS headers somehow and I haven't yet figured out how to get them; worse, it's a different toolchain
# ( 'x86_64', 'windows', 'mingw', 'static', 'linux', 'ubuntu-20.04', '', False, True, '.dbg', None, None, 'release', 10 ), # ubuntu-20.04 doesn't have windows TLS headers somehow and I haven't yet figured out how to get them; worse, it's a different toolchain
# ( 'x86_64', 'windows', 'mingw', 'dynamic', 'linux', 'ubuntu-20.04', '', False, False, None, None, None, 'debug', 10 ), # ubuntu-20.04 doesn't have ucrt64-capable mingw >_>
# ( 'x86_64', 'windows', 'mingw', 'dynamic', 'linux', 'ubuntu-20.04', '', False, False, None, None, None, 'release', 10 ), # ubuntu-20.04 doesn't have ucrt64-capable mingw >_>
( 'x86_64', 'windows', 'mingw', 'static', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'debug', 0 ), # priority = 0: static debug build
( 'x86_64', 'windows', 'mingw', 'static', 'windows', 'windows-2019', '.exe', False, True, '.dbg', None, None, 'release', 10 ),
( 'x86_64', 'windows', 'mingw', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'debug', 10 ),
( 'x86_64', 'windows', 'mingw', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'release', 10 ),
( 'x86_64', 'windows', 'msvc', 'static', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'debug', 0 ), # priority = 0: static debug build
( 'x86_64', 'windows', 'msvc', 'static', 'windows', 'windows-2019', '.exe', True, True, '.pdb', None,'x86_64-win-msvc-static', 'release', 10 ),
( 'x86_64', 'windows', 'msvc', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'debug', 10 ),
# ( 'x86_64', 'windows', 'msvc', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, 'backendvs', None, 'debug', 0 ), # priority = 0: backend=vs build
( 'x86_64', 'windows', 'msvc', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'release', 10 ),
( 'x86', 'windows', 'msvc', 'static', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'debug', 0 ), # priority = 0: static debug build
( 'x86', 'windows', 'msvc', 'static', 'windows', 'windows-2019', '.exe', True, True, '.pdb', None, 'i686-win-msvc-static', 'release', 10 ),
( 'x86', 'windows', 'msvc', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'debug', 10 ),
( 'x86', 'windows', 'msvc', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'release', 10 ),
( 'x86_64', 'darwin', 'macos', 'static', 'darwin', 'macos-12', '.dmg', False, False, None, 'dmg', None, 'debug', 0 ), # priority = 0: static debug build
( 'x86_64', 'darwin', 'macos', 'static', 'darwin', 'macos-12', '.dmg', True, True, None, 'dmg', 'x86_64-mac-gcc-static', 'release', 10 ), # I have no idea how to separate debug info on macos
( 'x86_64', 'darwin', 'macos', 'dynamic', 'darwin', 'macos-12', '.dmg', False, False, None, 'dmg', None, 'debug', 10 ),
( 'x86_64', 'darwin', 'macos', 'dynamic', 'darwin', 'macos-12', '.dmg', False, False, None, 'dmg', None, 'release', 10 ),
( 'aarch64', 'darwin', 'macos', 'static', 'darwin', 'macos-12', '.dmg', False, False, None, 'dmg', None, 'debug', 0 ), # priority = 0: static debug build
( 'aarch64', 'darwin', 'macos', 'static', 'darwin', 'macos-12', '.dmg', True, True, None, 'dmg', 'arm64-mac-gcc-static', 'release', 10 ),
# ( 'aarch64', 'darwin', 'macos', 'dynamic', 'darwin', 'macos-12', '.dmg', False, False, None, 'dmg', None, 'debug', 10 ), # macos-11.0 is x86_64 and I haven't yet figured out how to get homebrew to install aarch64 libs on x86_64
# ( 'aarch64', 'darwin', 'macos', 'dynamic', 'darwin', 'macos-12', '.dmg', False, False, None, 'dmg', None, 'release', 10 ), # macos-11.0 is x86_64 and I haven't yet figured out how to get homebrew to install aarch64 libs on x86_64
( 'x86', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', False, False, None, None, None, 'debug', 0 ), # priority = 0: rarely used debug build
( 'x86', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', True, True, '.dbg', None, 'i686-and-gcc-static', 'release', 10 ),
( 'x86_64', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', False, False, None, None, None, 'debug', 0 ), # priority = 0: rarely used debug build
( 'x86_64', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', True, True, '.dbg', None, 'x86_64-and-gcc-static', 'release', 10 ),
( 'arm', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', False, False, None, None, None, 'debug', 0 ), # priority = 0: rarely used debug build
( 'arm', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', True, True, '.dbg', None, 'arm-and-gcc-static', 'release', 10 ),
( 'aarch64', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', False, False, None, None, None, 'debug', 0 ), # priority = 0: rarely used debug build
( 'aarch64', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', True, True, '.dbg', None, 'arm64-and-gcc-static', 'release', 10 ),
( 'wasm32', 'emscripten', 'emscripten', 'static', 'linux', 'ubuntu-20.04', '.tar', False, False, None, None, None, 'debug', 0 ), # priority = 0: rarely used debug build
( 'wasm32', 'emscripten', 'emscripten', 'static', 'linux', 'ubuntu-20.04', '.tar', True, True, None, 'emscripten', 'wasm32-ems-static', 'release', 10 ), # I have no idea how to separate debug info on emscripten
]:
if priority < do_priority:
continue
job_name = f'build'
if starcatcher:
job_name += f'+target=starcatcher-{starcatcher}'
else:
job_name += f'+target={arch}-{platform}-{libc}-{statdyn}-{dbgrel}'
if mode:
job_name += f'+mode={mode}'
if bplatform != platform:
job_name += f'+bplatform={bplatform}'
if not mode:
mode = 'default'
separate_debug = True
if not dbgsuffix:
dbgsuffix = 'BOGUS'
separate_debug = False
if not starcatcher:
starcatcher = 'BOGUS'
if publish:
assert artifact
if dbgrel != 'release':
assert not publish
assert not artifact
asset_path = f'{app_exe}{suffix}'
asset_name = f'{app_exe}-{release_name}-{arch}-{platform}-{libc}{suffix}'
debug_asset_path = f'{app_exe}{dbgsuffix}'
debug_asset_name = f'{app_exe}-{release_name}-{arch}-{platform}-{libc}{dbgsuffix}'
if mode == 'appimage':
asset_path = f'{app_name_slug}-{arch}.AppImage'
asset_name = f'{app_name_slug}-{arch}.AppImage'
debug_asset_path = f'{app_name_slug}-{arch}.AppImage.dbg'
debug_asset_name = f'{app_name_slug}-{arch}.AppImage.dbg'
starcatcher_name = f'powder-{release_name}-{starcatcher}{suffix}'
msys2_bash = (bplatform == 'windows' and libc == 'mingw')
shell = 'bash'
if msys2_bash:
shell = 'msys2 {0}'
build_matrix.append({
'bsh_build_platform': bplatform, # part of the unique portion of the matrix
'bsh_host_arch': arch, # part of the unique portion of the matrix
'bsh_host_platform': platform, # part of the unique portion of the matrix
'bsh_host_libc': libc, # part of the unique portion of the matrix
'bsh_static_dynamic': statdyn, # part of the unique portion of the matrix
'bsh_debug_release': dbgrel, # part of the unique portion of the matrix
'runs_on': runson,
'force_msys2_bash': msys2_bash and 'yes' or 'no',
'package_suffix': suffix,
'package_mode': mode,
'publish': publish and 'yes' or 'no',
'artifact': artifact and 'yes' or 'no',
'separate_debug': separate_debug and 'yes' or 'no',
'asset_path': asset_path,
'asset_name': asset_name,
'debug_asset_path': debug_asset_path,
'debug_asset_name': debug_asset_name,
'job_name': job_name,
'shell': shell,
})
if publish:
publish_matrix.append({
'bsh_build_platform': bplatform, # part of the unique portion of the matrix
'bsh_host_arch': arch, # part of the unique portion of the matrix
'bsh_host_platform': platform, # part of the unique portion of the matrix
'bsh_host_libc': libc, # part of the unique portion of the matrix
'bsh_static_dynamic': statdyn, # part of the unique portion of the matrix
'asset_path': asset_path,
'asset_name': asset_name,
'starcatcher_name': starcatcher_name,
})
set_output('build_matrix', json.dumps({ 'include': build_matrix }))
set_output('publish_matrix', json.dumps({ 'include': publish_matrix }))
set_output('do_release', do_release and 'yes' or 'no')
set_output('do_publish', do_publish and 'yes' or 'no')

View File

@ -1,20 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
cat << NETRC > ~/.netrc
machine $(echo $PUBLISH_HOSTPORT | cut -d ':' -f 1)
login $PUBLISH_USERNAME
password $PUBLISH_PASSWORD
NETRC
chmod 660 ~/.netrc
mountpoint=ftpmnt
mkdir $mountpoint
curlftpfs "$PUBLISH_HOSTPORT" $mountpoint -o ssl,ciphers='ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-GCM-SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_128_CCM_SHA256'
if [[ -z ${PUBLISH_ACCESSCHECK-} ]]; then
cp $PUBLISH_FILENAME $mountpoint/${PUBLISH_DIRECTORY:-.}/
fi
fusermount -u $mountpoint
rmdir $mountpoint

View File

@ -1,10 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
curl "https://starcatcher.us/TPT/perform-release.lua?mod=$MOD_ID&type=$RELEASE_TYPE&name=$RELEASE_NAME&commit=$GITHUB_SHA" > perform_release
if ! grep "Release complete" < perform_release > /dev/null; then
cat perform_release
exit 1
fi

View File

@ -1,12 +0,0 @@
set -euo pipefail
IFS=$'\t\n'
temp=.temp
mkdir $temp
cp $ASSET_PATH $temp/$ASSET_NAME
(
cd $temp
gh release upload $GITHUB_REF_NAME $ASSET_NAME
)
rm -r $temp
echo browser_download_url=https://github.com/$GITHUB_REPOSITORY/releases/download/$GITHUB_REF_NAME/$ASSET_NAME >> $GITHUB_OUTPUT

31
.github/vs-env.sh vendored
View File

@ -1,31 +0,0 @@
set -euo pipefail
IFS=$'\t\n'
IFS=$'\t\n\r'
for i in $("$(env | grep '^ProgramFiles(x86)=' | cut -d = -f 2-)/Microsoft Visual Studio/Installer/vswhere.exe" \
-sort \
-prerelease \
-requiresAny \
-requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 \
-requires Microsoft.VisualStudio.Workload.WDExpress \
-products \* \
-utf8 \
-property installationPath); do
if ! [ -z ${VS_ENV_FILTER-} ]; then
if ! echo $i | grep $VS_ENV_FILTER >/dev/null; then
continue
fi
fi
vs_install_dir=$i
break
done
IFS=$'\t\n'
for i in $(MSYS_NO_PATHCONV=1 cmd /c "$vs_install_dir\\VC\\Auxiliary\\Build\\vcvarsall.bat" $VS_ENV_PARAMS \& env \& exit /b); do
set +e
export "$i" 2>/dev/null
echo $i | grep ERROR
set -e
done
cl

View File

@ -1,182 +0,0 @@
name: build
on:
push:
branches:
- '*'
tags:
- 'v*.*'
- 'snapshot-*'
- 'tptlibsdev-*'
pull_request:
branches:
- '*'
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
do_release: ${{ steps.prepare.outputs.do_release }}
build_matrix: ${{ steps.prepare.outputs.build_matrix }}
publish_matrix: ${{ steps.prepare.outputs.publish_matrix }}
release_type: ${{ steps.prepare.outputs.release_type }}
release_name: ${{ steps.prepare.outputs.release_name }}
mod_id: ${{ steps.prepare.outputs.mod_id }}
app_name: ${{ steps.prepare.outputs.app_name }}
app_comment: ${{ steps.prepare.outputs.app_comment }}
app_exe: ${{ steps.prepare.outputs.app_exe }}
app_id: ${{ steps.prepare.outputs.app_id }}
app_data: ${{ steps.prepare.outputs.app_data }}
app_vendor: ${{ steps.prepare.outputs.app_vendor }}
do_publish: ${{ steps.prepare.outputs.do_publish }}
steps:
- run: git config --global core.autocrlf false
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.10'
- run: python -m pip install meson==1.2.3 ninja # TODO: go back to using latest meson once https://github.com/mesonbuild/meson/pull/12544 is live
- id: prepare
run: python ./.github/prepare.py
env:
PUBLISH_HOSTPORT: ${{ secrets.STARCATCHER_PUBLISH_HOSTPORT }}
GITHUB_REF: ${{ github.ref }}
- if: steps.prepare.outputs.do_publish == 'yes'
run: sudo apt update && sudo apt install curlftpfs && bash -c './.github/starcatcher-publish.sh'
env:
PUBLISH_HOSTPORT: ${{ secrets.STARCATCHER_PUBLISH_HOSTPORT }}
PUBLISH_USERNAME: ${{ secrets.STARCATCHER_PUBLISH_USERNAME }}
PUBLISH_PASSWORD: ${{ secrets.STARCATCHER_PUBLISH_PASSWORD }}
PUBLISH_ACCESSCHECK: yes
- if: steps.prepare.outputs.do_release == 'yes'
id: create_release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_NAME: ${{ steps.prepare.outputs.release_name }}
run: bash -c './.github/create-release.sh'
build:
runs-on: ${{ matrix.runs_on }}
name: ${{ matrix.job_name }}
needs: [prepare]
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.prepare.outputs.build_matrix) }}
defaults:
run:
shell: ${{ matrix.shell }}
steps:
- if: matrix.force_msys2_bash == 'yes'
uses: msys2/setup-msys2@v2
with:
msystem: UCRT64
update: true
path-type: strict
cache: true
# this list doesn't have to mirror the one in build.sh perfectly
# but the packages listed here get cached properly and take less time to install
install: >-
git
curl
mingw-w64-ucrt-x86_64-gcc
mingw-w64-ucrt-x86_64-pkgconf
mingw-w64-ucrt-x86_64-bzip2
mingw-w64-ucrt-x86_64-luajit
mingw-w64-ucrt-x86_64-jsoncpp
mingw-w64-ucrt-x86_64-curl
mingw-w64-ucrt-x86_64-SDL2
mingw-w64-ucrt-x86_64-libpng
mingw-w64-ucrt-x86_64-meson
mingw-w64-ucrt-x86_64-python
mingw-w64-ucrt-x86_64-python-pip
mingw-w64-ucrt-x86_64-fftw
mingw-w64-ucrt-x86_64-cmake
mingw-w64-ucrt-x86_64-7zip
mingw-w64-ucrt-x86_64-jq
patch
- run: git config --global core.autocrlf false
- uses: actions/checkout@v4
- if: matrix.force_msys2_bash != 'yes'
uses: actions/setup-python@v5
with:
python-version: '3.10'
- if: matrix.force_msys2_bash != 'yes'
run: python -m pip install meson==1.2.3 ninja # TODO: go back to using latest meson once https://github.com/mesonbuild/meson/pull/12544 is live
- if: matrix.bsh_build_platform == 'darwin'
run: brew install bash coreutils
- run: bash -c './.github/build.sh'
env:
BSH_HOST_ARCH: ${{ matrix.bsh_host_arch }}
BSH_HOST_PLATFORM: ${{ matrix.bsh_host_platform }}
BSH_HOST_LIBC: ${{ matrix.bsh_host_libc }}
BSH_STATIC_DYNAMIC: ${{ matrix.bsh_static_dynamic }}
BSH_BUILD_PLATFORM: ${{ matrix.bsh_build_platform }}
BSH_DEBUG_RELEASE: ${{ matrix.bsh_debug_release }}
RELEASE_NAME: ${{ needs.prepare.outputs.release_name }}
RELEASE_TYPE: ${{ needs.prepare.outputs.release_type }}
MOD_ID: ${{ needs.prepare.outputs.mod_id }}
APP_NAME: ${{ needs.prepare.outputs.app_name }}
APP_COMMENT: ${{ needs.prepare.outputs.app_comment }}
APP_EXE: ${{ needs.prepare.outputs.app_exe }}
APP_ID: ${{ needs.prepare.outputs.app_id }}
APP_DATA: ${{ needs.prepare.outputs.app_data }}
APP_VENDOR: ${{ needs.prepare.outputs.app_vendor }}
SEPARATE_DEBUG: ${{ matrix.separate_debug }}
PACKAGE_MODE: ${{ matrix.package_mode }}
ASSET_PATH: ${{ matrix.asset_path }}
DEBUG_ASSET_PATH: ${{ matrix.debug_asset_path }}
- if: needs.prepare.outputs.do_release == 'yes' && matrix.publish == 'yes' # TODO-NTL: ship licenses
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ASSET_PATH: build/${{ matrix.asset_path }}
ASSET_NAME: ${{ matrix.asset_name }}
run: bash -c './.github/upload-release-asset.sh'
- if: needs.prepare.outputs.do_release == 'yes' && matrix.publish == 'yes' && matrix.separate_debug == 'yes'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ASSET_PATH: build/${{ matrix.debug_asset_path }}
ASSET_NAME: ${{ matrix.debug_asset_name }}
run: bash -c './.github/upload-release-asset.sh'
- uses: actions/upload-artifact@v4
if: matrix.artifact == 'yes'
with:
path: build/${{ matrix.asset_path }}
name: ${{ matrix.asset_name }}
- uses: actions/upload-artifact@v4
if: matrix.artifact == 'yes' && matrix.separate_debug == 'yes'
with:
path: build/${{ matrix.debug_asset_path }}
name: ${{ matrix.debug_asset_name }}
publish:
runs-on: ubuntu-latest
needs: [build, prepare]
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.prepare.outputs.publish_matrix) }}
if: needs.prepare.outputs.do_publish == 'yes'
steps:
- run: git config --global core.autocrlf false
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: ${{ matrix.asset_name }}
- run: mv ${{ matrix.asset_path }} ${{ matrix.starcatcher_name }}
- run: sudo apt update && sudo apt install curlftpfs && bash -c './.github/starcatcher-publish.sh'
env:
PUBLISH_HOSTPORT: ${{ secrets.STARCATCHER_PUBLISH_HOSTPORT }}
PUBLISH_USERNAME: ${{ secrets.STARCATCHER_PUBLISH_USERNAME }}
PUBLISH_PASSWORD: ${{ secrets.STARCATCHER_PUBLISH_PASSWORD }}
PUBLISH_DIRECTORY: ${{ secrets.STARCATCHER_PUBLISH_DIRECTORY }}
PUBLISH_FILENAME: ${{ matrix.starcatcher_name }}
release:
runs-on: ubuntu-latest
needs: [build, publish, prepare]
if: needs.prepare.outputs.do_publish == 'yes'
steps:
- run: git config --global core.autocrlf false
- uses: actions/checkout@v4
- run: ./.github/starcatcher-release.sh
env:
RELEASE_NAME: ${{ needs.prepare.outputs.release_name }}
RELEASE_TYPE: ${{ needs.prepare.outputs.release_type }}
MOD_ID: ${{ needs.prepare.outputs.mod_id }}
GITHUB_SHA: ${{ github.sha }}

95
.gitignore vendored
View File

@ -1,47 +1,34 @@
# Misc extensions, system files
*.zip
*.txt
*.gz
*.out
*.sh
*.py
*.png
*.ppm
*nohup.out
*.swp
*~
.DS_Store
# Build files
build*/*
*.o
*.exe
*.dmg
*.user
*.dll
*.a
*.la
# Legacy SCons files
config.log
*.sconsign.dblite
*.sconf_temp
/site_scons/
/generated/
# User data
/stamps/
/Saves/
/scripts/
/recordings/
*.def
*~
*.pref
*.lua
screenshot_*
# Visual studio
/Debug/
/Release/
/includes/
*.sh
stdout.txt
stderr.txt
build*/*
stamps/*
Saves/*
scripts/*
generated/*
includes/*
recordings/
font/*
generate
Makefile.me
*.xcodeproj
.DS_Store
*.plist
*.lproj
*.vcxproj*
*.opensdf
*.sdf
*.user
*.filter
*.sln
@ -61,34 +48,26 @@ screenshot_*
*.unsuccessfulbuild
*.pdb
*.db
# QtCreator / KDevelop
*.user
*.config
*.creator*
*.cflags
*.cxxflags
*.files
*.includes
*.kdev4
/.kdev4
# Other IDEs / misc
.vscode/
.vs/
*.sublime-*
*.project
*.cproject
*.settings
*.cbp
*.layout
*.config
*.creator*
*.cflags
*.cxxflags
*.files
*.includes
config.log
*.sconsign.dblite
*.sconf_temp
*.gch
*.pyc
*.xcodeproj
*.plist
*.lproj
*.opensdf
*.sdf
/font/
compile_commands.json
ignore/
site_scons/site_tools/mfprogram/*.pyc
site_scons/site_tools/gch/*.pyc
.vscode/
.vs/
screenshot_*

View File

@ -1,4 +1,4 @@
The Powder Toy - April 2024
The Powder Toy - February 2020
==========================
Get the latest version [from the Powder Toy website](https://powdertoy.co.uk/Download.html).
@ -10,7 +10,7 @@ Have you ever wanted to blow something up? Or maybe you always dreamt of operati
The Powder Toy is a free physics sandbox game, which simulates air pressure and velocity, heat, gravity and a countless number of interactions between different substances! The game provides you with various building materials, liquids, gases and electronic components which can be used to construct complex machines, guns, bombs, realistic terrains and almost anything else. You can then mine them and watch cool explosions, add intricate wirings, play with little stickmen or operate your machine. You can browse and play thousands of different saves made by the community or upload your own we welcome your creations!
There is a Lua API you can automate your work or even make plugins for the game. The Powder Toy is free and the source code is distributed under the GNU General Public License, so you can modify the game yourself or help with development.
There is a Lua API you can automate your work or even make plugins for the game. The Powder Toy is free and the source code is distributed under the GNU General Public License, so you can modify the game yourself or help with development. TPT is compiled using scons.
Build instructions
===========================================================================
@ -25,39 +25,25 @@ Thanks
* Skresanov Savely
* cracker64
* Catelite
* Victoria Hoyle
* Bryan Hoyle
* Nathan Cousins
* jacksonmj
* Felix Wallin
* Lieuwe Mosch
* Anthony Boot
* Me4502
* Matthew "me4502"
* MaksProg
* jacob1
* mniip
* LBPHacker
Libraries and other assets used
===========================================================================
* [BSON](https://github.com/interactive-matter/bson-c)
* [bzip2](http://www.bzip.org/)
* [FFTW](http://fftw.org/)
* [JsonCpp](https://github.com/open-source-parsers/jsoncpp)
* [libcurl](https://curl.se/libcurl/)
* [libpng](http://www.libpng.org/pub/png/libpng.html)
* [Lua](https://www.lua.org/)
* [LuaJIT](https://luajit.org/)
* [Mallangche](https://github.com/JammPark/Mallangche)
* [mbedtls](https://www.trustedfirmware.org/projects/mbed-tls/)
* [SDL](https://libsdl.org/)
* [zlib](https://www.zlib.net/)
Instructions
===========================================================================
Click on the elements with the mouse and draw in the field, like in MS Paint. The rest of the game is learning what happens next.
Controls
===========================================================================
@ -82,7 +68,6 @@ Controls
| I | Invert Pressure and Velocity map |
| W | Cycle gravity modes (use with Ctrl when STK2 is out) |
| Y | Cycle air modes |
| Ctrl + E | Cycle edge modes |
| B | Enter decoration editor menu |
| Ctrl + B | Toggle decorations on/off |
| N | Toggle Newtonian Gravity on/off |
@ -108,21 +93,19 @@ Controls
| Shift + R | Horizontal mirror for selected area when pasting stamps |
| Ctrl + Shift + R | Vertical mirror for selected area when pasting stamps |
| R | Rotate selected area counterclockwise when pasting stamps |
| F11 | Toggle fullscreen |
Command Line
---------------------------------------------------------------------------
| Command | Description | Example |
| --------------------- | ------------------------------------------------ | --------------------------------------------|
| `scale:SIZE` | Change window scale factor | `scale:2` |
| `kiosk` | Fullscreen mode | |
| `proxy:SERVER[:PORT]` | Proxy server to use | `proxy:wwwcache.lancs.ac.uk:8080` |
| `open FILE` | Opens the file as a stamp or game save | |
| `ddir DIRECTORY` | Directory used for saving stamps and preferences | |
| `ptsave:SAVEID` | Open online save, used by ptsave: URLs | `ptsave:2198` |
| `disable-network` | Disables internet connections | |
| `disable-bluescreen` | Disable bluescreen handler | |
| `redirect` | Redirects output to stdout.txt / stderr.txt | |
| `cafile:CAFILE` | Set certificate bundle path | `cafile:/etc/ssl/certs/ca-certificates.crt` |
| `capath:CAPATH` | Set certificate directory path | `capath:/etc/ssl/certs` |
| Command | Description | Example |
| --------------------- | ------------------------------------------------ | --------------------------------- |
| `scale:SIZE` | Change window scale factor | `scale:2` |
| `kiosk` | Fullscreen mode | |
| `proxy:SERVER[:PORT]` | Proxy server to use | `proxy:wwwcache.lancs.ac.uk:8080` |
| `open FILE` | Opens the file as a stamp or game save | |
| `ddir DIRECTORY` | Directory used for saving stamps and preferences | |
| `ptsave:SAVEID` | Open online save, used by ptsave: URLs | `ptsave:2198` |
| `disable-network` | Disables internet connections | |
| `redirect` | Redirects output to stdout.txt / stderr.txt | |

617
SConscript Normal file
View File

@ -0,0 +1,617 @@
import os
import subprocess
import sys
import platform
import atexit
import time
import SCons.Util
# because of an implementation detail commandlines are limited to 10000 characters on windows using mingw. the following fix was copied from
# http://scons.org/wiki/LongCmdLinesOnWin32 and circumvents this issue.
class ourSpawn:
def ourspawn(self, sh, escape, cmd, args, env):
newargs = ' '.join(args[1:])
cmdline = cmd + " " + newargs
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, startupinfo=startupinfo, shell=False, env=env)
data, err = proc.communicate()
rv = proc.wait()
if rv:
print("=====")
print(err)
print("=====")
return rv
def SetupSpawn(env):
buf = ourSpawn()
buf.ourenv = env
env['SPAWN'] = buf.ourspawn
def FatalError(message):
print(message)
raise SystemExit(1)
#wrapper around SCons' AddOption
def AddSconsOption(name, default, hasArgs, help):
AddOption("--{0}".format(name), dest=name, action=("store" if hasArgs else "store_true"), default=default, help=help)
AddSconsOption('win', False, False, "Target Windows.")
AddSconsOption('lin', False, False, "Target Linux.")
AddSconsOption('mac', False, False, "Target Mac OS X.")
AddSconsOption('msvc', False, False, "Use the Microsoft Visual Studio compiler.")
AddSconsOption("tool", False, True, "Tool prefix appended before gcc/g++.")
AddSconsOption('beta', False, False, "Beta build.")
AddSconsOption('no-install-prompt', False, False, "Disable the \"do you want to install Powder Toy?\" prompt.")
AddSconsOption('ignore-updates', False, False, "Disable checking for updates.")
AddSconsOption('save-version', False, True, "Save version.")
AddSconsOption('minor-version', False, True, "Minor version.")
AddSconsOption('build-number', False, True, "Build number.")
AddSconsOption('snapshot', False, False, "Snapshot build.")
AddSconsOption('snapshot-id', False, True, "Snapshot build ID.")
AddSconsOption('64bit', False, False, "Compile a 64 bit binary.")
AddSconsOption('32bit', False, False, "Compile a 32 bit binary.")
AddSconsOption("universal", False, False, "compile universal binaries on Mac OS X.")
AddSconsOption('no-sse', False, False, "Disable SSE optimizations.")
AddSconsOption('sse', True, False, "Enable SSE optimizations (default).")
AddSconsOption('sse2', True, False, "Enable SSE2 optimizations (default).")
AddSconsOption('sse3', False, False, "Enable SSE3 optimizations.")
AddSconsOption('native', False, False, "Enable optimizations specific to your cpu.")
AddSconsOption('release', False, False, "Enable loop / compiling optimizations.")
AddSconsOption('debugging', False, False, "Compile with debug symbols.")
AddSconsOption('symbols', False, False, "Preserve (don't strip) symbols")
AddSconsOption('static', False, False, "Compile statically.")
AddSconsOption('opengl', False, False, "Build with OpenGL interface support.")
AddSconsOption('opengl-renderer', False, False, "Build with OpenGL renderer support (turns on --opengl).") #Note: this has nothing to do with --renderer, only tells the game to render particles with opengl
AddSconsOption('renderer', False, False, "Build the save renderer.")
AddSconsOption('font', False, False, "Build the font editor.")
AddSconsOption('i18n-debug', False, False, "Instrument the binary for debugging internationalization")
AddSconsOption('wall', False, False, "Error on all warnings.")
AddSconsOption('no-warnings', False, False, "Disable all compiler warnings.")
AddSconsOption('nolua', False, False, "Disable Lua.")
AddSconsOption('luajit', False, False, "Enable LuaJIT.")
AddSconsOption('lua52', False, False, "Compile using lua 5.2.")
AddSconsOption('nofft', False, False, "Disable FFT.")
AddSconsOption('nohttp', False, False, "Disable http requests and libcurl.")
AddSconsOption("output", False, True, "Executable output name.")
#detect platform automatically, but it can be overrided
tool = GetOption('tool')
isX86 = platform.machine() in ["amd64", "AMD64", "i386", "i686", "x86", "x86_64"]
platform = compilePlatform = platform.system()
if GetOption('win'):
platform = "Windows"
elif GetOption('lin'):
platform = "Linux"
elif GetOption('mac'):
platform = "Darwin"
elif compilePlatform not in ["Linux", "Windows", "Darwin", "FreeBSD"]:
FatalError("Unknown platform: {0}".format(platform))
msvc = GetOption('msvc')
if msvc and platform != "Windows":
FatalError("Error: --msvc only works on windows")
#Create SCons Environment
if GetOption('msvc'):
env = Environment(tools=['default'], ENV=os.environ, TARGET_ARCH='x86')
elif platform == "Windows" and not GetOption('msvc'):
env = Environment(tools=['mingw'], ENV=os.environ)
else:
env = Environment(tools=['default'], ENV=os.environ)
#attempt to automatically find cross compiler
if not tool and compilePlatform == "Linux" and platform == "Windows" and compilePlatform != platform:
if not GetOption('64bit'):
crossList = ["mingw32", "i686-w64-mingw32", "i386-mingw32msvc", "i486-mingw32msvc", "i586-mingw32msvc", "i686-mingw32msvc"]
else:
crossList = ["x86_64-w64-mingw32", "amd64-mingw32msvc"]
for i in crossList:
#found a cross compiler, set tool here, which will update everything in env later
if WhereIs("{0}-g++".format(i)):
tool = i+"-"
break
if not tool:
print("Could not automatically find cross compiler, use --tool to specify manually")
#set tool prefix
#more things may need to be set (http://clam-project.org/clam/trunk/CLAM/scons/sconstools/crossmingw.py), but this works for us
if tool:
env['CC'] = tool+env['CC']
env['CXX'] = tool+env['CXX']
if platform == "Windows":
env['RC'] = tool+env['RC']
env['STRIP'] = tool+'strip'
if os.path.isdir("/usr/{0}/bin".format(tool[:-1])):
env['ENV']['PATH'] = "/usr/{0}/bin:{1}".format(tool[:-1], os.environ['PATH'])
#copy environment variables because scons doesn't do this by default
for var in ["CC","CXX","LD","LIBPATH","STRIP"]:
if var in os.environ:
env[var] = os.environ[var]
print("copying environment variable {0}={1!r}".format(var,os.environ[var]))
# variables containing several space separated things
for var in ["CFLAGS","CCFLAGS","CXXFLAGS","LINKFLAGS","CPPDEFINES","CPPPATH"]:
if var in os.environ:
if var in env:
env[var] += SCons.Util.CLVar(os.environ[var])
else:
env[var] = SCons.Util.CLVar(os.environ[var])
print("copying environment variable {0}={1!r}".format(var,os.environ[var]))
#Used for intro text / executable name, actual bit flags are only set if the --64bit/--32bit command line args are given
def add32bitflags(env):
env["BIT"] = 32
def add64bitflags(env):
if platform == "Windows":
env.Append(CPPDEFINES=['__CRT__NO_INLINE'])
env.Append(LINKFLAGS=['-Wl,--stack=16777216'])
env.Append(CPPDEFINES=['_64BIT'])
env["BIT"] = 64
#add 32/64 bit defines before configuration
if GetOption('64bit'):
env.Append(LINKFLAGS=['-m64'])
env.Append(CCFLAGS=['-m64'])
add64bitflags(env)
elif GetOption('32bit'):
env.Append(LINKFLAGS=['-m32'])
env.Append(CCFLAGS=['-m32'])
add32bitflags(env)
if GetOption('universal'):
if platform != "Darwin":
FatalError("Error: --universal only works on Mac OS X")
else:
env.Append(CCFLAGS=['-arch', 'i386', '-arch', 'x86_64'])
env.Append(LINKFLAGS=['-arch', 'i386', '-arch', 'x86_64'])
env.Append(CPPPATH=['src/', 'data/'])
if GetOption("msvc"):
if GetOption("static"):
env.Append(LIBPATH=['StaticLibs/'])
else:
env.Append(LIBPATH=['Libraries/'])
env.Append(CPPPATH=['includes/', 'resources/'])
#Check 32/64 bit
def CheckBit(context):
context.Message('Checking if 64 bit... ')
program = """#include <stdlib.h>
#include <stdio.h>
int main() {
printf("%d", (int)sizeof(size_t));
return 0;
}
"""
ret = context.TryCompile(program, '.c')
if ret == 0:
return False
ret = context.TryRun(program, '.c')
if ret[1] == '':
return False
context.Result(int(ret[1]) == 8)
if int(ret[1]) == 8:
print("Adding 64 bit compile flags")
add64bitflags(context.env)
elif int(ret[1]) == 4:
print("Adding 32 bit compile flags")
add32bitflags(context.env)
return ret[1]
#Custom function to check for Mac OS X frameworks
def CheckFramework(context, framework):
import SCons.Conftest
#Extreme hack, TODO: maybe think of a better one (like replicating CheckLib here) or at least just fix the message
oldLinkFlags = env["LINKFLAGS"]
context.env.Append(LINKFLAGS=["-framework", framework])
context.Display("Checking for Darwin Framework {0}...".format(framework))
ret = SCons.Conftest.CheckLib(context, ["m"], autoadd = 0)
context.did_show_result = 1
if not ret:
context.env.Append(LINKFLAGS=["-framework", framework])
if framework != "Cocoa":
env.Append(CPPPATH=['/Library/Frameworks/{0}.framework/Headers/'.format(framework)])
else:
context.env.Replace(LINKFLAGS=oldLinkFlags)
return not ret
#function that finds libraries and appends them to LIBS
def findLibs(env, conf):
#Windows specific libs
if platform == "Windows":
if msvc:
libChecks = ['shell32', 'wsock32', 'user32', 'Advapi32', 'ws2_32', 'Wldap32', 'crypt32']
if GetOption('static'):
libChecks += ['imm32', 'version', 'Ole32', 'OleAut32', 'SetupApi']
for i in libChecks:
if not conf.CheckLib(i):
FatalError("Error: some windows libraries not found or not installed, make sure your compiler is set up correctly")
else:
if not conf.CheckLib('mingw32') or not conf.CheckLib('ws2_32'):
FatalError("Error: some windows libraries not found or not installed, make sure your compiler is set up correctly")
if not GetOption('renderer') and not conf.CheckLib('SDL2main'):
FatalError("libSDL2main not found or not installed")
#Look for SDL
runSdlConfig = platform == "Linux" or compilePlatform == "Linux" or platform == "FreeBSD"
if platform == "Darwin" and conf.CheckFramework("SDL2"):
runSdlConfig = False
elif not conf.CheckLib("SDL2"):
FatalError("SDL2 development library not found or not installed")
if runSdlConfig:
try:
env.ParseConfig('sdl2-config --cflags')
if GetOption('static'):
env.ParseConfig('sdl2-config --static-libs')
else:
env.ParseConfig('sdl2-config --libs')
except:
pass
#look for SDL.h
if conf.CheckCHeader('SDL2/SDL.h'):
env.Append(CPPDEFINES=["SDL_INC"])
elif not conf.CheckCHeader('SDL.h'):
FatalError("SDL.h not found")
if not GetOption('nolua') and not GetOption('renderer') and not GetOption('font'):
#Look for Lua
if platform == "FreeBSD":
luaver = "lua-5.1"
else:
luaver = "lua5.1"
if GetOption('luajit'):
if not conf.CheckLib(['luajit-5.1', 'luajit5.1', 'luajit2.0', 'luajit', 'libluajit']):
FatalError("luajit development library not found or not installed")
env.Append(CPPDEFINES=["LUAJIT"])
luaver = "luajit"
elif GetOption('lua52'):
if not conf.CheckLib(['lua5.2', 'lua-5.2', 'lua52', 'lua']):
FatalError("lua5.2 development library not found or not installed")
env.Append(CPPDEFINES=["LUA_COMPAT_ALL"])
if platform == "FreeBSD":
luaver = "lua-5.2"
else:
luaver = "lua5.2"
else:
if not conf.CheckLib(['lua5.1', 'lua-5.1', 'lua51', 'lua']):
if platform != "Darwin" or not conf.CheckFramework("Lua"):
FatalError("lua5.1 development library not found or not installed")
foundpkg = False
if platform == "Linux" or platform == "FreeBSD":
try:
env.ParseConfig("pkg-config --cflags {0}".format(luaver))
env.ParseConfig("pkg-config --libs {0}".format(luaver))
env.Append(CPPDEFINES=["LUA_R_INCL"])
foundpkg = True
except:
pass
if not foundpkg:
#Look for lua.h
foundheader = False
if GetOption('luajit'):
foundheader = conf.CheckCHeader('luajit-2.0/lua.h')
elif GetOption('lua52'):
foundheader = conf.CheckCHeader('lua5.2/lua.h') or conf.CheckCHeader('lua52/lua.h')
else:
foundheader = conf.CheckCHeader('lua5.1/lua.h') or conf.CheckCHeader('lua51/lua.h')
if not foundheader:
if conf.CheckCHeader('lua.h'):
env.Append(CPPDEFINES=["LUA_R_INCL"])
else:
FatalError("lua.h not found")
#needed for static lua compiles (in some cases)
if platform == "Linux":
conf.CheckLib('dl')
#Look for fftw
if not GetOption('nofft') and not GetOption('renderer') and not conf.CheckLib(['fftw3f', 'fftw3f-3', 'libfftw3f-3', 'libfftw3f']):
FatalError("fftw3f development library not found or not installed")
#Look for bz2
if not conf.CheckLib(['bz2', 'libbz2']):
FatalError("bz2 development library not found or not installed")
#Check bz2 header too for some reason
if not conf.CheckCHeader('bzlib.h'):
FatalError("bzip2 headers not found")
#Look for libz
if not conf.CheckLib(['z', 'zlib']):
FatalError("libz not found or not installed")
#Look for libcurl
useCurl = not GetOption('nohttp') and not GetOption('renderer')
if useCurl and not conf.CheckLib(['curl', 'libcurl']):
FatalError("libcurl not found or not installed")
if useCurl and (platform == "Linux" or compilePlatform == "Linux" or platform == "FreeBSD"):
if GetOption('static'):
env.ParseConfig("curl-config --static-libs")
else:
env.ParseConfig("curl-config --libs")
# Needed for ssl. Scons seems incapable of parsing this out of curl-config
if platform == "Darwin":
if not conf.CheckFramework('Security'):
FatalError("Could not find Security.Framework")
#Look for pthreads
if not conf.CheckLib(['pthread', 'pthreadVC2']):
FatalError("pthreads development library not found or not installed")
if msvc:
if not conf.CheckHeader('dirent.h') or not conf.CheckHeader('fftw3.h') or not conf.CheckHeader('pthread.h') or not conf.CheckHeader('zlib.h'):
FatalError("Required headers not found")
else:
#Look for libm
if not conf.CheckLib('m'):
FatalError("libm not found or not installed")
#Look for OpenGL libraries
if GetOption('opengl'):
if platform == "Linux" or platform == "FreeBSD":
if not conf.CheckLib('GL'):
FatalError("libGL not found or not installed")
try:
env.ParseConfig('pkg-config --libs glew gl glu')
except:
FatalError(sys.exc_info()[0])
elif platform == "Windows":
if not conf.CheckLib('opengl32'):
FatalError("opengl32 not found or not installed")
if not conf.CheckLib('glew32'):
FatalError("glew32 not found or not installed")
elif platform == "Darwin":
if not conf.CheckFramework("OpenGL"):
FatalError("OpenGL framework not found or not installed")
if platform == "Linux" or platform == "FreeBSD":
if not conf.CheckLib('X11'):
FatalError("X11 development library not found or not installed")
if not conf.CheckLib('rt'):
FatalError("librt not found or not installed")
elif platform == "Windows":
#These need to go last
if not conf.CheckLib('gdi32') or not conf.CheckLib('winmm') or (not msvc and not conf.CheckLib('dxguid')):
FatalError("Error: some windows libraries not found or not installed, make sure your compiler is set up correctly")
elif platform == "Darwin":
if not conf.CheckFramework("Cocoa"):
FatalError("Cocoa framework not found or not installed")
if GetOption('clean'):
pass
elif not GetOption('help'):
conf = Configure(env)
conf.AddTest('CheckFramework', CheckFramework)
conf.AddTest('CheckBit', CheckBit)
if not conf.CheckCC() or not conf.CheckCXX():
FatalError("compiler not correctly configured")
if platform == compilePlatform and isX86 and not GetOption('32bit') and not GetOption('64bit') and not GetOption('msvc'):
conf.CheckBit()
findLibs(env, conf)
env = conf.Finish()
if not msvc:
env.Append(CXXFLAGS=['-std=c++11' if not GetOption('i18n-debug') else '-std=c++14'])
env.Append(CXXFLAGS=['-U__STRICT_ANSI__'])
env.Append(CXXFLAGS=['-Wno-invalid-offsetof'])
if platform == "Linux":
env.Append(CXXFLAGS=['-Wno-unused-result'])
#Add platform specific flags and defines
if platform == "Windows":
env.Append(CPPDEFINES=["WIN", "_WIN32_WINNT=0x0501", "_USING_V110_SDK71_"])
if msvc:
env.Append(CCFLAGS=['/Gm', '/Zi', '/EHsc', '/FS', '/GS']) #enable minimal rebuild, ?, enable exceptions, allow -j to work in debug builds, enable security check
if GetOption('renderer'):
env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
else:
env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS,"5.01"'])
env.Append(LINKFLAGS=['/OPT:REF', '/OPT:ICF'])
env.Append(CPPDEFINES=['_SCL_SECURE_NO_WARNINGS']) #Disable warnings about 'std::print'
if GetOption('static'):
env.Append(LINKFLAGS=['/NODEFAULTLIB:msvcrt.lib', '/LTCG'])
elif not GetOption('debugging'):
env.Append(LINKFLAGS=['/NODEFAULTLIB:msvcrtd.lib'])
else:
env.Append(LINKFLAGS=['-mwindows'])
elif platform == "Linux" or platform == "FreeBSD":
env.Append(CPPDEFINES=['LIN'])
elif platform == "Darwin":
env.Append(CPPDEFINES=['MACOSX'])
#env.Append(LINKFLAGS=['-headerpad_max_install_names']) #needed in some cross compiles
if GetOption('luajit'):
env.Append(LINKFLAGS=['-pagezero_size', '10000', '-image_base', '100000000'])
#Add architecture flags and defines
if isX86:
env.Append(CPPDEFINES='X86')
if not GetOption('no-sse'):
if GetOption('sse'):
if msvc:
if not GetOption('sse2'):
env.Append(CCFLAGS=['/arch:SSE'])
else:
env.Append(CCFLAGS=['-msse'])
env.Append(CPPDEFINES=['X86_SSE'])
if GetOption('sse2'):
if msvc:
env.Append(CCFLAGS=['/arch:SSE2'])
else:
env.Append(CCFLAGS=['-msse2'])
env.Append(CPPDEFINES=['X86_SSE2'])
if GetOption('sse3'):
if msvc:
FatalError("--sse3 doesn't work with --msvc")
else:
env.Append(CCFLAGS=['-msse3'])
env.Append(CPPDEFINES=['X86_SSE3'])
if GetOption('native') and not msvc:
env.Append(CCFLAGS=['-march=native'])
#Add optimization flags and defines
if GetOption('debugging'):
if msvc:
env.Append(CCFLAGS=['/Od'])
if GetOption('static'):
env.Append(CCFLAGS=['/MTd'])
else:
env.Append(CCFLAGS=['/MDd'])
else:
env.Append(CCFLAGS=['-Wall', '-g'])
env.Append(CPPDEFINES=['DEBUG'])
elif GetOption('release'):
if msvc:
# Certain options (like /GL and /GS) cause TPT to be flagged as a virus. Don't include them
env.Append(CCFLAGS=['/O2', '/Oy-', '/fp:fast'])
if GetOption('static'):
env.Append(CCFLAGS=['/MT'])
else:
env.Append(CCFLAGS=['/MD'])
else:
env.Append(CCFLAGS=['-O3', '-ftree-vectorize', '-funsafe-math-optimizations', '-ffast-math', '-fomit-frame-pointer'])
if platform != "Darwin":
env.Append(CCFLAGS=['-funsafe-loop-optimizations'])
if GetOption('static'):
if platform == "Windows":
env.Append(CPPDEFINES=['CURL_STATICLIB'])
if compilePlatform == "Windows" and not msvc:
env.Append(CPPDEFINES=['_PTW32_STATIC_LIB'])
else:
env.Append(CPPDEFINES=['PTW32_STATIC_LIB'])
if msvc:
env.Append(CPPDEFINES=['ZLIB_WINAPI'])
else:
env.Append(LINKFLAGS=['-Wl,-Bstatic'])
#Add other flags and defines
if not GetOption('nofft') and not GetOption('renderer'):
env.Append(CPPDEFINES=['GRAVFFT'])
if not GetOption('nolua') and not GetOption('renderer') and not GetOption('font'):
env.Append(CPPDEFINES=['LUACONSOLE'])
if GetOption('nohttp') or GetOption('renderer'):
env.Append(CPPDEFINES=['NOHTTP'])
if GetOption('opengl') or GetOption('opengl-renderer'):
env.Append(CPPDEFINES=['OGLI', 'PIX32OGL'])
if GetOption('opengl-renderer'):
env.Append(CPPDEFINES=['OGLR'])
if GetOption('renderer'):
env.Append(CPPDEFINES=['RENDERER'])
if GetOption('font'):
env.Append(CPPDEFINES=['FONTEDITOR'])
if GetOption('i18n-debug'):
env.Append(CPPDEFINES=['I18N_DEBUG'])
if GetOption("wall"):
if msvc:
env.Append(CCFLAGS=['/WX'])
else:
env.Append(CCFLAGS=['-Werror'])
elif GetOption("no-warnings"):
if msvc:
env.Append(CCFLAGS=['/W0'])
else:
env.Append(CCFLAGS=['-w'])
#Add version defines
if GetOption('save-version'):
env.Append(CPPDEFINES=["SAVE_VERSION={0}".format(GetOption('save-version'))])
if GetOption('minor-version'):
env.Append(CPPDEFINES=["MINOR_VERSION={0}".format(GetOption('minor-version'))])
if GetOption('build-number'):
env.Append(CPPDEFINES=["BUILD_NUM={0}".format(GetOption('build-number'))])
if GetOption('snapshot-id'):
env.Append(CPPDEFINES=["SNAPSHOT", "SNAPSHOT_ID={0}".format(GetOption('snapshot-id'))])
elif GetOption('snapshot'):
env.Append(CPPDEFINES=["SNAPSHOT", "SNAPSHOT_ID={0}".format(str(int(time.time())))])
if GetOption('beta'):
env.Append(CPPDEFINES=['BETA'])
if GetOption('no-install-prompt'):
env.Append(CPPDEFINES=['NO_INSTALL_CHECK'])
if GetOption('ignore-updates'):
env.Append(CPPDEFINES=['IGNORE_UPDATES'])
#Generate list of sources to compile
sources = Glob("src/*.cpp") + Glob("src/*/*.cpp") + Glob("src/*/*/*.cpp") + Glob("data/*.cpp") + Glob("data/localization/*.cpp")
if not GetOption('nolua') and not GetOption('renderer') and not GetOption('font'):
sources += Glob("src/lua/socket/*.c") + Glob("src/lua/LuaCompat.c")
if platform == "Windows":
sources += env.RES('resources/powder-res.rc')
if not msvc:
sources = filter(lambda source: not 'src\\simulation\\Gravity.cpp' in str(source), sources)
sources = filter(lambda source: not 'src/simulation/Gravity.cpp' in str(source), sources)
envCopy = env.Clone()
envCopy.Append(CCFLAGS='-mstackrealign')
sources += envCopy.Object('src/simulation/Gravity.cpp')
#elif platform == "Darwin":
# sources += ["src/SDLMain.m"]
#Program output name
if GetOption('output'):
programName = GetOption('output')
else:
programName = "powder"
if GetOption('renderer'):
programName = "render"
if GetOption('font'):
programName = "font"
if "BIT" in env and env["BIT"] == 64:
programName += "64"
if isX86 and GetOption('no-sse'):
programName += "-legacy"
if platform == "Windows":
programName = programName.capitalize()
programName += ".exe"
elif platform == "Darwin":
programName += "-x"
#strip binary after compilation
def strip():
global programName
global env
try:
os.system("{0} {1}/{2}".format(env['STRIP'] if 'STRIP' in env else "strip", GetOption('builddir'), programName))
except:
print("Couldn't strip binary")
if not GetOption('debugging') and not GetOption('symbols') and not GetOption('clean') and not GetOption('help') and not msvc:
atexit.register(strip)
#Long command line fix for mingw on windows
if compilePlatform == "Windows" and not msvc:
SetupSpawn(env)
#Once we get here, finally compile
env.Decider('MD5-timestamp')
SetOption('implicit_cache', 1)
t = env.Program(target=programName, source=sources)
Default(t)

18
SConstruct Normal file
View File

@ -0,0 +1,18 @@
AddOption('--builddir',dest="builddir",default="build",help="Directory to build to.")
SConscript('SConscript', variant_dir=GetOption('builddir'), duplicate=0)
if GetOption('clean'):
import os, shutil
try:
shutil.rmtree(".sconf_temp/")
except:
print("couldn't remove .sconf_temp/")
try:
shutil.rmtree("generated/")
except:
print("couldn't remove generated/")
try:
os.remove(".sconsign.dblite")
except:
print("couldn't remove .sconsign.dblite")

19
TODO Normal file
View File

@ -0,0 +1,19 @@
HTTP API:
Make it OO,
Use STL (i.e std::string for url, etc)
RequestBroker:
APIRequest:
Standard StatusParser and Status object ( {Status: 0, Error = "Danger, Will Robinson!"} )
Request:
Some way of identifying multiple requests destined for the same listener
Client/Server API:
Make more use of APIRequest so we can get rid of the pooey, flakey threading in PreviewView, etc
Interface General:
Try to use the "Activity" model for some simpler interfaces instead of code-heavy M-V-C
Move interfaces into separate folder
Interface Elements:
Vertical Scrolling for Textbox,

View File

@ -1,69 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="@APPID@"
android:versionCode="@BUILD_NUM@"
android:versionName="@DISPLAY_VERSION_MAJOR@.@DISPLAY_VERSION_MINOR@.@BUILD_NUM@"
android:installLocation="auto"
>
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="30"
/>
<uses-feature
android:glEsVersion="0x00020000"
/>
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false"
/>
<uses-feature
android:name="android.hardware.bluetooth"
android:required="false"
/>
<uses-feature
android:name="android.hardware.gamepad"
android:required="false"
/>
<uses-feature
android:name="android.hardware.usb.host"
android:required="false"
/>
<uses-feature
android:name="android.hardware.type.pc"
android:required="false"
/>
@ANDROID_PERMISSIONS@
<application
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="true"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:hardwareAccelerated="true"
@ANDROID_PROPERTIES@
>
<activity
android:name=".PowderActivity"
android:screenOrientation="landscape"
android:label="@string/app_name"
android:alwaysRetainTaskState="true"
android:launchMode="singleInstance"
android:configChanges="layoutDirection|locale|orientation|uiMode|screenLayout|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:preferMinimalPostProcessing="true"
android:exported="true"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- <intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter> -->
</activity>
</application>
</manifest>

View File

@ -1,42 +0,0 @@
package @APPID@;
import org.libsdl.app.SDLActivity;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Enumeration;
import java.io.IOException;
import java.util.Base64;
public class PowderActivity extends SDLActivity
{
public static String getCertificateBundle()
{
String allPems = "";
try {
KeyStore ks = KeyStore.getInstance("AndroidCAStore");
if (ks != null) {
ks.load(null, null);
Enumeration<String> aliases = ks.aliases();
while (aliases.hasMoreElements()) {
String alias = (String)aliases.nextElement();
java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate)ks.getCertificate(alias);
allPems += "-----BEGIN CERTIFICATE-----\n" + Base64.getMimeEncoder().encodeToString(cert.getEncoded()) + "\n-----END CERTIFICATE-----\n";;
}
}
} catch (IOException e) {
e.printStackTrace();
return "";
} catch (KeyStoreException e) {
e.printStackTrace();
return "";
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
} catch (java.security.cert.CertificateException e) {
e.printStackTrace();
return "";
}
return allPems;
}
}

View File

@ -1,26 +0,0 @@
import os
import os.path
import subprocess
import sys
(
script,
zipalign,
build_dir,
unsigned_name,
unaligned_name,
) = sys.argv
unaligned_path = os.path.join(build_dir, unaligned_name)
unsigned_path = os.path.join(build_dir, unsigned_name)
if os.path.exists(unsigned_path):
os.remove(unsigned_path)
if subprocess.run([
zipalign,
'-f', '4',
unaligned_path,
unsigned_path,
]).returncode:
sys.exit(1)

View File

@ -1,104 +0,0 @@
import os
import os.path
import shutil
import subprocess
import sys
(
script,
d8,
aapt,
aapt2,
source_dir,
build_dir,
private_name,
unaligned_name,
sha_name,
android_jar,
sdl_jar,
powder_jar,
tpt_arch,
debug_release,
manifest_xml,
*resources,
) = sys.argv
if tpt_arch == 'x86':
android_arch = 'x86'
if tpt_arch == 'arm':
android_arch = 'armeabi-v7a'
if tpt_arch == 'aarch64':
android_arch = 'arm64-v8a'
if tpt_arch == 'x86_64':
android_arch = 'x86_64'
sha_packaged_name = 'libpowder.so'
manifest_path = os.path.join(build_dir, manifest_xml)
sha_path = os.path.join(build_dir, sha_name)
unaligned_path = os.path.join(build_dir, unaligned_name)
private_dir = os.path.join(build_dir, private_name)
arch_dir = os.path.join(private_dir, 'lib', android_arch)
sha_lib_path = os.path.join(arch_dir, sha_packaged_name)
flat_dir = os.path.join(private_dir, 'flat')
if os.path.exists(arch_dir):
shutil.rmtree(arch_dir)
os.makedirs(arch_dir)
if os.path.exists(sha_lib_path):
os.remove(sha_lib_path)
if os.path.exists(unaligned_path):
os.remove(unaligned_path)
if os.path.exists(flat_dir):
shutil.rmtree(flat_dir)
os.makedirs(flat_dir)
if subprocess.run([
aapt2,
'compile',
'-o', os.path.join(private_dir, 'flat'),
*resources,
], cwd = build_dir).returncode:
sys.exit(1)
aapt2_link_inputs = []
for root, dirs, files in os.walk(flat_dir):
for name in files:
if name.endswith(".flat"):
aapt2_link_inputs.append(os.path.join(root, name))
if subprocess.run([
aapt2,
'link',
'-o', unaligned_path,
'-I', android_jar,
'--manifest', manifest_path,
*aapt2_link_inputs,
]).returncode:
sys.exit(1)
shutil.copy(sha_path, sha_lib_path)
if subprocess.run([
aapt,
'add',
unaligned_path,
os.path.join('lib', android_arch, sha_packaged_name),
], cwd = private_dir).returncode:
sys.exit(1)
if subprocess.run([
d8,
os.path.join(build_dir, sdl_jar),
os.path.join(build_dir, powder_jar),
'--' + debug_release,
'--lib', android_jar,
'--min-api', '21',
], cwd = private_dir).returncode:
sys.exit(1)
if subprocess.run([
aapt,
'add',
unaligned_path,
'classes.dex',
], cwd = private_dir).returncode:
sys.exit(1)

View File

@ -1,8 +0,0 @@
[constants]
android_ndk_toolchain_prefix = 'aarch64-linux-android21-'
[host_machine]
system = 'android'
cpu_family = 'aarch64'
cpu = 'armv8'
endian = 'little'

View File

@ -1,8 +0,0 @@
[constants]
android_ndk_toolchain_prefix = 'armv7a-linux-androideabi21-'
[host_machine]
system = 'android'
cpu_family = 'arm'
cpu = 'armv7a'
endian = 'little'

View File

@ -1,8 +0,0 @@
[constants]
android_ndk_toolchain_prefix = 'i686-linux-android21-'
[host_machine]
system = 'android'
cpu_family = 'x86'
cpu = 'i686'
endian = 'little'

View File

@ -1,8 +0,0 @@
[constants]
android_ndk_toolchain_prefix = 'x86_64-linux-android21-'
[host_machine]
system = 'android'
cpu_family = 'x86_64'
cpu = 'amd64'
endian = 'little'

View File

@ -1,272 +0,0 @@
#!/usr/bin/env bash
# mainly based on https://www.sh-zam.com/2019/05/debugging-krita-on-android.html
set -euo pipefail
IFS=$'\n\t'
function get_buildoption() {
jq -r '.[] | select(.name == "'$1'") | .value' < meson-info/intro-buildoptions.json
}
function get_cpp_compiler() {
jq -r '.[] | select(.name == "'$1'") | .target_sources.[] | select(.language == "cpp") | .compiler.[]' < meson-info/intro-targets.json
}
# customize
default_app_id=uk.co.powdertoy.tpt
default_app_exe=powder
default_lldb_server=/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/17/lib/linux/aarch64/lldb-server
default_lldb_client=/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/lldb.sh
in_build_site=no
if which jq >/dev/null && [[ -f meson-info/intro-buildoptions.json ]]; then
>&2 echo "[+] pwd is a build site, auto-detecting parameters"
in_build_site=yes
default_app_id=$(get_buildoption app_id)
default_app_exe=$(get_buildoption app_exe)
found_lldb=no
compiler_path=$(get_cpp_compiler $default_app_exe)
for line in $compiler_path; do
# iterate over the command array (might be for example [ "ccache", "aarch64-linux-android21-clang++" ])
if (echo $line | grep toolchains && basename $line | grep android | grep clang++) >/dev/null; then
arch=$(basename $line | cut -d '-' -f 1)
default_lldb_server=$(realpath $(dirname $line)/../lib/clang/*/lib/linux/$arch/lldb-server)
default_lldb_client=$(realpath $(dirname $line)/lldb.sh)
found_lldb=yes
fi
done
if [[ $found_lldb != yes ]]; then
>&2 echo "[-] cannot determine LLDB paths from compiler command array:"
for line in $compiler_path; do
>&2 echo "[-] - $line"
done
exit 1
fi
>&2 echo "[+] APP_ID: $default_app_id"
>&2 echo "[+] APP_EXE: $default_app_exe"
>&2 echo "[+] LLDB_SERVER: $default_lldb_server"
>&2 echo "[+] LLDB_CLIENT: $default_lldb_client"
else
>&2 echo "[+] pwd is not a build site, not auto-detecting parameters"
fi
app_id=${APP_ID:-$default_app_id}
app_exe=${APP_EXE:-$default_app_exe}
lldb_server=${LLDB_SERVER:-$default_lldb_server}
lldb_server_port=${LLDB_SERVER_PORT:-9998}
jdb_port=${JDB_PORT:-13456}
lldb_client=${LLDB_CLIENT:-$default_lldb_client}
meson=${MESON:-meson}
adb=${ADB:-adb}
jdb=${JDB:-jdb}
# don't customize unless necessary
app_activity=${APP_ACTIVITY:-PowderActivity}
lldb_server_staging=${LLDB_SERVER_STAGING:-/data/local/tmp/lldb-server}
lldb_server_remote=${LLDB_SERVER_REMOTE:-lldb-server}
pidof_retry_count=${PIDOF_RETRY_COUNT:-20}
pidof_retry_delay=${PIDOF_RETRY_DELAY:-0.1}
function check_which() {
if ! which $1 >/dev/null; then
>&2 echo "[-] can't run $1"
return 1
fi
}
function check_env() {
if ! [[ -f $lldb_server ]]; then
>&2 echo "[-] $lldb_server doesn't exist"
return 1
fi
check_which $lldb_client
check_which $adb
check_which $jdb
}
function check_adb() {
$adb shell whoami >/dev/null
}
function maybe_install_app() {
if [[ $in_build_site != yes ]]; then
return 0
fi
android_keystore=$(get_buildoption android_keystore)
android_keyalias=$(get_buildoption android_keyalias)
if [[ -z ${ANDROID_KEYSTORE_PASS-} ]]; then
>&2 echo "[-] ANDROID_KEYSTORE_PASS not set"
>&2 echo
>&2 cat << HELP
The current directory seems to be a build site, but ANDROID_KEYSTORE_PASS is not set, so android/$app_exe.apk cannot be invoked. If you don't have a keystore yet, create one with:
ANDROID_KEYSTORE_PASS=bagelsbagels keytool -genkey \\
-keystore $android_keystore \\
-alias $android_keyalias \\
-storepass:env ANDROID_KEYSTORE_PASS \\
-keypass:env ANDROID_KEYSTORE_PASS \\
-dname CN=bagels
Then try again with:
ANDROID_KEYSTORE_PASS=bagelsbagels $0
Naturally, replace bagelsbagels with an appropriate password.
HELP
exit 1
fi
>&2 echo "[+] meson compiling android/$app_exe.apk"
if ! $meson compile sign-apk; then
>&2 echo "[-] failed"
return 1
fi
>&2 echo "[+] adb installing android/$app_exe.apk"
if ! $adb install android/$app_exe.apk; then
>&2 echo "[-] failed"
return 1
fi
}
function check_debuggable() {
$adb shell run-as $app_id whoami >/dev/null
}
function find_lldb_server() {
$adb shell run-as $app_id pgrep $lldb_server_remote >/dev/null
}
function kill_lldb_server() {
if ! $adb shell run-as $app_id pkill $lldb_server_remote; then
>&2 echo "[-] failed"
return 1
fi
}
function adb_forward() {
>&2 echo "[+] adb forwarding tcp:$jdb_port jdwp:$pid"
if ! ($adb forward tcp:$jdb_port jdwp:$pid | grep $jdb_port >/dev/null); then
>&2 echo "[+] failed"
return 1
fi
}
function adb_unforward() {
$adb forward --remove tcp:$jdb_port
}
function undo_current_adb_forward() {
>&2 echo "[+] adb un-forwarding orphaned tcp:$jdb_port"
adb_unforward
}
function maybe_undo_previous_adb_forward() {
if $adb forward --list | grep tcp:$jdb_port; then
>&2 echo "[+] adb un-forwarding orphaned tcp:$jdb_port"
adb_unforward
fi
}
function maybe_kill_previous_lldb_server() {
if find_lldb_server; then
>&2 echo "[+] killing orphaned $lldb_server_remote"
kill_lldb_server
fi
}
function kill_current_lldb_server() {
>&2 echo "[+] killing $lldb_server_remote"
kill_lldb_server
}
function start_app() {
>&2 echo "[+] starting $app_id/.$app_activity"
set +e
$adb shell am start -D -n "$app_id/.$app_activity" >/dev/null
set -e
local i
local maybe_pid
local pidof_result
for ((i = 0; i <= $pidof_retry_count; i++)); do
set +e
maybe_pid=$($adb shell pidof $app_id)
pidof_result=$?
set -e
if [[ $pidof_result == 0 ]]; then
pid=$maybe_pid
break
fi
sleep $pidof_retry_delay
done
if [[ -z ${pid-} ]]; then
>&2 echo "[-] failed"
return 1
fi
echo $pid
}
function jdb_attach() {
>&2 echo "[+] attaching jdb in the background"
$jdb -attach localhost:$jdb_port >/dev/null 2>/dev/null &
disown $!
# at some point jdb exits because it doesn't have an stdin... fine by me
}
function maybe_deploy_lldb_server() {
if ! $adb shell [[ -f $lldb_server_staging ]]; then
>&2 echo "[+] $lldb_server_remote not present on host, deploying"
if ! ($adb push $lldb_server $lldb_server_staging && $adb shell chmod +x $lldb_server_staging); then
>&2 echo "[-] failed"
fi
fi
}
function start_lldb_server() {
if ! $adb shell run-as $app_id pgrep $lldb_server_remote >/dev/null; then
>&2 echo "[+] $lldb_server_remote not running on host, starting"
$adb shell run-as $app_id cp $lldb_server_staging /data/data/$app_id/$lldb_server_remote
$adb shell run-as $app_id ./$lldb_server_remote platform --server --listen "*:$lldb_server_port" >/dev/null 2>/dev/null &
disown $!
if ! $adb shell run-as $app_id pgrep $lldb_server_remote >/dev/null; then
>&2 echo "[-] failed"
return 1
fi
fi
}
function start_lldb() {
local pid=$1
>&2 echo "[+] starting $lldb_client"
local lldb_init=$(mktemp)
cat - << LLDB_INIT > $lldb_init
platform select remote-android
platform connect connect://localhost:$lldb_server_port
attach $pid
continue
LLDB_INIT
local lldb_status
set +e
$lldb_client --source $lldb_init
lldb_status=$?
set -e
>&2 echo "[+] $lldb_client exited with status $lldb_status"
rm $lldb_init
}
check_env
check_adb
maybe_install_app
check_debuggable
maybe_kill_previous_lldb_server
maybe_undo_previous_adb_forward
if [[ ${1-} == clean ]]; then
>&2 echo "[+] done"
exit 0
fi
maybe_deploy_lldb_server
start_lldb_server
pid=$(start_app)
adb_forward
jdb_attach
start_lldb $pid
kill_current_lldb_server
undo_current_adb_forward
>&2 echo "[+] done"

View File

@ -1,25 +0,0 @@
import os
import os.path
import subprocess
import sys
(
script,
adb,
build_dir,
phony,
apk_name,
) = sys.argv
apk_path = os.path.join(build_dir, apk_name)
phony_path = os.path.join(build_dir, phony)
if os.path.exists(phony_path):
os.remove(phony_path)
if subprocess.run([
adb,
'install',
apk_path,
]).returncode:
sys.exit(1)

View File

@ -1,105 +0,0 @@
android_manifest_xml = configure_file(
input: 'AndroidManifest.template.xml',
output: 'AndroidManifest.xml',
configuration: conf_data,
)
powder_jar_sources = configure_file(
input: 'PowderActivity.template.java',
output: 'PowderActivity.java',
configuration: conf_data,
)
subdir('res')
python3 = find_program('python3')
android_platform_jar = meson.get_external_property('android_platform_jar')
java_runtime_jar = meson.get_external_property('java_runtime_jar')
android_keystore = get_option('android_keystore')
sdl_jar = tpt_libs.get_variable('sdl_jar')
powder_jar = custom_target(
'powder-jar',
output: app_exe + '.jar',
command: [
python3,
files('powder-jar.py'),
find_program('javac'),
find_program('jar'),
meson.current_source_dir(),
meson.project_build_root(),
'@PRIVATE_DIR@',
'@OUTPUT@',
android_platform_jar,
java_runtime_jar,
sdl_jar,
is_debug ? 'debug' : 'release',
powder_jar_sources,
],
)
unaligned_apk = custom_target(
'build-apk',
output: app_exe + '.unaligned.apk',
input: powder_sha,
command: [
python3,
files('build-apk.py'),
find_program('d8'),
find_program('aapt'),
find_program('aapt2'),
meson.current_source_dir(),
meson.project_build_root(),
'@PRIVATE_DIR@',
'@OUTPUT@',
'@INPUT@',
android_platform_jar,
sdl_jar,
powder_jar,
host_arch,
is_debug ? 'debug' : 'release',
android_manifest_xml,
android_resources,
],
)
unsigned_apk = custom_target(
'align-apk',
output: app_exe + '.unsigned.apk',
input: unaligned_apk,
command: [
python3,
files('align-apk.py'),
find_program('zipalign'),
meson.project_build_root(),
'@OUTPUT@',
'@INPUT@',
],
)
signed_apk = custom_target(
'sign-apk',
output: app_exe + '.apk',
input: unsigned_apk,
command: [
python3,
files('sign-apk.py'),
find_program('apksigner'),
meson.project_build_root(),
'@OUTPUT@',
'@INPUT@',
android_keystore,
get_option('android_keyalias'),
],
)
adb = find_program('adb', required: false)
if adb.found()
install_apk = custom_target(
'install-apk',
input: signed_apk,
output: 'install-apk',
command: [ python3, files('install-apk.py'), adb, meson.project_build_root(), '@OUTPUT@', '@INPUT@' ],
)
custom_target(
'run-apk',
input: [ signed_apk, install_apk ],
build_always_stale: true,
output: 'run-apk',
command: [ python3, files('run-apk.py'), adb, meson.project_build_root(), '@OUTPUT@', '@INPUT0@', app_id ],
)
endif

View File

@ -1,54 +0,0 @@
import os
import os.path
import shutil
import subprocess
import sys
(
script,
javac,
jar,
source_dir,
build_dir,
private_name,
powder_jar_name,
android_jar,
java_runtime,
sdl_jar,
debug_release,
*javac_sources,
) = sys.argv
powder_jar_path = os.path.join(build_dir, powder_jar_name)
private_dir = os.path.join(build_dir, private_name)
class_dir = os.path.join(private_dir, 'class')
if os.path.exists(powder_jar_path):
os.remove(powder_jar_path)
if os.path.exists(class_dir):
shutil.rmtree(class_dir)
os.makedirs(class_dir)
if subprocess.run([
javac,
'-d', class_dir,
'-source', '1.8',
'-target', '1.8',
'-bootclasspath', java_runtime,
'-classpath', os.pathsep.join([ android_jar, sdl_jar ]),
*javac_sources,
], cwd = build_dir).returncode:
sys.exit(1)
jar_inputs = []
for root, dirs, files in os.walk(class_dir):
for name in files:
if name.endswith(".class"):
jar_inputs.append(os.path.relpath(os.path.join(root, name), start = class_dir))
if subprocess.run([
jar,
'cMf',
powder_jar_path,
*jar_inputs,
], cwd = class_dir).returncode:
sys.exit(1)

View File

@ -1,7 +0,0 @@
android_resources = files(
'values/colors.xml',
'values/styles.xml',
)
subdir('values')
subdir('mipmap-mdpi')

View File

@ -1 +0,0 @@
android_resources += fs.copyfile(rendered_icons['icon_exe'], 'ic_launcher.png')

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
</resources>

View File

@ -1,5 +0,0 @@
android_resources += configure_file(
input: 'strings.template.xml',
output: 'strings.xml',
configuration: conf_data,
)

View File

@ -1,3 +0,0 @@
<resources>
<string name="app_name">@APPNAME@</string>
</resources>

View File

@ -1,4 +0,0 @@
<resources>
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
</style>
</resources>

View File

@ -1,25 +0,0 @@
import os
import os.path
import subprocess
import sys
(
script,
adb,
build_dir,
phony,
apk_name,
app_id,
) = sys.argv
apk_path = os.path.join(build_dir, apk_name)
if subprocess.run([
adb,
'shell',
'am',
'start',
'--activity-clear-top',
'-n', app_id + '/.PowderActivity',
]).returncode:
sys.exit(1)

View File

@ -1,35 +0,0 @@
import os
import os.path
import subprocess
import sys
(
script,
apksigner,
build_dir,
apk_name,
unsigned_name,
android_keystore,
android_keyalias,
) = sys.argv
if 'ANDROID_KEYSTORE_PASS' not in os.environ:
print('ANDROID_KEYSTORE_PASS not set')
sys.exit(1)
unsigned_path = os.path.join(build_dir, unsigned_name)
apk_path = os.path.join(build_dir, apk_name)
if os.path.exists(apk_path):
os.remove(apk_path)
if subprocess.run([
apksigner,
'sign',
'--ks', android_keystore,
'--ks-key-alias', android_keyalias,
'--ks-pass', 'env:ANDROID_KEYSTORE_PASS',
'--out', apk_path,
unsigned_path,
]).returncode:
sys.exit(1)

View File

@ -1,3 +0,0 @@
# This file is used by the starcatcher.us update server to pull changelogs for mod releases
# Erase and replace the changelog for every release, do not just append changes to the end
# Lines starting with # and empty lines are ignored

View File

@ -1,25 +0,0 @@
[constants]
andriod_ndk_toolchain_bin = '/opt/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin'
[properties]
# only needed if you want to run the custom target powder_apk (powder.apk)
# android_ndk_toolchain_prefix comes from the correct cross-file in ./android/cross
android_ndk_toolchain_prefix = android_ndk_toolchain_prefix
android_platform = 'android-30'
android_platform_jar = '/opt/android-sdk/platforms/' + android_platform + '/android.jar'
java_runtime_jar = '/usr/lib/jvm/java-8-openjdk/jre/lib/rt.jar'
[binaries]
c = andriod_ndk_toolchain_bin / (android_ndk_toolchain_prefix + 'clang')
# c = [ 'ccache', andriod_ndk_toolchain_bin / (android_ndk_toolchain_prefix + 'clang') ]
cpp = andriod_ndk_toolchain_bin / (android_ndk_toolchain_prefix + 'clang++')
# cpp = [ 'ccache', andriod_ndk_toolchain_bin / (android_ndk_toolchain_prefix + 'clang++') ]
strip = andriod_ndk_toolchain_bin / 'llvm-strip'
# only needed if you want to run the custom target powder_apk (powder.apk)
javac = '/usr/lib/jvm/java-8-openjdk/bin/javac'
jar = '/usr/lib/jvm/java-8-openjdk/bin/jar'
d8 = '/opt/android-sdk/build-tools/32.0.0/d8'
aapt = '/opt/android-sdk/build-tools/32.0.0/aapt'
aapt2 = '/opt/android-sdk/build-tools/32.0.0/aapt2'
zipalign = '/opt/android-sdk/build-tools/32.0.0/zipalign'
apksigner = '/opt/android-sdk/build-tools/32.0.0/apksigner'

View File

@ -1,11 +0,0 @@
[binaries]
c = [ 'clang', '-arch', 'arm64' ]
cpp = [ 'clang++', '-arch', 'arm64' ]
objcpp = [ 'clang++', '-arch', 'arm64' ]
strip = 'strip'
[host_machine]
system = 'darwin'
cpu_family = 'aarch64'
cpu = 'armv8'
endian = 'little'

View File

@ -1,14 +0,0 @@
[constants]
prefix = 'x86_64-w64-mingw32'
[binaries]
c = prefix + '-gcc'
cpp = prefix + '-g++'
strip = prefix + '-strip'
windres = prefix + '-windres'
[host_machine]
system = 'windows'
cpu_family = 'x86_64'
cpu = 'x86_64'
endian = 'little'

89
data/Shaders.h Normal file
View File

@ -0,0 +1,89 @@
#pragma once
const char *const fireFragment = "#version 120\n\
uniform sampler2D fireAlpha;\
void main () {\
vec4 texColor = texture2D(fireAlpha, gl_PointCoord);\
gl_FragColor = vec4(gl_Color.rgb, texColor.a*gl_Color.a);\
}";
const char *const fireVertex = "#version 120\n\
void main(void)\
{\
gl_Position = ftransform();;\
gl_FrontColor = gl_Color;\
}";
const char *const lensFragment = "#version 120\n\
uniform sampler2D pTex;\
uniform sampler2D tfX;\
uniform sampler2D tfY;\
uniform float xres;\
uniform float yres;\
void main () {\
vec4 transformX = texture2D(tfX, vec2(gl_TexCoord[0].s, -gl_TexCoord[0].t));\
vec4 transformY = -texture2D(tfY, vec2(gl_TexCoord[0].s, -gl_TexCoord[0].t));\
transformX.r /= xres;\
transformY.g /= yres;\
vec4 texColor = vec4(\
texture2D(pTex, gl_TexCoord[0].st-vec2(transformX.r*0.75, transformY.g*0.75)).r,\
texture2D(pTex, gl_TexCoord[0].st-vec2(transformX.r*0.875, transformY.g*0.875)).g,\
texture2D(pTex, gl_TexCoord[0].st-vec2(transformX.r, transformY.g)).b,\
1.0\
);\
gl_FragColor = texColor;\
}";
const char *const lensVertex = "#version 120\n\
void main(void)\
{\
gl_TexCoord[0] = gl_MultiTexCoord0;\
gl_Position = ftransform();;\
gl_FrontColor = gl_Color;\
}";
const char *const airVFragment = "#version 120\n\
uniform sampler2D airX;\
uniform sampler2D airY;\
uniform sampler2D airP;\
void main () {\
vec4 texX = texture2D(airX, gl_TexCoord[0].st);\
vec4 texY = texture2D(airY, gl_TexCoord[0].st);\
vec4 texP = texture2D(airP, gl_TexCoord[0].st);\
gl_FragColor = vec4(abs(texX.r)/2.0, texP.b/2.0, abs(texY.g)/2.0, 1.0);\
}";
const char *const airVVertex = "#version 120\n\
void main(void)\
{\
gl_TexCoord[0] = gl_MultiTexCoord0;\
gl_Position = ftransform();;\
gl_FrontColor = gl_Color;\
}";
const char *const airPFragment = "#version 120\n\
uniform sampler2D airX;\
uniform sampler2D airY;\
uniform sampler2D airP;\
void main () {\
vec4 texP = texture2D(airP, gl_TexCoord[0].st);\
gl_FragColor = vec4(max(texP.b/2.0, 0), 0, abs(min(texP.b/2.0, 0)), 1.0);\
}";
const char *const airPVertex = "#version 120\n\
void main(void)\
{\
gl_TexCoord[0] = gl_MultiTexCoord0;\
gl_Position = ftransform();;\
gl_FrontColor = gl_Color;\
}";
const char *const airCFragment = "#version 120\n\
uniform sampler2D airX;\
uniform sampler2D airY;\
uniform sampler2D airP;\
void main () {\
vec4 texX = texture2D(airX, gl_TexCoord[0].st);\
vec4 texY = texture2D(airY, gl_TexCoord[0].st);\
vec4 texP = texture2D(airP, gl_TexCoord[0].st);\
gl_FragColor = vec4(max(texP.b/2.0, 0), 0, abs(min(texP.b/2.0, 0)), 1.0) + vec4(abs(texX.r)/8.0, abs(texX.r)/8.0, abs(texX.r)/8.0, 1.0) + vec4(abs(texY.g)/8.0, abs(texY.g)/8.0, abs(texY.g)/8.0, 1.0);\
}";
const char *const airCVertex = "#version 120\n\
void main(void)\
{\
gl_TexCoord[0] = gl_MultiTexCoord0;\
gl_Position = ftransform();;\
gl_FrontColor = gl_Color;\
}";

704
data/font.cpp Normal file
View File

@ -0,0 +1,704 @@
#ifndef FONTEDITOR
extern const unsigned char font_data[] = {
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x70, 0x1C, 0xC3, 0x20, 0x00, 0x47, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x4C, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x19, 0xCC, 0xE0, 0x3F, 0xCC, 0xF0, 0x2F, 0xCC, 0x90, 0x09, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x30, 0xD0, 0x3F, 0x33, 0xE1, 0x07, 0xF4, 0x12, 0x33, 0xFF, 0x00, 0x03, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0xD0, 0xE2, 0xCC, 0x1C, 0xDE, 0x01, 0x3C, 0x40, 0xB7, 0x34, 0x33, 0x8B, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x7D, 0x30, 0x0C, 0x13, 0xD0, 0x32, 0xB3, 0x33, 0x1C, 0x7D, 0x07, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0xC0, 0x34, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x34, 0x1D, 0x07, 0x03, 0x07, 0x1D, 0x34, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x07, 0x1D, 0x34, 0x30, 0x34, 0x1D, 0x07, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x44, 0xD0, 0x1C, 0x64, 0xF0, 0x3F, 0x64, 0xD0, 0x1C, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x30, 0xE0, 0x2F, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0D, 0x03, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x80, 0x02, 0x0C, 0xA0, 0x00, 0x03, 0x28, 0xC0, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xF8, 0xE0, 0x39, 0x07, 0x33, 0x32, 0x03, 0xB3, 0x38, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x36, 0xC0, 0x00, 0x03, 0x0C, 0x74, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFC, 0xB1, 0x34, 0x41, 0x03, 0x0A, 0x2C, 0x70, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFC, 0x71, 0x34, 0x01, 0x03, 0x1E, 0x00, 0x33, 0x34, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x37, 0x1C, 0x73, 0x34, 0xBF, 0x03, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x33, 0x00, 0x57, 0xE0, 0x2F, 0x00, 0x13, 0x30, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xF4, 0xD3, 0x00, 0x07, 0xF0, 0x1F, 0x03, 0x33, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x34, 0x80, 0x03, 0x0E, 0x38, 0xD0, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFC, 0xB1, 0x34, 0x03, 0xD3, 0x1F, 0x03, 0x73, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFC, 0xB1, 0x34, 0x03, 0xC3, 0x3F, 0x40, 0x23, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x07, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x04, 0x00, 0x0C, 0x0D, 0x03, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC3, 0x0B, 0x1B, 0xC0, 0x0B, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x0F, 0x90, 0x83, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFD, 0x71, 0x30, 0x81, 0x03, 0x0E, 0x34, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x1D, 0x30, 0xE7, 0x37, 0x73, 0x1C, 0xE3, 0x2F, 0x07, 0x00, 0xFD, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x74, 0xD0, 0x1D, 0x47, 0x33, 0x30, 0xFF, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xBF, 0x30, 0x38, 0x43, 0xF3, 0x1F, 0x43, 0x33, 0x34, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xF4, 0xD1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x7F, 0x30, 0x1D, 0x43, 0x33, 0x30, 0x03, 0x33, 0x34, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x32, 0x00, 0x03, 0xF0, 0x0B, 0x03, 0x30, 0x10, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x33, 0x10, 0x03, 0xF0, 0x0B, 0x03, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xF4, 0xD1, 0x34, 0x03, 0x30, 0x3E, 0x03, 0x73, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x30, 0x03, 0xF3, 0x3F, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x1D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xD0, 0x01, 0x0C, 0xC0, 0x00, 0x0C, 0xC0, 0x10, 0x0D, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x70, 0x34, 0x4C, 0x03, 0x37, 0xC0, 0x0B, 0x30, 0x0B, 0x0C, 0x0B, 0x47, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x10, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x1F, 0x3D, 0x7B, 0x3B, 0xE3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x70, 0xD0, 0x3C, 0x30, 0x37, 0xCC, 0x28, 0x33, 0xDC, 0x0C, 0x3C, 0x03, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x40, 0x1F, 0x74, 0x1C, 0x07, 0xCD, 0x00, 0x33, 0xD0, 0x1C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x7F, 0x30, 0x1D, 0x43, 0x73, 0x34, 0xFF, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x40, 0x1F, 0x34, 0x1D, 0x07, 0xCD, 0x00, 0x33, 0xDC, 0x1C, 0x1D, 0xFD, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x31, 0x34, 0x03, 0xF3, 0x0F, 0xD7, 0x30, 0x34, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFC, 0xB1, 0x31, 0x07, 0xD0, 0x0F, 0x90, 0x23, 0x34, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x0C, 0x30, 0x03, 0xCC, 0x00, 0x33, 0xD0, 0x2C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x03, 0x33, 0x30, 0x03, 0xB3, 0x38, 0xCD, 0xC1, 0x0D, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x43, 0x30, 0xC7, 0x34, 0xCD, 0x1C, 0xED, 0x1E, 0x2C, 0x0E, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x34, 0x1C, 0xB8, 0x03, 0x3D, 0xC0, 0x2D, 0x34, 0x1C, 0x03, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x03, 0xB3, 0x38, 0xDC, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x00, 0x2D, 0xC0, 0x02, 0x2C, 0xD0, 0x02, 0x6C, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x2F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2F, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x30, 0x80, 0x02, 0x0C, 0xA0, 0x00, 0x03, 0x28, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x3E, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3E, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x1D, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x30, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x04, 0xC3, 0xCF, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0xC0, 0x00, 0x7F, 0x5C, 0x33, 0xCC, 0x30, 0x7F, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x5C, 0x32, 0xC0, 0x24, 0x3D, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x0D, 0x30, 0xF8, 0x38, 0x33, 0xCC, 0x31, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x0C, 0xF3, 0xCB, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x3D, 0x07, 0x03, 0x2F, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x2C, 0x33, 0x4C, 0x3F, 0xC0, 0x04, 0xE3, 0x07, 0x00,
0x05, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x7F, 0x9C, 0x33, 0xCC, 0x30, 0xC7, 0x01, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x04, 0x1C, 0x00, 0x0D, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1E, 0x00,
0x05, 0x00, 0x00, 0x30, 0xC0, 0x10, 0xE3, 0xEC, 0xF0, 0xC1, 0x1C, 0xC3, 0x01, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x47, 0x3D, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x1C, 0x33, 0xCC, 0x30, 0xD3, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x1C, 0x33, 0xCC, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x1C, 0x33, 0xCC, 0x34, 0x7F, 0x0C, 0x30, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x1D, 0x33, 0xCC, 0x34, 0xFD, 0x00, 0x03, 0x0C, 0x50,
0x04, 0x00, 0x00, 0x00, 0x00, 0x33, 0x1F, 0x07, 0x03, 0x03, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x0C, 0xC1, 0x43, 0x30, 0x3F, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x1C, 0x74, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x0D, 0x33, 0xCC, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x0C, 0x33, 0xCD, 0x2D, 0x2C, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x33, 0x32, 0x33, 0x73, 0x37, 0xCD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0x2C, 0xD3, 0xC7, 0x38, 0xC7, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x0C, 0x73, 0x4C, 0x37, 0x74, 0xC0, 0xF0, 0x01, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC4, 0xC2, 0xC2, 0x12, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x38, 0x0C, 0x0C, 0x03, 0x0C, 0x0C, 0x38, 0x00, 0x00, 0x00,
0x02, 0x00, 0x32, 0x33, 0x33, 0x13, 0x00,
0x04, 0x00, 0x00, 0x0B, 0x0C, 0x0C, 0x30, 0x0C, 0x0C, 0x0B, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x72, 0x37, 0xD2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x04, 0x07, 0x20, 0x0C, 0xC3, 0x71, 0x00,
0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x03, 0xFD, 0x70, 0x27, 0x33, 0x30, 0x37, 0xFD, 0x01, 0x03, 0x20, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xF4, 0xC1, 0x21, 0x0C, 0xF0, 0x0B, 0x0C, 0xC0, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x70, 0x34, 0xFD, 0xC1, 0x0C, 0xFD, 0x71, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x03, 0xB3, 0x38, 0xDC, 0xE0, 0x2F, 0x30, 0xE0, 0x2F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x00, 0x32, 0x13, 0x32, 0x13, 0x00,
0x05, 0x00, 0xF0, 0xB1, 0xCD, 0x01, 0x7D, 0x0C, 0xD3, 0x07, 0x39, 0xD2, 0xF8, 0x01, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xDC, 0x41, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x07, 0x1D, 0x1D, 0xD7, 0x36, 0x33, 0x30, 0xD7, 0x37, 0x1D, 0x1D, 0xF4, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x7D, 0x04, 0xC3, 0xCF, 0x30, 0xFD, 0x01, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xC7, 0x1D, 0x77, 0xC0, 0x1D, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x07, 0x1D, 0x1D, 0xF7, 0x36, 0xF3, 0x31, 0x37, 0x37, 0x1D, 0x1D, 0xF4, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x2D, 0x33, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x30, 0xE0, 0x2F, 0x30, 0x00, 0x02, 0xFE, 0x02, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x1F, 0x31, 0x1C, 0x07, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x1F, 0x34, 0x1C, 0x34, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x31, 0x0C, 0xC3, 0x30, 0x0D, 0xBF, 0x33, 0x00, 0x03, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x40, 0xFF, 0xF4, 0x33, 0xFF, 0xCC, 0x3F, 0xD3, 0xCF, 0x00, 0x33, 0xC0, 0x0C, 0x30, 0x03, 0xCC, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x74, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x82, 0x03, 0x00,
0x03, 0xCD, 0xC3, 0x30, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x2D, 0xDC, 0x30, 0xC3, 0x0D, 0x2E, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x00, 0xDD, 0x00, 0xDD, 0xD0, 0x0D, 0xDD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x40, 0x03, 0xF0, 0x90, 0x30, 0x1C, 0xCC, 0x01, 0x28, 0x40, 0xF3, 0x34, 0x37, 0xC6, 0x0F, 0x00, 0x03, 0x00, 0x00, 0x00,
0x07, 0x00, 0x40, 0x03, 0xF0, 0x90, 0x30, 0x1C, 0xCC, 0x01, 0x28, 0x40, 0x7B, 0x34, 0x31, 0x46, 0x07, 0xF0, 0x03, 0x00, 0x00, 0x00,
0x07, 0x00, 0xC0, 0x0F, 0xD0, 0x92, 0xC0, 0x1C, 0xCF, 0x01, 0x28, 0x40, 0xF3, 0x34, 0x37, 0xC6, 0x0F, 0x00, 0x03, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0xC0, 0x02, 0x0B, 0x31, 0x34, 0xFD, 0x01, 0x00,
0x06, 0x0C, 0x40, 0x02, 0x74, 0xD0, 0x1D, 0x47, 0x33, 0x30, 0xFF, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0xC0, 0x00, 0x06, 0x74, 0xD0, 0x1D, 0x47, 0x33, 0x30, 0xFF, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x74, 0x80, 0x08, 0x74, 0xD0, 0x1D, 0x47, 0x33, 0x30, 0xFF, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x74, 0x83, 0x08, 0x74, 0xD0, 0x1D, 0x47, 0x33, 0x30, 0xFF, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0xDC, 0x41, 0x04, 0x74, 0xD0, 0x1D, 0x47, 0x33, 0x30, 0xFF, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x74, 0xC0, 0x0C, 0xB8, 0xD0, 0x1D, 0x47, 0x33, 0x30, 0xFF, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0x0B, 0x37, 0x00, 0xCA, 0x00, 0x0C, 0xBF, 0xF0, 0x0F, 0xC0, 0x30, 0x10, 0xC3, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xF4, 0xD1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xFD, 0x01, 0x09, 0x38, 0x00, 0x00,
0x06, 0x0C, 0x40, 0x02, 0xFF, 0x32, 0x00, 0x03, 0xF0, 0x0B, 0x03, 0x30, 0x10, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0xC0, 0x00, 0x06, 0xFF, 0x32, 0x00, 0x03, 0xF0, 0x0B, 0x03, 0x30, 0x10, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x74, 0x80, 0x08, 0xFF, 0x32, 0x00, 0x03, 0xF0, 0x0B, 0x03, 0x30, 0x10, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0xDC, 0x41, 0x04, 0xFF, 0x32, 0x00, 0x03, 0xF0, 0x0B, 0x03, 0x30, 0x10, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x04, 0x03, 0x09, 0x1D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x04, 0x30, 0x18, 0x1D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x04, 0x1D, 0x22, 0x1D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x04, 0x77, 0x11, 0x1D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x30, 0x1D, 0x0C, 0xCD, 0x1F, 0xC3, 0xC0, 0x30, 0x34, 0xFC, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x74, 0x03, 0x22, 0x70, 0xD0, 0x3C, 0x30, 0x37, 0xCC, 0x28, 0x33, 0xDC, 0x0C, 0x3C, 0x03, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x30, 0x00, 0x24, 0x40, 0x1F, 0x74, 0x1C, 0x07, 0xCD, 0x00, 0x33, 0xD0, 0x1C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0xC0, 0x00, 0x18, 0x40, 0x1F, 0x74, 0x1C, 0x07, 0xCD, 0x00, 0x33, 0xD0, 0x1C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0xD0, 0x01, 0x88, 0x40, 0x1F, 0x74, 0x1C, 0x07, 0xCD, 0x00, 0x33, 0xD0, 0x1C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x74, 0x03, 0x22, 0x40, 0x1F, 0x74, 0x1C, 0x07, 0xCD, 0x00, 0x33, 0xD0, 0x1C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x74, 0x03, 0x44, 0x40, 0x1F, 0x74, 0x1C, 0x07, 0xCD, 0x00, 0x33, 0xD0, 0x1C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x60, 0x24, 0xDD, 0x41, 0x07, 0xDD, 0x61, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x40, 0xDF, 0x74, 0x1C, 0xC7, 0xCD, 0x28, 0x73, 0xD3, 0x78, 0x1D, 0xFB, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x30, 0x00, 0x24, 0x30, 0xC0, 0x0C, 0x30, 0x03, 0xCC, 0x00, 0x33, 0xD0, 0x2C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0xC0, 0x00, 0x18, 0x30, 0xC0, 0x0C, 0x30, 0x03, 0xCC, 0x00, 0x33, 0xD0, 0x2C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0xD0, 0x01, 0x88, 0x30, 0xC0, 0x0C, 0x30, 0x03, 0xCC, 0x00, 0x33, 0xD0, 0x2C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x74, 0x03, 0x44, 0x30, 0xC0, 0x0C, 0x30, 0x03, 0xCC, 0x00, 0x33, 0xD0, 0x2C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0xC0, 0x00, 0x06, 0x03, 0xB3, 0x38, 0xDC, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x20, 0x00, 0x03, 0xF0, 0x07, 0xC3, 0x31, 0x34, 0x47, 0xF3, 0x0F, 0x03, 0x10, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x7D, 0x30, 0x0C, 0x73, 0x30, 0x1E, 0x43, 0x33, 0x32, 0xE3, 0x01, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x00, 0x09, 0x7D, 0x04, 0xC3, 0xCF, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x03, 0x06, 0x7D, 0x04, 0xC3, 0xCF, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x40, 0x07, 0x22, 0x7D, 0x04, 0xC3, 0xCF, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xD0, 0x8D, 0x08, 0x7D, 0x04, 0xC3, 0xCF, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x1D, 0x11, 0x7D, 0x04, 0xC3, 0xCF, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0xD0, 0xC1, 0x0C, 0x1D, 0x7D, 0x04, 0xC3, 0xCF, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x1F, 0xC1, 0x30, 0xFC, 0x2F, 0xC3, 0x00, 0x7D, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x5C, 0x32, 0xC0, 0x24, 0x3D, 0x90, 0xE0, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x00, 0x09, 0x7D, 0x0C, 0xF3, 0xCB, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x03, 0x06, 0x7D, 0x0C, 0xF3, 0xCB, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x81, 0x08, 0x7D, 0x0C, 0xF3, 0xCB, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0x47, 0x04, 0x7D, 0x0C, 0xF3, 0xCB, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x03, 0x09, 0x00, 0x0D, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x30, 0x18, 0x00, 0x0D, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x1D, 0x23, 0x00, 0x0D, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x11, 0x77, 0x00, 0x0D, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xD0, 0x0D, 0x1D, 0xD8, 0xF4, 0x33, 0xCC, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xD0, 0x8D, 0x08, 0x7F, 0x1C, 0x33, 0xCC, 0x30, 0xD3, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x00, 0x09, 0x7D, 0x1C, 0x33, 0xCC, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x03, 0x06, 0x7D, 0x1C, 0x33, 0xCC, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xD0, 0x81, 0x08, 0x7D, 0x1C, 0x33, 0xCC, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xD0, 0x8D, 0x08, 0x7D, 0x1C, 0x33, 0xCC, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0x47, 0x04, 0x7D, 0x1C, 0x33, 0xCC, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x10, 0x40, 0x07, 0x10, 0xF0, 0x3F, 0x10, 0x40, 0x07, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0xDC, 0xB2, 0x8E, 0x37, 0x7B, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x00, 0x09, 0xC7, 0x0D, 0x33, 0xCC, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x03, 0x06, 0xC7, 0x0D, 0x33, 0xCC, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x40, 0x07, 0x22, 0xC7, 0x0D, 0x33, 0xCC, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x1D, 0x11, 0xC7, 0x0D, 0x33, 0xCC, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x03, 0x06, 0xC3, 0x0C, 0x73, 0x4C, 0x37, 0x74, 0xC0, 0xF0, 0x01, 0x00,
0x05, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x7F, 0x1C, 0x33, 0xCC, 0x34, 0x7F, 0x0C, 0x30, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0x47, 0x04, 0xC3, 0x0C, 0x73, 0x4C, 0x37, 0x74, 0xC0, 0xF0, 0x01, 0x00,
0x06, 0x0C, 0x40, 0x02, 0xFF, 0x32, 0x00, 0x03, 0xF0, 0x0B, 0x03, 0x30, 0x10, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0xDC, 0x41, 0x04, 0xFF, 0x32, 0x00, 0x03, 0xF0, 0x0B, 0x03, 0x30, 0x10, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0x30, 0x00, 0x30, 0x00, 0xF0, 0x1F, 0x30, 0x34, 0x30, 0x34, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0xC0, 0x00, 0x06, 0xFF, 0x33, 0x10, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xF4, 0xD1, 0x34, 0x03, 0xF1, 0x0B, 0x03, 0x70, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFC, 0xB1, 0x31, 0x07, 0xD0, 0x0F, 0x90, 0x23, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x1D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x04, 0x77, 0x11, 0x1D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xD0, 0x01, 0x0C, 0xC0, 0x00, 0x0C, 0xC0, 0x10, 0x0D, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0xC0, 0x30, 0x00, 0x0C, 0x03, 0xC0, 0xF0, 0x1F, 0x0D, 0x43, 0xA3, 0x30, 0x34, 0x07, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x03, 0x30, 0x30, 0x00, 0x03, 0x03, 0xF0, 0xFF, 0x1F, 0x03, 0x43, 0x33, 0x30, 0x34, 0x47, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0x30, 0x00, 0x30, 0x00, 0xF0, 0x0F, 0x30, 0x34, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0xC0, 0x00, 0x06, 0x47, 0x33, 0x0D, 0xB7, 0xF0, 0x02, 0xB3, 0x30, 0x2C, 0x47, 0x0B, 0x00, 0x00, 0x00, 0x00,
0x07, 0x30, 0x00, 0x24, 0x70, 0xD0, 0x0C, 0x3C, 0xC3, 0xCD, 0x28, 0x73, 0xC3, 0x3C, 0x30, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0xCC, 0x80, 0x0B, 0x03, 0x33, 0x30, 0x07, 0xD3, 0x3F, 0x00, 0x23, 0x34, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x30, 0x03, 0x33, 0x30, 0x03, 0x33, 0x30, 0xFF, 0x03, 0x03, 0x20, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x74, 0xD0, 0x1D, 0x47, 0x33, 0x30, 0xFF, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x31, 0x00, 0x03, 0xF0, 0x1F, 0x43, 0x33, 0x34, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xBF, 0x30, 0x38, 0x43, 0xF3, 0x1F, 0x43, 0x33, 0x34, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x33, 0x10, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x1F, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x34, 0x0C, 0x28, 0x0C, 0xFF, 0x3F, 0x03, 0x30, 0x02, 0x20, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x32, 0x00, 0x03, 0xF0, 0x0B, 0x03, 0x30, 0x10, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x70, 0xCD, 0x1C, 0xF8, 0x0B, 0xF4, 0x07, 0xDC, 0x0D, 0xCD, 0x1C, 0xC3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFC, 0x71, 0x34, 0x01, 0x03, 0x1E, 0x00, 0x33, 0x34, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x70, 0xD0, 0x0C, 0x3C, 0xC3, 0xCD, 0x28, 0x73, 0xC3, 0x3C, 0x30, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x0C, 0x03, 0xBE, 0x70, 0xD0, 0x0C, 0x3C, 0xC3, 0xCD, 0x28, 0x73, 0xC3, 0x3C, 0x30, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x0D, 0x37, 0xF0, 0x02, 0xB3, 0x30, 0x2C, 0x47, 0x0B, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFC, 0xC3, 0x30, 0x0C, 0xC3, 0x30, 0x0D, 0xA3, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x1F, 0x3D, 0x7B, 0x3B, 0xE3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x30, 0x03, 0xF3, 0x3F, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x40, 0x1F, 0x74, 0x1C, 0x07, 0xCD, 0x00, 0x33, 0xD0, 0x1C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x33, 0x30, 0x03, 0x33, 0x30, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x7F, 0x30, 0x1D, 0x43, 0x73, 0x34, 0xFF, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xF4, 0xD1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x03, 0x33, 0x30, 0x07, 0xD3, 0x3F, 0x00, 0x23, 0x34, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xF8, 0x0F, 0xDE, 0x38, 0xC7, 0x30, 0xCB, 0x38, 0xFC, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x34, 0x1C, 0xB8, 0x03, 0x3D, 0xC0, 0x2D, 0x34, 0x1C, 0x03, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x70, 0x70, 0x0C, 0x0C, 0x03, 0xC3, 0xC0, 0x30, 0x30, 0x0C, 0x0C, 0xFF, 0x0F, 0x00, 0x03, 0x80, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x03, 0x33, 0x30, 0x07, 0xD3, 0x3F, 0x00, 0x03, 0x30, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x34, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC7, 0x34, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x70, 0x4C, 0xC3, 0x30, 0x0C, 0xC3, 0x30, 0x0C, 0xC3, 0x30, 0x0C, 0xC3, 0x31, 0x0D, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x30, 0x00, 0x30, 0x00, 0xF0, 0x1F, 0x30, 0x34, 0x30, 0x34, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0x74, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x31, 0x43, 0x33, 0x43, 0x33, 0xFF, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x07, 0x30, 0x00, 0x03, 0xF0, 0x1F, 0x43, 0x33, 0x34, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x7D, 0x70, 0x1C, 0x01, 0x83, 0x3F, 0x00, 0x73, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x70, 0xF4, 0xC1, 0x74, 0x1C, 0x73, 0xD0, 0xFC, 0x00, 0x33, 0x03, 0xCD, 0x1C, 0x1D, 0xD7, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFD, 0x73, 0x30, 0x03, 0xC3, 0x3F, 0x5C, 0x73, 0x30, 0x43, 0x07, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x04, 0xC3, 0xCF, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xD0, 0xCB, 0x01, 0x7C, 0x5C, 0x33, 0xCC, 0x30, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x0C, 0xF3, 0xC3, 0x30, 0x7F, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x07, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xE0, 0x07, 0x30, 0xFC, 0x4C, 0x33, 0xCC, 0x31, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x0C, 0xF3, 0xCB, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xB3, 0x3B, 0xFD, 0x31, 0x33, 0x77, 0x03, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x04, 0xC3, 0x47, 0x30, 0x3E, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x8D, 0xB3, 0xCF, 0x33, 0xC7, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x0C, 0x2E, 0xC7, 0x8D, 0xB3, 0xCF, 0x33, 0xC7, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xEC, 0xF1, 0xC1, 0x1C, 0xC3, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x30, 0xD3, 0x8C, 0x32, 0xC7, 0x01, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF3, 0x3D, 0x77, 0x33, 0x31, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x0C, 0xF3, 0xCF, 0x30, 0xD3, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x1C, 0x33, 0xCC, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0C, 0x33, 0xCC, 0x30, 0xD7, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x1C, 0x33, 0xCC, 0x34, 0x7F, 0x0C, 0x30, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x5C, 0x32, 0xC0, 0x24, 0x3D, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x0C, 0x73, 0x4C, 0x37, 0x74, 0xC0, 0xF0, 0x01, 0x00,
0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0xFC, 0xB1, 0x37, 0x33, 0x73, 0x37, 0xFD, 0x01, 0x03, 0x30, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0x2C, 0xD3, 0xC7, 0x38, 0xC7, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x30, 0x0C, 0xC3, 0x30, 0x0C, 0xFF, 0x03, 0x30, 0x00, 0x02, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x1C, 0xD3, 0x0F, 0x30, 0xD0, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x37, 0x33, 0x33, 0x33, 0x33, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0xC3, 0xCC, 0x30, 0x33, 0xCC, 0x0C, 0xFF, 0x0F, 0x00, 0x03, 0x80, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0xC1, 0x34, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xDD, 0x00, 0xF3, 0xC7, 0x4C, 0x33, 0x7F, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0xF0, 0xC7, 0x34, 0x7F, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x48, 0x43, 0x8F, 0x30, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xC7, 0x1C, 0xF3, 0xC3, 0xCC, 0x34, 0xD7, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x1C, 0xE3, 0xCF, 0x30, 0xD3, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x00, 0x09, 0x7D, 0x0C, 0xF3, 0xCB, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0x47, 0x04, 0x7D, 0x0C, 0xF3, 0xCB, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x0C, 0xF0, 0x0B, 0x0C, 0xC0, 0x1F, 0x9C, 0xC3, 0x30, 0x1C, 0x03, 0x34, 0xD0, 0x01, 0x00,
0x04, 0x00, 0x00, 0x30, 0x18, 0x7F, 0x03, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x1C, 0xF2, 0xC1, 0x20, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x0C, 0xC1, 0x43, 0x30, 0x3F, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x04, 0x1C, 0x00, 0x0D, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x11, 0x77, 0x00, 0x0D, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1E, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xCC, 0x00, 0xCD, 0x1F, 0xCA, 0x34, 0xC7, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x00, 0xC3, 0x00, 0xFF, 0x1F, 0xC3, 0x34, 0xD3, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x0C, 0xF0, 0x0B, 0x0C, 0xC0, 0x1F, 0x9C, 0xC3, 0x30, 0x1C, 0x03, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x03, 0x06, 0xE3, 0xEC, 0xF1, 0xC1, 0x1C, 0xC7, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x00, 0x09, 0xC7, 0x8D, 0xB3, 0xCF, 0x33, 0xC7, 0x01, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0x4D, 0x1F, 0xC3, 0x0C, 0x73, 0x4C, 0x37, 0x74, 0xC0, 0xF0, 0x01, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x0C, 0x33, 0xCC, 0x30, 0xFF, 0x30, 0x80, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x1C, 0x07, 0x40, 0x33, 0x00, 0x30, 0x03, 0x02, 0x73, 0x74, 0x34, 0xFD, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x32, 0x32, 0x37, 0xD3, 0x1D, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xFE, 0x02, 0x30, 0x00, 0xF0, 0x1F, 0x30, 0x34, 0x30, 0x34, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x0C, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0xFC, 0xC1, 0x34, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x47, 0x1F, 0xD3, 0x34, 0x33, 0x10, 0xFF, 0x0B, 0x33, 0x00, 0x73, 0x34, 0xD7, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xC7, 0x1C, 0xF2, 0x1F, 0xCC, 0x20, 0xD7, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x74, 0xD0, 0x1D, 0x47, 0xF3, 0x3E, 0x77, 0x33, 0x33, 0x33, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0xD0, 0x1C, 0xEE, 0x32, 0x33, 0x33, 0x03, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x47, 0x07, 0xD3, 0x1D, 0x73, 0x34, 0xFF, 0x3E, 0x73, 0x37, 0x33, 0x33, 0x37, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x07, 0xD3, 0x1C, 0xFF, 0x2E, 0x33, 0x33, 0x37, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0x0C, 0x0C, 0x28, 0x0A, 0xF4, 0x07, 0xCD, 0x1C, 0xC7, 0x34, 0xC3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x81, 0x09, 0xFD, 0x71, 0x37, 0x33, 0x03, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xFF, 0x30, 0x0C, 0x0C, 0x83, 0xA2, 0xF0, 0xFF, 0x07, 0xD3, 0xCC, 0x31, 0xC7, 0x34, 0x37, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x1F, 0x83, 0x09, 0xFF, 0x1F, 0x73, 0x37, 0x37, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0xCC, 0x40, 0x07, 0xFC, 0x71, 0x34, 0x01, 0x03, 0x1E, 0x00, 0x03, 0x34, 0xFE, 0x71, 0x04, 0xBD, 0x00, 0x00,
0x05, 0x00, 0x00, 0x30, 0x43, 0x07, 0x3E, 0x04, 0xC3, 0x47, 0x30, 0x3E, 0x5C, 0xD0, 0x02, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x30, 0xC7, 0x30, 0xDD, 0x34, 0xF4, 0x1F, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x73, 0x33, 0xFD, 0x02, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x40, 0x1F, 0x74, 0x1C, 0x07, 0xCD, 0xFF, 0x33, 0xD0, 0x1C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x1C, 0xF3, 0xCF, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x2D, 0x03, 0x13, 0x03, 0x03, 0x8B, 0x03, 0xCD, 0x01, 0xDC, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xCB, 0x30, 0x31, 0x0D, 0xDC, 0x02, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0xCC, 0x00, 0x64, 0x02, 0x03, 0x2D, 0x03, 0x13, 0x03, 0x03, 0x8B, 0x03, 0xCD, 0x01, 0xDC, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0xC0, 0x0C, 0x90, 0x09, 0x43, 0xCB, 0x30, 0x31, 0x0D, 0xDC, 0x02, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x01, 0x00, 0x1D, 0x07, 0x00, 0x07, 0xCD, 0x30, 0x03, 0xCC, 0x30, 0x03, 0xCD, 0x31, 0x47, 0x47, 0x37, 0xFD, 0x01, 0x1D, 0x00, 0x00, 0x0C, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x0C, 0x73, 0xCC, 0x30, 0xC3, 0x1C, 0x33, 0x4D, 0x37, 0x7D, 0xD0, 0x01, 0x00, 0x0C, 0x00, 0x7C, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x80, 0x00, 0xF4, 0x07, 0x9D, 0x1C, 0x07, 0x34, 0x03, 0x30, 0x03, 0x34, 0x87, 0x1D, 0xFD, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFD, 0x71, 0x32, 0x03, 0x33, 0x36, 0xFD, 0x01, 0x02, 0x00, 0x00, 0x00,
0x0A, 0xE0, 0x0B, 0x00, 0x93, 0x0B, 0x40, 0x03, 0xD0, 0x08, 0x1C, 0x07, 0x40, 0x33, 0x00, 0x30, 0x03, 0x02, 0x73, 0x74, 0x34, 0xFD, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0xBE, 0x31, 0x38, 0x34, 0x80, 0x00, 0x43, 0x32, 0x32, 0x37, 0xD3, 0x1D, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0xF0, 0x3F, 0x00, 0x22, 0x02, 0x00, 0x00, 0xD0, 0x00, 0x1C, 0x07, 0x40, 0x33, 0x00, 0x30, 0x03, 0x02, 0x73, 0x74, 0x34, 0xFD, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0xF0, 0x3F, 0x22, 0x02, 0x00, 0x43, 0x32, 0x32, 0x37, 0xD3, 0x1D, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xF4, 0xD1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x00, 0x3D, 0x00, 0x03, 0x20, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x5C, 0x32, 0xC0, 0x00, 0x0D, 0x30, 0x80, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0x0A, 0xB4, 0x03, 0x03, 0x7B, 0x80, 0x2E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x2F, 0x33, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0xF8, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0xC3, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x4C, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0xBE, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0C, 0x00, 0x2E, 0x00, 0xB8, 0xB3, 0x0B, 0xCC, 0xC0, 0x0C, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x2E, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0xB8, 0x80, 0x0B, 0xCC, 0xEE, 0x0C, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0C, 0x00, 0x34, 0x00, 0x30, 0x1C, 0x00, 0x30, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x03, 0x00, 0x0D, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
0x08, 0x0C, 0x03, 0xF8, 0x02, 0x07, 0x0D, 0x03, 0x0F, 0xC3, 0x0D, 0xA3, 0x0C, 0x37, 0x0C, 0x0F, 0x0C, 0x07, 0x3C, 0x00, 0x28, 0x00, 0x1C, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xCC, 0x80, 0x0B, 0xC7, 0x31, 0x0E, 0xFB, 0xF0, 0x0C, 0xC7, 0x03, 0x28, 0xC0, 0x01, 0x00,
0x07, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xB8, 0x00, 0x0C, 0x00, 0xFF, 0xC1, 0xD0, 0x30, 0x34, 0xFC, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x0C, 0xC0, 0x00, 0x2E, 0xC0, 0x00, 0xFC, 0xC1, 0x34, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x31, 0x34, 0x73, 0x73, 0x1D, 0x7F, 0x33, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x1C, 0xB3, 0xCD, 0x1C, 0xDF, 0x0C, 0x30, 0x00, 0x00,
0x06, 0x00, 0x02, 0x30, 0xFF, 0x33, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x20, 0x30, 0x7F, 0x07, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x30, 0x10, 0x0C, 0xC0, 0x2F, 0xC0, 0x00, 0x30, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x71, 0xF0, 0x07, 0x03, 0x1C, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x33, 0x10, 0x03, 0xF0, 0x0F, 0x83, 0x33, 0x30, 0x07, 0x03, 0x30, 0xF4, 0x01, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x1C, 0xF0, 0xC3, 0x38, 0xC7, 0x40, 0x43, 0x07, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0C, 0x47, 0x33, 0x07, 0xF8, 0x0B, 0xD0, 0x1F, 0xC0, 0xDD, 0x40, 0x33, 0x07, 0xC3, 0xF0, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xC3, 0xEE, 0xD0, 0x1F, 0xCC, 0x0C, 0x77, 0x0F, 0x00, 0x03, 0x80, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFC, 0x71, 0x34, 0x01, 0x03, 0x1E, 0x00, 0x33, 0x34, 0xFE, 0x01, 0x09, 0x38, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x04, 0xC3, 0x47, 0x30, 0x3E, 0x90, 0xE0, 0x01, 0x00,
0x07, 0x00, 0x00, 0x00, 0x70, 0x34, 0x4C, 0x03, 0x37, 0xC0, 0x0B, 0x30, 0x0B, 0x0C, 0x0B, 0x47, 0x0F, 0x00, 0x03, 0x80, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xB0, 0x07, 0x1F, 0x30, 0x07, 0xC3, 0x03, 0x30, 0x00, 0x02, 0x00,
0x06, 0x00, 0x00, 0x00, 0x07, 0x33, 0x37, 0xF7, 0xF0, 0x03, 0xF3, 0x30, 0x37, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x33, 0x2B, 0xFF, 0x30, 0x2B, 0x23, 0x03, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0xC0, 0xD1, 0xFC, 0x0D, 0xDC, 0x00, 0x2F, 0xC0, 0x2C, 0x30, 0x2C, 0x1C, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xF3, 0x1F, 0x7C, 0xC0, 0x1C, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x34, 0x30, 0x0D, 0x70, 0x03, 0xF0, 0x02, 0x30, 0x0B, 0x30, 0x2C, 0x70, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xC3, 0x1E, 0x7C, 0xC0, 0x1C, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x70, 0x34, 0x0C, 0x0C, 0x03, 0xC3, 0xFF, 0x30, 0x30, 0x0C, 0x0C, 0x07, 0x0F, 0x00, 0x03, 0x80, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x30, 0x0C, 0xFF, 0x30, 0x0C, 0xC3, 0x03, 0x30, 0x00, 0x02, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x70, 0xF0, 0xCF, 0xC0, 0x10, 0x03, 0x03, 0xFC, 0x0F, 0x30, 0x30, 0xC0, 0xC0, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xDF, 0x70, 0xF0, 0x0F, 0x0C, 0x03, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x30, 0x30, 0x00, 0x03, 0x03, 0x30, 0xF0, 0x0F, 0x03, 0x83, 0x33, 0x30, 0x30, 0x07, 0x03, 0x03, 0x00, 0x30, 0x00, 0xF4, 0x01, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xC3, 0x00, 0xC3, 0x0F, 0xC3, 0x38, 0xC7, 0x30, 0x00, 0x34, 0x00, 0x1D, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x4D, 0x0B, 0xC3, 0x0D, 0xC3, 0x0C, 0xC3, 0x0C, 0x87, 0x17, 0xFD, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x70, 0x2D, 0x73, 0x73, 0x1E, 0x3D, 0x07, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xF4, 0xD1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xFD, 0x01, 0x09, 0x38, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x5C, 0x32, 0xC0, 0x24, 0x3D, 0x90, 0xE0, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x80, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0xC1, 0xDD, 0x30, 0x33, 0x8C, 0x0C, 0x03, 0x0F, 0x00, 0x03, 0x80, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x03, 0xB3, 0x38, 0xDC, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x0C, 0x73, 0x4C, 0x37, 0x74, 0xC0, 0x00, 0x03, 0x00,
0x06, 0x00, 0x00, 0x00, 0x03, 0xB3, 0x38, 0xDC, 0xF0, 0x3F, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x0C, 0x73, 0x4C, 0x37, 0x74, 0xF0, 0x03, 0x03, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x0D, 0x07, 0xB8, 0x03, 0xF4, 0x00, 0xDC, 0x02, 0x0D, 0x07, 0x03, 0x3C, 0x00, 0x30, 0x00, 0x20, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xB0, 0x0C, 0x7D, 0x30, 0x0E, 0xC7, 0x03, 0x30, 0x00, 0x02, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x43, 0x4C, 0x0C, 0x30, 0x30, 0xC0, 0xC0, 0x00, 0x03, 0x03, 0x0C, 0x0C, 0xF0, 0xFF, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x03, 0xC3, 0xC0, 0x30, 0x30, 0x0C, 0xFC, 0x0F, 0x00, 0x03, 0x80, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x30, 0x30, 0x0C, 0x0C, 0x07, 0x43, 0xFF, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x03, 0x80, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x70, 0x0C, 0xFD, 0x00, 0x0C, 0xC0, 0x03, 0x30, 0x00, 0x02, 0x00,
0x06, 0x00, 0x00, 0x00, 0x03, 0x33, 0x31, 0x37, 0xD3, 0x3F, 0x30, 0x03, 0x31, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x73, 0x33, 0xFD, 0x03, 0x33, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x07, 0x30, 0x00, 0x03, 0xF0, 0x1F, 0x43, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0xF0, 0xC7, 0x34, 0xC3, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1F, 0xD1, 0x34, 0x33, 0x30, 0xFE, 0x2F, 0x30, 0x00, 0x70, 0x34, 0xD0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xC7, 0x0C, 0xE3, 0xBF, 0xC0, 0x00, 0xD0, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1F, 0xD1, 0x34, 0x33, 0x30, 0xFE, 0x2F, 0x30, 0x00, 0x70, 0x34, 0xD0, 0x1F, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xC7, 0x0C, 0xE3, 0xBF, 0xC0, 0x00, 0xD0, 0x0B, 0x30, 0x00, 0x08, 0x00, 0x00,
0x04, 0x00, 0x00, 0x1D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x08, 0x30, 0x03, 0xE0, 0x02, 0xC3, 0x70, 0xCD, 0x1C, 0xF8, 0x0B, 0xF4, 0x07, 0xDC, 0x0D, 0xCD, 0x1C, 0xC3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xCC, 0x80, 0x0B, 0x33, 0xB3, 0x3B, 0xFD, 0x31, 0x33, 0x77, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x0D, 0x37, 0xF0, 0x0F, 0x83, 0x33, 0x30, 0x07, 0x03, 0x30, 0xF4, 0x01, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xEC, 0xF1, 0xC3, 0x38, 0xC3, 0x40, 0x43, 0x07, 0x00,
0x07, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x30, 0x0C, 0x0C, 0x03, 0xC3, 0xD0, 0x30, 0x28, 0x0C, 0x07, 0x0F, 0x80, 0x02, 0x70, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xC0, 0x0C, 0xCD, 0xA0, 0x0C, 0xC7, 0x03, 0x28, 0xC0, 0x01, 0x00,
0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x30, 0x03, 0xF3, 0x3F, 0x03, 0x33, 0x30, 0x07, 0x03, 0x30, 0xF4, 0x01, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x0C, 0xF3, 0xCF, 0x30, 0xC3, 0x40, 0x43, 0x07, 0x00,
0x07, 0x00, 0x00, 0x00, 0x70, 0x34, 0x0C, 0x0C, 0x03, 0xC3, 0xFF, 0x30, 0x30, 0x0C, 0x0C, 0x07, 0x0F, 0x80, 0x02, 0x70, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x30, 0x0C, 0xFF, 0x30, 0x0C, 0xC3, 0x03, 0x28, 0xC0, 0x01, 0x00,
0x06, 0x00, 0x00, 0x00, 0x03, 0x33, 0x30, 0x07, 0xD3, 0x3F, 0x00, 0x03, 0x30, 0xC0, 0x03, 0x0C, 0x80, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x1C, 0xD3, 0x0F, 0x30, 0xF0, 0xC0, 0x00, 0x02, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xC3, 0x47, 0x0F, 0x7B, 0x3B, 0x8C, 0xCB, 0x30, 0x08, 0xC3, 0x00, 0x0C, 0x03, 0xF0, 0x00, 0x80, 0x02, 0x00, 0x07, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xC3, 0xF7, 0x70, 0x37, 0x4C, 0x0C, 0x07, 0x0F, 0x80, 0x02, 0x70, 0x00, 0x00,
0x04, 0x00, 0x00, 0x0D, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
0x06, 0xCC, 0x80, 0x0B, 0x74, 0xD0, 0x1D, 0x47, 0x33, 0x30, 0xFF, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x0C, 0x2E, 0x7D, 0x04, 0xC3, 0xCF, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x06, 0xDC, 0x41, 0x04, 0x74, 0xD0, 0x1D, 0x47, 0x33, 0x30, 0xFF, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x1D, 0x11, 0x7D, 0x04, 0xC3, 0xCF, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0x0B, 0x37, 0x00, 0xCA, 0x00, 0x0C, 0xBF, 0xF0, 0x0F, 0xC0, 0x30, 0x10, 0xC3, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x1F, 0x04, 0xC3, 0xC0, 0xFF, 0xC2, 0x30, 0x00, 0x7D, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0xCC, 0x80, 0x0B, 0xFF, 0x32, 0x00, 0x03, 0xF0, 0x0B, 0x03, 0x30, 0x10, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x30, 0x83, 0x0B, 0x7D, 0x0C, 0xF3, 0xCB, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x7D, 0x70, 0x1C, 0x01, 0xE3, 0x3F, 0x03, 0x73, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x40, 0xE3, 0xCF, 0x30, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x06, 0xDC, 0x41, 0x04, 0x7D, 0x70, 0x1C, 0x01, 0xE3, 0x3F, 0x03, 0x73, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0x47, 0x04, 0x7E, 0x40, 0xE3, 0xCF, 0x30, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x08, 0x70, 0x07, 0x10, 0x01, 0xC3, 0x70, 0xCD, 0x1C, 0xF8, 0x0B, 0xF4, 0x07, 0xDC, 0x0D, 0xCD, 0x1C, 0xC3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xDC, 0x41, 0x04, 0x33, 0xB3, 0x3B, 0xFD, 0x31, 0x33, 0x77, 0x03, 0x00, 0x00, 0x00, 0x00,
0x06, 0xDC, 0x41, 0x04, 0xFC, 0x71, 0x34, 0x01, 0x03, 0x1E, 0x00, 0x33, 0x34, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0x47, 0x04, 0x3E, 0x04, 0xC3, 0x47, 0x30, 0x3E, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x13, 0x34, 0xD0, 0x00, 0x1F, 0x00, 0x33, 0x34, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x44, 0x43, 0x03, 0x1F, 0xC0, 0x4C, 0xE3, 0x07, 0x00,
0x07, 0xF8, 0x02, 0x00, 0x70, 0xD0, 0x0C, 0x3C, 0xC3, 0xCD, 0x28, 0x73, 0xC3, 0x3C, 0x30, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xE0, 0x0B, 0x00, 0xC7, 0x8D, 0xB3, 0xCF, 0x33, 0xC7, 0x01, 0x00, 0x00, 0x00,
0x07, 0x74, 0x03, 0x44, 0x70, 0xD0, 0x0C, 0x3C, 0xC3, 0xCD, 0x28, 0x73, 0xC3, 0x3C, 0x30, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xD0, 0x0D, 0x11, 0xC7, 0x8D, 0xB3, 0xCF, 0x33, 0xC7, 0x01, 0x00, 0x00, 0x00,
0x07, 0x74, 0x03, 0x44, 0x40, 0x1F, 0x74, 0x1C, 0x07, 0xCD, 0x00, 0x33, 0xD0, 0x1C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0x47, 0x04, 0x7D, 0x1C, 0x33, 0xCC, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x40, 0x1F, 0x74, 0x1C, 0x07, 0xCD, 0xFF, 0x33, 0xD0, 0x1C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x1C, 0xF3, 0xCF, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x07, 0x74, 0x03, 0x44, 0x40, 0x1F, 0x74, 0x1C, 0x07, 0xCD, 0xFF, 0x33, 0xD0, 0x1C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0x47, 0x04, 0x7D, 0x1C, 0xF3, 0xCF, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x06, 0xDD, 0x40, 0x04, 0x7D, 0x70, 0x1C, 0x01, 0x83, 0x3F, 0x00, 0x73, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0x47, 0x04, 0x7D, 0x48, 0x43, 0x8F, 0x30, 0x7D, 0x00, 0x00, 0x00, 0x00,
0x06, 0xFD, 0x01, 0x00, 0x03, 0x33, 0x30, 0x07, 0xD3, 0x3F, 0x00, 0x23, 0x34, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xE0, 0x0B, 0x00, 0xC3, 0x0C, 0x73, 0x4C, 0x37, 0x74, 0xC0, 0xF0, 0x01, 0x00,
0x06, 0xDC, 0x41, 0x04, 0x03, 0x33, 0x30, 0x07, 0xD3, 0x3F, 0x00, 0x23, 0x34, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0x47, 0x04, 0xC3, 0x0C, 0x73, 0x4C, 0x37, 0x74, 0xC0, 0xF0, 0x01, 0x00,
0x06, 0x30, 0x83, 0x19, 0x03, 0x33, 0x30, 0x07, 0xD3, 0x3F, 0x00, 0x23, 0x34, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0xC0, 0x8C, 0x19, 0xC3, 0x0C, 0x73, 0x4C, 0x37, 0x74, 0xC0, 0xF0, 0x01, 0x00,
0x06, 0xDC, 0x41, 0x04, 0x03, 0x33, 0x30, 0x07, 0xD3, 0x3F, 0x00, 0x03, 0x30, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x70, 0x47, 0x04, 0xC3, 0x1C, 0xD3, 0x0F, 0x30, 0xD0, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xFF, 0x33, 0x10, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x0F, 0xC0, 0x00, 0x08, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x07, 0x03, 0x03, 0x07, 0x0C, 0x09, 0x00,
0x08, 0x70, 0x07, 0x10, 0x01, 0x07, 0x74, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x31, 0x43, 0x33, 0x43, 0x33, 0xFF, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0xC0, 0x1D, 0x10, 0x01, 0x03, 0xDD, 0x00, 0xF3, 0xC7, 0x4C, 0x33, 0x7F, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x30, 0x10, 0x0C, 0xC0, 0x2F, 0xC0, 0x00, 0x30, 0x00, 0x3C, 0x00, 0x0D, 0xC0, 0x01, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x71, 0xF0, 0x07, 0x03, 0x1C, 0xC0, 0x40, 0x02, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x0D, 0x07, 0xB8, 0x03, 0xF4, 0x00, 0xDC, 0x02, 0x0D, 0x07, 0x03, 0x1C, 0x00, 0x24, 0x00, 0x0E, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xB0, 0x0C, 0x7D, 0x30, 0x0E, 0x87, 0x03, 0x24, 0xE0, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x34, 0x1C, 0xB8, 0x83, 0xFF, 0xC2, 0x2D, 0x34, 0x1C, 0x03, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xB4, 0xF2, 0x8F, 0x1E, 0xC7, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x7F, 0x00, 0xFF, 0x01, 0xFF, 0x07, 0xFF, 0x1F, 0xFF, 0x7F, 0xFF, 0x1B, 0xBF, 0x01, 0x1B, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0x00, 0x00, 0xF8, 0xF0, 0x3F, 0xEE, 0x2C, 0x30, 0xCB, 0x0B, 0x30, 0x42, 0xC3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xF3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xFF, 0x3F, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x00, 0x00, 0xCB, 0x00, 0x00, 0xEE, 0xC0, 0xFF, 0xF8, 0xB0, 0xC0, 0xFF, 0x2C, 0xC0, 0x00, 0x0C, 0xCF, 0x00, 0x0C, 0xC0, 0x00, 0xCC, 0xCF, 0x00, 0x0C, 0xC0, 0x00, 0xFC, 0xFF,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x70, 0x00, 0x00, 0xF3, 0xFF, 0xD3, 0x03, 0xE0, 0x3C, 0x3F, 0x38, 0x03, 0xD0, 0x33, 0xFF, 0x38, 0x03, 0xE0, 0xF0, 0xFF, 0x03,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x8B, 0xF7, 0x0C, 0x13, 0x9F, 0x3B, 0x37, 0x00, 0xC0, 0x23, 0xFF, 0xFF, 0x8B, 0x03, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x7F, 0x80, 0x03, 0x2C, 0x0D, 0x00, 0x37, 0x00, 0xC0, 0xF3, 0xFF, 0x3C, 0xFF, 0xCF, 0x03, 0x00, 0xDC, 0x00, 0x70, 0x38, 0xC0, 0x02, 0xFD, 0x07,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0xF0, 0xFF, 0xC0, 0xFF, 0x3F, 0xFC, 0xFF, 0xC3, 0xFF, 0x3F, 0xFC, 0xFF, 0x03, 0xFF, 0x0F, 0xC0, 0x3F, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0xC0, 0x03, 0x00, 0x3C, 0xF0, 0xC0, 0xC3, 0x3A, 0x3C, 0x0B, 0xCE, 0x2B, 0x80, 0x7E, 0x00, 0xD0, 0x03, 0x00, 0xFC, 0xFF, 0xFF,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x3F, 0xFC, 0xFF, 0xC3, 0xFF, 0x3F, 0xFC, 0xFF, 0xC3, 0xFF, 0x3F, 0xFC, 0xFF, 0xC3, 0xFF, 0x3F, 0xFC, 0xFF, 0x03, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x7F, 0x80, 0x03, 0x2C, 0x0D, 0x0F, 0x37, 0xF0, 0xC0, 0xF3, 0xFF, 0x3C, 0xFF, 0xCF, 0x03, 0x0F, 0xDC, 0xF0, 0x70, 0x38, 0xC0, 0x02, 0xFD, 0x07,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1F, 0x00, 0xAD, 0x07, 0xB0, 0xC5, 0x00, 0x17, 0x0C, 0x70, 0xD0, 0x00, 0x0C, 0x03, 0xBC, 0xEF, 0xB3, 0x11, 0xE0, 0x07, 0x05, 0x3C, 0x52, 0xC8,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xC0, 0x3F, 0x00, 0xF0, 0x00, 0xC0, 0x30, 0xC0, 0xFF, 0x3F, 0xFC, 0xFF, 0xC3, 0xFF, 0x3F,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0xFF, 0x0F, 0xFC, 0xFF, 0x3F, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xE0, 0x2F, 0xFF, 0xE3, 0x2F, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x7F, 0x80, 0xFF, 0x2F, 0xFD, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0x7F, 0xF8, 0xFF, 0x02, 0xFD, 0x07,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x02, 0x00, 0xC8, 0x07, 0x10, 0xC3, 0x00, 0x31, 0x0D, 0x00, 0xFD, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0xF0, 0xF0, 0x00, 0x0F, 0x0F, 0xF0, 0xF0, 0x00, 0x0F, 0x0F, 0xF0, 0xF0, 0x00, 0x0F, 0x0F, 0xF0, 0xF0, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x80, 0xFF, 0x8B, 0x1E, 0xD0, 0x2E, 0x00, 0xF0, 0x00, 0xE0, 0xFF, 0x0B, 0x00, 0x0F, 0x00, 0xB8, 0x03, 0xB0, 0xE2, 0xFF, 0x02, 0x50, 0x01,
0x08, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x03, 0x1E, 0x03, 0x73, 0x03, 0xEF, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF,
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFE, 0x02, 0xBE, 0xC1, 0xD0, 0x01, 0xF0, 0x3F, 0xE0, 0x0B, 0x1F, 0x1C, 0xD0, 0x4A, 0x03, 0x6C, 0xB3, 0x00, 0xC3, 0x4D, 0x7E, 0xD0, 0xBF, 0x01,
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2A, 0x00, 0xAA, 0x0A, 0x80, 0x2A, 0xFC, 0xA0, 0xF2, 0x3F, 0xA0, 0xFC, 0x03, 0xC8, 0xFF, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0xC0, 0x07, 0xAA, 0xEA, 0x1F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xAA, 0xEA, 0x1F, 0x00, 0xC0, 0x07, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x00, 0xD0, 0x03, 0x00, 0xF4, 0xAB, 0xAA, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xF4, 0xAB, 0xAA, 0xD0, 0x03, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x3F, 0xFE, 0xFF, 0xA0, 0xEA, 0xA3, 0x80, 0xEF, 0x02, 0xFE, 0x0B, 0xF8, 0xAF, 0xEA, 0xFF, 0x2F, 0xFE, 0x2F, 0x20, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x2D, 0xFE, 0x2F, 0x00, 0x00, 0xF0, 0xFF, 0x06, 0x00, 0x64, 0xFE, 0x0A, 0x05, 0x90, 0x00, 0x00, 0x02, 0x40, 0x06,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x07, 0x36, 0x06, 0x4C, 0x0E, 0x28, 0x3C, 0x70, 0xF0, 0xE0, 0xC1, 0xF6, 0x7F, 0xF2, 0xFF, 0x03, 0xFE, 0x02, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x04, 0x20, 0x11, 0x84, 0x48, 0x10, 0x12, 0x42, 0x88, 0x04, 0x32, 0x22, 0xCC, 0x8C, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x01, 0xD0, 0x01, 0x80, 0x07, 0x40, 0x7B, 0x00, 0xFF, 0x02, 0xBC, 0x0F, 0xE0, 0x2B, 0x40, 0x7F, 0xD0, 0xFF, 0x1F, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x14, 0x00, 0x90, 0x01, 0x80, 0x0A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0xCF, 0xBD, 0x3C, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0xCF, 0xBD, 0x3C, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0xCF, 0xBD, 0x3C, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x74, 0x00, 0x40, 0x07, 0x00, 0x34, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0xCF, 0xBD, 0x3C, 0x00, 0xF0, 0xFF, 0xFF, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xF0, 0xFF, 0xC3, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0xC0, 0x07, 0x00, 0xBD, 0x02, 0xE8, 0xB3, 0xE0, 0x3C, 0xAC, 0xC3, 0x03, 0x0F, 0x3C, 0x00, 0xC0, 0x03, 0x00, 0xFC, 0xFF, 0xFF,
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x0C, 0x1C, 0xB9, 0xD1, 0x6C, 0x73, 0x0E, 0x70, 0x34, 0x70, 0x0A, 0x68, 0xD3, 0xFF, 0x1F, 0xBC, 0x99, 0x8F, 0x8B, 0x8B, 0x7B, 0x9B, 0x79, 0xFF, 0xFF, 0xFF,
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x3F, 0x00, 0xC0, 0x0F, 0x00, 0xFC, 0x0F, 0x00, 0xFF, 0x03, 0xF0, 0xFF, 0x03, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x1F, 0xCB, 0x30, 0xC3, 0x3F, 0xC7, 0x00, 0x7E, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xC3, 0xFF, 0x3F, 0x0C, 0x00, 0xC3, 0xFC, 0x33, 0x0C, 0x24, 0xC3, 0xC0, 0x31, 0x0C, 0x06, 0xC3, 0x30, 0x30, 0x0C, 0x00, 0xC3, 0xFF, 0x3F,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x30, 0x00, 0x03, 0xC3, 0x30, 0x30, 0x3F, 0xFF, 0xFF, 0x3F, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0x0C, 0x0C, 0xC3, 0xC0, 0x00, 0x0C, 0xFC, 0xFF,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0xFC, 0x0F, 0xC0, 0xFF, 0x00, 0xFC, 0x0F, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x3C, 0x00, 0xC0, 0x03, 0xF0, 0x3F, 0x00, 0xFF, 0x03, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0xFF, 0x3F, 0x8E, 0xCB, 0xBE, 0x99, 0xFF, 0x8B, 0xFF, 0x9B, 0xF9, 0x8E, 0xCB, 0xF2, 0xFF, 0x03, 0xFE, 0x02, 0x00, 0x00,
0x04, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0x03, 0x00, 0x70, 0x78, 0x38, 0x0C, 0xC3, 0x30, 0xEE, 0x1D,
0x03, 0x00, 0x40, 0xB7, 0xCB, 0x30, 0x0C, 0xC3, 0xD2, 0xD2,
0x05, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x4C, 0x33, 0xCC, 0x30, 0xC7, 0xF4, 0x01, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xF0, 0x90, 0x03, 0x0C, 0x30, 0xF4, 0x02, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x08, 0x03, 0x06, 0x06, 0x06, 0xFC, 0x03, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x08, 0x83, 0x0B, 0x30, 0xC2, 0xF4, 0x01, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x60, 0x63, 0xCC, 0x3F, 0xC0, 0x00, 0x03, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x0C, 0xF0, 0x07, 0x34, 0xC1, 0xF8, 0x01, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x0C, 0xF1, 0xC2, 0x34, 0xC3, 0xF4, 0x01, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x03, 0x06, 0x06, 0x0C, 0x30, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x0C, 0xD3, 0xC7, 0x34, 0xC3, 0xF4, 0x01, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x0C, 0x63, 0x0C, 0x3E, 0xC0, 0xF8, 0x01, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x03, 0x00, 0x00, 0x0C, 0xCF, 0xF3, 0x3C, 0xCF, 0x33, 0x00,
0x03, 0x00, 0x00, 0xC0, 0x3C, 0xCF, 0xF3, 0x3C, 0x0F, 0x03,
0x05, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x30, 0xC0, 0x0F, 0x30, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xD0, 0x7F, 0x40, 0xFF, 0x1F, 0xFC, 0xFF, 0x43, 0xFF, 0x1F, 0x40, 0x15, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x06, 0x90, 0x91, 0x01, 0x06, 0x24, 0x30, 0x90, 0x1B, 0x46, 0x6E, 0x96, 0xB9, 0x91, 0xE4, 0x06, 0x0C, 0x18, 0x90, 0x40, 0x46, 0x06, 0x90, 0x1B,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x02, 0xC2, 0xAB, 0xAA, 0x3E, 0x20, 0xE0, 0xAB, 0xAA, 0x3E, 0x02, 0xC2, 0xFF, 0xFF, 0x0F, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0xC0, 0x30, 0x00, 0x0C, 0x03, 0xF0, 0xFF, 0x00, 0xFE, 0x0B, 0xD0, 0x7F, 0x00, 0xA4, 0x01, 0x00, 0x0A, 0x00, 0xA0, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x24, 0x10, 0x85, 0x00, 0x20, 0x66, 0x40, 0x15, 0x45, 0x62, 0x90, 0x4D, 0xD0, 0xF1, 0x23, 0x01, 0xFD, 0x41, 0x41, 0x07, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xA0, 0x00, 0x40, 0x1F, 0x00, 0xF8, 0x02, 0xD0, 0x7F, 0x00, 0xFE, 0x0B, 0xF0, 0xEF, 0x00, 0xFF, 0x0D, 0xD0, 0x77, 0x00, 0xF4, 0x01,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3C, 0x00, 0xD4, 0x01, 0xD0, 0x06, 0x40, 0x7F, 0x00, 0xFD, 0x01, 0xF4, 0x07, 0xD0, 0x1F, 0x00, 0x7F, 0x00, 0xD0, 0x01, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0x00, 0xFE, 0x0B, 0x88, 0x2F, 0x52, 0xF0, 0x50, 0x01, 0x0A, 0xD4, 0xAF, 0x7F, 0xFD, 0xF5, 0xC7, 0x0B, 0x3E, 0x70, 0xD0, 0x00, 0xA8, 0x02,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2F, 0x80, 0x5F, 0x2F, 0x0C, 0x00, 0xC3, 0x00, 0x30, 0x0C, 0x00, 0xC3, 0x01, 0x34, 0x34, 0xC0, 0x01, 0x07, 0x0D, 0xD0, 0x75, 0x00, 0xF4, 0x01,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xF4, 0x01, 0xC0, 0x3F, 0x00, 0xF0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xE0, 0xEF, 0x00, 0xBB, 0x0B, 0xA0, 0xAA, 0x00, 0xAA, 0x0A, 0x80, 0x19, 0x00, 0x64, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x2D, 0x80, 0xE7, 0x0B, 0xBE, 0xF8, 0xFA, 0x02, 0xFE, 0x0B, 0x80, 0x2F, 0x00, 0x50, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xF8, 0x02, 0xE0, 0xBF, 0x80, 0xAF, 0x2F, 0xBE, 0xE0, 0xDB, 0x02, 0x78, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xA0, 0x00, 0x40, 0x1F, 0x50, 0xFE, 0x5B, 0xFD, 0xFF, 0x47, 0xFF, 0x1F, 0xE0, 0xBF, 0x00, 0xFE, 0x0B, 0xF0, 0xF5, 0x40, 0x01, 0x14,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1A, 0x00, 0x09, 0x06, 0x20, 0x80, 0x00, 0x02, 0x08, 0xFC, 0xFF, 0xC3, 0x00, 0x30, 0x0C, 0x00, 0xC3, 0x00, 0x30, 0x0C, 0x00, 0xC3, 0xFF, 0x3F,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x0A, 0xF0, 0xFF, 0x00, 0xAA, 0x0A, 0xF0, 0xFF, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0xFF, 0x3F, 0xFE, 0xDF, 0xFE, 0x1F, 0xFE, 0x1D, 0xFE, 0x12, 0xFE, 0x2E, 0xFE, 0xF2, 0xFE, 0x03, 0xFE, 0x02, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x31, 0x00, 0x30, 0x01, 0x40, 0x34, 0x00, 0xCC, 0x00, 0x00, 0x0A, 0x00, 0xF8, 0x02, 0xE0, 0xBF, 0x80, 0xFF, 0x2F, 0xFE, 0xFF, 0xFB, 0xFF, 0xFF,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x2F, 0xFC, 0xFF, 0xC3, 0x07, 0x3D, 0x3C, 0xC0, 0xC3, 0x03, 0x3C, 0x7C, 0xD0, 0xC3, 0xFF, 0x3F, 0xF8, 0xFF, 0x02, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0xF3, 0x3C, 0x3C, 0xCF, 0x03, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB9, 0x91, 0xE3, 0x46, 0x2E, 0x1B, 0xB9, 0x61, 0xE4, 0x06, 0x91, 0x1B, 0x41, 0x6E, 0x24, 0xB9, 0x91, 0xE3, 0x46, 0x2E, 0x1B, 0xB9, 0x01, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x0C, 0xC0, 0x23, 0x00, 0x80, 0x08, 0x00, 0x20, 0x0F, 0xC0, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x2F, 0xC0, 0x01, 0x0D, 0x06, 0x40, 0x32, 0x00, 0x30, 0x03, 0x00, 0x33, 0x00, 0x30, 0x06, 0x40, 0xC2, 0x01, 0x0D, 0xE0, 0x2F, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x23, 0x80, 0x32, 0x0A, 0x0D, 0xC3, 0xD1, 0x10, 0x1C, 0x0D, 0xC0, 0x81, 0x02, 0x0A, 0xE0, 0x2F, 0x00, 0x54, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0xB0, 0xE0, 0x00, 0x03, 0x0C, 0x30, 0xC0, 0x00, 0x0B, 0x0E, 0xC0, 0x3F, 0x00, 0xAC, 0x03, 0xC0, 0x3A, 0x00, 0xAC, 0x03,
0x05, 0x00, 0x00, 0xF0, 0xC6, 0x1B, 0x6F, 0xBC, 0xF1, 0xC6, 0x1B, 0x6F, 0xBC, 0xF1, 0x06, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x3E, 0x00, 0xF9, 0x00, 0xE4, 0x03, 0x90, 0x0F, 0x40, 0x3E, 0x00, 0xF9, 0x00, 0xE4, 0x03, 0x90, 0x0F, 0x40, 0x3E, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0xFF, 0x03, 0xF0, 0x3F, 0x00, 0xFF, 0x03, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x82, 0xE0, 0xBA, 0x2E, 0x08, 0x82, 0x80, 0x20, 0x08, 0xAE, 0xEB, 0x82, 0x20, 0x08, 0x08, 0x82, 0xE0, 0xBA, 0x2E, 0x08, 0x82, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x30, 0xFC, 0x00, 0x43, 0x07, 0xFC, 0x20, 0x40, 0x07, 0x30, 0x20, 0x00, 0x03, 0x00, 0xFC, 0x00, 0x40, 0x07, 0x00, 0x20,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xC0, 0x20, 0x1D, 0x20, 0x61, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x84, 0x01, 0x24, 0xB4, 0xF1, 0x01, 0xFE, 0x0F, 0xD0, 0x0F, 0x00, 0xFC,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x90, 0x1A, 0x40, 0xFE, 0x06, 0xE4, 0x6F, 0x40, 0xFE, 0x06, 0x90, 0x1A, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x81, 0x88, 0x88, 0x58, 0x55, 0x55, 0xF5, 0x0F, 0x40, 0x55, 0x55, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0xA5, 0x6B, 0x01, 0x64, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0x86, 0xC0, 0x00, 0x2C, 0x40, 0xFE, 0x0B, 0xE4, 0xBF, 0x0C, 0xC0, 0xF2, 0x6F, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xF4, 0x01, 0xC0, 0x30, 0x00, 0x0D, 0x07, 0xF0, 0xF0, 0x40, 0x5F, 0x1F, 0xFC, 0xFA, 0xD3, 0xFF, 0x7F, 0xFF, 0xF0, 0xDF, 0xFF, 0x7F,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1E, 0x00, 0x80, 0x07, 0x00, 0xE0, 0x01, 0x00, 0x78, 0x60, 0x00, 0x24, 0x98, 0x01, 0x80, 0x42, 0x06, 0x00, 0x00, 0x19, 0x00, 0x00, 0x04,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7F, 0x00, 0x5C, 0x0D, 0xC0, 0xC1, 0x00, 0x1C, 0x0C, 0x40, 0xFF, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x68, 0x00, 0xA2, 0x02, 0x80, 0x0A, 0x00, 0x25, 0x00, 0x44, 0x08, 0x10, 0x01, 0x40, 0x04, 0x00, 0x14, 0x00, 0x10, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x00, 0xFF, 0x0F, 0xF0, 0xFF, 0x00, 0xFF, 0x0F, 0xF0, 0xFF, 0x00, 0xFF, 0x0F, 0xF0, 0xFA, 0x00, 0x5B, 0x0E, 0x60, 0x90, 0x00, 0x01, 0x04,
0x06, 0x00, 0x00, 0x00, 0xCD, 0xF1, 0x3F, 0xFD, 0x41, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
0x0A, 0x00, 0x00, 0x00, 0x74, 0x00, 0xD0, 0x1F, 0x40, 0x8B, 0x07, 0x3D, 0xF3, 0xF1, 0x3F, 0x3F, 0xFD, 0xF8, 0x41, 0xFF, 0x07, 0xD0, 0x1C, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
extern const unsigned short font_ptrs[] = {
0x0000, 0x0010, 0x0020, 0x0030, 0x0040, 0x0050, 0x0060, 0x0070,
0x0080, 0x0090, 0x00A0, 0x00B0, 0x00C0, 0x00D0, 0x00E0, 0x00F0,
0x0100, 0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0160, 0x0170,
0x0180, 0x0190, 0x01A0, 0x01B0, 0x01C0, 0x01D0, 0x01E0, 0x01F0,
0x0200, 0x0210, 0x021A, 0x022A, 0x023D, 0x0250, 0x0266, 0x0279,
0x0283, 0x0290, 0x029D, 0x02B0, 0x02C3, 0x02D0, 0x02E0, 0x02EA,
0x02FD, 0x0310, 0x0320, 0x0333, 0x0346, 0x0359, 0x036C, 0x037F,
0x0392, 0x03A5, 0x03B8, 0x03C2, 0x03CF, 0x03E2, 0x03F5, 0x0408,
0x041B, 0x0434, 0x0447, 0x045A, 0x046D, 0x0480, 0x0493, 0x04A6,
0x04B9, 0x04CC, 0x04D9, 0x04EC, 0x0502, 0x0515, 0x052E, 0x0544,
0x055A, 0x056D, 0x0583, 0x0596, 0x05A9, 0x05BC, 0x05D2, 0x05E5,
0x05FE, 0x0614, 0x0627, 0x063D, 0x064A, 0x065A, 0x0667, 0x0674,
0x0687, 0x0691, 0x06A1, 0x06B1, 0x06C1, 0x06D1, 0x06E1, 0x06EE,
0x06FE, 0x070E, 0x071B, 0x0728, 0x0738, 0x0745, 0x0758, 0x0768,
0x0778, 0x0788, 0x0798, 0x07A5, 0x07B5, 0x07C2, 0x07D2, 0x07E2,
0x07F5, 0x0805, 0x0815, 0x0825, 0x0832, 0x0839, 0x0846,
0x0859, 0x0869, 0x0873, 0x0886, 0x0899, 0x08AC, 0x08BF, 0x08C6,
0x08D6, 0x08E9, 0x0902, 0x0912, 0x0925, 0x0938, 0x0939, 0x0952,
0x0962, 0x096F, 0x0982, 0x098F, 0x099C, 0x09AC, 0x09BF, 0x09D5,
0x09E5, 0x09F5, 0x09FF, 0x0A0F, 0x0A25, 0x0A3B, 0x0A51, 0x0A67,
0x0A7A, 0x0A8D, 0x0AA0, 0x0AB3, 0x0AC6, 0x0AD9, 0x0AEC, 0x0B08,
0x0B1B, 0x0B2E, 0x0B41, 0x0B54, 0x0B67, 0x0B74, 0x0B81, 0x0B8E,
0x0B9B, 0x0BB1, 0x0BC7, 0x0BDD, 0x0BF3, 0x0C09, 0x0C1F, 0x0C35,
0x0C48, 0x0C5E, 0x0C74, 0x0C8A, 0x0CA0, 0x0CB6, 0x0CC9, 0x0CDC,
0x0CEF, 0x0CFF, 0x0D0F, 0x0D1F, 0x0D2F, 0x0D3F, 0x0D4F, 0x0D68,
0x0D78, 0x0D88, 0x0D98, 0x0DA8, 0x0DB8, 0x0DC5, 0x0DD2, 0x0DDF,
0x0DEC, 0x0DFC, 0x0E0C, 0x0E1C, 0x0E2C, 0x0E3C, 0x0E4C, 0x0E5C,
0x0E6F, 0x0E7F, 0x0E8F, 0x0E9F, 0x0EAF, 0x0EBF, 0x0ECF, 0x0EDF,
0x0EEF, 0x0F02, 0x0F15, 0x0F2E, 0x0F41, 0x0F54, 0x0F67, 0x0F74,
0x0F81, 0x0F94, 0x0FB3, 0x0FD2, 0x0FEB, 0x0FFE, 0x1014, 0x1027,
0x103A, 0x104D, 0x1060, 0x1073, 0x1086, 0x109F, 0x10B2, 0x10CB,
0x10DE, 0x10F4, 0x110A, 0x111D, 0x1130, 0x1149, 0x115C, 0x1172,
0x1185, 0x1198, 0x11AB, 0x11BE, 0x11D1, 0x11EA, 0x1200, 0x1216,
0x1229, 0x1242, 0x125E, 0x1277, 0x1290, 0x12A3, 0x12B6, 0x12D2,
0x12E5, 0x12F5, 0x1305, 0x1315, 0x1322, 0x1332, 0x1342, 0x1355,
0x1365, 0x1375, 0x1385, 0x1395, 0x13A5, 0x13B8, 0x13C8, 0x13D8,
0x13E8, 0x13F8, 0x1408, 0x141B, 0x142B, 0x143E, 0x144E, 0x1461,
0x1471, 0x1484, 0x149A, 0x14AD, 0x14C3, 0x14D3, 0x14E3, 0x14F9,
0x1509, 0x1519, 0x1529, 0x153C, 0x1549, 0x1559, 0x1569, 0x1576,
0x1583, 0x1590, 0x15A9, 0x15C2, 0x15D5, 0x15E5, 0x15F5, 0x1605,
0x1615, 0x1634, 0x1647, 0x1660, 0x1673, 0x168C, 0x16A2, 0x16B5,
0x16C8, 0x16E1, 0x16FA, 0x1713, 0x1726, 0x1745, 0x175E, 0x1771,
0x1781, 0x179A, 0x17AD, 0x17C3, 0x17D3, 0x17EC, 0x1802, 0x181B,
0x1831, 0x1856, 0x1875, 0x188E, 0x18A1, 0x18C0, 0x18D3, 0x18F2,
0x1905, 0x1918, 0x1928, 0x193B, 0x194E, 0x1961, 0x196B, 0x1975,
0x1988, 0x19AD, 0x19D2, 0x19EB, 0x19FE, 0x1A14, 0x1A27, 0x1A3A,
0x1A4A, 0x1A5D, 0x1A6A, 0x1A80, 0x1A90, 0x1AA3, 0x1AB3, 0x1ACF,
0x1AE5, 0x1AF8, 0x1B08, 0x1B1E, 0x1B31, 0x1B44, 0x1B57, 0x1B6D,
0x1B80, 0x1B99, 0x1BAC, 0x1BC2, 0x1BD5, 0x1BF1, 0x1C07, 0x1C26,
0x1C3F, 0x1C58, 0x1C6B, 0x1C7E, 0x1C8E, 0x1CA1, 0x1CB7, 0x1CCA,
0x1CDA, 0x1CED, 0x1CFD, 0x1D16, 0x1D29, 0x1D45, 0x1D5B, 0x1D71,
0x1D84, 0x1D97, 0x1DAA, 0x1DBD, 0x1DCD, 0x1DE6, 0x1DFC, 0x1E15,
0x1E2B, 0x1E38, 0x1E51, 0x1E64, 0x1E77, 0x1E87, 0x1E9D, 0x1EB0,
0x1EC3, 0x1ED3, 0x1EE9, 0x1EFC, 0x1F0F, 0x1F1F, 0x1F3B, 0x1F51,
0x1F5E, 0x1F71, 0x1F81, 0x1F94, 0x1FA4, 0x1FC0, 0x1FDC, 0x1FEF,
0x1FFF, 0x2012, 0x2022, 0x2035, 0x2045, 0x205E, 0x2071, 0x2084,
0x2094, 0x20A7, 0x20B7, 0x20CD, 0x20DD, 0x20F3, 0x2103, 0x2119,
0x2129, 0x213F, 0x214F, 0x2165, 0x2175, 0x2188, 0x2198, 0x21AB,
0x21BB, 0x21CE, 0x21DE, 0x21F1, 0x2201, 0x2214, 0x2224, 0x2237,
0x2244, 0x225D, 0x2273, 0x2289, 0x2299, 0x22B2, 0x22C5, 0x22DB,
0x22EB, 0x2304, 0x2329, 0x234E, 0x236D, 0x2392, 0x23B1, 0x23D0,
0x23EF, 0x240E, 0x242D, 0x244C, 0x246B, 0x2490, 0x24A3, 0x24C2,
0x24E1, 0x2500, 0x251F, 0x2538, 0x255A, 0x257C, 0x25A1, 0x25C6,
0x25E2, 0x25FE, 0x261A, 0x2636, 0x2652, 0x266E, 0x268A, 0x26A6,
0x26C2, 0x26DE, 0x26FA, 0x2719, 0x273B, 0x275D, 0x2776, 0x2795,
0x27B4, 0x27D3, 0x27F2, 0x280E, 0x281B, 0x2825, 0x282F, 0x283F,
0x284F, 0x285F, 0x286F, 0x287F, 0x288F, 0x289F, 0x28AF, 0x28BF,
0x28CF, 0x28DF, 0x28EC, 0x28F6, 0x2900, 0x2910, 0x2923, 0x2936,
0x2955, 0x2974, 0x2993, 0x29B2, 0x29D1, 0x29F0, 0x2A0F, 0x2A2E,
0x2A4D, 0x2A6C, 0x2A8B, 0x2AAA, 0x2AC9, 0x2AE8, 0x2B07, 0x2B26,
0x2B42, 0x2B61, 0x2B80, 0x2B9F, 0x2BBE, 0x2BDD, 0x2BFC, 0x2C1B,
0x2C3A, 0x2C4A, 0x2C63, 0x2C7F, 0x2C9E, 0x2CBD, 0x2CDC, 0x2CFB,
0x2D1A, 0x2D3C, 0x2D5B, 0x2D7A, 0x2D99, 0x2DBE, 0x2DDD, 0x2DFC,
0x2E1B, 0x2E2E, 0x2E3B, 0x2E4E, 0x2E61, 0x2E74, 0x2E87, 0x2E9A,
0x2EAD, 0x2EC0, 0x2ED3, 0x2EE6, 0x2EF9, 0x2F0C, 0x2F1F, 0x2F32,
0x2F45, 0x2F58, 0x2F6B, 0x2F7E, 0x2F91, 0x2FA4, 0x2FB7, 0x2FCA,
0x2FDD,
};
extern const unsigned int font_ranges[][2] = {
{ 0x000000, 0x00007E },
{ 0x0000A0, 0x0000FF },
{ 0x000400, 0x0004FF },
{ 0x00E000, 0x00E07F },
{ 0x00FFFD, 0x00FFFD },
{ 0, 0 },
};
#endif

11
data/font.h Normal file
View File

@ -0,0 +1,11 @@
#pragma once
#define FONT_H 12
#ifndef FONTEDITOR
extern const unsigned char font_data[];
extern const unsigned short font_ptrs[];
extern const unsigned int font_ranges[][2];
#else
extern unsigned char *font_data;
extern unsigned short *font_ptrs;
extern unsigned int (*font_ranges)[2];
#endif

23
data/hmap.cpp Normal file

File diff suppressed because one or more lines are too long

24
data/hmap.h Normal file
View File

@ -0,0 +1,24 @@
/**
* Powder Toy - Heatmap Data
*
* Copyright (c) 2010 Simon Robertshaw
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
#pragma once
extern const unsigned char color_data[];
//extern const char plasma_data[];
extern const unsigned char hflm_data[];
extern const unsigned char firw_data[];

4118
data/icon.cpp Normal file

File diff suppressed because it is too large Load Diff

22
data/icon.h Normal file
View File

@ -0,0 +1,22 @@
/**
* Powder Toy - Main source
*
* Copyright (c) 2008 - 2010 Stanislaw Skowronek.
* Copyright (c) 2010 Simon Robertshaw
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
#pragma once
extern const unsigned char app_icon[];

310
data/icondoc.h Normal file
View File

@ -0,0 +1,310 @@
/**
* Powder Toy - Main source
*
* Copyright (c) 2008 - 2010 Stanislaw Skowronek.
* Copyright (c) 2010 Simon Robertshaw
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
#pragma once
const unsigned char icon_doc_32_png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a,
0xf4, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00,
0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0, 0xbd, 0xa7, 0x93,
0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13,
0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xdb, 0x04,
0x06, 0x11, 0x21, 0x0c, 0xfc, 0x0b, 0x2f, 0xdf, 0x00, 0x00, 0x04, 0x65, 0x49, 0x44, 0x41, 0x54,
0x58, 0xc3, 0xb5, 0x96, 0x7f, 0x4c, 0xd4, 0x65, 0x1c, 0xc7, 0x5f, 0xcf, 0x73, 0xdf, 0xe3, 0x7e,
0x90, 0x8b, 0x98, 0xb8, 0x36, 0x12, 0xb8, 0x38, 0x69, 0x03, 0x4c, 0x64, 0xec, 0x6a, 0xa2, 0xd3,
0xb5, 0x74, 0x78, 0x4c, 0x42, 0x33, 0x51, 0xda, 0x5c, 0xe3, 0x97, 0x72, 0x79, 0xcc, 0x5c, 0xfd,
0x53, 0xcb, 0x50, 0x69, 0x93, 0xda, 0x9a, 0x3a, 0x0d, 0x0d, 0x99, 0xf3, 0x9f, 0x3b, 0x98, 0x89,
0x72, 0x14, 0x64, 0xb2, 0x62, 0x2b, 0x56, 0xad, 0x56, 0x20, 0xbf, 0x06, 0x3a, 0xe1, 0x1c, 0x8b,
0xed, 0x86, 0x89, 0x77, 0x96, 0x7f, 0x30, 0xf6, 0xed, 0x0f, 0xb9, 0x1b, 0xe6, 0x1d, 0x7c, 0x39,
0xe8, 0xb3, 0x3d, 0x7b, 0xbe, 0xcf, 0xb3, 0xef, 0xf3, 0x7c, 0x5f, 0xcf, 0xfb, 0xf3, 0xe3, 0xf9,
0x0a, 0x9e, 0xb4, 0xd5, 0x40, 0x0a, 0x0b, 0x37, 0x3f, 0x30, 0x0a, 0x78, 0x17, 0xb2, 0x48, 0x09,
0x33, 0x97, 0x52, 0x52, 0x52, 0xe2, 0x11, 0x42, 0xa0, 0xaa, 0x2a, 0x42, 0x08, 0x80, 0xd0, 0xb3,
0xaa, 0xaa, 0xa1, 0x17, 0x55, 0x55, 0x45, 0x55, 0x55, 0xcc, 0x66, 0x33, 0x05, 0x05, 0x05, 0x3e,
0xa7, 0xd3, 0x59, 0x73, 0xf3, 0xe6, 0xcd, 0xd6, 0x19, 0x90, 0xa8, 0x01, 0xa4, 0x10, 0x82, 0xce,
0xce, 0x4e, 0x4d, 0x1b, 0x5c, 0xe8, 0xed, 0x61, 0x6f, 0x7a, 0x26, 0x89, 0x89, 0x89, 0x2b, 0xda,
0xdb, 0xdb, 0x3f, 0xcd, 0xcb, 0xcb, 0xd3, 0xdf, 0xba, 0x75, 0xab, 0x59, 0x2b, 0x84, 0x0c, 0x33,
0xa7, 0x9f, 0x7d, 0xca, 0xf9, 0xec, 0xfc, 0xa9, 0xd3, 0x08, 0x21, 0x68, 0x68, 0x68, 0xc0, 0xe7,
0xf3, 0x19, 0x3a, 0x3a, 0x3a, 0x6a, 0xad, 0x56, 0xeb, 0x0e, 0xad, 0x6e, 0x94, 0x91, 0x14, 0xd0,
0xd2, 0x00, 0xba, 0xea, 0xeb, 0x11, 0x42, 0x30, 0x35, 0x35, 0x45, 0x57, 0x57, 0x17, 0x89, 0x89,
0x89, 0x4a, 0x5b, 0x5b, 0x5b, 0xad, 0xc5, 0x62, 0x79, 0x5d, 0x0b, 0x84, 0x24, 0x4a, 0xeb, 0x77,
0x55, 0x86, 0x20, 0x84, 0x10, 0x48, 0x29, 0x19, 0x1e, 0x1e, 0x46, 0x4a, 0x49, 0x52, 0x52, 0x92,
0xd2, 0xda, 0xda, 0x7a, 0x5c, 0x0b, 0x44, 0xd4, 0x00, 0x19, 0xc5, 0x75, 0xa1, 0x8f, 0x03, 0x48,
0x29, 0x19, 0x1f, 0x1f, 0x0f, 0xc1, 0x58, 0x2c, 0x16, 0xa5, 0xb9, 0xb9, 0x79, 0x5e, 0x25, 0xa2,
0x06, 0x98, 0x6d, 0x41, 0x97, 0x04, 0x01, 0x14, 0x45, 0x41, 0x51, 0x14, 0x52, 0x53, 0x53, 0x75,
0x4d, 0x4d, 0x4d, 0xb5, 0xc9, 0xc9, 0xc9, 0x11, 0x21, 0x16, 0x05, 0x30, 0xe0, 0x7e, 0xfb, 0x31,
0x08, 0x9f, 0xcf, 0x47, 0x42, 0x42, 0x02, 0xf1, 0xf1, 0xf1, 0x58, 0xad, 0x56, 0xb2, 0xb3, 0xb3,
0x71, 0x3a, 0x9d, 0x3a, 0x87, 0xc3, 0x71, 0x24, 0x21, 0x21, 0xe1, 0x9d, 0x70, 0x10, 0x32, 0xd2,
0x89, 0xe6, 0x8d, 0x01, 0xb7, 0x83, 0xf4, 0x3d, 0x67, 0x1e, 0x5b, 0xa3, 0xd7, 0xeb, 0x31, 0x9b,
0xcd, 0xc4, 0xc6, 0xc6, 0x32, 0x3d, 0x3d, 0x4d, 0x20, 0x10, 0x60, 0x64, 0x64, 0x84, 0x93, 0x27,
0x4f, 0xc6, 0x66, 0x66, 0x66, 0x96, 0x6a, 0x06, 0x98, 0x2d, 0x6b, 0xb8, 0x76, 0x65, 0x70, 0x90,
0xcc, 0xe2, 0xba, 0xd0, 0x78, 0xc0, 0xed, 0x08, 0xf9, 0x3e, 0x26, 0x26, 0x06, 0xa3, 0xd1, 0x88,
0xc1, 0x60, 0xc0, 0x64, 0x32, 0x61, 0x30, 0x18, 0x1e, 0x15, 0x1c, 0x45, 0x89, 0x05, 0xe2, 0x16,
0xed, 0x82, 0x6a, 0xcf, 0x55, 0x76, 0xa4, 0xa7, 0x87, 0xc6, 0x6f, 0x1c, 0x3b, 0xfa, 0x44, 0x40,
0x06, 0x61, 0xa4, 0x94, 0xe8, 0x74, 0x3a, 0xf4, 0x7a, 0x3d, 0x26, 0x93, 0x09, 0x40, 0xa7, 0xa5,
0x12, 0x22, 0x65, 0x64, 0xae, 0xea, 0x82, 0xc2, 0xc7, 0xc6, 0x97, 0x3e, 0x3c, 0xfc, 0x84, 0x72,
0xb3, 0x4b, 0xb8, 0x94, 0x12, 0x55, 0x55, 0x31, 0x1a, 0x8d, 0x61, 0x0f, 0xac, 0xf0, 0x3f, 0xd8,
0x7f, 0x21, 0x66, 0x5c, 0x00, 0x20, 0x16, 0x1d, 0x03, 0x59, 0x7b, 0x76, 0xa3, 0xb5, 0x52, 0x06,
0x9b, 0x94, 0x32, 0x08, 0xc0, 0xa2, 0xb3, 0xa0, 0xa7, 0xb1, 0x29, 0xf4, 0x5c, 0x7a, 0xea, 0x04,
0xfd, 0x2e, 0x07, 0x73, 0xed, 0x11, 0xec, 0x75, 0x3a, 0x9d, 0xe6, 0xdb, 0x10, 0xad, 0x97, 0x51,
0x43, 0xd5, 0x41, 0x1a, 0xe6, 0x71, 0x45, 0xd0, 0x22, 0x01, 0x44, 0x5d, 0x07, 0xa2, 0xa9, 0x94,
0x0b, 0xaa, 0x84, 0x5a, 0xfd, 0xbb, 0xab, 0xe6, 0x98, 0xa6, 0x5b, 0x33, 0x52, 0x66, 0x45, 0xad,
0x40, 0xb5, 0xe7, 0x2a, 0xa5, 0xa7, 0x4e, 0x60, 0x2f, 0x2c, 0x5c, 0x7a, 0x05, 0xe6, 0x02, 0x08,
0x06, 0xdd, 0xd8, 0xa8, 0x97, 0x86, 0xaa, 0x83, 0xd8, 0x7a, 0xcf, 0x92, 0xb5, 0xbb, 0x48, 0x13,
0x84, 0x66, 0x80, 0xb9, 0x82, 0x70, 0x5f, 0xe7, 0x14, 0x17, 0x7a, 0x7b, 0xe8, 0xfc, 0xe6, 0x1a,
0xab, 0xf2, 0xed, 0x68, 0x0d, 0x97, 0x48, 0x7b, 0x2a, 0x0b, 0x91, 0xcc, 0xba, 0x75, 0x2b, 0x5d,
0xf5, 0xe7, 0xe9, 0xaa, 0x3f, 0xcf, 0x85, 0x1b, 0x3d, 0x20, 0xa0, 0xb8, 0xe6, 0x63, 0xfe, 0x0e,
0x04, 0xd8, 0x75, 0xec, 0x28, 0x97, 0x0e, 0x7f, 0xb4, 0x34, 0x0a, 0x44, 0x32, 0xcf, 0x5e, 0x0b,
0xd5, 0x9e, 0x16, 0x06, 0xdc, 0x0e, 0x6c, 0x7d, 0xe7, 0x98, 0xbc, 0x37, 0x49, 0x4e, 0x6e, 0x2e,
0x4f, 0x2d, 0x5b, 0x86, 0x7d, 0xfb, 0x76, 0xaa, 0x3d, 0x57, 0xb1, 0xda, 0xed, 0x54, 0x7b, 0x5a,
0x34, 0xef, 0xa9, 0x09, 0x20, 0xe8, 0xe3, 0x8a, 0xef, 0xa7, 0x00, 0x95, 0xa1, 0x35, 0x07, 0xb8,
0xfe, 0x5c, 0x11, 0x5b, 0xc6, 0x9a, 0x58, 0x99, 0x92, 0xc2, 0x2b, 0xf9, 0xf9, 0xd8, 0x7a, 0xcf,
0xd2, 0xe2, 0x72, 0x03, 0x2a, 0x63, 0xa3, 0xa3, 0xac, 0xaf, 0x28, 0xd7, 0xa4, 0x80, 0xa2, 0x45,
0xae, 0xee, 0xc6, 0x26, 0xd6, 0xee, 0x2e, 0xa2, 0xcc, 0xe9, 0xc4, 0x7b, 0xfb, 0x36, 0x69, 0xdd,
0xa7, 0x39, 0xf7, 0xbb, 0x09, 0xef, 0x6a, 0x1b, 0x65, 0x0f, 0xae, 0x71, 0xc4, 0xfb, 0x2c, 0x5f,
0xae, 0xd9, 0x42, 0x61, 0x31, 0xec, 0x7c, 0xf0, 0x2d, 0x30, 0xc4, 0x91, 0x95, 0x2b, 0x97, 0x46,
0x81, 0x0d, 0xfb, 0x2a, 0x38, 0x74, 0xf1, 0x22, 0x55, 0x1f, 0xbc, 0x8f, 0xad, 0xef, 0x2c, 0x77,
0xbc, 0x5e, 0xf6, 0x77, 0x4e, 0xb1, 0xaf, 0xa4, 0x14, 0x21, 0x04, 0xc3, 0x59, 0x07, 0x58, 0xb7,
0x69, 0x23, 0x57, 0x5c, 0x6e, 0x9e, 0x8e, 0x7b, 0x06, 0x21, 0x1e, 0x05, 0xea, 0x56, 0x0d, 0xe9,
0x39, 0x67, 0x1a, 0x0a, 0x21, 0xd8, 0x50, 0x51, 0x4e, 0xc0, 0xef, 0xa7, 0x2c, 0xe6, 0x17, 0x4a,
0x5e, 0xcc, 0x22, 0xa3, 0xb8, 0x8e, 0xa1, 0xbe, 0x3e, 0x02, 0x81, 0x00, 0x3f, 0xfc, 0xf6, 0x2b,
0xdf, 0xb5, 0xb5, 0xe1, 0xbd, 0x3b, 0x41, 0x5f, 0x77, 0x0f, 0x39, 0xb9, 0xeb, 0x38, 0x73, 0xbc,
0x96, 0x8c, 0xe2, 0x3a, 0x6c, 0xeb, 0xd7, 0x73, 0x67, 0x64, 0x84, 0x55, 0xf9, 0x76, 0xec, 0xef,
0xbd, 0x3b, 0x67, 0x5a, 0x47, 0x54, 0x20, 0xb7, 0xbc, 0x8c, 0x07, 0x7e, 0x3f, 0x69, 0x19, 0x19,
0xbc, 0xe9, 0xf9, 0x8b, 0x7e, 0x57, 0x25, 0xcd, 0x03, 0x03, 0x6c, 0xde, 0xb6, 0x0d, 0x57, 0x41,
0x3c, 0x83, 0x37, 0x7a, 0x71, 0xbf, 0xb6, 0x9c, 0x2d, 0x63, 0x8d, 0xe4, 0xbf, 0xba, 0x99, 0x43,
0xcb, 0x87, 0x10, 0x42, 0xd0, 0xef, 0xaa, 0xc4, 0x7f, 0x7f, 0x92, 0xfb, 0x93, 0x93, 0x6c, 0xcc,
0xcb, 0x23, 0xe0, 0xf7, 0xcf, 0x59, 0x09, 0x23, 0xfe, 0x0f, 0x7c, 0x51, 0xf8, 0x02, 0x8d, 0xe3,
0x71, 0xdc, 0x9b, 0xb8, 0xcb, 0x8a, 0xac, 0x2c, 0xba, 0x9f, 0xdf, 0xc4, 0x1f, 0x1d, 0xd7, 0x11,
0x42, 0xf0, 0xd9, 0xc4, 0x0a, 0xf6, 0xbf, 0xb5, 0x93, 0x31, 0x9d, 0x0e, 0xef, 0xf8, 0x9f, 0x74,
0x7b, 0x5a, 0x90, 0xf9, 0x0e, 0x3e, 0xa9, 0x85, 0xcf, 0xbf, 0xfe, 0x0a, 0x23, 0x0f, 0xc9, 0xb1,
0xbd, 0xc4, 0xda, 0xbb, 0x3f, 0xa2, 0xa6, 0xa6, 0xd1, 0x5d, 0xf2, 0x13, 0x6d, 0x97, 0x2f, 0x87,
0x4f, 0xcf, 0x30, 0x73, 0x2f, 0x03, 0x99, 0x80, 0x69, 0x89, 0xff, 0x53, 0x1e, 0x02, 0x7d, 0xc0,
0xcf, 0xf3, 0x01, 0x98, 0x81, 0x65, 0x33, 0xfd, 0x52, 0xda, 0x3f, 0x40, 0x60, 0xa6, 0x0f, 0xd9,
0xbf, 0x2f, 0x89, 0x69, 0x46, 0x25, 0x68, 0x1c, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
0x44, 0xae, 0x42, 0x60, 0x82
};
const unsigned char icon_doc_16_png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff,
0x61, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00,
0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0, 0xbd, 0xa7, 0x93,
0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13,
0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xdb, 0x04,
0x06, 0x11, 0x21, 0x22, 0x20, 0xdd, 0x22, 0x10, 0x00, 0x00, 0x01, 0x95, 0x49, 0x44, 0x41, 0x54,
0x38, 0xcb, 0x95, 0x93, 0x3d, 0x4b, 0x82, 0x51, 0x14, 0xc7, 0x7f, 0xc7, 0x24, 0x4d, 0x7c, 0x96,
0x96, 0x50, 0x48, 0x14, 0x8a, 0x86, 0x16, 0x23, 0x28, 0xea, 0x23, 0xd8, 0xd0, 0xcb, 0x20, 0x86,
0x6b, 0x11, 0xb4, 0xd8, 0x10, 0x6d, 0x81, 0xbd, 0x7c, 0x02, 0x5b, 0xa2, 0x10, 0x47, 0x6b, 0x2a,
0xa7, 0x1c, 0x0b, 0x24, 0xb3, 0xa9, 0xf7, 0xa1, 0x25, 0xb2, 0x20, 0xe4, 0x59, 0xad, 0xd0, 0xb2,
0xdb, 0x50, 0x8f, 0x3c, 0xbe, 0x3c, 0x50, 0x07, 0x2e, 0xdc, 0x73, 0xef, 0x39, 0xff, 0xf3, 0x3b,
0x87, 0x7b, 0x45, 0x29, 0x05, 0x80, 0x88, 0x0c, 0x02, 0x1a, 0x16, 0xa6, 0x94, 0x3a, 0x6b, 0x77,
0x6e, 0x37, 0xed, 0xb5, 0x68, 0x34, 0x9a, 0x37, 0x1c, 0x8f, 0xcf, 0xc7, 0x4b, 0xb1, 0x08, 0x40,
0xa9, 0x54, 0x42, 0x44, 0xc6, 0xda, 0x89, 0x98, 0x05, 0x04, 0xa0, 0x50, 0x28, 0x10, 0xcf, 0x1c,
0x12, 0x9f, 0x9c, 0xaa, 0x5f, 0xf4, 0x0e, 0x05, 0xd1, 0x75, 0x3d, 0x2f, 0x22, 0xe3, 0x4a, 0xa9,
0xbc, 0x59, 0xc0, 0x66, 0x76, 0x44, 0x04, 0xa0, 0x21, 0x19, 0xe0, 0xfe, 0x34, 0x8f, 0xcb, 0xe5,
0x42, 0xd7, 0xf5, 0x53, 0x11, 0x19, 0xb3, 0x12, 0x10, 0x43, 0xa4, 0x79, 0x01, 0x38, 0x1c, 0x0e,
0xb3, 0xc8, 0x78, 0xdb, 0x16, 0x8c, 0xe0, 0xe0, 0x6c, 0x84, 0x8b, 0xf4, 0x5e, 0x03, 0x99, 0xd7,
0xeb, 0x05, 0x20, 0x10, 0x08, 0xd4, 0x8b, 0x35, 0x13, 0xd8, 0x8c, 0x8a, 0x97, 0x7b, 0xfb, 0xf5,
0xea, 0xf3, 0x5b, 0x09, 0x1e, 0x0e, 0x96, 0xd1, 0x34, 0x0d, 0x4d, 0xd3, 0xf0, 0xfb, 0xfd, 0x0d,
0x79, 0x2d, 0x04, 0x06, 0x85, 0x61, 0xc9, 0xd8, 0x12, 0x49, 0xc0, 0x6e, 0xff, 0x09, 0x75, 0x3a,
0x9d, 0x96, 0x04, 0xd2, 0x9c, 0xdc, 0xce, 0x7e, 0x63, 0xe4, 0x5f, 0x43, 0x0c, 0x6f, 0xac, 0xd3,
0x44, 0xf7, 0x37, 0x82, 0x78, 0x26, 0xc3, 0x5c, 0x22, 0x41, 0x68, 0x7a, 0xfa, 0x4f, 0x04, 0xf5,
0x21, 0xde, 0xa5, 0x17, 0x11, 0x11, 0x9e, 0x8b, 0x8f, 0x24, 0x63, 0x31, 0x46, 0x6f, 0xb6, 0x19,
0x9a, 0x8d, 0x98, 0x29, 0x6c, 0x96, 0x2d, 0x00, 0x2c, 0x1c, 0x7f, 0x92, 0xba, 0xbe, 0xe2, 0x24,
0x9b, 0xa5, 0x7f, 0x22, 0x64, 0xbe, 0x6a, 0x89, 0x6d, 0x79, 0xca, 0x7d, 0xa1, 0x10, 0xb9, 0x9d,
0x5d, 0x72, 0x3b, 0xbb, 0xa4, 0xae, 0xaf, 0x00, 0x88, 0x6e, 0x6e, 0xf2, 0x5a, 0x2e, 0x13, 0x5e,
0x5f, 0xe3, 0xe9, 0x28, 0x6b, 0x29, 0x40, 0xad, 0x56, 0x63, 0xb8, 0xf3, 0x8b, 0x81, 0x99, 0x19,
0xdc, 0x5f, 0x6f, 0x64, 0x57, 0x57, 0x78, 0xb3, 0xbb, 0xe9, 0xa9, 0x54, 0xa8, 0x54, 0x3f, 0xa8,
0xde, 0xde, 0xd1, 0xed, 0xf1, 0x34, 0xa2, 0x98, 0xbe, 0xf3, 0x08, 0xe0, 0x01, 0xba, 0x00, 0x37,
0xe0, 0x00, 0x3a, 0x0c, 0x6d, 0xa0, 0x02, 0x94, 0x81, 0x77, 0xe0, 0x45, 0x29, 0x75, 0x0e, 0xf0,
0x0d, 0xff, 0x1c, 0x7a, 0x37, 0x5c, 0xfd, 0x46, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
0x44, 0xae, 0x42, 0x60, 0x82
};
const unsigned char icon_desktop_48_png[] = {
0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xF9,
0x87, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00,
0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC, 0x61, 0x05, 0x00, 0x00,
0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0E, 0xC3, 0x00, 0x00, 0x0E, 0xC3, 0x01, 0xC7,
0x6F, 0xA8, 0x64, 0x00, 0x00, 0x0A, 0x20, 0x49, 0x44, 0x41, 0x54, 0x68, 0x43, 0xED, 0x99, 0x7B,
0x8C, 0x54, 0xE5, 0x19, 0x87, 0xF7, 0x32, 0xB7, 0x9D, 0x85, 0x55, 0xA0, 0x08, 0x08, 0x08, 0x42,
0x65, 0x97, 0x4B, 0x54, 0x84, 0x5D, 0x6A, 0xB9, 0x2C, 0x48, 0xD1, 0x22, 0x82, 0x84, 0x22, 0x85,
0xCA, 0xC5, 0xD4, 0x96, 0x58, 0xA3, 0x98, 0x52, 0xB0, 0x50, 0xA4, 0x88, 0x97, 0x16, 0x42, 0xAC,
0xD2, 0x48, 0x6B, 0x49, 0x1A, 0xA9, 0xED, 0xC2, 0x2E, 0x36, 0xB5, 0xB1, 0x7F, 0x58, 0x42, 0x45,
0x88, 0x88, 0xB4, 0xB5, 0x2D, 0x88, 0xA1, 0x05, 0xE4, 0xD2, 0x05, 0x16, 0x90, 0xCB, 0xEE, 0xCC,
0x99, 0x99, 0x33, 0x73, 0xE6, 0xF2, 0xF6, 0x79, 0xCF, 0x39, 0x33, 0x3B, 0x80, 0x95, 0x59, 0x62,
0x22, 0x24, 0x98, 0x3C, 0xF9, 0x0E, 0x24, 0xB2, 0xCF, 0xEF, 0x3D, 0xBF, 0xEF, 0x3B, 0x67, 0x76,
0x8A, 0x8A, 0xAE, 0xFD, 0x77, 0x6D, 0x02, 0xD7, 0x26, 0x70, 0x75, 0x4F, 0xE0, 0xE9, 0x67, 0x7F,
0xFA, 0xD8, 0xF2, 0xE7, 0x56, 0xC8, 0xD5, 0xC0, 0xE2, 0xA7, 0x96, 0xCD, 0x67, 0xDA, 0x3E, 0x28,
0xCE, 0x4D, 0x5D, 0xC5, 0xF7, 0xEC, 0x3B, 0xF2, 0x85, 0xF1, 0xC8, 0xE2, 0xD5, 0xA2, 0x64, 0x1D,
0x3E, 0xEB, 0xCF, 0xEA, 0x8A, 0x78, 0x17, 0x37, 0x84, 0x93, 0xE1, 0x8B, 0x0E, 0xD0, 0x96, 0xE1,
0xB9, 0x01, 0xFA, 0xA1, 0xDD, 0xEE, 0xA2, 0x3B, 0x30, 0x74, 0xC8, 0x10, 0x19, 0x0D, 0x73, 0x61,
0x55, 0x4D, 0xB5, 0xAC, 0x1B, 0x5B, 0x2D, 0x75, 0xC3, 0x6B, 0xE4, 0xB5, 0x11, 0xAC, 0x77, 0x55,
0xCB, 0x86, 0x19, 0xC3, 0xA4, 0xFE, 0x51, 0x98, 0x3F, 0x4C, 0x1A, 0x96, 0xDE, 0x29, 0x0D, 0x2B,
0x46, 0x4A, 0xC3, 0xCF, 0xC6, 0x48, 0xC3, 0x8B, 0x63, 0x59, 0xBF, 0x26, 0x0D, 0x2F, 0x29, 0xFC,
0x79, 0x75, 0x2D, 0xEB, 0x28, 0x18, 0x01, 0x5F, 0x91, 0x86, 0x17, 0xF8, 0x7F, 0x16, 0xD4, 0x48,
0xFD, 0xDC, 0x6A, 0xA9, 0x9F, 0x09, 0x53, 0xF8, 0xB7, 0xEE, 0x63, 0x1D, 0xCF, 0x7A, 0x0F, 0xEB,
0xDD, 0x35, 0xB2, 0x7E, 0x34, 0xF0, 0x73, 0x36, 0xC0, 0xFA, 0x51, 0x35, 0x52, 0x37, 0xB2, 0x46,
0x1E, 0x9A, 0x33, 0xE7, 0x3C, 0x34, 0xA8, 0x1B, 0x60, 0x00, 0xF2, 0x15, 0x17, 0x05, 0xE8, 0x5F,
0x5C, 0x24, 0x3F, 0x2C, 0x2A, 0x91, 0x4D, 0xC5, 0xA5, 0x72, 0xCC, 0xEF, 0x93, 0x64, 0x77, 0xBF,
0x64, 0x6A, 0xCB, 0x24, 0xF3, 0x44, 0x50, 0x32, 0x7F, 0x08, 0x4A, 0xFA, 0x74, 0x7B, 0xC9, 0x64,
0x3A, 0x4B, 0x3A, 0x5D, 0x09, 0x23, 0xE0, 0x5E, 0x49, 0xA5, 0xEE, 0x96, 0x74, 0x6A, 0x92, 0xA4,
0xD2, 0xB3, 0xB8, 0xFE, 0x96, 0x24, 0x53, 0x13, 0x25, 0x95, 0x1C, 0x02, 0x83, 0x25, 0x99, 0xEC,
0x23, 0x49, 0xAB, 0x1C, 0xFC, 0x62, 0x1D, 0x0C, 0x88, 0xF5, 0x06, 0xAC, 0x0D, 0x48, 0x62, 0xBE,
0x5F, 0xE2, 0x8F, 0xF8, 0x25, 0xF1, 0x70, 0x40, 0xE2, 0xB3, 0xB9, 0x1E, 0xEF, 0x17, 0xB3, 0x06,
0x6E, 0xF5, 0x89, 0x59, 0xCD, 0x3A, 0x8C, 0x75, 0xA8, 0x5F, 0x06, 0x0C, 0x18, 0x60, 0x53, 0x59,
0x59, 0xA5, 0xB5, 0xB1, 0x2B, 0xF6, 0x99, 0x01, 0x5E, 0xF6, 0x7A, 0xE4, 0xB0, 0xD7, 0x2B, 0xE9,
0x00, 0xE2, 0x45, 0x3E, 0xC9, 0x54, 0xC0, 0x0A, 0x02, 0xB4, 0x54, 0xD8, 0xE2, 0x99, 0x4C, 0x57,
0xA4, 0x3B, 0x41, 0x0F, 0x18, 0x80, 0xF8, 0x40, 0xD6, 0xEE, 0xC8, 0xF7, 0x40, 0xBE, 0x1F, 0xD2,
0x7D, 0xA1, 0x07, 0xE2, 0xED, 0x20, 0xE8, 0x88, 0x27, 0x7D, 0x62, 0x35, 0xFA, 0x24, 0xB1, 0x11,
0x7E, 0x0C, 0x8F, 0xF9, 0x24, 0xFE, 0x03, 0xE4, 0x7F, 0x04, 0x4B, 0x91, 0xE7, 0x3A, 0x3E, 0x1D,
0xE9, 0x51, 0x48, 0xDF, 0xEE, 0x93, 0xD8, 0x70, 0x18, 0x0D, 0xB5, 0x3E, 0x19, 0x34, 0x68, 0x90,
0x44, 0xA3, 0x51, 0x88, 0x15, 0x16, 0x20, 0xD9, 0x35, 0x20, 0xE2, 0xF3, 0x8B, 0xA8, 0x3C, 0x48,
0x80, 0xB5, 0x21, 0x80, 0x78, 0x6F, 0xB8, 0x13, 0xD9, 0x5B, 0x20, 0x00, 0x1E, 0xE4, 0x09, 0x9A,
0xF6, 0xD9, 0xA4, 0xB8, 0x4E, 0xA5, 0x3C, 0x4C, 0x1F, 0x92, 0x5E, 0x1B, 0x4B, 0xD7, 0x04, 0xF2,
0x7B, 0xE0, 0xE7, 0x88, 0xCF, 0x04, 0xC4, 0x6C, 0xA6, 0x22, 0x3D, 0x93, 0xE9, 0x7F, 0xAF, 0x4C,
0xE2, 0x0F, 0x22, 0x3F, 0x16, 0x7A, 0x13, 0xA0, 0x1B, 0xF4, 0x41, 0xBE, 0x07, 0x74, 0xF4, 0x49,
0xFF, 0xFE, 0xFD, 0xDD, 0x00, 0xD1, 0xC2, 0x02, 0x48, 0x89, 0x17, 0x79, 0xAF, 0x33, 0x7D, 0xE5,
0x66, 0xD8, 0xC5, 0x1D, 0xC8, 0x0C, 0x96, 0x4C, 0xFA, 0x1E, 0xB8, 0xC9, 0x95, 0x0E, 0x30, 0x75,
0x0D, 0x02, 0x29, 0xAE, 0x53, 0x65, 0xC8, 0x07, 0x10, 0x57, 0xFC, 0x88, 0x33, 0xF9, 0x33, 0x88,
0xEF, 0x66, 0x7D, 0x91, 0x75, 0x0A, 0x54, 0x7A, 0x25, 0xD1, 0x1D, 0x98, 0x72, 0x7C, 0x2C, 0xCC,
0x20, 0xC0, 0x82, 0x32, 0x31, 0x1F, 0x08, 0x50, 0x17, 0x84, 0xBF, 0xEC, 0x97, 0x18, 0x77, 0x3C,
0x56, 0x0E, 0x5E, 0x9F, 0x44, 0xF9, 0xF9, 0x55, 0x95, 0x95, 0x52, 0x55, 0x55, 0x25, 0xFD, 0xFA,
0xF5, 0x2B, 0x2C, 0x80, 0x3D, 0x75, 0xA5, 0x98, 0x0A, 0x95, 0xC1, 0xE3, 0x4C, 0x39, 0xF1, 0x25,
0x49, 0x67, 0xEE, 0x42, 0x76, 0x32, 0x6B, 0x5F, 0x56, 0xA6, 0x9D, 0xF6, 0x23, 0xAD, 0x21, 0xCA,
0xA8, 0x0C, 0xA4, 0xA8, 0x0B, 0xB5, 0x49, 0xA9, 0xBC, 0x85, 0xEC, 0x49, 0xF8, 0x2B, 0x93, 0x7E,
0x1D, 0x9E, 0x80, 0x6A, 0xE8, 0x84, 0x74, 0x77, 0x56, 0xBA, 0x9D, 0xA0, 0x1E, 0xF1, 0xB9, 0x4C,
0x7D, 0x15, 0xF2, 0xCF, 0x05, 0xC5, 0x9C, 0xC5, 0xF5, 0x38, 0xA6, 0xCF, 0xC0, 0xA2, 0x1D, 0x40,
0x03, 0x94, 0xF8, 0xA4, 0x63, 0xC7, 0x8E, 0x52, 0x51, 0x51, 0x21, 0xC1, 0x60, 0xB0, 0xC0, 0x00,
0x74, 0x5F, 0x7A, 0x51, 0x99, 0xAF, 0x22, 0xFF, 0x14, 0x34, 0xFA, 0x11, 0xD6, 0xEA, 0x2C, 0x82,
0x65, 0x30, 0x1E, 0xE9, 0x8E, 0xAC, 0x04, 0x48, 0x97, 0x23, 0x8E, 0x74, 0x4A, 0xD7, 0x0A, 0xBB,
0xF3, 0x16, 0x01, 0xAC, 0xB3, 0xC8, 0xFF, 0x07, 0xDE, 0x85, 0x7A, 0x58, 0x88, 0xF4, 0x18, 0xA8,
0x82, 0x1A, 0xC4, 0x11, 0x8D, 0x4F, 0x47, 0xF6, 0x65, 0xE4, 0x0F, 0x96, 0x8B, 0x79, 0x84, 0x00,
0xEF, 0x04, 0x24, 0xF6, 0x3B, 0x58, 0x02, 0x33, 0xB8, 0x13, 0x83, 0x09, 0x40, 0x95, 0x74, 0xE3,
0xE6, 0x73, 0xC9, 0x4D, 0x9C, 0x99, 0x8B, 0x7C, 0x03, 0x95, 0xD9, 0xCD, 0x9A, 0xA0, 0x1E, 0x19,
0x36, 0x6A, 0x7A, 0x0D, 0xEB, 0x47, 0xD4, 0x67, 0x0F, 0x75, 0x79, 0x0D, 0x66, 0x20, 0x5C, 0x09,
0x9D, 0x99, 0x78, 0x7B, 0x47, 0x3E, 0xD5, 0x81, 0x00, 0x65, 0x62, 0xC5, 0x38, 0x65, 0xF6, 0x10,
0xE2, 0x5F, 0x4C, 0xF9, 0x6F, 0x08, 0x6F, 0x65, 0x7D, 0x85, 0x75, 0x1E, 0xD2, 0x73, 0x74, 0xEA,
0xF0, 0x7D, 0xF8, 0x05, 0x1C, 0x20, 0x80, 0x59, 0x26, 0x31, 0xB3, 0x02, 0xAE, 0x93, 0x58, 0x2C,
0x28, 0xD1, 0x73, 0x04, 0xD8, 0x5F, 0x26, 0xD1, 0x3A, 0xBF, 0x44, 0x1F, 0x77, 0x02, 0x44, 0xA2,
0x11, 0x89, 0x44, 0x22, 0x05, 0xDE, 0x81, 0x26, 0xA6, 0x2E, 0x7A, 0xE2, 0xF4, 0x42, 0x78, 0x34,
0xE2, 0x6B, 0x09, 0xD0, 0x02, 0x69, 0x17, 0x13, 0xE1, 0xFD, 0xF0, 0x12, 0xD2, 0x13, 0x08, 0x50,
0x89, 0x78, 0x67, 0x5B, 0x5E, 0xFB, 0x6F, 0x9D, 0x41, 0x7E, 0xAB, 0xD6, 0x87, 0xF5, 0x10, 0xF2,
0xC7, 0x60, 0x1B, 0xAC, 0x47, 0xB8, 0x0E, 0x7E, 0x0F, 0xEF, 0x52, 0x97, 0x26, 0xFA, 0x8F, 0xBC,
0x69, 0xD2, 0x77, 0xF3, 0x46, 0xB8, 0x9D, 0x00, 0x37, 0x49, 0x34, 0xD6, 0x9E, 0x95, 0xE9, 0x47,
0x7D, 0x12, 0xD9, 0x17, 0x70, 0x02, 0x20, 0x5F, 0x78, 0x80, 0xCC, 0x75, 0xC8, 0x8F, 0x84, 0x65,
0xB0, 0x05, 0x69, 0x33, 0x4F, 0x3E, 0x45, 0x6D, 0xD2, 0xC8, 0xB3, 0xA6, 0x4C, 0x02, 0xBC, 0x8D,
0xF4, 0x5C, 0xB8, 0x0D, 0xAE, 0x77, 0x8E, 0xCB, 0x83, 0x80, 0xA4, 0xF5, 0x3E, 0xD2, 0x84, 0x49,
0x98, 0x88, 0x32, 0x94, 0xF8, 0x61, 0x5D, 0xE1, 0x2C, 0xD7, 0x26, 0x01, 0x6C, 0xBC, 0xF6, 0xF4,
0xCD, 0xD8, 0x18, 0xA4, 0x9F, 0x46, 0x7E, 0x25, 0xE2, 0xDF, 0x86, 0x4A, 0x27, 0x40, 0xD4, 0xDB,
0xB6, 0x0A, 0xBD, 0xBD, 0x63, 0x37, 0xD3, 0x7F, 0x00, 0xF1, 0x37, 0x98, 0x7C, 0x18, 0xD2, 0xDC,
0x85, 0xEC, 0xE4, 0x75, 0x55, 0xF1, 0x6C, 0x00, 0xBD, 0x4E, 0x21, 0xBE, 0x03, 0x9E, 0x44, 0x7E,
0x0C, 0x9B, 0xB7, 0xB3, 0x58, 0x1F, 0x78, 0xEC, 0x69, 0x27, 0xF6, 0xBA, 0xF2, 0xD4, 0x30, 0x1E,
0x07, 0x4E, 0x25, 0x93, 0xD5, 0x86, 0x50, 0x4E, 0x75, 0x7A, 0xC2, 0x37, 0x90, 0xFF, 0x2D, 0xC2,
0x27, 0xC0, 0x80, 0x46, 0xF8, 0x25, 0xF2, 0xB5, 0x4C, 0xFD, 0xFA, 0x8B, 0x02, 0xA8, 0xE3, 0xFF,
0x7D, 0x90, 0xD9, 0x01, 0x32, 0x3B, 0x01, 0xF1, 0x4C, 0xA6, 0x55, 0xDE, 0x96, 0x26, 0x80, 0x3D,
0x79, 0xA4, 0x75, 0x4D, 0x2A, 0x49, 0xE4, 0x95, 0xF7, 0xC4, 0xB2, 0x96, 0xB1, 0xD6, 0x8A, 0xF5,
0x61, 0xB9, 0x58, 0x7F, 0x21, 0x40, 0x73, 0x50, 0x12, 0x89, 0x72, 0xC4, 0x83, 0x04, 0xE0, 0xAC,
0x8F, 0xB3, 0xEA, 0xB4, 0xE3, 0xDD, 0x90, 0x1F, 0xCC, 0xD4, 0xBF, 0x89, 0xFC, 0x6A, 0xE4, 0x3F,
0x00, 0x43, 0x62, 0xF6, 0xC3, 0x2A, 0xCB, 0x39, 0x02, 0xD4, 0x13, 0xE0, 0xDE, 0xB6, 0x07, 0x48,
0x23, 0xAE, 0x64, 0x27, 0x6F, 0x57, 0xC6, 0xAE, 0xCD, 0x85, 0x93, 0xD7, 0xE9, 0x23, 0x6F, 0x59,
0x70, 0x9C, 0x00, 0x1B, 0x24, 0x61, 0xCD, 0x96, 0x44, 0xB8, 0xAB, 0x24, 0x5A, 0x54, 0xBE, 0x8B,
0x24, 0xE2, 0x37, 0x13, 0xA0, 0x2F, 0xF2, 0x95, 0x88, 0x23, 0x6D, 0x8E, 0x23, 0xC4, 0x3C, 0xE4,
0x5F, 0xE7, 0xFA, 0x30, 0xE2, 0x31, 0x6A, 0x13, 0x43, 0xDE, 0xC1, 0x09, 0x40, 0xDF, 0xED, 0x4D,
0x7B, 0x40, 0x8C, 0xC8, 0x52, 0x77, 0x0F, 0x18, 0x62, 0x18, 0x86, 0x7D, 0x5D, 0xC0, 0x1D, 0x20,
0x40, 0x5A, 0xC9, 0x56, 0xC7, 0xE9, 0x7D, 0x76, 0xFA, 0xA9, 0x14, 0xD2, 0x8A, 0x3B, 0x7D, 0x8B,
0x00, 0x96, 0x75, 0x12, 0xFE, 0x84, 0xF4, 0xA3, 0x30, 0x10, 0x7A, 0x23, 0x3E, 0x0A, 0xA6, 0x20,
0xAF, 0xCC, 0x46, 0x7C, 0x21, 0xD2, 0xAF, 0xC2, 0x11, 0x26, 0x1F, 0x23, 0x04, 0xD2, 0x2E, 0xAD,
0x93, 0x8F, 0x48, 0xD4, 0xDD, 0xB0, 0x91, 0xC8, 0xC7, 0x84, 0x78, 0xC1, 0x96, 0x56, 0xF9, 0x70,
0xC1, 0x01, 0x54, 0x96, 0x0A, 0xD9, 0x01, 0x74, 0xEA, 0xB9, 0x3B, 0xD0, 0x5A, 0x1F, 0x47, 0x5E,
0x27, 0x9F, 0xA4, 0xFB, 0x1A, 0xA0, 0x59, 0xAC, 0xC4, 0x76, 0xC4, 0x57, 0xC2, 0x4C, 0x78, 0x18,
0xF9, 0x67, 0x11, 0x5F, 0x03, 0x6B, 0xA1, 0x8E, 0x3B, 0xB0, 0x0D, 0xF9, 0x13, 0x60, 0xB6, 0xCA,
0xBB, 0xEF, 0x38, 0x1A, 0x40, 0xA7, 0x9E, 0x5D, 0x23, 0x11, 0x03, 0xF9, 0x7F, 0x22, 0xFE, 0x4A,
0xDB, 0x2B, 0xD4, 0xBA, 0x69, 0xB3, 0x93, 0x77, 0xA6, 0xAF, 0xBD, 0x77, 0xBA, 0x7F, 0xE1, 0xF4,
0x2D, 0xAA, 0x03, 0x89, 0x66, 0xF8, 0x07, 0x6C, 0x44, 0x78, 0x33, 0x1C, 0x82, 0xE3, 0x70, 0x1A,
0xF9, 0xB0, 0x23, 0x9E, 0x93, 0x37, 0x73, 0xF5, 0xC9, 0x4E, 0x3F, 0xA2, 0x21, 0xDC, 0xE9, 0x1B,
0x91, 0x16, 0x89, 0x18, 0x1F, 0x12, 0xE0, 0x8F, 0x6D, 0x0F, 0x90, 0xAB, 0x8E, 0xBB, 0x69, 0xED,
0xBB, 0x60, 0x9F, 0x36, 0x6E, 0xE7, 0xDD, 0xDE, 0xEB, 0xE4, 0xED, 0x3B, 0xA0, 0x15, 0x4A, 0x24,
0x10, 0x77, 0x88, 0x27, 0x42, 0x48, 0x9B, 0x10, 0xA7, 0x36, 0x0A, 0xD7, 0xAC, 0x66, 0x4C, 0x27,
0x8F, 0x38, 0xF5, 0x71, 0xBA, 0xEF, 0xBC, 0x61, 0xE6, 0xD7, 0x47, 0x03, 0x18, 0x2E, 0x11, 0xE3,
0x28, 0x01, 0xB6, 0x5E, 0x4E, 0x80, 0xB8, 0xD3, 0x79, 0xFB, 0xC8, 0x74, 0x41, 0x5A, 0x4F, 0x1D,
0x27, 0x84, 0x8A, 0x6B, 0x6D, 0x5C, 0xF9, 0xBC, 0x00, 0xF1, 0x38, 0x01, 0x20, 0xA1, 0xF2, 0x1A,
0x42, 0xC5, 0xB3, 0x93, 0x67, 0xCD, 0x76, 0x5E, 0x4F, 0x9C, 0xEC, 0xA6, 0x8D, 0x44, 0x9C, 0xFA,
0xE4, 0xA6, 0x6F, 0xE8, 0xB5, 0x6E, 0xDA, 0x66, 0xD8, 0x91, 0xB7, 0x07, 0xC2, 0x85, 0x6D, 0xE2,
0x54, 0xFA, 0xF0, 0x79, 0x27, 0x4E, 0xB6, 0x3A, 0xCE, 0x89, 0xE3, 0x76, 0xDE, 0xEE, 0xBD, 0xD6,
0x46, 0xA7, 0x9F, 0xBD, 0xD6, 0xE9, 0x6B, 0x00, 0x95, 0x77, 0xA6, 0x6F, 0xE6, 0x02, 0xE4, 0x6D,
0x5A, 0x9D, 0xBA, 0x4E, 0x1F, 0xB4, 0x36, 0x76, 0xEF, 0x73, 0x1B, 0x17, 0x79, 0x36, 0xAB, 0x6E,
0x5A, 0xC3, 0x38, 0x0B, 0xDB, 0x6D, 0xE9, 0x70, 0x38, 0x6C, 0x53, 0xD0, 0x29, 0x94, 0x4A, 0xBF,
0x45, 0xE7, 0xCF, 0xE5, 0xA6, 0x9F, 0x5F, 0x1D, 0x67, 0xEA, 0x79, 0x93, 0xD7, 0x10, 0x56, 0x5E,
0x7D, 0xEC, 0x3B, 0x80, 0x78, 0x16, 0x7B, 0xFA, 0x5A, 0x19, 0x77, 0xFA, 0x7A, 0x5C, 0x22, 0xEE,
0x4C, 0x5F, 0x8F, 0x4B, 0x95, 0xCF, 0x06, 0x50, 0x69, 0x2A, 0x64, 0xA3, 0xA7, 0xCE, 0x61, 0xA4,
0xDF, 0xBC, 0x8C, 0x0A, 0x9D, 0x7E, 0x06, 0xF9, 0x6D, 0x60, 0x00, 0xD5, 0xB1, 0x8F, 0x4C, 0xA7,
0xFF, 0x96, 0x62, 0xD7, 0xC7, 0x9D, 0xFA, 0x85, 0xF2, 0x09, 0x67, 0xFA, 0x26, 0xF5, 0xC9, 0xDF,
0xB4, 0x7A, 0x64, 0xEA, 0x79, 0xAF, 0x53, 0x6F, 0x3D, 0xEF, 0xF3, 0xE5, 0x5D, 0x71, 0xED, 0xBF,
0x4E, 0x3F, 0x7C, 0x8C, 0x00, 0x5B, 0x08, 0xE0, 0x1C, 0xA3, 0xF9, 0x5C, 0xF2, 0x39, 0x90, 0xDA,
0xC5, 0x0B, 0x9A, 0xB5, 0x1C, 0xF1, 0x4D, 0x48, 0x7F, 0x92, 0x3B, 0xEF, 0xB5, 0xFB, 0xD9, 0xE9,
0xEB, 0xA9, 0x93, 0xDB, 0xB8, 0x76, 0xE7, 0xB3, 0xBD, 0x77, 0x6A, 0xA3, 0x1B, 0xD7, 0x09, 0xC0,
0xC4, 0xDD, 0x4D, 0x6B, 0xF7, 0x3F, 0x7F, 0xD3, 0xE6, 0xD5, 0x46, 0xA7, 0x6E, 0xF7, 0x5E, 0x09,
0xEB, 0xE6, 0x7D, 0x0B, 0xF9, 0x15, 0x62, 0x9C, 0x99, 0x76, 0x19, 0x01, 0x36, 0xF5, 0x94, 0xD4,
0xE9, 0xAF, 0xB3, 0x69, 0x17, 0x23, 0x5F, 0x07, 0xEF, 0xD3, 0xFD, 0x46, 0xE4, 0xE3, 0xEE, 0x89,
0xA3, 0xDD, 0x77, 0x6B, 0xE3, 0x6E, 0xDA, 0xFC, 0xDE, 0xE7, 0xE4, 0xDD, 0x87, 0x54, 0xF6, 0x81,
0xE5, 0x9C, 0x3A, 0x6E, 0xE7, 0xF5, 0xCC, 0xCF, 0x1D, 0x99, 0xF9, 0xBD, 0x6F, 0x66, 0xF2, 0xDB,
0x08, 0xF0, 0x3C, 0x01, 0xEE, 0x93, 0xF0, 0xDE, 0x9E, 0xAD, 0x7B, 0x20, 0x54, 0xE8, 0x1E, 0xD8,
0xC4, 0xE7, 0xDB, 0x46, 0x42, 0x58, 0xA3, 0x91, 0x9F, 0x09, 0x0B, 0x11, 0x5F, 0x01, 0x1B, 0x61,
0x27, 0x9D, 0x3F, 0x40, 0x80, 0xA3, 0xF6, 0xB9, 0x1F, 0x77, 0x2B, 0xD3, 0x1A, 0x40, 0xA7, 0x1E,
0x81, 0x53, 0x1C, 0x99, 0x27, 0xE8, 0xFB, 0x71, 0xA6, 0x7E, 0x14, 0x9A, 0xB8, 0xD6, 0x97, 0xB5,
0xE3, 0x4C, 0xFA, 0xBF, 0xB0, 0x0F, 0xF6, 0x82, 0x3E, 0x6D, 0x4F, 0xC2, 0x29, 0xA4, 0x9B, 0x98,
0xFE, 0x1E, 0xD6, 0x35, 0x84, 0x98, 0x24, 0xE1, 0xE6, 0x1B, 0x24, 0xFC, 0x8E, 0xC7, 0x0E, 0x10,
0x0A, 0x85, 0x6C, 0x0A, 0xDB, 0xC4, 0x6B, 0xF8, 0x20, 0xCE, 0xCB, 0x58, 0xF2, 0xA3, 0x76, 0x62,
0xED, 0xBF, 0x41, 0xAC, 0x8F, 0xFB, 0xF0, 0xF1, 0x70, 0xA0, 0x58, 0xC6, 0x08, 0x02, 0x4C, 0xA4,
0x3A, 0xD3, 0x91, 0x7F, 0x08, 0x16, 0x11, 0x60, 0x1D, 0xF5, 0xD9, 0x42, 0xEF, 0xFF, 0x4E, 0x6D,
0xDE, 0x83, 0x0D, 0x88, 0x2F, 0x21, 0xC0, 0x6C, 0xAA, 0x33, 0x4D, 0x62, 0xCD, 0xF7, 0xC3, 0x24,
0x89, 0x9E, 0x9D, 0x22, 0xD1, 0xA6, 0xA9, 0x30, 0x59, 0xA2, 0x9F, 0xDC, 0x2F, 0x91, 0xF0, 0x44,
0xA4, 0xA7, 0xC2, 0x3C, 0x58, 0x89, 0xF4, 0xAF, 0x61, 0x1D, 0x3C, 0xC7, 0xE4, 0x27, 0x10, 0xA4,
0x9B, 0x84, 0xF9, 0x54, 0x17, 0x7E, 0xF3, 0xE2, 0x4F, 0x64, 0x97, 0xDC, 0x03, 0xC9, 0x3B, 0x08,
0x30, 0x0B, 0x9E, 0xE4, 0xB7, 0x0A, 0xCF, 0x94, 0x4A, 0x72, 0x55, 0xA9, 0x58, 0xBF, 0x82, 0x7A,
0x8F, 0x58, 0x9B, 0x79, 0xCB, 0xDC, 0x02, 0xDB, 0x79, 0xA7, 0x3F, 0x50, 0x21, 0xF1, 0xD0, 0x8D,
0xC8, 0xDF, 0x0A, 0xC3, 0x90, 0xBE, 0x03, 0x79, 0x5E, 0x8F, 0xFF, 0xCD, 0x47, 0x44, 0x3E, 0x07,
0xC7, 0x7E, 0x52, 0x2A, 0xB1, 0xEF, 0x14, 0x4B, 0xF4, 0xBB, 0x25, 0x12, 0x7D, 0x10, 0x26, 0x70,
0x3D, 0x81, 0x75, 0x7A, 0xB1, 0x44, 0x16, 0x94, 0x48, 0xE4, 0x37, 0x5E, 0x31, 0x0E, 0x55, 0x20,
0xDD, 0x0B, 0x6E, 0x43, 0x7C, 0x08, 0xF4, 0x82, 0xA0, 0x84, 0x4F, 0x79, 0x24, 0xB4, 0xC3, 0x2F,
0xE1, 0x75, 0xFE, 0xB6, 0xEF, 0x81, 0x24, 0xBF, 0x91, 0x48, 0x7A, 0xA0, 0x82, 0x00, 0x5D, 0xF8,
0x60, 0xC2, 0xAF, 0x37, 0xAC, 0xBE, 0x5C, 0x0F, 0xE6, 0xB7, 0x09, 0xD5, 0x30, 0xCC, 0x23, 0xF1,
0xE1, 0x30, 0x0D, 0x96, 0x94, 0x8A, 0xF9, 0x6A, 0x89, 0x98, 0x7F, 0xF6, 0x88, 0xB9, 0x99, 0xEB,
0xD5, 0x48, 0x4F, 0xF4, 0x48, 0xAC, 0x0B, 0x1F, 0x54, 0xDA, 0xEB, 0x6F, 0x15, 0xBC, 0x36, 0xCD,
0xD0, 0x54, 0xE4, 0x91, 0x46, 0x88, 0x70, 0x6D, 0x14, 0x43, 0x27, 0x98, 0xEC, 0x11, 0x63, 0x7D,
0xA9, 0x18, 0x7C, 0x86, 0x30, 0x76, 0xB1, 0xEE, 0xF4, 0x48, 0xB8, 0xC1, 0x2B, 0xA1, 0xE5, 0x4C,
0x7F, 0x86, 0x4F, 0x42, 0xB5, 0x97, 0x11, 0xE0, 0xC2, 0x63, 0xEB, 0x4A, 0xFB, 0xF3, 0x25, 0x2B,
0xA4, 0xC2, 0xD9, 0xF3, 0xDE, 0xBE, 0xE6, 0x49, 0xAB, 0xA7, 0x8E, 0x5E, 0x3B, 0x9B, 0xB5, 0xF5,
0x69, 0xAB, 0x47, 0xA5, 0xFE, 0x7D, 0x4C, 0x5F, 0x13, 0xF2, 0xDF, 0x32, 0xF3, 0x4E, 0x9C, 0xDC,
0xC9, 0x93, 0x77, 0x6C, 0xB6, 0xBE, 0x22, 0x3B, 0x27, 0x4B, 0xD8, 0x70, 0x9E, 0xB4, 0x21, 0x7D,
0xE2, 0xBA, 0xA7, 0x4D, 0xFE, 0xC6, 0x6D, 0x61, 0x03, 0xB7, 0x84, 0x5A, 0x0A, 0xDB, 0xC4, 0xFA,
0x0F, 0x66, 0x5F, 0xD2, 0xF4, 0x5A, 0x5F, 0x17, 0x72, 0x01, 0xF2, 0x4E, 0x9D, 0xEC, 0xC3, 0x2A,
0x17, 0xE0, 0x53, 0xDF, 0xEF, 0x39, 0x36, 0x79, 0xD2, 0xB6, 0xBE, 0xE3, 0xEB, 0x6B, 0xB2, 0xF3,
0xC1, 0xC4, 0x79, 0x5D, 0x70, 0x03, 0x84, 0x79, 0xF2, 0xDA, 0x01, 0x42, 0x17, 0x04, 0x70, 0xA4,
0x35, 0x40, 0xA8, 0xA5, 0x0D, 0x01, 0xAE, 0xB4, 0xDA, 0xB4, 0xE9, 0x49, 0xAC, 0x1D, 0xBB, 0xD2,
0xF9, 0xD4, 0x0F, 0xF5, 0xF3, 0x17, 0x2C, 0x1A, 0x77, 0xB9, 0x5F, 0x2F, 0xF1, 0xF5, 0x94, 0x7C,
0x9E, 0x5C, 0xCA, 0x83, 0x3B, 0x32, 0x14, 0xFA, 0x42, 0x30, 0xF7, 0xFD, 0x00, 0x17, 0x5E, 0xE8,
0x0C, 0xB7, 0x80, 0x7E, 0x79, 0x50, 0x10, 0xC5, 0x45, 0x25, 0x03, 0x4B, 0x8A, 0x3D, 0x83, 0x3E,
0x4F, 0x0A, 0xF8, 0xD9, 0x2A, 0xDF, 0x01, 0x4A, 0xF3, 0x03, 0xE8, 0x17, 0x66, 0x1A, 0xA2, 0x1C,
0xF4, 0x9B, 0x8F, 0x2B, 0x19, 0x9D, 0xFC, 0x79, 0xF2, 0xF9, 0x41, 0xAE, 0x5D, 0x5F, 0x9B, 0xC0,
0xB5, 0x09, 0x5C, 0x85, 0x13, 0xF8, 0x1F, 0x36, 0x17, 0x75, 0x31, 0x45, 0xB2, 0x22, 0x02, 0x00,
0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82
};

26
data/images.cpp Normal file

File diff suppressed because one or more lines are too long

23
data/images.h Normal file
View File

@ -0,0 +1,23 @@
/**
* Powder Toy - Images
*
* Copyright (c) 2008 - 2010 Stanislaw Skowronek.
* Copyright (c) 2010 Simon Robertshaw.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
#pragma once
extern const unsigned char save_to_server_image[];
extern const unsigned char save_to_disk_image[];

147
data/localization/EN.cpp Normal file
View File

@ -0,0 +1,147 @@
#include "Config.h"
#include "common/Localization.h"
#include "common/Internationalization.h"
struct LocaleEN : public Locale
{
String GetName() const override { return "English"; }
size_t GetPluralIndex(size_t n) const override
{
// 0: singular, 1: plural
return n == 1 ? 0 : 1;
}
void Set() const override
{
using i18n::translation;
using i18n::pluralForm;
pluralForm("save") = {"save", "saves"};
pluralForm("stamp") = {"stamp", "stamps"};
}
String GetIntroText() const override
{
return
U"\blThe Powder Toy - Version " MTOS(SAVE_VERSION) "." MTOS(MINOR_VERSION) " - https://powdertoy.co.uk, irc.freenode.net #powder\n"
U"\uE069\uE069\uE069\uE069\uE069\uE069\uE069\uE069\uE069\uE069\uE069\uE069\uE069\uE069\uE069\uE069\uE069\uE069\uE069\n"
"\n"
"\bgControl+C/V/X are Copy, Paste and cut respectively.\n"
"\bgTo choose a material, hover over one of the icons on the right, it will show a selection of elements in that group.\n"
"\bgPick your material from the menu using mouse left/right buttons.\n"
"Draw freeform lines by dragging your mouse left/right button across the drawing area.\n"
"Shift+drag will create straight lines of particles.\n"
"Ctrl+drag will result in filled rectangles.\n"
"Ctrl+Shift+click will flood-fill a closed area.\n"
"Use the mouse scroll wheel, or '[' and ']', to change the tool size for particles.\n"
"Middle click or Alt+Click to \"sample\" the particles.\n"
"Ctrl+Z will act as Undo.\n"
"\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength.\n"
"The spacebar can be used to pause physics. Use 'F' to step ahead by one frame.\n"
"Use 'S' to save parts of the window as 'stamps'. 'L' loads the most recent stamp, 'K' shows a library of stamps you saved.\n"
"Use 'P' to take a screenshot and save it into the current directory.\n"
"Use 'H' to toggle the HUD. Use 'D' to toggle debug mode in the HUD.\n"
"\n"
"Contributors: \bgStanislaw K Skowronek (Designed the original Powder Toy),\n"
"\bgSimon Robertshaw, Skresanov Savely, cracker64, Catelite, Bryan Hoyle, Nathan Cousins, jacksonmj,\n"
"\bgFelix Wallin, Lieuwe Mosch, Anthony Boot, Matthew \"me4502\", MaksProg, jacob1, mniip, LBPHacker\n"
"\n"
#ifndef BETA
"\bgTo use online features such as saving, you need to register at: \brhttps://powdertoy.co.uk/Register.html\n"
#else
"\brThis is a BETA, you cannot save things publicly. If you are planning on publishing any saves, use the release version\n"
#endif
;
}
String GetSavePublishingInfo() const override
{
return
U"In The Powder Toy, one can save simulations to their account in two privacy levels: Published and unpublished. You can choose which one by checking or unchecking the 'publish' checkbox. Saves are unpublished by default, so if you do not check publish nobody will be able to see your saves.\n"
"\n"
"\btPublished saves\bw will appear on the 'By Date' feed and will be seen by many people. These saves also contribute to your Average Score, which is displayed publicly on your profile page on the website. Publish saves that you want people to see so they can comment and vote on.\n"
"\btUnpublished saves\bw will not be shown on the 'By Date' feed. These will not contribute to your Average Score. They are not completely private though, as anyone who knows the save id will be able to view it. You can give the save id out to show specific people the save but not allow just everyone to see it.\n"
"\n"
"To quickly resave a save, open it and click the left side of the split resave button to \bt'Reupload the current simulation'\bw. If you want to change the description or change the published status, you can click the right side to \bt'Modify simulation properties'\bw. Note that you can't change the name of saves; this will create an entirely new save with no comments, votes, or tags; separate from the original.\n"
"You may want to publish an unpublished save after it is finished, or to unpublish some currently published ones. You can do this by opening the save, selecting the 'Modify simulation properties' button, and changing the published status there. You can also \btunpublish or delete saves\bw by selecting them in the 'my own' section of the browser and clicking either one of the buttons that appear on bottom.\n"
"If a save is under a week old and gains popularity fast, it will be automatically placed on the \btfront page\bw. Only published saves will be able to get here. Moderators can also choose to promote any save onto the front page, but this happens rarely. They can also demote any save from the front page that breaks a rule or they feel doesn't belong.\n"
"Once you make a save, you can resave it as many times as you want. A short previous \btsave history\bw is saved, just right click any save in the save browser and select 'View History' to view it. This is useful for when you accidentally save something you didn't mean to and want to go back to the old version.\n";
}
String GetRules() const override
{
return
U"\boSection S: Social and Community Rules\n"
"\bwThere are a few rules you should follow while interacting with the community. These rules are enforced by staff members and any issues related to violations of these rules may be brought to our attention by users. This section applies to saves uploaded, comments area, forums, and other areas of the community.\n"
"\n"
"\bt1. Try to use proper grammar.\bw English is the official community language, but use is not required in regional or cultural groups. If you cannot write English well, we advise that you use Google Translate.\n"
"\bt2. Do not spam.\bw There's not a one size fits all definition here, but the idea is usually obvious. In addition, the following are seen as spam and may be hidden or deleted:\n"
"- Posting multiple threads on the same subject. Try to combine threads on game feedback or suggestions into one thread.\n"
"- Bumping an old thread by replying. This is what we call 'necro' or 'necroing'. The content of the thread may be stale (fixing issues, ideas, etc). We recommend posting a new thread for an updated or more current response.\n"
"- Posting on a thread with '+1' or other short replies. There's no need to constantly bump a thread and make finding replies difficult. Replies are great for constructive feedback, while the '+1' button is to show your support for the content.\n"
"- Comments that are excessively long or gibberish. Making comments such as repeating the same letter or have little to no intended purpose, fall under this rule. Comments that are in a different language are exempt.\n"
"- Excessive formatting. UPPERCASE, Bold, and italics can be nice with moderate use, but please do not use them throughout the entire post.\n"
"\bt3. Keep swearing to a minimum.\bw Comments or saves containing swearing are at risk of being deleted. This also includes swearing in other languages.\n"
"\bt4. Refrain from uploading sexually explicit, offensive, or other inappropriate materials.\bw\n"
"- These include, but are not limited to: sex, drugs, racism, excessive politics, or anything that offends or insults a group of people.\n"
"- Reference to these topics in other languages is also prohibited. Do not attempt to bypass this rule.\n"
"- Posting URLs or images that violate this rule is prohibited. This includes links or text in your profile information.\n"
"\bt5. Do not advertise third-party games, sites, or other places not related to The Powder Toy.\bw\n"
"- Mainly this rule is intended to prevent people going through and advertising their own games and products.\n"
"- Unauthorized or unofficial community gathering places, such as Discord, are prohibited.\n"
"\bt6. Trolling is not allowed.\bw As with some rules, there's no clear definition. Users who repeatedly troll are far more likely to be banned and recieve longer bans than others.\n"
"\bt7. Do not impersonate anyone.\bw Registering accounts with names intentionally similar to other users in our community or other online communities is prohibited.\n"
"\bt8. Do not post about moderator decisions or issues.\bw If there is a problem regarding a ban on your account or content removal, please contact a moderator through the messages system. Otherwise, discussion about moderator actions should be avoided.\n"
"\bt9. Avoid backseat moderating.\bw Moderators are the ones who make the decisions. Users should refrain from threatening bans or possible results from breaking a rule. If there is a possible issue or you are unsure, we recommend reporting the issue through the 'Report' button or via the messaging system on the website.\n"
"\bt10. Condoning of breaking common laws is prohibited.\bw The jurisdiction of which country's laws applies is not clear, but there are some common ones to know. These include, but not limited to:\n"
"- Piracy of software, music, bagels, etc.\n"
"- Hacking / Stealing accounts\n"
"- Theft / Fraud\n"
"\bt11. Do not stalk or harass any user.\bw This has been a growing problem in recent years by different methods, but generally these include:\n"
"- 'Doxing' user(s) to find where they live or their real identity\n"
"- Constantly messaging a user when they wish to refrain from any contact\n"
"- Mass downvoting saves\n"
"- Posting rude or unnecessary comments on someone's content (saves, forum threads, etc)\n"
"- Coercing a group of users to 'target' a user\n"
"- Personal arguments or hatred. This could be arguing in the comments or making hate saves\n"
"- Discrimination, in general, of people. This could be religious, ethnic, etc.\n"
"\n"
"\boSection G: In-Game Rules\n"
"\bwThis section of the rules is focused on in-game actions. Though, Section S also applies in-game, the following rules are more specialized to in-game community interaction.\n"
"\bt1. Don't claim other people's work.\bw This could be simply re-uploading another user's or utilizing large sections of saves. Derivative works are allowed, with proper usage. Should you utilize someone's work, by default you must credit the author. Unless the author has explicitly noted different usage terms, this is the standard policy. Derivative works are characterized by innovative usage and originality percentage (ie. how much is original versus someone's work?). Stolen saves will be unpublished or disabled.\n"
"\bt2. Self-voting or vote fraud is not allowed.\bw This is defined as making multiple accounts to vote on your own saves or the saves of others. We enforce this rule strictly, therefore, you must understand that there are very few successful ban appeals. Please ensure you and other accounts are not voting from the same household. All alternate accounts will be permanently banned, the main account will be temporarily banned and any affected saves will be disabaled.\n"
"\bt3. Asking for votes of any kind is frowned upon.\bw Saves which do this will be unpublished until the issue is fixed. Examples of such that are under this rules are:\n"
"- Signs that may hint at voting up or down. The signature green arrow or asking for votes goes under this rule.\n"
"- Gimmicks that ask for votes. These might be a total number of votes in exchange for something, like '100 votes and I'll make a better version'. This is what we define as vote farming. Any type of vote farming is not allowed.\n"
"- Asking for votes in return for usage of a save or for any other reason is prohibited.\n"
"\bt4. Do not spam.\bw As mentioned earlier, there are no standards for what counts as spam. Here are some examples that may qualify as spamming:\n"
"- Uploading or re-uploading similar saves within a short amount of time. Don't try to circumvent the system to have your saves seen/voted by people. This includes uploading 'junk' or 'blank' saves with little to no purpose. These saves will be unpublished.\n"
"- Uploading text-only saves. These may be announcements or looking for help of sorts. We have the forums and comments area available for many purposes these text-only saves would serve. These saves will be removed from front page.\n"
"- Uploading art saves is not strictly prohibited, but may result in a front-page demotion. We like to see usage of the variety of elements in a creative manner. Lack of these factors (such as in deco-only saves) will typically result in a front-page demotion\n"
"\bt5. Refrain from uploading sexually explicit or other inappropriate materials. These saves will be deleted and will lead to a ban.\bw\n"
"- These include, but are not limited to: sex, drugs, racism, excessive politics, or anything that offends or insults a group of people.\n"
"- Don't try to circumvent this rule. Anything that intentionally refers to these concepts/ideas by direct or indirect means falls under this rule.\n"
"- Reference to these topics in other languages is also prohibited. Do not attempt to bypass this rule.\n"
"- Posting URLs or images that violate this rule is prohibited. This includes links or text in your profile information.\n"
"\bt6. Image plotting is strictly prohibited.\bw This includes usage of scripting or any third-party tools to plot or create a save for you. Saves using CGI will be deleted and you may receive a ban.\n"
"\bt7. Keep logos and signs to a minimum.\bw These saves may be removed from front page. Items that this rule restricts are:\n"
"- Excessive logos placed\n"
"- Signs without intended purpose\n"
"- Fake update or notifications signs\n"
"- Linking other saves that have no related purposes\n"
"\bt8. Do not place offtopic or inappropriate tags.\bw Tags are only there to improve search results. They should generally only be one word descriptions of the save. Sentences or subjective tags may be deleted. Inappropriate or offensive tags will likely get you banned.\n"
"\bt9. Intentional lag inducing or crashing saves are prohibited.\bw If the majority of users are writing about the save causing crashes or lag, then the save will fall under this rule. These saves will be removed from front page or disabled.\n"
"\bt10. Do not misuse the reporting system.\bw Sending in report reasons such as 'bad save' or gibberish wastes our time. Unless the issue pertains to a possible rule violation or community issue, please refrain from sending a report. If you think the save violates or poses a community issue, send a report anyway! Bans will never happen if you are reporting a save in good faith.\n"
"\bt11. Do not ask for saves to be demoted or removed from the front-page.\bw Unless the save violates any rules, it will stay on the front-page. There is no exception to this rule for art saves, please do not report art either.\n"
"\n"
"\boSection R: Other\n"
"\bwModerators may interpret these rules as they see fit. Not all rules are equal, some are enforced less than others. Moderators make the final decision on what is and isn't against the rules, but we have made our best effort here to cover all unwanted behavior here. Notice will be posted in this thread whenever the rules are updated.\n"
"\n"
"Violation of these rules may result in removal of posts / comments, unpublishing or disabling saves, removing saves from front page, or in more extreme cases, a temporary or permanent ban. There are various manual and automated measures in place to enforce these rules. The severity and resulting decisions may not be consistent between moderators.\n"
"\n"
"If you have any questions about what is and isn't against the rules, feel free to contact a moderator.";
}
};
Locale const &Locale_EN = LocaleEN{};

12
data/localization/List.h Normal file
View File

@ -0,0 +1,12 @@
#pragma once
#include <vector>
#include "common/Localization.h"
extern Locale const &Locale_EN;
const std::vector<Locale const *> locales =
{
&Locale_EN,
};

View File

@ -1,290 +0,0 @@
#!/usr/bin/env python3
import bz2
import math
import re
import argparse
CP_MAX = 0x10FFFF
FONT_CPP = "resources/font.bz2"
FONT_HEIGHT = 12
class ReadBDFError(RuntimeError):
def __init__(self, line_number, message):
super().__init__(self, 'line %i: %s' % (line_number, message))
class FontTool:
def __init__(self, file):
self.file = file
with open(self.file, 'rb') as font_cpp:
font_cpp_data = bz2.decompress(font_cpp.read())
i = 0
self.code_points = [False for _ in range(CP_MAX + 2)]
while i < len(font_cpp_data):
cp = font_cpp_data[i] | (font_cpp_data[i + 1] << 8) | (font_cpp_data[i + 2] << 16)
width = font_cpp_data[i + 3]
n = i + 4 + 3 * width
self.code_points[cp] = font_cpp_data[(i + 3): n]
i = n
def commit(self):
l = []
for i, data in enumerate(self.code_points):
if data:
l.append(i & 0xFF)
l.append((i >> 8) & 0xFF)
l.append((i >> 16) & 0xFF)
l += data
with open(self.file, 'wb') as font_cpp:
font_cpp.write(bz2.compress(bytes(l)))
def pack(cp_matrix):
width = 0
for row in cp_matrix:
if width < len(row):
width = len(row)
cp_data = [width]
bits = 8
for row in cp_matrix:
padded = row + [0] * (width - len(row))
for cv in padded:
if bits == 8:
cp_data.append(0)
bits = 0
cp_data[-1] |= (cv & 3) << bits
bits += 2
return cp_data
def unpack(cp_data):
ptr = 1
bits = 0
buf = 0
cp_matrix = []
for y in range(FONT_HEIGHT):
cp_matrix.append([])
for x in range(cp_data[0]):
if bits == 0:
buf = cp_data[ptr]
ptr += 1
bits = 8
cp_matrix[-1].append(buf & 3)
buf >>= 2
bits -= 2
return cp_matrix
def dump(self, i, print):
lut = [' ', '░░', '▒▒', '▓▓']
if self.code_points[i]:
print('code point %i (%c)' % (i, i))
print('')
for l in [''.join([lut[ch] for ch in row]) for row in FontTool.unpack(self.code_points[i])]:
print(l)
print('')
else:
print('code point %i (%c) is not available' % (i, i))
class RawReader:
def __init__(self, path):
self.code_points = [False for _ in range(CP_MAX + 2)]
with open(path) as raw:
items = [int(v) for v in re.findall(r'[0-9]+', raw.read())]
ptr = 0
while ptr <= len(items) - 2:
cp = items[ptr]
width = items[ptr + 1]
ptr += 2
matrix = []
for i in range(ptr, ptr + width * FONT_HEIGHT, width):
matrix.append(items[i: (i + width)])
ptr += width * FONT_HEIGHT
self.code_points[cp] = FontTool.pack(matrix)
class BDFReader:
def __init__(self, path, xoffs, yoffs):
self.code_points = [False for _ in range(CP_MAX + 2)]
item_re = re.compile(r'[^ \n\r]+')
with open(path) as bdf:
global_dw = False
startchar = False
bitmap = False
char_dw = False
char_cp = False
char_bbx = False
skip = 0
for line_number, line in enumerate(bdf):
if skip:
skip -= 1
continue
items = re.findall(item_re, line)
if startchar and items[0] == 'ENDCHAR':
if len(bitmap) != char_bbx[1]:
raise ReadBDFError(line_number, "invalid bitmap data")
cp_matrix = []
for y in range(FONT_HEIGHT):
cp_matrix.append([])
for x in range(char_dw):
cv = 0
xx = x + xoffs
yy = FONT_HEIGHT - 1 - y + yoffs
if char_bbx[2] <= xx < char_bbx[0] + char_bbx[2] and char_bbx[3] <= yy < char_bbx[1] + \
char_bbx[3]:
cv = bitmap[char_bbx[1] - 1 - (yy - char_bbx[3])][xx - char_bbx[2]] * 3
cp_matrix[-1].append(cv)
self.code_points[char_cp] = FontTool.pack(cp_matrix)
startchar = False
bitmap = False
char_dw = False
char_cp = False
char_bbx = False
elif bitmap != False:
if len(items) != 1:
raise ReadBDFError(line_number, "missing bitmap data")
bits = []
for ch in items[0]:
cv = int(ch, 16)
bits += [cv & 8 and 1 or 0, cv & 4 and 1 or 0, cv & 2 and 1 or 0, cv & 1 and 1 or 0]
bitmap.append(bits[: char_bbx[0]])
elif items[0] == 'SIZE':
if len(items) != 4:
raise ReadBDFError(line_number, "invalid directive")
elif items[0] == 'FONTBOUNDINGBOX':
if len(items) != 5:
raise ReadBDFError(line_number, "invalid directive")
elif not startchar and items[0] == 'STARTCHAR':
startchar = True
char_dw = global_dw
elif items[0] == 'STARTPROPERTIES':
if len(items) != 2:
raise ReadBDFError(line_number, "invalid directive")
skip = int(items[1]) + 1
elif startchar and items[0] == 'BITMAP':
bitmap = []
elif startchar and items[0] == 'BBX':
if len(items) != 5:
raise ReadBDFError(line_number, "invalid directive")
char_bbx = [int(items[1]), int(items[2]), int(items[3]), int(items[4])]
elif startchar and items[0] == 'ENCODING':
if len(items) != 2:
raise ReadBDFError(line_number, "invalid directive")
char_cp = int(items[1])
elif items[0] == 'METRICSSET':
if len(items) != 2:
raise ReadBDFError(line_number, "invalid directive")
if int(items[1]) == 1:
raise ReadBDFError(line_number, "font does not support writing direction 0")
elif items[0] == 'DWIDTH':
if len(items) != 3:
raise ReadBDFError(line_number, "invalid directive")
if int(items[2]) != 0:
raise ReadBDFError(line_number, "vertical component of dwidth vector is non-zero")
char_dw = int(items[1])
if not startchar:
global_dw = char_dw
def pad_str(s, pad, n):
return s + pad * (n - len(s))
if __name__ == "__main__":
parser = argparse.ArgumentParser("fonttool.py", description="font tools for managing fonts, this script can be"
" imported as a module",
fromfile_prefix_chars="@")
command = parser.add_subparsers(dest="command", required=True)
addbdf = command.add_parser("addbdf", help="Adds BDF Formated Font")
addbdf.add_argument("first", metavar="FIRST", type=int)
addbdf.add_argument("last", metavar="LAST", type=int)
addbdf.add_argument("bdffile", metavar="BDFFILE", help="BDF is an archaic bitmap font format")
addbdf.add_argument("xoffs", metavar="XOFFS", nargs="?", default=0, type=int, help="Defaults to 0")
addbdf.add_argument("yoffs", metavar="YOFFS", nargs="?", default=0, type=int, help="Defaults to 0")
addraw = command.add_parser("addraw", help="Adds a Raw Formated Font")
addraw.add_argument("first", metavar="FIRST", type=int)
addraw.add_argument("last", metavar="LAST", type=int)
addraw.add_argument("rawfile", metavar="RAWFILE", help=""""Raw" files are simply ASCII-encoded white-space delimited \
lists
of decimal integer constants. These lists of integers encode
characters as any number of consecutive character description
structures laid out as follows:
* the code point corresponding to the character being described;
* the width in pixels of the character being described;
* width times %i brightness levels between 0 and 3, a row-major matrix.""")
remove = command.add_parser("remove", help="Remove a range of characters")
remove.add_argument("first", metavar="FIRST", type=int)
remove.add_argument("last", metavar="LAST", type=int, default=None, nargs="?", help="Defaults to FIRST")
copy = command.add_parser("copy", help="Copy a range of characters to another range")
copy.add_argument("dest", metavar="DSTFIRST", type=int)
copy.add_argument("first", metavar="SRCFIRST", type=int)
copy.add_argument("last", metavar="SRCLAST", type=int, default=None, nargs="?", help="Defaults to SRCFIRST")
inspect = command.add_parser("inspect", help="Inspect a range of characters")
inspect.add_argument("first", metavar="FIRST", type=int)
inspect.add_argument("last", metavar="LAST", type=int, default=None, nargs="?", help="Defaults to FIRST")
diff = command.add_parser("diff", help="Prints subranges that changed between the current and an external font file")
diff.add_argument("external", metavar="EXTERNAL", help="External font.bz2")
args = parser.parse_args()
if 'first' in args:
cp_first = args.first
if args.last is None:
cp_last = cp_first
else:
cp_last = args.last
if cp_first < 0 or cp_last > CP_MAX or cp_first > cp_last:
print('invalid range')
exit(1)
ft = FontTool(FONT_CPP)
if args.command == "addbdf":
xoffs = args.xoffs
yoffs = args.yoffs
bdfr = BDFReader(args.bdffile, xoffs, yoffs)
for i in range(cp_first, cp_last + 1):
if bdfr.code_points[i] and not ft.code_points[i]:
ft.code_points[i] = bdfr.code_points[i]
ft.commit()
elif args.command == 'addraw':
rr = RawReader(args.rawfile)
for i in range(cp_first, cp_last + 1):
if rr.code_points[i] and not ft.code_points[i]:
ft.code_points[i] = rr.code_points[i]
ft.commit()
elif args.command == 'remove':
for i in range(cp_first, cp_last + 1):
ft.code_points[i] = False
ft.commit()
elif args.command == 'copy':
for i in range(cp_first, cp_last + 1):
ft.code_points[i + (args.dest - cp_first)] = ft.code_points[i]
ft.commit()
elif args.command == 'inspect':
for i in range(cp_first, cp_last + 1):
ft.dump(i, print)
elif args.command == 'diff':
pad_to = 50
eft = FontTool(args.external)
for i in range(0, CP_MAX + 1):
if eft.code_points[i] != ft.code_points[i]:
cur = []
def add_cur(line):
global cur
cur.append(line)
ft.dump(i, add_cur)
ext = []
def add_ext(line):
global ext
ext.append(line)
eft.dump(i, add_ext)
print('#' * (2 * pad_to + 7))
for j in range(max(len(cur), len(ext))):
print('# ' + pad_str(j < len(cur) and cur[j] or '', ' ', pad_to) + ' # ' + pad_str(j < len(ext) and ext[j] or '', ' ', pad_to) + ' #')

View File

@ -1,484 +0,0 @@
project(
'the-powder-toy',
[ 'c', 'cpp' ],
version: 'the.cake.is.a.lie',
default_options: [
'c_std=c99',
'cpp_std=c++17',
'cpp_rtti=false',
'build.c_std=c99', # used by to_array
'build.cpp_std=c++17', # used by to_array
'build.cpp_rtti=false', # used by to_array
],
meson_version: '>=0.64.0',
)
if get_option('prepare')
# we're being run by prepare.py in a ghactions workflow only to determine the values of options; exit early
subdir_done()
endif
fs = import('fs')
to_array = generator(
executable('toarray', sources: 'resources/ToArray.cpp', native: true),
output: [ '@PLAINNAME@.cpp', '@PLAINNAME@.h' ],
arguments: [ '@OUTPUT0@', '@OUTPUT1@', '@INPUT@', '@EXTRA_ARGS@' ]
)
render_icons_with_inkscape = get_option('render_icons_with_inkscape')
inkscape = find_program('inkscape', required: render_icons_with_inkscape)
c_compiler = meson.get_compiler('c')
is_x86 = host_machine.cpu_family() in [ 'x86', 'x86_64' ]
is_64bit = host_machine.cpu_family() in [ 'aarch64', 'x86_64' ]
is_msvc = c_compiler.get_id() in [ 'msvc' ]
host_arch = host_machine.cpu_family()
host_platform = host_machine.system()
# educated guesses follow, PRs welcome
if c_compiler.get_id() in [ 'msvc' ]
if host_platform != 'windows'
error('this seems fishy')
endif
host_libc = 'msvc'
elif c_compiler.get_id() in [ 'gcc' ] and host_platform == 'windows'
host_libc = 'mingw'
elif host_platform in [ 'darwin' ]
host_libc = 'macos'
elif host_platform in [ 'emscripten' ]
host_platform = 'emscripten'
host_libc = 'emscripten'
elif host_platform in [ 'android' ]
host_platform = 'android'
host_libc = 'bionic'
else
if host_platform != 'linux'
# TODO: maybe use 'default' in place of 'linux', or use something other than host_platform where details such as desktop integration are concerned
warning('host platform is not linux but we will pretend that it is')
host_platform = 'linux'
endif
host_libc = 'gnu'
endif
static_variant = get_option('static')
if static_variant != 'prebuilt' and host_platform == 'android'
warning('only prebuilt libs are supported for android')
static_variant = 'prebuilt'
endif
if static_variant == 'system' and host_platform == 'windows' and host_libc == 'msvc'
warning('no way to find system libs for msvc on windows')
static_variant = 'prebuilt'
endif
is_static = static_variant != 'none'
is_debug = get_option('optimization') in [ '0', 'g' ]
app_exe = get_option('app_exe')
tpt_libs_static = 'none'
if static_variant == 'prebuilt'
tpt_libs_static = 'static'
endif
if static_variant == 'none' and host_platform == 'windows' and host_libc == 'msvc'
tpt_libs_static = 'dynamic'
endif
tpt_libs_debug = is_debug ? 'debug' : 'release'
tpt_libs_variant = '@0@-@1@-@2@-@3@'.format(host_arch, host_platform, host_libc, tpt_libs_static)
tpt_libs_vtag = get_option('tpt_libs_vtag')
if tpt_libs_vtag == ''
tpt_libs_vtag = 'v20240112165024'
endif
if tpt_libs_static != 'none'
if tpt_libs_variant not in [
'x86_64-linux-gnu-static',
'x86_64-windows-mingw-static',
'x86_64-windows-msvc-static',
'x86_64-windows-msvc-dynamic',
'x86-windows-msvc-static',
'x86-windows-msvc-dynamic',
'x86_64-darwin-macos-static',
'aarch64-darwin-macos-static',
'x86-android-bionic-static',
'x86_64-android-bionic-static',
'arm-android-bionic-static',
'aarch64-android-bionic-static',
'wasm32-emscripten-emscripten-static',
]
error('no prebuilt @0@ libraries are currently provided'.format(tpt_libs_variant))
endif
tpt_libs = subproject('tpt-libs-prebuilt-@0@-@1@-@2@'.format(tpt_libs_variant, tpt_libs_debug, tpt_libs_vtag))
else
if get_option('workaround_elusive_bzip2')
bzip2_lib_name = get_option('workaround_elusive_bzip2_lib_name')
bzip2_include_name = get_option('workaround_elusive_bzip2_include_name')
bzip2_lib_dir = get_option('workaround_elusive_bzip2_lib_dir')
bzip2_include_dir = include_directories(get_option('workaround_elusive_bzip2_include_dir'))
bzip2_static = get_option('workaround_elusive_bzip2_static')
meson.override_dependency('bzip2', declare_dependency(
dependencies: c_compiler.find_library(
bzip2_lib_name,
has_headers: bzip2_include_name,
dirs: bzip2_lib_dir,
header_include_directories: bzip2_include_dir,
static: bzip2_static,
),
include_directories: bzip2_include_dir,
))
endif
endif
x86_sse_level_str = get_option('x86_sse')
if x86_sse_level_str == 'auto'
x86_sse_level = 20
if not is_x86 or not is_64bit or host_platform == 'darwin' or (is_64bit and is_msvc)
x86_sse_level = 0
endif
elif x86_sse_level_str == 'sse3'
x86_sse_level = 30
elif x86_sse_level_str == 'sse2'
x86_sse_level = 20
elif x86_sse_level_str == 'sse'
x86_sse_level = 10
elif x86_sse_level_str == 'none'
x86_sse_level = 0
endif
lua_variant = get_option('lua')
if lua_variant == 'auto'
if host_platform == 'emscripten'
lua_variant = 'lua5.2'
else
lua_variant = 'luajit'
endif
endif
if lua_variant == 'luajit' and host_platform == 'emscripten'
error('luajit does not work with emscripten')
endif
if lua_variant == 'none'
lua_dep = []
elif lua_variant == 'lua5.1' or lua_variant == 'lua5.2'
lua_dep = dependency(lua_variant + '-c++', static: is_static, required: false)
if not lua_dep.found()
if not get_option('workaround_noncpp_lua')
error('your system @0@ is not compatible with C++, configure with -Dworkaround_noncpp_lua=true to disable this error'.format(lua_variant))
endif
lua_dep = dependency(lua_variant, static: is_static)
endif
elif lua_variant == 'luajit'
lua_dep = dependency('luajit', static: is_static)
endif
enable_http = get_option('http')
if host_platform == 'android'
android_ndk_toolchain_prefix = meson.get_external_property('android_ndk_toolchain_prefix')
android_platform = meson.get_external_property('android_platform')
tpt_libs_android_toolchain_prefix = tpt_libs.get_variable('android_toolchain_prefix')
tpt_libs_android_system_version = tpt_libs.get_variable('android_system_version')
tpt_libs_android_platform = tpt_libs.get_variable('android_platform')
if '@0@@1@-'.format(tpt_libs_android_toolchain_prefix, tpt_libs_android_system_version) != android_ndk_toolchain_prefix
error('tpt-libs android toolchain mismatch')
endif
if tpt_libs_android_platform != android_platform
error('tpt-libs android platform mismatch')
endif
endif
curl_dep = []
if enable_http and host_platform != 'emscripten'
curl_dep = dependency('libcurl', static: is_static)
endif
project_link_args = []
project_c_args = []
project_cpp_args = []
fftw_dep = dependency('fftw3f', static: is_static)
threads_dep = dependency('threads')
if host_platform == 'emscripten'
zlib_dep = []
png_dep = []
sdl2_dep = []
bzip2_dep = []
project_link_args += [
'--no-heap-copy',
'-s', 'WASM=1',
'-s', 'ALLOW_MEMORY_GROWTH=1',
'-s', 'FORCE_FILESYSTEM=1',
'-s', 'EXIT_RUNTIME=0',
'-s', 'EXPORTED_RUNTIME_METHODS=ccall,cwrap',
'-s', 'FS_DEBUG',
'-s', 'MODULARIZE',
'-s', 'EXPORT_NAME=create_' + app_exe,
'-Wl,-u,_emscripten_run_callback_on_thread',
'-lidbfs.js',
]
emcc_args = [
'-s', 'USE_SDL=2',
'-s', 'USE_BZIP2=1',
'-s', 'USE_LIBPNG',
'-s', 'USE_ZLIB=1',
'-s', 'DISABLE_EXCEPTION_CATCHING=0',
]
if is_debug
project_link_args += [ '--source-map-base=./' ]
emcc_args += [ '-gsource-map' ]
endif
project_link_args += emcc_args
project_c_args += emcc_args
project_cpp_args += emcc_args
else
zlib_dep = dependency('zlib', static: is_static)
png_dep = dependency('libpng16', static: is_static)
sdl2_dep = dependency('sdl2', static: is_static)
bzip2_dep = dependency('bzip2', static: is_static)
endif
json_dep = dependency('jsoncpp', static: is_static)
if is_msvc
if x86_sse_level >= 30
warning('SSE3 configured to be enabled but unavailable in msvc')
x86_sse_level = 20
endif
if is_64bit and x86_sse_level > 0
warning('SSE explicitly configured but unavailable in msvc targeting 64-bit machines')
x86_sse_level = 0
endif
args_msvc = [
'/GS',
'/D_SCL_SECURE_NO_WARNINGS',
'/DUNICODE',
'/D_UNICODE',
]
if x86_sse_level >= 20
args_msvc += [ '/arch:SSE2' ]
elif x86_sse_level >= 10
args_msvc += [ '/arch:SSE' ]
endif
if not is_debug
args_msvc += [
'/Oy-',
'/fp:fast',
'/GL',
]
project_link_args += [
'/OPT:REF',
'/OPT:ICF',
'/LTCG',
]
endif
project_c_args += args_msvc
project_cpp_args += args_msvc
else
args_ccomp = []
if host_platform == 'darwin' and x86_sse_level > 0
message('SSE level explicitly configured but unavailable on macosx')
x86_sse_level = 0
endif
if x86_sse_level >= 30
args_ccomp += [ '-msse3' ]
elif x86_sse_level >= 20
args_ccomp += [ '-msse2' ]
elif x86_sse_level >= 10
args_ccomp += [ '-msse' ]
endif
if host_platform == 'windows'
args_ccomp += [
'-DUNICODE',
'-D_UNICODE',
]
endif
if not is_debug
args_ccomp += [
'-ftree-vectorize',
'-funsafe-math-optimizations',
'-ffast-math',
'-fomit-frame-pointer',
]
endif
if host_platform == 'android'
if not is_64bit
args_ccomp += [ '-U_FILE_OFFSET_BITS' ]
endif
# android doesn't ship libc++_shared.so, so we might as well link it statically;
# the alternative would be to grab libc++_shared.so from the NDK and ship it with
# the app alongside libpowder.so, and possibly add it to SDL's list of libraries to load
project_link_args += [ '-static-libstdc++' ]
endif
project_c_args += args_ccomp + [
'-Wno-implicit-fallthrough',
'-Wno-missing-field-initializers',
'-Wno-unused-result',
'-Wno-unused-parameter',
]
project_cpp_args += args_ccomp + [
'-Wno-invalid-offsetof',
'-Wno-unused-result',
'-Wno-missing-field-initializers',
'-Wno-unused-parameter',
]
endif
if host_platform == 'windows'
args_ccomp_win = [ '-D_WIN32_WINNT=0x0501', '-DNOMINMAX' ]
windows_mod = import('windows')
if is_static
args_ccomp_win += [ '-DCURL_STATICLIB' ]
if host_arch == 'x86_64'
args_ccomp_win += [ '-DZLIB_WINAPI' ]
endif
endif
if tpt_libs_static == 'dynamic'
foreach input_output_condition : tpt_libs.get_variable('config_dlls')
dll_input = input_output_condition[0]
dll_output = input_output_condition[1]
dll_condition = input_output_condition[2]
do_copy = false
if dll_condition == 'all'
do_copy = true
elif dll_condition == 'lua=' + lua_variant
do_copy = true
endif
if do_copy
fs.copyfile(dll_input, dll_output)
endif
endforeach
endif
project_c_args += args_ccomp_win
project_cpp_args += args_ccomp_win
endif
project_inc = include_directories([ 'src', 'resources' ])
if host_platform == 'windows'
ident_platform = is_64bit ? 'WIN64' : 'WIN32'
elif host_platform == 'linux'
ident_platform = is_64bit ? 'LIN64' : 'LIN32'
elif host_platform == 'darwin'
ident_platform = host_arch == 'aarch64' ? 'MACOSARM' : 'MACOSX'
else
ident_platform = 'UNKNOWN'
endif
project_deps = []
data_files = []
powder_deps = []
project_export_dynamic = false
subdir('src')
subdir('resources')
powder_files += data_files
render_files += data_files
font_files += data_files
if host_platform == 'emscripten'
project_link_args += [
'-o', app_exe + '.js', # so we get a .wasm, and a .js
]
endif
if get_option('export_lua_symbols')
if is_static and lua_variant != 'none' and not project_export_dynamic
if host_platform == 'windows'
error('Lua symbols are currently impossible to export correctly on Windows')
elif c_compiler.has_link_argument('-Wl,--export-dynamic-symbol')
project_link_args += [
'-Wl,--export-dynamic-symbol=lua_*',
'-Wl,--export-dynamic-symbol=luaL_*',
'-Wl,--export-dynamic-symbol=luaopen_*',
]
else
warning('your linker does not support -Wl,--export-dynamic-symbol so Meson will be instructed to export all symbols in order to enable loading Lua shared modules, which may blow up the size of the resulting binary')
project_export_dynamic = true
endif
endif
endif
if get_option('build_powder')
powder_deps += project_deps + [
threads_dep,
zlib_dep,
png_dep,
sdl2_dep,
lua_dep,
curl_dep,
fftw_dep,
bzip2_dep,
json_dep,
]
if host_platform == 'android'
powder_sha = shared_library(
app_exe,
sources: powder_files,
include_directories: project_inc,
c_args: project_c_args,
cpp_args: project_cpp_args,
link_args: project_link_args,
dependencies: powder_deps,
)
subdir('android')
else
executable(
app_exe,
sources: powder_files,
include_directories: project_inc,
c_args: project_c_args,
cpp_args: project_cpp_args,
win_subsystem: is_debug ? 'console' : 'windows',
link_args: project_link_args,
dependencies: powder_deps,
export_dynamic: project_export_dynamic,
install: true,
)
endif
endif
if get_option('build_render')
if host_platform == 'emscripten'
error('render does not target emscripten')
endif
render_deps = project_deps + [
threads_dep,
zlib_dep,
bzip2_dep,
json_dep,
png_dep,
]
render_link_args = project_link_args
if host_platform == 'linux' and is_static
render_link_args += [ '-static' ]
endif
executable(
'render',
sources: render_files,
include_directories: project_inc,
c_args: project_c_args,
cpp_args: project_cpp_args,
link_args: render_link_args,
dependencies: render_deps,
export_dynamic: project_export_dynamic,
)
endif
if get_option('build_font')
if host_platform == 'emscripten'
error('font does not target emscripten')
endif
font_deps = project_deps + [
threads_dep,
zlib_dep,
png_dep,
sdl2_dep,
bzip2_dep,
json_dep,
]
executable(
'font',
sources: font_files,
include_directories: project_inc,
c_args: project_c_args,
cpp_args: project_cpp_args,
link_args: project_link_args,
dependencies: font_deps,
export_dynamic: project_export_dynamic,
)
endif

View File

@ -1,313 +0,0 @@
option(
'static',
type: 'combo',
choices: [ 'none', 'system', 'prebuilt' ],
value: 'none',
description: 'Build statically using libraries present on the system (\'system\') or using prebuilt libraries official builds use (\'prebuilt\')'
)
option(
'beta',
type: 'boolean',
value: false,
description: 'Beta build'
)
option(
'ignore_updates',
type: 'boolean',
value: true,
description: 'Don\'t show notifications about available updates'
)
option(
'can_install',
type: 'combo',
choices: [ 'no', 'yes', 'yes_check', 'auto' ],
value: 'auto',
description: 'Disable (\'no\') or enable (\'yes\') setting up file and URL associations, or even offer to do it at startup (\'yes_check\')'
)
option(
'http',
type: 'boolean',
value: true,
description: 'Enable HTTP via libcurl'
)
option(
'snapshot',
type: 'boolean',
value: false,
description: 'Snapshot build'
)
option(
'display_version_major',
type: 'integer',
min: 0,
value: 98,
description: 'Major component of the display version, should more or less map to the MINOR version in semantic versioning'
)
option(
'display_version_minor',
type: 'integer',
min: 0,
value: 2,
description: 'Minor component of the display version, should more or less map to the PATCH version in semantic versioning'
)
option(
'build_num',
type: 'integer',
min: 0,
value: 365,
description: 'Build number, should be strictly monotonously increasing across public releases'
)
option(
'upstream_version_major',
type: 'integer',
min: 0,
value: 98,
description: 'Major component of the upstream display version, mod owners should not change this but merge upstream changes to it'
)
option(
'upstream_version_minor',
type: 'integer',
min: 0,
value: 2,
description: 'Minor component of the upstream display version, mod owners should not change this but merge upstream changes to it'
)
option(
'upstream_build_num',
type: 'integer',
min: 0,
value: 365,
description: 'Upstream build number, mod owners should not change this but merge upstream changes to it'
)
option(
'mod_id',
type: 'integer',
min: 0,
value: 0,
description: 'Mod ID, used on the https://starcatcher.us/TPT build server, the build server will compile for all platforms for you and send updates in-game, see jacob1 to get a mod ID'
)
option(
'lua',
type: 'combo',
choices: [ 'none', 'lua5.1', 'lua5.2', 'luajit', 'auto' ],
value: 'auto',
description: 'Lua library to use'
)
option(
'x86_sse',
type: 'combo',
choices: [ 'none', 'sse', 'sse2', 'sse3', 'auto' ],
value: 'auto',
description: 'Enable SSE (available only on x86)'
)
option(
'build_powder',
type: 'boolean',
value: true,
description: 'Build the game'
)
option(
'build_render',
type: 'boolean',
value: false,
description: 'Build the thumbnail renderer'
)
option(
'build_font',
type: 'boolean',
value: false,
description: 'Build the font editor'
)
option(
'server',
type: 'string',
value: 'powdertoy.co.uk',
description: 'Simulation server'
)
option(
'static_server',
type: 'string',
value: 'static.powdertoy.co.uk',
description: 'Static simulation server'
)
option(
'update_server',
type: 'string',
value: '',
description: 'Update server, only used by snapshots and mods, see \'snapshot\' and \'mod_id\''
)
option(
'workaround_noncpp_lua',
type: 'boolean',
value: false,
description: 'Allow linking against a non-C++ system Lua'
)
option(
'workaround_elusive_bzip2',
type: 'boolean',
value: true,
description: 'acquire bzip2 dependency with find_library'
)
option(
'workaround_elusive_bzip2_lib_name',
type: 'string',
value: 'bz2',
description: 'bzip2 library name, see \'workaround_elusive_bzip2\''
)
option(
'workaround_elusive_bzip2_lib_dir',
type: 'string',
value: '/usr/lib/x86_64-linux-gnu',
description: 'bzip2 library directory, see \'workaround_elusive_bzip2\''
)
option(
'workaround_elusive_bzip2_include_name',
type: 'string',
value: 'bzlib.h',
description: 'bzip2 header name, see \'workaround_elusive_bzip2\''
)
option(
'workaround_elusive_bzip2_include_dir',
type: 'string',
value: '/usr/include',
description: 'bzip2 header directory, see \'workaround_elusive_bzip2\''
)
option(
'workaround_elusive_bzip2_static',
type: 'boolean',
value: false,
description: 'bzip2 static setting, see \'workaround_elusive_bzip2\''
)
option(
'tpt_libs_vtag',
type: 'string',
value: '',
description: 'tpt-libs vtag override, only used for tpt-libs development'
)
option(
'android_keystore',
type: 'string',
value: '',
description: 'Path to Java keystore for signing an APK, only used for Android development'
)
option(
'android_keyalias',
type: 'string',
value: 'androidkey',
description: 'Signing key alias for signing an APK, only used for Android development'
)
option(
'app_name',
type: 'string',
value: 'The Powder Toy',
description: 'App name, used for desktop integration and the window title, change if you work on a mod'
)
option(
'app_comment',
type: 'string',
value: 'Physics sandbox game',
description: 'App comment, used for desktop integration, change if you work on a mod'
)
option(
'app_exe',
type: 'string',
value: 'powder',
description: 'App executable name, used for desktop integration, change if you work on a mod'
)
option(
'app_id',
type: 'string',
value: 'uk.co.powdertoy.tpt',
description: 'App ID, a D-Bus well-known name, used for desktop integration, change if you work on a mod'
)
option(
'app_data',
type: 'string',
value: 'The Powder Toy',
description: 'App data directory name, do not change even if you work on a mod, only if you know what you are doing'
)
option(
'app_vendor',
type: 'string',
value: 'powdertoy',
description: 'App vendor prefix, used for desktop integration, do not change even if you work on a mod, only if you know what you are doing'
)
option(
'enforce_https',
type: 'boolean',
value: true,
description: 'Enforce encrypted HTTP traffic, may be disabled for debugging'
)
option(
'secure_ciphers_only',
type: 'boolean',
value: false,
description: 'Use only secure ciphers for encrypted HTTP traffic, please review cipher list before enabling'
)
option(
'prepare',
type: 'boolean',
value: false,
description: 'Used by ghactions workflows, not useful otherwise'
)
option(
'render_icons_with_inkscape',
type: 'feature',
value: 'disabled',
description: 'Render icons with Inkscape (inkscape binary needs to be in PATH)'
)
option(
'resolve_vcs_tag',
type: 'combo',
choices: [ 'no', 'static_release_only', 'yes' ],
value: 'static_release_only',
description: 'Enable VCS tag resolution, introduces an always-stale custom target'
)
option(
'manifest_copyright',
type: 'string',
value: 'Copyright © 2008-2011 Stanislaw K Skowrenek, Copyright © 2011-2023 Simon Robertshaw, Copyright © 2016-2023 jacob1',
description: 'Copyright string, don\'t take too seriously, subject to change'
)
option(
'manifest_macos_min_ver',
type: 'string',
value: '',
description: 'MacOS minimum allowed platform version string, used by ghactions workflows, not useful otherwise'
)
option(
'manifest_date',
type: 'string',
value: '',
description: 'Build date string, used by ghactions workflows, not useful otherwise'
)
option(
'platform_clipboard',
type: 'boolean',
value: true,
description: 'Enable platform clipboard, allows copying simulation data between different windows'
)
option(
'use_bluescreen',
type: 'combo',
choices: [ 'no', 'yes', 'auto' ],
value: 'auto',
description: 'Show blue error screen upon unhandled signals and exceptions'
)
option(
'windows_icons',
type: 'boolean',
value: true,
description: 'Add icon resources to the executable on Windows'
)
option(
'windows_utf8cp',
type: 'boolean',
value: true,
description: 'Ask Windows nicely for UTF-8 as the codepage'
)
option(
'export_lua_symbols',
type: 'boolean',
value: false,
description: 'Export Lua symbols to enable loading of Lua shared modules'
)

77
newelement.py Executable file
View File

@ -0,0 +1,77 @@
#!/usr/bin/env python3
import sys
import re
if len(sys.argv) != 2:
name = input('element name: ')
else:
name = sys.argv[1]
if re.search('[^A-Z0-9-]', name):
sys.exit('element names should only contain uppercase letters, digits and hyphens (you can change the Name property of the element to whatever later though, which is what shows up in menus)')
path = 'src/simulation/elements/' + name + '.cpp'
def get_elements():
elements = dict()
with open('src/simulation/ElementNumbers.h', 'r') as numbers:
for nm, pt in re.findall('ELEMENT_DEFINE\\s*\\(\\s*(\\S+)\\s*,\\s*(\\d+)\\s*\\)', numbers.read()):
elements[nm] = int(pt)
return elements
elements = get_elements()
if name in elements:
sys.exit('element already exists')
max_id = 0
for nm, pt in elements.items():
pt_id = int(pt)
if max_id < pt_id:
max_id = pt_id
new_id = max_id + 1
with open(path, 'w') as elem:
elem.write(r"""#include "simulation/ElementCommon.h"
static int update(UPDATE_FUNC_ARGS);
static int graphics(GRAPHICS_FUNC_ARGS);
void Element::Element_{0}()
{{
Identifier = "DEFAULT_PT_{0}";
Name = "{0}";
Colour = PIXPACK(0xFFFFFF);
MenuVisible = 1;
MenuSection = SC_SPECIAL;
Enabled = 1;
// element properties here
Update = &update;
Graphics = &graphics;
}}
static int update(UPDATE_FUNC_ARGS)
{{
// update code here
return 0;
}}
static int graphics(GRAPHICS_FUNC_ARGS)
{{
// graphics code here
// return 1 if nothing dymanic happens here
return 0;
}}
""".format(name))
elem.close()
print('element file \'{0}\' successfully created '.format(path))
input('now add \'ELEMENT_DEFINE({0}, {1});\' to \'src/simulation/ElementNumbers.h\', then press enter'.format(name, str(new_id)))
while True:
elements = get_elements()
if name in elements and elements[name] == new_id:
break
input('nope; try doing that again, then press enter')

View File

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>ptsave</string>
</array>
<key>CFBundleURLName</key>
<string>Powder Toy Save URL</string>
</dict>
</array>
<key>CFBundleName</key>
<string>@APPNAME@</string>
<key>CFBundleIconFile</key>
<string>icon_exe.icns</string>
<key>NSHumanReadableCopyright</key>
<string>@MANIFEST_COPYRIGHT@</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>stm</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icon_cps.icns</string>
<key>CFBundleTypeName</key>
<string>Powder Toy Save</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>cps</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icon_cps.icns</string>
<key>CFBundleTypeName</key>
<string>Powder Toy Stamp</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>@APPEXE@</string>
<key>CFBundleIdentifier</key>
<string>@APPID@</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>@DISPLAY_VERSION_MAJOR@.@DISPLAY_VERSION_MINOR@</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>@DISPLAY_VERSION_MAJOR@.@DISPLAY_VERSION_MINOR@ (build @BUILD_NUM@)</string>
<key>LSMinimumSystemVersion</key>
<string>@MANIFEST_MACOS_MIN_VER@</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>

View File

@ -1,137 +0,0 @@
#include <cstdint>
#include <cstring>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
static void writeU32LE(uint8_t *dest, uint32_t value)
{
dest[0] = uint8_t( value & 0xFF);
dest[1] = uint8_t((value >> 8) & 0xFF);
dest[2] = uint8_t((value >> 16) & 0xFF);
dest[3] = uint8_t((value >> 24) & 0xFF);
}
static uint32_t readU32BE(const uint8_t *src)
{
return uint32_t(src[3]) |
(uint32_t(src[2]) << 8) |
(uint32_t(src[1]) << 16) |
(uint32_t(src[0]) << 24);
}
int main(int argc, char *argv[])
{
if (argc < 3)
{
std::cerr << "usage: " << argv[0] << " OUTPUT INPUT..." << std::endl;
exit(1);
}
auto images = argc - 2;
if (images > 255)
{
std::cerr << "too many images specified" << std::endl;
exit(1);
}
std::string outputPath = argv[1];
std::ofstream output(outputPath, std::ios::binary);
auto outputFailure = [&outputPath](std::string action) {
std::cerr << "failed to " << action << " " << outputPath << ": " << strerror(errno) << std::endl;
exit(1);
};
if (!output)
{
outputFailure("open");
}
std::vector<char> header(6 + images * 16, 0);
auto writeHeader = [&header, &output, &outputFailure]() {
output.seekp(0, std::ios_base::beg);
output.write(&header[0], header.size());
if (!output)
{
outputFailure("write");
}
};
writeHeader(); // make space for header
auto *headerU8 = reinterpret_cast<uint8_t *>(&header[0]);
headerU8[2] = 1;
headerU8[4] = images;
for (auto image = 0; image < images; ++image)
{
std::string inputPath = argv[2 + image];
std::ifstream input(inputPath, std::ios::binary);
auto inputFailure = [&inputPath](std::string action) {
std::cerr << "failed to " << action << " " << inputPath << ": " << strerror(errno) << std::endl;
exit(1);
};
auto imageFailure = [&inputPath](std::string failure) {
std::cerr << "failed to process " << inputPath << ": " << failure << std::endl;
exit(1);
};
if (!input)
{
inputFailure("open");
}
std::vector<char> buf;
input.seekg(0, std::ios_base::end);
buf.resize(input.tellg());
input.seekg(0, std::ios_base::beg);
input.read(&buf[0], buf.size());
if (!input)
{
inputFailure("read");
}
auto *bufU8 = reinterpret_cast<uint8_t *>(&buf[0]);
if (buf.size() < 0x21 ||
readU32BE(&bufU8[0]) != UINT32_C(0x89504E47) ||
readU32BE(&bufU8[4]) != UINT32_C(0x0D0A1A0A) ||
bufU8[0x18] != 8 ||
bufU8[0x19] != 6)
{
imageFailure("not a 32bpp RGBA PNG");
}
auto writeOffset = output.tellp();
output.write(&buf[0], buf.size());
if (!output)
{
outputFailure("write");
}
auto width = readU32BE(&bufU8[0x10]);
auto height = readU32BE(&bufU8[0x14]);
if (width == 256)
{
width = 0;
}
if (width > 255)
{
imageFailure("width exceeds U8 limit");
}
if (height == 256)
{
height = 0;
}
if (height > 255)
{
imageFailure("height exceeds U8 limit");
}
auto *entryU8 = headerU8 + 6 + image * 16;
entryU8[0] = width;
entryU8[1] = height;
entryU8[4] = 1;
entryU8[6] = 32;
if (buf.size() > UINT32_MAX)
{
imageFailure("data size exceeds U32 limit");
}
writeU32LE(&entryU8[8], uint32_t(buf.size()));
if (writeOffset > UINT32_MAX)
{
std::cerr << "output data size exceeds U32 limit" << std::endl;
exit(1);
}
writeU32LE(&entryU8[12], uint32_t(writeOffset));
}
writeHeader(); // actually write it out
return 0;
}

View File

@ -1,52 +0,0 @@
#include <fstream>
int main(int argc, char *argv[])
{
if (argc != 5)
{
return 1;
}
auto *outputCppPath = argv[1];
auto *outputHPath = argv[2];
auto *inputAnyPath = argv[3];
auto *symbolName = argv[4];
std::ifstream inputAny(inputAnyPath, std::ios::binary);
std::ofstream outputCpp(outputCppPath);
if (!outputCpp)
{
return 2;
}
outputCpp << "#include \"" << outputHPath << "\"\nconst unsigned char " << symbolName << "[] = { ";
auto dataLen = 0U;
while (true)
{
char ch;
inputAny.read(&ch, 1);
if (inputAny.eof())
{
break;
}
if (!inputAny)
{
return 3;
}
outputCpp << (unsigned int)(unsigned char)(ch) << ", ";
dataLen += 1;
}
outputCpp << " }; const unsigned int " << symbolName << "_size = " << dataLen << ";\n";
if (!outputCpp)
{
return 4;
}
std::ofstream outputH(outputHPath);
if (!outputH)
{
return 5;
}
outputH << "#pragma once\nextern const unsigned char " << symbolName << "[]; extern const unsigned int " << symbolName << "_size;\n";
if (!outputH)
{
return 6;
}
return 0;
}

View File

@ -1,34 +0,0 @@
<?xml version="1.0"?>
<component type="desktop">
<id>@APPID@</id>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-3.0</project_license>
<name>@APPNAME@</name>
<summary>@APPCOMMENT@</summary>
<content_rating type="oars-1.1">
<content_attribute id="social-chat">moderate</content_attribute>
</content_rating>
<launchable type="desktop-id">@APPID@.desktop</launchable>
<description>
<p>
Have you ever wanted to blow something up? Or maybe you always dreamt of operating an atomic power plant? Do you have a will to develop your own CPU? The Powder Toy lets you to do all of these, and even more!
</p>
<p>
The Powder Toy is a free physics sandbox game, which simulates air pressure and velocity, heat, gravity and a countless number of interactions between different substances! The game provides you with various building materials, liquids, gases and electronic components which can be used to construct complex machines, guns, bombs, realistic terrains and almost anything else. You can then mine them and watch cool explosions, add intricate wirings, play with little stickmen or operate your machine. You can browse and play thousands of different saves made by the community or upload your own we welcome your creations!
</p>
<p>
There is a Lua API you can automate your work or even make plugins for the game. The Powder Toy is free and the source code is distributed under the GNU General Public License, so you can modify the game yourself or help with development.
</p>
</description>
<screenshots>
<screenshot>
<image>https://powdertoy.co.uk/Themes/Next/Design/Images/Screen2.png</image>
</screenshot>
</screenshots>
<url type="homepage">https://powdertoy.co.uk/</url>
<url type="bugtracker">https://github.com/The-Powder-Toy/The-Powder-Toy/issues</url>
<url type="help">https://powdertoy.co.uk/Wiki/W/Main_Page.html</url>
<releases>
<release date="@MANIFEST_DATE@" version="@DISPLAY_VERSION_MAJOR@.@DISPLAY_VERSION_MINOR@.@BUILD_NUM@" />
</releases>
</component>

BIN
resources/document.icns Normal file

Binary file not shown.

BIN
resources/document.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

View File

@ -1,9 +0,0 @@
We keep these icons here to make it possible to build TPT without Inkscape. If
you have Inkscape and want to change the game's icons, edit the SVGs in the
parent directory and configure your build sites with
`-Drender_icons_with_inkscape=true`.
The GitHub Actions workflows currently do not use Inkscape and use these icons
instead, so once you are satisfied with the state of the SVGs, replace these
icons with the ones in your build site in the same subdirectory and make a new
commit.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 644 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

BIN
resources/icon.icns Executable file

Binary file not shown.

BIN
resources/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

View File

@ -0,0 +1,16 @@
import sys
from PIL import Image
image = Image.open(sys.argv[1])
output = ""
formatted = []
for pixel in image.getdata():
formatted.extend("0x{0:02X}".format(byte) for byte in pixel)
for i in range(len(formatted)/16 + 1):
print(", ".join(formatted[i*16:(i+1)*16]) + ",")
"""with open(sys.argv[1], "rb") as icon:
icondata = icon.read()
output = ["0x{0:02X}".format(ord(byte)) for byte in icondata]
for line in range(len(output)/16+1):
print(", ".join(output[line*16:(line+1)*16])+",")"""

Binary file not shown.

View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1024"
height="1024"
viewBox="0 0 270.93334 270.93333"
version="1.1"
id="svg8"
inkscape:version="0.91 r13725"
sodipodi:docname="icon_pile_gradient.svg"
inkscape:export-filename="/home/lbphacker/temp/tpt-logo/icon_circle.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient5602">
<stop
style="stop-color:#ff7a4c;stop-opacity:1"
offset="0"
id="stop5604" />
<stop
style="stop-color:#ffff4a;stop-opacity:1"
offset="1"
id="stop5606" />
</linearGradient>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter5229"
x="-0.099935167"
width="1.1998703"
y="-0.091193162"
height="1.1823863">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="7.6262206"
id="feGaussianBlur5231" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5602"
id="linearGradient5608"
x1="623.16376"
y1="313.71109"
x2="835.82587"
y2="100.99124"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="0.3535534"
inkscape:cx="218.91161"
inkscape:cy="713.0457"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1366"
inkscape:window-height="705"
inkscape:window-x="-4"
inkscape:window-y="-4"
inkscape:window-maximized="1"
inkscape:snap-global="false"
showguides="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-bottom="0"
fit-margin-right="0" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-594.1217,-81.893738)">
<g
id="g5610">
<path
transform="matrix(1.1416809,0,0,1.1416809,-103.36921,-12.109215)"
inkscape:connector-curvature="0"
id="path950"
d="m 729.5891,100.64025 a 6.8536343,6.8536343 0 0 0 -6.8539,6.85333 6.8536343,6.8536343 0 0 0 6.8539,6.85384 6.8536343,6.8536343 0 0 0 6.8533,-6.85384 6.8536343,6.8536343 0 0 0 -6.8533,-6.85333 z m 0,27.34045 c -3.7851,0 -6.8534,3.06823 -6.8534,6.85333 l 0,14.43478 c 0,3.78508 3.0683,6.85384 6.8534,6.85384 3.7851,0 6.8538,-3.06876 6.8538,-6.85384 l 0,-14.43478 c 0,-3.7851 -3.0687,-6.85333 -6.8538,-6.85333 z m 26.5585,18.38389 a 6.8536343,6.8536343 0 0 0 -6.8538,6.85384 6.8536343,6.8536343 0 0 0 6.8538,6.85333 6.8536343,6.8536343 0 0 0 6.8539,-6.85333 6.8536343,6.8536343 0 0 0 -6.8539,-6.85384 z m -62.3124,22.72367 a 6.8536343,6.8536343 0 0 0 -6.8539,6.85333 6.8536343,6.8536343 0 0 0 6.8539,6.85385 6.8536343,6.8536343 0 0 0 6.8538,-6.85385 6.8536343,6.8536343 0 0 0 -6.8538,-6.85333 z m 35.7544,0.66715 a 6.8536343,6.8536343 0 0 0 -6.8539,6.85384 6.8536343,6.8536343 0 0 0 6.8539,6.85385 6.8536343,6.8536343 0 0 0 6.8533,-6.85385 6.8536343,6.8536343 0 0 0 -6.8533,-6.85384 z m -0.1886,27.342 c -3.3028,0.0484 -6.4566,1.38153 -8.7928,3.71656 l -78.8505,78.85152 c -7.9961,8.00073 -2.3327,21.6754 8.9788,21.67982 l 157.7032,0 c 11.312,-0.003 16.9767,-13.67855 8.9802,-21.67982 l -78.8515,-78.85152 c -2.4281,-2.42693 -5.7354,-3.76761 -9.168,-3.71656 z m 0.7482,8.51369 0,0 c 0.4485,0 0.8969,0.044 1.3385,0.13074 1.4334,0.202 2.8158,0.85351 3.9181,1.95595 l 74.9995,74.99956 c 2.6995,2.6994 2.6995,7.07622 0,9.77563 -2.699,2.69939 -7.0755,2.69939 -9.7751,0 l -70.3275,-70.32749 -11.8003,11.80031 c -2.6993,2.69937 -7.076,2.6993 -9.7756,0 -2.6992,-2.69951 -2.6988,-7.07626 0,-9.77563 l 16.5344,-16.53439 c 1.3498,-1.34968 3.1186,-2.02467 4.8875,-2.02468 z m 55.2437,1.29294 a 6.8536343,6.8536343 0 0 0 -6.8533,6.85385 6.8536343,6.8536343 0 0 0 6.8533,6.85333 6.8536343,6.8536343 0 0 0 6.8538,-6.85333 6.8536343,6.8536343 0 0 0 -6.8538,-6.85385 z m -115.8803,12.52999 a 6.8536343,6.8536343 0 0 0 -6.8538,6.85384 6.8536343,6.8536343 0 0 0 6.8538,6.85333 6.8536343,6.8536343 0 0 0 6.8534,-6.85333 6.8536343,6.8536343 0 0 0 -6.8534,-6.85384 z m 27.0614,18.73839 a 6.8536343,6.8536343 0 0 1 6.8534,6.85333 6.8536343,6.8536343 0 0 1 -6.8534,6.85384 6.8536343,6.8536343 0 0 1 -6.8538,-6.85384 6.8536343,6.8536343 0 0 1 6.8538,-6.85333 z m -27.4784,26.01701 a 6.8536343,6.8536343 0 0 1 6.8538,6.85333 6.8536343,6.8536343 0 0 1 -6.8538,6.85385 6.8536343,6.8536343 0 0 1 -6.8533,-6.85385 6.8536343,6.8536343 0 0 1 6.8533,-6.85333 z"
style="opacity:0.90700001;fill:#000000;fill-opacity:1;stroke:none;stroke-width:13.70695019;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5229)" />
<path
style="opacity:1;fill:url(#linearGradient5608);fill-opacity:1;stroke:#4d361f;stroke-width:3.96875027;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-rule:nonzero"
d="m 729.58874,102.78984 a 7.8246635,7.8246635 0 0 0 -7.82496,7.82432 7.8246635,7.8246635 0 0 0 7.82496,7.82489 7.8246635,7.8246635 0 0 0 7.82429,-7.82489 7.8246635,7.8246635 0 0 0 -7.82429,-7.82432 z m 0,31.21407 c -4.32137,0 -7.82439,3.50293 -7.82439,7.82431 l 0,16.47992 c 0,4.32136 3.50302,7.8249 7.82439,7.8249 4.32138,0 7.82486,-3.50354 7.82486,-7.8249 l 0,-16.47992 c 0,-4.32138 -3.50348,-7.82431 -7.82486,-7.82431 z m 30.32135,20.98853 a 7.8246635,7.8246635 0 0 0 -7.82486,7.82491 7.8246635,7.8246635 0 0 0 7.82486,7.82431 7.8246635,7.8246635 0 0 0 7.82496,-7.82431 7.8246635,7.8246635 0 0 0 -7.82496,-7.82491 z m -71.14088,25.94318 a 7.8246635,7.8246635 0 0 0 -7.82497,7.82432 7.8246635,7.8246635 0 0 0 7.82497,7.82491 7.8246635,7.8246635 0 0 0 7.82485,-7.82491 7.8246635,7.8246635 0 0 0 -7.82485,-7.82432 z m 40.82011,0.76168 a 7.8246635,7.8246635 0 0 0 -7.82497,7.82489 7.8246635,7.8246635 0 0 0 7.82497,7.82492 7.8246635,7.8246635 0 0 0 7.82428,-7.82492 7.8246635,7.8246635 0 0 0 -7.82428,-7.82489 z m -0.21533,31.21584 c -3.77074,0.0553 -7.37137,1.57726 -10.03856,4.24312 l -90.02211,90.02327 c -9.129,9.1343 -2.6632,24.7464 10.25092,24.75145 l 180.04673,0 c 12.91469,-0.004 19.38198,-15.61654 10.25253,-24.75145 l -90.02326,-90.02327 c -2.77211,-2.77078 -6.54799,-4.30141 -10.46693,-4.24312 z m 0.85421,9.71992 0,0 c 0.51205,0 1.02398,0.0503 1.52815,0.14926 1.63648,0.23062 3.21474,0.97444 4.47322,2.23307 l 85.62549,85.62556 c 3.08197,3.08186 3.08197,8.07879 0,11.16066 -3.0814,3.08183 -8.07797,3.08183 -11.16005,0 l -80.29156,-80.29155 -13.47218,13.47219 c -3.08173,3.08181 -8.07853,3.08173 -11.16061,0 -3.08163,-3.08199 -3.08117,-8.07884 0,-11.16066 l 18.877,-18.87699 c 1.54104,-1.5409 3.56045,-2.31153 5.57997,-2.31154 z m 63.07068,1.47613 a 7.8246635,7.8246635 0 0 0 -7.82428,7.8249 7.8246635,7.8246635 0 0 0 7.82428,7.82432 7.8246635,7.8246635 0 0 0 7.82486,-7.82432 7.8246635,7.8246635 0 0 0 -7.82486,-7.8249 z m -132.29832,14.30524 a 7.8246635,7.8246635 0 0 0 -7.82486,7.8249 7.8246635,7.8246635 0 0 0 7.82486,7.82432 7.8246635,7.8246635 0 0 0 7.82439,-7.82432 7.8246635,7.8246635 0 0 0 -7.82439,-7.8249 z m 30.89547,21.39326 a 7.8246635,7.8246635 0 0 1 7.8244,7.82432 7.8246635,7.8246635 0 0 1 -7.8244,7.8249 7.8246635,7.8246635 0 0 1 -7.82484,-7.8249 7.8246635,7.8246635 0 0 1 7.82484,-7.82432 z m -31.37155,29.70312 a 7.8246635,7.8246635 0 0 1 7.82484,7.82432 7.8246635,7.8246635 0 0 1 -7.82484,7.82491 7.8246635,7.8246635 0 0 1 -7.82428,-7.82491 7.8246635,7.8246635 0 0 1 7.82428,-7.82432 z"
id="path952"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1024"
height="1024"
viewBox="0 0 270.93334 270.93333"
version="1.1"
id="svg8"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="icon_circle.svg"
inkscape:export-filename="/home/lbphacker/temp/tpt-logo/icon_circle.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2">
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter5229"
x="-0.099935167"
width="1.1998703"
y="-0.091193162"
height="1.1823863">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="7.6262206"
id="feGaussianBlur5231" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="0.66"
inkscape:cx="328.01066"
inkscape:cy="553.26531"
inkscape:document-units="px"
inkscape:current-layer="g986"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="982"
inkscape:window-x="0"
inkscape:window-y="24"
inkscape:window-maximized="1"
inkscape:snap-global="false"
showguides="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-bottom="0"
fit-margin-right="0" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-594.1217,-81.893738)">
<g
id="g986">
<circle
r="135.46667"
cy="217.36041"
cx="729.58838"
id="circle948"
style="opacity:1;fill:#ffd090;fill-opacity:1;stroke:none;stroke-width:1.74795687;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.91722511,0,0,0.91722511,60.391628,16.637154)"
inkscape:connector-curvature="0"
id="path950"
d="m 729.5891,100.64025 a 6.8536343,6.8536343 0 0 0 -6.8539,6.85333 6.8536343,6.8536343 0 0 0 6.8539,6.85384 6.8536343,6.8536343 0 0 0 6.8533,-6.85384 6.8536343,6.8536343 0 0 0 -6.8533,-6.85333 z m 0,27.34045 c -3.7851,0 -6.8534,3.06823 -6.8534,6.85333 v 14.43478 c 0,3.78508 3.0683,6.85384 6.8534,6.85384 3.7851,0 6.8538,-3.06876 6.8538,-6.85384 v -14.43478 c 0,-3.7851 -3.0687,-6.85333 -6.8538,-6.85333 z m 26.5585,18.38389 a 6.8536343,6.8536343 0 0 0 -6.8538,6.85384 6.8536343,6.8536343 0 0 0 6.8538,6.85333 6.8536343,6.8536343 0 0 0 6.8539,-6.85333 6.8536343,6.8536343 0 0 0 -6.8539,-6.85384 z m -62.3124,22.72367 a 6.8536343,6.8536343 0 0 0 -6.8539,6.85333 6.8536343,6.8536343 0 0 0 6.8539,6.85385 6.8536343,6.8536343 0 0 0 6.8538,-6.85385 6.8536343,6.8536343 0 0 0 -6.8538,-6.85333 z m 35.7544,0.66715 a 6.8536343,6.8536343 0 0 0 -6.8539,6.85384 6.8536343,6.8536343 0 0 0 6.8539,6.85385 6.8536343,6.8536343 0 0 0 6.8533,-6.85385 6.8536343,6.8536343 0 0 0 -6.8533,-6.85384 z m -0.1886,27.342 c -3.3028,0.0484 -6.4566,1.38153 -8.7928,3.71656 l -78.8505,78.85152 c -7.9961,8.00073 -2.3327,21.6754 8.9788,21.67982 h 157.7032 c 11.312,-0.003 16.9767,-13.67855 8.9802,-21.67982 l -78.8515,-78.85152 c -2.4281,-2.42693 -5.7354,-3.76761 -9.168,-3.71656 z m 0.7482,8.51369 v 0 c 0.4485,0 0.8969,0.044 1.3385,0.13074 1.4334,0.202 2.8158,0.85351 3.9181,1.95595 l 74.9995,74.99956 c 2.6995,2.6994 2.6995,7.07622 0,9.77563 -2.699,2.69939 -7.0755,2.69939 -9.7751,0 l -70.3275,-70.32749 -11.8003,11.80031 c -2.6993,2.69937 -7.076,2.6993 -9.7756,0 -2.6992,-2.69951 -2.6988,-7.07626 0,-9.77563 l 16.5344,-16.53439 c 1.3498,-1.34968 3.1186,-2.02467 4.8875,-2.02468 z m 55.2437,1.29294 a 6.8536343,6.8536343 0 0 0 -6.8533,6.85385 6.8536343,6.8536343 0 0 0 6.8533,6.85333 6.8536343,6.8536343 0 0 0 6.8538,-6.85333 6.8536343,6.8536343 0 0 0 -6.8538,-6.85385 z m -115.8803,12.52999 a 6.8536343,6.8536343 0 0 0 -6.8538,6.85384 6.8536343,6.8536343 0 0 0 6.8538,6.85333 6.8536343,6.8536343 0 0 0 6.8534,-6.85333 6.8536343,6.8536343 0 0 0 -6.8534,-6.85384 z m 27.0614,18.73839 a 6.8536343,6.8536343 0 0 1 6.8534,6.85333 6.8536343,6.8536343 0 0 1 -6.8534,6.85384 6.8536343,6.8536343 0 0 1 -6.8538,-6.85384 6.8536343,6.8536343 0 0 1 6.8538,-6.85333 z m -27.4784,26.01701 a 6.8536343,6.8536343 0 0 1 6.8538,6.85333 6.8536343,6.8536343 0 0 1 -6.8538,6.85385 6.8536343,6.8536343 0 0 1 -6.8533,-6.85385 6.8536343,6.8536343 0 0 1 6.8533,-6.85333 z"
style="opacity:0.90700001;fill:#000000;fill-opacity:1;stroke:none;stroke-width:13.70695019;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5229)" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:12.57235909;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 729.58907,108.94692 a 6.2863255,6.2863255 0 0 0 -6.28657,6.28605 6.2863255,6.2863255 0 0 0 6.28657,6.28651 6.2863255,6.2863255 0 0 0 6.28602,-6.28651 6.2863255,6.2863255 0 0 0 -6.28602,-6.28605 z m 0,25.07735 c -3.47179,0 -6.28611,2.81425 -6.28611,6.28604 v 13.23995 c 0,3.47177 2.81432,6.28651 6.28611,6.28651 3.47179,0 6.28648,-2.81474 6.28648,-6.28651 v -13.23995 c 0,-3.47179 -2.81469,-6.28604 -6.28648,-6.28604 z m 24.36013,16.86216 a 6.2863255,6.2863255 0 0 0 -6.28648,6.28652 6.2863255,6.2863255 0 0 0 6.28648,6.28604 6.2863255,6.2863255 0 0 0 6.28657,-6.28604 6.2863255,6.2863255 0 0 0 -6.28657,-6.28652 z m -57.1545,20.84272 a 6.2863255,6.2863255 0 0 0 -6.28657,6.28605 6.2863255,6.2863255 0 0 0 6.28657,6.28652 6.2863255,6.2863255 0 0 0 6.28648,-6.28652 6.2863255,6.2863255 0 0 0 -6.28648,-6.28605 z m 32.79483,0.61193 a 6.2863255,6.2863255 0 0 0 -6.28657,6.28651 6.2863255,6.2863255 0 0 0 6.28657,6.28653 6.2863255,6.2863255 0 0 0 6.28602,-6.28653 6.2863255,6.2863255 0 0 0 -6.28602,-6.28651 z m -0.17299,25.07877 c -3.02941,0.0444 -5.92215,1.26717 -8.06497,3.40892 l -72.32366,72.32459 c -7.33423,7.33848 -2.13961,19.88123 8.23558,19.88528 h 144.64933 c 10.37565,-0.003 15.57146,-12.54631 8.23687,-19.88528 l -72.32458,-72.32459 c -2.22711,-2.22604 -5.26065,-3.45575 -8.40912,-3.40892 z m 0.68627,7.80897 v 0 c 0.41138,0 0.82266,0.0404 1.22771,0.11992 1.31475,0.18528 2.58272,0.78286 3.59378,1.79404 l 68.79142,68.79148 c 2.47605,2.47596 2.47605,6.49049 0,8.96646 -2.47559,2.47594 -6.48983,2.47594 -8.96597,0 l -64.50615,-64.50614 -10.82353,10.82354 c -2.47586,2.47593 -6.49028,2.47586 -8.96642,0 -2.47578,-2.47606 -2.47541,-6.49053 0,-8.96646 l 15.16576,-15.16575 c 1.23807,-1.23796 2.86046,-1.85708 4.48294,-1.85709 z m 50.67091,1.18592 a 6.2863255,6.2863255 0 0 0 -6.28602,6.28652 6.2863255,6.2863255 0 0 0 6.28602,6.28605 6.2863255,6.2863255 0 0 0 6.28648,-6.28605 6.2863255,6.2863255 0 0 0 -6.28648,-6.28652 z M 674.4854,217.90756 a 6.2863255,6.2863255 0 0 0 -6.28648,6.28651 6.2863255,6.2863255 0 0 0 6.28648,6.28605 6.2863255,6.2863255 0 0 0 6.28611,-6.28605 6.2863255,6.2863255 0 0 0 -6.28611,-6.28651 z m 24.82139,17.18732 a 6.2863255,6.2863255 0 0 1 6.28611,6.28605 6.2863255,6.2863255 0 0 1 -6.28611,6.28651 6.2863255,6.2863255 0 0 1 -6.28647,-6.28651 6.2863255,6.2863255 0 0 1 6.28647,-6.28605 z m -25.20387,23.86345 a 6.2863255,6.2863255 0 0 1 6.28647,6.28605 6.2863255,6.2863255 0 0 1 -6.28647,6.28652 6.2863255,6.2863255 0 0 1 -6.28602,-6.28652 6.2863255,6.2863255 0 0 1 6.28602,-6.28605 z"
id="path952"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 255 KiB

View File

@ -1,533 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="64"
height="64"
viewBox="0 0 16.933331 16.933331"
version="1.1"
id="svg5"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="icon_exe.svg"
inkscape:export-filename="icon.png"
inkscape:export-xdpi="192"
inkscape:export-ydpi="192"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#ffffff"
inkscape:document-units="px"
showgrid="false"
inkscape:zoom="16.970563"
inkscape:cx="57.422963"
inkscape:cy="24.188945"
inkscape:window-width="1280"
inkscape:window-height="1054"
inkscape:window-x="1297"
inkscape:window-y="26"
inkscape:window-maximized="0"
inkscape:current-layer="layer7" /><defs
id="defs2"><linearGradient
id="linearGradient10317"><stop
style="stop-color:#f5ffff;stop-opacity:1;"
offset="0"
id="stop10311" /><stop
style="stop-color:#f5ffff;stop-opacity:1;"
offset="0.58129495"
id="stop10313" /><stop
style="stop-color:#f5ffff;stop-opacity:0;"
offset="1"
id="stop10315" /></linearGradient><linearGradient
id="linearGradient7451"><stop
style="stop-color:#f5ffff;stop-opacity:0.98309183;"
offset="0"
id="stop7445" /><stop
style="stop-color:#f5ffff;stop-opacity:0.65823293;"
offset="0.44851306"
id="stop7447" /><stop
style="stop-color:#f5ffff;stop-opacity:0;"
offset="1"
id="stop7449" /></linearGradient><linearGradient
id="linearGradient7331"><stop
style="stop-color:#f5ffff;stop-opacity:1;"
offset="0"
id="stop7325" /><stop
style="stop-color:#f5ffff;stop-opacity:1;"
offset="0.37253886"
id="stop7327" /><stop
style="stop-color:#f5ffff;stop-opacity:0;"
offset="1"
id="stop7329" /></linearGradient><linearGradient
id="linearGradient6957"><stop
style="stop-color:#f5ffff;stop-opacity:1;"
offset="0"
id="stop6951" /><stop
style="stop-color:#f5ffff;stop-opacity:1;"
offset="0.61608356"
id="stop6953" /><stop
style="stop-color:#f5ffff;stop-opacity:0;"
offset="1"
id="stop6955" /></linearGradient><linearGradient
id="linearGradient6573"><stop
style="stop-color:#f5ff08;stop-opacity:1;"
offset="0"
id="stop6567" /><stop
style="stop-color:#f5ff08;stop-opacity:0.823915;"
offset="0.62599742"
id="stop6569" /><stop
style="stop-color:#f5ff08;stop-opacity:0;"
offset="1"
id="stop6571" /></linearGradient><linearGradient
id="linearGradient6175"><stop
style="stop-color:#f5ff08;stop-opacity:0.47854495;"
offset="0"
id="stop6169" /><stop
style="stop-color:#f5ff08;stop-opacity:0.29862821;"
offset="0.67936534"
id="stop6171" /><stop
style="stop-color:#f5ff08;stop-opacity:0;"
offset="1"
id="stop6173" /></linearGradient><linearGradient
id="linearGradient5893"><stop
style="stop-color:#f5ff08;stop-opacity:0.71252441;"
offset="0"
id="stop5887" /><stop
style="stop-color:#f5ff08;stop-opacity:0.5904839;"
offset="0.67936534"
id="stop5889" /><stop
style="stop-color:#f5ff08;stop-opacity:0;"
offset="1"
id="stop5891" /></linearGradient><linearGradient
id="linearGradient5757"><stop
style="stop-color:#f5ff08;stop-opacity:1;"
offset="0"
id="stop5751" /><stop
style="stop-color:#f5ff08;stop-opacity:1;"
offset="0.75665909"
id="stop5753" /><stop
style="stop-color:#f5ff08;stop-opacity:0;"
offset="1"
id="stop5755" /></linearGradient><linearGradient
id="linearGradient5685"><stop
style="stop-color:#f5ff08;stop-opacity:1;"
offset="0"
id="stop5679" /><stop
style="stop-color:#f5ff08;stop-opacity:1;"
offset="0.63781762"
id="stop5681" /><stop
style="stop-color:#f5ff08;stop-opacity:0;"
offset="1"
id="stop5683" /></linearGradient><linearGradient
id="linearGradient5619"><stop
style="stop-color:#f5ff08;stop-opacity:1;"
offset="0"
id="stop5613" /><stop
style="stop-color:#f5ff08;stop-opacity:1;"
offset="0.73820531"
id="stop5615" /><stop
style="stop-color:#f5ff08;stop-opacity:0;"
offset="1"
id="stop5617" /></linearGradient><linearGradient
id="linearGradient5441"><stop
style="stop-color:#f5ff08;stop-opacity:0.89862061;"
offset="0"
id="stop5435" /><stop
style="stop-color:#f5ff08;stop-opacity:0.72535044;"
offset="0.62599742"
id="stop5437" /><stop
style="stop-color:#f5ff08;stop-opacity:0;"
offset="1"
id="stop5439" /></linearGradient><linearGradient
id="linearGradient1452"><stop
style="stop-color:#f50008;stop-opacity:1;"
offset="0"
id="stop1446" /><stop
style="stop-color:#f50008;stop-opacity:1;"
offset="0.7918601"
id="stop1448" /><stop
style="stop-color:#f50008;stop-opacity:0;"
offset="1"
id="stop1450" /></linearGradient><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1452"
id="radialGradient522"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.78484331,0,0,0.78747227,696.44887,-323.11915)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1452"
id="radialGradient524"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8981104,0,0,0.76442481,749.97364,-321.90886)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6573"
id="radialGradient526"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.63729372,0,0,0.41448086,723.17431,-328.11791)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5619"
id="radialGradient528"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.44694866,0,0,0.65155251,787.10411,-304.51482)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5619"
id="radialGradient530"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.44694866,0,0,0.40774632,806.63991,-285.18279)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5685"
id="radialGradient532"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.31040892,0,0,0.40774632,771.18902,-267.79397)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5757"
id="radialGradient534"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.61485849,0,0,0.48365086,699.42828,-280.26845)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5893"
id="radialGradient536"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.18217879,0,0,0.57948295,785.06567,-317.57229)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6175"
id="radialGradient538"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.17110206,0,0,0.57948295,813.03511,-347.11197)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6175"
id="radialGradient540"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.65699536,0,0,0.23041338,805.19531,-234.77302)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6175"
id="radialGradient542"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.65699536,0,0,0.23041338,673.99742,-230.76895)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5441"
id="radialGradient544"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.44694866,0,0,0.46338383,720.63883,-314.42592)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6957"
id="radialGradient546"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.81417897,0,0,0.30393809,713.08122,-253.70655)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient10317"
id="radialGradient548"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.37560777,0,0,0.52796713,798.71131,-289.99247)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient7331"
id="radialGradient550"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.51429536,0,0,0.55006434,705.69388,-287.70068)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient7451"
id="radialGradient552"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.51429536,0,0,0.55006434,726.67823,-322.63777)"
cx="85.568382"
cy="110.37487"
fx="85.568382"
fy="110.37487"
r="80.962494" /></defs><g
inkscape:groupmode="layer"
id="layer7"
inkscape:label="icon"><rect
style="opacity:1;fill:#cccccc;stroke-width:0.0500064;stroke-linecap:square;stroke-dasharray:none"
id="rect9549"
width="16.933332"
height="13.229165"
x="0"
y="1.8520831" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 16.139581,13.493748 v 0.529167 h 0.529166 v -0.529167 z"
id="path2369" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 16.139581,12.699998 v 0.529167 h 0.529166 v -0.529167 z"
id="path2367" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 16.139581,11.906248 v 0.529167 h 0.529166 v -0.529167 z"
id="path2365" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 16.139581,11.112498 v 0.529167 h 0.529166 v -0.529167 z"
id="path2363" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 16.139581,10.318749 v 0.529166 h 0.529166 v -0.529166 z"
id="path2361" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 16.139581,9.5249987 v 0.5291663 h 0.529166 V 9.5249987 Z"
id="path2359" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 16.139581,8.7312488 v 0.5291666 h 0.529166 V 8.7312488 Z"
id="path2357" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 16.139581,6.0854158 v 2.3812497 h 0.529166 V 6.0854158 Z"
id="path2355" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 16.139581,5.2916659 v 0.5291666 h 0.529166 V 5.2916659 Z"
id="path2353" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 16.139581,4.497916 v 0.5291666 h 0.529166 V 4.497916 Z"
id="path2351" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 16.139581,3.7041662 v 0.5291665 h 0.529166 V 3.7041662 Z"
id="path2349" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 16.139581,2.9104163 v 0.5291666 h 0.529166 V 2.9104163 Z"
id="rect14444" /><rect
style="opacity:1;fill:#666666;stroke-width:0.0500064;stroke-linecap:square;stroke-dasharray:none"
id="rect15056"
width="1.0583332"
height="0.52916658"
x="15.610415"
y="2.1166663" /><rect
style="opacity:1;fill:#666666;stroke-width:0.0500064;stroke-linecap:square;stroke-dasharray:none"
id="rect15468"
width="1.0583332"
height="0.52916658"
x="14.287498"
y="2.1166663" /><rect
style="opacity:1;fill:#666666;stroke-width:0.0500064;stroke-linecap:square;stroke-dasharray:none"
id="rect15470"
width="1.0583332"
height="0.52916658"
x="12.964582"
y="2.1166663" /><rect
style="opacity:1;fill:#999999;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
id="rect15882"
width="3.9687495"
height="0.52916658"
x="0.26458329"
y="2.1166663" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 14.287498,-16.139581 h 0.529167 v -0.529167 h -0.529167 z"
transform="rotate(90)"
id="path2231" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 14.287498,-15.345831 h 0.529167 v -0.529167 h -0.529167 z"
transform="rotate(90)"
id="path2229" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 14.287498,-14.552081 h 0.529167 v -0.529167 h -0.529167 z"
transform="rotate(90)"
id="path2227" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 14.287498,-11.641665 h 0.529167 v -2.645833 h -0.529167 z"
transform="rotate(90)"
id="path2225" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 14.287498,-5.8208325 h 0.529167 v -5.5562495 h -0.529167 z"
transform="rotate(90)"
id="path2223" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 14.287498,-4.7624993 h 0.529167 v -0.7937499 h -0.529167 z"
transform="rotate(90)"
id="path2221" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 14.287498,-1.8520831 h 0.529167 V -4.497916 h -0.529167 z"
transform="rotate(90)"
id="path2219" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 14.287498,-1.0583332 h 0.529167 v -0.5291666 h -0.529167 z"
transform="rotate(90)"
id="path2217" /><path
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
d="m 14.287498,-0.2645833 h 0.529167 v -0.52916659 h -0.529167 z"
transform="rotate(90)"
id="rect16090" /></g><g
id="g1799"
transform="matrix(0.9833263,0,0,0.93331382,-31.070772,-23.035828)"
style="stroke-width:1.04385"><rect
style="fill:#000000;fill-opacity:1;stroke-width:0.445374;stroke-linecap:square"
id="rect486"
width="135.46664"
height="101.59999"
x="753.36902"
y="-330.61847"
inkscape:label="rect-bg"
transform="matrix(0.1171875,0,0,0.1171875,-56.418761,66.544469)"
mask="none" /><path
id="rect488"
mask="none"
style="fill:url(#radialGradient522);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-red"
d="m 725.48004,-288.15082 v 101.59998 h 101.67054 v -101.59998 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect490"
mask="none"
style="fill:url(#radialGradient524);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-red"
d="m 754.10795,-288.15082 v 101.59998 h 106.83874 v -101.59998 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect492"
mask="none"
style="fill:url(#radialGradient526);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-yellow"
d="m 726.11063,-288.15082 v 39.33912 h 103.1919 v -39.33912 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect494"
mask="none"
style="fill:url(#radialGradient528);fill-opacity:1;stroke-width:0.44543;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-yellow"
d="m 789.16083,-285.35065 v 98.79981 h 71.78586 v -98.79981 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect496"
mask="none"
style="fill:url(#radialGradient530);fill-opacity:1;stroke-width:0.44543;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-yellow"
d="m 808.70031,-273.18864 v 66.02235 h 52.24638 v -66.02235 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect498"
mask="none"
style="fill:url(#radialGradient532);fill-opacity:1;stroke-width:0.44543;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-yellow"
d="m 772.61997,-255.80111 v 66.02236 h 50.262 v -66.02236 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect500"
mask="none"
style="fill:url(#radialGradient534);fill-opacity:1;stroke-width:0.44543;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-yellow"
d="m 725.48004,-266.04489 v 78.31666 h 76.3411 v -78.31666 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect502"
mask="none"
style="fill:url(#radialGradient536);fill-opacity:1;stroke-width:0.44543;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-yellow"
d="m 785.90646,-288.15082 v 81.45637 h 29.49662 v -81.45637 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect504"
mask="none"
style="fill:url(#radialGradient538);fill-opacity:1;stroke-width:0.44543;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-yellow"
d="m 813.8244,-288.15082 v 51.91565 h 27.70629 v -51.91565 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect506"
mask="none"
style="fill:url(#radialGradient540);fill-opacity:1;stroke-width:0.445429;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-yellow"
d="m 808.21965,-227.99781 v 37.31065 h 52.72704 v -37.31065 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect508"
mask="none"
style="fill:url(#radialGradient542);fill-opacity:1;stroke-width:0.445429;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-yellow"
d="m 725.48004,-223.99378 v 37.31065 h 57.9261 v -37.31065 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect510"
mask="none"
style="fill:url(#radialGradient544);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-yellow"
d="m 725.48004,-288.15082 v 62.38874 h 69.58982 v -62.38874 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect512"
mask="none"
style="fill:url(#radialGradient546);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-white"
d="m 725.48004,-244.76798 v 49.2169 h 123.18557 v -49.2169 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect514"
mask="none"
style="fill:url(#radialGradient548);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-white"
d="m 800.4409,-274.46305 v 85.49128 h 60.50579 v -85.49128 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect516"
mask="none"
style="fill:url(#radialGradient550);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-white"
d="m 725.48004,-271.52176 v 84.97092 h 65.85919 v -84.97092 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
id="rect518"
mask="none"
style="fill:url(#radialGradient552);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
inkscape:label="rect-white"
d="m 729.04751,-288.15082 v 70.7628 h 83.27759 v -70.7628 z"
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /></g></svg>

Before

Width:  |  Height:  |  Size: 23 KiB

View File

@ -1,120 +0,0 @@
rendered_icons_optionally_from_svg = {
'icon_exe' : { 'png': 'icon_exe.png' , 'svg': 'icon_exe.svg', 'width': '256', 'height': '256' },
'icon_exe_48': { 'png': 'icon_exe_48.png', 'svg': 'icon_exe.svg', 'width': '48', 'height': '48' },
'icon_exe_32': { 'png': 'icon_exe_32.png', 'svg': 'icon_exe.svg', 'width': '32', 'height': '32' },
'icon_exe_16': { 'png': 'icon_exe_16.png', 'svg': 'icon_exe.svg', 'width': '16', 'height': '16' },
'icon_cps' : { 'png': 'icon_cps.png' , 'svg': 'icon_cps.svg', 'width': '256', 'height': '256' },
'icon_cps_48': { 'png': 'icon_cps_48.png', 'svg': 'icon_cps.svg', 'width': '48', 'height': '48' },
'icon_cps_32': { 'png': 'icon_cps_32.png', 'svg': 'icon_cps.svg', 'width': '32', 'height': '32' },
'icon_cps_16': { 'png': 'icon_cps_16.png', 'svg': 'icon_cps.svg', 'width': '16', 'height': '16' },
}
rendered_icons = {}
if render_icons_with_inkscape.allowed()
foreach key, info : rendered_icons_optionally_from_svg
rendered_icons += { key: custom_target(
key + '-from-svg',
output: info['png'],
command: [
inkscape,
'--export-area-page',
'--export-type', 'png',
'--export-filename', '@OUTPUT@',
'--export-width', info['width'],
'--export-height', info['height'],
files(info['svg']),
],
) }
endforeach
else
foreach key, info : rendered_icons_optionally_from_svg
rendered_icons += { key: files('generated_icons/' + info['png']) }
endforeach
endif
if host_platform == 'windows'
windows_icons = get_option('windows_icons')
windows_utf8cp = get_option('windows_utf8cp')
rc_conf_depends = []
rc_conf_depend_files = [
'resource.h',
]
icon_exe_ico_path = ''
icon_cps_ico_path = ''
winutf8_xml_path = ''
if windows_icons
make_ico = executable('makeico', sources: 'MakeIco.cpp', native: true)
generated_win_icos = {}
win_icos = {
'icon_exe': [ 'icon_exe', 'icon_exe_48', 'icon_exe_32', 'icon_exe_16' ],
'icon_cps': [ 'icon_cps', 'icon_cps_48', 'icon_cps_32', 'icon_cps_16' ],
}
foreach key, icons : win_icos
command = [
make_ico,
'@OUTPUT@',
]
foreach ikey : icons
command += [ rendered_icons[ikey] ]
endforeach
generated_win_icos += { key: custom_target(
key + '-ico',
output: key + '.ico',
command: command,
) }
endforeach
rc_conf_depends += [
generated_win_icos['icon_exe'],
generated_win_icos['icon_cps'],
]
icon_exe_ico_path = join_paths(meson.current_build_dir(), 'icon_exe.ico')
icon_cps_ico_path = join_paths(meson.current_build_dir(), 'icon_cps.ico')
endif
if windows_utf8cp
rc_conf_depend_files += [
'winutf8.xml',
]
winutf8_xml_path = join_paths(meson.current_source_dir(), 'winutf8.xml')
endif
rc_conf_data = configuration_data()
rc_conf_data.merge_from(conf_data)
rc_conf_data.set('HAVE_ICONS', windows_icons ? 1 : 0)
rc_conf_data.set('HAVE_UTF8CP', windows_utf8cp ? 1 : 0)
rc_conf_data.set('RESOUCE_H', join_paths(meson.current_source_dir(), 'resource.h'))
rc_conf_data.set('WINUTF8_XML', winutf8_xml_path)
rc_conf_data.set('ICON_EXE_ICO', icon_exe_ico_path)
rc_conf_data.set('ICON_CPS_ICO', icon_cps_ico_path)
powder_files += windows_mod.compile_resources(
configure_file(
input: 'powder-res.template.rc',
output: 'powder-res.rc',
configuration: rc_conf_data,
),
depends: rc_conf_depends,
depend_files: rc_conf_depend_files,
)
elif host_platform == 'darwin'
configure_file(
input: 'Info.template.plist',
output: 'Info.plist',
configuration: conf_data,
)
elif host_platform == 'linux'
data_files += to_array.process(rendered_icons['icon_exe'], extra_args: 'icon_exe_png')
data_files += to_array.process(rendered_icons['icon_cps'], extra_args: 'icon_cps_png')
data_files += to_array.process('save.xml', extra_args: 'save_xml')
data_files += to_array.process(configure_file(
input: 'powder.template.desktop',
output: 'powder.desktop',
configuration: conf_data,
), extra_args: 'powder_desktop')
configure_file(
input: 'appdata.template.xml',
output: 'appdata.xml',
configuration: conf_data,
)
endif
data_files += to_array.process('save_local.png', extra_args: 'save_local_png')
data_files += to_array.process('save_online.png', extra_args: 'save_online_png')
data_files += to_array.process('font.bz2', extra_args: 'compressed_font_data')

5
resources/powder-res.rc Normal file
View File

@ -0,0 +1,5 @@
#include "resource.h"
IDI_ICON ICON DISCARDABLE "icon.ico"
IDI_DOC_ICON ICON DISCARDABLE "document.ico"
IDI_EVENTCOMPAT LUASCRIPT "../src/lua/luascripts/eventcompat.lua"

View File

@ -1,40 +0,0 @@
#pragma code_page(65001) // UTF-8
#include "@RESOUCE_H@"
#include <winuser.h>
#include <winver.h>
#include <ntdef.h>
#define HAVE_ICONS @HAVE_ICONS@
#define HAVE_UTF8CP @HAVE_UTF8CP@
#if HAVE_ICONS
IDI_ICON ICON DISCARDABLE "@ICON_EXE_ICO@"
IDI_DOC_ICON ICON DISCARDABLE "@ICON_CPS_ICO@"
#endif
#if HAVE_UTF8CP
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "@WINUTF8_XML@"
#endif
VS_VERSION_INFO VERSIONINFO
FILEVERSION @DISPLAY_VERSION_MAJOR@,@DISPLAY_VERSION_MINOR@,0,@BUILD_NUM@
PRODUCTVERSION @DISPLAY_VERSION_MAJOR@,@DISPLAY_VERSION_MINOR@,0,@BUILD_NUM@
{
BLOCK "StringFileInfo"
{
BLOCK "040904b0"
{
VALUE "CompanyName", "https://powdertoy.co.uk/\0"
VALUE "FileDescription", "@APPNAME@\0"
VALUE "FileVersion", "@DISPLAY_VERSION_MAJOR@.@DISPLAY_VERSION_MINOR@.0.@BUILD_NUM@\0"
VALUE "OriginalFilename", "@APPEXE@.exe\0"
VALUE "LegalCopyright", "@MANIFEST_COPYRIGHT@\0"
VALUE "ProductName", "@APPCOMMENT@\0"
VALUE "ProductVersion", "@DISPLAY_VERSION_MAJOR@.@DISPLAY_VERSION_MINOR@.0.@BUILD_NUM@\0"
VALUE "InternalName", "@APPID@\0"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x409, 65001
}
}

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8" ?>
<component type="desktop">
<id>uk.co.powdertoy.tpt</id>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-3.0</project_license>
<name>Powder Toy</name>
<summary>Physics sandbox game</summary>
<content_rating type="oars-1.1">
<content_attribute id="social-chat">moderate</content_attribute>
</content_rating>
<launchable type="desktop-id">powder.desktop</launchable>
<description>
<p>
The Powder Toy is a free physics sandbox game, which simulates air pressure and velocity, heat, gravity and a countless number of interactions between different substances! The game provides you with various building materials, liquids, gases and electronic components which can be used to construct complex machines, guns, bombs, realistic terrains and almost anything else. You can then mine them and watch cool explosions, add intricate wirings, play with little stickmen or operate your machine. You can browse and play thousands of different saves made by the community or upload your own - we welcome your creations!
</p>
</description>
<screenshots>
<screenshot>
<image>http://powdertoy.co.uk/Themes/Next/Design/Images/Screen2.png</image>
</screenshot>
</screenshots>
<url type="homepage">https://powdertoy.co.uk/</url>
<url type="bugtracker">https://github.com/The-Powder-Toy/The-Powder-Toy/issues</url>
<url type="help">https://powdertoy.co.uk/Wiki/W/Main_Page.html</url>
<releases>
<release date="2019-02-21" version="94.1" />
</releases>
</component>

9
resources/powder.desktop Normal file
View File

@ -0,0 +1,9 @@
[Desktop Entry]
Version=1.0
Encoding=UTF-8
Name=Powder Toy
Comment=Physics sandbox game
Exec=powder
Icon=powder
Type=Application
Categories=Game;Simulation;

Some files were not shown because too many files have changed in this diff Show More