commit b9b8dbfd722f6ef6edc05e2b1cedde551408306f Author: somebasj Date: Wed Jul 27 23:00:42 2022 +0800 PD 17.1.4-51567 intel crack diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d013e68 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +*.dylib +/build +/tmp +/publish diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9d52f04 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "Dobby"] + path = Dobby + url = https://github.com/jmpews/Dobby +[submodule "deps/Dobby"] + path = deps/Dobby + url = https://github.com/jmpews/Dobby diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..58a67c2 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,49 @@ +cmake_minimum_required(VERSION 3.20) + +project(Configurer64) + +set(DOBBY_GENERATE_SHARED OFF CACHE BOOL "" FORCE) +set(DOBBY_DEBUG OFF CACHE BOOL "" FORCE) +set(NearBranch ON CACHE BOOL "" FORCE) +set(DynamicBinaryInstrument OFF CACHE BOOL "" FORCE) +set(FullFloatingPointRegisterPack OFF CACHE BOOL "" FORCE) +set(EnableObfuscation OFF CACHE BOOL "" FORCE) +set(Plugin.SymbolResolver OFF CACHE BOOL "" FORCE) +set(Plugin.GlobalOffsetTableHook ON CACHE BOOL "" FORCE) +set(Plugin.LinkerLoadCallback OFF CACHE BOOL "" FORCE) +set(Plugin.ApplicationEventMonitor OFF CACHE BOOL "" FORCE) +set(Plugin.Android.BionicLinkerRestriction OFF CACHE BOOL "" FORCE) +add_subdirectory(deps/Dobby) + +add_library(${PROJECT_NAME} SHARED + src/main.cpp +) + +target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) + +target_compile_options(${PROJECT_NAME} PRIVATE + -stdlib=libc++ + -fno-rtti + -fvisibility=hidden + -fvisibility-inlines-hidden +) + +target_compile_options(${PROJECT_NAME} PRIVATE + -fpass-plugin=${CMAKE_SOURCE_DIR}/ollvm.dylib +) + +target_link_libraries(${PROJECT_NAME} PRIVATE + "-framework Foundation" + "-framework CoreFoundation" + "-framework AppKit" + "-framework Cocoa" +) + +target_link_libraries(${PROJECT_NAME} PRIVATE + objc + dobby +) + +target_include_directories(${PROJECT_NAME} PRIVATE + ${CMAKE_SOURCE_DIR}/Dobby/include +) diff --git a/assets/PDFM.VolumeIcon.icns b/assets/PDFM.VolumeIcon.icns new file mode 100644 index 0000000..d947980 Binary files /dev/null and b/assets/PDFM.VolumeIcon.icns differ diff --git a/assets/PDFM.background.png b/assets/PDFM.background.png new file mode 100644 index 0000000..981fe08 Binary files /dev/null and b/assets/PDFM.background.png differ diff --git a/assets/PTFM.VolumeIcon.icns b/assets/PTFM.VolumeIcon.icns new file mode 100644 index 0000000..38d1ff0 Binary files /dev/null and b/assets/PTFM.VolumeIcon.icns differ diff --git a/assets/PTFM.background.png b/assets/PTFM.background.png new file mode 100644 index 0000000..a747306 Binary files /dev/null and b/assets/PTFM.background.png differ diff --git a/deps/Dobby b/deps/Dobby new file mode 160000 index 0000000..223aabc --- /dev/null +++ b/deps/Dobby @@ -0,0 +1 @@ +Subproject commit 223aabced0431525c7d45196f9409fc505d58ac8 diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100644 index 0000000..68438c6 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +CUR_PATH=$(cd "$(dirname $(readlink -f "$0"))" && pwd) +ROOT_PATH=$(cd "${CUR_PATH}/../" && pwd) + +export CC +export CXX +export PATH + +if [ -f /usr/local/opt/llvm/bin/clang ]; then + CC=/usr/local/opt/llvm/bin/clang + CXX=/usr/local/opt/llvm/bin/clang++ + PATH="/usr/local/opt/llvm/bin:$PATH" +fi + +cmake -S "${ROOT_PATH}" -B "${ROOT_PATH}/build" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" \ + -DCMAKE_OSX_DEPLOYMENT_TARGET="11.0" \ + -DLOGGING_DISABLE=1 \ +&& \ +cmake --build "${ROOT_PATH}/build" --target Configurer64 -j8 diff --git a/scripts/insert_dylib b/scripts/insert_dylib new file mode 100644 index 0000000..6b8f1f4 Binary files /dev/null and b/scripts/insert_dylib differ diff --git a/scripts/install.sh b/scripts/install.sh new file mode 100644 index 0000000..0a0dc69 --- /dev/null +++ b/scripts/install.sh @@ -0,0 +1,129 @@ +#!/bin/bash + +CUR_PATH=$(cd "$(dirname $(readlink -f "$0"))" && pwd) +PT_ROOT_DIR="/Applications/Parallels Toolbox.app" +PD_ROOT_DIR="/Applications/Parallels Desktop.app" +CRACK_LIB="${CUR_DIR}/../build/libConfigurer64.dylib" +# CODESIGN_CERT=B8474E27C322DFB3D4A0168127EB02DB877C3F81 +CODESIGN_CERT=- + +function sign_cmd() { + codesign -f -s ${CODESIGN_CERT} --all-architectures --deep "$1" +} + +function kill_pt_app() { + killall -9 "Parallels Toolbox" +} + +function kill_pd_app() { + killall -9 prl_client_app +} + +function apply_pt_crack() { + + if [ -f /usr/local/opt/llvm/bin/llvm-strip ]; then + /usr/local/opt/llvm/bin/llvm-strip -s "${CRACK_LIB}" + fi + + cp "${CRACK_LIB}" "${PT_ROOT_DIR}/Contents/Frameworks/libConfigurer64.dylib" + if [ ! -f "${PT_ROOT_DIR}/Contents/Frameworks/libLogging.dylib.bak" ]; then + + cp "${PT_ROOT_DIR}/Contents/Frameworks/libLogging.dylib" "${PT_ROOT_DIR}/Contents/Frameworks/libLogging.dylib.bak" + "${CUR_DIR}/insert_dylib" --inplace --all-yes \ + "@rpath/libConfigurer64.dylib" \ + "${PT_ROOT_DIR}/Contents/Frameworks/libLogging.dylib" + + fi +} + +function apply_pd_crack() { + + if [ -f /usr/local/opt/llvm/bin/llvm-strip ]; then + /usr/local/opt/llvm/bin/llvm-strip -s "${CRACK_LIB}" + fi + + cp "${CRACK_LIB}" "${PD_ROOT_DIR}/Contents/Frameworks/libConfigurer64.dylib" + if [ ! -f "${PD_ROOT_DIR}/Contents/Frameworks/QtXml.framework/Versions/5/QtXml.bak" ]; then + + cp "${PD_ROOT_DIR}/Contents/Frameworks/QtXml.framework/Versions/5/QtXml" "${PD_ROOT_DIR}/Contents/Frameworks/QtXml.framework/Versions/5/QtXml.bak" + "${CUR_DIR}/insert_dylib" --inplace --all-yes \ + "@rpath/libConfigurer64.dylib" \ + "${PD_ROOT_DIR}/Contents/Frameworks/QtXml.framework/Versions/5/QtXml" + fi +} + +function sign_pt() { + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Airplane Mode.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Alarm.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Archive.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Barcode Generator.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Barcode Reader.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Break Time.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/CPU Temperature.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Capture Area.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Capture Screen.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Capture Window.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Clean Drive.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Clipboard History.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Convert Video.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Date Countdown.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Do Not Disturb.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Do Not Sleep.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Download Audio.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Download Video.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Eject Volumes.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Encrypt Files.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Energy Saver.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Find Duplicates.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Focus on Window.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Free Memory.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Hidden Files.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Hide Desktop Files.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Hide Menu Icons.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Launch.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Lock Screen.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Make GIF.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Mute Microphone.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Parallels Tool Launcher.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Presentation Mode.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Recognize Text.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Record Area.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Record Audio.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Record Screen.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Record Window.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Resize Images.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Screenshot Page.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Show Desktop.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Sleep Timer.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Stopwatch.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Switch Resolution.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Take Photo.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Take Video.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Timer.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Transform Text.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Unarchive.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Uninstall Apps.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Unit Converter.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Verify Checksum.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/Window Manager.app" + sign_cmd "${PT_ROOT_DIR}/Contents/Applications/World Time.app" + sign_cmd "${PT_ROOT_DIR}/Parallels Toolbox.app" +} + +function sign_pd() { + sign_cmd "${PD_ROOT_DIR}/Contents/Applications/Parallels Link.app" + sign_cmd "${PD_ROOT_DIR}/Contents/Applications/Parallels Mounter.app" + sign_cmd "${PD_ROOT_DIR}/Contents/Applications/Parallels Technical Data Reporter.app" + sign_cmd "${PD_ROOT_DIR}/Contents/MacOS/Parallels Mac VM.app" + sign_cmd "${PD_ROOT_DIR}/Contents/MacOS/Parallels Service.app" + sign_cmd "${PD_ROOT_DIR}/Contents/MacOS/Parallels VM 10.14.app" + sign_cmd "${PD_ROOT_DIR}/Contents/MacOS/Parallels VM.app" + sign_cmd "${PD_ROOT_DIR}/Parallels Desktop.app" +} + +kill_pt_app +kill_pd_app +apply_pt_crack +apply_pd_crack +sign_pt +sign_pd diff --git a/scripts/publish.sh b/scripts/publish.sh new file mode 100644 index 0000000..74310d3 --- /dev/null +++ b/scripts/publish.sh @@ -0,0 +1,259 @@ +#!/bin/bash + +CUR_PATH=$(cd "$(dirname $(readlink -f "$0"))" && pwd) +ROOT_PATH=$(cd "${CUR_PATH}/../" && pwd) +TEMP_PATH="${ROOT_PATH}/tmp" +PUBLISH_PATH="${ROOT_PATH}/publish" + +PTFM_VERSION="5.5.1-4410" +PDFM_VERSION="17.1.4-51567" + +PTFM_SHA256SUM="412bddebac28e229c7973dad6d702c67d1b42195b99b009af26ef036f5631349" +PDFM_SHA256SUM="8232f140e4c5b95821bf5063fb37db356f7bab520ddabbab4a73d08b5de0cd10" + +PTFM_DMG_DOWNLOAD_URL="https://download.parallels.com/toolbox/v5/${PTFM_VERSION}/ParallelsToolbox-${PTFM_VERSION}.dmg" +PDFM_DMG_DOWNLOAD_URL="https://download.parallels.com/desktop/v17/${PDFM_VERSION}/ParallelsDesktop-${PDFM_VERSION}.dmg" + +PTFM_DMG_FILE="${TEMP_PATH}/download/ParallelsToolbox-${PTFM_VERSION}.dmg" +PDFM_DMG_FILE="${TEMP_PATH}/download/ParallelsDesktop-${PDFM_VERSION}.dmg" + +PTFM_PUBLISH_FILE="${PUBLISH_PATH}/ParallelsToolbox-${PTFM_VERSION}_Crack.dmg" +PDFM_PUBLISH_FILE="${PUBLISH_PATH}/ParallelsDesktop-${PDFM_VERSION}_Crack.dmg" + +# CODESIGN_CERT=B8474E27C322DFB3D4A0168127EB02DB877C3F81 +CODESIGN_CERT=- + +CRACK_LIB="${ROOT_PATH}/build/libConfigurer64.dylib" + +PTFM_TMP_DIR="${TEMP_PATH}/ptfm_files" +PDFM_TMP_DIR="${TEMP_PATH}/pdfm_files" + +function sign_cmd() { + codesign -f -s ${CODESIGN_CERT} --all-architectures --deep "$1" +} + +function ensure_download_ptfm_dmg() { + echo "check ${PTFM_DMG_FILE}" + if [ ! -f "${PTFM_DMG_FILE}" ]; then + echo "download ${PTFM_DMG_DOWNLOAD_URL}" + mkdir -p $(dirname "${PTFM_DMG_FILE}") + curl -L --progress-bar -o "${PTFM_DMG_FILE}" "${PTFM_DMG_DOWNLOAD_URL}" + fi +} + +function ensure_download_pdfm_dmg() { + echo "check ${PDFM_DMG_FILE}" + if [ ! -f "${PDFM_DMG_FILE}" ]; then + echo "download ${PDFM_DMG_DOWNLOAD_URL}" + mkdir -p $(dirname "${PDFM_DMG_FILE}") + curl -L --progress-bar -o "${PDFM_DMG_FILE}" "${PDFM_DMG_DOWNLOAD_URL}" + fi +} + +function copy_ptfm_files() { + echo "copy files" + if [ -d "${PTFM_TMP_DIR}" ]; then + rm -rf "${PTFM_TMP_DIR}" > /dev/null + fi + mkdir -p "${PTFM_TMP_DIR}" > /dev/null + + hdiutil attach -noverify -noautofsck -noautoopen "${PTFM_DMG_FILE}" + cp -R -X "/Volumes/Parallels Toolbox/Install Parallels Toolbox.app" "${PTFM_TMP_DIR}/" > /dev/null + hdiutil detach "/Volumes/Parallels Toolbox" + + rm -f "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/embedded.provisionprofile" > /dev/null + chflags -R 0 "${PTFM_TMP_DIR}" > /dev/null + xattr -cr "${PTFM_TMP_DIR}" > /dev/null +} + +function copy_pdfm_files() { + echo "copy files" + if [ -d "${PDFM_TMP_DIR}" ]; then + rm -rf "${PDFM_TMP_DIR}" > /dev/null + fi + mkdir -p "${PDFM_TMP_DIR}" > /dev/null + + hdiutil attach -noverify -noautofsck -noautoopen "${PDFM_DMG_FILE}" + cp -R -X "/Volumes/Parallels Desktop 17/Install.app" "${PDFM_TMP_DIR}/" > /dev/null + cp -R -X "/Volumes/Parallels Desktop 17/Parallels Desktop.app" "${PDFM_TMP_DIR}/" > /dev/null + hdiutil detach "/Volumes/Parallels Desktop 17" + + rm -f "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/embedded.provisionprofile" > /dev/null + chflags -R 0 "${PDFM_TMP_DIR}" > /dev/null + xattr -cr "${PDFM_TMP_DIR}" > /dev/null +} + +function apply_ptfm_crack() { + echo "apply patch" + if [ -f /usr/local/opt/llvm/bin/llvm-strip ]; then + /usr/local/opt/llvm/bin/llvm-strip -s "${CRACK_LIB}" > /dev/null + fi + + cp -f -X "${CRACK_LIB}" \ + "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Frameworks/libConfigurer64.dylib" \ + > /dev/null + + "${CUR_PATH}/insert_dylib" --inplace --all-yes \ + "@rpath/libConfigurer64.dylib" \ + "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Frameworks/libLogging.dylib" \ + > /dev/null +} + +function apply_pdfm_crack() { + echo "apply patch" + if [ -f /usr/local/opt/llvm/bin/llvm-strip ]; then + /usr/local/opt/llvm/bin/llvm-strip -s "${CRACK_LIB}" > /dev/null + fi + + cp -f -X "${CRACK_LIB}" \ + "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Frameworks/libConfigurer64.dylib" \ + > /dev/null + + "${CUR_PATH}/insert_dylib" --inplace --all-yes \ + "@rpath/libConfigurer64.dylib" \ + "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Frameworks/QtXml.framework/Versions/5/QtXml" \ + > /dev/null +} + +function sign_ptfm() { + echo "sign app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Library/Install/ToolboxInstaller" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Airplane Mode.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Alarm.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Archive.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Barcode Generator.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Barcode Reader.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Break Time.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/CPU Temperature.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Capture Area.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Capture Screen.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Capture Window.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Clean Drive.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Clipboard History.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Convert Video.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Date Countdown.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Do Not Disturb.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Do Not Sleep.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Download Audio.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Download Video.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Eject Volumes.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Encrypt Files.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Energy Saver.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Find Duplicates.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Focus on Window.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Free Memory.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Hidden Files.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Hide Desktop Files.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Hide Menu Icons.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Launch.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Lock Screen.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Make GIF.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Mute Microphone.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Parallels Tool Launcher.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Presentation Mode.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Recognize Text.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Record Area.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Record Audio.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Record Screen.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Record Window.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Resize Images.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Screenshot Page.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Show Desktop.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Sleep Timer.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Stopwatch.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Switch Resolution.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Take Photo.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Take Video.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Timer.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Transform Text.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Unarchive.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Uninstall Apps.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Unit Converter.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Verify Checksum.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/Window Manager.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app/Contents/Applications/World Time.app" + sign_cmd "${PTFM_TMP_DIR}/Install Parallels Toolbox.app" +} + +function sign_pdfm() { + echo "sign app" + sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Applications/Parallels Link.app" + sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Applications/Parallels Mounter.app" + sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Applications/Parallels Technical Data Reporter.app" + sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/Parallels Mac VM.app" + sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/Parallels Service.app" + sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/Parallels VM 10.14.app" + sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/Parallels VM.app" + sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app" + sign_cmd "${PDFM_TMP_DIR}/Install.app" +} + +function set_pdfm_app_hide() { + chflags hidden "${PDFM_TMP_DIR}/Parallels Desktop.app" > /dev/null +} + +function create_ptfm_dmg() { + echo "create dmg ${PTFM_PUBLISH_FILE}" + mkdir -p "${PUBLISH_PATH}" + + if [ -f "${PTFM_PUBLISH_FILE}" ]; then + rm -f "${PTFM_PUBLISH_FILE}" > /dev/null + fi + + create-dmg \ + --volname "Parallels Toolbox" \ + --volicon "${ROOT_PATH}/assets/PTFM.VolumeIcon.icns" \ + --background "${ROOT_PATH}/assets/PTFM.background.png" \ + --window-pos 0 0 \ + --window-size 640 415 \ + --icon-size 256 \ + --icon "Install Parallels Toolbox.app" 450 126 \ + --codesign ${CODESIGN_CERT} \ + "${PTFM_PUBLISH_FILE}" \ + "${PTFM_TMP_DIR}/" +} + +function create_pdfm_dmg() { + echo "create dmg ${PDFM_PUBLISH_FILE}" + mkdir -p "${PUBLISH_PATH}" + + if [ -f "${PDFM_PUBLISH_FILE}" ]; then + rm -f "${PDFM_PUBLISH_FILE}" > /dev/null + fi + + create-dmg \ + --volname "Parallels Desktop 17" \ + --volicon "${ROOT_PATH}/assets/PDFM.VolumeIcon.icns" \ + --background "${ROOT_PATH}/assets/PDFM.background.png" \ + --window-pos 0 0 \ + --window-size 640 415 \ + --icon-size 256 \ + --icon "Install.app" 450 126 \ + --codesign ${CODESIGN_CERT} \ + "${PDFM_PUBLISH_FILE}" \ + "${PDFM_TMP_DIR}/" +} + +function publish_ptfm_crack_dmg() { + ensure_download_ptfm_dmg + copy_ptfm_files + apply_ptfm_crack + sign_ptfm + create_ptfm_dmg +} + +function publish_pdfm_crack_dmg() { + ensure_download_pdfm_dmg + copy_pdfm_files + apply_pdfm_crack + sign_pdfm + set_pdfm_app_hide + create_pdfm_dmg +} + + +publish_ptfm_crack_dmg +publish_pdfm_crack_dmg + + + diff --git a/scripts/rebuild.sh b/scripts/rebuild.sh new file mode 100644 index 0000000..edaa333 --- /dev/null +++ b/scripts/rebuild.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +CUR_PATH=$(cd "$(dirname $(readlink -f "$0"))" && pwd) +ROOT_PATH=$(cd "${CUR_PATH}/../" && pwd) + +if [ -d "${ROOT_PATH}/build" ]; then + rm -rf "${ROOT_PATH}/build" > /dev/null +fi + +exec "${CUR_PATH}/build.sh" diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..3adf925 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,1828 @@ + +// hack to use objc_msgSend +#define _OBJC_MESSAGE_H + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#define LOGGING_DISABLE +#include + +#define JM_XORSTR_DISABLE_AVX_INTRINSICS +#include "xorstr.hpp" + + +OBJC_EXPORT id _Nullable +objc_msgSend(id _Nullable self, SEL _Nonnull op, ...) + OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); + + +#if defined(_M_X64) || defined(__x86_64__) +#define TARGET_ARCH_X64 1 +#elif defined(__AARCH64EL__) +#define TARGET_ARCH_ARM64 1 +#else +#error unsupported arch +#endif + +#if !defined(TARGET_ARCH_X64) +__attribute__((constructor)) +void func_load() { + const char* header = "Error"; + const char* message = "This crack version only support intel CPU!"; + CFStringRef header_ref = CFStringCreateWithCString(NULL, header, strlen(header)); + CFStringRef message_ref = CFStringCreateWithCString(NULL,message,strlen(message)); + + CFOptionFlags result; + CFUserNotificationDisplayAlert( + 0, //timeout + kCFUserNotificationNoDefaultButtonFlag, //flags + NULL, //iconURL + NULL, // soundURL + NULL, // localizationURL + header_ref, // alertHeader + message_ref, // alertMessage + NULL, // defaultButtonTitle just "ok" + NULL, // alternateButtonTitle + NULL, // otherButtonTitle + &result // responseFlags + ); + exit(0); +} +#endif + + +#ifdef TARGET_ARCH_X64 + +// #define ENABLE_DLOG 1 + +#if defined(ENABLE_DLOG) +#define dlog(format, ...) { os_log(OS_LOG_DEFAULT, "[PARALLELS_PATCH_LOG] " format, ##__VA_ARGS__); } +#else +#define dlog(format, ...) +#endif + + +#ifdef TARGET_ARCH_X64 +#define OPCODE_RETURN_0 { 0x48, 0x31, 0xC0, 0xC3 } +#define OPCODE_RETURN_1 { 0x6A, 0x01, 0x58, 0xC3 } +#endif + +#ifdef TARGET_ARCH_ARM64 +#define OPCODE_RETURN_0 { 0x00, 0x00, 0x80, 0xd2, 0xc0, 0x03, 0x5f, 0xd6 } +#define OPCODE_RETURN_1 { 0x20, 0x00, 0x80, 0xd2, 0xc0, 0x03, 0x5f, 0xd6 } +#endif + + +id vars_g_static_class = nullptr; + +typedef uint64_t (*type_AppDelegate_checkForUpdates_t)(uint64_t, uint64_t, int); +type_AppDelegate_checkForUpdates_t vars_g_old_AppDelegate_checkForUpdates; + +uint64_t func_hook_AppDelegate_checkForUpdates(uint64_t a1, uint64_t a2, int a3) +{ + if (a3 == 1) + return vars_g_old_AppDelegate_checkForUpdates(a1, a2, 1LL); + return 0; +} + +int func_return_0() { + return 0; +} + +int func_return_1() { + return 1; +} + +typedef void (*type_objc_void_bool_t)(void*, void*, bool); + +type_objc_void_bool_t vars_g_CEPLog_setCEPDisabled; + +void func_hook_CEPLog_setCEPDisabled(void* a1, void* a2, bool disbale) +{ + if (!disbale) + { + dlog("[*] hook [CEPLog setCEPDisabled: true] hook to false"); + } + else + { + dlog("[*] hook [CEPLog setCEPDisabled: false]"); + } + vars_g_CEPLog_setCEPDisabled(a1, a2, 1); +} + +type_objc_void_bool_t vars_g_CEPLog_setCEPSentAfterDisabling; + +void func_hook_CEPLog_setCEPSentAfterDisabling(void* a1, void* a2, bool disable) +{ + if (!disable) + { + dlog("[*] enter [CEPLog setCEPSentAfterDisabling: true] hook to false"); + } + else + { + dlog("[*] enter [CEPLog setCEPSentAfterDisabling: false]"); + } + vars_g_CEPLog_setCEPSentAfterDisabling(a1, a2, 1); +} + +bool str_ends_with(const char* a1, const char* a2) { + auto a1_len = strlen(a1); + auto a2_len = strlen(a2); + if (a1_len < a2_len) return false; + return 0 == strcmp(a1 + a1_len - a2_len, a2); +} + +IMP func_getObjcMethod(const char *className, const char *methodName) +{ + auto c = objc_getClass(className); + auto s = sel_registerName(methodName); + auto m = class_getInstanceMethod(c, s); + return method_getImplementation(m); +} + +void func_patch_objc(const char* className, const char* methodName, void *replace, int replace_size) +{ + auto addr = (void *)func_getObjcMethod(className, methodName); + if (!addr) + { + dlog("[-] can not found [%s %s].", className, methodName) + return; + } + if (kMemoryOperationSuccess == CodePatch(addr, (uint8_t*)replace, replace_size)) + { + dlog("[+] patch success [%s %s].", className, methodName) + } + else + { + dlog("[-] patch fail [%s %s].", className, methodName) + } +} + +void func_hook_objc(const char* className, const char* methodName, void* replace, void** original) +{ + auto addr = (void *)func_getObjcMethod(className, methodName); + if (!addr) + { + dlog("[-] can not found [%s %s].", className, methodName) + return; + } + if (RS_SUCCESS == DobbyHook(addr, replace, original)) + { + dlog("[+] patch success [%s %s].", className, methodName) + } + else + { + dlog("[-] patch fail [%s %s].", className, methodName) + } +} + +bool func_patch_data(void* addr, void *replace, int replace_size) +{ + auto ret = CodePatch(addr, (uint8_t*)replace, replace_size); + return kMemoryOperationSuccess == ret; +} + +bool func_check_version(const char *func_check_version) +{ + // @autoreleasepool { + // NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey]; + // return 0 == strcmp([version UTF8String], func_check_version); + // } + + auto cls_NSBundle = (id)objc_getClass(xorstr_("NSBundle")); + if (!cls_NSBundle) { + dlog("[-] get NSBundle fail"); + return false; + } + auto sel_mainBundle = sel_registerName(xorstr_("mainBundle")); + auto mainBundle = (id)objc_msgSend(cls_NSBundle, sel_mainBundle); + if (!mainBundle) { + dlog("[-] get mainBundle fail"); + return false; + } + auto cls_NSString = (id)objc_getClass(xorstr_("NSString")); + auto sel_stringWithUTF8String = sel_registerName(xorstr_("stringWithUTF8String:")); + auto cls_kCFBundleVersionKey = (id)objc_msgSend(cls_NSString, sel_stringWithUTF8String, xorstr_("CFBundleVersion")); + auto sel_objectForInfoDictionaryKey = sel_registerName(xorstr_("objectForInfoDictionaryKey:")); + auto build_nsstring = objc_msgSend(mainBundle, sel_objectForInfoDictionaryKey, cls_kCFBundleVersionKey); + if (!build_nsstring) { + dlog("[-] get build_nsstring fail"); + return false; + } + auto sel_UTF8String = sel_registerName(xorstr_("UTF8String")); + char* pCFBundleVersion = (char*)objc_msgSend(build_nsstring, sel_UTF8String); + dlog("[*] version: %s", pCFBundleVersion); + return 0 == strcmp(pCFBundleVersion, func_check_version); +} + +void func_patch_libprl_shared_apps_dylib(char* image_base) +{ + if (image_base) + { + #ifdef TARGET_ARCH_X64 + { + // __text:000000000002ADA0 55 push rbp ; <--- patch return 0; + // __text:000000000002ADA1 48 89 E5 mov rbp, rsp + // __text:000000000002ADA4 41 57 push r15 + // __text:000000000002ADA6 41 56 push r14 + // __text:000000000002ADA8 41 55 push r13 + // __text:000000000002ADAA 41 54 push r12 + // __text:000000000002ADAC 53 push rbx + // __text:000000000002ADAD 48 81 EC D8 05 00 00 sub rsp, 5D8h + // __text:000000000002ADB4 48 8B 05 75 54 09 00 mov rax, cs:___stack_chk_guard_ptr + // __text:000000000002ADBB 48 8B 00 mov rax, [rax] + // __text:000000000002ADBE 48 89 45 D0 mov [rbp+var_30], rax + // __text:000000000002ADC2 E8 79 06 00 00 call sub_2B440 + // __text:000000000002ADC7 E8 B4 99 03 00 call sub_64780 + // __text:000000000002ADCC 85 C0 test eax, eax + // __text:000000000002ADCE 0F 84 AA 04 00 00 jz loc_2B27E + // __text:000000000002ADD4 C7 85 28 FA FF FF 90 01 00 00 mov [rbp+var_5D8], 190h + // __text:000000000002ADDE C7 85 2C FA FF FF E8 03 00 00 mov [rbp+var_5D4], 3E8h + // __text:000000000002ADE8 4C 8D 35 89 58 0A 00 lea r14, qword_D0678 + // __text:000000000002ADEF 4C 8D BD 40 FE FF FF lea r15, [rbp+var_1C0] + // __text:000000000002ADF6 4C 8D 85 28 FA FF FF lea r8, [rbp+var_5D8] + // __text:000000000002ADFD BF 79 10 01 80 mov edi, 80011079h + // __text:000000000002AE02 BE 01 00 00 00 mov esi, 1 + // __text:000000000002AE07 BA 01 00 00 00 mov edx, 1 + // __text:000000000002AE0C 4C 89 F9 mov rcx, r15 + // __text:000000000002AE0F 41 FF 16 call qword ptr [r14] + // __text:000000000002AE12 48 8D 9D 50 FA FF FF lea rbx, [rbp+var_5B0] + // __text:000000000002AE19 4C 8D 85 2C FA FF FF lea r8, [rbp+var_5D4] + // __text:000000000002AE20 BF 79 10 01 80 mov edi, 80011079h + // __text:000000000002AE25 31 F6 xor esi, esi + // __text:000000000002AE27 BA 01 00 00 00 mov edx, 1 + // __text:000000000002AE2C 48 89 D9 mov rcx, rbx + // __text:000000000002AE2F 41 FF 16 call qword ptr [r14] + // __text:000000000002AE32 48 8B 3D 3F 2A 0A 00 mov rdi, cs:classRef_NSString ; id + // __text:000000000002AE39 4C 8B 35 78 15 0A 00 mov r14, cs:selRef_stringWithUTF8String_ + // __text:000000000002AE40 4C 8B 2D 41 54 09 00 mov r13, cs:_objc_msgSend_ptr + // __text:000000000002AE47 4C 89 F6 mov rsi, r14 ; SEL + // __text:000000000002AE4A 48 89 DA mov rdx, rbx + + uint8_t replace[] = OPCODE_RETURN_1; + if (func_patch_data(image_base + 0x2ada0, replace, sizeof(replace))) + { + dlog("[+] patch libprl_shared_apps.dylib 1 success."); + } + else + { + dlog("[-] patch libprl_shared_apps.dylib 1 fail."); + } + } + #endif + #ifdef TARGET_ARCH_ARM64 + { + uint8_t replace[] = OPCODE_RETURN_1; + if (func_patch_data(image_base + 0x29308, replace, sizeof(replace))) + { + dlog("[+] patch libprl_shared_apps.dylib 1 success."); + } + else + { + dlog("[-] patch libprl_shared_apps.dylib 1 fail."); + } + } + #endif + } + +} + +int hook_PrlSrv_HasRestriction( + void* hServer, + int nRestrictionKey, + uint32_t* pbHasRestriction) { + if (*pbHasRestriction) { + *pbHasRestriction = 1; + return 1; + } + return 0; +} + +int hook_PrlLic_IsValid( + void* hLicense, + uint32_t* pbValue) { + if (*pbValue) { + *pbValue = 1; + return 1; + } + return 0; +} + +int hook_PrlLic_GetUserName( + void* hLicense, + char* sUserName, + uint32_t* pnUserNameBufLength) { + if (pnUserNameBufLength) { + if (!sUserName) { + *pnUserNameBufLength = 4; + return 6; + } + if (*pnUserNameBufLength >= 4) { + strcpy(sUserName, "Day"); + return 0; + } + } + return 3; +} + +void func_patch_ParallelsVirtualizationSDK(char* image_base, int i) +{ + if (image_base) + { + char* image_name = (char*)_dyld_get_image_name(i); + // if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrv_IsFeatureSupported"), (void*)hook_PrlSrv_IsFeatureSupported, nullptr)) { + // dlog("[+] hook PrlSrv_IsFeatureSupported success"); + // } else { + // dlog("[+] hook PrlSrv_IsFeatureSupported fail"); + // } + // if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrvCfg_IsUsbSupported"), (void*)func_return_1, nullptr)) { + // dlog("[+] hook PrlSrvCfg_IsUsbSupported success"); + // } else { + // dlog("[+] hook PrlSrvCfg_IsUsbSupported fail"); + // } + // if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrvCfg_IsVtdSupported"), (void*)func_return_1, nullptr)) { + // dlog("[+] hook PrlSrvCfg_IsVtdSupported success"); + // } else { + // dlog("[+] hook PrlSrvCfg_IsVtdSupported fail"); + // } + if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrv_HasRestriction"), (void*)hook_PrlSrv_HasRestriction, nullptr)) { + dlog("[+] hook PrlSrv_HasRestriction success"); + } else { + dlog("[+] hook PrlSrv_HasRestriction fail"); + } + if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrv_SendProblemReport "), (void*)func_return_0, nullptr)) { + dlog("[+] hook PrlSrv_SendProblemReport success"); + } else { + dlog("[+] hook PrlSrv_SendProblemReport fail"); + } + if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrv_GetProblemReport"), (void*)func_return_0, nullptr)) { + dlog("[+] hook PrlSrv_GetProblemReport success"); + } else { + dlog("[+] hook PrlSrv_GetProblemReport fail"); + } + if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrv_GetPackedProblemReport"), (void*)func_return_0, nullptr)) { + dlog("[+] hook PrlSrv_GetPackedProblemReport success"); + } else { + dlog("[+] hook PrlSrv_GetPackedProblemReport fail"); + } + if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlReport_Send"), (void*)func_return_0, nullptr)) { + dlog("[+] hook PrlReport_Send success"); + } else { + dlog("[+] hook PrlReport_Send fail"); + } + if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlLic_GetUserName"), (void*)hook_PrlLic_GetUserName, nullptr)) { + dlog("[+] hook PrlLic_GetUserName success"); + } else { + dlog("[+] hook PrlLic_GetUserName fail"); + } + if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlLic_GetCompanyName"), (void*)hook_PrlLic_GetUserName, nullptr)) { + dlog("[+] hook PrlLic_GetCompanyName success"); + } else { + dlog("[+] hook PrlLic_GetCompanyName fail"); + } + + } +} + +void func_patch_dylibs() +{ + for (int i = 0; i < _dyld_image_count(); ++i) + { + const char *name = _dyld_get_image_name(i); + + if (str_ends_with(name, xorstr_("libprl_shared_apps.dylib"))) + { + dlog("[*] patch %s start.", name); + func_patch_libprl_shared_apps_dylib((char*)_dyld_get_image_header(i)); + dlog("[*] patch %s over.", name); + } + else if (str_ends_with(name, xorstr_("ParallelsVirtualizationSDK"))) + { + dlog("[*] patch %s start.", name); + func_patch_ParallelsVirtualizationSDK((char*)_dyld_get_image_header(i), i); + dlog("[*] patch %s over.", name); + } + else if (str_ends_with(name, xorstr_("LicenseServices"))) + { + dlog("[*] patch %s start.", name); + uint8_t replace0[] = OPCODE_RETURN_0; + uint8_t replace1[] = OPCODE_RETURN_1; + func_patch_objc(xorstr_("LocalPdInfo"), xorstr_("isLicenseValid"), replace1, sizeof(replace1)); + func_patch_objc(xorstr_("LocalPdInfo"), xorstr_("isBusinessEdition"), replace1, sizeof(replace1)); + func_patch_objc(xorstr_("LICLicenseInfo"), xorstr_("isBusiness"), replace1, sizeof(replace1)); + func_patch_objc(xorstr_("LICLicenseInfo"), xorstr_("rawStatus"), replace0, sizeof(replace0)); + func_patch_objc(xorstr_("LICLicenseInfo"), xorstr_("toolset"), replace1, sizeof(replace1)); + func_patch_objc(xorstr_("LocalPdInfo"), xorstr_("reinit"), replace0, sizeof(replace0)); + + // func_hook_objc(xorstr_("LocalPdInfo"), xorstr_("isLicenseValid"), (void *)func_return_1, nullptr); + // func_hook_objc(xorstr_("LocalPdInfo"), xorstr_("isBusinessEdition"), (void *)func_return_1, nullptr); + // func_hook_objc(xorstr_("LICLicenseInfo"), xorstr_("isBusiness"), (void *)func_return_1, nullptr); + // func_hook_objc(xorstr_("LICLicenseInfo"), xorstr_("rawStatus"), (void *)func_return_0, nullptr); + // func_hook_objc(xorstr_("LICLicenseInfo"), xorstr_("toolset"), (void *)func_return_1, nullptr); + // func_hook_objc(xorstr_("LocalPdInfo"), xorstr_("reinit"), (void *)func_return_0, nullptr); + dlog("[*] patch %s over.", name); + } + else if (str_ends_with(name, xorstr_("LicenseViews"))) + { + dlog("[*] patch %s start.", name); + uint8_t replace0[] = OPCODE_RETURN_0; + func_patch_objc(xorstr_("GeoIPLocator"), xorstr_("locate:"), replace0, sizeof(replace0)); + // func_hook_objc(xorstr_("GeoIPLocator"), xorstr_("locate:"), (void *)func_return_0, nullptr); + dlog("[*] patch %s over.", name); + } + else if (str_ends_with(name, xorstr_("ToolboxCommon"))) + { + dlog("[*] patch %s start.", name); + uint8_t replace0[] = OPCODE_RETURN_0; + uint8_t replace1[] = OPCODE_RETURN_1; + func_patch_objc(xorstr_("LocalPdInfo"), xorstr_("sendCEP"), replace0, sizeof(replace0)); + func_hook_objc(xorstr_("CEPLog"), xorstr_("setCEPDisabled:"), (void *)func_hook_CEPLog_setCEPDisabled, (void**)&vars_g_CEPLog_setCEPDisabled); + func_hook_objc(xorstr_("CEPLog"), xorstr_("setCEPSentAfterDisabling:"), (void *)func_hook_CEPLog_setCEPSentAfterDisabling, (void**)&vars_g_CEPLog_setCEPSentAfterDisabling); + // func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isTrial"), replace0, sizeof(replace0)); + // func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isBonus"), replace0, sizeof(replace0)); + // func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isReferralBonus"), replace0, sizeof(replace0)); + // func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isPDSubscription"), replace0, sizeof(replace0)); + // func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isBusiness"), replace1, sizeof(replace1)); + // func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isLocalPDBusiness"), replace0, sizeof(replace0)); + // func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isLocalPD"), replace0, sizeof(replace0)); + // func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isAutoRenewable"), replace0, sizeof(replace0)); + // func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isLicenseExpired"), replace0, sizeof(replace0)); + // func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isNoLicensePresented"), replace1, sizeof(replace1)); + + // func_hook_objc(xorstr_("CEPLog"), xorstr_("sendCEP"), (void *)func_return_0, nullptr); + // func_hook_objc(xorstr_("CEPLog"), xorstr_("setCEPDisabled:"), (void *)func_hook_CEPLog_setCEPDisabled, (void**)&vars_g_CEPLog_setCEPDisabled); + // func_hook_objc(xorstr_("CEPLog"), xorstr_("setCEPSentAfterDisabling:"), (void *)func_hook_CEPLog_setCEPSentAfterDisabling, (void**)&vars_g_CEPLog_setCEPSentAfterDisabling); + // func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isTrial"), (void *)func_return_0, nullptr); + // func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isBonus"), (void *)func_return_0, nullptr); + // func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isReferralBonus"), (void *)func_return_0, nullptr); + // func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isPDSubscription"), (void *)func_return_0, nullptr); + // func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isBusiness"), (void *)func_return_1, nullptr); + // func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isLocalPDBusiness"), (void *)func_return_0, nullptr); + // func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isLocalPD"), (void *)func_return_0, nullptr); + // func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isAutoRenewable"), (void *)func_return_0, nullptr); + // func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isLicenseExpired"), (void *)func_return_0, nullptr); + // func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isNoLicensePresented"), (void *)func_return_1, nullptr); + // func_hook_objc("CEPLicenseInfo", "expirationDate", (void *)func_return_0, nullptr); + dlog("[*] patch %s over.", name); + } + } +} + +void func_patch_Parallels_Toolbox() +{ + if (!func_check_version(xorstr_("4410"))) + { + dlog("[-] unsupport version."); + exit(0); + } + + uint8_t replace[] = OPCODE_RETURN_1; + func_hook_objc(xorstr_("ReportCollectorWithUI"), xorstr_("sendReport:parent:"), (void *)func_return_0, nullptr); + func_hook_objc(xorstr_("ReportCollector"), xorstr_("grabScreenshots"), (void *)func_return_0, nullptr); + func_hook_objc(xorstr_("ReportContactInfoWindowController"), xorstr_("onSendPress:"), (void *)func_return_0, nullptr); +} + +void func_patch_prl_vm_app() +{ + auto image_base = (char*)_dyld_get_image_header(0); + if (image_base) + { + #ifdef TARGET_ARCH_X64 + { + // __text:000000010000CD70 E8 8B 9C 9A 00 call sub_1009B6A00 + // __text:000000010000CD75 45 84 E4 test r12b, r12b + // __text:000000010000CD78 74 5B jz short loc_10000CDD5 ; <--- patch + // __text:000000010000CD7A 48 8D 05 EF FA 03 01 lea rax, qword_10104C870 + // __text:000000010000CD81 48 8B 18 mov rbx, [rax] + // __text:000000010000CD84 0F 57 C0 xorps xmm0, xmm0 + // __text:000000010000CD87 0F 29 45 A0 movaps xmmword ptr [rbp+var_60], xmm0 + // __text:000000010000CD8B 48 C7 45 B0 00 00 00 00 mov [rbp+var_50], 0 + // __text:000000010000CD93 48 8D BD 78 FF FF FF lea rdi, [rbp+var_88] + // __text:000000010000CD9A E8 31 B3 03 00 call sub_1000480D0 + // __text:000000010000CD9F 48 8D 55 A0 lea rdx, [rbp+var_60] + // __text:000000010000CDA3 48 8D 8D 78 FF FF FF lea rcx, [rbp+var_88] + // __text:000000010000CDAA 48 89 DF mov rdi, rbx + // __text:000000010000CDAD BE 79 10 01 80 mov esi, 80011079h ; <--- find + + uint8_t replace[] = { 0xEB }; + if (func_patch_data(image_base + 0xCD78, replace, sizeof(replace))) + { + dlog("[+] patch prl_vm_app 1 success."); + } + else + { + dlog("[-] patch prl_vm_app 1 fail."); + } + } + // patch dlopen bGliQ29uZmlndXJlcjY0LmR5bGli -> libConfigurer64.dylib + { + uint8_t replace[] = OPCODE_RETURN_0; + if (func_patch_data(image_base + 0x12780, replace, sizeof(replace))) + { + dlog("[+] patch prl_vm_app 2 success."); + } + else + { + dlog("[-] patch prl_vm_app 2 fail."); + } + } + #endif + + #ifdef TARGET_ARCH_ARM64 + { + // __text:000000010000E2C8 6B 66 22 94 BL sub_1008A7C74 + // __text:000000010000E2CC 97 02 00 34 CBZ W23, loc_10000E31C ; <--- patch + // __text:000000010000E2D0 08 65 00 D0 ADRP X8, #qword_100CB0020@PAGE + // __text:000000010000E2D4 1F 20 03 D5 NOP + // __text:000000010000E2D8 15 11 40 F9 LDR X21, [X8,#qword_100CB0020@PAGEOFF] + // __text:000000010000E2DC FF 7F 03 A9 STP XZR, XZR, [SP,#0x90+var_60] + // __text:000000010000E2E0 FF 23 00 F9 STR XZR, [SP,#0x90+var_50] + // __text:000000010000E2E4 E0 03 00 91 MOV X0, SP + // __text:000000010000E2E8 06 EE 00 94 BL sub_100049B00 + // __text:000000010000E2EC E2 C3 00 91 ADD X2, SP, #0x90+var_60 + // __text:000000010000E2F0 E3 03 00 91 MOV X3, SP + // __text:000000010000E2F4 E0 03 15 AA MOV X0, X21 + // __text:000000010000E2F8 21 0F 82 52 21 00 B0 72 MOV W1, #0x80011079 ; <--- find + uint8_t replace[] = {0x14, 0x00, 0x00, 0x14}; + if (func_patch_data(image_base + 0xE2CC, replace, sizeof(replace))) + { + dlog("[+] patch prl_vm_app 1 success."); + } + else + { + dlog("[-] patch prl_vm_app 1 fail."); + } + } + // patch dlopen bGliQ29uZmlndXJlcjY0LmR5bGli -> libConfigurer64.dylib + { + uint8_t replace[] = OPCODE_RETURN_0; + if (func_patch_data(image_base + 0x14014, replace, sizeof(replace))) + { + dlog("[+] patch prl_vm_app 2 success."); + } + else + { + dlog("[-] patch prl_vm_app 2 fail."); + } + } + #endif + } +} + +void func_write_fake_license() +{ + unsigned char fake_license_data[11699] = { + 0xA1, 0xD0, 0xFA, 0xFA, 0xFA, 0xFA, 0xF8, 0xB6, 0xB3, 0xB9, 0xBF, 0xB4, 0xA9, 0xBF, 0xF8, 0xE0, + 0xFA, 0xF8, 0xA1, 0x86, 0xF8, 0xB4, 0xBB, 0xB7, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x8A, + 0xA8, 0xB6, 0x8A, 0xA8, 0xB5, 0xEB, 0xED, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xAF, 0xAF, 0xB3, + 0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xB6, 0xB3, 0xB9, + 0x85, 0xB1, 0xBF, 0xA3, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, + 0xAA, 0xA8, 0xB5, 0xBE, 0xAF, 0xB9, 0xAE, 0x85, 0xAC, 0xBF, 0xA8, 0xA9, 0xB3, 0xB5, 0xB4, 0x86, + 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0xEB, 0xED, 0xF4, 0xF0, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, + 0xA9, 0x85, 0xAF, 0xAA, 0xBD, 0xA8, 0xBB, 0xBE, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, + 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xA9, 0xAF, 0xB8, 0xB6, 0xB3, 0xB9, 0xBF, + 0xB4, 0xA9, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, + 0xAA, 0xBB, 0xA8, 0xBF, 0xB4, 0xAE, 0x85, 0xB1, 0xBF, 0xA3, 0x86, 0xF8, 0xE0, 0xFA, 0xB4, 0xAF, + 0xB6, 0xB6, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xBB, 0xA8, 0xBF, 0xB4, 0xAE, 0x85, 0xAF, 0xAF, 0xB3, + 0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0xB4, 0xAF, 0xB6, 0xB6, 0xF6, 0xFA, 0x86, 0xF8, 0xB7, 0xBB, 0xB3, + 0xB4, 0x85, 0xAA, 0xBF, 0xA8, 0xB3, 0xB5, 0xBE, 0x85, 0xBF, 0xB4, 0xBE, 0xA9, 0x85, 0xBB, 0xAE, + 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0xE8, 0xEA, 0xEE, 0xEF, 0xF7, 0xEA, 0xEF, 0xF7, 0xEA, 0xE3, + 0xFA, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xBD, + 0xA8, 0xBB, 0xB9, 0xBF, 0x85, 0xAA, 0xBF, 0xA8, 0xB3, 0xB5, 0xBE, 0x85, 0xBF, 0xB4, 0xBE, 0xA9, + 0x85, 0xBB, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0xE8, 0xEA, 0xEE, 0xEF, 0xF7, 0xEA, 0xEF, + 0xF7, 0xEA, 0xE3, 0xFA, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0x86, 0xF8, 0xF6, 0xFA, + 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xBB, 0xAF, 0xAE, 0xB5, 0x85, 0xA8, 0xBF, 0xB4, 0xBF, 0xAD, 0xBB, + 0xB8, 0xB6, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, + 0xB3, 0xA9, 0x85, 0xB4, 0xBC, 0xA8, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, + 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xB8, 0xBF, 0xAE, 0xBB, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, + 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xB9, 0xB2, 0xB3, 0xB4, 0xBB, 0x86, + 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xA9, + 0xAF, 0xA9, 0xAA, 0xBF, 0xB4, 0xBE, 0xBF, 0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, + 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xBF, 0xA2, 0xAA, 0xB3, 0xA8, 0xBF, 0xBE, 0x86, + 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xBD, + 0xA8, 0xBB, 0xB9, 0xBF, 0x85, 0xAA, 0xBF, 0xA8, 0xB3, 0xB5, 0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, + 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xAA, 0xAF, 0xA8, 0xB9, 0xB2, + 0xBB, 0xA9, 0xBF, 0xBE, 0x85, 0xB5, 0xB4, 0xB6, 0xB3, 0xB4, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, + 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB6, 0xB3, 0xB7, 0xB3, 0xAE, 0x86, 0xF8, 0xE0, + 0xFA, 0xEB, 0xEA, 0xF6, 0xFA, 0x86, 0xF8, 0xAF, 0xA9, 0xBB, 0xBD, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, + 0xEB, 0xF6, 0xFA, 0x86, 0xF8, 0xBF, 0xBE, 0xB3, 0xAE, 0xB3, 0xB5, 0xB4, 0x86, 0xF8, 0xE0, 0xFA, + 0xE8, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xB6, 0xBB, 0xAE, 0xBC, 0xB5, 0xA8, 0xB7, 0x86, 0xF8, 0xE0, + 0xFA, 0xE9, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xA8, 0xB5, 0xBE, 0xAF, 0xB9, 0xAE, 0x86, 0xF8, 0xE0, + 0xFA, 0xED, 0xF6, 0xFA, 0x86, 0xF8, 0xB5, 0xBC, 0xBC, 0xB6, 0xB3, 0xB4, 0xBF, 0x86, 0xF8, 0xE0, + 0xFA, 0xAE, 0xA8, 0xAF, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB9, 0xAA, 0xAF, 0x85, 0xB6, 0xB3, 0xB7, + 0xB3, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0xE9, 0xE8, 0xF6, 0xFA, 0x86, 0xF8, 0xA8, 0xBB, 0xB7, 0x85, + 0xB6, 0xB3, 0xB7, 0xB3, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0xEB, 0xE9, 0xEB, 0xEA, 0xED, 0xE8, 0xF6, + 0xFA, 0x86, 0xF8, 0xB2, 0xB5, 0xA9, 0xAE, 0xA9, 0x86, 0xF8, 0xE0, 0xFA, 0x81, 0xA1, 0x86, 0xF8, + 0xB4, 0xBB, 0xB7, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x9D, 0x9E, 0x8A, 0x88, 0x85, 0x92, + 0x93, 0x9E, 0x9E, 0x9F, 0x94, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xB2, 0xAD, 0x85, 0xB3, 0xBE, + 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xA8, 0xB5, 0xBE, + 0xAF, 0xB9, 0xAE, 0x85, 0xAC, 0xBF, 0xA8, 0xA9, 0xB3, 0xB5, 0xB4, 0x86, 0xF8, 0xE0, 0xFA, 0x86, + 0xF8, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xBB, 0xB9, 0xAE, 0xB3, 0xAC, 0xBB, 0xAE, 0xBF, 0xBE, + 0x85, 0xBB, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0xE8, 0xEA, 0xE8, 0xEB, 0xF7, 0xEA, 0xEF, + 0xF7, 0xEA, 0xE3, 0xFA, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0x86, 0xF8, 0xA7, 0x87, + 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xAE, 0xA8, 0xB3, 0xBB, 0xB6, 0x86, 0xF8, 0xE0, 0xFA, + 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xA7, 0xF8, 0xF6, 0xD0, 0xFA, 0xFA, 0xFA, 0xFA, 0xF8, 0xAA, 0xAF, + 0xB8, 0xB6, 0xB3, 0xB9, 0x99, 0xBF, 0xA8, 0xAE, 0xA9, 0xF8, 0xE0, 0xFA, 0xF8, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0x98, 0x9F, 0x9D, 0x93, 0x94, 0xFA, 0x99, 0x9F, 0x88, 0x8E, 0x93, 0x9C, 0x93, 0x99, + 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, 0x97, 0x93, 0x93, 0x9D, 0xAA, 0x9E, + 0x99, 0x99, 0x98, 0x93, 0xA3, 0xBD, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0xBD, 0x93, 0x99, 0x9F, 0x9B, + 0x9B, 0xAD, 0x9E, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, 0xB9, 0x94, 0x9B, 0x8B, + 0x9F, 0x96, 0x98, 0x8B, 0x9B, 0xAD, 0xBE, 0x9E, 0x9F, 0x96, 0x97, 0x9B, 0xB1, 0x9D, 0x9B, 0xEB, + 0x8F, 0x9F, 0x98, 0xB2, 0x97, 0x99, 0x8F, 0xB6, 0x8F, 0xA2, 0x86, 0xB4, 0x9E, 0xA0, 0x9B, 0x94, + 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0xB9, 0x97, 0x98, 0xB1, 0xEB, 0xAC, 0xB9, 0xE8, 0x94, 0xAC, + 0xBE, 0xA0, 0x9F, 0xB0, 0x97, 0x99, 0x9F, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xBD, 0xAD, 0xBB, + 0x8F, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, 0xB6, 0x8B, + 0x93, 0x9F, 0xB2, 0xAC, 0xB8, 0x9D, 0x88, 0xAA, 0xB8, 0xB7, 0xBE, 0xA0, 0x86, 0xB4, 0x93, 0x9F, + 0xBE, 0xAE, 0x83, 0xB1, 0xBD, 0xA2, 0x9F, 0x9E, 0x9B, 0x95, 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, + 0xA9, 0x97, 0x98, 0xEA, 0x88, 0xB6, 0xB9, 0xE8, 0xAE, 0xEA, 0xB8, 0xE9, 0x9B, 0xA2, 0x92, 0x8E, + 0x9B, 0xB8, 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0x97, 0x97, 0x9C, 0x9C, 0x98, 0xB2, 0xB9, 0xB7, + 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x9F, 0x80, 0x82, 0x94, 0xA8, 0x86, 0xB4, + 0xBE, 0x9D, 0xE3, 0xAD, 0x93, 0x9F, 0x94, 0x98, 0x97, 0x98, 0xEE, 0x82, 0x9E, 0x8E, 0x9F, 0xEE, + 0x97, 0x8E, 0x93, 0xA3, 0x94, 0x9E, 0x9B, 0xEF, 0x97, 0x9E, 0x97, 0xEB, 0x94, 0xEB, 0xB5, 0x82, + 0x9E, 0x8E, 0x93, 0xEE, 0x97, 0x8E, 0x9F, 0xAD, 0x94, 0xB0, 0x9B, 0xEF, 0x97, 0x9E, 0x97, 0xEB, + 0x94, 0xEB, 0xB5, 0xAD, 0xBE, 0xA0, 0x9F, 0x96, 0x97, 0x9B, 0xB1, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, + 0x86, 0xB4, 0x98, 0xB2, 0x97, 0x99, 0x8F, 0xB6, 0x8F, 0xA2, 0x9E, 0xA0, 0x9B, 0x94, 0x98, 0xBD, + 0x94, 0x8C, 0x98, 0x9B, 0xB9, 0x8E, 0x98, 0xB1, 0xEB, 0xAC, 0xB9, 0xE8, 0x94, 0xAC, 0xBE, 0xA0, + 0x9F, 0xB6, 0x97, 0x99, 0x97, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xB2, 0x97, 0xB9, 0x8F, 0x9D, + 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, 0xB6, 0xAF, 0xBE, 0x9D, + 0x8C, 0xA3, 0x86, 0xB4, 0xB8, 0xB7, 0x9C, 0xEA, 0xBB, 0x8D, 0xE3, 0xAF, 0x83, 0x8D, 0xAD, 0xBD, + 0x88, 0xE8, 0xEB, 0xB3, 0x89, 0x9E, 0x9F, 0x8B, 0x97, 0x9B, 0xEE, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, + 0x99, 0xA2, 0x97, 0x92, 0x88, 0x9D, 0x8C, 0xA0, 0xBB, 0xE9, 0x88, 0xAC, 0xB9, 0x9E, 0x9F, 0xBF, + 0x97, 0x98, 0xAD, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x9B, 0xA2, 0x97, 0x8C, 0x80, 0x9D, 0x8C, 0xA0, + 0xBB, 0xE9, 0x88, 0xAC, 0x86, 0xB4, 0xB9, 0x99, 0xEF, 0xAD, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, + 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xAF, 0x83, 0xE8, 0xE3, 0xAE, 0x97, 0x93, 0x93, 0x98, 0x93, 0xB0, + 0x9B, 0x94, 0x98, 0xBD, 0xB1, 0xAB, 0xB2, 0xB1, 0xB3, 0x9D, 0xE3, 0xAD, 0xEA, 0x98, 0x9B, 0x8B, + 0x9F, 0x9C, 0x9B, 0x9B, 0x95, 0x99, 0x9B, 0x8B, 0xE2, 0x9B, 0x97, 0x93, 0x93, 0x98, 0x99, 0xBD, + 0x91, 0x99, 0x9B, 0x8B, 0x9F, 0x9B, 0x86, 0xB4, 0xA0, 0xB5, 0x8C, 0x8A, 0x8A, 0xEC, 0xEA, 0xB5, + 0x83, 0x8E, 0xB0, 0xA9, 0xAD, 0x97, 0xE2, 0xAC, 0xA9, 0x8D, 0xBD, 0xAA, 0x94, 0x95, 0x9C, 0xE3, + 0x80, 0xA3, 0x98, 0xE9, 0xAD, 0x8F, 0xF5, 0xA9, 0x90, 0xBF, 0x83, 0xAE, 0xB7, 0xBF, 0x99, 0xF1, + 0xEA, 0xBF, 0x8E, 0x8C, 0x9E, 0xAB, 0x83, 0xBC, 0x93, 0xE2, 0x8B, 0xAB, 0xE8, 0xF5, 0x9B, 0xB5, + 0x9E, 0x96, 0xB2, 0x9F, 0x93, 0xBD, 0xEC, 0xB9, 0x86, 0xB4, 0xAC, 0xBE, 0xE2, 0xAC, 0x9D, 0x9E, + 0x8F, 0xB7, 0x82, 0x8E, 0xAC, 0xB1, 0x82, 0xF1, 0xA8, 0xF5, 0xB8, 0x80, 0x99, 0x89, 0xE3, 0xB5, + 0x88, 0xEC, 0xB5, 0xE9, 0x97, 0xE8, 0xB5, 0xAE, 0xA9, 0xBD, 0xAD, 0x97, 0xA0, 0xA9, 0x88, 0x8B, + 0x8B, 0xBD, 0x95, 0x8D, 0xBC, 0xB4, 0xBD, 0xA3, 0x98, 0xE9, 0x8A, 0x8C, 0xB2, 0xEA, 0x8C, 0xF1, + 0x9C, 0x97, 0xEC, 0xE2, 0x9E, 0xB5, 0x99, 0x80, 0x80, 0x9C, 0x86, 0xB4, 0x96, 0x89, 0x83, 0x8B, + 0xE9, 0x9D, 0xB2, 0xAC, 0xED, 0x9B, 0x91, 0xE8, 0xEB, 0x97, 0xF5, 0xBD, 0xEE, 0x8E, 0xB9, 0x91, + 0x9C, 0x83, 0xE9, 0xEA, 0xB4, 0xBD, 0xB9, 0xE3, 0xBB, 0xAC, 0x97, 0x90, 0xBF, 0x90, 0xEC, 0xB6, + 0x89, 0x96, 0xA0, 0xAA, 0x9F, 0xA3, 0x8C, 0xEC, 0x83, 0xB1, 0x9E, 0xB8, 0x98, 0xEA, 0x8C, 0x98, + 0xB9, 0x9B, 0x95, 0x89, 0xBF, 0xEA, 0x9B, 0xA3, 0x9B, 0x8F, 0x94, 0xEE, 0x86, 0xB4, 0xBB, 0xE3, + 0xEF, 0xED, 0x8F, 0xAD, 0x88, 0xAE, 0xE8, 0xB2, 0x8C, 0xB4, 0xEF, 0xB1, 0x99, 0xA8, 0xEF, 0x9E, + 0x8A, 0xB0, 0xBF, 0xEE, 0xAD, 0xEB, 0xA2, 0x82, 0xB4, 0x92, 0x93, 0xA2, 0xF1, 0x97, 0xB2, 0xA8, + 0xB2, 0x9D, 0xBD, 0x8F, 0xA0, 0xEA, 0xA9, 0xAE, 0x8B, 0x82, 0xE8, 0x83, 0xAF, 0xEE, 0xBF, 0xE8, + 0xF1, 0xB6, 0xAA, 0xA3, 0xEA, 0xA8, 0x98, 0x9F, 0x8F, 0xED, 0x92, 0x93, 0xAB, 0xBF, 0x86, 0xB4, + 0xAA, 0x99, 0xAB, 0x8C, 0x89, 0xAD, 0x89, 0xBF, 0x9B, 0xBC, 0xA8, 0xBD, 0xB5, 0xB4, 0xAD, 0x8F, + 0x9B, 0x98, 0xEB, 0xBE, 0x8E, 0x8A, 0x89, 0x80, 0xEF, 0xAD, 0x92, 0x98, 0x83, 0xB3, 0x82, 0xE9, + 0xEA, 0xA2, 0xF1, 0x8F, 0xBB, 0x97, 0x89, 0xB9, 0x92, 0xB6, 0x92, 0xAF, 0x8A, 0x95, 0xA8, 0x8F, + 0xA3, 0xEE, 0xB8, 0x89, 0xE8, 0xBF, 0xEF, 0xB7, 0x97, 0x88, 0xF1, 0x9C, 0x8D, 0x9D, 0xB2, 0xE3, + 0x86, 0xB4, 0xAC, 0xE9, 0xB5, 0x94, 0x98, 0x88, 0x97, 0xB2, 0x96, 0x8A, 0x90, 0x9D, 0xE3, 0x83, + 0x93, 0xAB, 0xAF, 0x9D, 0x9F, 0xEE, 0xAE, 0xAD, 0x93, 0x9E, 0x9B, 0x8B, 0x9B, 0x98, 0xB5, 0xEE, + 0x93, 0x99, 0x95, 0xA0, 0x99, 0x99, 0x9B, 0xB0, 0xB9, 0xAD, 0x9E, 0x9B, 0x83, 0x9E, 0x8C, 0x88, + 0xEA, 0x8E, 0x9B, 0x8B, 0x92, 0xF5, 0x98, 0x9B, 0x93, 0xAD, 0x9B, 0x9E, 0x9B, 0x95, 0x98, 0xBD, + 0x94, 0x8C, 0x86, 0xB4, 0x92, 0x8B, 0xE2, 0x98, 0x9B, 0xBC, 0xE2, 0x9F, 0x98, 0x9B, 0x97, 0x99, + 0x98, 0xEE, 0x9B, 0xAD, 0x92, 0x8B, 0x83, 0x9E, 0x8C, 0x88, 0xEA, 0x95, 0x98, 0x98, 0x83, 0x9F, + 0x9C, 0x9D, 0xEB, 0xB8, 0xB3, 0x82, 0xAD, 0x89, 0xB5, 0x9E, 0xEE, 0x90, 0xAD, 0xB0, 0x99, 0xB4, + 0xAB, 0xED, 0xB1, 0xAB, 0x8F, 0xE2, 0xBC, 0xBD, 0x82, 0x94, 0xAC, 0xE8, 0x97, 0x98, 0xE2, 0x9D, + 0x9B, 0xEB, 0x8F, 0xBE, 0x86, 0xB4, 0x93, 0xAD, 0x8B, 0x83, 0x97, 0x98, 0xBB, 0x9B, 0x9C, 0x9B, + 0x96, 0xB1, 0xA0, 0xBC, 0x96, 0xEB, 0x9D, 0xB2, 0x8D, 0x9E, 0xB8, 0xBC, 0x99, 0xA8, 0xA8, 0xAD, + 0x8B, 0x88, 0xA2, 0x88, 0xBC, 0xEF, 0xE8, 0x9F, 0xA3, 0x8A, 0x97, 0x9F, 0x9F, 0x9D, 0x99, 0x99, + 0xA9, 0x9D, 0x9B, 0x8B, 0x8F, 0x9C, 0x98, 0xAD, 0x9F, 0x98, 0x98, 0x9E, 0x8F, 0xAD, 0x97, 0xA0, + 0x9B, 0xA2, 0x98, 0xBD, 0xBD, 0xA8, 0x86, 0xB4, 0x98, 0xBD, 0x9F, 0x9C, 0x98, 0x8B, 0xB9, 0xAD, + 0x9B, 0xB5, 0x83, 0xB6, 0xBB, 0x92, 0x88, 0xEA, 0xB9, 0x9E, 0xB5, 0xAC, 0x96, 0xE9, 0xBE, 0xE9, + 0xBE, 0xA3, 0xEF, 0xAD, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xAF, + 0x83, 0xE8, 0xE3, 0xAE, 0x96, 0xE8, 0x94, 0xB2, 0x96, 0xE9, 0x98, 0xB1, 0x82, 0xE8, 0x94, 0xB2, + 0x96, 0xB4, 0x98, 0xB6, 0xB8, 0x8E, 0x9B, 0xE8, 0x86, 0xB4, 0x98, 0xBD, 0x94, 0x8C, 0x92, 0x88, + 0xE2, 0x9F, 0x96, 0xA0, 0x9B, 0xAE, 0x97, 0x99, 0xAF, 0xBD, 0x91, 0xBB, 0x9B, 0xB4, 0xB2, 0xB3, + 0x8C, 0xB5, 0xBE, 0x92, 0x88, 0xAD, 0x95, 0xB3, 0xE2, 0xAC, 0xBE, 0xE9, 0xBE, 0xE9, 0x96, 0xB4, + 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0xEF, 0xB0, 0xB8, 0xE8, + 0xEA, 0xAC, 0x83, 0xE8, 0x9F, 0xAC, 0xB9, 0x9D, 0x88, 0xBC, 0x86, 0xB4, 0x83, 0xE8, 0x9F, 0xAF, + 0x83, 0xE9, 0x90, 0xA9, 0x97, 0x93, 0x93, 0x98, 0x90, 0xBD, 0x83, 0x9E, 0x8C, 0x88, 0xEA, 0xBD, + 0x98, 0x93, 0x93, 0x98, 0x92, 0x8E, 0x99, 0x99, 0x9B, 0x88, 0xB1, 0xAD, 0xBD, 0xBB, 0xEA, 0x9D, + 0x9E, 0xB3, 0xA9, 0x9D, 0x9B, 0x8B, 0x8B, 0x98, 0xBD, 0xB9, 0xAD, 0xED, 0xBD, 0xE9, 0xEA, 0x99, + 0x9B, 0xBD, 0x9F, 0x98, 0x97, 0x93, 0x9D, 0xBB, 0x97, 0x9E, 0xB1, 0x9D, 0x86, 0xB4, 0x99, 0x99, + 0xA9, 0x9D, 0x9B, 0x8B, 0x8F, 0x9C, 0x98, 0xAD, 0x93, 0x98, 0x9C, 0xB3, 0xEB, 0xB5, 0xBE, 0x92, + 0x88, 0xAD, 0x95, 0xB3, 0xE2, 0xAC, 0x83, 0xE8, 0x9F, 0xAF, 0xB9, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, + 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x96, 0xB7, 0xEF, 0xB6, 0xBE, 0x99, 0xE3, 0xB0, 0x83, 0x89, + 0xE3, 0xAD, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x94, 0xBC, 0x86, 0xB4, + 0x83, 0xE9, 0x98, 0xA0, 0x96, 0xB7, 0xB2, 0xEA, 0xB8, 0x8D, 0xAD, 0xAD, 0x82, 0x8B, 0x83, 0x93, + 0x91, 0xAD, 0x83, 0x98, 0x98, 0x8B, 0x8F, 0x92, 0x9B, 0xBD, 0x93, 0xAD, 0x8F, 0x8E, 0x9B, 0xBC, + 0x9D, 0xB2, 0xB2, 0x8B, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xBD, + 0x89, 0x9D, 0xE3, 0xA9, 0x80, 0x9D, 0xB6, 0xAF, 0x80, 0xE9, 0x97, 0xA9, 0x93, 0x9D, 0xA2, 0xEA, + 0x86, 0xB4, 0x80, 0x99, 0xEE, 0xAD, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0x88, 0xB5, 0xAF, 0x88, 0x82, + 0xB2, 0xEA, 0x80, 0x82, 0x90, 0xAF, 0x83, 0x8D, 0xAD, 0xBD, 0x8B, 0xB7, 0x9C, 0xA0, 0xBB, 0x8D, + 0x97, 0xBD, 0x8B, 0xE8, 0x8C, 0xA3, 0xBE, 0x9D, 0xB6, 0xB7, 0xBB, 0x8D, 0x94, 0xB2, 0xBE, 0x9D, + 0xE3, 0xAF, 0x93, 0x9C, 0x98, 0xA3, 0x83, 0x8D, 0x94, 0xEA, 0xBB, 0x8D, 0x94, 0xB6, 0x93, 0x9C, + 0x94, 0xEA, 0x86, 0xB4, 0x83, 0x82, 0x88, 0xB6, 0xB8, 0x8D, 0x8C, 0xAF, 0xBE, 0x9E, 0x98, 0xB4, + 0x98, 0xBD, 0xEE, 0xA8, 0x98, 0xBD, 0x9F, 0x9F, 0x9B, 0x83, 0x92, 0x97, 0x95, 0xEE, 0x94, 0xE3, + 0x9B, 0xBD, 0x90, 0xB7, 0x9B, 0xA0, 0x98, 0x8C, 0x97, 0x9C, 0x97, 0x9D, 0x99, 0x99, 0xA9, 0x9D, + 0x9B, 0x8B, 0x8F, 0x9C, 0x98, 0xAD, 0x93, 0x99, 0x97, 0x9F, 0xB9, 0xAD, 0x92, 0xA2, 0xB5, 0x83, + 0x8F, 0x9D, 0x9C, 0xA3, 0x86, 0xB4, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, + 0xB2, 0xAC, 0xB8, 0x9D, 0x88, 0xAA, 0xB8, 0xB7, 0xBE, 0xA0, 0x96, 0x99, 0x98, 0xA9, 0xBE, 0x9D, + 0x8B, 0xAF, 0x97, 0x9B, 0x97, 0x99, 0x9B, 0x8B, 0x9F, 0xBB, 0x90, 0x9C, 0x98, 0xB2, 0xB9, 0xB7, + 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x9F, 0x80, 0x82, 0x94, 0xA8, 0xBE, 0x9D, + 0xE3, 0xAD, 0x93, 0x9F, 0x94, 0xB6, 0x86, 0xB4, 0xB9, 0xB4, 0x88, 0xAA, 0x80, 0xB7, 0xB6, 0xB0, + 0x83, 0x82, 0x88, 0xB6, 0x93, 0x9C, 0x98, 0xAC, 0xB8, 0x9D, 0xB6, 0xB0, 0xBF, 0x8E, 0x9B, 0xA3, + 0x98, 0xBD, 0x94, 0x8C, 0x92, 0x88, 0x9F, 0x9F, 0x91, 0xA0, 0x9B, 0xAA, 0xBD, 0xB2, 0x8C, 0xB1, + 0x80, 0x82, 0x94, 0xA8, 0xBE, 0x9D, 0xE3, 0xAD, 0x96, 0xB4, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, + 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0xEF, 0xB0, 0x86, 0xB4, 0xB8, 0xE8, 0xE8, 0x99, 0x9F, 0x9D, + 0xEB, 0xEF, 0x96, 0xB4, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, + 0xEF, 0xB0, 0xB8, 0xE8, 0xEA, 0xAD, 0x9E, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, + 0xB9, 0x94, 0x9B, 0x8B, 0x9F, 0x96, 0x98, 0x8B, 0x9B, 0x9E, 0xBD, 0xBD, 0x93, 0x98, 0x9B, 0x93, + 0x8C, 0xB5, 0x8C, 0xAC, 0xA2, 0xAD, 0x97, 0x90, 0x96, 0xBB, 0x86, 0xB4, 0xAE, 0xA9, 0xB2, 0xB5, + 0xBB, 0xBF, 0xBB, 0xEB, 0xB8, 0xAB, 0xA9, 0xB4, 0x9E, 0xE8, 0x9C, 0x8F, 0xEB, 0xA8, 0xF5, 0x9C, + 0xB5, 0x8B, 0xA3, 0xEB, 0xB4, 0xAA, 0xEF, 0xB3, 0xBC, 0x91, 0x8B, 0xED, 0xBC, 0xAC, 0x9E, 0xA8, + 0xF1, 0xA0, 0xE2, 0xBD, 0x83, 0xEA, 0xB5, 0x91, 0x9E, 0xA8, 0x95, 0xB8, 0x88, 0xB9, 0x83, 0x8E, + 0xBF, 0xB3, 0x88, 0xBC, 0x89, 0x9D, 0x9D, 0xEB, 0x8E, 0xA3, 0x82, 0x8D, 0x86, 0xB4, 0x94, 0xBC, + 0x83, 0xE3, 0xB4, 0xB6, 0xBD, 0xB8, 0x96, 0x90, 0x95, 0xED, 0xBC, 0x97, 0xEF, 0xAC, 0xAA, 0xAB, + 0xAC, 0xB0, 0xEF, 0x8D, 0x8B, 0x90, 0x94, 0xBB, 0x8F, 0xB0, 0x93, 0xA0, 0xA2, 0x94, 0xB9, 0xB3, + 0xAE, 0x94, 0xB4, 0xED, 0xAE, 0xBF, 0x9D, 0xEF, 0xB9, 0xEF, 0xF5, 0x99, 0xEA, 0xBC, 0xB1, 0xB3, + 0x8D, 0xBF, 0x9E, 0x92, 0xE3, 0xAE, 0xEA, 0xEB, 0xBD, 0x96, 0x88, 0xAA, 0xAC, 0x95, 0x86, 0xB4, + 0xB1, 0xEF, 0x98, 0xEE, 0xA0, 0x9E, 0xBC, 0xE2, 0x9B, 0x92, 0xB8, 0xB1, 0xB0, 0xA8, 0xBC, 0xED, + 0xE9, 0xAD, 0xB2, 0x80, 0xA0, 0xB3, 0xAF, 0x8A, 0xB2, 0xB8, 0xA3, 0x99, 0xA3, 0xA2, 0xB0, 0xAC, + 0xBE, 0xB4, 0x8C, 0xB5, 0xAF, 0x8A, 0xEF, 0xB5, 0x8A, 0xAD, 0x98, 0xE3, 0x97, 0x83, 0x8B, 0x96, + 0xA3, 0xA2, 0x8B, 0x97, 0xB6, 0x8C, 0xAC, 0x83, 0xB6, 0xEA, 0x98, 0x99, 0xEE, 0xAD, 0x98, 0xB3, + 0x86, 0xB4, 0xB1, 0xB1, 0xBB, 0xA3, 0xB7, 0xAB, 0x8D, 0x98, 0x93, 0xA2, 0xBF, 0x91, 0x98, 0x8D, + 0x9E, 0x9F, 0x8B, 0xA3, 0x9D, 0xAC, 0x8C, 0xBB, 0xB8, 0xA9, 0x95, 0xB5, 0xEB, 0x91, 0xA8, 0xB5, + 0xEC, 0xA2, 0xB1, 0xEF, 0xA9, 0xEC, 0x89, 0xAF, 0xAF, 0xAE, 0x97, 0x9F, 0xEC, 0x96, 0xE3, 0xED, + 0xB1, 0xB7, 0x8B, 0xBB, 0x88, 0x9D, 0xB8, 0x95, 0xAC, 0xB8, 0x99, 0x80, 0xE3, 0xEF, 0xB4, 0xB3, + 0x9F, 0x92, 0x86, 0xB4, 0xBF, 0x91, 0xAF, 0xBB, 0xF5, 0xEB, 0x94, 0xBD, 0xAE, 0xE3, 0x8F, 0xE9, + 0x83, 0xEC, 0xBC, 0x8A, 0xAD, 0x8A, 0xEC, 0xBD, 0x8C, 0xBB, 0x8B, 0xBD, 0xB6, 0x80, 0x98, 0xB9, + 0x8A, 0xBD, 0xA9, 0xEF, 0xF1, 0xEE, 0xBB, 0xF1, 0xB2, 0xBE, 0xF5, 0xE2, 0xBD, 0x8A, 0x80, 0xF1, + 0x82, 0xB8, 0x8C, 0x82, 0xA9, 0x91, 0xEC, 0xE2, 0xB0, 0xE3, 0xBF, 0x8F, 0x97, 0xAF, 0xB2, 0x97, + 0xB5, 0x9C, 0xBE, 0x91, 0x86, 0xB4, 0xB9, 0xBB, 0x94, 0xBF, 0xB0, 0xB4, 0x8B, 0xAE, 0xE9, 0x99, + 0xAC, 0xA9, 0xB4, 0xAA, 0xED, 0xB5, 0xB2, 0x89, 0xB5, 0x88, 0x83, 0xE9, 0xA8, 0x91, 0xBE, 0xBC, + 0x9D, 0xEA, 0x93, 0xBE, 0xA3, 0xF5, 0xEE, 0x92, 0x90, 0x99, 0xB3, 0x99, 0x99, 0x95, 0xB4, 0x9E, + 0x9E, 0xAA, 0x8A, 0x82, 0xAC, 0xAB, 0x8B, 0xAB, 0x9B, 0xB5, 0xEA, 0xB9, 0xAD, 0x9F, 0xB2, 0xB8, + 0x89, 0xB0, 0x93, 0xEC, 0xEC, 0x83, 0x86, 0xB4, 0xA0, 0xBE, 0xAE, 0x9F, 0xB1, 0x99, 0x9C, 0xAA, + 0x8D, 0xA0, 0xE8, 0xE9, 0xA8, 0x9D, 0x9F, 0xB6, 0x8B, 0x97, 0xA2, 0x93, 0xA9, 0xEC, 0xB5, 0xB0, + 0xAD, 0x91, 0xF5, 0xBD, 0xAF, 0xEF, 0xF1, 0xA9, 0x90, 0xAA, 0x9F, 0xF1, 0xB6, 0xED, 0x8B, 0xAA, + 0x82, 0xBC, 0x99, 0x93, 0xB2, 0xA8, 0xA3, 0xAB, 0x9D, 0xAB, 0x88, 0x92, 0xAA, 0xBE, 0xB1, 0x89, + 0x9E, 0xAA, 0xED, 0x8A, 0xB9, 0xEB, 0x90, 0xA8, 0x86, 0xB4, 0x90, 0x97, 0xAA, 0xA3, 0x94, 0xB2, + 0x9E, 0x9F, 0x93, 0xEA, 0x8B, 0xB0, 0x8A, 0x82, 0xB1, 0x89, 0xB4, 0x97, 0x8C, 0xA2, 0x97, 0x8B, + 0xAF, 0x92, 0x8F, 0xB3, 0xBE, 0x9B, 0x88, 0xA8, 0xEE, 0xE9, 0x95, 0xE9, 0xE8, 0xA3, 0xAE, 0xEA, + 0x8C, 0x9E, 0xF5, 0x80, 0xA3, 0xAE, 0xEC, 0xA9, 0xB8, 0xE8, 0xBD, 0xB7, 0x93, 0xB4, 0x9C, 0xEC, + 0x82, 0x90, 0xA8, 0xB6, 0x83, 0x99, 0x9E, 0xAC, 0x95, 0xA0, 0x86, 0xB4, 0xAA, 0xAF, 0x91, 0x8A, + 0xB5, 0x95, 0x9F, 0xE3, 0x9F, 0x97, 0x93, 0xED, 0xEE, 0x82, 0xA0, 0x91, 0xAD, 0xEF, 0x9C, 0xA9, + 0x8C, 0xB2, 0x8C, 0x8F, 0xAA, 0xE2, 0x8D, 0xBF, 0xB7, 0xE2, 0x93, 0xA8, 0xED, 0xBF, 0x8A, 0xEC, + 0x9D, 0x80, 0xED, 0xB2, 0x8A, 0xE8, 0xEB, 0x90, 0xED, 0x99, 0xE3, 0xAE, 0x8A, 0xB1, 0xB3, 0x83, + 0xB0, 0x90, 0xAB, 0x82, 0xEC, 0xB0, 0x90, 0xAC, 0xAC, 0x96, 0x9F, 0xEC, 0x86, 0xB4, 0xB8, 0x8A, + 0x9F, 0x8E, 0xB6, 0x96, 0xEE, 0xE2, 0xBF, 0xA9, 0x8D, 0xEF, 0xEF, 0x80, 0xB7, 0x9F, 0xEF, 0xED, + 0x89, 0x9F, 0xF1, 0x9C, 0xEB, 0xB5, 0xAB, 0x91, 0xF5, 0xB2, 0x8B, 0xEF, 0xAE, 0x9E, 0x90, 0xAD, + 0xB4, 0xBF, 0x9F, 0xA8, 0xA3, 0x90, 0x80, 0xF1, 0xE2, 0x91, 0xB5, 0xB3, 0x9E, 0xEE, 0xE8, 0x89, + 0x91, 0xBB, 0xBC, 0xEA, 0xB1, 0xE8, 0xE3, 0xB3, 0x8B, 0xBC, 0x82, 0x92, 0xEB, 0x9C, 0x86, 0xB4, + 0x83, 0x89, 0xB9, 0x9D, 0xB6, 0x92, 0xEF, 0xE2, 0xA8, 0x82, 0x82, 0xB0, 0x9B, 0x80, 0xAC, 0xF1, + 0xB1, 0x92, 0x94, 0x8E, 0xA9, 0x90, 0xF1, 0xA0, 0x96, 0x82, 0xF5, 0xF5, 0x91, 0xAA, 0xA0, 0x8E, + 0x86, 0xB4, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x9F, 0x94, 0x9E, 0xFA, 0x99, 0x9F, 0x88, 0x8E, 0x93, + 0x9C, 0x93, 0x99, 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0x98, 0x9F, 0x9D, 0x93, 0x94, 0xFA, 0x99, 0x9F, 0x88, 0x8E, 0x93, 0x9C, 0x93, 0x99, + 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, 0x97, 0x93, 0x93, 0x92, 0xE3, 0x8E, + 0x99, 0x99, 0x98, 0xBE, 0xE8, 0xBD, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0xBD, 0x93, 0x99, 0x9F, 0x9B, + 0x97, 0xAD, 0x9E, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, 0xB9, 0x94, 0x9B, 0x8B, + 0x9F, 0x96, 0x98, 0x8B, 0x9B, 0xAD, 0xBE, 0x9E, 0x9F, 0x96, 0x97, 0x9B, 0xB1, 0x9D, 0x9B, 0xEB, + 0x8F, 0x9F, 0x98, 0xB2, 0x97, 0x99, 0x8F, 0xB6, 0x8F, 0xA2, 0x86, 0xB4, 0x9E, 0xA0, 0x9B, 0x94, + 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0xB9, 0x97, 0x98, 0xB1, 0xEB, 0xAC, 0xBE, 0xE8, 0x94, 0xAC, + 0xBE, 0xA0, 0x9F, 0xB0, 0x97, 0x99, 0x9F, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xBD, 0xAD, 0xBB, + 0x8F, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, 0xB6, 0x8B, + 0x93, 0x9F, 0xB2, 0xAC, 0xB8, 0x9D, 0x88, 0xAA, 0xB8, 0xB7, 0xBE, 0xA0, 0x86, 0xB4, 0x93, 0x9F, + 0xBE, 0xAE, 0x83, 0xB1, 0xBD, 0xA2, 0x9E, 0xB0, 0x9B, 0x97, 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, + 0xA9, 0x97, 0x98, 0x8F, 0x94, 0xA9, 0xB8, 0xE9, 0x8C, 0xB1, 0x97, 0x88, 0xE2, 0xAD, 0x92, 0x8B, + 0x83, 0x9E, 0x8C, 0x8B, 0x8B, 0x9E, 0x9E, 0x98, 0x80, 0x8B, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, + 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x90, 0xB9, 0xE9, 0x94, 0xEB, 0xBB, 0x8D, 0xEF, 0xB4, 0x86, 0xB4, + 0x93, 0x9F, 0x94, 0x98, 0x93, 0x99, 0x97, 0xA2, 0x97, 0x98, 0xEE, 0x82, 0x9E, 0x8E, 0x9F, 0xEE, + 0x97, 0x8E, 0x93, 0xA3, 0x94, 0x9E, 0x9B, 0xEF, 0x97, 0x9E, 0x9F, 0xEB, 0x97, 0x9C, 0xB5, 0x82, + 0x9E, 0x8E, 0x97, 0xA2, 0x97, 0x9E, 0x9F, 0xA3, 0x97, 0xA0, 0x9B, 0xEF, 0x97, 0x9E, 0x9F, 0xEB, + 0x97, 0x9C, 0xB5, 0xAD, 0xBE, 0x9E, 0x9F, 0x96, 0x97, 0x9B, 0xB1, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, + 0x86, 0xB4, 0x98, 0xB2, 0x97, 0x99, 0x8F, 0xB6, 0x8F, 0xA2, 0x9E, 0xA0, 0x9B, 0x94, 0x98, 0xBD, + 0x94, 0x8C, 0x98, 0x9B, 0xB9, 0x97, 0x98, 0xB1, 0xEB, 0xAC, 0xB9, 0xE8, 0x94, 0xAC, 0xBE, 0xA0, + 0x9F, 0xB0, 0x97, 0x99, 0x9F, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xBD, 0xAD, 0xBB, 0x8F, 0x9D, + 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, 0xB6, 0x8B, 0x93, 0x9F, + 0xB2, 0xAC, 0x86, 0xB4, 0xB8, 0x9D, 0x88, 0xAA, 0xB8, 0xB7, 0xBE, 0xA0, 0x93, 0x9F, 0xBE, 0xAE, + 0x83, 0xB1, 0xBD, 0xA2, 0x9F, 0x9E, 0x9B, 0x95, 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0xA9, 0x97, + 0x98, 0xEA, 0x88, 0xB6, 0xB9, 0xE8, 0xAE, 0xEA, 0xB8, 0xE9, 0x9B, 0xA2, 0x92, 0x8E, 0x9B, 0xB8, + 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0x97, 0x97, 0x9C, 0x9C, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, + 0xB8, 0x9D, 0x8C, 0xA9, 0x86, 0xB4, 0xB9, 0xA3, 0x98, 0x9F, 0x80, 0x82, 0x94, 0xA8, 0xBE, 0x9D, + 0xE3, 0xAD, 0x93, 0x9F, 0x94, 0x98, 0x97, 0x93, 0x93, 0x99, 0x93, 0xB0, 0x9B, 0x94, 0x98, 0xBD, + 0xB1, 0xAB, 0xB2, 0xB1, 0xB3, 0x9D, 0xE3, 0xAD, 0xEA, 0x98, 0x9B, 0x8B, 0x9F, 0x9C, 0x9B, 0x9B, + 0x95, 0x99, 0x9B, 0xBD, 0xE2, 0x9B, 0x97, 0x93, 0x93, 0x99, 0x99, 0xBD, 0x91, 0x99, 0x9B, 0xBD, + 0x9F, 0x9B, 0xE8, 0xA8, 0xEC, 0x8A, 0x86, 0xB4, 0xA0, 0xF5, 0xBC, 0x9F, 0xEE, 0x8D, 0x9F, 0x89, + 0x82, 0xB1, 0xAF, 0xBE, 0x8E, 0xE2, 0xEA, 0xB1, 0xB1, 0xF1, 0xBE, 0xB1, 0x91, 0xF5, 0x91, 0x9C, + 0x97, 0xE3, 0x9B, 0xAB, 0xB7, 0xB7, 0x92, 0x98, 0xBE, 0xA2, 0xE8, 0x91, 0x88, 0x98, 0x91, 0x82, + 0x8A, 0xAF, 0x95, 0x90, 0xB4, 0x8B, 0xB5, 0xAA, 0xEC, 0xBE, 0x89, 0xF1, 0x80, 0x88, 0x88, 0x83, + 0xBD, 0xA3, 0xA0, 0xAB, 0xAC, 0x9C, 0x83, 0xB6, 0x86, 0xB4, 0x95, 0x8C, 0xA3, 0xE3, 0xB5, 0x80, + 0xB2, 0x90, 0xE2, 0xAB, 0xAE, 0xA8, 0x8B, 0x92, 0xED, 0xEB, 0xB5, 0xA8, 0xB4, 0x96, 0xF5, 0x80, + 0x94, 0x93, 0x8F, 0x98, 0x97, 0x95, 0xB5, 0x8B, 0xEB, 0x92, 0xBD, 0xE3, 0x95, 0xAB, 0xBB, 0xAB, + 0xAD, 0xA8, 0xE8, 0xB8, 0xEA, 0xEE, 0xAB, 0x8D, 0x8C, 0xED, 0x88, 0x93, 0xB0, 0x8D, 0xEF, 0xB8, + 0x9D, 0xEA, 0x8B, 0x98, 0xBD, 0x9B, 0x83, 0xAF, 0x9E, 0x82, 0x86, 0xB4, 0xAF, 0xAB, 0xEF, 0xBE, + 0xB4, 0xEB, 0x9B, 0xE2, 0xAF, 0x9E, 0x8D, 0xB5, 0x8A, 0x83, 0xBE, 0xB7, 0x8F, 0xA8, 0xA9, 0xF1, + 0xB5, 0xB3, 0xA8, 0xEA, 0xB1, 0xA2, 0x8F, 0xAF, 0xBD, 0xAF, 0xB7, 0x8D, 0x89, 0x83, 0x83, 0xA0, + 0xB2, 0x9D, 0x95, 0xB5, 0x9E, 0xA2, 0xAA, 0x99, 0x89, 0xAA, 0x82, 0xAB, 0x89, 0xB5, 0xAC, 0x83, + 0x95, 0xB9, 0xA3, 0x9F, 0x94, 0xB3, 0xB4, 0x9E, 0xE8, 0x94, 0x9C, 0xA9, 0x86, 0xB4, 0xEC, 0x8E, + 0xEC, 0x99, 0x90, 0xEB, 0x97, 0x99, 0xF5, 0xA3, 0x8E, 0x8F, 0xA3, 0xAF, 0xE2, 0xB5, 0x96, 0x99, + 0x97, 0xA9, 0x82, 0xB3, 0xB7, 0xA3, 0x92, 0xBC, 0xBF, 0xF1, 0xAA, 0xB1, 0xB4, 0x90, 0xEB, 0xB9, + 0x89, 0x89, 0xEE, 0xB3, 0xE9, 0xA0, 0x8B, 0xED, 0xAE, 0x88, 0x8C, 0xBE, 0x9C, 0x97, 0xAC, 0xB8, + 0x96, 0xBE, 0x8A, 0xB8, 0x95, 0xB1, 0x9E, 0xBB, 0x8E, 0xF5, 0x80, 0x9C, 0xA3, 0xB2, 0x86, 0xB4, + 0xBF, 0x92, 0x95, 0xA8, 0xAA, 0x98, 0x91, 0xBB, 0xBF, 0x93, 0xB4, 0xA9, 0x94, 0xB5, 0x99, 0xB5, + 0x82, 0xB5, 0x95, 0x89, 0xAB, 0xE3, 0x91, 0xE2, 0x99, 0xA0, 0x83, 0xAB, 0xE9, 0xB7, 0x9F, 0xB3, + 0xB1, 0x9F, 0xF5, 0xAE, 0xE9, 0x8A, 0x98, 0xF1, 0xE2, 0x90, 0xB8, 0x99, 0x97, 0xB1, 0xBC, 0xEF, + 0xBD, 0xF1, 0x9F, 0xAF, 0xAA, 0xEE, 0x88, 0xB0, 0xB6, 0x8B, 0xBF, 0x93, 0x96, 0xAF, 0xF5, 0x80, + 0x86, 0xB4, 0xAB, 0x9F, 0xB1, 0x9D, 0xA3, 0x90, 0xAE, 0xB5, 0xAC, 0xAF, 0x88, 0xB4, 0x8A, 0xB2, + 0xBB, 0xEB, 0x89, 0x8F, 0xAD, 0xEF, 0x8B, 0xB3, 0xA0, 0xEC, 0x9F, 0xA3, 0x96, 0x9E, 0xBB, 0x96, + 0xAF, 0xBD, 0xEC, 0x88, 0xBF, 0xB0, 0x8A, 0xB3, 0x8B, 0x80, 0x92, 0xB3, 0xB5, 0xEB, 0xEA, 0xF5, + 0xA0, 0xB5, 0xAC, 0xB6, 0xBB, 0x94, 0xE3, 0xBB, 0x9C, 0xED, 0xEE, 0x99, 0x9D, 0x98, 0xED, 0x93, + 0xB0, 0xB0, 0x86, 0xB4, 0x8E, 0x9B, 0x97, 0xB2, 0xA2, 0x94, 0xEE, 0xE8, 0xE9, 0xA2, 0x91, 0x8B, + 0xBF, 0xAA, 0x9C, 0x8A, 0xB3, 0x8A, 0x8B, 0xAE, 0xB4, 0x80, 0x9D, 0xB1, 0xBF, 0xEB, 0xEB, 0xAF, + 0xA8, 0x9E, 0xED, 0xAA, 0xA3, 0x93, 0x88, 0x90, 0x8B, 0xB2, 0x8B, 0xB8, 0x8A, 0x90, 0xBF, 0xA3, + 0x92, 0x8A, 0x80, 0x96, 0xB5, 0x9B, 0x83, 0xF5, 0x80, 0xB4, 0xE9, 0x96, 0xAF, 0xEA, 0xE9, 0xAD, + 0xAA, 0xAB, 0xB4, 0xEE, 0x86, 0xB4, 0xAF, 0x8C, 0xB6, 0x9F, 0xBC, 0xA8, 0xAC, 0x8C, 0xE9, 0xAA, + 0xAC, 0xE3, 0xBD, 0xB4, 0xB7, 0xB7, 0xBF, 0xF5, 0x97, 0x8F, 0x8D, 0xA3, 0xBF, 0xBD, 0xB3, 0x95, + 0xA2, 0x94, 0xEA, 0xA2, 0xB6, 0xBD, 0x98, 0xB1, 0xBD, 0xB0, 0xBE, 0x99, 0xB5, 0xF5, 0xBE, 0xED, + 0xEE, 0x91, 0x94, 0xB0, 0xBC, 0xB9, 0x9E, 0xF5, 0x8A, 0xEE, 0xAB, 0x88, 0xBB, 0xF1, 0xAC, 0xEF, + 0xEA, 0xBE, 0xBE, 0xB6, 0x95, 0x82, 0x86, 0xB4, 0xB2, 0xAF, 0x89, 0x9B, 0xB3, 0xB9, 0xE9, 0x96, + 0xB5, 0xAD, 0xAB, 0xB3, 0xA0, 0x93, 0xE3, 0xF1, 0xB0, 0xA9, 0x8F, 0xEB, 0x94, 0x89, 0x99, 0x83, + 0xF5, 0xA9, 0xA9, 0x97, 0xB4, 0xBB, 0x9C, 0x8E, 0x8C, 0x99, 0x9D, 0xB0, 0xAE, 0xB9, 0x8A, 0xAB, + 0xE8, 0x80, 0xB5, 0x9F, 0xEC, 0xB4, 0xE2, 0x94, 0x9D, 0xEB, 0xBE, 0x8D, 0x94, 0x9F, 0xAC, 0x9C, + 0x90, 0x8B, 0xEB, 0xBF, 0xB6, 0x80, 0x9E, 0xBC, 0x86, 0xB4, 0x80, 0x8F, 0x8B, 0x8A, 0xF5, 0xEF, + 0xA8, 0xEF, 0xB5, 0xB2, 0xBF, 0x9F, 0xA3, 0x98, 0xB4, 0x95, 0xAF, 0xAE, 0x90, 0xB7, 0xA8, 0x97, + 0x8C, 0xBB, 0xB2, 0x99, 0xB3, 0xEC, 0xB3, 0xAA, 0xA2, 0xAC, 0xED, 0xEE, 0x9E, 0x8A, 0xA0, 0x9D, + 0xAB, 0x90, 0x99, 0x82, 0xE2, 0x82, 0xED, 0x8C, 0x92, 0xA8, 0xF1, 0x9E, 0xE8, 0xA0, 0xBF, 0x9F, + 0xBD, 0x94, 0xA8, 0xB5, 0xBE, 0x9E, 0xE9, 0xB3, 0x9C, 0xF5, 0x86, 0xB4, 0xAB, 0xE8, 0xA3, 0x91, + 0xEB, 0xAB, 0x8A, 0xE3, 0xF5, 0xBC, 0xBE, 0x95, 0xB1, 0xEF, 0x99, 0xBB, 0xB0, 0x80, 0x8C, 0xB9, + 0x91, 0xBF, 0xA2, 0xAE, 0x8D, 0xBE, 0x83, 0x98, 0xA9, 0xE3, 0xA8, 0x97, 0xF1, 0xEA, 0x83, 0x9C, + 0xF1, 0xA9, 0x9F, 0x99, 0x9B, 0xAD, 0x9F, 0x9B, 0x9B, 0xBB, 0x95, 0x99, 0x9B, 0xB5, 0xE2, 0xAD, + 0xBD, 0xBD, 0x91, 0x96, 0x97, 0x98, 0x93, 0x9D, 0x9B, 0xEB, 0x8F, 0xBE, 0x86, 0xB4, 0x9F, 0xAD, + 0x9F, 0x98, 0xF5, 0xAD, 0x8B, 0x93, 0x97, 0x9B, 0x83, 0x98, 0x9B, 0xBC, 0xE2, 0x99, 0x9B, 0x8B, + 0x9B, 0xAD, 0x9E, 0xAD, 0x83, 0x9E, 0x8C, 0x88, 0xEA, 0xB1, 0x9B, 0x8B, 0x92, 0xF5, 0x98, 0x9B, + 0x8F, 0xAD, 0x9B, 0xEE, 0x9B, 0x98, 0x9B, 0x9E, 0x9B, 0x91, 0x98, 0xBD, 0x94, 0x8C, 0x92, 0x8E, + 0x83, 0x9F, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0x9E, 0x9B, 0x95, 0x98, 0xBD, 0x94, 0x8C, 0x86, 0xB4, + 0x92, 0x8B, 0xE2, 0x98, 0x9B, 0xBC, 0xE2, 0x9F, 0x98, 0x9B, 0x97, 0x99, 0x9B, 0x8B, 0x83, 0xAD, + 0x92, 0x8B, 0x83, 0x9E, 0x8C, 0x88, 0xEA, 0x95, 0x98, 0x98, 0x83, 0x9F, 0x9C, 0x9B, 0x96, 0xB1, + 0xA0, 0xBC, 0x96, 0xEB, 0x9D, 0xB2, 0x8D, 0x9E, 0xB8, 0xBC, 0x99, 0xA8, 0xA8, 0xAD, 0x8B, 0x88, + 0xA2, 0x88, 0xBC, 0xEF, 0xE8, 0x9F, 0xA3, 0x8A, 0x97, 0x98, 0xE2, 0x9D, 0x9B, 0xEB, 0x8F, 0xBE, + 0x86, 0xB4, 0x93, 0xAD, 0x8B, 0x83, 0x97, 0x98, 0xBB, 0x9B, 0x9C, 0x9E, 0xAF, 0x8E, 0x9F, 0xBC, + 0xA9, 0xBC, 0xEF, 0xE3, 0x9C, 0xF1, 0x89, 0x99, 0xAD, 0xED, 0xB7, 0xA2, 0x8B, 0xE3, 0x91, 0xAB, + 0x8C, 0x8A, 0xBD, 0xF5, 0xEB, 0x91, 0x97, 0x9E, 0xE2, 0x9D, 0x99, 0x99, 0xA9, 0x9D, 0x9B, 0x8B, + 0x8F, 0x9C, 0x98, 0xAD, 0x9F, 0x98, 0x98, 0x9E, 0x97, 0xAD, 0x97, 0x8E, 0x9B, 0xAC, 0x98, 0xBD, + 0xBD, 0xA8, 0x86, 0xB4, 0x98, 0xBD, 0x9F, 0x9C, 0x98, 0x8B, 0xB9, 0xAD, 0x9B, 0xB5, 0x83, 0xB0, + 0xBB, 0x92, 0x88, 0xEA, 0xB9, 0x9E, 0xB5, 0xAC, 0x96, 0xE8, 0x94, 0xB2, 0x96, 0xB4, 0x98, 0xB2, + 0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0xEF, 0xAF, 0x80, 0x82, 0x8B, 0xAC, + 0x83, 0xE8, 0x9F, 0xAC, 0xB9, 0xB7, 0xE3, 0xAC, 0xBE, 0x99, 0xEF, 0xAD, 0x80, 0x8D, 0xEA, 0xAD, + 0x94, 0xAD, 0x83, 0x9E, 0x86, 0xB4, 0x8C, 0x88, 0xEA, 0xBC, 0x98, 0x9E, 0x9B, 0xAD, 0x96, 0xB0, + 0x9B, 0xA9, 0xB5, 0x99, 0xAB, 0xBD, 0x91, 0x93, 0x83, 0xB7, 0xBB, 0x92, 0x88, 0xEA, 0xB9, 0x9E, + 0xB5, 0xAC, 0x96, 0xE8, 0x94, 0xB2, 0x96, 0xB4, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D, + 0x8C, 0xA9, 0xB9, 0xA3, 0xEF, 0xAF, 0x80, 0x82, 0x8B, 0xAC, 0x83, 0xE8, 0x9F, 0xAC, 0xB9, 0xB7, + 0xE3, 0xAC, 0xBE, 0x9C, 0xE3, 0xB0, 0x86, 0xB4, 0x83, 0x89, 0xEF, 0xB0, 0xB9, 0xB7, 0xAD, 0xAD, + 0xBD, 0xBD, 0x9D, 0x97, 0x98, 0xBD, 0x94, 0x8C, 0x92, 0x89, 0x9B, 0x9F, 0xBD, 0xBD, 0x9D, 0x9E, + 0x97, 0x93, 0x93, 0x98, 0xBC, 0xA0, 0x99, 0x98, 0xA8, 0x8B, 0x83, 0x95, 0x91, 0xAD, 0x83, 0x98, + 0x98, 0x9B, 0x9D, 0x98, 0xA0, 0x9E, 0xAF, 0x9E, 0xBC, 0x8B, 0x93, 0x99, 0x9B, 0x8B, 0x9F, 0xAD, + 0xBD, 0x80, 0xB5, 0xAD, 0x95, 0x8B, 0x83, 0x93, 0x86, 0xB4, 0x91, 0xAD, 0x83, 0x98, 0x98, 0x8B, + 0x8F, 0x92, 0x9B, 0xBD, 0x9F, 0x8D, 0x96, 0x8D, 0xB2, 0xEA, 0xBE, 0x92, 0x9B, 0xEC, 0x96, 0xA3, + 0xE3, 0xB0, 0x83, 0x89, 0xEF, 0xAD, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, + 0x97, 0xAF, 0xB8, 0xB7, 0x8C, 0xEA, 0x96, 0xE8, 0x94, 0xB2, 0x96, 0xE9, 0x98, 0xB2, 0xB9, 0xB7, + 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xEB, 0xE3, 0xB0, 0x86, 0xB4, 0xB9, 0x92, 0x97, 0xAF, + 0xBB, 0x92, 0x88, 0xAE, 0xB8, 0x9E, 0x98, 0xBE, 0x98, 0xBD, 0xBD, 0xA8, 0x98, 0xBD, 0x9F, 0x9C, + 0x98, 0x8B, 0xB9, 0x99, 0x9B, 0xB0, 0x98, 0x88, 0x97, 0x98, 0xE2, 0xBB, 0x9D, 0x9C, 0x98, 0xB2, + 0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x93, 0xB8, 0xE8, 0xA2, 0xB1, + 0xBB, 0x8D, 0xEF, 0xB4, 0xB9, 0xA3, 0xAD, 0xBD, 0xB8, 0x92, 0x88, 0xB1, 0x86, 0xB4, 0x96, 0xB0, + 0x9B, 0x9E, 0x9B, 0xBD, 0x9F, 0x98, 0x9D, 0xB3, 0xEF, 0x9C, 0xBF, 0x92, 0x88, 0xB6, 0xB9, 0xB7, + 0xEF, 0xB2, 0xB8, 0x99, 0x98, 0x99, 0x83, 0x82, 0x94, 0xAA, 0x83, 0xA3, 0x98, 0x9E, 0x80, 0x82, + 0x90, 0xEA, 0xBB, 0x8D, 0x80, 0xAA, 0x83, 0xE8, 0x9C, 0xEA, 0xB8, 0xE8, 0xEE, 0xBD, 0x8F, 0x92, + 0x90, 0xB2, 0x83, 0xE9, 0x88, 0xAA, 0x83, 0xE8, 0x8F, 0xBD, 0x8F, 0xE9, 0x88, 0xB2, 0x86, 0xB4, + 0xBE, 0x9D, 0x8C, 0xAE, 0x80, 0x8D, 0xEF, 0xEA, 0x97, 0x9D, 0x8B, 0x9D, 0x9E, 0xB3, 0xA9, 0x9D, + 0x9B, 0x8B, 0x8B, 0x98, 0xBD, 0xB9, 0xAD, 0xED, 0xBD, 0xE9, 0xEA, 0x99, 0x9B, 0xBD, 0x9F, 0x99, + 0x97, 0x9C, 0x93, 0xAD, 0x8F, 0x9B, 0x83, 0x93, 0x91, 0xAD, 0x83, 0x98, 0x98, 0x8B, 0x8F, 0x92, + 0x9B, 0xBD, 0x93, 0xAD, 0x88, 0x9E, 0x9B, 0xBC, 0x9D, 0xB2, 0xB2, 0x8B, 0x83, 0x82, 0x90, 0xB2, + 0x86, 0xB4, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xBD, 0x89, 0x9D, 0xE3, 0xA9, 0x80, 0x9D, + 0xB6, 0xAF, 0x80, 0xE9, 0x97, 0xA9, 0x93, 0x9D, 0xA2, 0xEA, 0x80, 0x99, 0xEE, 0xAD, 0x9B, 0xAD, + 0x93, 0x98, 0x9B, 0x88, 0xB5, 0xB2, 0x88, 0x82, 0xB2, 0xEA, 0x80, 0x82, 0x90, 0xAF, 0x83, 0x8D, + 0xAD, 0xBD, 0x8B, 0xB7, 0x9C, 0xA0, 0xBB, 0x8D, 0x97, 0xBD, 0x8B, 0xE8, 0x8C, 0xA3, 0xBE, 0x9D, + 0xB6, 0xB7, 0x86, 0xB4, 0xBB, 0x8D, 0x94, 0xB2, 0xBE, 0x9D, 0x8F, 0xBD, 0x8F, 0x9D, 0xE3, 0xA9, + 0xBB, 0x8D, 0x94, 0xEF, 0x97, 0x9D, 0xB9, 0x9D, 0x9E, 0xB3, 0xA9, 0x9D, 0x9B, 0x8B, 0x8B, 0x98, + 0xBD, 0xB9, 0xAD, 0xED, 0xBD, 0xE9, 0xEA, 0x99, 0x9B, 0xB7, 0x83, 0x9E, 0x97, 0x9C, 0x8F, 0xAD, + 0x8F, 0xAD, 0x83, 0x93, 0x91, 0xAD, 0x83, 0x98, 0x98, 0x8B, 0x8F, 0x92, 0x9B, 0xBD, 0x93, 0xAD, + 0x88, 0xA0, 0x9B, 0xBC, 0x86, 0xB4, 0x9D, 0xB2, 0xB2, 0x8B, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, + 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xBD, 0x89, 0x9D, 0xE3, 0xA9, 0x80, 0x9D, 0xB6, 0xAF, 0x80, 0xE9, + 0x97, 0xA9, 0x93, 0x9D, 0xA2, 0xEA, 0x80, 0x99, 0xEE, 0xAD, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0x88, + 0xB5, 0xB1, 0x8F, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, + 0x88, 0xB6, 0xB9, 0xE8, 0xAE, 0xEA, 0x86, 0xB4, 0xB8, 0xE9, 0x9B, 0xBD, 0x8B, 0xE8, 0x8C, 0xA3, + 0xBE, 0x9D, 0xB6, 0xB7, 0xBB, 0x8D, 0x94, 0xB2, 0xBE, 0x9D, 0x8F, 0xBD, 0x8F, 0x9D, 0xE3, 0xA9, + 0xBB, 0x8D, 0x94, 0xEF, 0x97, 0x9B, 0xEA, 0x9D, 0x99, 0x89, 0xAB, 0x9D, 0x89, 0x93, 0xB8, 0xE9, + 0x9E, 0x8B, 0x9F, 0x98, 0x99, 0xAD, 0x8F, 0x9B, 0x9B, 0xEE, 0x93, 0x99, 0x9B, 0x8B, 0x9B, 0xAA, + 0x98, 0xE3, 0x90, 0x80, 0x8E, 0xF1, 0xB9, 0xAD, 0x86, 0xB4, 0x91, 0x89, 0x9D, 0x80, 0xAF, 0x88, + 0xEF, 0x96, 0xB0, 0xBF, 0xEB, 0xB6, 0xBD, 0xA2, 0xAF, 0xBF, 0x97, 0x9F, 0xB1, 0xAB, 0xEA, 0x8B, + 0xA8, 0x98, 0x8F, 0xBD, 0x93, 0xBB, 0xB3, 0xB0, 0x93, 0xB7, 0x8E, 0xB5, 0xEF, 0xB4, 0xAD, 0x9E, + 0xE9, 0xB0, 0x89, 0xAA, 0x92, 0x82, 0xE9, 0xB3, 0xAD, 0x82, 0xEB, 0xEB, 0x9E, 0x9B, 0xEA, 0xAD, + 0xAC, 0x9E, 0x9E, 0xB2, 0x89, 0xE8, 0xB8, 0x8A, 0x95, 0x83, 0x86, 0xB4, 0x99, 0xAC, 0x95, 0xB4, + 0xE3, 0x91, 0x9C, 0xA3, 0xF1, 0xB3, 0x93, 0xB6, 0xB3, 0xEA, 0xB9, 0xB9, 0xEB, 0xF5, 0xEE, 0xB1, + 0x98, 0x92, 0xF5, 0x9E, 0x83, 0xA9, 0x9B, 0xB2, 0xF1, 0x89, 0x8F, 0xBE, 0x80, 0xA9, 0xF5, 0xAD, + 0xE9, 0x9D, 0xF5, 0xEA, 0x90, 0xA9, 0xAF, 0xB9, 0x8B, 0x9E, 0xEF, 0x9B, 0xBB, 0x96, 0xE9, 0xAA, + 0xBF, 0xB2, 0xA9, 0xBC, 0xE9, 0xBE, 0x80, 0xBC, 0x88, 0xED, 0xB9, 0xAB, 0x86, 0xB4, 0xE9, 0xAB, + 0xE2, 0x9E, 0xEC, 0xB3, 0xBB, 0xF5, 0x89, 0xB5, 0x97, 0xA8, 0x9E, 0x96, 0xAA, 0x8B, 0x99, 0x90, + 0xB0, 0xB7, 0xED, 0xE3, 0xE2, 0xA3, 0x8F, 0xBF, 0xAC, 0xB3, 0xEE, 0x80, 0x94, 0x90, 0xAD, 0x9F, + 0x92, 0x93, 0x95, 0x92, 0xEF, 0xBD, 0x94, 0xAC, 0xED, 0xEC, 0xBF, 0x99, 0xA2, 0xF1, 0xB4, 0x94, + 0x90, 0x92, 0xAC, 0xB4, 0xAD, 0xEA, 0xA3, 0x91, 0x91, 0xBC, 0xAB, 0xEF, 0xE8, 0x97, 0x86, 0xB4, + 0xB2, 0xEC, 0xBB, 0x8C, 0x88, 0x98, 0xB3, 0x9C, 0xED, 0xE9, 0x96, 0xB9, 0xAC, 0x99, 0xB7, 0x94, + 0xAE, 0xBD, 0xBF, 0x9E, 0x90, 0xA2, 0x8A, 0x8F, 0x9B, 0xBE, 0xB8, 0x8C, 0x83, 0xBD, 0xAC, 0xED, + 0xB8, 0xEA, 0xA0, 0xAA, 0xBD, 0xA3, 0xAA, 0xB1, 0xAA, 0xB2, 0xEA, 0xBB, 0x8D, 0x8B, 0x8A, 0xE3, + 0xEA, 0xAE, 0xAB, 0x8A, 0x9B, 0x8D, 0xB4, 0xAA, 0xB0, 0x92, 0x8B, 0xE8, 0x8A, 0xED, 0xF5, 0xB5, + 0x86, 0xB4, 0x8A, 0xF1, 0xA3, 0xB4, 0x91, 0x98, 0xE9, 0xBE, 0x82, 0xEC, 0x80, 0xB9, 0x9B, 0xEF, + 0x99, 0x90, 0xEF, 0xB5, 0xEE, 0xB0, 0x82, 0x90, 0x82, 0xF5, 0xF1, 0xAC, 0x89, 0xEB, 0x92, 0x8B, + 0x8D, 0xAF, 0x8E, 0x8F, 0xE2, 0x99, 0xB2, 0x83, 0x98, 0xA2, 0x9C, 0x98, 0xEC, 0xED, 0xBF, 0x99, + 0x8A, 0x9E, 0xAE, 0xB8, 0xAD, 0xAE, 0x88, 0xAD, 0x96, 0xB7, 0x89, 0xEE, 0x8E, 0x8E, 0x96, 0x98, + 0xAA, 0x82, 0x86, 0xB4, 0xBD, 0x9F, 0x8D, 0x8D, 0xE2, 0xB0, 0xBB, 0x90, 0x99, 0xB7, 0xEE, 0xA9, + 0x83, 0x96, 0x97, 0xB7, 0xB0, 0xF5, 0xAF, 0xAD, 0xE9, 0x9B, 0xAB, 0xA8, 0x82, 0x92, 0xE9, 0x8E, + 0x9C, 0x80, 0x9F, 0xBE, 0xBB, 0xAB, 0xB2, 0x82, 0x8E, 0xE3, 0xA9, 0xEC, 0xB3, 0xBD, 0x98, 0x96, + 0xED, 0x8C, 0xEA, 0x94, 0xA8, 0x99, 0xE8, 0xA8, 0x93, 0xAA, 0xAB, 0xB0, 0xBD, 0xE3, 0xB8, 0xEB, + 0x80, 0xA3, 0xB8, 0x83, 0x86, 0xB4, 0x80, 0xBB, 0xF5, 0xBD, 0x99, 0xBC, 0x8A, 0x90, 0xED, 0xE9, + 0xA9, 0x93, 0x8F, 0xB1, 0x9C, 0xB5, 0xB6, 0xBB, 0xEB, 0x91, 0xA8, 0xEF, 0xEA, 0x89, 0xB0, 0xBB, + 0xA8, 0xEC, 0xBB, 0x9C, 0xBC, 0x8B, 0x9E, 0xB0, 0x83, 0x99, 0xBC, 0x80, 0xBF, 0x99, 0xEC, 0xA9, + 0xEE, 0x8C, 0xBD, 0x88, 0xEC, 0xAA, 0xEA, 0xB8, 0xA9, 0xED, 0xB0, 0xA8, 0xEC, 0xEB, 0xA0, 0xAD, + 0xA9, 0x8A, 0x8F, 0xB6, 0x99, 0xAF, 0x86, 0xB4, 0x9B, 0x80, 0x8D, 0x9B, 0xB3, 0x97, 0xAE, 0xAA, + 0xA0, 0x9B, 0xAB, 0xEC, 0x83, 0x90, 0x83, 0xE9, 0xB4, 0xB0, 0x82, 0x8E, 0x80, 0x8B, 0xB4, 0xB6, + 0x9C, 0x80, 0xE8, 0xBF, 0x9B, 0xB7, 0xBD, 0xA2, 0x83, 0x9E, 0xBB, 0x99, 0x88, 0xBD, 0xB0, 0x9E, + 0xB4, 0x80, 0xAE, 0x92, 0x8C, 0x94, 0xE2, 0xA9, 0x8C, 0xA9, 0xB9, 0xEC, 0xAC, 0x98, 0x90, 0xB2, + 0xEC, 0x82, 0xBB, 0x88, 0xE2, 0xEE, 0xAE, 0xF1, 0x86, 0xB4, 0xB3, 0xAE, 0x9E, 0x9D, 0x90, 0xBC, + 0xAA, 0xB7, 0xEA, 0x88, 0x82, 0x95, 0xA3, 0xE8, 0xB8, 0xB8, 0xB6, 0xB7, 0xB6, 0xBF, 0x8C, 0x8A, + 0x98, 0x9E, 0xB8, 0x9D, 0x9E, 0xA8, 0xAF, 0x95, 0xA0, 0x94, 0x90, 0xAC, 0x98, 0xF1, 0xEA, 0x92, + 0xEC, 0x8A, 0xB8, 0x97, 0xAB, 0x83, 0xEB, 0x88, 0x95, 0xA3, 0xEE, 0x80, 0xB9, 0x96, 0x91, 0x8C, + 0xBC, 0xAE, 0x8B, 0xA0, 0x89, 0xB9, 0x83, 0x98, 0x8F, 0x8B, 0x86, 0xB4, 0xBE, 0x9E, 0xBE, 0x8E, + 0xF1, 0xEE, 0xBD, 0x8A, 0xB1, 0x93, 0xAF, 0xEB, 0x83, 0xB2, 0xA0, 0x98, 0x8B, 0xB0, 0x97, 0x94, + 0x9C, 0xF5, 0xB1, 0x8A, 0xAD, 0x8F, 0x8A, 0x9F, 0xE2, 0x8D, 0xAC, 0x8C, 0xAA, 0xBF, 0xEF, 0xB8, + 0x8E, 0xF1, 0x8C, 0x97, 0xB0, 0xED, 0xAE, 0x93, 0x82, 0xE8, 0xAD, 0x8B, 0x93, 0x90, 0xB9, 0xBE, + 0x94, 0x9D, 0x93, 0xAC, 0xA3, 0x99, 0x8B, 0xEF, 0xBB, 0x8D, 0xB5, 0xAB, 0x86, 0xB4, 0xBF, 0xB5, + 0xEC, 0x8B, 0xB2, 0x8D, 0xB7, 0x94, 0xB6, 0xB9, 0xE9, 0xB1, 0xF5, 0xB1, 0xEC, 0xE9, 0x97, 0xB2, + 0xA2, 0x88, 0x94, 0xBF, 0xEF, 0xEF, 0xB9, 0xAB, 0xEC, 0xEE, 0x8C, 0xA3, 0xA9, 0xB1, 0x9C, 0x9B, + 0xE7, 0xE7, 0x86, 0xB4, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x9F, 0x94, 0x9E, 0xFA, 0x99, 0x9F, 0x88, + 0x8E, 0x93, 0x9C, 0x93, 0x99, 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0x98, 0x9F, 0x9D, 0x93, 0x94, 0xFA, 0x99, 0x9F, 0x88, 0x8E, 0x93, 0x9C, + 0x93, 0x99, 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, 0x97, 0x93, 0x93, 0x92, + 0xAC, 0x8E, 0x99, 0x99, 0x98, 0xBB, 0x8D, 0xBD, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0xBD, 0x93, 0x90, + 0x9B, 0x91, 0xBC, 0x9F, 0xE3, 0xAB, 0xED, 0xB3, 0xB1, 0xAB, 0xED, 0xB7, 0x97, 0x9B, 0xEA, 0x9D, + 0x99, 0x89, 0xAB, 0x9D, 0x89, 0x93, 0xB8, 0xE9, 0x9E, 0x8B, 0x9F, 0x98, 0x99, 0xAD, 0x8F, 0x9B, + 0x97, 0x93, 0x9D, 0xBD, 0x97, 0x8B, 0xA9, 0xAD, 0x99, 0x8B, 0x83, 0x9E, 0x86, 0xB4, 0x8C, 0x8B, + 0x8B, 0x9D, 0x9F, 0xAD, 0x90, 0x9E, 0x89, 0x9E, 0x9F, 0x8C, 0x97, 0x98, 0x97, 0x9D, 0x9B, 0xEB, + 0x8F, 0x9F, 0x98, 0xAD, 0xAD, 0x97, 0x8F, 0xE8, 0x94, 0xB5, 0x83, 0x8D, 0x80, 0xB7, 0xBB, 0x9D, + 0x9C, 0xEB, 0xB9, 0xE8, 0x8C, 0xAF, 0x97, 0x89, 0x97, 0xAD, 0x93, 0x8B, 0x83, 0x9E, 0x8C, 0x8B, + 0x8B, 0x91, 0x9E, 0x98, 0xAA, 0x8B, 0x8B, 0x8C, 0x90, 0x98, 0x8E, 0x9F, 0xA2, 0x9C, 0x86, 0xB4, + 0x8E, 0x9C, 0x97, 0xBD, 0x89, 0x8C, 0x9B, 0xBD, 0x89, 0x9D, 0xE3, 0xA9, 0x80, 0x9D, 0xB6, 0xAF, + 0x80, 0xE9, 0x97, 0xBD, 0x88, 0xE8, 0xEB, 0xB3, 0x89, 0x9E, 0x9F, 0x96, 0x97, 0x9B, 0xB1, 0x9D, + 0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xAD, 0xAD, 0x99, 0x89, 0x8C, 0x8B, 0xA2, 0x93, 0xA0, 0x9B, 0xB2, + 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0x97, 0x97, 0x9D, 0xB6, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, + 0x86, 0xB4, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x9C, 0xBF, 0x92, 0x88, 0xB6, 0xB9, 0xB7, + 0xEF, 0xB2, 0xB8, 0x99, 0x98, 0xA3, 0xB8, 0xE8, 0xE3, 0xEA, 0x93, 0x9F, 0x94, 0x98, 0x97, 0x89, + 0x97, 0xAD, 0x93, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, 0xB9, 0x94, 0x9B, 0x8B, + 0xB1, 0x98, 0x9C, 0xB2, 0x88, 0xB2, 0x80, 0x9D, 0xEB, 0xAA, 0xB8, 0xB4, 0x94, 0x9B, 0xB9, 0x9D, + 0x9C, 0xA3, 0x86, 0xB4, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x96, 0xB7, 0x94, 0xAC, + 0xB8, 0x8E, 0x9B, 0xBF, 0x9C, 0xAD, 0xEA, 0xA2, 0x94, 0xB0, 0x9F, 0xAD, 0x97, 0x9E, 0xB9, 0xA2, + 0x94, 0x9E, 0x9F, 0xA3, 0x97, 0xB0, 0x8C, 0xBB, 0x9C, 0xAD, 0xEA, 0xA3, 0x95, 0x9E, 0x9F, 0xA2, + 0x97, 0x9E, 0x83, 0xA2, 0x94, 0x9E, 0x9F, 0xA3, 0x97, 0xB0, 0x8C, 0xBB, 0x97, 0x92, 0x8B, 0xA2, + 0x99, 0xA0, 0x9B, 0x90, 0x86, 0xB4, 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0x83, 0x8E, 0x9B, 0xB6, + 0x90, 0x8C, 0x97, 0x8B, 0xE2, 0xAD, 0x9E, 0x8B, 0x83, 0x9E, 0x8C, 0x8B, 0x8B, 0x92, 0x9E, 0x9B, + 0x80, 0x94, 0xB8, 0xE9, 0xBE, 0xB0, 0xB8, 0xE9, 0xB9, 0xA2, 0x93, 0xA0, 0x9B, 0xB2, 0x98, 0xBD, + 0x94, 0x8C, 0x98, 0x9B, 0xB5, 0x97, 0x9D, 0xB6, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D, + 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x90, 0x86, 0xB4, 0x8F, 0x99, 0x98, 0x93, 0xB8, 0xE8, 0xA2, 0xB1, + 0xBB, 0x8D, 0xEF, 0xB4, 0xB9, 0xA3, 0x98, 0x92, 0xB8, 0x8D, 0x90, 0x93, 0x97, 0x8B, 0xEE, 0xAD, + 0x9E, 0x9B, 0x83, 0x9E, 0x8C, 0x8B, 0x8B, 0x96, 0x9E, 0x9B, 0x8C, 0x9E, 0xB8, 0x9D, 0xE3, 0xEB, + 0x80, 0x9E, 0x9F, 0xBC, 0x97, 0x98, 0xEA, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x9B, 0xAD, 0xAD, 0x8D, + 0x8F, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xB6, 0x86, 0xB4, 0xB8, 0x92, 0x97, 0xBD, 0x89, 0x82, + 0x94, 0xA0, 0xBE, 0x8D, 0xB6, 0xAF, 0x80, 0xA3, 0x98, 0x9E, 0x8B, 0x89, 0x9B, 0xB0, 0x97, 0x8E, + 0x99, 0x99, 0x9B, 0xB3, 0x93, 0xAD, 0x9E, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, + 0xB9, 0x94, 0x9B, 0x8B, 0x9F, 0x98, 0x98, 0x8B, 0x9B, 0x9E, 0xBD, 0xBD, 0x93, 0x8A, 0x9B, 0x9E, + 0x99, 0x99, 0x9B, 0xBD, 0xB5, 0x99, 0xBD, 0xBD, 0x93, 0x98, 0x86, 0xB4, 0x9B, 0x96, 0xB4, 0xA2, + 0x93, 0xB9, 0x9D, 0xA9, 0xB2, 0xE3, 0xB5, 0xA0, 0xB2, 0x8F, 0x8C, 0xB8, 0xA3, 0xE2, 0xB7, 0xB6, + 0x99, 0xB9, 0xEF, 0x82, 0x8B, 0xA2, 0x91, 0x94, 0xBC, 0x8D, 0xEC, 0xBE, 0x9D, 0x8D, 0xF5, 0x89, + 0xB4, 0x91, 0xB8, 0xA2, 0xAA, 0xAB, 0xA8, 0x82, 0xBC, 0xAA, 0x8B, 0xEA, 0xBD, 0x94, 0x95, 0xEC, + 0x8D, 0xB5, 0x96, 0x93, 0xF5, 0x9F, 0x95, 0x89, 0xAD, 0xB1, 0xED, 0x99, 0x86, 0xB4, 0x80, 0xB8, + 0xB5, 0xF5, 0x91, 0xB9, 0xF5, 0xEA, 0xBB, 0xB8, 0xB7, 0xAF, 0xE8, 0xEC, 0x83, 0xBF, 0xA2, 0xB3, + 0xB3, 0x92, 0x9F, 0xBC, 0xEA, 0x9C, 0xBE, 0xB0, 0x89, 0xF1, 0xE3, 0xA3, 0x89, 0x92, 0xAB, 0x90, + 0x95, 0xBD, 0xBC, 0xEC, 0xB1, 0x91, 0xB9, 0xB6, 0x99, 0xE3, 0x90, 0x99, 0xEE, 0x9E, 0xA8, 0xF1, + 0x9C, 0x9D, 0x80, 0x93, 0x89, 0x9D, 0xE3, 0x9D, 0xE8, 0xBC, 0xB1, 0xA0, 0x8E, 0xB4, 0x86, 0xB4, + 0x94, 0xB9, 0xA9, 0xA8, 0x92, 0xB1, 0xE3, 0xB8, 0xAE, 0xB3, 0xB3, 0xEE, 0xAD, 0x9E, 0x80, 0xE3, + 0x91, 0xB0, 0xA0, 0xF1, 0xE9, 0xE3, 0xE2, 0x99, 0xE9, 0xA3, 0xA9, 0xA2, 0x91, 0xE8, 0xEB, 0xA2, + 0xB0, 0xB1, 0xB1, 0xF1, 0x88, 0xBF, 0xEB, 0x95, 0x82, 0xB6, 0xE2, 0x9F, 0xF1, 0x8F, 0xB2, 0xB9, + 0xEC, 0xED, 0xB0, 0xB8, 0xA0, 0xEA, 0xF5, 0xEA, 0x8E, 0xB0, 0xBE, 0xEA, 0xBE, 0xED, 0x90, 0xA9, + 0x86, 0xB4, 0xB0, 0x8C, 0xB0, 0xAE, 0x91, 0x80, 0xA2, 0x8B, 0xAE, 0xA9, 0xE3, 0x89, 0x8C, 0xE9, + 0x91, 0xA0, 0xA8, 0xAF, 0xAD, 0xBC, 0x8E, 0xA3, 0xB2, 0xBD, 0xB1, 0x8D, 0xF5, 0xEE, 0x8C, 0xA2, + 0xB7, 0x8A, 0xEE, 0x88, 0x99, 0x90, 0xAB, 0xBB, 0xEB, 0x8E, 0xBD, 0x9E, 0x96, 0x8C, 0x96, 0xE3, + 0xE2, 0xBC, 0x80, 0xB0, 0x8E, 0x8B, 0x98, 0x9D, 0xE3, 0xB9, 0x95, 0xB0, 0xE9, 0xAE, 0x9D, 0x88, + 0x91, 0xBE, 0x86, 0xB4, 0x80, 0xAE, 0xE9, 0x9F, 0x8C, 0xE9, 0x8B, 0xBE, 0x9E, 0x82, 0x9C, 0x8A, + 0xEA, 0xE2, 0x89, 0xEC, 0xE8, 0x99, 0xB1, 0x97, 0x95, 0xA2, 0x8D, 0xB4, 0xF1, 0x9C, 0xBE, 0xBB, + 0xE3, 0x98, 0x8A, 0xBD, 0xEC, 0xA0, 0xE2, 0xE9, 0xB4, 0xBF, 0xF1, 0x8E, 0xA0, 0xB7, 0x88, 0x9F, + 0x90, 0xEE, 0xB2, 0xB6, 0xBB, 0xBC, 0xB0, 0xE8, 0xB1, 0x88, 0xBD, 0xF1, 0xEB, 0xBE, 0x91, 0xA9, + 0x99, 0x94, 0x8F, 0xA0, 0x86, 0xB4, 0x80, 0x94, 0xF1, 0xB4, 0x92, 0x83, 0x8C, 0xB1, 0xA2, 0x94, + 0x96, 0xB6, 0xE3, 0xB0, 0x94, 0xF5, 0xEE, 0xEB, 0xEF, 0x99, 0xBE, 0x82, 0x9B, 0x8A, 0x94, 0xBC, + 0x8D, 0x83, 0xB5, 0xB3, 0xB8, 0xAD, 0xBF, 0x9D, 0xEA, 0x8B, 0xB0, 0x93, 0xEE, 0x96, 0xBE, 0xE9, + 0xF5, 0xAF, 0xBF, 0xEA, 0x9E, 0x8F, 0x9F, 0xB7, 0x95, 0x83, 0xEE, 0xAE, 0xAF, 0xED, 0xB5, 0xBC, + 0x8B, 0x95, 0x9E, 0xB4, 0x97, 0x9F, 0x86, 0xB4, 0xE8, 0x8E, 0xB2, 0x8D, 0xA8, 0x91, 0x9C, 0xE2, + 0x92, 0x89, 0xB4, 0xA2, 0xB2, 0xE2, 0xB5, 0x9C, 0x94, 0x8E, 0x98, 0xB7, 0xE2, 0x90, 0xEF, 0x90, + 0xB2, 0xE9, 0xAA, 0x8E, 0xAC, 0x91, 0xAD, 0xF1, 0xAE, 0x90, 0xBE, 0xAB, 0xB8, 0x9B, 0x8F, 0xB3, + 0xE3, 0xA3, 0xB1, 0x9B, 0x94, 0xED, 0xF5, 0x97, 0xF1, 0x94, 0xAD, 0xA2, 0xB4, 0x83, 0xEF, 0xB8, + 0xEB, 0xAD, 0xBD, 0xBE, 0xBE, 0x92, 0xBB, 0x8B, 0x86, 0xB4, 0xB1, 0xA2, 0xBB, 0xBF, 0xBE, 0xBB, + 0xA8, 0xB4, 0xAD, 0x8B, 0xBC, 0x88, 0x93, 0x9C, 0xBB, 0x8C, 0xAC, 0x94, 0x99, 0x88, 0xB9, 0xB5, + 0x80, 0x8C, 0x9E, 0xE3, 0xAB, 0xAE, 0xEC, 0xAC, 0xF5, 0xB0, 0xB4, 0x93, 0xE2, 0xA2, 0x9F, 0x8E, + 0xA2, 0xBC, 0x95, 0xB0, 0xBE, 0xEC, 0x8D, 0x95, 0xBC, 0xBD, 0xE9, 0xEE, 0x80, 0xAB, 0xBE, 0xA3, + 0x82, 0x96, 0x82, 0xEE, 0xAE, 0xAE, 0xAB, 0x91, 0xEA, 0x97, 0x86, 0xB4, 0x9F, 0xBD, 0x93, 0xE8, + 0x92, 0xA2, 0xAD, 0x88, 0xB2, 0x8D, 0x9B, 0xAC, 0x92, 0xB6, 0xEF, 0xB5, 0x88, 0xED, 0x92, 0x89, + 0xE3, 0xBD, 0x99, 0xA2, 0x97, 0x83, 0xEF, 0x90, 0xAC, 0x8A, 0x8B, 0xE2, 0x89, 0xF1, 0xBB, 0xAF, + 0xEB, 0x82, 0x89, 0xF5, 0xA2, 0xAD, 0xF5, 0x96, 0xEE, 0x95, 0x90, 0x8C, 0x83, 0x8E, 0xA8, 0x95, + 0x8C, 0x8D, 0xAF, 0xAC, 0xA0, 0x92, 0xEF, 0xEA, 0x94, 0xA9, 0xA8, 0x92, 0x86, 0xB4, 0xB7, 0xB9, + 0x88, 0xEE, 0x94, 0xEC, 0x9E, 0xEF, 0xF1, 0x9F, 0x83, 0x89, 0xA8, 0xA3, 0xAF, 0x96, 0xB2, 0x96, + 0xF1, 0x94, 0xAF, 0xB0, 0xF5, 0x9C, 0x8F, 0xE9, 0xED, 0xF1, 0xA0, 0xB8, 0x91, 0xB9, 0x80, 0x91, + 0x9E, 0xEB, 0xAB, 0x93, 0x92, 0x97, 0xB4, 0xE9, 0xBC, 0xB8, 0xBC, 0xB5, 0xA3, 0xA9, 0xAA, 0x9C, + 0xE9, 0xED, 0x91, 0x98, 0xB1, 0xB8, 0xBD, 0xBC, 0xE2, 0x91, 0xF1, 0xEB, 0x99, 0xAB, 0x86, 0xB4, + 0x96, 0xB9, 0xE8, 0x8F, 0x8F, 0xA9, 0x89, 0xB7, 0x80, 0x96, 0x9E, 0xB4, 0x88, 0xF1, 0xB0, 0x9E, + 0xEA, 0x8E, 0xE2, 0xA0, 0x9F, 0xA3, 0x98, 0x8E, 0x88, 0xEB, 0xBB, 0xE3, 0xB3, 0x99, 0x9B, 0x9B, + 0xA3, 0xE2, 0xAC, 0xEF, 0xEA, 0x95, 0xB1, 0xF1, 0x93, 0x90, 0x92, 0x80, 0x9B, 0xBD, 0x97, 0x98, + 0x9B, 0x9B, 0x9D, 0xB0, 0xBD, 0xBD, 0x93, 0xB0, 0x97, 0x93, 0x93, 0x99, 0x92, 0xA0, 0x9B, 0x8A, + 0x86, 0xB4, 0x98, 0xBD, 0x94, 0x8C, 0x92, 0x88, 0x97, 0x98, 0x9B, 0xBC, 0xE2, 0x9F, 0x98, 0x8E, + 0x9B, 0x9E, 0x9B, 0x8B, 0x92, 0xF5, 0x97, 0x9B, 0xE2, 0x9D, 0x9B, 0xEB, 0x8F, 0xBE, 0x90, 0x9B, + 0x9F, 0x98, 0xF5, 0xAD, 0x8B, 0x9C, 0x97, 0x9B, 0x95, 0x9B, 0x9B, 0x8B, 0x9B, 0xAD, 0x99, 0xBD, + 0x83, 0x9E, 0x8C, 0x88, 0xEA, 0xE8, 0x98, 0x9B, 0x97, 0x99, 0x9B, 0x8B, 0x9B, 0xAD, 0x9E, 0xBD, + 0x83, 0x9E, 0x86, 0xB4, 0x8C, 0x88, 0xEA, 0x8A, 0x9B, 0x8B, 0x92, 0xF5, 0x98, 0x9B, 0x8B, 0x9E, + 0x9B, 0xBD, 0x9F, 0x9D, 0x97, 0x98, 0xEA, 0x9D, 0x9B, 0xEB, 0x8F, 0xBE, 0x9E, 0xBD, 0x8B, 0x8D, + 0x98, 0x98, 0x8B, 0xED, 0xB1, 0xA2, 0x92, 0xED, 0x92, 0xF1, 0xBC, 0x88, 0xBC, 0xB1, 0xBD, 0xA9, + 0x95, 0xEF, 0xA9, 0x8F, 0x8A, 0x89, 0xAB, 0xB6, 0x8E, 0xEE, 0x8A, 0xE3, 0x89, 0xB0, 0x9B, 0xBC, + 0x98, 0xBD, 0x94, 0x8C, 0x86, 0xB4, 0x92, 0x89, 0x97, 0x9F, 0x9D, 0x9E, 0x9B, 0x8D, 0xBD, 0x98, + 0x8B, 0xEF, 0x8A, 0x95, 0xB9, 0xBE, 0xB3, 0x8E, 0xAE, 0xA3, 0xEF, 0xF5, 0xB8, 0xBB, 0xEC, 0xA3, + 0xA3, 0x9C, 0xEB, 0x96, 0x83, 0x97, 0x88, 0xAB, 0xB6, 0x9B, 0x9F, 0x8E, 0x9B, 0xF5, 0x98, 0xBD, + 0xBD, 0xA8, 0x98, 0xBD, 0x9F, 0x9C, 0x98, 0x8B, 0xB9, 0x98, 0x9B, 0x8B, 0x8B, 0xA0, 0x97, 0x9E, + 0x9F, 0xAD, 0x96, 0xAD, 0x83, 0x93, 0x86, 0xB4, 0x91, 0xAD, 0x83, 0x98, 0x98, 0x8B, 0x8F, 0x92, + 0x97, 0x9B, 0x91, 0x9D, 0x93, 0xE8, 0xB2, 0xEA, 0xBE, 0x92, 0x9B, 0xEC, 0x96, 0xA3, 0xE3, 0xB0, + 0x83, 0x89, 0xEF, 0xAD, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xAF, + 0xB8, 0xB7, 0x8C, 0xEA, 0x96, 0xE8, 0x94, 0xB2, 0x96, 0xE9, 0x90, 0xAC, 0xB8, 0xE9, 0x8B, 0xAF, + 0xB9, 0x9D, 0x8C, 0xAE, 0x97, 0x9E, 0xB9, 0x9D, 0x86, 0xB4, 0x9B, 0xEB, 0x8F, 0xBE, 0x92, 0xAD, + 0x8B, 0xAD, 0x97, 0x99, 0xEE, 0xAD, 0x96, 0x91, 0x9B, 0xAB, 0xB5, 0x99, 0xB3, 0x9D, 0x90, 0xB7, + 0xB2, 0xEA, 0xBE, 0x92, 0x9B, 0xEC, 0x96, 0xA3, 0xE3, 0xB0, 0x83, 0x89, 0xEF, 0xAD, 0x83, 0x82, + 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xAF, 0xB8, 0xB7, 0x8C, 0xEA, 0x96, 0xE8, + 0x94, 0xB2, 0x96, 0xE9, 0x90, 0xAC, 0xB8, 0xE9, 0x88, 0xBC, 0x86, 0xB4, 0x83, 0xE8, 0x9F, 0xAF, + 0x83, 0xE9, 0x90, 0xA9, 0x97, 0x93, 0x93, 0x98, 0x93, 0xAD, 0x83, 0x9E, 0x8C, 0x88, 0xEA, 0xBD, + 0x98, 0x93, 0x93, 0x98, 0x9D, 0xB0, 0x99, 0x99, 0x9B, 0x88, 0x83, 0xAD, 0xBD, 0xBB, 0xEA, 0x9D, + 0x9E, 0xB3, 0xA9, 0x9D, 0x9B, 0x8B, 0x8B, 0x98, 0xBD, 0xB9, 0xAD, 0xED, 0xBD, 0xE9, 0xEA, 0x99, + 0x9B, 0xBD, 0x9F, 0x98, 0x97, 0x93, 0x9D, 0xBB, 0x97, 0x9E, 0xB1, 0x9D, 0x86, 0xB4, 0x99, 0x99, + 0xA9, 0x9D, 0x9B, 0x8B, 0x8F, 0x9C, 0x98, 0xAD, 0x93, 0x98, 0x9C, 0xB3, 0xEB, 0xB5, 0xBE, 0x92, + 0x88, 0xAD, 0x95, 0xB3, 0xE2, 0xAC, 0x83, 0xE8, 0x9F, 0xAF, 0xB9, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, + 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x96, 0xB7, 0xEF, 0xB6, 0xBE, 0x99, 0xE3, 0xB0, 0x83, 0x89, + 0xE3, 0xAD, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x94, 0xBC, 0x86, 0xB4, + 0x83, 0xE9, 0x98, 0xA0, 0x96, 0xB7, 0xB2, 0xEA, 0xB8, 0x8D, 0xAD, 0xAD, 0x82, 0x8B, 0x83, 0x93, + 0x91, 0xAD, 0x83, 0x98, 0x98, 0x8B, 0x8F, 0x92, 0x9B, 0xBD, 0x93, 0xAD, 0x8F, 0x8E, 0x9B, 0xBC, + 0x9D, 0xB2, 0xB2, 0x8B, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xBD, + 0x89, 0x9D, 0xE3, 0xA9, 0x80, 0x9D, 0xB6, 0xAF, 0x80, 0xE9, 0x97, 0xA9, 0x93, 0x9D, 0xA2, 0xEA, + 0x86, 0xB4, 0x80, 0x99, 0xEE, 0xAD, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0x88, 0xB5, 0xAF, 0x88, 0x82, + 0xB2, 0xEA, 0x80, 0x82, 0x90, 0xAF, 0x83, 0x8D, 0xAD, 0xBD, 0x8B, 0xB7, 0x9C, 0xA0, 0xBB, 0x8D, + 0x97, 0xBD, 0x8B, 0xE8, 0x8C, 0xA3, 0xBE, 0x9D, 0xB6, 0xB7, 0xBB, 0x8D, 0x94, 0xB2, 0xBE, 0x9D, + 0xE3, 0xAF, 0x93, 0x9C, 0x98, 0xA3, 0x83, 0x8D, 0x94, 0xEA, 0xBB, 0x8D, 0x94, 0xB6, 0x93, 0x9C, + 0x94, 0xEA, 0x86, 0xB4, 0x83, 0x82, 0x88, 0xB6, 0xB8, 0x8D, 0x8C, 0xAF, 0xBE, 0x9E, 0x98, 0xB1, + 0x98, 0xBD, 0xEE, 0xA8, 0x98, 0xBD, 0x9F, 0x9F, 0x9B, 0x83, 0x92, 0x97, 0x95, 0xEE, 0x94, 0xE3, + 0x9B, 0xBD, 0x93, 0x98, 0x9B, 0xB0, 0x98, 0x89, 0x97, 0x9C, 0x9B, 0x9D, 0x99, 0x99, 0xA9, 0x9D, + 0x9B, 0x8B, 0x8F, 0x9C, 0x98, 0xAD, 0x93, 0x99, 0x97, 0x9F, 0x8B, 0xAD, 0x92, 0xA2, 0xB5, 0x83, + 0x8F, 0x9D, 0x9C, 0xA3, 0x86, 0xB4, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, + 0xB2, 0xAC, 0xB8, 0x9D, 0x88, 0xAA, 0xB8, 0xB7, 0xBE, 0xA0, 0x96, 0x99, 0x98, 0xA9, 0xBE, 0x9D, + 0x8B, 0xAF, 0x97, 0x9B, 0x97, 0x99, 0x9B, 0x8B, 0x9F, 0xBB, 0x93, 0x8F, 0x8C, 0xEE, 0xBE, 0x9D, + 0x8C, 0xA3, 0xB8, 0xB7, 0x9C, 0xA9, 0x93, 0x9F, 0x90, 0xB2, 0xB9, 0xE8, 0xB6, 0xB0, 0x93, 0x9F, + 0x94, 0xB6, 0xB9, 0xB4, 0x88, 0xAA, 0x86, 0xB4, 0x80, 0xB7, 0xB6, 0xB0, 0x83, 0x82, 0x88, 0xB6, + 0x93, 0x9C, 0x98, 0xAC, 0xB8, 0x9D, 0xB6, 0xB0, 0xBF, 0x8E, 0x9B, 0x94, 0x98, 0xBD, 0xB1, 0xAB, + 0xB2, 0xB1, 0xB3, 0x9D, 0xE3, 0xAD, 0xEA, 0x98, 0x9B, 0x8B, 0xA9, 0x9C, 0x9B, 0x9B, 0x95, 0x99, + 0x9B, 0xBD, 0x9F, 0x9B, 0xB0, 0x99, 0xBE, 0x9C, 0xB8, 0x8D, 0xB4, 0xBE, 0xA0, 0x9D, 0xB4, 0xAF, + 0xAD, 0xAA, 0xE2, 0xB7, 0xA8, 0xA3, 0xF5, 0xA3, 0x86, 0xB4, 0xB1, 0x95, 0x89, 0x95, 0xEB, 0xEF, + 0x94, 0xA3, 0x8F, 0xBC, 0xAF, 0xB2, 0x89, 0xAB, 0x80, 0xEE, 0xB3, 0x89, 0x88, 0xEC, 0xAE, 0xB7, + 0xA3, 0x8D, 0xA8, 0xB5, 0xE2, 0x88, 0x92, 0xBB, 0xA8, 0xE3, 0xEE, 0xE3, 0xA2, 0xA0, 0x8D, 0xA0, + 0xAF, 0x9C, 0xBE, 0xF1, 0xB1, 0xA2, 0xE3, 0xEB, 0x96, 0x93, 0x92, 0xEA, 0x90, 0x9B, 0xB5, 0xEC, + 0xB0, 0xED, 0x98, 0x80, 0x90, 0xBB, 0xE3, 0x80, 0xBB, 0xF5, 0x86, 0xB4, 0x9C, 0x9C, 0x9E, 0xEA, + 0xE3, 0xB7, 0x8D, 0x96, 0xEE, 0xAD, 0xED, 0x90, 0xBE, 0xE9, 0xB9, 0xBE, 0xAA, 0x93, 0x9B, 0xA8, + 0x92, 0x89, 0xF1, 0xA2, 0xBB, 0x92, 0x8C, 0xAC, 0x92, 0x92, 0xA2, 0xB9, 0xE3, 0x91, 0xA0, 0xF1, + 0xBE, 0xE9, 0xA3, 0x9B, 0xB4, 0xA2, 0x97, 0xB4, 0x95, 0x80, 0xB9, 0xB4, 0xB9, 0xAB, 0xB0, 0x8A, + 0x82, 0x9B, 0xA2, 0xA0, 0xB8, 0xE8, 0xB2, 0x9B, 0x8A, 0xEC, 0xEE, 0xAD, 0x86, 0xB4, 0xAD, 0x8A, + 0x9D, 0x83, 0x98, 0xA8, 0xB5, 0xEC, 0xBD, 0x83, 0xBE, 0xAC, 0xBD, 0x8E, 0x94, 0x93, 0xA9, 0xE9, + 0x92, 0x80, 0x9F, 0xB1, 0xBB, 0xB8, 0x94, 0xE8, 0xBF, 0x98, 0xB8, 0x9C, 0x9D, 0xBC, 0xAF, 0x97, + 0xE8, 0xE9, 0x99, 0x99, 0x94, 0x93, 0x99, 0x9F, 0xB8, 0xEB, 0x83, 0xB0, 0x80, 0x9D, 0x8C, 0xAC, + 0xEE, 0x96, 0x88, 0xAD, 0x98, 0xAD, 0xBD, 0xA9, 0x89, 0xB3, 0xEE, 0xB5, 0xAF, 0xEF, 0x86, 0xB4, + 0x8C, 0x88, 0xBE, 0xED, 0xA0, 0x94, 0x90, 0xEA, 0xB5, 0x8B, 0xB4, 0x89, 0x89, 0xA2, 0xB6, 0xE9, + 0x8C, 0xBE, 0x97, 0x83, 0xB8, 0xB6, 0xF5, 0x9B, 0xEE, 0xE2, 0x92, 0x89, 0xE3, 0xBE, 0x9B, 0xB0, + 0x89, 0xB1, 0xBD, 0xB3, 0xB4, 0x8B, 0xB0, 0xA9, 0xBC, 0xED, 0xBD, 0xBF, 0x99, 0xAB, 0x91, 0xEE, + 0xAF, 0x9E, 0xAC, 0x8C, 0xA9, 0x80, 0xBC, 0xB8, 0x8F, 0xAE, 0xEC, 0x9B, 0xE9, 0x95, 0x8E, 0xA3, + 0x86, 0xB4, 0xB7, 0xBF, 0xB6, 0x91, 0xE2, 0x8B, 0x9B, 0x8C, 0xB1, 0xE9, 0x82, 0x9E, 0x9B, 0x9D, + 0xB5, 0xB7, 0x99, 0x9E, 0x9E, 0x80, 0xB0, 0x89, 0x95, 0xB7, 0xA0, 0xB6, 0xAD, 0xB0, 0x9D, 0xB0, + 0xAD, 0xAF, 0x98, 0x94, 0x82, 0x8F, 0x97, 0xAA, 0xEC, 0x98, 0xAA, 0xA3, 0x9E, 0xAC, 0xEC, 0xB5, + 0x8E, 0x8E, 0xF1, 0xB5, 0xB1, 0x9B, 0xB7, 0x8B, 0xBD, 0xBB, 0xEB, 0xBD, 0x92, 0xB9, 0xA8, 0x97, + 0xB4, 0xBF, 0x86, 0xB4, 0x8F, 0xB5, 0xE9, 0xEE, 0xA3, 0x91, 0xEF, 0xBC, 0xE3, 0x93, 0xB5, 0xF1, + 0xAA, 0xE8, 0xBB, 0x8A, 0x96, 0x80, 0x8D, 0x8E, 0xEB, 0x92, 0x92, 0xB3, 0xB0, 0x92, 0x92, 0x8A, + 0x8C, 0xEC, 0xA8, 0x8F, 0xBF, 0xBE, 0x9C, 0xE3, 0x88, 0x8C, 0xB1, 0xAF, 0xB4, 0x96, 0x9E, 0x9D, + 0x95, 0xB9, 0x97, 0x8B, 0xB6, 0x95, 0x99, 0xB9, 0x82, 0x9B, 0xB1, 0x8D, 0x9E, 0x8F, 0xBB, 0xB1, + 0x8C, 0xE3, 0xA3, 0x89, 0x86, 0xB4, 0x99, 0xB9, 0xAC, 0x8C, 0xB2, 0xB8, 0xB2, 0x9B, 0xBF, 0xBD, + 0xB8, 0x80, 0xA2, 0x8C, 0x9D, 0x8F, 0xA2, 0xB3, 0xAF, 0x9C, 0x83, 0x8A, 0x9B, 0xB2, 0xBE, 0x89, + 0x90, 0xAD, 0x97, 0xB9, 0xEE, 0xB0, 0xAD, 0x8A, 0x90, 0xE8, 0x8A, 0xEC, 0xB0, 0xBB, 0xAC, 0xBC, + 0x99, 0xBC, 0x89, 0x96, 0xEE, 0x94, 0xBC, 0xBC, 0xAF, 0x91, 0xE3, 0x96, 0xF5, 0xB3, 0xB3, 0xA8, + 0x80, 0xBD, 0xB4, 0xBD, 0xEB, 0x99, 0x86, 0xB4, 0xF5, 0x91, 0xAF, 0xB0, 0xEC, 0x9F, 0xE2, 0x9F, + 0xA3, 0x9B, 0x95, 0xED, 0xB1, 0xEB, 0x94, 0x89, 0x97, 0x95, 0x9E, 0x9D, 0xEF, 0x96, 0x98, 0xEB, + 0x8C, 0xBD, 0xEF, 0x8B, 0x97, 0xAE, 0x8E, 0xB9, 0xAA, 0xA3, 0x89, 0x8A, 0x8D, 0xB0, 0x83, 0xEA, + 0xA2, 0xAF, 0xA9, 0xE3, 0xB2, 0xB8, 0x8F, 0x88, 0x8C, 0xE3, 0x91, 0xA8, 0xBE, 0xBE, 0x97, 0xB4, + 0x93, 0x8C, 0xB4, 0xB7, 0xA8, 0xEC, 0x82, 0xB5, 0x86, 0xB4, 0x9B, 0xEE, 0xE2, 0xBC, 0xB6, 0xA2, + 0xE9, 0x89, 0x83, 0xAB, 0x82, 0xF5, 0x98, 0x93, 0xB1, 0xB2, 0xEF, 0xAE, 0xA9, 0xF1, 0x9D, 0xE8, + 0x95, 0xEA, 0xAF, 0xBC, 0x88, 0xB2, 0xB7, 0xE8, 0x82, 0x93, 0xA8, 0xB1, 0xE2, 0x8F, 0xF1, 0xF1, + 0xB9, 0xF1, 0x82, 0x96, 0xAD, 0x98, 0xAA, 0x8A, 0x93, 0x95, 0x94, 0xB5, 0xB8, 0xE3, 0xE2, 0xBF, + 0xA2, 0x83, 0x91, 0x9C, 0xEA, 0x93, 0xB1, 0xB0, 0xA8, 0xAE, 0x86, 0xB4, 0xAB, 0xAE, 0x93, 0x97, + 0xB0, 0x94, 0x9F, 0xA2, 0x9F, 0x8B, 0xE3, 0x88, 0x90, 0xBF, 0xAE, 0xB1, 0xB1, 0xB7, 0x83, 0xF1, + 0x80, 0x8E, 0xE8, 0xB8, 0x80, 0x96, 0xA8, 0xB5, 0x9E, 0xBC, 0x9D, 0xB3, 0x82, 0x93, 0xA0, 0xAE, + 0xA2, 0x8B, 0xAC, 0xB9, 0xAF, 0xA0, 0xE8, 0x95, 0xBC, 0xB2, 0xEE, 0xB4, 0x96, 0xEA, 0xEC, 0x97, + 0x95, 0x8D, 0x92, 0x89, 0xBC, 0xF5, 0x9B, 0x8C, 0xBD, 0x8D, 0xB9, 0x91, 0x86, 0xB4, 0x99, 0xB7, + 0xAA, 0x8D, 0xAB, 0xBE, 0x9D, 0x82, 0xB0, 0xA3, 0xAD, 0xA0, 0x97, 0x8E, 0x96, 0xAA, 0x94, 0xA0, + 0xB2, 0xAA, 0xB4, 0xF5, 0x97, 0xE7, 0x86, 0xB4, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x9F, 0x94, 0x9E, + 0xFA, 0x99, 0x9F, 0x88, 0x8E, 0x93, 0x9C, 0x93, 0x99, 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0x86, 0xB4, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x98, 0x9F, 0x9D, 0x93, 0x94, 0xFA, 0x99, 0x9F, + 0x88, 0x8E, 0x93, 0x9C, 0x93, 0x99, 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, + 0x97, 0x93, 0x93, 0x92, 0xA0, 0x8E, 0x99, 0x99, 0x98, 0xB8, 0x8D, 0xBD, 0x9B, 0xAD, 0x93, 0x98, + 0x9B, 0xBD, 0x93, 0x90, 0x9B, 0x91, 0x9D, 0xEA, 0xAE, 0xAC, 0xBB, 0xB3, 0x97, 0xA9, 0xB6, 0xF1, + 0x97, 0x9B, 0xEA, 0x9D, 0x99, 0x89, 0xAB, 0x9D, 0x89, 0x93, 0xB8, 0xE9, 0x9E, 0x8B, 0x9F, 0x98, + 0x99, 0xAD, 0x8F, 0x9B, 0x97, 0x93, 0x9D, 0xBD, 0x97, 0x8B, 0xA9, 0xAD, 0x99, 0x8B, 0x83, 0x9E, + 0x86, 0xB4, 0x8C, 0x8B, 0x8B, 0x9D, 0x9F, 0xAD, 0x90, 0x9E, 0x89, 0x9E, 0x9F, 0x8C, 0x97, 0x98, + 0x97, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x98, 0xAD, 0xAD, 0x97, 0x8F, 0xE8, 0x94, 0xB5, 0x83, 0x8D, + 0x80, 0xB7, 0xBB, 0x9D, 0x9C, 0xEB, 0xB9, 0xE8, 0x8C, 0xAF, 0x97, 0x89, 0x97, 0xAD, 0x93, 0x8B, + 0x83, 0x9E, 0x8C, 0x8B, 0x8B, 0x91, 0x9E, 0x98, 0xAA, 0x8B, 0x8B, 0x8C, 0x90, 0x98, 0x8E, 0x9F, + 0xA2, 0x9C, 0x86, 0xB4, 0x8E, 0x9C, 0x97, 0xBD, 0x89, 0x8C, 0x9B, 0xBD, 0x89, 0x9D, 0xE3, 0xA9, + 0x80, 0x9D, 0xB6, 0xAF, 0x80, 0xE9, 0x97, 0xBD, 0x88, 0xE8, 0xEB, 0xB3, 0x89, 0x9E, 0x9F, 0x96, + 0x97, 0x9B, 0xB1, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xAD, 0xAD, 0x99, 0x89, 0x8C, 0x8B, 0xA2, + 0x93, 0xA0, 0x9B, 0xB2, 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0x97, 0x97, 0x9D, 0xB6, 0x98, 0xB2, + 0xB9, 0xB7, 0x9C, 0xA9, 0x86, 0xB4, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x9C, 0xBF, 0x92, + 0x88, 0xB6, 0xB9, 0xB7, 0xEF, 0xB2, 0xB8, 0x99, 0x98, 0xA3, 0xB8, 0xE8, 0xE3, 0xEA, 0x93, 0x9F, + 0x94, 0x98, 0x97, 0x89, 0x97, 0xAD, 0x93, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, + 0xB9, 0x94, 0x9B, 0x8B, 0xB1, 0x98, 0x9C, 0xB2, 0x88, 0xB2, 0x80, 0x9D, 0xEB, 0xAA, 0xB8, 0xB4, + 0x94, 0x9B, 0xB9, 0x9D, 0x9C, 0xA3, 0x86, 0xB4, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, + 0x96, 0xB7, 0x94, 0xAC, 0xB8, 0x8E, 0x9B, 0xBF, 0x9C, 0xAD, 0xEA, 0xA2, 0x97, 0xA0, 0x9B, 0xE9, + 0x97, 0x8E, 0x83, 0xA2, 0x94, 0x9E, 0x8F, 0xEA, 0x97, 0xB0, 0x88, 0xBB, 0x9C, 0xAD, 0xEA, 0xA3, + 0x95, 0x9E, 0x9B, 0xE9, 0x97, 0x8E, 0x93, 0xA2, 0x94, 0x9E, 0x8F, 0xEA, 0x97, 0xB0, 0x88, 0xBB, + 0x97, 0x93, 0x9D, 0xBD, 0x97, 0x8B, 0xA9, 0xAD, 0x86, 0xB4, 0x99, 0x8B, 0x83, 0x9E, 0x8C, 0x8B, + 0x8B, 0x9D, 0x9F, 0xAD, 0x90, 0x9E, 0x89, 0x9E, 0x9F, 0x8C, 0x97, 0x98, 0x97, 0x9D, 0x9B, 0xEB, + 0x8F, 0x9F, 0x98, 0xAD, 0xAD, 0x97, 0x8F, 0xE8, 0x94, 0xB5, 0x83, 0x8D, 0x80, 0xB7, 0xBB, 0x9D, + 0x9C, 0xEB, 0xB9, 0xE8, 0x8C, 0xAF, 0x97, 0x89, 0x97, 0xAD, 0x93, 0x8B, 0x83, 0x9E, 0x8C, 0x8B, + 0x8B, 0x91, 0x9E, 0x98, 0xAA, 0x8B, 0x8B, 0x8C, 0x90, 0x98, 0x86, 0xB4, 0x8E, 0x9F, 0xA2, 0x9C, + 0x8E, 0x9C, 0x97, 0xBD, 0x89, 0x8C, 0x9B, 0xBD, 0x89, 0x9D, 0xE3, 0xA9, 0x80, 0x9D, 0xB6, 0xAF, + 0x80, 0xE9, 0x97, 0xBD, 0x88, 0xE8, 0xEB, 0xB3, 0x89, 0x9E, 0x9F, 0x96, 0x97, 0x9B, 0xB1, 0x9D, + 0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xAD, 0xAD, 0x99, 0x89, 0x8C, 0x8B, 0xA2, 0x93, 0xA0, 0x9B, 0xB2, + 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0x97, 0x97, 0x9D, 0xB6, 0x98, 0xB2, 0x86, 0xB4, 0xB9, 0xB7, + 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x9C, 0xBF, 0x92, 0x88, 0xB6, 0xB9, 0xB7, + 0xEF, 0xB2, 0xB8, 0x99, 0x98, 0xA3, 0xB8, 0xE8, 0xE3, 0xEA, 0x93, 0x9F, 0x94, 0x98, 0x97, 0x89, + 0x97, 0xAD, 0x93, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, 0xB9, 0x94, 0x9B, 0x8B, + 0xB1, 0x98, 0x9C, 0xB2, 0x88, 0xB2, 0x80, 0x9D, 0xEB, 0xAA, 0xB8, 0xB4, 0x94, 0x9B, 0x86, 0xB4, + 0xB9, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x96, 0xB7, 0x94, 0xAC, + 0xB8, 0x8E, 0x99, 0x99, 0x9B, 0xB3, 0x93, 0xAD, 0x9E, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, + 0xB2, 0xAC, 0xB9, 0x94, 0x9B, 0x8B, 0x9F, 0x98, 0x98, 0x8B, 0x9B, 0x9E, 0xBD, 0xBD, 0x93, 0x8A, + 0x9B, 0x9E, 0x99, 0x99, 0x9B, 0xBD, 0xB5, 0x99, 0xBD, 0xBD, 0x93, 0x98, 0x9B, 0x94, 0x8A, 0x9C, + 0x86, 0xB4, 0x8E, 0x91, 0x88, 0xE8, 0xAC, 0xB3, 0xAF, 0xEA, 0xB7, 0xA0, 0x91, 0x9F, 0xEF, 0xA9, + 0x9D, 0xBB, 0x97, 0xB9, 0x96, 0x93, 0xEC, 0x95, 0xA0, 0x90, 0x88, 0xEA, 0x8A, 0xB0, 0xEF, 0x96, + 0xAB, 0x9C, 0x8A, 0xE9, 0x9F, 0xA9, 0xB7, 0x9D, 0x8D, 0x8F, 0x8B, 0xB0, 0xB5, 0x99, 0xB8, 0x94, + 0xAF, 0x9F, 0x9D, 0x80, 0xB7, 0xA0, 0xB0, 0xF5, 0xAA, 0xA3, 0xE8, 0xB5, 0xE9, 0x8C, 0x9D, 0xAB, + 0xEB, 0xE2, 0x86, 0xB4, 0xEC, 0x8F, 0x95, 0x8F, 0x9C, 0x8A, 0xE2, 0xE2, 0x83, 0x94, 0xE9, 0xED, + 0x93, 0x9F, 0x82, 0x8F, 0xBC, 0x8B, 0x82, 0xB1, 0xBC, 0x97, 0xF5, 0x83, 0xE3, 0x97, 0xED, 0xB7, + 0xA3, 0xEE, 0xE3, 0x9E, 0xEE, 0xE3, 0x9B, 0xB8, 0x9E, 0xB8, 0xB8, 0xB8, 0x9F, 0x90, 0x9E, 0xA9, + 0xA8, 0xB8, 0xA2, 0xEF, 0x83, 0x97, 0xF1, 0xB0, 0x8D, 0xB8, 0x95, 0xB4, 0x83, 0xE9, 0x9B, 0xBC, + 0xAF, 0x8D, 0xAF, 0x8A, 0x86, 0xB4, 0xBC, 0xAE, 0xA2, 0xB8, 0xE2, 0xB4, 0x9E, 0x93, 0xAC, 0x8F, + 0xB5, 0xE9, 0xEA, 0x98, 0x94, 0xAD, 0x93, 0xE2, 0xE2, 0x95, 0x8F, 0x9D, 0xB9, 0xAE, 0xE8, 0xA3, + 0xAA, 0xAE, 0x97, 0x83, 0xBD, 0xA0, 0xEF, 0xA3, 0x94, 0xA2, 0xA2, 0xB8, 0xA8, 0xB0, 0xBE, 0xBE, + 0x91, 0xAB, 0x8C, 0x93, 0xEA, 0xAA, 0xEB, 0xB3, 0xB9, 0xF1, 0x97, 0xE9, 0x92, 0xA0, 0x8E, 0x90, + 0xB3, 0xAF, 0xAF, 0xAB, 0xBF, 0x92, 0x86, 0xB4, 0xBC, 0x8F, 0x89, 0xE3, 0xF1, 0xE9, 0x83, 0xA9, + 0x97, 0xB1, 0x90, 0x99, 0x9C, 0x8B, 0xEE, 0xF1, 0xA9, 0xE3, 0x96, 0xA0, 0xB6, 0xED, 0xAE, 0xF5, + 0x93, 0xEC, 0xA0, 0xB6, 0xBE, 0xAD, 0x99, 0xAB, 0x8F, 0xB3, 0xB9, 0x8C, 0xB0, 0x83, 0x91, 0xEA, + 0xA0, 0x9E, 0xA2, 0xE9, 0xB8, 0xED, 0xEE, 0xB3, 0x80, 0x97, 0x8A, 0xEA, 0x91, 0x9E, 0x80, 0x99, + 0xAA, 0xEE, 0xB7, 0xB8, 0xAC, 0xBE, 0xED, 0xBE, 0x86, 0xB4, 0xE3, 0xE8, 0xAB, 0x88, 0x80, 0x91, + 0x88, 0xEA, 0xA2, 0x89, 0xEA, 0x9B, 0xB3, 0x90, 0xBE, 0xB1, 0xE2, 0xEE, 0xED, 0xEE, 0xB3, 0xA2, + 0xEC, 0xE9, 0xAC, 0x95, 0x80, 0xA9, 0xA2, 0xAC, 0xEE, 0x90, 0xB7, 0xAF, 0xB4, 0x8F, 0xAB, 0xBC, + 0xEB, 0xF1, 0xA9, 0x9D, 0xA9, 0xBF, 0x80, 0xBD, 0xBD, 0x9C, 0x83, 0xEB, 0x8A, 0xAB, 0xB0, 0xBC, + 0xB3, 0x8E, 0xB4, 0xE3, 0xE2, 0xAB, 0x95, 0xB7, 0x92, 0xB6, 0x86, 0xB4, 0xBE, 0x82, 0xBE, 0x90, + 0xB7, 0xB0, 0x9D, 0x96, 0xEE, 0xBB, 0x95, 0x8D, 0xF5, 0xEF, 0xB7, 0xAC, 0xBC, 0x8B, 0xB3, 0x93, + 0x91, 0xAE, 0xF1, 0xE2, 0x83, 0xB8, 0xA8, 0x9F, 0xEA, 0x98, 0x80, 0xAE, 0xAE, 0xB2, 0xA9, 0x8A, + 0x9D, 0x96, 0xEB, 0xBE, 0xB6, 0xEA, 0x98, 0x8F, 0xA8, 0xE2, 0x9C, 0x9C, 0xB0, 0xA0, 0xA9, 0xEB, + 0xEC, 0x9D, 0xA2, 0x97, 0xEC, 0x8F, 0xEB, 0xED, 0xAB, 0xA3, 0xE8, 0x96, 0x86, 0xB4, 0xAD, 0xEB, + 0x89, 0x8B, 0xAE, 0x80, 0xBB, 0xB7, 0xF5, 0xB9, 0x8A, 0xE2, 0xBB, 0xB9, 0xEB, 0xAD, 0x96, 0x9E, + 0xB4, 0x91, 0xF1, 0xA3, 0x80, 0xBB, 0x95, 0x9B, 0x9C, 0xA8, 0xE2, 0xEB, 0x82, 0x83, 0xBB, 0x98, + 0xA8, 0xAB, 0xEF, 0xAE, 0xBF, 0xA0, 0x99, 0xEB, 0xB8, 0x99, 0xE8, 0xB2, 0x91, 0xEF, 0xBF, 0x83, + 0xBC, 0x97, 0xB9, 0xEC, 0x97, 0xB6, 0xED, 0xAF, 0x92, 0xB1, 0x9D, 0xF5, 0x96, 0xF1, 0x86, 0xB4, + 0x8B, 0xB6, 0xEE, 0x8E, 0x8C, 0xBB, 0xB1, 0x8F, 0xB2, 0x96, 0xA9, 0xBB, 0xA3, 0x9B, 0x8E, 0xAB, + 0xAC, 0x9D, 0xE2, 0xAC, 0xBC, 0xAF, 0xB3, 0xED, 0xB3, 0x95, 0xEF, 0xB3, 0x98, 0xEC, 0xB2, 0xF1, + 0xB1, 0xEF, 0xED, 0xE9, 0x9F, 0x8A, 0xB6, 0xB4, 0x8A, 0xEB, 0x98, 0xBC, 0xBB, 0x9F, 0xA9, 0xA3, + 0x9E, 0xEB, 0xA0, 0x9D, 0xBC, 0xB2, 0xEC, 0xA3, 0x96, 0x9E, 0xEB, 0xAE, 0xA0, 0xED, 0xBB, 0xB4, + 0x86, 0xB4, 0xBE, 0xEF, 0xE9, 0xB7, 0xA2, 0x9F, 0x9B, 0xA3, 0x9E, 0xB9, 0xB8, 0x99, 0xA0, 0xA0, + 0x94, 0xB1, 0xA9, 0x9F, 0x8C, 0x89, 0xB8, 0xF5, 0xBD, 0xB0, 0x8D, 0xB0, 0x8B, 0xB1, 0xB4, 0x88, + 0xBF, 0xA0, 0xA0, 0xE9, 0x9B, 0xB4, 0x89, 0x8D, 0x89, 0x99, 0x88, 0x9B, 0xEF, 0x99, 0xAF, 0x94, + 0xE3, 0xB2, 0x8C, 0xEB, 0x9E, 0xB9, 0xEE, 0xEC, 0xB2, 0x91, 0xEB, 0x93, 0xAF, 0x94, 0x9F, 0xEA, + 0x9B, 0x99, 0x86, 0xB4, 0xA2, 0x9F, 0x97, 0xEC, 0xAE, 0xB0, 0x8E, 0xED, 0xEC, 0x83, 0x9C, 0xAF, + 0x8B, 0xA2, 0x94, 0xAF, 0x82, 0xF5, 0x99, 0xAE, 0x8E, 0x9C, 0xB4, 0x97, 0x93, 0x9E, 0x83, 0xB8, + 0x9D, 0x98, 0xAA, 0x94, 0xB6, 0xA2, 0x93, 0xB3, 0xBC, 0x90, 0xE2, 0xB5, 0xE3, 0xB0, 0xAB, 0x89, + 0x96, 0x8F, 0xBE, 0x9C, 0xBE, 0xA3, 0xEE, 0x94, 0x91, 0x8F, 0x9F, 0xB6, 0xB6, 0x82, 0xA2, 0xED, + 0xAB, 0x94, 0xB2, 0x9E, 0x86, 0xB4, 0x91, 0x9C, 0xB4, 0x91, 0xE8, 0x91, 0xAA, 0x8F, 0xEC, 0x96, + 0xB9, 0x96, 0xB3, 0xB4, 0x91, 0xB4, 0xA2, 0x98, 0x8B, 0x82, 0xEA, 0x8A, 0xB0, 0x9E, 0xB8, 0xBD, + 0xE3, 0xAE, 0xE3, 0x88, 0x98, 0x82, 0xAD, 0x93, 0xBF, 0xEF, 0xA0, 0xF1, 0xAA, 0xF5, 0x9B, 0xBD, + 0x97, 0x98, 0x9B, 0x9B, 0x9D, 0xB0, 0xBD, 0xBD, 0x93, 0x9D, 0x97, 0x93, 0x93, 0x99, 0x9B, 0xB0, + 0x9B, 0x8A, 0x98, 0xBD, 0x94, 0x8C, 0x86, 0xB4, 0x92, 0x88, 0x97, 0x98, 0x9B, 0xBC, 0xE2, 0x9F, + 0x98, 0x8E, 0x9B, 0x9E, 0x9B, 0x8B, 0x92, 0xF5, 0x97, 0x9B, 0xEE, 0x9D, 0x9B, 0xEB, 0x8F, 0xBE, + 0x9E, 0xAD, 0x9F, 0x98, 0xF5, 0xAD, 0x8B, 0x9F, 0x9B, 0xAD, 0x93, 0x98, 0x98, 0xB0, 0x9B, 0xBE, + 0x98, 0xBD, 0x94, 0x8C, 0x92, 0x8B, 0xEE, 0x9F, 0x9C, 0xBD, 0x8B, 0x8F, 0x95, 0x8E, 0xA0, 0xB4, + 0x92, 0x83, 0xB1, 0xED, 0xB9, 0xAF, 0xBC, 0xE8, 0x86, 0xB4, 0xE8, 0xAF, 0xA9, 0xA9, 0xB2, 0xBE, + 0x89, 0xE8, 0x9E, 0x9F, 0xBB, 0xAA, 0x8B, 0x98, 0x9F, 0xAD, 0x92, 0xAD, 0x83, 0x9E, 0x8C, 0x88, + 0xEA, 0xB0, 0x98, 0x98, 0xBD, 0xAD, 0x9C, 0xB5, 0x9B, 0x8F, 0x95, 0x8E, 0xA0, 0xB4, 0x92, 0x83, + 0xB1, 0xED, 0xB9, 0xAF, 0xBC, 0xE8, 0xE8, 0xAF, 0xA9, 0xA9, 0xB2, 0xBE, 0x89, 0xE8, 0x9E, 0x9F, + 0xBB, 0xAA, 0x8B, 0x98, 0x9F, 0xAD, 0x8A, 0xAD, 0x83, 0x93, 0x86, 0xB4, 0x91, 0xAD, 0x83, 0x98, + 0x98, 0x8B, 0x8F, 0x92, 0x9B, 0x8B, 0x9F, 0x9F, 0x97, 0xA0, 0x9B, 0xA2, 0x97, 0x99, 0xE2, 0x9D, + 0x99, 0x99, 0xA9, 0x9D, 0x9B, 0x8B, 0x8F, 0x9C, 0x98, 0xA0, 0x9B, 0x99, 0xB2, 0xB3, 0x94, 0xB5, + 0xBE, 0x92, 0x88, 0xAD, 0x95, 0xB3, 0xE2, 0xAC, 0x83, 0xE8, 0x9F, 0xAF, 0xB9, 0x9D, 0x9C, 0xA3, + 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x96, 0xB7, 0xEF, 0xB6, 0x86, 0xB4, 0xBE, 0x99, + 0xE3, 0xB0, 0x83, 0x89, 0xE3, 0xA3, 0xB8, 0xE8, 0xE3, 0xEA, 0x96, 0xB4, 0x98, 0xB6, 0xB8, 0x8E, + 0x9B, 0xE9, 0x98, 0xBD, 0x94, 0x8C, 0x92, 0x88, 0xE2, 0x9F, 0x97, 0x9E, 0x9B, 0xAF, 0x97, 0x99, + 0xA3, 0xBD, 0x91, 0xAB, 0x9B, 0xB5, 0xB2, 0xB3, 0x80, 0xB5, 0xBE, 0x92, 0x88, 0xAD, 0x95, 0xB3, + 0xE2, 0xAC, 0x83, 0xE8, 0x9F, 0xAF, 0xB9, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x86, 0xB4, + 0x80, 0x8D, 0xA2, 0xA0, 0x96, 0xB7, 0xEF, 0xB6, 0xBE, 0x99, 0xE3, 0xB0, 0x83, 0x89, 0xE3, 0xA3, + 0xB8, 0xE8, 0xE3, 0xEA, 0x82, 0xE8, 0x94, 0xB2, 0x96, 0xB7, 0x94, 0xA3, 0xB8, 0x9E, 0x99, 0x99, + 0x9B, 0x89, 0x97, 0x9D, 0x9B, 0xEB, 0x8F, 0xBE, 0x93, 0x9B, 0x89, 0x99, 0x9B, 0x88, 0xB5, 0xAD, + 0xBD, 0xBD, 0x9F, 0x8D, 0x97, 0x93, 0x9D, 0xAE, 0x98, 0xBD, 0xEE, 0xA8, 0x98, 0xBD, 0x9F, 0x9F, + 0x86, 0xB4, 0x9B, 0x83, 0x92, 0x97, 0x95, 0xEE, 0x94, 0xE3, 0x9B, 0xBD, 0x93, 0x98, 0x9B, 0x8E, + 0x99, 0x98, 0xB7, 0xB0, 0x9B, 0xEF, 0x98, 0xBD, 0xBD, 0xA8, 0x98, 0xBD, 0x9F, 0x9C, 0x98, 0x8B, + 0xB9, 0x99, 0x9B, 0x88, 0x83, 0xAE, 0xBB, 0x92, 0x88, 0xEA, 0xB9, 0x9E, 0xB5, 0xAC, 0x96, 0xE8, + 0x94, 0xB2, 0x96, 0xB4, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, + 0xEF, 0xAF, 0x86, 0xB4, 0x80, 0x82, 0x8B, 0xAC, 0x83, 0xE8, 0x9F, 0xAC, 0xB9, 0x9D, 0x9C, 0xA3, + 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x82, 0xE8, 0x94, 0xAD, 0xB9, 0xA3, 0xEF, 0xB5, + 0xBE, 0x9D, 0xEB, 0xA9, 0x97, 0x9C, 0xEA, 0x9D, 0x99, 0x99, 0xA9, 0x9D, 0x9B, 0x8B, 0x8F, 0x9C, + 0x98, 0xAD, 0x93, 0x99, 0x97, 0x9C, 0x9F, 0xAD, 0x92, 0xA2, 0xB5, 0x83, 0x8F, 0x9D, 0x9C, 0xA3, + 0x83, 0x8D, 0xA2, 0xA9, 0x86, 0xB4, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, 0xB2, 0xAC, 0xB8, 0x9D, + 0x88, 0xAA, 0xB8, 0xB7, 0xBE, 0xA0, 0x96, 0x99, 0x98, 0xA9, 0xBE, 0x9D, 0x8B, 0xAF, 0x97, 0x9B, + 0x97, 0x99, 0x9B, 0x8B, 0x9F, 0xBB, 0x96, 0xB1, 0x8C, 0xEE, 0xBE, 0x9D, 0x8C, 0xA3, 0xB8, 0xB7, + 0x9C, 0xA9, 0x93, 0x9F, 0x90, 0xB2, 0xB9, 0xE8, 0xB6, 0xB0, 0x93, 0x9F, 0x94, 0xB6, 0xB9, 0xB4, + 0x88, 0xAA, 0x80, 0xB7, 0xB6, 0xB0, 0x86, 0xB4, 0x83, 0x82, 0x88, 0xAC, 0xB8, 0xB3, 0x98, 0x8B, + 0xB9, 0xB7, 0x9C, 0xB0, 0xBE, 0x9D, 0xB6, 0xB0, 0x80, 0x89, 0x98, 0x8E, 0xBE, 0x9D, 0x9C, 0xEA, + 0x80, 0x8D, 0xEB, 0xB6, 0xB8, 0xB4, 0x8B, 0xAD, 0x80, 0x9B, 0x83, 0x95, 0x91, 0xAD, 0x83, 0x98, + 0x98, 0x9B, 0x9D, 0x98, 0xA0, 0x9E, 0xAF, 0x9E, 0xBC, 0x8B, 0x93, 0x99, 0x9B, 0x8B, 0x93, 0xAD, + 0x8F, 0xB0, 0x98, 0x8B, 0x98, 0xBD, 0xBD, 0xA8, 0x86, 0xB4, 0x98, 0xBD, 0x9F, 0x9C, 0x98, 0x8B, + 0xB9, 0x99, 0x9B, 0xB0, 0x98, 0x9F, 0x97, 0x98, 0xE2, 0xBB, 0x9D, 0x9C, 0x98, 0xB2, 0xB9, 0xB7, + 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x93, 0xB8, 0xE8, 0xA2, 0xB1, 0xBB, 0x8D, + 0xEF, 0xB4, 0xB9, 0xA3, 0xAD, 0xBD, 0xB8, 0x92, 0x88, 0xB1, 0x96, 0xB0, 0x9B, 0x9E, 0x9B, 0xBD, + 0x9F, 0x98, 0x9D, 0xB3, 0x9C, 0x9C, 0xBF, 0x92, 0x88, 0xB6, 0x86, 0xB4, 0xB9, 0xB7, 0xEF, 0xB2, + 0xB8, 0x99, 0x98, 0x99, 0x83, 0x82, 0x94, 0xAA, 0x83, 0xA3, 0x98, 0x9E, 0x80, 0x82, 0x90, 0xEA, + 0xBB, 0x8D, 0x80, 0xAA, 0x83, 0xE8, 0x9C, 0xEA, 0x80, 0x89, 0x98, 0x8B, 0xB8, 0xE8, 0xA2, 0xAA, + 0x83, 0xE9, 0xB1, 0xAD, 0x9E, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, 0xB9, 0x94, + 0x9B, 0x8B, 0x9F, 0x96, 0x98, 0x8B, 0x9B, 0x9E, 0xBD, 0xBD, 0x93, 0x98, 0x86, 0xB4, 0x9B, 0x9F, + 0xF1, 0x80, 0x94, 0xA9, 0xB9, 0xEE, 0xE3, 0x88, 0x90, 0xEC, 0x80, 0xAE, 0xB4, 0x8A, 0x9E, 0x8B, + 0xEF, 0x88, 0xE3, 0xB4, 0x8D, 0x91, 0x8C, 0xB5, 0x8B, 0x8B, 0x92, 0xAA, 0x90, 0x80, 0xB5, 0xA8, + 0xAD, 0xB5, 0x8F, 0x9D, 0xA3, 0xF1, 0x99, 0x8F, 0x89, 0xBC, 0x96, 0xE2, 0xAF, 0xA2, 0xE9, 0xEF, + 0xAD, 0xB2, 0xB7, 0xB8, 0xBE, 0xB3, 0x9D, 0x8B, 0x90, 0xE8, 0xED, 0x97, 0xB7, 0xE3, 0x86, 0xB4, + 0x80, 0x90, 0x8C, 0xA8, 0xBC, 0x9E, 0x92, 0x91, 0xAE, 0xB7, 0x8A, 0xED, 0xBD, 0x9D, 0xB9, 0x8C, + 0xED, 0x8C, 0xF1, 0x97, 0x8D, 0x8C, 0x8A, 0xBF, 0xB4, 0x88, 0xBB, 0x9E, 0xAA, 0xEA, 0xAC, 0xB6, + 0xBE, 0xEC, 0xB1, 0xEF, 0xB3, 0x8D, 0xEE, 0x80, 0xB0, 0xA0, 0xE3, 0x93, 0x88, 0xB4, 0x8F, 0x8B, + 0xEE, 0xAF, 0xEE, 0xEA, 0xAC, 0xB4, 0x8F, 0xB0, 0xEF, 0xEF, 0xAF, 0xA9, 0xB7, 0x91, 0xEE, 0x8C, + 0x86, 0xB4, 0xB9, 0xAC, 0xB9, 0x98, 0xBC, 0x9E, 0xF5, 0x98, 0xB2, 0x9E, 0xEF, 0xED, 0x8B, 0xB0, + 0x8B, 0xB8, 0xAE, 0xEB, 0xBD, 0x92, 0x83, 0xEE, 0x88, 0x9E, 0x96, 0xAB, 0x97, 0xB6, 0x94, 0x80, + 0xAE, 0x89, 0xA9, 0xA2, 0x97, 0x83, 0xB7, 0xBB, 0xAC, 0xF5, 0x8D, 0x91, 0x93, 0xBC, 0xED, 0xAB, + 0xEC, 0x92, 0xB0, 0x8E, 0xB7, 0x97, 0xAE, 0x80, 0x91, 0x98, 0xF1, 0xF5, 0x94, 0xAD, 0x8C, 0xAE, + 0xE3, 0xEA, 0x86, 0xB4, 0xEE, 0xA0, 0xAE, 0x97, 0x9D, 0x9E, 0x9B, 0xB8, 0xE3, 0xB6, 0x9F, 0xB0, + 0x9D, 0xE9, 0x9E, 0xAB, 0xEE, 0xB1, 0xB6, 0x89, 0xA0, 0x8C, 0xBC, 0x9D, 0x97, 0xEC, 0x9C, 0x96, + 0xB8, 0x97, 0xA2, 0xF5, 0x8B, 0xEC, 0xAD, 0xA3, 0xB2, 0xF1, 0xAC, 0x8C, 0xE2, 0x95, 0xB2, 0xE9, + 0x8B, 0x8A, 0xF5, 0xE8, 0x9B, 0xEF, 0xF5, 0xE2, 0x93, 0x88, 0x99, 0xEE, 0xA9, 0xAA, 0x8F, 0xAA, + 0x88, 0x97, 0xB8, 0x8D, 0x86, 0xB4, 0xAD, 0x9E, 0xBE, 0xAD, 0xA9, 0xAB, 0xBC, 0xB6, 0x99, 0xB8, + 0xA8, 0x9E, 0xAA, 0xB5, 0x97, 0x95, 0xA2, 0xED, 0xAA, 0xB4, 0x8C, 0x9B, 0xF1, 0x9B, 0xB6, 0xE3, + 0x82, 0xBF, 0x90, 0x83, 0x8F, 0xBE, 0xA8, 0x96, 0xEB, 0x9D, 0xAC, 0xEC, 0x88, 0xBB, 0x80, 0x89, + 0x97, 0xEA, 0xB6, 0xF1, 0x83, 0x98, 0x8C, 0x9C, 0x97, 0x9B, 0x93, 0xED, 0x98, 0xEE, 0x89, 0x8B, + 0x91, 0xAD, 0xB0, 0xB9, 0x98, 0xED, 0x86, 0xB4, 0x96, 0xAF, 0x8D, 0x8B, 0x9D, 0x94, 0xED, 0x8D, + 0x90, 0x8E, 0x92, 0xB9, 0xB8, 0x8F, 0xB7, 0xB3, 0x97, 0xB4, 0xBE, 0xB3, 0xA2, 0xEE, 0xBD, 0xAD, + 0x88, 0xAA, 0x98, 0xAE, 0xBE, 0xB8, 0xBB, 0xED, 0x9E, 0xEF, 0xAD, 0x91, 0x96, 0xA2, 0xB9, 0xBF, + 0x9B, 0xA0, 0x82, 0xB2, 0x95, 0xA8, 0x9B, 0x96, 0xED, 0xB6, 0x9B, 0xEB, 0xAB, 0x8A, 0xBF, 0x94, + 0xB2, 0xE2, 0x94, 0x98, 0xEB, 0x93, 0x99, 0x8E, 0x86, 0xB4, 0xA8, 0xE2, 0xE2, 0x95, 0xE2, 0xED, + 0xAF, 0x96, 0xB9, 0x93, 0x90, 0xAA, 0xB5, 0xB0, 0xBF, 0xEC, 0x94, 0xBD, 0xA3, 0xAF, 0xB2, 0xE2, + 0xBE, 0xBE, 0x92, 0xBC, 0xF5, 0xAA, 0x89, 0xB1, 0xAB, 0xF5, 0xB1, 0x98, 0x83, 0xB6, 0x8A, 0xEC, + 0x89, 0x9B, 0xAC, 0xBD, 0xED, 0xA2, 0xAF, 0xA9, 0xB8, 0x89, 0x9E, 0xBE, 0xAB, 0xAD, 0xB2, 0x8B, + 0xBB, 0xB9, 0x80, 0x83, 0xA2, 0xF5, 0x9D, 0x97, 0xA9, 0x9D, 0x86, 0xB4, 0x90, 0xB9, 0xB8, 0xA2, + 0xEF, 0xA2, 0x9B, 0xB4, 0xB7, 0xB8, 0xB7, 0xAE, 0xED, 0xE2, 0x89, 0x99, 0xBF, 0xE8, 0xAC, 0xA9, + 0x9F, 0xB5, 0x95, 0x9F, 0xB7, 0xA9, 0xF1, 0xB8, 0xE8, 0x8D, 0x99, 0x97, 0xB8, 0xA9, 0x93, 0xB1, + 0xB8, 0x98, 0x8C, 0xAE, 0xEB, 0x98, 0xF5, 0xA8, 0xE9, 0xE3, 0xBE, 0xA8, 0xBB, 0x8A, 0x91, 0xED, + 0xF5, 0xB7, 0xE2, 0x90, 0x90, 0x83, 0xAA, 0x8B, 0x8A, 0xAD, 0x8D, 0xA3, 0x86, 0xB4, 0xBB, 0x94, + 0xF5, 0x9D, 0xEE, 0xBD, 0x95, 0x98, 0x92, 0xAD, 0x91, 0xB8, 0xAE, 0x9B, 0xB4, 0xF1, 0xE3, 0xA2, + 0x82, 0x80, 0xA8, 0xB5, 0x94, 0xAB, 0xB6, 0xB0, 0x9B, 0x89, 0x8D, 0x94, 0x83, 0xA9, 0xA2, 0xBF, + 0x96, 0x95, 0x80, 0x82, 0xF1, 0xB1, 0xB1, 0x9D, 0xEB, 0xAE, 0xAD, 0xE8, 0xA0, 0x8E, 0xAD, 0x8E, + 0x82, 0x9E, 0x95, 0x8E, 0xEB, 0xAE, 0x95, 0xBB, 0x91, 0x95, 0xA2, 0x97, 0x8A, 0x95, 0x86, 0xB4, + 0xB3, 0xAB, 0xEE, 0x92, 0xEE, 0x9D, 0x93, 0x90, 0xB9, 0xEC, 0x80, 0x83, 0xEB, 0x80, 0xEB, 0x80, + 0xF5, 0x8B, 0xAF, 0xB6, 0xB4, 0x93, 0xAD, 0xEA, 0x8D, 0xEB, 0x8F, 0xE2, 0xA8, 0xBF, 0x8D, 0x97, + 0xBF, 0xAF, 0xB0, 0xBB, 0x82, 0x9D, 0xAD, 0xB2, 0xA3, 0xAB, 0x80, 0xB2, 0x99, 0xF1, 0x95, 0xA0, + 0xB9, 0xB4, 0xE3, 0xBC, 0x8F, 0x96, 0x8E, 0xF1, 0x8E, 0x83, 0x92, 0x8B, 0x8F, 0x99, 0xA8, 0xB5, + 0x86, 0xB4, 0x88, 0x91, 0xA2, 0xF1, 0xAD, 0xF1, 0x8C, 0x97, 0x93, 0x82, 0xAA, 0x93, 0x8D, 0xAC, + 0x8D, 0x98, 0xF1, 0xB0, 0xA2, 0xE2, 0xB8, 0xE3, 0xEF, 0xB4, 0x9D, 0xAB, 0xAD, 0xAF, 0xEC, 0xF1, + 0xB6, 0xAE, 0xE9, 0x80, 0xE9, 0xA3, 0x9B, 0xAE, 0x83, 0xBB, 0x8F, 0xB8, 0x96, 0xBE, 0x86, 0xB4, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x9F, 0x94, 0x9E, 0xFA, 0x99, 0x9F, 0x88, 0x8E, 0x93, 0x9C, 0x93, + 0x99, 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, 0xF8, 0xF6, 0xD0, 0xFA, 0xFA, + 0xFA, 0xFA, 0xF8, 0xA9, 0xB3, 0xBD, 0xB4, 0xBB, 0xAE, 0xAF, 0xA8, 0xBF, 0xF8, 0xE0, 0xFA, 0xF8, + 0xF8, 0xD0, 0xA7 + }; + + // const char* fake_license_data = "{\n \"license\": \"{\\\"name\\\": \\\"PrlPro17\\\", \\\"uuid\\\": \\\"\\\", \\\"lic_key\\\": \\\"\\\", \\\"product_version\\\": \\\"17.*\\\", \\\"is_upgrade\\\": false, \\\"is_sublicense\\\": false, \\\"parent_key\\\": null, \\\"parent_uuid\\\": null, \\\"main_period_ends_at\\\": \\\"2045-05-09 00:00:00\\\", \\\"grace_period_ends_at\\\": \\\"2045-05-09 00:00:00\\\", \\\"is_auto_renewable\\\": false, \\\"is_nfr\\\": false, \\\"is_beta\\\": false, \\\"is_china\\\": false, \\\"is_suspended\\\": false, \\\"is_expired\\\": false, \\\"is_grace_period\\\": false, \\\"is_purchased_online\\\": false, \\\"limit\\\": 10, \\\"usage\\\": 1, \\\"edition\\\": 2, \\\"platform\\\": 3, \\\"product\\\": 7, \\\"offline\\\": true, \\\"cpu_limit\\\": 32, \\\"ram_limit\\\": 131072, \\\"hosts\\\": [{\\\"name\\\": \\\"GDPR_HIDDEN\\\", \\\"hw_id\\\": \\\"\\\", \\\"product_version\\\": \\\"\\\", \\\"activated_at\\\": \\\"2021-05-09 00:00:00\\\"}], \\\"is_trial\\\": false}\",\n \"publicCerts\": \"-----BEGIN CERTIFICATE-----\\nMIIGpDCCBIygAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwdDELMAkGA1UEBhMCUlUx\\nDzANBgNVBAcMBk1vc2NvdzEjMCEGA1UECgwaUGFyYWxsZWxzIElQIEhvbGRpbmdz\\nIEdtYkgxEDAOBgNVBAsMB0Rlc2t0b3AxHTAbBgNVBAMMFFBhcmFsbGVscyBEZXNr\\ndG9wIENBMB4XDTE4MTIyNDA5MDM1N1oXDTI4MTEwNjA5MDM1N1owdzELMAkGA1UE\\nBhMCUlUxDzANBgNVBAcTBk1vc2NvdzElMCMGA1UEChMcUGFyYWxsZWxzIEludGVy\\nbmF0aW9uYWwgR21iSDEQMA4GA1UECxMHRGVza3RvcDEeMBwGA1UEAxMVZGVza3Rv\\ncC5wYXJhbGxlbHMuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\\nzoVPP60oYTjswM8vsWgpNOF9ZyB3wU/sJeYtmeC+0eTVDqYfI8Qq2/AoDLhEIg6c\\nvd8vGDUmXTvkX+r/bZCS9oR6o3M2otsgwMzsRQQgOWfngyB3PVh0V+FM68DoCZZF\\nLSYQ3Ghv7AK21M/g4TcKFY30ngc9avMJeJ6lSLzpEyV6YkDbB0VBcAOSe0AyAUN4\\na957UwRt2hVn5kCr5DPje4w1xXnHIx+MhrhGgUz0stQX2Yu4e2+lpy0rBEU7HIqe\\npCqVSwSeAfrgonwUAB1dTPSZ5wHBYiX30x+UaMScHlHuPOrUy4bS2e5mMR+FWGh9\\nv3oNBRMhLPJG9YIquGE4twIDAQABo4ICOzCCAjcwDAYDVR0TAQH/BAIwADAOBgNV\\nHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFG1biXwSoD4JwjCnq7kqU8fgXNv2MB8GA1Ud\\nIwQYMBaAFALkzfL1GhWDbfCrrwQRxRf52EyPMEEGCCsGAQUFBwEBBDUwMzAxBggr\\nBgEFBQcwAoYlaHR0cDovL3d3dy5wYXJhbGxlbHMuY29tL2NhL3BkX2NhLnBlbTA2\\nBgNVHR8ELzAtMCugKaAnhiVodHRwOi8vd3d3LnBhcmFsbGVscy5jb20vY2EvcGRf\\nY2EuY3JsMIIBJgYDVR0gBIIBHTCCARkwga0GDisGAQQBgcw7g30CAgEBMIGaMDkG\\nCCsGAQUFBwIBFi1odHRwOi8vY2EucGFyYWxsZWxzLm5ldC9jYS9wYXJhbGxlbHNf\\nY3BzLmh0bWwwXQYIKwYBBQUHAgIwUTAfGhhQYXJhbGxlbHMgSG9sZGluZ3MsIGx0\\nZC4wAwIBARouRXh0ZXJuYWwgQmFzaWMgQ2VydGlmaWNhdG9uIFByYWN0aWNlIFN0\\nYXRlbWVudDBnBg4rBgEEAYHMO4N9AgJmAzBVMFMGCCsGAQUFBwICMEcwHxoYUGFy\\nYWxsZWxzIEhvbGRpbmdzLCBsdGQuMAMCAQEaJFBhcmFsbGVscyBEZXNrdG9wIENl\\ncnRpZmljYXRlIFBvbGljeTAyBgNVHREEKzApghVkZXNrdG9wLnBhcmFsbGVscy5j\\nb22CEG15LnBhcmFsbGVscy5jb20wDQYJKoZIhvcNAQELBQADggIBAIVoVvxwMJLa\\ntshoaea1bqsnD2FU1r/FoQy1np5ifKQ7fvDr+z8gY0oKDrObRcYTeiRfSGG1TyXW\\nNfY9nlgbLJO7fM5vpqvj5WQJNaUjIzxNcitNn7teG5c5/C0fkiWeDH9t01gLRpvO\\nk5B4zDf8AHbkjrf73whZziuPhbyCyxjvdnVouP5oPwB9MYQLyxQMlVvYl0BC4wBi\\nkkaymqWBIxeKBWDEQyGvVabsOo1Kro6xk5s6SuutME6L97kmQaRGbOvbCZ95niEH\\neKua/1Ngt9U3Y6fPwP6gVaQglZBcPgs5+4a+hd/8gPZ+XbVXsK68j9eUMuhMoFdK\\ncaNejnQt3Cvsnp7ohSoRY3rKdfG0Idy/4HJCiCCOnDDpPXvqQqAo0cwEhbSjI66Y\\nzdtEkCFpWz23rGElQMxIs6ojwK/gu5+sJpE+l7QpXfCIhryqGqRHpdkSDp7Pc1Jr\\nJMpyNhDEI0QjPXkSnMVxMQuHUidARr43O32yt0VD/Zyt6sb2gmInF6XJrlYCDvOz\\npuKPoOE9EMI74XzKw5FsVhVUp8Wem8Ir7eP6GZ7hP21J7C9tPkiYjJqX6jJvvLE6\\nbPETlL48esW55ZmE57SE+F1oqK/hQ5tDJwneEryJZ+8KoiD42SKaf0k29iQfXH1F\\nYScGlH58rXXjAZv+kHNTsJ+zLX//KpzT\\n-----END CERTIFICATE-----\\n-----BEGIN CERTIFICATE-----\\nMIIH9TCCBd2gAwIBAgICEAMwDQYJKoZIhvcNAQELBQAwdDELMAkGA1UEBhMCUlUx\\nDzANBgNVBAcMBk1vd2NvdzEjMCEGA1UECgwaUGFyYWxsZWxzIElQIEhvbGRpbmdz\\nIEdtYkgxDjAMBgNVBAsMBUNsb3VkMR8wHQYDVQQDDBZQYXJhbGVscyBJc3N1aW5n\\nIENBICMxMB4XDTE4MTIyNDA5MDE1MFoXDTMxMDEyMzA5MDE1MFowdDELMAkGA1UE\\nBhMCUlUxDzANBgNVBAcMBk1vc2NvdzEjMCEGA1UECgwaUGFyYWxsZWxzIElQIEhv\\nbGRpbmdzIEdtYkgxEDAOBgNVBAsMB0Rlc2t0b3AxHTAbBgNVBAMMFFBhcmFsbGVs\\ncyBEZXNrdG9wIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA2r6P\\nz/fE4WESXkudT80kk+dkK/KFM9AqmmHBdx2KRBKXPuOJnQop6dS+ZRRYgyzqvFYl\\nOVy9oZhJ8qtrQH71ornL/ZNIUBMOoQ1Hg9Oqaqwr2b04qWV7RIjW5bG0QBgAYuDX\\nuq5dn1A8uDWoPYdmUrs+oir0kxUugumWSYYzhGOoDxpCSpXqSovYOcyENinD2NFs\\n6T6CJ1MC/yTUyu8oLCMsXimyHfe+pknJ1cSS4i3zQ7tRVdFMvbLdPbOkDaT/ZFyh\\neHOrpBKaeInsNoCoXoOSq9K8CzYq3mEikE/t3PB+8JbCMkf5g+Eup4RjlQeILu/Z\\nqEkGyJtovuRnPha1SUw5Qiz6EyLDaLug6RejPiQZHio10/zovlaN9aF74CGB7Ijj\\nTAMhxN423xKQepFPiPQtnZGke11urD7pyIRJQhQbPJeyHPZLoAY/Zn3Lu03wpqn4\\nuVlEfrvV3pv9gnmme/MUWyegiOxN0xlgBkgjdCo/d74KNjfcD/P4qRa+v50ddlOX\\nhuSAic3LowqizI9+jsU1NSCY/ssMnaFTVCGjtcPq2ZoE6n8NG1dWNEvFJQ1elZDf\\nZUQP/5r5oheEyBnOutJmrMVahCi6ipxv74DPzGqJCX8X7VHr+D2zeEgNrodD3iF/\\nq2yK1qP9/fdOk5CajZVcKextWdYBs9rM+0YF+sECAwEAAaOCAo8wggKLMBIGA1Ud\\nEwEB/wQIMAYBAf8CAQAwDwYDVR0kAQH/BAUwA4ABADAKBgNVHTYEAwIBADAOBgNV\\nHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFALkzfL1GhWDbfCrrwQRxRf52EyPMB8GA1Ud\\nIwQYMBaAFDuTEfsf59F+SCw7mxQ9KqVPg/1KMD8GCCsGAQUFBwEBBDMwMTAvBggr\\nBgEFBQcwAoYjaHR0cDovL2NhLnBhcmFsbGVscy5uZXQvY2Evcm9vdC5wZW0wNwYD\\nVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NhLnBhcmFsbGVscy5uZXQvY2Evcm9vdF9j\\nYS5jcmwwggGMBgNVHSAEggGDMIIBfzCBrQYOKwYBBAGBzDuDfQICAQEwgZowOQYI\\nKwYBBQUHAgEWLWh0dHA6Ly9jYS5wYXJhbGxlbHMubmV0L2NhL3BhcmFsbGVsc19j\\ncHMuaHRtbDBdBggrBgEFBQcCAjBRMB8aGFBhcmFsbGVscyBIb2xkaW5ncywgbHRk\\nLjADAgEBGi5FeHRlcm5hbCBCYXNpYyBDZXJ0aWZpY2F0b24gUHJhY3RpY2UgU3Rh\\ndGVtZW50MGQGDisGAQQBgcw7g30CAgECMFIwUAYIKwYBBQUHAgIwRDAfGhhQYXJh\\nbGxlbHMgSG9sZGluZ3MsIGx0ZC4wAwIBARohRXh0ZXJuYWwgQmFzaWMgQ2VydGlm\\naWNhdGUgUG9saWN5MGcGDisGAQQBgcw7g30CAmYDMFUwUwYIKwYBBQUHAgIwRzAf\\nGhhQYXJhbGxlbHMgSG9sZGluZ3MsIGx0ZC4wAwIBARokUGFyYWxsZWxzIERlc2t0\\nb3AgQ2VydGlmaWNhdGUgUG9saWN5MA0GCSqGSIb3DQEBCwUAA4ICAQApB9JZT+cw\\nKSGZuR5Lje1lgxueMEkq0QrBUgIaijImTo5nwD3jSpHX3iwX11DA0wvDDhS2bPOY\\nCvOn9KFy+iIli0cc1/4kBH/DYsAh+SUdZs/w3G/0JsucQD5AaL3pehsf3dZfR7cq\\n3q8D6ia/SoMrDLpQCJjm798yUevi4ZNJwEHIOH5gNv76eCx+nNJHvnw0yKKfq52M\\nh6aVRBiF73LcvCmNtgeDJxPUAdbVYgv7b0zpgypkph0aWQP90tqPAWnpjHQ2P7/o\\nP+ynKB3dX6ZcA5CJ5o4jXJX/+vS1HQWuTU8ChYBxFB67eCPDtbwtRwLmS4TTLBpX\\ngEWW8jaJCm4sYLMmj/uw3AqrXH3TFZEdaqhXT9s6igBL7V0NrC2rIpqjg9b1ZybY\\nZa/gCfPJ73sIUkFola1Kr50Sjar6aFfQDjYCfZeC6s4VgR6p0bs7jr61zwsPUlCu\\nAZWAiMtpzAq6YJY3njXTZQnlFZ2eAmgxYDaCRgjDnZtHVN8sVsc6vBJh6XaR84t+\\nitDGJfpm0RXOy2bblmleVPBDbGDruOzNJvB+0H6PbMqY1ROy4ZcLKVftQzScYBUQ\\ndDdT+4gPkIu1YhzBQjMNF/kPwUPE8WvVpe5bT+VMj7tIX2wQIJcdNGIvyCQ5aWoq\\neo6QhWmNlc3k/k63MhxRNe55cq64VyskFA==\\n-----END CERTIFICATE-----\\n-----BEGIN CERTIFICATE-----\\nMIIHvTCCBaWgAwIBAgIJAKfE9q7ikq7mMA0GCSqGSIb3DQEBCwUAMIGgMQswCQYD\\nVQQGEwJDSDEVMBMGA1UEBwwMU2NoYWZmaGF1c2VuMSMwIQYDVQQKDBpQQVJBTExF\\nTFMgSVAgSG9sZGluZ3MgR21iSDELMAkGA1UECwwCSVQxIzAhBgNVBAMMGlBhcmFs\\nbGVscyBFeHRlcm5hbCByb290IENBMSMwIQYJKoZIhvcNAQkBFhRhZG1pbnNAcGFy\\nYWxsZWxzLmNvbTAeFw0xNjEwMDcxNDEyMjVaFw0yODExMDYxNDEyMjVaMHQxCzAJ\\nBgNVBAYTAlJVMQ8wDQYDVQQHDAZNb3djb3cxIzAhBgNVBAoMGlBhcmFsbGVscyBJ\\nUCBIb2xkaW5ncyBHbWJIMQ4wDAYDVQQLDAVDbG91ZDEfMB0GA1UEAwwWUGFyYWxl\\nbHMgSXNzdWluZyBDQSAjMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB\\nALnxIcGsh9ozhUVby8mlCc5XQxKNfW6dGW/SnKbxpqrXfpQ0gNO6WoLI/EOSwk7C\\nZbo/Kc/0abmu26YexiiHEf0FdjS+9ySHqJOgf6kKclC9JC4Dr+FGZISG9G2fkzTn\\nNcsrHk9btii4wDZ9Kjz+398C3ysxK21xjkk+Re1OXl8E+Uhc67jbz0/0Tjd0d7Js\\njVjtKZxQts9SV3KzruwfTyhgkW/4VxmP4RCJqa1TgDLVL98fZjTQBG9cOj3tGRKd\\nZt3EV3QdDXFP08S62CkMOxWn+Fda9BPg6z83ne+TzmREJ4hlafj2kRg+1dKsCNUz\\nZN+nHYVkxNLl9jN/415CdXAPNfWYoibweG0QjI4Ld3/ue0DUEmOY4tu7ofQODnME\\n2ThWrKF8HSnxh8oFNTBm8J5Jh3pTvKw+tJdqbAUi9ykAN7/M+NwxnY5b1wgddHaQ\\nkxaedarnwQfRIFaVvNCRcoZVD9qt6v/jnI8xETxfOjd6WOfg34ZqdyXLX4ttqK0M\\nEgI2HxwRhWAvHl5oR7HS9gCxMY5JvPQ8S+au1XS/xw/L4OJVYTrOVWuvzH50NsrH\\nmcR4N6D5+EYSryuLhL+Nuj/FU37+zbKcZKD1qIHMn3fbfoyspF37KBkbgf8K+1Cq\\nLc2UUsSmZLDnR+jD0T8zEyBTR1a9iCAAy8v50Ok+IJHZAgMBAAGjggIjMIICHzAP\\nBgNVHRMBAf8EBTADAQH/MA8GA1UdJAEB/wQFMAOAAQAwCgYDVR02BAMCAQAwDgYD\\nVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQ7kxH7H+fRfkgsO5sUPSqlT4P9SjAfBgNV\\nHSMEGDAWgBQ5POcdiTty5/ba6yyF1LYMRqlAETA/BggrBgEFBQcBAQQzMDEwLwYI\\nKwYBBQUHMAKGI2h0dHA6Ly9jYS5wYXJhbGxlbHMubmV0L2NhL3Jvb3QucGVtMDcG\\nA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9jYS5wYXJhbGxlbHMubmV0L2NhL3Jvb3Rf\\nY2EuY3JsMIIBIwYDVR0gBIIBGjCCARYwga0GDisGAQQBgcw7g30CAgEBMIGaMDkG\\nCCsGAQUFBwIBFi1odHRwOi8vY2EucGFyYWxsZWxzLm5ldC9jYS9wYXJhbGxlbHNf\\nY3BzLmh0bWwwXQYIKwYBBQUHAgIwUTAfGhhQYXJhbGxlbHMgSG9sZGluZ3MsIGx0\\nZC4wAwIBARouRXh0ZXJuYWwgQmFzaWMgQ2VydGlmaWNhdG9uIFByYWN0aWNlIFN0\\nYXRlbWVudDBkBg4rBgEEAYHMO4N9AgIBAjBSMFAGCCsGAQUFBwICMEQwHxoYUGFy\\nYWxsZWxzIEhvbGRpbmdzLCBsdGQuMAMCAQEaIUV4dGVybmFsIEJhc2ljIENlcnRp\\nZmljYXRlIFBvbGljeTANBgkqhkiG9w0BAQsFAAOCAgEAjCdFbWndzGnuwp8mry/y\\nkOSO15NyUfuhSqZ4iSR6tmyWro8RHar949xzWzuFd+kx91LIH0JAo6j7BZJa9Za/\\nFFD09mWL4w7Jd3cdpIArHS+xaHVvHHxc9Kz+d3yAnxMnOZcncqjPXAxzb2hAP64w\\nwPGYBro6gYdvgTNIs3HZEkabN2eBbFGfuM23CCNICEb1YjZGVv4LRwBwgsSi4ou5\\nVRd7zNJ0oQnSSxl3VdMYbl/A48HS9dAjSkginQjsf7geCqK4uDvVsZfbUt6A3OTy\\nmelK8QAVk3XDAGomCDDZjSOmzlwjGjwuBNXUMp6BpyDv6oTT+okAmQga1gHcrMne\\nUo34yK5f9Io+p2aPLZWT1HHijHHPV6rUedF9RVkunLDGOcMQlOCcXAkWDUakV9yS\\nCcvVhbhAegbZxVGUxiuFYPAhdSJwMc4jwPJ2P6javfCfSL4NffuK9L/iirZgng1C\\n/Kuj6E8EyAO7k1NSMODG5LB1Vg5QMtTcpySPWjY0xus9hbURV9KrddMnIVnmr6Xo\\nA48flx3SYqX/BIkh5ts+G2O0ufRhm2XIrk8U++c+XLwBpPIONob98exYKF0Ikjrt\\nqtIMjNExEQ9RJetkkmY+ZT2bZLroDfGiXIztxQvcuz2Ofh4nL06MOWHSf/AVgWcK\\nCmpWqdGXjywzMTLpNzhpn/M=\\n-----END CERTIFICATE-----\\n-----BEGIN CERTIFICATE-----\\nMIIHzTCCBbWgAwIBAgIJAKG0tvaiMsl+MA0GCSqGSIb3DQEBCwUAMIGgMQswCQYD\\nVQQGEwJDSDEVMBMGA1UEBwwMU2NoYWZmaGF1c2VuMSMwIQYDVQQKDBpQQVJBTExF\\nTFMgSVAgSG9sZGluZ3MgR21iSDELMAkGA1UECwwCSVQxIzAhBgNVBAMMGlBhcmFs\\nbGVscyBFeHRlcm5hbCByb290IENBMSMwIQYJKoZIhvcNAQkBFhRhZG1pbnNAcGFy\\nYWxsZWxzLmNvbTAeFw0xMzA3MTYxNDU0MjRaFw0yODA3MTIxNDU0MjRaMIGgMQsw\\nCQYDVQQGEwJDSDEVMBMGA1UEBwwMU2NoYWZmaGF1c2VuMSMwIQYDVQQKDBpQQVJB\\nTExFTFMgSVAgSG9sZGluZ3MgR21iSDELMAkGA1UECwwCSVQxIzAhBgNVBAMMGlBh\\ncmFsbGVscyBFeHRlcm5hbCByb290IENBMSMwIQYJKoZIhvcNAQkBFhRhZG1pbnNA\\ncGFyYWxsZWxzLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANPF\\nTKR2viu0mzKE5sGaMcLI6OzJR0Pj5LqFP3EsmGWUQjoCbNuEGZmzj/py2o3VGq18\\n6UOUFP88YN37IEXUfQXkfM/Y9M7my49D49AbDbbbEJDsrbx5YM+jWbOnY3AfuWuP\\nftxb8nDIvUo30BNwI88OUGct2yptMYgz5yNxxbrjddKqVI0p1ic+M3HzTJiuuqeH\\nfUS9+3YsMkJCFQ4+s9Lzl7t/I6zldwCqUicVjYK0zDx3b74iZMP0KDZCp4mbvd7d\\n92qRZKR0xS0AiJdk8474ix63vOZsxv4JmunUqf1+sGseZggFY1PqjfiTn98qOmHl\\ndXdJmjGL4aOW/5mvfQiIKt+8YbrE0BZtthsPGL1dl0BUr8FFjzs16GxM6U17qy2L\\nw1SQtZam/cP8ac1wLDnK+yZaOAFr81XYaBrq5tezC1bC2hK5eYfMc6Ml7uHkG/L+\\nQl4TVakUhLsayATqvG8vfui7iO5iB6h+k573EPlnP1BfaEsyD1zGfh6yLD1tz7an\\nd53mxEAyDcbCzzNksEVSb/gjWjQknRezz3AnSWSCRA5CuN9hV1Dc46hK1IuNE0AC\\nxEM6tjT76YFuQxNuX/CtTFnMIDYbGBpNlxIifJ8o9jqSLUdFdy4NKUEllXx7qNhD\\nKFnK2KpU6LcLinKnxBQX0PjDbg9t9RBXwIe5z+p/AgMBAAGjggIGMIICAjAPBgNV\\nHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUOTznHYk7cuf2\\n2usshdS2DEapQBEwHwYDVR0jBBgwFoAUOTznHYk7cuf22usshdS2DEapQBEwPwYI\\nKwYBBQUHAQEEMzAxMC8GCCsGAQUFBzAChiNodHRwOi8vY2EucGFyYWxsZWxzLm5l\\ndC9jYS9yb290LnBlbTA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY2EucGFyYWxs\\nZWxzLm5ldC9jYS9yb290X2NhLmNybDCCASMGA1UdIASCARowggEWMIGtBg4rBgEE\\nAYHMO4N9AgIBATCBmjA5BggrBgEFBQcCARYtaHR0cDovL2NhLnBhcmFsbGVscy5u\\nZXQvY2EvcGFyYWxsZWxzX2Nwcy5odG1sMF0GCCsGAQUFBwICMFEwHxoYUGFyYWxs\\nZWxzIEhvbGRpbmdzLCBsdGQuMAMCAQEaLkV4dGVybmFsIEJhc2ljIENlcnRpZmlj\\nYXRvbiBQcmFjdGljZSBTdGF0ZW1lbnQwZAYOKwYBBAGBzDuDfQICAQIwUjBQBggr\\nBgEFBQcCAjBEMB8aGFBhcmFsbGVscyBIb2xkaW5ncywgbHRkLjADAgEBGiFFeHRl\\ncm5hbCBCYXNpYyBDZXJ0aWZpY2F0ZSBQb2xpY3kwDQYJKoZIhvcNAQELBQADggIB\\nAE+ZNsc49RJ6ZtnPDQ5R9nWKVoQQHpJZorwoUGy+CUSfL8ux35whmbdiGQJ27Mm9\\nZJVrfDHKtmP7gGcV7V+MWVPenRaDp0vld6k5iW4Zjz9IRnUQ4u40vnUj55usmK4V\\ncvcBfD/BhD57QjQbt1gHY4RDLqMlNZtSsxMYmav/WKIf7q6HjTmMtZKB+/NwVt90\\n4ztMGDAb9lEjG3Dq4klSzVfGM6FLbMx/Q6wyh+vV8Oh3QP/2A5/8IRC4spUpRMbW\\nwDdwsqflCbrDpoMOx7pnVA+Al9XeJYUdrL1Gv6RaZSM0l+YBVFMAI7B4SQKwjcB7\\nLuWQGN7WJTHcbUmiMndix4gwRpBtdba7D5wKLxceAzXhOrAL7lA1qPeNh8NB1ICT\\nr88O87uLcIJpoje6Ngyuh8ddHf/pSkq/kBYlP6SAvg7xusbSDdqwhQacZYx/GMsG\\nJcbx5xAnmbmt78SCe2vsEoOEms+b2WCMbsIkbBVt1B/r39draPK7/m8JJYpQPwWy\\naN/G4gOBHwKbtAn+9xXZroNqljASWNYsxeLOZX+kkG1tw2zTwTXDOT1tOaKOxMPO\\niq4H4GIJc6ZY1Z1Z/QulnIw0W1U8reWMeujaXGwhyqZhC+Ozcn9fULT+TYHQUCro\\nRKx+w+VMIXpIWvWB+jx8b95nGqwu6+lt3Z3yAtYaUbLd\\n-----END CERTIFICATE-----\\n\",\n \"signature\": \"\"\n}"; + + auto file = fopen(xorstr_("/Library/Preferences/Parallels/licenses.json"), xorstr_("wb")); + if (file) + { + for(int i = 0; i < sizeof(fake_license_data); i++) + fake_license_data[i] ^= 0xda; + fseek(file, 0, 0); + fwrite(fake_license_data, sizeof(fake_license_data), 1, file); + fclose(file); + for(int i = 0; i < sizeof(fake_license_data); i++) + fake_license_data[i] = 0; + dlog("[+] write fake license to (/Library/Preferences/Parallels/licenses.json)"); + } + else + { + dlog("[-] open fail. (/Library/Preferences/Parallels/licenses.json)"); + } + +} + +void func_patch_prl_disp_service() +{ + func_write_fake_license(); + + auto image_base = (char*)_dyld_get_image_header(0); + if (image_base) + { + #ifdef TARGET_ARCH_X64 + { + // license verify + { + // __const:0000000100976548 ; `vtable for'DspLic::SignCheckerImpl + // __const:0000000100976548 _ZTVN6DspLic15SignCheckerImplE dq 0 ; DATA XREF: sub_10033E970+31↑o + // __const:0000000100976548 ; offset to this + // __const:0000000100976550 dq offset _ZTIN6DspLic15SignCheckerImplE ; `typeinfo for'DspLic::SignCheckerImpl + // __const:0000000100976558 dq offset sub_10058F8F0 + // __const:0000000100976560 dq offset sub_10058F900 + // __const:0000000100976568 dq offset sub_10058F570 ; <--- patch sign verify + + // __text:000000010058F570 55 push rbp ; <---- patch + // __text:000000010058F571 48 89 E5 mov rbp, rsp + // __text:000000010058F574 41 57 push r15 + // __text:000000010058F576 41 56 push r14 + // __text:000000010058F578 41 54 push r12 + // __text:000000010058F57A 53 push rbx + // __text:000000010058F57B 48 81 EC A0 00 00 00 sub rsp, 0A0h ; <---- find + // __text:000000010058F582 49 89 CE mov r14, rcx + // __text:000000010058F585 49 89 D7 mov r15, rdx + // __text:000000010058F588 49 89 F4 mov r12, rsi + // __text:000000010058F58B BF D0 0A 00 00 mov edi, 0AD0h ; unsigned __int64 + // __text:000000010058F590 E8 BD FB 22 00 call __Znwm ; operator new(ulong) + // __text:000000010058F595 48 89 C3 mov rbx, rax + // __text:000000010058F598 48 89 45 A0 mov [rbp+var_60], rax + // __text:000000010058F59C 0F 28 05 DD 17 37 00 movaps xmm0, cs:xmmword_100900D80 + // __text:000000010058F5A3 0F 29 45 90 movaps [rbp+var_70], xmm0 + // __text:000000010058F5A7 48 8D 35 96 83 30 00 lea rsi, aBeginCertifica ; "-----BEGIN CERTIFICATE-----\nMIIHzTCCBb"... + // __text:000000010058F5AE BA CC 0A 00 00 mov edx, 0ACCh ; __n + // __text:000000010058F5B3 48 89 C7 mov rdi, rax ; __dst + // __text:000000010058F5B6 E8 17 00 23 00 call _memcpy + + { + uint8_t replace[] = OPCODE_RETURN_1; + if (func_patch_data(image_base + 0x58F570, replace, sizeof(replace))) + { + dlog("[+] patch prl_disp_service 1 success."); + } + else + { + dlog("[-] patch prl_disp_service 1 fail."); + } + } + } + // scheduleToSendReport + { + // __text:000000010029D4E8 0F 8C E5 04 00 00 jl loc_10029D9D3 + // __text:000000010029D4EE 48 8D 35 F5 97 5B 00 lea rsi, aObjcGetclass ; "objc_getClass" + // __text:000000010029D4F5 48 C7 C7 FE FF FF FF mov rdi, 0FFFFFFFFFFFFFFFEh ; __handle + // __text:000000010029D4FC E8 37 1E 52 00 call _dlsym + // __text:000000010029D501 48 8D 3D F0 97 5B 00 lea rdi, asc_100856CF8 ; "�" + // __text:000000010029D508 FF D0 call rax + // __text:000000010029D50A 49 89 C7 mov r15, rax + // __text:000000010029D50D 48 85 C0 test rax, rax + // __text:000000010029D510 4C 89 B5 E0 FC FF FF mov [rbp+var_320], r14 + + // __text:000000010029D517 0F 84 19 02 00 00 jz loc_10029D736 ; <---- patch jmp loc_10029D736 + + // __text:000000010029D517 90 nop + // __text:000000010029D518 E9 19 02 00 00 jmp loc_10029D736 + + // __text:000000010029D51D 48 8B 05 44 6B 6B 00 mov rax, cs:__ZN10QArrayData11shared_nullE_ptr + // __text:000000010029D524 48 89 85 00 FD FF FF mov [rbp+var_300], rax + // __text:000000010029D52B 48 8D 3D DE 94 5F 00 lea rdi, stru_100896A10 ; this + // __text:000000010029D532 31 F6 xor esi, esi ; char * + // __text:000000010029D534 E8 49 FE 51 00 call __ZN7QString16fromAscii_helperEPKci ; QString::fromAscii_helper(char const*,int) + // __text:000000010029D539 48 89 85 08 FD FF FF mov [rbp+var_2F8], rax + // __text:000000010029D540 48 8D 85 08 FD FF FF lea rax, [rbp+var_2F8] + // __text:000000010029D547 48 89 04 24 mov [rsp+330h+var_330], rax + // __text:000000010029D54B C7 44 24 08 00 00 00 00 mov [rsp+330h+var_328], 0 + // __text:000000010029D553 48 8D BD 38 FD FF FF lea rdi, [rbp+var_2C8] + // __text:000000010029D55A 48 8D 95 00 FD FF FF lea rdx, [rbp+var_300] + // __text:000000010029D561 BE 97 88 01 00 mov esi, 18897h + // __text:000000010029D566 B9 01 00 00 00 mov ecx, 1 + // __text:000000010029D56B 41 B8 79 10 01 80 mov r8d, 80011079h ; <---- find + // __text:000000010029D571 45 31 C9 xor r9d, r9d + // __text:000000010029D574 E8 7D FF 51 00 call __ZN8CVmEventC1E15_PRL_EVENT_TYPE7QString22_PRL_EVENT_ISSUER_TYPEiN3PVE17VmEventRespOptionES1_NS3_12VmEventLevelE ; CVmEvent::CVmEvent(_PRL_EVENT_TYPE,QString,_PRL_EVENT_ISSUER_TYPE,int,PVE::VmEventRespOption,QString,PVE::VmEventLevel) + // __text:000000010029D579 48 8B BD 08 FD FF FF mov rdi, [rbp+var_2F8] + // __text:000000010029D580 8B 07 mov eax, [rdi] + // __text:000000010029D582 83 F8 FF cmp eax, 0FFFFFFFFh + // __text:000000010029D585 74 1F jz short loc_10029D5A6 + // __text:000000010029D587 85 C0 test eax, eax + + uint8_t replace[] = { 0x90, 0xE9 }; + if (func_patch_data(image_base + 0x29D517, replace, sizeof(replace))) + { + dlog("[+] patch prl_disp_service 2 success."); + } + else + { + dlog("[-] patch prl_disp_service 2 fail."); + } + } + // /usr/bin/codesign + { + uint8_t replace[] = OPCODE_RETURN_1; + if (func_patch_data(image_base + 0x7a2d50, replace, sizeof(replace))) + { + dlog("[+] patch prl_disp_service 3 success."); + } + else + { + dlog("[-] patch prl_disp_service 3 fail."); + } + } + } + #endif + #ifdef TARGET_ARCH_ARM64 + { + // license verify + { + // __text:00000001005CF6C4 FF 03 03 D1 SUB SP, SP, #0xC0 + // __text:00000001005CF6C8 F6 57 09 A9 STP X22, X21, [SP,#0xB0+var_20] + // __text:00000001005CF6CC F4 4F 0A A9 STP X20, X19, [SP,#0xB0+var_10] + // __text:00000001005CF6D0 FD 7B 0B A9 STP X29, X30, [SP,#0xB0+var_s0] + // __text:00000001005CF6D4 FD C3 02 91 ADD X29, SP, #0xB0 + // __text:00000001005CF6D8 F3 03 03 AA MOV X19, X3 + // __text:00000001005CF6DC F4 03 02 AA MOV X20, X2 + // __text:00000001005CF6E0 F5 03 01 AA MOV X21, X1 + // __text:00000001005CF6E4 00 5A 81 52 MOV W0, #0xAD0 ; unsigned __int64 + // __text:00000001005CF6E8 68 C4 07 94 BL __Znwm ; operator new(ulong) + // __text:00000001005CF6EC F6 03 00 AA MOV X22, X0 + // __text:00000001005CF6F0 E0 2B 00 F9 STR X0, [SP,#0xB0+var_60] + // __text:00000001005CF6F4 C8 10 00 90 ADRP X8, #xmmword_1007E7760@PAGE + // __text:00000001005CF6F8 00 D9 C1 3D LDR Q0, [X8,#xmmword_1007E7760@PAGEOFF] + // __text:00000001005CF6FC E0 83 85 3C STUR Q0, [SP,#0xB0+var_58] + // __text:00000001005CF700 41 18 00 F0 21 58 03 91 ADRL X1, aBeginCertifica ; "-----BEGIN CERTIFICATE-----\nMIIHzTCCBb"... + // __text:00000001005CF708 82 59 81 52 MOV W2, #0xACC ; __n + // __text:00000001005CF70C 9C C6 07 94 BL _memcpy + uint8_t replace[] = OPCODE_RETURN_1; + if (func_patch_data(image_base + 0x5CF6C4, replace, sizeof(replace))) + // if (func_hook_func(image_base + 0x5CF6C4, (void *)func_return_1, nullptr)) + { + dlog("[+] patch prl_disp_service 1 success."); + } + else + { + dlog("[-] patch prl_disp_service 1 fail."); + } + } + // scheduleToSendReport + { + // __text:00000001002BF0B8 C0 2E 00 D0 00 D0 15 91 ADRL X0, asc_100899574 ; "�" + // __text:00000001002BF0C0 00 01 3F D6 BLR X8 + // __text:00000001002BF0C4 F4 03 00 AA MOV X20, X0 + // __text:00000001002BF0C8 60 0F 00 B4 CBZ X0, loc_1002BF2B4 ; <--- patch jmp + // __text:00000001002BF0CC F8 13 00 F9 STR X24, [SP,#0x330+var_310] + // __text:00000001002BF0D0 E0 2D 00 F0 00 80 3A 91 ADRL X0, asc_10087EEA0 ; "" + // __text:00000001002BF0D8 01 00 80 52 MOV W1, #0 ; char * + + uint8_t replace[] = { 0x7B, 0x00, 0x00, 0x14 }; + if (func_patch_data(image_base + 0x2BF0C8, replace, sizeof(replace))) + { + dlog("[+] patch prl_disp_service 2 success."); + } + else + { + dlog("[-] patch prl_disp_service 2 fail."); + } + } + // /usr/bin/codesign + { + uint8_t replace[] = OPCODE_RETURN_1; + if (func_patch_data(image_base + 0x7a3c14, replace, sizeof(replace))) + { + dlog("[+] patch prl_disp_service 3 success."); + } + else + { + dlog("[-] patch prl_disp_service 3 fail."); + } + } + } + #endif + } + +} + +void func_patch_prl_client_app() +{ + if (!func_check_version(xorstr_("51567"))) + { + dlog("[-] unsupport version."); + exit(0); + } + + auto image_base = (char*)_dyld_get_image_header(0); + if (image_base) + { + #ifdef TARGET_ARCH_X64 + { + { + // __text:000000010027A286 83 CB 01 or ebx, 1 + // __text:000000010027A289 81 FB 07 00 00 30 cmp ebx, 30000007h ; <--- find + // __text:000000010027A28F 0F 85 E3 08 00 00 jnz loc_10027AB78 ; <--- patch + // __text:000000010027A295 41 81 FE 04 00 00 30 cmp r14d, 30000004h + // __text:000000010027A29C 0F 85 D6 08 00 00 jnz loc_10027AB78 + + uint8_t replace[] = { 0x90, 0xE9 }; + if (func_patch_data(image_base + 0x27a28f, replace, sizeof(replace))) + { + dlog("[+] patch prl_client_app 1 success."); + } + else + { + dlog("[-] patch prl_client_app 1 fail."); + } + } + // /usr/bin/codesign + { + uint8_t replace[] = OPCODE_RETURN_1; + if (func_patch_data(image_base + 0x915dd0, replace, sizeof(replace))) + { + dlog("[+] patch prl_client_app 2 success."); + } + else + { + dlog("[-] patch prl_client_app 2 fail."); + } + } + } + #endif + #ifdef TARGET_ARCH_ARM64 + { + { + // __text:000000010029BDC0 97 00 80 52 17 00 A6 72 MOV W23, #0x30000004 ; <--- find + // __text:000000010029BDC8 A8 02 00 32 ORR W8, W21, #1 + // __text:000000010029BDCC E9 06 00 32 ORR W9, W23, #3 + // __text:000000010029BDD0 1F 01 09 6B CMP W8, W9 + // __text:000000010029BDD4 41 40 00 54 B.NE loc_10029C5DC ; <--- patch + uint8_t replace[] = { 0x02, 0x02, 0x00, 0x14 }; + if (func_patch_data(image_base + 0x29bdd4, replace, sizeof(replace))) + { + dlog("[+] patch prl_client_app 1 success."); + } + else + { + dlog("[-] patch prl_client_app 1 fail."); + } + } + // /usr/bin/codesign + { + uint8_t replace[] = OPCODE_RETURN_1; + if (func_patch_data(image_base + 0x95b59c, replace, sizeof(replace))) + { + dlog("[+] patch prl_client_app 2 success."); + } + else + { + dlog("[-] patch prl_client_app 2 fail."); + } + } + } + #endif + } +} + +void func_hook_applicationDidBecomeActive(id, SEL) +{ + dlog("[+] enter hookapplicationDidBecomeActive."); + + // @autoreleasepool { + // auto main_menu = [[NSApplication sharedApplication] mainMenu]; + // auto main_menu_count = [main_menu numberOfItems]; + // if (main_menu_count) { + // auto main_menu_last = [main_menu itemAtIndex:main_menu_count-1]; + // if ([main_menu_last hasSubmenu]) { + // auto menu_1 = [NSMenuItem separatorItem]; + // auto menu_2 = [[NSMenuItem alloc] init]; + // + // auto title = [NSString stringWithUTF8String:xorstr_("K'ed by day")]; + // [menu_2 setTitle:title]; + // + // auto sub_menu = [main_menu_last submenu]; + // [sub_menu addItem:menu_1]; + // [sub_menu addItem:menu_2]; + // } + // } + // } + + auto cls_NSApplication = (id)objc_getClass(xorstr_("NSApplication")); + if (!cls_NSApplication) { + dlog("[-] get class NSApplication fail"); + return; + } + dlog("[+] get class NSApplication success"); + auto cls_NSMenuItem = (id)objc_getClass(xorstr_("NSMenuItem")); + if (!cls_NSMenuItem) { + dlog("[-] get class NSMenuItem fail"); + return; + } + dlog("[+] get class NSMenuItem success"); + auto cls_NSString = (id)objc_getClass(xorstr_("NSString")); + if (!cls_NSString) { + dlog("[-] get class NSString fail"); + return; + } + dlog("[+] get class NSString success"); + + auto sel_sharedApplication = sel_registerName(xorstr_("sharedApplication")); + auto sel_mainMenu = sel_registerName(xorstr_("mainMenu")); + auto sel_numberOfItems = sel_registerName(xorstr_("numberOfItems")); + auto sel_itemAtIndex = sel_registerName(xorstr_("itemAtIndex:")); + auto sel_hasSubmenu = sel_registerName(xorstr_("hasSubmenu")); + auto sel_separatorItem = sel_registerName(xorstr_("separatorItem")); + auto sel_alloc = sel_registerName(xorstr_("alloc")); + auto sel_init = sel_registerName(xorstr_("init")); + auto sel_stringWithUTF8String = sel_registerName(xorstr_("stringWithUTF8String:")); + auto sel_setTitle = sel_registerName(xorstr_("setTitle:")); + auto sel_submenu = sel_registerName(xorstr_("submenu")); + auto sel_addItem = sel_registerName(xorstr_("addItem:")); + + auto cls_sharedApplication = (id)objc_msgSend(cls_NSApplication, sel_sharedApplication); + if (!cls_sharedApplication) { + dlog("[-] [NSApplication sharedApplication] fail"); + return; + } + dlog("[+] [NSApplication sharedApplication] success"); + auto cls_mainMenu = (id)objc_msgSend(cls_sharedApplication, sel_mainMenu); + if (!cls_mainMenu) { + dlog("[-] [sharedApplication mainMenu] fail"); + return; + } + dlog("[+] [sharedApplication mainMenu] success"); + int main_menu_count = (int)(intptr_t)objc_msgSend(cls_mainMenu, sel_numberOfItems); + dlog("[*] mainMenu count: %d", main_menu_count); + if (main_menu_count > 0) { + auto cls_menu_last = (id)objc_msgSend(cls_mainMenu, sel_itemAtIndex, main_menu_count - 1); + if (!cls_menu_last) { + dlog("[-] [mainMenu itemAtIndex: %d] fail", main_menu_count - 1); + return; + } + dlog("[+] [mainMenu itemAtIndex: %d] success", main_menu_count - 1); + + bool menu_last_hassubmenu = (bool)objc_msgSend(cls_menu_last, sel_hasSubmenu); + dlog("[*] hasSubmenu: %d", menu_last_hassubmenu? 1 : 0); + if (menu_last_hassubmenu) { + auto cls_menu_1 = (id)objc_msgSend(cls_NSMenuItem, sel_separatorItem); + auto cls_menu_2 = (id)objc_msgSend((id)objc_msgSend(cls_NSMenuItem, sel_alloc), sel_init); + if (!cls_menu_1) { + dlog("[-] [NSMenuItem separatorItem] fail"); + return; + } + dlog("[+] [NSMenuItem separatorItem] success"); + if (!cls_menu_2) { + dlog("[-] [[NSMenuItem alloc] init] fail"); + return; + } + dlog("[+] [[NSMenuItem alloc] init] success"); + + auto title = (id)objc_msgSend(cls_NSString, sel_stringWithUTF8String, xorstr_("K'ed by Day")); + if (!title) { + dlog("[-] [NSString stringWithUTF8String] fail"); + return; + } + dlog("[+] [NSString stringWithUTF8String] success"); + objc_msgSend(cls_menu_2, sel_setTitle, title); + + auto sub_menu = (id)objc_msgSend(cls_menu_last, sel_submenu); + if (!sub_menu) { + dlog("[-] [menu submenu] fail"); + return; + } + dlog("[+] [menu submenu] success"); + objc_msgSend(sub_menu, sel_addItem, cls_menu_1); + objc_msgSend(sub_menu, sel_addItem, cls_menu_2); + dlog("[+] add menu success"); + } + } + + auto file_path = xorstr_("/Library/Preferences/Parallels/licenses.json"); + auto file = fopen(file_path, xorstr_("wb")); + if (file) { + dlog("[*] write empty license data."); + auto content = xorstr_("{\n \"license\": \"\",\n \"signature\": \"\"\n}"); + fseek(file, 0, 0); + fwrite(content, strlen(content), 1, file); + fclose(file); + } +} + +void func_hook_menu() +{ + auto cls_NSObject = (id)objc_getMetaClass(xorstr_("NSObject")); + if(!cls_NSObject) { + dlog("[-] get class NSObject fail"); + return; + } + auto sel_applicationDidBecomeActive = sel_registerName(xorstr_("applicationDidBecomeActive:")); + if ( !class_addMethod((Class)cls_NSObject, sel_applicationDidBecomeActive, (IMP)func_hook_applicationDidBecomeActive, xorstr_("n")) ) { + dlog("[-] class_addMethod applicationDidBecomeActive fail."); + return; + } + dlog("[+] class_addMethod applicationDidBecomeActive success."); + + auto cls_NSNotificationCenter = (id)objc_getClass(xorstr_("NSNotificationCenter")); + if (!cls_NSNotificationCenter) { + dlog("[-] get class NSNotificationCenter fail"); + return; + } + auto cls_NSString = (id)objc_getClass(xorstr_("NSString")); + if (!cls_NSString) { + dlog("[-] get class NSString fail"); + return; + } + + auto sel_defaultCenter = sel_registerName(xorstr_("defaultCenter")); + auto sel_stringWithUTF8String = sel_registerName(xorstr_("stringWithUTF8String:")); + auto sel_addObserver = sel_registerName(xorstr_("addObserver:selector:name:object:")); + auto sel_class = sel_registerName(xorstr_("class")); + + auto cls_defaultCenter = (id)objc_msgSend(cls_NSNotificationCenter, sel_defaultCenter); + if (!cls_defaultCenter) { + dlog("[-] [NSNotificationCenter defaultCenter] fail"); + return; + } + + auto cls_name = (id)objc_msgSend(cls_NSString, sel_stringWithUTF8String, xorstr_("NSApplicationDidFinishLaunchingNotification")); + if (!cls_name) { + dlog("[-] [NSString stringWithUTF8String] fail"); + return; + } + + if (nullptr == vars_g_static_class) { + auto sel_alloc = sel_registerName(xorstr_("alloc")); + id v = (id)objc_msgSend(cls_NSObject, sel_alloc); + vars_g_static_class = v; + } + + objc_msgSend(cls_defaultCenter, sel_addObserver, vars_g_static_class, sel_applicationDidBecomeActive, cls_name, 0); + dlog("[+] addObserver success"); +} + +__attribute__((constructor)) +void func_load() +{ + const char *moduleName = _dyld_get_image_name(0); + dlog("[*] load %s", moduleName); + + if (str_ends_with(moduleName, xorstr_("prl_client_app"))) + { + dlog("patch prl_client_app start"); + func_patch_prl_client_app(); + dlog("patch prl_client_app over"); + } + else if (str_ends_with(moduleName, xorstr_("prl_disp_service"))) + { + dlog("patch prl_disp_service start"); + func_patch_prl_disp_service(); + dlog("patch prl_disp_service over"); + } + else if (str_ends_with(moduleName, xorstr_("prl_vm_app"))) + { + dlog("patch prl_vm_app start"); + func_patch_prl_vm_app(); + dlog("patch prl_vm_app over"); + } + else if (str_ends_with(moduleName, xorstr_("Parallels Toolbox"))) + { + dlog("patch Parallels Toolbox start"); + func_patch_Parallels_Toolbox(); + dlog("patch Parallels Toolbox over"); + } + + func_patch_dylibs(); + func_hook_menu(); +} + +#endif \ No newline at end of file diff --git a/src/xorstr.hpp b/src/xorstr.hpp new file mode 100644 index 0000000..50ddeec --- /dev/null +++ b/src/xorstr.hpp @@ -0,0 +1,242 @@ +/* + * Copyright 2017 - 2021 Justas Masiulis + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef JM_XORSTR_HPP +#define JM_XORSTR_HPP + +#if defined(_M_ARM64) || defined(__aarch64__) || defined(_M_ARM) || defined(__arm__) +#include +#elif defined(_M_X64) || defined(__amd64__) || defined(_M_IX86) || defined(__i386__) +#include +#else +#error Unsupported platform +#endif + +#include +#include +#include +#include + +#define xorstr(str) ::OqYAfkhl::swG([]() { return str; }, std::integral_constant{}, std::make_index_sequence<::OqYAfkhl::CtKWt::UfWL()>{}) +#define xorstr_(str) xorstr(str).Pr() + +#ifdef _MSC_VER +#define XORSTR_FORCEINLINE __forceinline +#else +#define XORSTR_FORCEINLINE __attribute__((always_inline)) inline +#endif + +namespace OqYAfkhl { + + namespace CtKWt { + + template + XORSTR_FORCEINLINE constexpr std::size_t UfWL() + { + return ((Size / 16) + (Size % 16 != 0)) * 2; + } + + template + XORSTR_FORCEINLINE constexpr std::uint32_t rY() noexcept + { + std::uint32_t value = Seed; + for(char c : __TIME__) + value = static_cast((value ^ c) * 16777619ull); + return value; + } + + template + XORSTR_FORCEINLINE constexpr std::uint64_t WL() + { + constexpr auto first_part = rY<2166136261 + S>(); + constexpr auto second_part = rY(); + return (static_cast(first_part) << 32) | second_part; + } + + // loads up to 8 characters of string into uint64 and xors it with the key + template + XORSTR_FORCEINLINE constexpr std::uint64_t + EE(std::uint64_t key, std::size_t idx, const CharT* str) noexcept + { + using cast_type = typename std::make_unsigned::type; + constexpr auto value_size = sizeof(CharT); + constexpr auto idx_offset = 8 / value_size; + + std::uint64_t value = key; + for(std::size_t i = 0; i < idx_offset && i + idx * idx_offset < N; ++i) + value ^= + (std::uint64_t{ static_cast(str[i + idx * idx_offset]) } + << ((i % idx_offset) * 8 * value_size)); + + return value; + } + + // forces compiler to use registers instead of stuffing constants in rdata + XORSTR_FORCEINLINE std::uint64_t Fw(std::uint64_t value) noexcept + { +#if defined(__clang__) || defined(__GNUC__) + asm("" : "=r"(value) : "0"(value) :); + return value; +#else + volatile std::uint64_t reg = value; + return reg; +#endif + } + + } // namespace detail + + template + class swG; + + template + class swG, std::index_sequence> { +#ifndef JM_XORSTR_DISABLE_AVX_INTRINSICS + constexpr static inline std::uint64_t alignment = ((Size > 16) ? 32 : 16); +#else + constexpr static inline std::uint64_t alignment = 16; +#endif + + alignas(alignment) std::uint64_t _storage[sizeof...(Keys)]; + + public: + using value_type = CharT; + using size_type = std::size_t; + using pointer = CharT*; + using const_pointer = const CharT*; + + template + XORSTR_FORCEINLINE swG(L l, std::integral_constant, std::index_sequence) noexcept + : _storage{ ::OqYAfkhl::CtKWt::Fw((std::integral_constant(Keys, Indices, l())>::value))... } + {} + + XORSTR_FORCEINLINE constexpr size_type size() const noexcept + { + return Size - 1; + } + + XORSTR_FORCEINLINE void fO() noexcept + { + // everything is inlined by hand because a certain compiler with a certain linker is _very_ slow +#if defined(__clang__) + alignas(alignment) + std::uint64_t arr[]{ ::OqYAfkhl::CtKWt::Fw(Keys)... }; + std::uint64_t* keys = + (std::uint64_t*)::OqYAfkhl::CtKWt::Fw((std::uint64_t)arr); +#else + alignas(alignment) std::uint64_t keys[]{ ::OqYAfkhl::CtKWt::Fw(Keys)... }; +#endif + +#if defined(_M_ARM64) || defined(__aarch64__) || defined(_M_ARM) || defined(__arm__) +#if defined(__clang__) + ((Indices >= sizeof(_storage) / 16 ? static_cast(0) : __builtin_neon_vst1q_v( + reinterpret_cast(_storage) + Indices * 2, + veorq_u64(__builtin_neon_vld1q_v(reinterpret_cast(_storage) + Indices * 2, 51), + __builtin_neon_vld1q_v(reinterpret_cast(keys) + Indices * 2, 51)), + 51)), ...); +#else // GCC, MSVC + ((Indices >= sizeof(_storage) / 16 ? static_cast(0) : vst1q_u64( + reinterpret_cast(_storage) + Indices * 2, + veorq_u64(vld1q_u64(reinterpret_cast(_storage) + Indices * 2), + vld1q_u64(reinterpret_cast(keys) + Indices * 2)))), ...); +#endif +#elif !defined(JM_XORSTR_DISABLE_AVX_INTRINSICS) + ((Indices >= sizeof(_storage) / 32 ? static_cast(0) : _mm256_store_si256( + reinterpret_cast<__m256i*>(_storage) + Indices, + _mm256_xor_si256( + _mm256_load_si256(reinterpret_cast(_storage) + Indices), + _mm256_load_si256(reinterpret_cast(keys) + Indices)))), ...); + + if constexpr(sizeof(_storage) % 32 != 0) + _mm_store_si128( + reinterpret_cast<__m128i*>(_storage + sizeof...(Keys) - 2), + _mm_xor_si128(_mm_load_si128(reinterpret_cast(_storage + sizeof...(Keys) - 2)), + _mm_load_si128(reinterpret_cast(keys + sizeof...(Keys) - 2)))); +#else + ((Indices >= sizeof(_storage) / 16 ? static_cast(0) : _mm_store_si128( + reinterpret_cast<__m128i*>(_storage) + Indices, + _mm_xor_si128(_mm_load_si128(reinterpret_cast(_storage) + Indices), + _mm_load_si128(reinterpret_cast(keys) + Indices)))), ...); +#endif + } + + XORSTR_FORCEINLINE const_pointer Ce() const noexcept + { + return reinterpret_cast(_storage); + } + + XORSTR_FORCEINLINE pointer Ce() noexcept + { + return reinterpret_cast(_storage); + } + + XORSTR_FORCEINLINE pointer Pr() noexcept + { + // fO() is inlined by hand because a certain compiler with a certain linker is _very_ slow +#if defined(__clang__) + alignas(alignment) + std::uint64_t arr[]{ ::OqYAfkhl::CtKWt::Fw(Keys)... }; + std::uint64_t* keys = + (std::uint64_t*)::OqYAfkhl::CtKWt::Fw((std::uint64_t)arr); +#else + alignas(alignment) std::uint64_t keys[]{ ::OqYAfkhl::CtKWt::Fw(Keys)... }; +#endif + +#if defined(_M_ARM64) || defined(__aarch64__) || defined(_M_ARM) || defined(__arm__) +#if defined(__clang__) + ((Indices >= sizeof(_storage) / 16 ? static_cast(0) : __builtin_neon_vst1q_v( + reinterpret_cast(_storage) + Indices * 2, + veorq_u64(__builtin_neon_vld1q_v(reinterpret_cast(_storage) + Indices * 2, 51), + __builtin_neon_vld1q_v(reinterpret_cast(keys) + Indices * 2, 51)), + 51)), ...); +#else // GCC, MSVC + ((Indices >= sizeof(_storage) / 16 ? static_cast(0) : vst1q_u64( + reinterpret_cast(_storage) + Indices * 2, + veorq_u64(vld1q_u64(reinterpret_cast(_storage) + Indices * 2), + vld1q_u64(reinterpret_cast(keys) + Indices * 2)))), ...); +#endif +#elif !defined(JM_XORSTR_DISABLE_AVX_INTRINSICS) + ((Indices >= sizeof(_storage) / 32 ? static_cast(0) : _mm256_store_si256( + reinterpret_cast<__m256i*>(_storage) + Indices, + _mm256_xor_si256( + _mm256_load_si256(reinterpret_cast(_storage) + Indices), + _mm256_load_si256(reinterpret_cast(keys) + Indices)))), ...); + + if constexpr(sizeof(_storage) % 32 != 0) + _mm_store_si128( + reinterpret_cast<__m128i*>(_storage + sizeof...(Keys) - 2), + _mm_xor_si128(_mm_load_si128(reinterpret_cast(_storage + sizeof...(Keys) - 2)), + _mm_load_si128(reinterpret_cast(keys + sizeof...(Keys) - 2)))); +#else + ((Indices >= sizeof(_storage) / 16 ? static_cast(0) : _mm_store_si128( + reinterpret_cast<__m128i*>(_storage) + Indices, + _mm_xor_si128(_mm_load_si128(reinterpret_cast(_storage) + Indices), + _mm_load_si128(reinterpret_cast(keys) + Indices)))), ...); +#endif + + return (pointer)(_storage); + } + }; + + template + swG(L l, std::integral_constant, std::index_sequence) -> swG< + std::remove_const_t>, + Size, + std::integer_sequence()...>, + std::index_sequence>; + +} // namespace jm + +#endif // include guard \ No newline at end of file