diff --git a/Telegram/Build.bat b/Telegram/Build.bat index e0a9d9ac3..33c14d499 100644 --- a/Telegram/Build.bat +++ b/Telegram/Build.bat @@ -1,123 +1,167 @@ @echo OFF + FOR /F "tokens=1,2* delims= " %%i in (Version) do set "%%i=%%j" -if %DevChannel% neq 0 goto preparedev - -set "DevParam=" -set "AppVersionStrFull=%AppVersionStr%" -goto devprepared - -:preparedev - -set "DevParam=-dev" -set "AppVersionStrFull=%AppVersionStr%.dev" - -:devprepared +set "VersionForPacker=%AppVersion%" +if %BetaVersion% neq 0 ( + set "AppVersion=%BetaVersion%" + set "AppVersionStrFull=%AppVersionStr%_%BetaVersion%" + set "DevParam=-beta %BetaVersion%" + set "BetaKeyFile=tbeta_%BetaVersion%_key" +) else ( + if %DevChannel% neq 0 ( + set "DevParam=-dev" + set "AppVersionStrFull=%AppVersionStr%.dev" + ) else ( + set "DevParam=" + set "AppVersionStrFull=%AppVersionStr%" + ) +) echo. echo Building version %AppVersionStrFull% for Windows.. echo. -if exist ..\Win32\Deploy\deploy\%AppVersionStrMajor%\%AppVersionStr%\ goto error_exist1 -if exist ..\Win32\Deploy\deploy\%AppVersionStrMajor%\%AppVersionStr%.dev\ goto error_exist2 -if exist ..\Win32\Deploy\tupdate%AppVersion% goto error_exist3 +set "UpdateFile=tupdate%AppVersion%" +set "SetupFile=tsetup.%AppVersionStrFull%.exe" +set "PortableFile=tportable.%AppVersionStrFull%.zip" +set "HomePath=..\..\Telegram" +set "ReleasePath=..\Win32\Deploy" +set "DeployPath=%ReleasePath%\deploy\%AppVersionStrMajor%\%AppVersionStrFull%" +set "SignPath=..\..\TelegramPrivate\Sign.bat" + +if %BetaVersion% neq 0 ( + if exist %ReleasePath%\%BetaKeyFile% ( + echo Beta version key file for version %AppVersion% already exists! + exit /b 1 + ) +) else ( + if exist %ReleasePath%\deploy\%AppVersionStrMajor%\%AppVersionStr%.dev\ ( + echo Deploy folder for version %AppVersionStr%.dev already exists! + exit /b 1 + ) + if exist %ReleasePath%\tupdate%AppVersion% ( + echo Update file for version %AppVersion% already exists! + exit /b 1 + ) +) + +if exist %ReleasePath%\deploy\%AppVersionStrMajor%\%AppVersionStr%\ ( + echo Deploy folder for version %AppVersionStr% already exists! + exit /b 1 +) cd SourceFiles\ -copy telegram.qrc /B+,,/Y +rem copy telegram.qrc /B+,,/Y cd ..\ if %errorlevel% neq 0 goto error cd ..\ MSBuild Telegram.sln /property:Configuration=Deploy -if %errorlevel% neq 0 goto error0 +cd Telegram\ +if %errorlevel% neq 0 goto error echo . -echo Version %AppVersionStrFull% build successfull! Preparing.. +echo Version %AppVersionStrFull% build successfull. Preparing.. echo . set "PATH=%PATH%;C:\Program Files\7-Zip;C:\Program Files (x86)\Inno Setup 5" -cd Win32\Deploy\ -call ..\..\..\TelegramPrivate\Sign.bat Telegram.exe -if %errorlevel% neq 0 goto error1 +call %SignPath% %ReleasePath%\Telegram.exe +if %errorlevel% neq 0 goto error -call ..\..\..\TelegramPrivate\Sign.bat Updater.exe -if %errorlevel% neq 0 goto error1 +call %SignPath% %ReleasePath%\Updater.exe +if %errorlevel% neq 0 goto error -iscc /dMyAppVersion=%AppVersionStrSmall% /dMyAppVersionZero=%AppVersionStr% /dMyAppVersionFull=%AppVersionStrFull% ..\..\Telegram\Setup.iss -if %errorlevel% neq 0 goto error1 +if %BetaVersion% equ 0 ( + cd %ReleasePath% + iscc /dMyAppVersion=%AppVersionStrSmall% /dMyAppVersionZero=%AppVersionStr% /dMyAppVersionFull=%AppVersionStrFull% %HomePath%\Setup.iss + cd %HomePath% + if %errorlevel% neq 0 goto error -call ..\..\..\TelegramPrivate\Sign.bat tsetup.%AppVersionStrFull%.exe -if %errorlevel% neq 0 goto error1 + call %SignPath% %ReleasePath%\tsetup.%AppVersionStrFull%.exe + if %errorlevel% neq 0 goto error +) -call Packer.exe -version %AppVersion% -path Telegram.exe -path Updater.exe %DevParam% -if %errorlevel% neq 0 goto error1 +cd %ReleasePath% +call Packer.exe -version %VersionForPacker% -path Telegram.exe -path Updater.exe %DevParam% +cd %HomePath% +if %errorlevel% neq 0 goto error -if not exist deploy mkdir deploy -if not exist deploy\%AppVersionStrMajor% mkdir deploy\%AppVersionStrMajor% -mkdir deploy\%AppVersionStrMajor%\%AppVersionStrFull% -mkdir deploy\%AppVersionStrMajor%\%AppVersionStrFull%\Telegram -if %errorlevel% neq 0 goto error1 +if %BetaVersion% neq 0 ( + if not exist %ReleasePath%\%BetaKeyFile% ( + echo Beta version key file not found! + exit /b 1 + ) -move Telegram.exe deploy\%AppVersionStrMajor%\%AppVersionStrFull%\Telegram\ -move Updater.exe deploy\%AppVersionStrMajor%\%AppVersionStrFull%\ -move Telegram.pdb deploy\%AppVersionStrMajor%\%AppVersionStrFull%\ -move Updater.pdb deploy\%AppVersionStrMajor%\%AppVersionStrFull%\ -move tsetup.%AppVersionStrFull%.exe deploy\%AppVersionStrMajor%\%AppVersionStrFull%\ -move tupdate%AppVersion% deploy\%AppVersionStrMajor%\%AppVersionStrFull%\ -if %errorlevel% neq 0 goto error1 + FOR /F "tokens=1* delims= " %%i in (%ReleasePath%\%BetaKeyFile%) do set "BetaSignature=%%i" +) +if %errorlevel% neq 0 goto error -cd deploy\%AppVersionStrMajor%\%AppVersionStrFull%\ -7z a -mx9 tportable.%AppVersionStrFull%.zip Telegram\ -if %errorlevel% neq 0 goto error2 +if %BetaVersion% neq 0 ( + set "UpdateFile=%UpdateFile%_%BetaSignature%" + set "PortableFile=tbeta%BetaVersion%_%BetaSignature%.zip" +) + +if not exist %ReleasePath%\deploy mkdir %ReleasePath%\deploy +if not exist %ReleasePath%\deploy\%AppVersionStrMajor% mkdir %ReleasePath%\deploy\%AppVersionStrMajor% +mkdir %DeployPath% +mkdir %DeployPath%\Telegram +if %errorlevel% neq 0 goto error + +move %ReleasePath%\Telegram.exe %DeployPath%\Telegram\ +move %ReleasePath%\Updater.exe %DeployPath%\ +move %ReleasePath%\Telegram.pdb %DeployPath%\ +move %ReleasePath%\Updater.pdb %DeployPath%\ +if %BetaVersion% equ 0 ( + move %ReleasePath%\%SetupFile% %DeployPath%\ +) else ( + move %ReleasePath%\%BetaKeyFile% %DeployPath%\ +) +move %ReleasePath%\%UpdateFile% %DeployPath%\ +if %errorlevel% neq 0 goto error + +cd %DeployPath%\ +7z a -mx9 %PortableFile% Telegram\ +cd ..\..\..\%HomePath%\ +if %errorlevel% neq 0 goto error echo . echo Version %AppVersionStrFull% is ready for deploy! echo . -if not exist tupdate%AppVersion% goto error2 -if not exist tportable.%AppVersionStrFull%.zip goto error2 -if not exist tsetup.%AppVersionStrFull%.exe goto error2 -if not exist Telegram.pdb goto error2 -if not exist Updater.exe goto error2 -if not exist Updater.pdb goto error2 -if not exist Z:\TBuild\tother\tsetup\%AppVersionStrMajor% mkdir Z:\TBuild\tother\tsetup\%AppVersionStrMajor% -if not exist Z:\TBuild\tother\tsetup\%AppVersionStrMajor%\%AppVersionStrFull% mkdir Z:\TBuild\tother\tsetup\%AppVersionStrMajor%\%AppVersionStrFull% +set "FinalReleasePath=Z:\TBuild\tother\tsetup" +set "FinalDeployPath=%FinalReleasePath%\%AppVersionStrMajor%\%AppVersionStrFull%" -xcopy tupdate%AppVersion% Z:\TBuild\tother\tsetup\%AppVersionStrMajor%\%AppVersionStrFull%\ -xcopy tportable.%AppVersionStrFull%.zip Z:\TBuild\tother\tsetup\%AppVersionStrMajor%\%AppVersionStrFull%\ -xcopy tsetup.%AppVersionStrFull%.exe Z:\TBuild\tother\tsetup\%AppVersionStrMajor%\%AppVersionStrFull%\ -xcopy Telegram.pdb Z:\TBuild\tother\tsetup\%AppVersionStrMajor%\%AppVersionStrFull%\ -xcopy Updater.exe Z:\TBuild\tother\tsetup\%AppVersionStrMajor%\%AppVersionStrFull%\ -xcopy Updater.pdb Z:\TBuild\tother\tsetup\%AppVersionStrMajor%\%AppVersionStrFull%\ +if not exist %DeployPath%\%UpdateFile% goto error +if not exist %DeployPath%\%PortableFile% goto error +if %BetaVersion% equ 0 ( + if not exist %DeployPath%\%SetupFile% goto error +) +if not exist %DeployPath%\Telegram.pdb goto error +if not exist %DeployPath%\Updater.exe goto error +if not exist %DeployPath%\Updater.pdb goto error +if not exist %FinalReleasePath%\%AppVersionStrMajor% mkdir %FinalReleasePath%\%AppVersionStrMajor% +if not exist %FinalDeployPath% mkdir %FinalDeployPath% + +xcopy %DeployPath%\%UpdateFile% %FinalDeployPath%\ +xcopy %DeployPath%\%PortableFile% %FinalDeployPath%\ +if %BetaVersion% equ 0 ( + xcopy %DeployPath%\%SetupFile% %FinalDeployPath%\ +) else ( + xcopy %DeployPath%\%BetaKeyFile% %FinalDeployPath%\ +) +xcopy %DeployPath%\Telegram.pdb %FinalDeployPath%\ +xcopy %DeployPath%\Updater.exe %FinalDeployPath%\ +xcopy %DeployPath%\Updater.pdb %FinalDeployPath%\ echo Version %AppVersionStrFull% is ready! -cd ..\..\..\..\..\Telegram\ goto eof -:error2 -cd ..\..\..\ -:error1 -cd ..\..\ -:error0 -cd Telegram\ -goto error - -:error_exist1 -echo Deploy folder for version %AppVersionStr% already exists! -exit /b 1 - -:error_exist2 -echo Deploy folder for version %AppVersionStr%.dev already exists! -exit /b 1 - -:error_exist3 -echo Update file for version %AppVersion% already exists! -exit /b 1 - :error echo ERROR occured! -exit /b %errorlevel% +if %errorlevel% neq 0 exit /b %errorlevel% +exit /b 1 :eof diff --git a/Telegram/Build.sh b/Telegram/Build.sh index cc3c0ad54..3aa9b88f6 100755 --- a/Telegram/Build.sh +++ b/Telegram/Build.sh @@ -5,9 +5,16 @@ while IFS='' read -r line || [[ -n "$line" ]]; do eval $1="$2" done < Version -AppVersionStrFull="$AppVersionStr" -DevParam='' -if [ "$DevChannel" != "0" ]; then +VersionForPacker="$AppVersion" +if [ "$BetaVersion" != "0" ]; then + AppVersion="$BetaVersion" + AppVersionStrFull="${AppVersionStr}_${BetaVersion}" + DevParam="-beta $BetaVersion" + BetaKeyFile="tbeta_${AppVersion}_key" +elif [ "$DevChannel" == "0" ]; then + AppVersionStrFull="$AppVersionStr" + DevParam='' +else AppVersionStrFull="$AppVersionStr.dev" DevParam='-dev' fi @@ -22,12 +29,12 @@ while IFS='' read -r line || [[ -n "$line" ]]; do done < Target echo "" +HomePath="./../../Telegram" if [ "$BuildTarget" == "linux" ]; then echo "Building version $AppVersionStrFull for Linux 64bit.." UpdateFile="tlinuxupd$AppVersion" SetupFile="tsetup.$AppVersionStrFull.tar.xz" WorkPath="./../Linux" - HomePath="./../../Telegram" FixScript="$HomePath/FixMake.sh" ReleasePath="./../Linux/Release" elif [ "$BuildTarget" == "linux32" ]; then @@ -35,7 +42,6 @@ elif [ "$BuildTarget" == "linux32" ]; then UpdateFile="tlinux32upd$AppVersion" SetupFile="tsetup32.$AppVersionStrFull.tar.xz" WorkPath="./../Linux" - HomePath="./../../Telegram" FixScript="$HomePath/FixMake32.sh" ReleasePath="./../Linux/Release" elif [ "$BuildTarget" == "mac" ]; then @@ -51,6 +57,11 @@ elif [ "$BuildTarget" == "mac32" ]; then ReleasePath="./../Mac/Release" BinaryName="Telegram" elif [ "$BuildTarget" == "macstore" ]; then + if [ "$BetaVersion" != "0" ]; then + echo "Can't build macstore beta version!" + exit 1 + fi + echo "Building version $AppVersionStrFull for Mac App Store.." ReleasePath="./../Mac/Release" BinaryName="Telegram Desktop" @@ -62,19 +73,31 @@ else fi #if [ "$BuildTarget" == "linux" ] || [ "$BuildTarget" == "linux32" ] || [ "$BuildTarget" == "mac" ] || [ "$BuildTarget" == "mac32" ] || [ "$BuildTarget" == "macstore" ]; then - if [ -d "$ReleasePath/deploy/$AppVersionStrMajor/$AppVersionStr.dev" ]; then - echo "Deploy folder for version $AppVersionStr.dev already exists!" - exit 1 - fi + if [ "$BetaVersion" != "0" ]; then + if [ -f "$ReleasePath/$BetaKeyFile" ]; then + echo "Beta version key file for version $AppVersion already exists!" + exit 1 + fi - if [ -d "$ReleasePath/deploy/$AppVersionStrMajor/$AppVersionStr" ]; then - echo "Deploy folder for version $AppVersionStr already exists!" - exit 1 - fi + if [ -d "$ReleasePath/deploy/$AppVersionStrMajor/$AppVersionStrFull" ]; then + echo "Deploy folder for version $AppVersionStrFull already exists!" + exit 1 + fi + else + if [ -d "$ReleasePath/deploy/$AppVersionStrMajor/$AppVersionStr.dev" ]; then + echo "Deploy folder for version $AppVersionStr.dev already exists!" + exit 1 + fi - if [ -f "$ReleasePath/$UpdateFile" ]; then - echo "Update file for version $AppVersion already exists!" - exit 1 + if [ -f "$ReleasePath/$UpdateFile" ]; then + echo "Update file for version $AppVersion already exists!" + exit 1 + fi + + if [ -d "$ReleasePath/deploy/$AppVersionStrMajor/$AppVersionStr" ]; then + echo "Deploy folder for version $AppVersionStr already exists!" + exit 1 + fi fi DeployPath="$ReleasePath/deploy/$AppVersionStrMajor/$AppVersionStrFull" @@ -87,14 +110,14 @@ if [ "$BuildTarget" == "linux" ] || [ "$BuildTarget" == "linux32" ]; then make echo "Updater build complete!" cd "$HomePath" - + mkdir -p "$WorkPath/ReleaseIntermediate" cd "$WorkPath/ReleaseIntermediate" /usr/local/Qt-5.5.1/bin/qmake "$HomePath/Telegram.pro" eval "$FixScript" make echo "Telegram build complete!" - cd "$HomePath" + cd "$HomePath" if [ ! -f "$ReleasePath/Telegram" ]; then echo "Telegram not found!" exit 1 @@ -106,9 +129,23 @@ if [ "$BuildTarget" == "linux" ] || [ "$BuildTarget" == "linux32" ]; then fi echo "Preparing version $AppVersionStrFull, executing Packer.." - cd $ReleasePath && ./Packer -path Telegram -path Updater -version $AppVersion $DevParam && cd ./../../Telegram + cd "$ReleasePath" && "./Packer" -path Telegram -path Updater -version $VersionForPacker $DevParam && cd "$HomePath" echo "Packer done!" + if [ "$BetaVersion" != "0" ]; then + if [ ! -f "$ReleasePath/$BetaKeyFile" ]; then + echo "Beta version key file not found!" + exit 1 + fi + + while IFS='' read -r line || [[ -n "$line" ]]; do + BetaSignature="$line" + done < "$ReleasePath/$BetaKeyFile" + + UpdateFile="${UpdateFile}_${BetaSignature}" + SetupFile="tbeta${BetaVersion}_${BetaSignature}.tar.xz" + fi + if [ ! -d "$ReleasePath/deploy" ]; then mkdir "$ReleasePath/deploy" fi @@ -120,15 +157,18 @@ if [ "$BuildTarget" == "linux" ] || [ "$BuildTarget" == "linux32" ]; then echo "Copying Telegram, Updater and $UpdateFile to deploy/$AppVersionStrMajor/$AppVersionStrFull.."; mkdir "$DeployPath" mkdir "$DeployPath/Telegram" - mv $ReleasePath/Telegram $DeployPath/Telegram/ - mv $ReleasePath/Updater $DeployPath/Telegram/ - mv $ReleasePath/$UpdateFile $DeployPath/ - cd $DeployPath && tar -cJvf $SetupFile Telegram/ && cd ./../../../../../Telegram + mv "$ReleasePath/Telegram" "$DeployPath/Telegram/" + mv "$ReleasePath/Updater" "$DeployPath/Telegram/" + mv "$ReleasePath/$UpdateFile" "$DeployPath/" + if [ "$BetaVersion" != "0" ]; then + mv "$ReleasePath/$BetaKeyFile" "$DeployPath/" + fi + cd "$DeployPath" && tar -cJvf "$SetupFile" "Telegram/" && cd "./../../../$HomePath" fi if [ "$BuildTarget" == "mac" ] || [ "$BuildTarget" == "mac32" ] || [ "$BuildTarget" == "macstore" ]; then - touch ./SourceFiles/telegram.qrc + touch "./SourceFiles/telegram.qrc" xcodebuild -project Telegram.xcodeproj -alltargets -configuration Release build if [ ! -d "$ReleasePath/$BinaryName.app" ]; then @@ -176,14 +216,31 @@ if [ "$BuildTarget" == "mac" ] || [ "$BuildTarget" == "mac32" ] || [ "$BuildTarg fi if [ "$BuildTarget" == "mac" ] || [ "$BuildTarget" == "mac32" ]; then - cd $ReleasePath - temppath=`hdiutil attach -readwrite tsetup.dmg | awk -F "\t" 'END {print $3}'` - cp -R "./$BinaryName.app" "$temppath/" - bless --folder "$temppath/" --openfolder "$temppath/" - hdiutil detach "$temppath" - hdiutil convert tsetup.dmg -format UDZO -imagekey zlib-level=9 -ov -o $SetupFile - cd ./../../Telegram - cd $ReleasePath && ./Packer.app/Contents/MacOS/Packer -path "$BinaryName.app" -version $AppVersion $DevParam && cd ./../../Telegram + if [ "$BetaVersion" == "0" ]; then + cd "$ReleasePath" + temppath=`hdiutil attach -readwrite tsetup.dmg | awk -F "\t" 'END {print $3}'` + cp -R "./$BinaryName.app" "$temppath/" + bless --folder "$temppath/" --openfolder "$temppath/" + hdiutil detach "$temppath" + hdiutil convert tsetup.dmg -format UDZO -imagekey zlib-level=9 -ov -o "$SetupFile" + cd "./../../Telegram" + fi + cd "$ReleasePath" && "./Packer.app/Contents/MacOS/Packer" -path "$BinaryName.app" -version $VersionForPacker $DevParam && cd "$HomePath" + echo "Packer done!" + + if [ "$BetaVersion" != "0" ]; then + if [ ! -f "$ReleasePath/$BetaKeyFile" ]; then + echo "Beta version key file not found!" + exit 1 + fi + + while IFS='' read -r line || [[ -n "$line" ]]; do + BetaSignature="$line" + done < "$ReleasePath/$BetaKeyFile" + + UpdateFile="${UpdateFile}_${BetaSignature}" + SetupFile="tbeta${BetaVersion}_${BetaSignature}.zip" + fi fi if [ ! -d "$ReleasePath/deploy" ]; then @@ -198,13 +255,17 @@ if [ "$BuildTarget" == "mac" ] || [ "$BuildTarget" == "mac32" ] || [ "$BuildTarg echo "Copying $BinaryName.app and $UpdateFile to deploy/$AppVersionStrMajor/$AppVersionStr.."; mkdir "$DeployPath" mkdir "$DeployPath/Telegram" - cp -r "$ReleasePath/$BinaryName.app" $DeployPath/Telegram/ - mv "$ReleasePath/$BinaryName.app.dSYM" $DeployPath/ + cp -r "$ReleasePath/$BinaryName.app" "$DeployPath/Telegram/" + if [ "$BetaVersion" != "0" ]; then + cd "$DeployPath" && zip -r "$SetupFile" "Telegram" && mv "$SetupFile" "./../../../" && cd "./../../../$HomePath" + mv "$ReleasePath/$BetaKeyFile" "$DeployPath/" + fi + mv "$ReleasePath/$BinaryName.app.dSYM" "$DeployPath/" rm "$ReleasePath/$BinaryName.app/Contents/MacOS/$BinaryName" rm "$ReleasePath/$BinaryName.app/Contents/Frameworks/Updater" rm -rf "$ReleasePath/$BinaryName.app/Contents/_CodeSignature" - mv $ReleasePath/$UpdateFile $DeployPath/ - mv $ReleasePath/$SetupFile $DeployPath/ + mv "$ReleasePath/$UpdateFile" "$DeployPath/" + mv "$ReleasePath/$SetupFile" "$DeployPath/" if [ "$BuildTarget" == "mac32" ]; then ReleaseToPath="./../../../TBuild/tother/tmac32" @@ -217,16 +278,19 @@ if [ "$BuildTarget" == "mac" ] || [ "$BuildTarget" == "mac32" ] || [ "$BuildTarg mkdir "$DeployToPath" fi - cp -v $DeployPath/$UpdateFile $DeployToPath/ - cp -v $DeployPath/$SetupFile $DeployToPath/ - cp -rv $DeployPath/$BinaryName.app.dSYM $DeployToPath/ + cp -v "$DeployPath/$UpdateFile" "$DeployToPath/" + cp -v "$DeployPath/$SetupFile" "$DeployToPath/" + cp -rv "$DeployPath/$BinaryName.app.dSYM" "$DeployToPath/" + if [ "$BetaVersion" != "0" ]; then + cp -v "$DeployPath/$BetaKeyFile" "$DeployToPath/" + fi fi elif [ "$BuildTarget" == "macstore" ]; then echo "Copying $BinaryName.app to deploy/$AppVersionStrMajor/$AppVersionStr.."; mkdir "$DeployPath" - cp -r "$ReleasePath/$BinaryName.app" $DeployPath/ - mv "$ReleasePath/$BinaryName.pkg" $DeployPath/ - mv "$ReleasePath/$BinaryName.app.dSYM" $DeployPath/ + cp -r "$ReleasePath/$BinaryName.app" "$DeployPath/" + mv "$ReleasePath/$BinaryName.pkg" "$DeployPath/" + mv "$ReleasePath/$BinaryName.app.dSYM" "$DeployPath/" rm "$ReleasePath/$BinaryName.app/Contents/MacOS/$BinaryName" rm -rf "$ReleasePath/$BinaryName.app/Contents/_CodeSignature" diff --git a/Telegram/Deploy.sh b/Telegram/Deploy.sh index 427434bf1..058cbf09d 100755 --- a/Telegram/Deploy.sh +++ b/Telegram/Deploy.sh @@ -1,19 +1,27 @@ set -e +DeployTarget="$1" + while IFS='' read -r line || [[ -n "$line" ]]; do set $line eval $1="$2" done < Version -AppVersionStrFull="$AppVersionStr" -DevParam='' -if [ "$DevChannel" != "0" ]; then +if [ "$BetaVersion" != "0" ]; then + AppVersion="$BetaVersion" + AppVersionStrFull="${AppVersionStr}_${BetaVersion}" + DevParam="-beta $BetaVersion" + BetaKeyFile="tbeta_${AppVersion}_key" +elif [ "$DevChannel" == "0" ]; then + AppVersionStrFull="$AppVersionStr" + DevParam='' +else AppVersionStrFull="$AppVersionStr.dev" DevParam='-dev' fi if [ ! -f "Target" ]; then - echo "Build target not found!" + echo "Deploy target not found!" exit 1 fi @@ -35,7 +43,24 @@ elif [ "$BuildTarget" == "linux32" ]; then ReleasePath="./../Linux/Release" RemoteFolder="tlinux32" elif [ "$BuildTarget" == "mac" ]; then - echo "Deploying three versions of $AppVersionStrFull: for Windows, OS X 10.6 and 10.7 and OS X 10.8+.." + DeployMac="0" + DeployMac32="0" + DeployWin="0" + if [ "$DeployTarget" == "mac" ]; then + DeployMac="1" + echo "Deploying version $AppVersionStrFull for OS X 10.8+.." + elif [ "$DeployTarget" == "mac32" ]; then + DeployMac32="1" + echo "Deploying version $AppVersionStrFull for OS X 10.6 and 10.7.." + elif [ "$DeployTarget" == "win" ]; then + DeployWin="1" + echo "Deploying version $AppVersionStrFull for Windows.." + else + DeployMac="1" + DeployMac32="1" + DeployWin="1" + echo "Deploying three versions of $AppVersionStrFull: for Windows, OS X 10.6 and 10.7 and OS X 10.8+.." + fi UpdateFile="tmacupd$AppVersion" SetupFile="tsetup.$AppVersionStrFull.dmg" ReleasePath="./../Mac/Release" @@ -51,6 +76,8 @@ elif [ "$BuildTarget" == "mac" ]; then WinRemoteFolder="tsetup" DropboxPath="./../../../Dropbox/Telegram/deploy/$AppVersionStrMajor" DropboxDeployPath="$DropboxPath/$AppVersionStrFull" + DropboxSetupFile="$SetupFile" + DropboxMac32SetupFile="$Mac32SetupFile" elif [ "$BuildTarget" == "mac32" ] || [ "$BuildTarget" = "macstore" ]; then echo "No need to deploy this target." exit @@ -61,69 +88,137 @@ fi DeployPath="$ReleasePath/deploy/$AppVersionStrMajor/$AppVersionStrFull" -#if [ "$BuildTarget" == "linux" ] || [ "$BuildTarget" == "linux32" ] || [ "$BuildTarget" == "mac" ] || [ "$BuildTarget" == "mac32" ] || [ "$BuildTarget" == "macstore" ]; then - - if [ ! -f "$DeployPath/$UpdateFile" ]; then - echo "$UpdateFile not found!"; - exit 1 +if [ "$BetaVersion" != "0" ]; then + if [ "$DeployTarget" == "win" ]; then + BetaFilePath="$WinDeployPath/$BetaKeyFile" + elif [ "$DeployTarget" == "mac32" ]; then + BetaFilePath="$Mac32DeployPath/$BetaKeyFile" + else + BetaFilePath="$DeployPath/$BetaKeyFile" + fi + if [ ! -f "$BetaFilePath" ]; then + echo "Beta key file for $AppVersionStrFull not found :(" + exit 1 fi - if [ ! -f "$DeployPath/$SetupFile" ]; then + while IFS='' read -r line || [[ -n "$line" ]]; do + BetaSignature="$line" + done < "$BetaFilePath" + + UpdateFile="${UpdateFile}_${BetaSignature}" + if [ "$BuildTarget" == "linux" ] || [ "$BuildTarget" == "linux32" ]; then + SetupFile="tbeta${BetaVersion}_${BetaSignature}.tar.xz" + elif [ "$BuildTarget" == "mac" ]; then + SetupFile="tbeta${BetaVersion}_${BetaSignature}.zip" + DropboxSetupFile="tbeta${BetaVersion}_${BetaSignature}_mac.zip" + Mac32UpdateFile="${Mac32UpdateFile}_${BetaSignature}" + Mac32SetupFile="tbeta${BetaVersion}_${BetaSignature}.zip" + DropboxMac32SetupFile="tbeta${BetaVersion}_${BetaSignature}_mac32.zip" + WinUpdateFile="${WinUpdateFile}_${BetaSignature}" + WinPortableFile="tbeta${BetaVersion}_${BetaSignature}.zip" + fi +fi + +#if [ "$BuildTarget" == "linux" ] || [ "$BuildTarget" == "linux32" ] || [ "$BuildTarget" == "mac" ] || [ "$BuildTarget" == "mac32" ] || [ "$BuildTarget" == "macstore" ]; then + + if [ "$BuildTarget" != "mac" ] || [ "$DeployMac" == "1" ]; then + if [ ! -f "$DeployPath/$UpdateFile" ]; then + echo "$UpdateFile not found!"; + exit 1 + fi + + if [ ! -f "$DeployPath/$SetupFile" ]; then echo "$SetupFile not found!" exit 1 + fi fi if [ "$BuildTarget" == "mac" ]; then - if [ ! -f "$Mac32DeployPath/$Mac32UpdateFile" ]; then - echo "$Mac32UpdateFile not found!" - exit 1 + if [ "$DeployMac32" == "1" ]; then + if [ ! -f "$Mac32DeployPath/$Mac32UpdateFile" ]; then + echo "$Mac32UpdateFile not found!" + exit 1 + fi + + if [ ! -f "$Mac32DeployPath/$Mac32SetupFile" ]; then + echo "$Mac32SetupFile not found!" + exit 1 + fi fi - if [ ! -f "$Mac32DeployPath/$Mac32SetupFile" ]; then - echo "$Mac32SetupFile not found!" - exit 1 + if [ "$DeployWin" == "1" ]; then + if [ ! -f "$WinDeployPath/$WinUpdateFile" ]; then + echo "$WinUpdateFile not found!" + exit 1 + fi + + if [ "$BetaVersion" == "0" ]; then + if [ ! -f "$WinDeployPath/$WinSetupFile" ]; then + echo "$WinSetupFile not found!" + exit 1 + fi + fi + + if [ ! -f "$WinDeployPath/$WinPortableFile" ]; then + echo "$WinPortableFile not found!" + exit 1 + fi fi - if [ ! -f "$WinDeployPath/$WinUpdateFile" ]; then - echo "$WinUpdateFile not found!" - exit 1 + if [ ! -d "$DropboxPath" ]; then + mkdir "$DropboxPath" fi - if [ ! -f "$WinDeployPath/$WinSetupFile" ]; then - echo "$WinSetupFile not found!" - exit 1 - fi - - if [ ! -f "$WinDeployPath/$WinPortableFile" ]; then - echo "$WinPortableFile not found!" - exit 1 - fi - - if [ ! -d "./../../../Dropbox/Telegram/deploy/$AppVersionStrMajor" ]; then - mkdir "./../../../Dropbox/Telegram/deploy/$AppVersionStrMajor" + if [ ! -d "$DropboxDeployPath" ]; then + mkdir "$DropboxDeployPath" fi fi #fi if [ "$BuildTarget" == "linux" ] || [ "$BuildTarget" == "linux32" ] || [ "$BuildTarget" == "mac" ]; then - scp "$DeployPath/$UpdateFile" "tmaster:tdesktop/www/$RemoteFolder/" - scp "$DeployPath/$SetupFile" "tmaster:tdesktop/www/$RemoteFolder/" - + if [ "$BuildTarget" != "mac" ] || [ "$DeployMac" == "1" ]; then + scp "$DeployPath/$UpdateFile" "tmaster:tdesktop/www/$RemoteFolder/" + scp "$DeployPath/$SetupFile" "tmaster:tdesktop/www/$RemoteFolder/" + fi if [ "$BuildTarget" == "mac" ]; then - scp "$Mac32DeployPath/$Mac32UpdateFile" "tmaster:tdesktop/www/$Mac32RemoteFolder/" - scp "$Mac32DeployPath/$Mac32SetupFile" "tmaster:tdesktop/www/$Mac32RemoteFolder/" - scp "$WinDeployPath/$WinUpdateFile" "tmaster:tdesktop/www/$WinRemoteFolder/" - scp "$WinDeployPath/$WinSetupFile" "tmaster:tdesktop/www/$WinRemoteFolder/" - scp "$WinDeployPath/$WinPortableFile" "tmaster:tdesktop/www/$WinRemoteFolder/" + if [ "$DeployMac32" == "1" ]; then + scp "$Mac32DeployPath/$Mac32UpdateFile" "tmaster:tdesktop/www/$Mac32RemoteFolder/" + scp "$Mac32DeployPath/$Mac32SetupFile" "tmaster:tdesktop/www/$Mac32RemoteFolder/" + fi + if [ "$DeployWin" == "1" ]; then + scp "$WinDeployPath/$WinUpdateFile" "tmaster:tdesktop/www/$WinRemoteFolder/" + if [ "$BetaVersion" == "0" ]; then + scp "$WinDeployPath/$WinSetupFile" "tmaster:tdesktop/www/$WinRemoteFolder/" + fi + scp "$WinDeployPath/$WinPortableFile" "tmaster:tdesktop/www/$WinRemoteFolder/" + fi - mv -v "$WinDeployPath" "$DropboxPath/" - - cp -v "$DeployPath/$UpdateFile" "$DropboxDeployPath/" - cp -v "$DeployPath/$SetupFile" "$DropboxDeployPath/" - cp -rv "$DeployPath/Telegram.app.dSYM" "$DropboxDeployPath/" - cp -v "$Mac32DeployPath/$Mac32UpdateFile" "$DropboxDeployPath/" - cp -v "$Mac32DeployPath/$Mac32SetupFile" "$DropboxDeployPath/" - cp -rv "$DeployPath/Telegram.app.dSYM" "$DropboxDeployPath/Telegram32.app.dSYM" + if [ "$DeployMac" == "1" ]; then + cp -v "$DeployPath/$UpdateFile" "$DropboxDeployPath/" + cp -v "$DeployPath/$SetupFile" "$DropboxDeployPath/$DropboxSetupFile" + if [ -d "$DropboxDeployPath/Telegram.app.dSYM" ]; then + rm -rf "$DropboxDeployPath/Telegram.app.dSYM" + fi + cp -rv "$DeployPath/Telegram.app.dSYM" "$DropboxDeployPath/" + fi + if [ "$DeployMac32" == "1" ]; then + mv -v "$Mac32DeployPath/$Mac32UpdateFile" "$DropboxDeployPath/" + mv -v "$Mac32DeployPath/$Mac32SetupFile" "$DropboxDeployPath/$DropboxMac32SetupFile" + if [ -d "$DropboxDeployPath/Telegram32.app.dSYM" ]; then + rm -rf "$DropboxDeployPath/Telegram32.app.dSYM" + fi + mv -v "$Mac32DeployPath/Telegram.app.dSYM" "$DropboxDeployPath/Telegram32.app.dSYM" + fi + if [ "$DeployWin" == "1" ]; then + mv -v "$WinDeployPath/Telegram.pdb" "$DropboxDeployPath/" + mv -v "$WinDeployPath/Updater.exe" "$DropboxDeployPath/" + mv -v "$WinDeployPath/Updater.pdb" "$DropboxDeployPath/" + mv -v "$WinDeployPath/$WinUpdateFile" "$DropboxDeployPath/" + if [ "$BetaVersion" == "0" ]; then + mv -v "$WinDeployPath/$WinSetupFile" "$DropboxDeployPath/" + fi + mv -v "$WinDeployPath/$WinPortableFile" "$DropboxDeployPath/" + fi fi fi diff --git a/Telegram/Resources/lang.strings b/Telegram/Resources/lang.strings index 874d4203d..fd065b167 100644 --- a/Telegram/Resources/lang.strings +++ b/Telegram/Resources/lang.strings @@ -431,6 +431,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_channel_add_admins" = "New administrator"; "lng_channel_add_members" = "Add members"; "lng_channel_members" = "Members"; +"lng_channel_only_last_shown" = "Only the last {count:_not_used_|# member is|# members are} shown here"; "lng_channel_admins" = "Administrators"; "lng_channel_add_admin" = "Add Administrator"; "lng_channel_admin_sure" = "Add {user} to administrators?"; @@ -564,10 +565,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_emoji_category1" = "People"; "lng_emoji_category2" = "Nature"; "lng_emoji_category3" = "Food & Drink"; -"lng_emoji_category4" = "Celebration"; -"lng_emoji_category5" = "Activity"; -"lng_emoji_category6" = "Travel & Places"; -"lng_emoji_category7" = "Objects & Symbols"; +"lng_emoji_category4" = "Activity"; +"lng_emoji_category5" = "Travel & Places"; +"lng_emoji_category6" = "Objects"; +"lng_emoji_category7" = "Symbols & Flags"; "lng_switch_stickers" = "Stickers"; "lng_switch_emoji" = "Emoji"; @@ -581,6 +582,13 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_stickers_not_found" = "Sticker pack not found."; "lng_stickers_copied" = "Sticker pack link copied to clipboard."; "lng_stickers_default_set" = "Great Minds"; +"lng_stickers_you_have" = "Manage and reorder sticker packs"; +"lng_stickers_packs" = "Sticker Packs"; +"lng_stickers_reorder" = "Click and drag to reorder sticker packs"; +"lng_stickers_remove" = "Delete"; +"lng_stickers_return" = "Undo"; +"lng_stickers_restore" = "Restore"; +"lng_stickers_count" = "{count:Loading..|# sticker|# stickers}"; "lng_in_dlg_photo" = "Photo"; "lng_in_dlg_video" = "Video"; @@ -658,6 +666,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_duration_and_size" = "{duration}, {size}"; "lng_choose_images" = "Choose images"; +"lng_context_view_profile" = "View profile"; +"lng_context_view_group" = "View group info"; +"lng_context_view_channel" = "View channel info"; + "lng_context_open_link" = "Open Link"; "lng_context_copy_link" = "Copy Link"; "lng_context_open_email" = "Write to this address"; @@ -789,7 +801,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_new_version_wrap" = "Telegram Desktop was updated to version {version}\n\n{changes}\n\nFull version history is available here:\n{link}"; "lng_new_version_minor" = "— Bug fixes and other minor improvements"; -"lng_new_version_text" = "— Groups can now have multiple administrators with the ability to edit the name and logo, and add and remove members\n— Groups that have reached their capacity of 200 users can be upgraded to supergroups of up to 1,000 members\n\nMore about admins and supergroups:\n{link}"; +"lng_new_version_text" = "— Sticker management: manually rearrange your sticker packs, pack order is now synced across all your devices\n— Click and hold on a sticker to preview it before sending\n— New context menu for chats in chats list\n— Support for all existing emoji"; "lng_menu_insert_unicode" = "Insert Unicode control character"; diff --git a/Telegram/Resources/style.txt b/Telegram/Resources/style.txt index 30ff2fc18..81fc1f8e1 100644 --- a/Telegram/Resources/style.txt +++ b/Telegram/Resources/style.txt @@ -323,7 +323,7 @@ titleBG: #6389a8; titleColor: #0f8dcc;//rgb(20, 136, 210); titleHeight: 39px; titleIconPos: point(7px, 7px); -titleIconImg: sprite(160px, 100px, 26px, 26px); +titleIconImg: sprite(161px, 100px, 26px, 26px); titleFont: font(17px); titlePos: point(44px, 29px); titleMenuOffset: 36px; @@ -1424,12 +1424,13 @@ contactsNewItemIconPosition: point(29px, 19px); contactsNewItemTop: 18px; contactsNewItemFg: #4b82af; contactsAboutBg: #f7f7f7; +contactsAboutShadow: #0000001F; contactsAdminCheckbox: Checkbox(defaultCheckbox) { font: semiboldFont; textBg: #f7f7f7; textPosition: point(34px, 1px); } -contactsAboutHeight: 80px; +contactsAboutHeight: 42px; contactsAboutTop: 9px; contactsScroll: flatScroll(boxScroll) { deltab: 0px; @@ -1794,6 +1795,10 @@ stickersScroll: flatScroll(boxScroll) { deltat: 23px; deltab: 9px; } +stickersReorderPadding: margins(0px, 12px, 0px, 12px); +stickersReorderFg: #777; +stickersRowDisabledOpacity: 0.4; +stickersRowDuration: 200; emojiScroll: flatScroll(solidScroll) { deltat: 48px; @@ -1806,14 +1811,15 @@ emojiNatureOver: sprite(42px, 196px, 21px, 22px); emojiNatureActive: sprite(245px, 286px, 21px, 22px); emojiFoodOver: sprite(63px, 196px, 21px, 22px); emojiFoodActive: sprite(266px, 286px, 21px, 22px); -emojiCelebrationOver: sprite(84px, 196px, 21px, 22px); -emojiCelebrationActive: sprite(287px, 286px, 21px, 22px); emojiActivityOver: sprite(126px, 196px, 21px, 22px); emojiActivityActive: sprite(287px, 264px, 21px, 22px); emojiTravelOver: sprite(105px, 196px, 21px, 22px); emojiTravelActive: sprite(308px, 286px, 21px, 22px); emojiObjectsOver: sprite(147px, 196px, 21px, 22px); emojiObjectsActive: sprite(308px, 264px, 21px, 22px); +emojiSymbolsOver: sprite(84px, 196px, 21px, 22px); +emojiSymbolsActive: sprite(287px, 286px, 21px, 22px); +stickersSettings: sprite(140px, 124px, 21px, 22px); emojiPanCategories: #f7f7f7; @@ -1867,14 +1873,6 @@ rbEmojiFood: flatCheckbox(rbEmoji) { disImageRect: emojiFoodOver; chkDisImageRect: emojiFoodActive; } -rbEmojiCelebration: flatCheckbox(rbEmoji) { - imageRect: emojiCelebrationOver; - chkImageRect: emojiCelebrationActive; - overImageRect: emojiCelebrationOver; - chkOverImageRect: emojiCelebrationActive; - disImageRect: emojiCelebrationOver; - chkDisImageRect: emojiCelebrationActive; -} rbEmojiActivity: flatCheckbox(rbEmoji) { imageRect: emojiActivityOver; chkImageRect: emojiActivityActive; @@ -1899,6 +1897,14 @@ rbEmojiObjects: flatCheckbox(rbEmoji) { disImageRect: emojiObjectsOver; chkDisImageRect: emojiObjectsActive; } +rbEmojiSymbols: flatCheckbox(rbEmoji) { + imageRect: emojiSymbolsOver; + chkImageRect: emojiSymbolsActive; + overImageRect: emojiSymbolsOver; + chkOverImageRect: emojiSymbolsActive; + disImageRect: emojiSymbolsOver; + chkDisImageRect: emojiSymbolsActive; +} emojiPanPadding: 12px; emojiPanSize: size(45px, 41px); emojiPanWidth: 345px; @@ -1934,12 +1940,15 @@ stickerIconSelColor: #58b2ed; stickerIconLeft: sprite(342px, 72px, 40px, 1px); stickerIconRight: sprite(342px, 73px, 40px, 1px); stickerIconMove: 400; +stickerPreviewDuration: 150; +stickerPreviewBg: #FFFFFFB0; +stickerPreviewMin: 0.1; -verifiedCheckProfile: sprite(285px, 240px, 22px, 22px); -verifiedCheckProfilePos: point(9px, 4px); -verifiedCheck: sprite(285px, 221px, 19px, 19px); -verifiedCheckInv: sprite(304px, 221px, 19px, 19px); -verifiedCheckPos: point(5px, 0px); +verifiedCheckProfile: sprite(285px, 235px, 18px, 18px); +verifiedCheckProfilePos: point(7px, 6px); +verifiedCheck: sprite(285px, 221px, 14px, 14px); +verifiedCheckInv: sprite(299px, 221px, 14px, 14px); +verifiedCheckPos: point(4px, 2px); botKbDuration: 200; botKbBg: #f7f7f7; diff --git a/Telegram/SourceFiles/_other/genemoji.cpp b/Telegram/SourceFiles/_other/genemoji.cpp index a258bd530..5e6fce4bf 100644 --- a/Telegram/SourceFiles/_other/genemoji.cpp +++ b/Telegram/SourceFiles/_other/genemoji.cpp @@ -113,25 +113,52 @@ uint64 emojiColors[] = { 0xD83CDFFFLLU, }; uint64 emojiColored[] = { + 0xD83DDE4CLLU, + 0xD83DDC4FLLU, + 0xD83DDC4BLLU, + 0xD83DDC4DLLU, + 0xD83DDC4ELLU, + 0xD83DDC4ALLU, + 0x270ALLU, + 0x270CLLU, + 0xD83DDC4CLLU, + 0x270BLLU, + 0xD83DDC50LLU, + 0xD83DDCAALLU, + 0xD83DDE4FLLU, + 0x261DLLU, + 0xD83DDC46LLU, + 0xD83DDC47LLU, + 0xD83DDC48LLU, + 0xD83DDC49LLU, + 0xD83DDD95LLU, + 0xD83DDD90LLU, + 0xD83EDD18LLU, + 0xD83DDD96LLU, + 0x270DLLU, + 0xD83DDC85LLU, + 0xD83DDC42LLU, + 0xD83DDC43LLU, 0xD83DDC76LLU, 0xD83DDC66LLU, 0xD83DDC67LLU, 0xD83DDC68LLU, 0xD83DDC69LLU, - - 0xD83DDC70LLU, 0xD83DDC71LLU, - 0xD83DDC72LLU, - 0xD83DDC73LLU, 0xD83DDC74LLU, 0xD83DDC75LLU, + 0xD83DDC72LLU, + 0xD83DDC73LLU, 0xD83DDC6ELLU, 0xD83DDC77LLU, - 0xD83DDC78LLU, 0xD83DDC82LLU, - 0xD83DDC7CLLU, 0xD83CDF85LLU, - + 0xD83DDC7CLLU, + 0xD83DDC78LLU, + 0xD83DDC70LLU, + 0xD83DDEB6LLU, + 0xD83CDFC3LLU, + 0xD83DDC83LLU, 0xD83DDE47LLU, 0xD83DDC81LLU, 0xD83DDE45LLU, @@ -139,41 +166,14 @@ uint64 emojiColored[] = { 0xD83DDE4BLLU, 0xD83DDE4ELLU, 0xD83DDE4DLLU, - 0xD83DDC86LLU, 0xD83DDC87LLU, - - 0xD83DDE4CLLU, - 0xD83DDC4FLLU, - 0xD83DDC42LLU, - - 0xD83DDC43LLU, - - 0xD83DDC85LLU, - 0xD83DDC4BLLU, - 0xD83DDC4DLLU, - 0xD83DDC4ELLU, - 0x261DLLU, - 0xD83DDC46LLU, - 0xD83DDC47LLU, - 0xD83DDC48LLU, - 0xD83DDC49LLU, - 0xD83DDC4CLLU, - 0x270CLLU, - 0xD83DDC4ALLU, - 0x270ALLU, - 0x270BLLU, - 0xD83DDCAALLU, - 0xD83DDC50LLU, - 0xD83DDE4FLLU, - - 0xD83CDFC3LLU, - 0xD83DDEB6LLU, - 0xD83DDC83LLU, + 0xD83DDC86LLU, 0xD83DDEA3LLU, 0xD83CDFCALLU, 0xD83CDFC4LLU, 0xD83DDEC0LLU, - + 0x26F9LLU, + 0xD83CDFCBLLU, 0xD83DDEB4LLU, 0xD83DDEB5LLU, 0xD83CDFC7LLU, @@ -199,6 +199,8 @@ const char *emojiSequences[] = { // getter of sequence emojis is done manually "\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f\x92\x8b\xe2\x80\x8d\xf0\x9f\x91\xa9", "\xf0\x9f\x91\xa8\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f\x92\x8b\xe2\x80\x8d\xf0\x9f\x91\xa8", + + "\xf0\x9f\x91\x81\xe2\x80\x8d\xf0\x9f\x97\xa8", }; typedef QMap EmojisData; @@ -206,6 +208,7 @@ EmojisData emojisData; uint64 emojiCategory1[] = { 0xD83DDE00LLU, + 0xD83DDE2CLLU, 0xD83DDE01LLU, 0xD83DDE02LLU, 0xD83DDE03LLU, @@ -213,73 +216,157 @@ uint64 emojiCategory1[] = { 0xD83DDE05LLU, 0xD83DDE06LLU, 0xD83DDE07LLU, - 0xD83DDE08LLU, - 0xD83DDC7FLLU, 0xD83DDE09LLU, 0xD83DDE0ALLU, + 0xD83DDE42LLU, + 0xD83DDE43LLU, 0x263ALLU, 0xD83DDE0BLLU, 0xD83DDE0CLLU, 0xD83DDE0DLLU, + 0xD83DDE18LLU, + 0xD83DDE17LLU, + 0xD83DDE19LLU, + 0xD83DDE1ALLU, + 0xD83DDE1CLLU, + 0xD83DDE1DLLU, + 0xD83DDE1BLLU, + 0xD83EDD11LLU, + 0xD83EDD13LLU, 0xD83DDE0ELLU, + 0xD83EDD17LLU, 0xD83DDE0FLLU, + 0xD83DDE36LLU, 0xD83DDE10LLU, 0xD83DDE11LLU, 0xD83DDE12LLU, - 0xD83DDE13LLU, - 0xD83DDE14LLU, - 0xD83DDE15LLU, - 0xD83DDE16LLU, - 0xD83DDE17LLU, - 0xD83DDE18LLU, - 0xD83DDE19LLU, - 0xD83DDE1ALLU, - 0xD83DDE1BLLU, - 0xD83DDE1CLLU, - 0xD83DDE1DLLU, + 0xD83DDE44LLU, + 0xD83EDD14LLU, + 0xD83DDE33LLU, 0xD83DDE1ELLU, 0xD83DDE1FLLU, 0xD83DDE20LLU, 0xD83DDE21LLU, - 0xD83DDE22LLU, + 0xD83DDE14LLU, + 0xD83DDE15LLU, + 0xD83DDE41LLU, + 0x2639LLU, 0xD83DDE23LLU, + 0xD83DDE16LLU, + 0xD83DDE2BLLU, + 0xD83DDE29LLU, 0xD83DDE24LLU, - 0xD83DDE25LLU, + 0xD83DDE2ELLU, + 0xD83DDE31LLU, + 0xD83DDE28LLU, + 0xD83DDE30LLU, + 0xD83DDE2FLLU, 0xD83DDE26LLU, 0xD83DDE27LLU, - 0xD83DDE28LLU, - 0xD83DDE29LLU, + 0xD83DDE22LLU, + 0xD83DDE25LLU, 0xD83DDE2ALLU, - 0xD83DDE2BLLU, - 0xD83DDE2CLLU, + 0xD83DDE13LLU, 0xD83DDE2DLLU, - 0xD83DDE2ELLU, - 0xD83DDE2FLLU, - 0xD83DDE30LLU, - 0xD83DDE31LLU, - 0xD83DDE32LLU, - 0xD83DDE33LLU, - 0xD83DDE34LLU, 0xD83DDE35LLU, - 0xD83DDE36LLU, + 0xD83DDE32LLU, + 0xD83EDD10LLU, 0xD83DDE37LLU, + 0xD83EDD12LLU, + 0xD83EDD15LLU, + 0xD83DDE34LLU, + 0xD83DDCA4LLU, + 0xD83DDCA9LLU, + 0xD83DDE08LLU, + 0xD83DDC7FLLU, + 0xD83DDC79LLU, + 0xD83DDC7ALLU, + 0xD83DDC80LLU, + 0xD83DDC7BLLU, + 0xD83DDC7DLLU, + 0xD83EDD16LLU, + 0xD83DDE3ALLU, 0xD83DDE38LLU, 0xD83DDE39LLU, - 0xD83DDE3ALLU, 0xD83DDE3BLLU, 0xD83DDE3CLLU, 0xD83DDE3DLLU, - 0xD83DDE3ELLU, - 0xD83DDE3FLLU, 0xD83DDE40LLU, - 0xD83DDC63LLU, + 0xD83DDE3FLLU, + 0xD83DDE3ELLU, + 0xD83DDE4CLLU, + 0xD83DDC4FLLU, + 0xD83DDC4BLLU, + 0xD83DDC4DLLU, + 0xD83DDC4ELLU, + 0xD83DDC4ALLU, + 0x270ALLU, + 0x270CLLU, + 0xD83DDC4CLLU, + 0x270BLLU, + 0xD83DDC50LLU, + 0xD83DDCAALLU, + 0xD83DDE4FLLU, + 0x261DLLU, + 0xD83DDC46LLU, + 0xD83DDC47LLU, + 0xD83DDC48LLU, + 0xD83DDC49LLU, + 0xD83DDD95LLU, + 0xD83DDD90LLU, + 0xD83EDD18LLU, + 0xD83DDD96LLU, + 0x270DLLU, + 0xD83DDC85LLU, + 0xD83DDC44LLU, + 0xD83DDC45LLU, + 0xD83DDC42LLU, + 0xD83DDC43LLU, + 0xD83DDC41LLU, + 0xD83DDC40LLU, 0xD83DDC64LLU, 0xD83DDC65LLU, + 0xD83DDDE3LLU, 0xD83DDC76LLU, 0xD83DDC66LLU, 0xD83DDC67LLU, 0xD83DDC68LLU, 0xD83DDC69LLU, + 0xD83DDC71LLU, + 0xD83DDC74LLU, + 0xD83DDC75LLU, + 0xD83DDC72LLU, + 0xD83DDC73LLU, + 0xD83DDC6ELLU, + 0xD83DDC77LLU, + 0xD83DDC82LLU, + 0xD83DDD75LLU, + 0xD83CDF85LLU, + 0xD83DDC7CLLU, + 0xD83DDC78LLU, + 0xD83DDC70LLU, + 0xD83DDEB6LLU, + 0xD83CDFC3LLU, + 0xD83DDC83LLU, + 0xD83DDC6FLLU, + 0xD83DDC6BLLU, + 0xD83DDC6CLLU, + 0xD83DDC6DLLU, + 0xD83DDE47LLU, + 0xD83DDC81LLU, + 0xD83DDE45LLU, + 0xD83DDE46LLU, + 0xD83DDE4BLLU, + 0xD83DDE4ELLU, + 0xD83DDE4DLLU, + 0xD83DDC87LLU, + 0xD83DDC86LLU, + 0xD83DDC91LLU, + 0xFFFF000ELLU,//0xD83DDC69LLU,0x200DLLU,0x2764LLU,0xFE0FLLU,0x200DLLU,0xD83DDC69LLU, + 0xFFFF000FLLU,//0xD83DDC68LLU,0x200DLLU,0x2764LLU,0xFE0FLLU,0x200DLLU,0xD83DDC68LLU, + 0xD83DDC8FLLU, + 0xFFFF0010LLU,//0xD83DDC69LLU,0x200DLLU,0x2764LLU,0xFE0FLLU,0x200DLLU,0xD83DDC8BLLU,0x200DLLU,0xD83DDC69LLU, + 0xFFFF0011LLU,//0xD83DDC68LLU,0x200DLLU,0x2764LLU,0xFE0FLLU,0x200DLLU,0xD83DDC8BLLU,0x200DLLU,0xD83DDC68LLU, 0xD83DDC6ALLU, 0xFFFF0000LLU,//0xD83DDC68LLU,0x200DLLU,0xD83DDC69LLU,0x200DLLU,0xD83DDC67LLU, 0xFFFF0001LLU,//0xD83DDC68LLU,0x200DLLU,0xD83DDC69LLU,0x200DLLU,0xD83DDC67LLU,0x200DLLU,0xD83DDC66LLU, @@ -295,288 +382,624 @@ uint64 emojiCategory1[] = { 0xFFFF000BLLU,//0xD83DDC68LLU,0x200DLLU,0xD83DDC68LLU,0x200DLLU,0xD83DDC67LLU,0x200DLLU,0xD83DDC66LLU, 0xFFFF000CLLU,//0xD83DDC68LLU,0x200DLLU,0xD83DDC68LLU,0x200DLLU,0xD83DDC66LLU,0x200DLLU,0xD83DDC66LLU, 0xFFFF000DLLU,//0xD83DDC68LLU,0x200DLLU,0xD83DDC68LLU,0x200DLLU,0xD83DDC67LLU,0x200DLLU,0xD83DDC67LLU, - 0xD83DDC6BLLU, - 0xD83DDC6CLLU, - 0xD83DDC6DLLU, - 0xD83DDC6FLLU, - 0xD83DDC70LLU, - 0xD83DDC71LLU, - 0xD83DDC72LLU, - 0xD83DDC73LLU, - 0xD83DDC74LLU, - 0xD83DDC75LLU, - 0xD83DDC6ELLU, - 0xD83DDC77LLU, - 0xD83DDC78LLU, - 0xD83DDC82LLU, - 0xD83DDC7CLLU, - 0xD83CDF85LLU, - 0xD83DDC7BLLU, - 0xD83DDC79LLU, - 0xD83DDC7ALLU, - 0xD83DDCA9LLU, - 0xD83DDC80LLU, - 0xD83DDC7DLLU, - 0xD83DDC7ELLU, - 0xD83DDE47LLU, - 0xD83DDC81LLU, - 0xD83DDE45LLU, - 0xD83DDE46LLU, - 0xD83DDE4BLLU, - 0xD83DDE4ELLU, - 0xD83DDE4DLLU, - 0xD83DDC86LLU, - 0xD83DDC87LLU, - 0xD83DDC91LLU, - 0xFFFF000ELLU,//0xD83DDC69LLU,0x200DLLU,0x2764LLU,0xFE0FLLU,0x200DLLU,0xD83DDC69LLU, - 0xFFFF000FLLU,//0xD83DDC68LLU,0x200DLLU,0x2764LLU,0xFE0FLLU,0x200DLLU,0xD83DDC68LLU, - 0xD83DDC8FLLU, - 0xFFFF0010LLU,//0xD83DDC69LLU,0x200DLLU,0x2764LLU,0xFE0FLLU,0x200DLLU,0xD83DDC8BLLU,0x200DLLU,0xD83DDC69LLU, - 0xFFFF0011LLU,//0xD83DDC68LLU,0x200DLLU,0x2764LLU,0xFE0FLLU,0x200DLLU,0xD83DDC8BLLU,0x200DLLU,0xD83DDC68LLU, - 0xD83DDE4CLLU, - 0xD83DDC4FLLU, - 0xD83DDC42LLU, - 0xD83DDC40LLU, - 0xD83DDC43LLU, - 0xD83DDC44LLU, + 0xD83DDC5ALLU, + 0xD83DDC55LLU, + 0xD83DDC56LLU, + 0xD83DDC54LLU, + 0xD83DDC57LLU, + 0xD83DDC59LLU, + 0xD83DDC58LLU, + 0xD83DDC84LLU, 0xD83DDC8BLLU, - 0xD83DDC45LLU, - 0xD83DDC85LLU, - 0xD83DDC4BLLU, - 0xD83DDC4DLLU, - 0xD83DDC4ELLU, - 0x261DLLU, - 0xD83DDC46LLU, - 0xD83DDC47LLU, - 0xD83DDC48LLU, - 0xD83DDC49LLU, - 0xD83DDC4CLLU, - 0x270CLLU, - 0xD83DDC4ALLU, - 0x270ALLU, - 0x270BLLU, - 0xD83DDCAALLU, - 0xD83DDC50LLU, - 0xD83DDE4FLLU, + 0xD83DDC63LLU, + 0xD83DDC60LLU, + 0xD83DDC61LLU, + 0xD83DDC62LLU, + 0xD83DDC5ELLU, + 0xD83DDC5FLLU, + 0xD83DDC52LLU, + 0xD83CDFA9LLU, + 0xD83CDF93LLU, + 0xD83DDC51LLU, + 0x26D1LLU, + 0xD83CDF92LLU, + 0xD83DDC5DLLU, + 0xD83DDC5BLLU, + 0xD83DDC5CLLU, + 0xD83DDCBCLLU, + 0xD83DDC53LLU, + 0xD83DDD76LLU, + 0xD83DDC8DLLU, + 0xD83CDF02LLU, }; uint64 emojiCategory2[] = { - 0xD83CDF31LLU, - 0xD83CDF32LLU, - 0xD83CDF33LLU, - 0xD83CDF34LLU, - 0xD83CDF35LLU, - 0xD83CDF37LLU, - 0xD83CDF38LLU, - 0xD83CDF39LLU, - 0xD83CDF3ALLU, - 0xD83CDF3BLLU, - 0xD83CDF3CLLU, - 0xD83DDC90LLU, - 0xD83CDF3ELLU, - 0xD83CDF3FLLU, - 0xD83CDF40LLU, - 0xD83CDF41LLU, - 0xD83CDF42LLU, - 0xD83CDF43LLU, - 0xD83CDF44LLU, - 0xD83CDF30LLU, - 0xD83DDC00LLU, - 0xD83DDC01LLU, + 0xD83DDC36LLU, + 0xD83DDC31LLU, 0xD83DDC2DLLU, 0xD83DDC39LLU, - 0xD83DDC02LLU, - 0xD83DDC03LLU, - 0xD83DDC04LLU, - 0xD83DDC2ELLU, - 0xD83DDC05LLU, - 0xD83DDC06LLU, - 0xD83DDC2FLLU, - 0xD83DDC07LLU, 0xD83DDC30LLU, - 0xD83DDC08LLU, - 0xD83DDC31LLU, - 0xD83DDC0ELLU, - 0xD83DDC34LLU, - 0xD83DDC0FLLU, - 0xD83DDC11LLU, - 0xD83DDC10LLU, - 0xD83DDC13LLU, - 0xD83DDC14LLU, - 0xD83DDC24LLU, - 0xD83DDC23LLU, - 0xD83DDC25LLU, - 0xD83DDC26LLU, - 0xD83DDC27LLU, - 0xD83DDC18LLU, - 0xD83DDC2ALLU, - 0xD83DDC2BLLU, - 0xD83DDC17LLU, - 0xD83DDC16LLU, + 0xD83DDC3BLLU, + 0xD83DDC3CLLU, + 0xD83DDC28LLU, + 0xD83DDC2FLLU, + 0xD83EDD81LLU, + 0xD83DDC2ELLU, 0xD83DDC37LLU, 0xD83DDC3DLLU, - 0xD83DDC15LLU, - 0xD83DDC29LLU, - 0xD83DDC36LLU, - 0xD83DDC3ALLU, - 0xD83DDC3BLLU, - 0xD83DDC28LLU, - 0xD83DDC3CLLU, + 0xD83DDC38LLU, + 0xD83DDC19LLU, 0xD83DDC35LLU, 0xD83DDE48LLU, 0xD83DDE49LLU, 0xD83DDE4ALLU, 0xD83DDC12LLU, - 0xD83DDC09LLU, - 0xD83DDC32LLU, - 0xD83DDC0ALLU, + 0xD83DDC14LLU, + 0xD83DDC27LLU, + 0xD83DDC26LLU, + 0xD83DDC24LLU, + 0xD83DDC23LLU, + 0xD83DDC25LLU, + 0xD83DDC3ALLU, + 0xD83DDC17LLU, + 0xD83DDC34LLU, + 0xD83EDD84LLU, + 0xD83DDC1DLLU, + 0xD83DDC1BLLU, + 0xD83DDC0CLLU, + 0xD83DDC1ELLU, + 0xD83DDC1CLLU, + 0xD83DDD77LLU, + 0xD83EDD82LLU, + 0xD83EDD80LLU, 0xD83DDC0DLLU, 0xD83DDC22LLU, - 0xD83DDC38LLU, - 0xD83DDC0BLLU, - 0xD83DDC33LLU, - 0xD83DDC2CLLU, - 0xD83DDC19LLU, - 0xD83DDC1FLLU, 0xD83DDC20LLU, + 0xD83DDC1FLLU, 0xD83DDC21LLU, - 0xD83DDC1ALLU, - 0xD83DDC0CLLU, - 0xD83DDC1BLLU, - 0xD83DDC1CLLU, - 0xD83DDC1DLLU, - 0xD83DDC1ELLU, + 0xD83DDC2CLLU, + 0xD83DDC33LLU, + 0xD83DDC0BLLU, + 0xD83DDC0ALLU, + 0xD83DDC06LLU, + 0xD83DDC05LLU, + 0xD83DDC03LLU, + 0xD83DDC02LLU, + 0xD83DDC04LLU, + 0xD83DDC2ALLU, + 0xD83DDC2BLLU, + 0xD83DDC18LLU, + 0xD83DDC10LLU, + 0xD83DDC0FLLU, + 0xD83DDC11LLU, + 0xD83DDC0ELLU, + 0xD83DDC16LLU, + 0xD83DDC00LLU, + 0xD83DDC01LLU, + 0xD83DDC13LLU, + 0xD83EDD83LLU, + 0xD83DDD4ALLU, + 0xD83DDC15LLU, + 0xD83DDC29LLU, + 0xD83DDC08LLU, + 0xD83DDC07LLU, + 0xD83DDC3FLLU, 0xD83DDC3ELLU, - 0x26A1LLU, - 0xD83DDD25LLU, - 0xD83CDF19LLU, - 0x2600LLU, - 0x26C5LLU, - 0x2601LLU, - 0xD83DDCA7LLU, - 0xD83DDCA6LLU, - 0x2614LLU, - 0xD83DDCA8LLU, - 0x2744LLU, - 0xD83CDF1FLLU, - 0x2B50LLU, - 0xD83CDF20LLU, - 0xD83CDF04LLU, - 0xD83CDF05LLU, - 0xD83CDF08LLU, - 0xD83CDF0ALLU, - 0xD83CDF0BLLU, - 0xD83CDF0CLLU, - 0xD83DDDFBLLU, - 0xD83DDDFELLU, - 0xD83CDF10LLU, - 0xD83CDF0DLLU, + 0xD83DDC09LLU, + 0xD83DDC32LLU, + 0xD83CDF35LLU, + 0xD83CDF84LLU, + 0xD83CDF32LLU, + 0xD83CDF33LLU, + 0xD83CDF34LLU, + 0xD83CDF31LLU, + 0xD83CDF3FLLU, + 0x2618LLU, + 0xD83CDF40LLU, + 0xD83CDF8DLLU, + 0xD83CDF8BLLU, + 0xD83CDF43LLU, + 0xD83CDF42LLU, + 0xD83CDF41LLU, + 0xD83CDF3ELLU, + 0xD83CDF3ALLU, + 0xD83CDF3BLLU, + 0xD83CDF39LLU, + 0xD83CDF37LLU, + 0xD83CDF3CLLU, + 0xD83CDF38LLU, + 0xD83DDC90LLU, + 0xD83CDF44LLU, + 0xD83CDF30LLU, + 0xD83CDF83LLU, + 0xD83DDC1ALLU, + 0xD83DDD78LLU, 0xD83CDF0ELLU, + 0xD83CDF0DLLU, 0xD83CDF0FLLU, - 0xD83CDF11LLU, - 0xD83CDF12LLU, - 0xD83CDF13LLU, - 0xD83CDF14LLU, 0xD83CDF15LLU, 0xD83CDF16LLU, 0xD83CDF17LLU, 0xD83CDF18LLU, + 0xD83CDF11LLU, + 0xD83CDF12LLU, + 0xD83CDF13LLU, + 0xD83CDF14LLU, 0xD83CDF1ALLU, 0xD83CDF1DLLU, 0xD83CDF1BLLU, 0xD83CDF1CLLU, 0xD83CDF1ELLU, + 0xD83CDF19LLU, + 0x2B50LLU, + 0xD83CDF1FLLU, + 0xD83DDCABLLU, + 0x2728LLU, + 0x2604LLU, + 0x2600LLU, + 0xD83CDF24LLU, + 0x26C5LLU, + 0xD83CDF25LLU, + 0xD83CDF26LLU, + 0x2601LLU, + 0xD83CDF27LLU, + 0x26C8LLU, + 0xD83CDF29LLU, + 0x26A1LLU, + 0xD83DDD25LLU, + 0xD83DDCA5LLU, + 0x2744LLU, + 0xD83CDF28LLU, + 0x2603LLU, + 0x26C4LLU, + 0xD83CDF2CLLU, + 0xD83DDCA8LLU, + 0xD83CDF2ALLU, + 0xD83CDF2BLLU, + 0x2602LLU, + 0x2614LLU, + 0xD83DDCA7LLU, + 0xD83DDCA6LLU, + 0xD83CDF0ALLU, }; uint64 emojiCategory3[] = { - 0xD83CDF45LLU, - 0xD83CDF46LLU, - 0xD83CDF3DLLU, - 0xD83CDF60LLU, - 0xD83CDF47LLU, - 0xD83CDF48LLU, - 0xD83CDF49LLU, + 0xD83CDF4FLLU, + 0xD83CDF4ELLU, + 0xD83CDF50LLU, 0xD83CDF4ALLU, 0xD83CDF4BLLU, 0xD83CDF4CLLU, - 0xD83CDF4DLLU, - 0xD83CDF4ELLU, - 0xD83CDF4FLLU, - 0xD83CDF50LLU, - 0xD83CDF51LLU, - 0xD83CDF52LLU, + 0xD83CDF49LLU, + 0xD83CDF47LLU, 0xD83CDF53LLU, - 0xD83CDF54LLU, - 0xD83CDF55LLU, - 0xD83CDF56LLU, + 0xD83CDF48LLU, + 0xD83CDF52LLU, + 0xD83CDF51LLU, + 0xD83CDF4DLLU, + 0xD83CDF45LLU, + 0xD83CDF46LLU, + 0xD83CDF36LLU, + 0xD83CDF3DLLU, + 0xD83CDF60LLU, + 0xD83CDF6FLLU, + 0xD83CDF5ELLU, + 0xD83EDDC0LLU, 0xD83CDF57LLU, - 0xD83CDF58LLU, + 0xD83CDF56LLU, + 0xD83CDF64LLU, + 0xD83CDF73LLU, + 0xD83CDF54LLU, + 0xD83CDF5FLLU, + 0xD83CDF2DLLU, + 0xD83CDF55LLU, + 0xD83CDF5DLLU, + 0xD83CDF2ELLU, + 0xD83CDF2FLLU, + 0xD83CDF5CLLU, + 0xD83CDF72LLU, + 0xD83CDF65LLU, + 0xD83CDF63LLU, + 0xD83CDF71LLU, + 0xD83CDF5BLLU, 0xD83CDF59LLU, 0xD83CDF5ALLU, - 0xD83CDF5BLLU, - 0xD83CDF5CLLU, - 0xD83CDF5DLLU, - 0xD83CDF5ELLU, - 0xD83CDF5FLLU, - 0xD83CDF61LLU, + 0xD83CDF58LLU, 0xD83CDF62LLU, - 0xD83CDF63LLU, - 0xD83CDF64LLU, - 0xD83CDF65LLU, - 0xD83CDF66LLU, + 0xD83CDF61LLU, 0xD83CDF67LLU, 0xD83CDF68LLU, - 0xD83CDF69LLU, - 0xD83CDF6ALLU, - 0xD83CDF6BLLU, + 0xD83CDF66LLU, + 0xD83CDF70LLU, + 0xD83CDF82LLU, + 0xD83CDF6ELLU, 0xD83CDF6CLLU, 0xD83CDF6DLLU, - 0xD83CDF6ELLU, - 0xD83CDF6FLLU, - 0xD83CDF70LLU, - 0xD83CDF71LLU, - 0xD83CDF72LLU, - 0xD83CDF73LLU, - 0xD83CDF74LLU, - 0xD83CDF75LLU, - 0x2615LLU, - 0xD83CDF76LLU, + 0xD83CDF6BLLU, + 0xD83CDF7FLLU, + 0xD83CDF69LLU, + 0xD83CDF6ALLU, + 0xD83CDF7ALLU, + 0xD83CDF7BLLU, 0xD83CDF77LLU, 0xD83CDF78LLU, 0xD83CDF79LLU, - 0xD83CDF7ALLU, - 0xD83CDF7BLLU, + 0xD83CDF7ELLU, + 0xD83CDF76LLU, + 0xD83CDF75LLU, + 0x2615LLU, 0xD83CDF7CLLU, + 0xD83CDF74LLU, + 0xD83CDF7DLLU, }; uint64 emojiCategory4[] = { + 0x26BDLLU, + 0xD83CDFC0LLU, + 0xD83CDFC8LLU, + 0x26BELLU, + 0xD83CDFBELLU, + 0xD83CDFD0LLU, + 0xD83CDFC9LLU, + 0xD83CDFB1LLU, + 0x26F3LLU, + 0xD83CDFCCLLU, + 0xD83CDFD3LLU, + 0xD83CDFF8LLU, + 0xD83CDFD2LLU, + 0xD83CDFD1LLU, + 0xD83CDFCFLLU, + 0xD83CDFBFLLU, + 0x26F7LLU, + 0xD83CDFC2LLU, + 0x26F8LLU, + 0xD83CDFF9LLU, + 0xD83CDFA3LLU, + 0xD83DDEA3LLU, + 0xD83CDFCALLU, + 0xD83CDFC4LLU, + 0xD83DDEC0LLU, + 0x26F9LLU, + 0xD83CDFCBLLU, + 0xD83DDEB4LLU, + 0xD83DDEB5LLU, + 0xD83CDFC7LLU, + 0xD83DDD74LLU, + 0xD83CDFC6LLU, + 0xD83CDFBDLLU, + 0xD83CDFC5LLU, + 0xD83CDF96LLU, + 0xD83CDF97LLU, + 0xD83CDFF5LLU, + 0xD83CDFABLLU, + 0xD83CDF9FLLU, + 0xD83CDFADLLU, + 0xD83CDFA8LLU, + 0xD83CDFAALLU, + 0xD83CDFA4LLU, + 0xD83CDFA7LLU, + 0xD83CDFBCLLU, + 0xD83CDFB9LLU, + 0xD83CDFB7LLU, + 0xD83CDFBALLU, + 0xD83CDFB8LLU, + 0xD83CDFBBLLU, + 0xD83CDFACLLU, + 0xD83CDFAELLU, + 0xD83DDC7ELLU, + 0xD83CDFAFLLU, + 0xD83CDFB2LLU, + 0xD83CDFB0LLU, + 0xD83CDFB3LLU, +}; + +uint64 emojiCategory5[] = { + 0xD83DDE97LLU, + 0xD83DDE95LLU, + 0xD83DDE99LLU, + 0xD83DDE8CLLU, + 0xD83DDE8ELLU, + 0xD83CDFCELLU, + 0xD83DDE93LLU, + 0xD83DDE91LLU, + 0xD83DDE92LLU, + 0xD83DDE90LLU, + 0xD83DDE9ALLU, + 0xD83DDE9BLLU, + 0xD83DDE9CLLU, + 0xD83CDFCDLLU, + 0xD83DDEB2LLU, + 0xD83DDEA8LLU, + 0xD83DDE94LLU, + 0xD83DDE8DLLU, + 0xD83DDE98LLU, + 0xD83DDE96LLU, + 0xD83DDEA1LLU, + 0xD83DDEA0LLU, + 0xD83DDE9FLLU, + 0xD83DDE83LLU, + 0xD83DDE8BLLU, + 0xD83DDE9DLLU, + 0xD83DDE84LLU, + 0xD83DDE85LLU, + 0xD83DDE88LLU, + 0xD83DDE9ELLU, + 0xD83DDE82LLU, + 0xD83DDE86LLU, + 0xD83DDE87LLU, + 0xD83DDE8ALLU, + 0xD83DDE89LLU, + 0xD83DDE81LLU, + 0xD83DDEE9LLU, + 0x2708LLU, + 0xD83DDEEBLLU, + 0xD83DDEECLLU, + 0x26F5LLU, + 0xD83DDEE5LLU, + 0xD83DDEA4LLU, + 0x26F4LLU, + 0xD83DDEF3LLU, + 0xD83DDE80LLU, + 0xD83DDEF0LLU, + 0xD83DDCBALLU, + 0x2693LLU, + 0xD83DDEA7LLU, + 0x26FDLLU, + 0xD83DDE8FLLU, + 0xD83DDEA6LLU, + 0xD83DDEA5LLU, + 0xD83CDFC1LLU, + 0xD83DDEA2LLU, + 0xD83CDFA1LLU, + 0xD83CDFA2LLU, + 0xD83CDFA0LLU, + 0xD83CDFD7LLU, + 0xD83CDF01LLU, + 0xD83DDDFCLLU, + 0xD83CDFEDLLU, + 0x26F2LLU, + 0xD83CDF91LLU, + 0x26F0LLU, + 0xD83CDFD4LLU, + 0xD83DDDFBLLU, + 0xD83CDF0BLLU, + 0xD83DDDFELLU, + 0xD83CDFD5LLU, + 0x26FALLU, + 0xD83CDFDELLU, + 0xD83DDEE3LLU, + 0xD83DDEE4LLU, + 0xD83CDF05LLU, + 0xD83CDF04LLU, + 0xD83CDFDCLLU, + 0xD83CDFD6LLU, + 0xD83CDFDDLLU, + 0xD83CDF07LLU, + 0xD83CDF06LLU, + 0xD83CDFD9LLU, + 0xD83CDF03LLU, + 0xD83CDF09LLU, + 0xD83CDF0CLLU, + 0xD83CDF20LLU, + 0xD83CDF87LLU, + 0xD83CDF86LLU, + 0xD83CDF08LLU, + 0xD83CDFD8LLU, + 0xD83CDFF0LLU, + 0xD83CDFEFLLU, + 0xD83CDFDFLLU, + 0xD83DDDFDLLU, + 0xD83CDFE0LLU, + 0xD83CDFE1LLU, + 0xD83CDFDALLU, + 0xD83CDFE2LLU, + 0xD83CDFECLLU, + 0xD83CDFE3LLU, + 0xD83CDFE4LLU, + 0xD83CDFE5LLU, + 0xD83CDFE6LLU, + 0xD83CDFE8LLU, + 0xD83CDFEALLU, + 0xD83CDFEBLLU, + 0xD83CDFE9LLU, + 0xD83DDC92LLU, + 0xD83CDFDBLLU, + 0x26EALLU, + 0xD83DDD4CLLU, + 0xD83DDD4DLLU, + 0xD83DDD4BLLU, + 0x26E9LLU, +}; + +uint64 emojiCategory6[] = { + 0x231ALLU, + 0xD83DDCF1LLU, + 0xD83DDCF2LLU, + 0xD83DDCBBLLU, + 0x2328LLU, + 0xD83DDDA5LLU, + 0xD83DDDA8LLU, + 0xD83DDDB1LLU, + 0xD83DDDB2LLU, + 0xD83DDD79LLU, + 0xD83DDDDCLLU, + 0xD83DDCBDLLU, + 0xD83DDCBELLU, + 0xD83DDCBFLLU, + 0xD83DDCC0LLU, + 0xD83DDCFCLLU, + 0xD83DDCF7LLU, + 0xD83DDCF8LLU, + 0xD83DDCF9LLU, + 0xD83CDFA5LLU, + 0xD83DDCFDLLU, + 0xD83CDF9ELLU, + 0xD83DDCDELLU, + 0x260ELLU, + 0xD83DDCDFLLU, + 0xD83DDCE0LLU, + 0xD83DDCFALLU, + 0xD83DDCFBLLU, + 0xD83CDF99LLU, + 0xD83CDF9ALLU, + 0xD83CDF9BLLU, + 0x23F1LLU, + 0x23F2LLU, + 0x23F0LLU, + 0xD83DDD70LLU, + 0x23F3LLU, + 0x231BLLU, + 0xD83DDCE1LLU, + 0xD83DDD0BLLU, + 0xD83DDD0CLLU, + 0xD83DDCA1LLU, + 0xD83DDD26LLU, + 0xD83DDD6FLLU, + 0xD83DDDD1LLU, + 0xD83DDEE2LLU, + 0xD83DDCB8LLU, + 0xD83DDCB5LLU, + 0xD83DDCB4LLU, + 0xD83DDCB6LLU, + 0xD83DDCB7LLU, + 0xD83DDCB0LLU, + 0xD83DDCB3LLU, + 0xD83DDC8ELLU, + 0x2696LLU, + 0xD83DDD27LLU, + 0xD83DDD28LLU, + 0x2692LLU, + 0xD83DDEE0LLU, + 0x26CFLLU, + 0xD83DDD29LLU, + 0x2699LLU, + 0x26D3LLU, + 0xD83DDD2BLLU, + 0xD83DDCA3LLU, + 0xD83DDD2ALLU, + 0xD83DDDE1LLU, + 0x2694LLU, + 0xD83DDEE1LLU, + 0xD83DDEACLLU, + 0x2620LLU, + 0x26B0LLU, + 0x26B1LLU, + 0xD83CDFFALLU, + 0xD83DDD2ELLU, + 0xD83DDCFFLLU, + 0xD83DDC88LLU, + 0x2697LLU, + 0xD83DDD2DLLU, + 0xD83DDD2CLLU, + 0xD83DDD73LLU, + 0xD83DDC8ALLU, + 0xD83DDC89LLU, + 0xD83CDF21LLU, + 0xD83CDFF7LLU, + 0xD83DDD16LLU, + 0xD83DDEBDLLU, + 0xD83DDEBFLLU, + 0xD83DDEC1LLU, + 0xD83DDD11LLU, + 0xD83DDDDDLLU, + 0xD83DDECBLLU, + 0xD83DDECCLLU, + 0xD83DDECFLLU, + 0xD83DDEAALLU, + 0xD83DDECELLU, + 0xD83DDDBCLLU, + 0xD83DDDFALLU, + 0x26F1LLU, + 0xD83DDDFFLLU, + 0xD83DDECDLLU, + 0xD83CDF88LLU, + 0xD83CDF8FLLU, 0xD83CDF80LLU, 0xD83CDF81LLU, - 0xD83CDF82LLU, - 0xD83CDF83LLU, - 0xD83CDF84LLU, - 0xD83CDF8BLLU, - 0xD83CDF8DLLU, - 0xD83CDF91LLU, - 0xD83CDF86LLU, - 0xD83CDF87LLU, - 0xD83CDF89LLU, 0xD83CDF8ALLU, - 0xD83CDF88LLU, - 0xD83DDCABLLU, - 0x2728LLU, - 0xD83DDCA5LLU, - 0xD83CDF93LLU, - 0xD83DDC51LLU, + 0xD83CDF89LLU, 0xD83CDF8ELLU, - 0xD83CDF8FLLU, 0xD83CDF90LLU, 0xD83CDF8CLLU, 0xD83CDFEELLU, - 0xD83DDC8DLLU, - 0x2764LLU, - 0xD83DDC94LLU, + 0x2709LLU, + 0xD83DDCE9LLU, + 0xD83DDCE8LLU, + 0xD83DDCE7LLU, 0xD83DDC8CLLU, + 0xD83DDCEELLU, + 0xD83DDCEALLU, + 0xD83DDCEBLLU, + 0xD83DDCECLLU, + 0xD83DDCEDLLU, + 0xD83DDCE6LLU, + 0xD83DDCEFLLU, + 0xD83DDCE5LLU, + 0xD83DDCE4LLU, + 0xD83DDCDCLLU, + 0xD83DDCC3LLU, + 0xD83DDCD1LLU, + 0xD83DDCCALLU, + 0xD83DDCC8LLU, + 0xD83DDCC9LLU, + 0xD83DDCC4LLU, + 0xD83DDCC5LLU, + 0xD83DDCC6LLU, + 0xD83DDDD3LLU, + 0xD83DDCC7LLU, + 0xD83DDDC3LLU, + 0xD83DDDF3LLU, + 0xD83DDDC4LLU, + 0xD83DDCCBLLU, + 0xD83DDDD2LLU, + 0xD83DDCC1LLU, + 0xD83DDCC2LLU, + 0xD83DDDC2LLU, + 0xD83DDDDELLU, + 0xD83DDCF0LLU, + 0xD83DDCD3LLU, + 0xD83DDCD5LLU, + 0xD83DDCD7LLU, + 0xD83DDCD8LLU, + 0xD83DDCD9LLU, + 0xD83DDCD4LLU, + 0xD83DDCD2LLU, + 0xD83DDCDALLU, + 0xD83DDCD6LLU, + 0xD83DDD17LLU, + 0xD83DDCCELLU, + 0xD83DDD87LLU, + 0x2702LLU, + 0xD83DDCD0LLU, + 0xD83DDCCFLLU, + 0xD83DDCCCLLU, + 0xD83DDCCDLLU, + 0xD83DDEA9LLU, + 0xD83CDFF3LLU, + 0xD83CDFF4LLU, + 0xD83DDD10LLU, + 0xD83DDD12LLU, + 0xD83DDD13LLU, + 0xD83DDD0FLLU, + 0xD83DDD8ALLU, + 0xD83DDD8BLLU, + 0x2712LLU, + 0xD83DDCDDLLU, + 0x270FLLU, + 0xD83DDD8DLLU, + 0xD83DDD8CLLU, + 0xD83DDD0DLLU, + 0xD83DDD0ELLU, +}; + +uint64 emojiCategory7[] = { + 0x2764LLU, + 0xD83DDC9BLLU, + 0xD83DDC9ALLU, + 0xD83DDC99LLU, + 0xD83DDC9CLLU, + 0xD83DDC94LLU, + 0x2763LLU, 0xD83DDC95LLU, 0xD83DDC9ELLU, 0xD83DDC93LLU, @@ -585,383 +1008,18 @@ uint64 emojiCategory4[] = { 0xD83DDC98LLU, 0xD83DDC9DLLU, 0xD83DDC9FLLU, - 0xD83DDC9CLLU, - 0xD83DDC9BLLU, - 0xD83DDC9ALLU, - 0xD83DDC99LLU, -}; - -uint64 emojiCategory5[] = { - 0xD83CDFC3LLU, - 0xD83DDEB6LLU, - 0xD83DDC83LLU, - 0xD83DDEA3LLU, - 0xD83CDFCALLU, - 0xD83CDFC4LLU, - 0xD83DDEC0LLU, - 0xD83CDFC2LLU, - 0xD83CDFBFLLU, - 0x26C4LLU, - 0xD83DDEB4LLU, - 0xD83DDEB5LLU, - 0xD83CDFC7LLU, - 0x26FALLU, - 0xD83CDFA3LLU, - 0x26BDLLU, - 0xD83CDFC0LLU, - 0xD83CDFC8LLU, - 0x26BELLU, - 0xD83CDFBELLU, - 0xD83CDFC9LLU, - 0x26F3LLU, - 0xD83CDFC6LLU, - 0xD83CDFBDLLU, - 0xD83CDFC1LLU, - 0xD83CDFB9LLU, - 0xD83CDFB8LLU, - 0xD83CDFBBLLU, - 0xD83CDFB7LLU, - 0xD83CDFBALLU, - 0xD83CDFB5LLU, - 0xD83CDFB6LLU, - 0xD83CDFBCLLU, - 0xD83CDFA7LLU, - 0xD83CDFA4LLU, - 0xD83CDFADLLU, - 0xD83CDFABLLU, - 0xD83CDFA9LLU, - 0xD83CDFAALLU, - 0xD83CDFACLLU, - 0xD83CDFA8LLU, - 0xD83CDFAFLLU, - 0xD83CDFB1LLU, - 0xD83CDFB3LLU, - 0xD83CDFB0LLU, - 0xD83CDFB2LLU, - 0xD83CDFAELLU, - 0xD83CDFB4LLU, - 0xD83CDCCFLLU, - 0xD83CDC04LLU, - 0xD83CDFA0LLU, - 0xD83CDFA1LLU, - 0xD83CDFA2LLU, -}; - -uint64 emojiCategory6[] = { - 0xD83DDE83LLU, - 0xD83DDE9ELLU, - 0xD83DDE82LLU, - 0xD83DDE8BLLU, - 0xD83DDE9DLLU, - 0xD83DDE84LLU, - 0xD83DDE85LLU, - 0xD83DDE86LLU, - 0xD83DDE87LLU, - 0xD83DDE88LLU, - 0xD83DDE89LLU, - 0xD83DDE8ALLU, - 0xD83DDE8CLLU, - 0xD83DDE8DLLU, - 0xD83DDE8ELLU, - 0xD83DDE90LLU, - 0xD83DDE91LLU, - 0xD83DDE92LLU, - 0xD83DDE93LLU, - 0xD83DDE94LLU, - 0xD83DDEA8LLU, - 0xD83DDE95LLU, - 0xD83DDE96LLU, - 0xD83DDE97LLU, - 0xD83DDE98LLU, - 0xD83DDE99LLU, - 0xD83DDE9ALLU, - 0xD83DDE9BLLU, - 0xD83DDE9CLLU, - 0xD83DDEB2LLU, - 0xD83DDE8FLLU, - 0x26FDLLU, - 0xD83DDEA7LLU, - 0xD83DDEA6LLU, - 0xD83DDEA5LLU, - 0xD83DDE80LLU, - 0xD83DDE81LLU, - 0x2708LLU, - 0xD83DDCBALLU, - 0x2693LLU, - 0xD83DDEA2LLU, - 0xD83DDEA4LLU, - 0x26F5LLU, - 0xD83DDEA1LLU, - 0xD83DDEA0LLU, - 0xD83DDE9FLLU, - 0xD83DDEC2LLU, - 0xD83DDEC3LLU, - 0xD83DDEC4LLU, - 0xD83DDEC5LLU, - 0xD83DDCB4LLU, - 0xD83DDCB6LLU, - 0xD83DDCB7LLU, - 0xD83DDCB5LLU, - 0xD83DDDFDLLU, - 0xD83DDDFFLLU, - 0xD83CDF01LLU, - 0xD83DDDFCLLU, - 0x26F2LLU, - 0xD83CDFF0LLU, - 0xD83CDFEFLLU, - 0xD83CDF07LLU, - 0xD83CDF06LLU, - 0xD83CDF03LLU, - 0xD83CDF09LLU, - 0xD83CDFE0LLU, - 0xD83CDFE1LLU, - 0xD83CDFE2LLU, - 0xD83CDFECLLU, - 0xD83CDFEDLLU, - 0xD83CDFE3LLU, - 0xD83CDFE4LLU, - 0xD83CDFE5LLU, - 0xD83CDFE6LLU, - 0xD83CDFE8LLU, - 0xD83CDFE9LLU, - 0xD83DDC92LLU, - 0x26EALLU, - 0xD83CDFEALLU, - 0xD83CDFEBLLU, - 0xD83CDDE6D83CDDFALLU, - 0xD83CDDE6D83CDDF9LLU, - 0xD83CDDE7D83CDDEALLU, - 0xD83CDDE7D83CDDF7LLU, - 0xD83CDDE8D83CDDE6LLU, - 0xD83CDDE8D83CDDF1LLU, - 0xD83CDDE8D83CDDF3LLU, - 0xD83CDDE8D83CDDF4LLU, - 0xD83CDDE9D83CDDF0LLU, - 0xD83CDDEBD83CDDEELLU, - 0xD83CDDEBD83CDDF7LLU, - 0xD83CDDE9D83CDDEALLU, - 0xD83CDDEDD83CDDF0LLU, - 0xD83CDDEED83CDDF3LLU, - 0xD83CDDEED83CDDE9LLU, - 0xD83CDDEED83CDDEALLU, - 0xD83CDDEED83CDDF1LLU, - 0xD83CDDEED83CDDF9LLU, - 0xD83CDDEFD83CDDF5LLU, - 0xD83CDDF0D83CDDF7LLU, - 0xD83CDDF2D83CDDF4LLU, - 0xD83CDDF2D83CDDFELLU, - 0xD83CDDF2D83CDDFDLLU, - 0xD83CDDF3D83CDDF1LLU, - 0xD83CDDF3D83CDDFFLLU, - 0xD83CDDF3D83CDDF4LLU, - 0xD83CDDF5D83CDDEDLLU, - 0xD83CDDF5D83CDDF1LLU, - 0xD83CDDF5D83CDDF9LLU, - 0xD83CDDF5D83CDDF7LLU, - 0xD83CDDF7D83CDDFALLU, - 0xD83CDDF8D83CDDE6LLU, - 0xD83CDDF8D83CDDECLLU, - 0xD83CDDFFD83CDDE6LLU, - 0xD83CDDEAD83CDDF8LLU, - 0xD83CDDF8D83CDDEALLU, - 0xD83CDDE8D83CDDEDLLU, - 0xD83CDDF9D83CDDF7LLU, - 0xD83CDDECD83CDDE7LLU, - 0xD83CDDFAD83CDDF8LLU, - 0xD83CDDE6D83CDDEALLU, - 0xD83CDDFBD83CDDF3LLU, -}; - -uint64 emojiCategory7[] = { - 0x231ALLU, - 0xD83DDCF1LLU, - 0xD83DDCF2LLU, - 0xD83DDCBBLLU, - 0x23F0LLU, - 0x23F3LLU, - 0x231BLLU, - 0xD83DDCF7LLU, - 0xD83DDCF9LLU, - 0xD83CDFA5LLU, - 0xD83DDCFALLU, - 0xD83DDCFBLLU, - 0xD83DDCDFLLU, - 0xD83DDCDELLU, - 0x260ELLU, - 0xD83DDCE0LLU, - 0xD83DDCBDLLU, - 0xD83DDCBELLU, - 0xD83DDCBFLLU, - 0xD83DDCC0LLU, - 0xD83DDCFCLLU, - 0xD83DDD0BLLU, - 0xD83DDD0CLLU, - 0xD83DDCA1LLU, - 0xD83DDD26LLU, - 0xD83DDCE1LLU, - 0xD83DDCB3LLU, - 0xD83DDCB8LLU, - 0xD83DDCB0LLU, - 0xD83DDC8ELLU, - 0xD83CDF02LLU, - 0xD83DDC5DLLU, - 0xD83DDC5BLLU, - 0xD83DDC5CLLU, - 0xD83DDCBCLLU, - 0xD83CDF92LLU, - 0xD83DDC84LLU, - 0xD83DDC53LLU, - 0xD83DDC52LLU, - 0xD83DDC61LLU, - 0xD83DDC60LLU, - 0xD83DDC62LLU, - 0xD83DDC5ELLU, - 0xD83DDC5FLLU, - 0xD83DDC59LLU, - 0xD83DDC57LLU, - 0xD83DDC58LLU, - 0xD83DDC5ALLU, - 0xD83DDC55LLU, - 0xD83DDC54LLU, - 0xD83DDC56LLU, - 0xD83DDEAALLU, - 0xD83DDEBFLLU, - 0xD83DDEC1LLU, - 0xD83DDEBDLLU, - 0xD83DDC88LLU, - 0xD83DDC89LLU, - 0xD83DDC8ALLU, - 0xD83DDD2CLLU, - 0xD83DDD2DLLU, - 0xD83DDD2ELLU, - 0xD83DDD27LLU, - 0xD83DDD2ALLU, - 0xD83DDD29LLU, - 0xD83DDD28LLU, - 0xD83DDCA3LLU, - 0xD83DDEACLLU, - 0xD83DDD2BLLU, - 0xD83DDD16LLU, - 0xD83DDCF0LLU, - 0xD83DDD11LLU, - 0x2709LLU, - 0xD83DDCE9LLU, - 0xD83DDCE8LLU, - 0xD83DDCE7LLU, - 0xD83DDCE5LLU, - 0xD83DDCE4LLU, - 0xD83DDCE6LLU, - 0xD83DDCEFLLU, - 0xD83DDCEELLU, - 0xD83DDCEALLU, - 0xD83DDCEBLLU, - 0xD83DDCECLLU, - 0xD83DDCEDLLU, - 0xD83DDCC4LLU, - 0xD83DDCC3LLU, - 0xD83DDCD1LLU, - 0xD83DDCC8LLU, - 0xD83DDCC9LLU, - 0xD83DDCCALLU, - 0xD83DDCC5LLU, - 0xD83DDCC6LLU, - 0xD83DDD05LLU, - 0xD83DDD06LLU, - 0xD83DDCDCLLU, - 0xD83DDCCBLLU, - 0xD83DDCD6LLU, - 0xD83DDCD3LLU, - 0xD83DDCD4LLU, - 0xD83DDCD2LLU, - 0xD83DDCD5LLU, - 0xD83DDCD7LLU, - 0xD83DDCD8LLU, - 0xD83DDCD9LLU, - 0xD83DDCDALLU, - 0xD83DDCC7LLU, - 0xD83DDD17LLU, - 0xD83DDCCELLU, - 0xD83DDCCCLLU, - 0x2702LLU, - 0xD83DDCD0LLU, - 0xD83DDCCDLLU, - 0xD83DDCCFLLU, - 0xD83DDEA9LLU, - 0xD83DDCC1LLU, - 0xD83DDCC2LLU, - 0x2712LLU, - 0x270FLLU, - 0xD83DDCDDLLU, - 0xD83DDD0FLLU, - 0xD83DDD10LLU, - 0xD83DDD12LLU, - 0xD83DDD13LLU, - 0xD83DDCE3LLU, - 0xD83DDCE2LLU, - 0xD83DDD08LLU, - 0xD83DDD09LLU, - 0xD83DDD0ALLU, - 0xD83DDD07LLU, - 0xD83DDCA4LLU, - 0xD83DDD14LLU, - 0xD83DDD15LLU, - 0xD83DDCADLLU, - 0xD83DDCACLLU, - 0xD83DDEB8LLU, - 0xD83DDD0DLLU, - 0xD83DDD0ELLU, - 0xD83DDEABLLU, - 0x26D4LLU, - 0xD83DDCDBLLU, - 0xD83DDEB7LLU, - 0xD83DDEAFLLU, - 0xD83DDEB3LLU, - 0xD83DDEB1LLU, - 0xD83DDCF5LLU, - 0xD83DDD1ELLU, - 0xD83CDE51LLU, - 0xD83CDE50LLU, - 0xD83DDCAELLU, - 0x3299LLU, - 0x3297LLU, - 0xD83CDE34LLU, - 0xD83CDE35LLU, - 0xD83CDE32LLU, - 0xD83CDE36LLU, - 0xD83CDE1ALLU, - 0xD83CDE38LLU, - 0xD83CDE3ALLU, - 0xD83CDE37LLU, - 0xD83CDE39LLU, - 0xD83CDE33LLU, - 0xD83CDE02LLU, - 0xD83CDE01LLU, - 0xD83CDE2FLLU, - 0xD83DDCB9LLU, - 0x2747LLU, - 0x2733LLU, - 0x274ELLU, - 0x2705LLU, - 0x2734LLU, - 0xD83DDCF3LLU, - 0xD83DDCF4LLU, - 0xD83CDD9ALLU, - 0xD83CDD70LLU, - 0xD83CDD71LLU, - 0xD83CDD8ELLU, - 0xD83CDD91LLU, - 0xD83CDD7ELLU, - 0xD83CDD98LLU, - 0xD83CDD94LLU, - 0xD83CDD7FLLU, - 0xD83DDEBELLU, - 0xD83CDD92LLU, - 0xD83CDD93LLU, - 0xD83CDD95LLU, - 0xD83CDD96LLU, - 0xD83CDD97LLU, - 0xD83CDD99LLU, - 0xD83CDFE7LLU, + 0x262ELLU, + 0x271DLLU, + 0x262ALLU, + 0xD83DDD49LLU, + 0x2638LLU, + 0x2721LLU, + 0xD83DDD2FLLU, + 0xD83DDD4ELLU, + 0x262FLLU, + 0x2626LLU, + 0xD83DDED0LLU, + 0x26CELLU, 0x2648LLU, 0x2649LLU, 0x264ALLU, @@ -974,20 +1032,127 @@ uint64 emojiCategory7[] = { 0x2651LLU, 0x2652LLU, 0x2653LLU, - 0xD83DDEBBLLU, + 0xD83CDD94LLU, + 0x269BLLU, + 0xD83CDE33LLU, + 0xD83CDE39LLU, + 0x2622LLU, + 0x2623LLU, + 0xD83DDCF4LLU, + 0xD83DDCF3LLU, + 0xD83CDE36LLU, + 0xD83CDE1ALLU, + 0xD83CDE38LLU, + 0xD83CDE3ALLU, + 0xD83CDE37LLU, + 0x2734LLU, + 0xD83CDD9ALLU, + 0xD83CDE51LLU, + 0xD83DDCAELLU, + 0xD83CDE50LLU, + 0x3299LLU, + 0x3297LLU, + 0xD83CDE34LLU, + 0xD83CDE35LLU, + 0xD83CDE32LLU, + 0xD83CDD70LLU, + 0xD83CDD71LLU, + 0xD83CDD8ELLU, + 0xD83CDD91LLU, + 0xD83CDD7ELLU, + 0xD83CDD98LLU, + 0x26D4LLU, + 0xD83DDCDBLLU, + 0xD83DDEABLLU, + 0x274CLLU, + 0x2B55LLU, + 0xD83DDCA2LLU, + 0x2668LLU, + 0xD83DDEB7LLU, + 0xD83DDEAFLLU, + 0xD83DDEB3LLU, + 0xD83DDEB1LLU, + 0xD83DDD1ELLU, + 0xD83DDCF5LLU, + 0x2757LLU, + 0x2755LLU, + 0x2753LLU, + 0x2754LLU, + 0x203CLLU, + 0x2049LLU, + 0xD83DDCAFLLU, + 0xD83DDD05LLU, + 0xD83DDD06LLU, + 0xD83DDD31LLU, + 0x269CLLU, + 0x303DLLU, + 0x26A0LLU, + 0xD83DDEB8LLU, + 0xD83DDD30LLU, + 0x267BLLU, + 0xD83CDE2FLLU, + 0xD83DDCB9LLU, + 0x2747LLU, + 0x2733LLU, + 0x274ELLU, + 0x2705LLU, + 0xD83DDCA0LLU, + 0xD83CDF00LLU, + 0x27BFLLU, + 0xD83CDF10LLU, + 0x24C2LLU, + 0xD83CDFE7LLU, + 0xD83CDE02LLU, + 0xD83DDEC2LLU, + 0xD83DDEC3LLU, + 0xD83DDEC4LLU, + 0xD83DDEC5LLU, + 0x267FLLU, + 0xD83DDEADLLU, + 0xD83DDEBELLU, + 0xD83CDD7FLLU, + 0xD83DDEB0LLU, 0xD83DDEB9LLU, 0xD83DDEBALLU, 0xD83DDEBCLLU, - 0x267FLLU, - 0xD83DDEB0LLU, - 0xD83DDEADLLU, + 0xD83DDEBBLLU, 0xD83DDEAELLU, + 0xD83CDFA6LLU, + 0xD83DDCF6LLU, + 0xD83CDE01LLU, + 0xD83CDD96LLU, + 0xD83CDD97LLU, + 0xD83CDD99LLU, + 0xD83CDD92LLU, + 0xD83CDD95LLU, + 0xD83CDD93LLU, + 0x3020E3LLU, // divided by 0xFE0FLLU + 0x3120E3LLU, // divided by 0xFE0FLLU + 0x3220E3LLU, // divided by 0xFE0FLLU + 0x3320E3LLU, // divided by 0xFE0FLLU + 0x3420E3LLU, // divided by 0xFE0FLLU + 0x3520E3LLU, // divided by 0xFE0FLLU + 0x3620E3LLU, // divided by 0xFE0FLLU + 0x3720E3LLU, // divided by 0xFE0FLLU + 0x3820E3LLU, // divided by 0xFE0FLLU + 0x3920E3LLU, // divided by 0xFE0FLLU + 0xD83DDD1FLLU, + 0xD83DDD22LLU, 0x25B6LLU, + 0x23F8LLU, + 0x23EFLLU, + 0x23F9LLU, + 0x23FALLU, + 0x23EDLLU, + 0x23EELLU, + 0x23E9LLU, + 0x23EALLU, + 0xD83DDD00LLU, + 0xD83DDD01LLU, + 0xD83DDD02LLU, 0x25C0LLU, 0xD83DDD3CLLU, 0xD83DDD3DLLU, - 0x23E9LLU, - 0x23EALLU, 0x23EBLLU, 0x23ECLLU, 0x27A1LLU, @@ -1005,95 +1170,74 @@ uint64 emojiCategory7[] = { 0x21A9LLU, 0x2934LLU, 0x2935LLU, - 0xD83DDD00LLU, - 0xD83DDD01LLU, - 0xD83DDD02LLU, - 0x2320E3LLU, - 0x3020E3LLU, - 0x3120E3LLU, - 0x3220E3LLU, - 0x3320E3LLU, - 0x3420E3LLU, - 0x3520E3LLU, - 0x3620E3LLU, - 0x3720E3LLU, - 0x3820E3LLU, - 0x3920E3LLU, - 0xD83DDD1FLLU, - 0xD83DDD22LLU, + 0x2320E3LLU, // divided by 0xFE0FLLU + 0x2A20E3LLU, // divided by 0xFE0FLLU + 0x2139LLU, 0xD83DDD24LLU, 0xD83DDD21LLU, 0xD83DDD20LLU, - 0x2139LLU, - 0xD83DDCF6LLU, - 0xD83CDFA6LLU, 0xD83DDD23LLU, - 0x2795LLU, - 0x2796LLU, + 0xD83CDFB5LLU, + 0xD83CDFB6LLU, 0x3030LLU, - 0x2797LLU, - 0x2716LLU, + 0x27B0LLU, 0x2714LLU, 0xD83DDD03LLU, - 0x2122LLU, + 0x2795LLU, + 0x2796LLU, + 0x2797LLU, + 0x2716LLU, + 0xD83DDCB2LLU, + 0xD83DDCB1LLU, 0xA9LLU, 0xAELLU, - 0xD83DDCB1LLU, - 0xD83DDCB2LLU, - 0x27B0LLU, - 0x27BFLLU, - 0x303DLLU, - 0x2757LLU, - 0x2753LLU, - 0x2755LLU, - 0x2754LLU, - 0x203CLLU, - 0x2049LLU, - 0x274CLLU, - 0x2B55LLU, - 0xD83DDCAFLLU, + 0x2122LLU, 0xD83DDD1ALLU, 0xD83DDD19LLU, 0xD83DDD1BLLU, 0xD83DDD1DLLU, 0xD83DDD1CLLU, - 0xD83CDF00LLU, - 0x24C2LLU, - 0x26CELLU, - 0xD83DDD2FLLU, - 0xD83DDD30LLU, - 0xD83DDD31LLU, - 0x26A0LLU, - 0x2668LLU, - 0x267BLLU, - 0xD83DDCA2LLU, - 0xD83DDCA0LLU, - 0x2660LLU, - 0x2663LLU, - 0x2665LLU, - 0x2666LLU, 0x2611LLU, + 0xD83DDD18LLU, 0x26AALLU, 0x26ABLLU, - 0xD83DDD18LLU, 0xD83DDD34LLU, 0xD83DDD35LLU, - 0xD83DDD3ALLU, - 0xD83DDD3BLLU, 0xD83DDD38LLU, 0xD83DDD39LLU, 0xD83DDD36LLU, 0xD83DDD37LLU, + 0xD83DDD3ALLU, 0x25AALLU, 0x25ABLLU, 0x2B1BLLU, 0x2B1CLLU, + 0xD83DDD3BLLU, 0x25FCLLU, 0x25FBLLU, 0x25FELLU, 0x25FDLLU, 0xD83DDD32LLU, 0xD83DDD33LLU, + 0xD83DDD08LLU, + 0xD83DDD09LLU, + 0xD83DDD0ALLU, + 0xD83DDD07LLU, + 0xD83DDCE3LLU, + 0xD83DDCE2LLU, + 0xD83DDD14LLU, + 0xD83DDD15LLU, + 0xD83CDCCFLLU, + 0xD83CDC04LLU, + 0x2660LLU, + 0x2663LLU, + 0x2665LLU, + 0x2666LLU, + 0xD83CDFB4LLU, + 0xFFFF0012LLU,//0xD83DDC41LLU,0x200DLLU,0xD83DDDE8LLU, + 0xD83DDCADLLU, + 0xD83DDDEFLLU, + 0xD83DDCACLLU, 0xD83DDD50LLU, 0xD83DDD51LLU, 0xD83DDD52LLU, @@ -1118,55 +1262,302 @@ uint64 emojiCategory7[] = { 0xD83DDD65LLU, 0xD83DDD66LLU, 0xD83DDD67LLU, +//}; +// +//uint64 emojiCategory8[] = { + 0xD83CDDE6D83CDDEBLLU, + 0xD83CDDE6D83CDDFDLLU, + 0xD83CDDE6D83CDDF1LLU, + 0xD83CDDE9D83CDDFFLLU, + 0xD83CDDE6D83CDDF8LLU, + 0xD83CDDE6D83CDDE9LLU, + 0xD83CDDE6D83CDDF4LLU, + 0xD83CDDE6D83CDDEELLU, + 0xD83CDDE6D83CDDF6LLU, + 0xD83CDDE6D83CDDECLLU, + 0xD83CDDE6D83CDDF7LLU, + 0xD83CDDE6D83CDDF2LLU, + 0xD83CDDE6D83CDDFCLLU, + 0xD83CDDE6D83CDDFALLU, + 0xD83CDDE6D83CDDF9LLU, + 0xD83CDDE6D83CDDFFLLU, + 0xD83CDDE7D83CDDF8LLU, + 0xD83CDDE7D83CDDEDLLU, + 0xD83CDDE7D83CDDE9LLU, + 0xD83CDDE7D83CDDE7LLU, + 0xD83CDDE7D83CDDFELLU, + 0xD83CDDE7D83CDDEALLU, + 0xD83CDDE7D83CDDFFLLU, + 0xD83CDDE7D83CDDEFLLU, + 0xD83CDDE7D83CDDF2LLU, + 0xD83CDDE7D83CDDF9LLU, + 0xD83CDDE7D83CDDF4LLU, + 0xD83CDDE7D83CDDE6LLU, + 0xD83CDDE7D83CDDFCLLU, + 0xD83CDDE7D83CDDF7LLU, + 0xD83CDDEED83CDDF4LLU, + 0xD83CDDFBD83CDDECLLU, + 0xD83CDDE7D83CDDF3LLU, + 0xD83CDDE7D83CDDECLLU, + 0xD83CDDE7D83CDDEBLLU, + 0xD83CDDE7D83CDDEELLU, + 0xD83CDDF0D83CDDEDLLU, + 0xD83CDDE8D83CDDF2LLU, + 0xD83CDDE8D83CDDE6LLU, + 0xD83CDDEED83CDDE8LLU, + 0xD83CDDE8D83CDDFBLLU, + 0xD83CDDE7D83CDDF6LLU, + 0xD83CDDF0D83CDDFELLU, + 0xD83CDDE8D83CDDEBLLU, + 0xD83CDDF9D83CDDE9LLU, + 0xD83CDDE8D83CDDF1LLU, + 0xD83CDDE8D83CDDF3LLU, + 0xD83CDDE8D83CDDFDLLU, + 0xD83CDDE8D83CDDE8LLU, + 0xD83CDDE8D83CDDF4LLU, + 0xD83CDDF0D83CDDF2LLU, + 0xD83CDDE8D83CDDECLLU, + 0xD83CDDE8D83CDDE9LLU, + 0xD83CDDE8D83CDDF0LLU, + 0xD83CDDE8D83CDDF7LLU, + 0xD83CDDE8D83CDDEELLU, + 0xD83CDDEDD83CDDF7LLU, + 0xD83CDDE8D83CDDFALLU, + 0xD83CDDE8D83CDDFCLLU, + 0xD83CDDE8D83CDDFELLU, + 0xD83CDDE8D83CDDFFLLU, + 0xD83CDDE9D83CDDF0LLU, + 0xD83CDDE9D83CDDEFLLU, + 0xD83CDDE9D83CDDF2LLU, + 0xD83CDDE9D83CDDF4LLU, + 0xD83CDDEAD83CDDE8LLU, + 0xD83CDDEAD83CDDECLLU, + 0xD83CDDF8D83CDDFBLLU, + 0xD83CDDECD83CDDF6LLU, + 0xD83CDDEAD83CDDF7LLU, + 0xD83CDDEAD83CDDEALLU, + 0xD83CDDEAD83CDDF9LLU, + 0xD83CDDEAD83CDDFALLU, + 0xD83CDDEBD83CDDF0LLU, + 0xD83CDDEBD83CDDF4LLU, + 0xD83CDDEBD83CDDEFLLU, + 0xD83CDDEBD83CDDEELLU, + 0xD83CDDEBD83CDDF7LLU, + 0xD83CDDECD83CDDEBLLU, + 0xD83CDDF5D83CDDEBLLU, + 0xD83CDDF9D83CDDEBLLU, + 0xD83CDDECD83CDDE6LLU, + 0xD83CDDECD83CDDF2LLU, + 0xD83CDDECD83CDDEALLU, + 0xD83CDDE9D83CDDEALLU, + 0xD83CDDECD83CDDEDLLU, + 0xD83CDDECD83CDDEELLU, + 0xD83CDDECD83CDDF7LLU, + 0xD83CDDECD83CDDF1LLU, + 0xD83CDDECD83CDDE9LLU, + 0xD83CDDECD83CDDF5LLU, + 0xD83CDDECD83CDDFALLU, + 0xD83CDDECD83CDDF9LLU, + 0xD83CDDECD83CDDECLLU, + 0xD83CDDECD83CDDF3LLU, + 0xD83CDDECD83CDDFCLLU, + 0xD83CDDECD83CDDFELLU, + 0xD83CDDEDD83CDDF9LLU, + 0xD83CDDEDD83CDDF3LLU, + 0xD83CDDEDD83CDDF0LLU, + 0xD83CDDEDD83CDDFALLU, + 0xD83CDDEED83CDDF8LLU, + 0xD83CDDEED83CDDF3LLU, + 0xD83CDDEED83CDDE9LLU, + 0xD83CDDEED83CDDF7LLU, + 0xD83CDDEED83CDDF6LLU, + 0xD83CDDEED83CDDEALLU, + 0xD83CDDEED83CDDF2LLU, + 0xD83CDDEED83CDDF1LLU, + 0xD83CDDEED83CDDF9LLU, + 0xD83CDDEFD83CDDF2LLU, + 0xD83CDDEFD83CDDF5LLU, + 0xD83CDDEFD83CDDEALLU, + 0xD83CDDEFD83CDDF4LLU, + 0xD83CDDF0D83CDDFFLLU, + 0xD83CDDF0D83CDDEALLU, + 0xD83CDDF0D83CDDEELLU, + 0xD83CDDFDD83CDDF0LLU, + 0xD83CDDF0D83CDDFCLLU, + 0xD83CDDF0D83CDDECLLU, + 0xD83CDDF1D83CDDE6LLU, + 0xD83CDDF1D83CDDFBLLU, + 0xD83CDDF1D83CDDE7LLU, + 0xD83CDDF1D83CDDF8LLU, + 0xD83CDDF1D83CDDF7LLU, + 0xD83CDDF1D83CDDFELLU, + 0xD83CDDF1D83CDDEELLU, + 0xD83CDDF1D83CDDF9LLU, + 0xD83CDDF1D83CDDFALLU, + 0xD83CDDF2D83CDDF4LLU, + 0xD83CDDF2D83CDDF0LLU, + 0xD83CDDF2D83CDDECLLU, + 0xD83CDDF2D83CDDFCLLU, + 0xD83CDDF2D83CDDFELLU, + 0xD83CDDF2D83CDDFBLLU, + 0xD83CDDF2D83CDDF1LLU, + 0xD83CDDF2D83CDDF9LLU, + 0xD83CDDF2D83CDDEDLLU, + 0xD83CDDF2D83CDDF6LLU, + 0xD83CDDF2D83CDDF7LLU, + 0xD83CDDF2D83CDDFALLU, + 0xD83CDDFED83CDDF9LLU, + 0xD83CDDF2D83CDDFDLLU, + 0xD83CDDEBD83CDDF2LLU, + 0xD83CDDF2D83CDDE9LLU, + 0xD83CDDF2D83CDDE8LLU, + 0xD83CDDF2D83CDDF3LLU, + 0xD83CDDF2D83CDDEALLU, + 0xD83CDDF2D83CDDF8LLU, + 0xD83CDDF2D83CDDE6LLU, + 0xD83CDDF2D83CDDFFLLU, + 0xD83CDDF2D83CDDF2LLU, + 0xD83CDDF3D83CDDE6LLU, + 0xD83CDDF3D83CDDF7LLU, + 0xD83CDDF3D83CDDF5LLU, + 0xD83CDDF3D83CDDF1LLU, + 0xD83CDDF3D83CDDE8LLU, + 0xD83CDDF3D83CDDFFLLU, + 0xD83CDDF3D83CDDEELLU, + 0xD83CDDF3D83CDDEALLU, + 0xD83CDDF3D83CDDECLLU, + 0xD83CDDF3D83CDDFALLU, + 0xD83CDDF3D83CDDEBLLU, + 0xD83CDDF0D83CDDF5LLU, + 0xD83CDDF2D83CDDF5LLU, + 0xD83CDDF3D83CDDF4LLU, + 0xD83CDDF4D83CDDF2LLU, + 0xD83CDDF5D83CDDF0LLU, + 0xD83CDDF5D83CDDFCLLU, + 0xD83CDDF5D83CDDF8LLU, + 0xD83CDDF5D83CDDE6LLU, + 0xD83CDDF5D83CDDECLLU, + 0xD83CDDF5D83CDDFELLU, + 0xD83CDDF5D83CDDEALLU, + 0xD83CDDF5D83CDDEDLLU, + 0xD83CDDF5D83CDDF3LLU, + 0xD83CDDF5D83CDDF1LLU, + 0xD83CDDF5D83CDDF9LLU, + 0xD83CDDF5D83CDDF7LLU, + 0xD83CDDF6D83CDDE6LLU, + 0xD83CDDF7D83CDDEALLU, + 0xD83CDDF7D83CDDF4LLU, + 0xD83CDDF7D83CDDFALLU, + 0xD83CDDF7D83CDDFCLLU, + 0xD83CDDFCD83CDDF8LLU, + 0xD83CDDF8D83CDDF2LLU, + 0xD83CDDF8D83CDDF9LLU, + 0xD83CDDF8D83CDDE6LLU, + 0xD83CDDF8D83CDDF3LLU, + 0xD83CDDF7D83CDDF8LLU, + 0xD83CDDF8D83CDDE8LLU, + 0xD83CDDF8D83CDDF1LLU, + 0xD83CDDF8D83CDDECLLU, + 0xD83CDDF8D83CDDFDLLU, + 0xD83CDDF8D83CDDF0LLU, + 0xD83CDDF8D83CDDEELLU, + 0xD83CDDECD83CDDF8LLU, + 0xD83CDDF8D83CDDE7LLU, + 0xD83CDDF8D83CDDF4LLU, + 0xD83CDDFFD83CDDE6LLU, + 0xD83CDDF0D83CDDF7LLU, + 0xD83CDDF8D83CDDF8LLU, + 0xD83CDDEAD83CDDF8LLU, + 0xD83CDDF1D83CDDF0LLU, + 0xD83CDDE7D83CDDF1LLU, + 0xD83CDDF8D83CDDEDLLU, + 0xD83CDDF0D83CDDF3LLU, + 0xD83CDDF1D83CDDE8LLU, + 0xD83CDDF5D83CDDF2LLU, + 0xD83CDDFBD83CDDE8LLU, + 0xD83CDDF8D83CDDE9LLU, + 0xD83CDDF8D83CDDF7LLU, + 0xD83CDDF8D83CDDFFLLU, + 0xD83CDDF8D83CDDEALLU, + 0xD83CDDE8D83CDDEDLLU, + 0xD83CDDF8D83CDDFELLU, + 0xD83CDDF9D83CDDFCLLU, + 0xD83CDDF9D83CDDEFLLU, + 0xD83CDDF9D83CDDFFLLU, + 0xD83CDDF9D83CDDEDLLU, + 0xD83CDDF9D83CDDF1LLU, + 0xD83CDDF9D83CDDECLLU, + 0xD83CDDF9D83CDDF0LLU, + 0xD83CDDF9D83CDDF4LLU, + 0xD83CDDF9D83CDDF9LLU, + 0xD83CDDF9D83CDDF3LLU, + 0xD83CDDF9D83CDDF7LLU, + 0xD83CDDF9D83CDDF2LLU, + 0xD83CDDF9D83CDDE8LLU, + 0xD83CDDF9D83CDDFBLLU, + 0xD83CDDFBD83CDDEELLU, + 0xD83CDDFAD83CDDECLLU, + 0xD83CDDFAD83CDDE6LLU, + 0xD83CDDE6D83CDDEALLU, + 0xD83CDDECD83CDDE7LLU, + 0xD83CDDFAD83CDDF8LLU, + 0xD83CDDFAD83CDDFELLU, + 0xD83CDDFAD83CDDFFLLU, + 0xD83CDDFBD83CDDFALLU, + 0xD83CDDFBD83CDDE6LLU, + 0xD83CDDFBD83CDDEALLU, + 0xD83CDDFBD83CDDF3LLU, + 0xD83CDDFCD83CDDEBLLU, + 0xD83CDDEAD83CDDEDLLU, + 0xD83CDDFED83CDDEALLU, + 0xD83CDDFFD83CDDF2LLU, + 0xD83CDDFFD83CDDFCLLU, }; uint64 emojiPostfixed[] = { - 0x263ALLU, // category 1 + // category 1 + 0x263ALLU, + 0x2639LLU, 0x261DLLU, - 0x270CLLU, - 0x26A1LLU, // category 2 + // category 2 + 0x2B50LLU, 0x2600LLU, 0x26C5LLU, 0x2601LLU, - 0x2614LLU, + 0x26A1LLU, 0x2744LLU, - 0x2B50LLU, + 0x26C4LLU, + 0x2614LLU, - 0x2615LLU, // category 3 + // category 3 + 0x2615LLU, - 0x2764LLU, // category 4 - - 0x26C4LLU, // category 5 - 0x26FALLU, + // category 4 0x26BDLLU, 0x26BELLU, 0x26F3LLU, - 0xD83CDC04LLU, - 0x26FDLLU, // category 6 + // category 5 0x2708LLU, - 0x2693LLU, 0x26F5LLU, + 0x2693LLU, + 0x26FDLLU, 0x26F2LLU, + 0x26FALLU, 0x26EALLU, - 0x231ALLU, // category 7 - 0x231BLLU, + // category 6 + 0x231ALLU, 0x260ELLU, + 0x231BLLU, 0x2709LLU, 0x2702LLU, 0x2712LLU, 0x270FLLU, - 0x26D4LLU, - 0x3299LLU, - 0x3297LLU, - 0xD83CDE1ALLU, - 0xD83CDE2FLLU, - 0x2747LLU, - 0x2733LLU, - 0x2734LLU, - 0xD83CDD7FLLU, + + // category 7 + 0x2764LLU, 0x2648LLU, 0x2649LLU, 0x264ALLU, @@ -1179,7 +1570,25 @@ uint64 emojiPostfixed[] = { 0x2651LLU, 0x2652LLU, 0x2653LLU, + 0xD83CDE1ALLU, + 0x2734LLU, + 0x3299LLU, + 0x3297LLU, + 0x26D4LLU, + 0x2B55LLU, + 0x2668LLU, + 0x2757LLU, + 0x203CLLU, + 0x2049LLU, + 0x303DLLU, + 0x26A0LLU, + 0x267BLLU, + 0xD83CDE2FLLU, + 0x2747LLU, + 0x2733LLU, + 0x24C2LLU, 0x267FLLU, + 0xD83CDD7FLLU, 0x25B6LLU, 0x25C0LLU, 0x27A1LLU, @@ -1197,21 +1606,8 @@ uint64 emojiPostfixed[] = { 0x2934LLU, 0x2935LLU, 0x2139LLU, - 0x2716LLU, 0x2714LLU, - 0x303DLLU, - 0x2757LLU, - 0x203CLLU, - 0x2049LLU, - 0x2B55LLU, - 0x24C2LLU, - 0x26A0LLU, - 0x2668LLU, - 0x267BLLU, - 0x2660LLU, - 0x2663LLU, - 0x2665LLU, - 0x2666LLU, + 0x2716LLU, 0x2611LLU, 0x26AALLU, 0x26ABLLU, @@ -1223,6 +1619,11 @@ uint64 emojiPostfixed[] = { 0x25FBLLU, 0x25FELLU, 0x25FDLLU, + 0xD83CDC04LLU, + 0x2660LLU, + 0x2663LLU, + 0x2665LLU, + 0x2666LLU, }; QMap emojiWithPostfixes, emojiWithColors; @@ -1308,6 +1709,7 @@ bool genEmoji(QString, const QString &emoji_out, const QString &emoji_png) { case 5: k = emojiCategory5; cnt = sizeof(emojiCategory5) / sizeof(emojiCategory5[0]); break; case 6: k = emojiCategory6; cnt = sizeof(emojiCategory6) / sizeof(emojiCategory6[0]); break; case 7: k = emojiCategory7; cnt = sizeof(emojiCategory7) / sizeof(emojiCategory7[0]); break; +// case 8: k = emojiCategory8; cnt = sizeof(emojiCategory8) / sizeof(emojiCategory8[0]); break; } for (int j = 0; j < cnt; ++j) { EmojiData data; @@ -1335,7 +1737,7 @@ bool genEmoji(QString, const QString &emoji_out, const QString &emoji_png) { if (data.code < min1) min1 = data.code; if (data.code > max1) max1 = data.code; } - } else if (high == 35 || (high >= 48 && high < 58)) { // digits + } else if (high == 0x23 || high == 0x2A || (high >= 0x30 && high < 0x3A)) { // digits } else { if (data.code < min2) min2 = data.code; if (data.code > max2) max2 = data.code; @@ -1636,13 +2038,13 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org\n\ tcpp << "\t\treturn 0;\n"; tcpp << "\t}\n\n"; - tcpp << "\tif (highCode == 35 || (highCode >= 48 && highCode < 58)) {\n"; // digits + tcpp << "\tif (highCode == 0x23 || highCode == 0x2A || (highCode >= 0x30 && highCode < 0x3A)) {\n"; // digits tcpp << "\t\tif ((code & 0xFFFFU) != 0x20E3U) return 0;\n\n"; tcpp << "\t\tswitch (code) {\n"; for (; i != e; ++i) { if (i->code2) break; uint32 high = i->code >> 16; - if (high != 35 && (high < 48 || high >= 58)) break; + if (high != 0x23 && high != 0x2A && (high < 0x30 || high >= 0x3A)) break; tcpp << "\t\t\tcase 0x" << QString("%1").arg(i->code, 0, 16).toUpper().toUtf8().constData() << "U: return &emojis[" << (index++) << "];\n"; } @@ -1732,6 +2134,12 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org\n\ } tcpp << "EmojiPtr emojiGet(const QChar *from, const QChar *end) {\n"; tcpp << "\tstatic const int sequenceOffset = " << sequenceOffset << ";\n\n"; + tcpp << "\tif (from + 4 < end && (from + 2)->unicode() == 0x200D) {\n"; + tcpp << "\t\tuint32 one = (uint32(from->unicode()) << 16) | uint32((from + 1)->unicode()), two = (uint32((from + 3)->unicode()) << 16) | uint32((from + 4)->unicode());\n"; + tcpp << "\t\tif (one == 0xD83DDC41 && two == 0xD83DDDE8) {\n"; + tcpp << "\t\t\treturn &emojis[sequenceOffset + 18];\n"; + tcpp << "\t\t}\n"; + tcpp << "\t}\n\n"; tcpp << "\tif (end < from + 8 || (from + 2)->unicode() != 0x200D || (from + 5)->unicode() != 0x200D) return 0;\n\n"; tcpp << "\tstatic const uint32 "; tcpp << "man = 0x" << QString("%1").arg((uint32(seqs[0].at(0).unicode()) << 16) | uint32(seqs[0].at(1).unicode()), 0, 16).toUpper().toUtf8().constData() << ", "; @@ -1876,14 +2284,15 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org\n\ tcpp << "int emojiPackCount(DBIEmojiTab tab) {\n"; tcpp << "\tswitch (tab) {\n"; - tcpp << "\t\tcase dbietRecent : return cGetRecentEmojis().size();\n"; - tcpp << "\t\tcase dbietPeople : return " << sizeof(emojiCategory1) / sizeof(emojiCategory1[0]) << ";\n"; - tcpp << "\t\tcase dbietNature : return " << sizeof(emojiCategory2) / sizeof(emojiCategory2[0]) << ";\n"; - tcpp << "\t\tcase dbietFood : return " << sizeof(emojiCategory3) / sizeof(emojiCategory3[0]) << ";\n"; - tcpp << "\t\tcase dbietCelebration: return " << sizeof(emojiCategory4) / sizeof(emojiCategory4[0]) << ";\n"; - tcpp << "\t\tcase dbietActivity : return " << sizeof(emojiCategory5) / sizeof(emojiCategory5[0]) << ";\n"; - tcpp << "\t\tcase dbietTravel : return " << sizeof(emojiCategory6) / sizeof(emojiCategory6[0]) << ";\n"; - tcpp << "\t\tcase dbietObjects : return " << sizeof(emojiCategory7) / sizeof(emojiCategory7[0]) << ";\n"; + tcpp << "\t\tcase dbietRecent : return cGetRecentEmojis().size();\n"; + tcpp << "\t\tcase dbietPeople : return " << sizeof(emojiCategory1) / sizeof(emojiCategory1[0]) << ";\n"; + tcpp << "\t\tcase dbietNature : return " << sizeof(emojiCategory2) / sizeof(emojiCategory2[0]) << ";\n"; + tcpp << "\t\tcase dbietFood : return " << sizeof(emojiCategory3) / sizeof(emojiCategory3[0]) << ";\n"; + tcpp << "\t\tcase dbietActivity: return " << sizeof(emojiCategory4) / sizeof(emojiCategory4[0]) << ";\n"; + tcpp << "\t\tcase dbietTravel : return " << sizeof(emojiCategory5) / sizeof(emojiCategory5[0]) << ";\n"; + tcpp << "\t\tcase dbietObjects : return " << sizeof(emojiCategory6) / sizeof(emojiCategory6[0]) << ";\n"; + tcpp << "\t\tcase dbietSymbols : return " << sizeof(emojiCategory7) / sizeof(emojiCategory7[0]) << ";\n"; +// tcpp << "\t\tcase dbietFlags : return " << sizeof(emojiCategory8) / sizeof(emojiCategory8[0]) << ";\n"; tcpp << "\t};\n"; tcpp << "\treturn 0;\n"; tcpp << "}\n\n"; @@ -1892,10 +2301,11 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org\n\ writeEmojiCategory(tcpp, emojiCategory1, sizeof(emojiCategory1) / sizeof(emojiCategory1[0]), "People"); writeEmojiCategory(tcpp, emojiCategory2, sizeof(emojiCategory2) / sizeof(emojiCategory2[0]), "Nature"); writeEmojiCategory(tcpp, emojiCategory3, sizeof(emojiCategory3) / sizeof(emojiCategory3[0]), "Food"); - writeEmojiCategory(tcpp, emojiCategory4, sizeof(emojiCategory4) / sizeof(emojiCategory4[0]), "Celebration"); - writeEmojiCategory(tcpp, emojiCategory5, sizeof(emojiCategory5) / sizeof(emojiCategory5[0]), "Activity"); - writeEmojiCategory(tcpp, emojiCategory6, sizeof(emojiCategory6) / sizeof(emojiCategory6[0]), "Travel"); - writeEmojiCategory(tcpp, emojiCategory7, sizeof(emojiCategory7) / sizeof(emojiCategory7[0]), "Objects"); + writeEmojiCategory(tcpp, emojiCategory4, sizeof(emojiCategory4) / sizeof(emojiCategory4[0]), "Activity"); + writeEmojiCategory(tcpp, emojiCategory5, sizeof(emojiCategory5) / sizeof(emojiCategory5[0]), "Travel"); + writeEmojiCategory(tcpp, emojiCategory6, sizeof(emojiCategory6) / sizeof(emojiCategory6[0]), "Objects"); + writeEmojiCategory(tcpp, emojiCategory7, sizeof(emojiCategory7) / sizeof(emojiCategory7[0]), "Symbols"); +// writeEmojiCategory(tcpp, emojiCategory8, sizeof(emojiCategory8) / sizeof(emojiCategory8[0]), "Flags"); tcpp << "\t};\n\n"; tcpp << "\tEmojiPack result;\n"; tcpp << "\tresult.reserve(cGetRecentEmojis().size());\n"; diff --git a/Telegram/SourceFiles/_other/packer.cpp b/Telegram/SourceFiles/_other/packer.cpp index a8839df97..7cf2da955 100644 --- a/Telegram/SourceFiles/_other/packer.cpp +++ b/Telegram/SourceFiles/_other/packer.cpp @@ -36,8 +36,9 @@ Q_IMPORT_PLUGIN(QWebpPlugin) #endif bool DevChannel = false; +quint64 BetaVersion = 0; -const char *publicKey = "\ +const char *PublicKey = "\ -----BEGIN RSA PUBLIC KEY-----\n\ MIGJAoGBAMA4ViQrjkPZ9xj0lrer3r23JvxOnrtE8nI69XLGSr+sRERz9YnUptnU\n\ BZpkIfKaRcl6XzNJiN28cVwO1Ui5JSa814UAiDHzWUqCaXUiUEQ6NmNTneiGx2sQ\n\ @@ -45,7 +46,7 @@ BZpkIfKaRcl6XzNJiN28cVwO1Ui5JSa814UAiDHzWUqCaXUiUEQ6NmNTneiGx2sQ\n\ -----END RSA PUBLIC KEY-----\ "; -const char *publicDevKey = "\ +const char *PublicDevKey = "\ -----BEGIN RSA PUBLIC KEY-----\n\ MIGJAoGBALWu9GGs0HED7KG7BM73CFZ6o0xufKBRQsdnq3lwA8nFQEvmdu+g/I1j\n\ 0LQ+0IQO7GW4jAgzF/4+soPDb6uHQeNFrlVx1JS9DZGhhjZ5rf65yg11nTCIHZCG\n\ @@ -53,9 +54,12 @@ w/CVnbwQOw0g5GBwwFV3r0uTTvy44xx8XXxk+Qknu4eBCsmrAFNnAgMBAAE=\n\ -----END RSA PUBLIC KEY-----\ "; -extern const char *privateKey; -extern const char *privateDevKey; +extern const char *PrivateKey; +extern const char *PrivateDevKey; #include "../../../../TelegramPrivate/packer_private.h" // RSA PRIVATE KEYS for update signing +#include "../../../../TelegramPrivate/beta_private.h" // private key for beta version file generation + +QString countBetaVersionSignature(quint64 version); // sha1 hash typedef unsigned char uchar; @@ -138,6 +142,8 @@ int32 *hashSha1(const void *data, uint32 len, void *dest) { return (int32*)sha1To; } +QString BetaSignature; + int main(int argc, char *argv[]) { QString workDir; @@ -167,14 +173,28 @@ int main(int argc, char *argv[]) version = QString(argv[i + 1]).toInt(); } else if (string("-dev") == argv[i]) { DevChannel = true; + } else if (string("-beta") == argv[i] && i + 1 < argc) { + BetaVersion = QString(argv[i + 1]).toULongLong(); + if (BetaVersion > version * 1000ULL && BetaVersion < (version + 1) * 1000ULL) { + DevChannel = false; + BetaSignature = countBetaVersionSignature(BetaVersion); + if (BetaSignature.isEmpty()) { + return -1; + } + } else { + cout << "Bad -beta param value passed, should be for the same version: " << version << ", beta: " << BetaVersion << "\n"; + return -1; + } } } - if (files.isEmpty() || remove.isEmpty() || version <= 1016 || version > 999999) { // not for release =) + if (files.isEmpty() || remove.isEmpty() || version <= 1016 || version > 999999999) { #ifdef Q_OS_WIN cout << "Usage: Packer.exe -path {file} -version {version} OR Packer.exe -path {dir} -version {version}\n"; #elif defined Q_OS_MAC cout << "Usage: Packer.app -path {file} -version {version} OR Packer.app -path {dir} -version {version}\n"; +#else + cout << "Usage: Packer -path {file} -version {version} OR Packer -path {dir} -version {version}\n"; #endif return -1; } @@ -218,7 +238,12 @@ int main(int argc, char *argv[]) QDataStream stream(&buffer); stream.setVersion(QDataStream::Qt_5_1); - stream << quint32(version); + if (BetaVersion) { + stream << quint32(0x7FFFFFFF); + stream << quint64(BetaVersion); + } else { + stream << quint32(version); + } stream << quint32(files.size()); cout << "Found " << files.size() << " file" << (files.size() == 1 ? "" : "s") << "..\n"; @@ -409,19 +434,19 @@ int main(int argc, char *argv[]) uint32 siglen = 0; cout << "Signing..\n"; - RSA *prKey = PEM_read_bio_RSAPrivateKey(BIO_new_mem_buf(const_cast(DevChannel ? privateDevKey : privateKey), -1), 0, 0, 0); + RSA *prKey = PEM_read_bio_RSAPrivateKey(BIO_new_mem_buf(const_cast((DevChannel || BetaVersion) ? PrivateDevKey : PrivateKey), -1), 0, 0, 0); if (!prKey) { cout << "Could not read RSA private key!\n"; return -1; } if (RSA_size(prKey) != hSigLen) { - RSA_free(prKey); cout << "Bad private key, size: " << RSA_size(prKey) << "\n"; + RSA_free(prKey); return -1; } if (RSA_sign(NID_sha1, (const uchar*)(compressed.constData() + hSigLen), hShaLen, (uchar*)(compressed.data()), &siglen, prKey) != 1) { // count signature - RSA_free(prKey); cout << "Signing failed!\n"; + RSA_free(prKey); return -1; } RSA_free(prKey); @@ -432,7 +457,7 @@ int main(int argc, char *argv[]) } cout << "Checking signature..\n"; - RSA *pbKey = PEM_read_bio_RSAPublicKey(BIO_new_mem_buf(const_cast(DevChannel ? publicDevKey : publicKey), -1), 0, 0, 0); + RSA *pbKey = PEM_read_bio_RSAPublicKey(BIO_new_mem_buf(const_cast((DevChannel || BetaVersion) ? PublicDevKey : PublicKey), -1), 0, 0, 0); if (!pbKey) { cout << "Could not read RSA public key!\n"; return -1; @@ -445,16 +470,19 @@ int main(int argc, char *argv[]) cout << "Signature verified!\n"; RSA_free(pbKey); #ifdef Q_OS_WIN - QString outName(QString("tupdate%1").arg(version)); + QString outName(QString("tupdate%1").arg(BetaVersion ? BetaVersion : version)); #elif defined Q_OS_MAC - QString outName(QString("tmacupd%1").arg(version)); + QString outName(QString("tmacupd%1").arg(BetaVersion ? BetaVersion : version)); #elif defined Q_OS_LINUX32 - QString outName(QString("tlinux32upd%1").arg(version)); + QString outName(QString("tlinux32upd%1").arg(BetaVersion ? BetaVersion : version)); #elif defined Q_OS_LINUX64 - QString outName(QString("tlinuxupd%1").arg(version)); + QString outName(QString("tlinuxupd%1").arg(BetaVersion ? BetaVersion : version)); #else #error Unknown platform! #endif + if (BetaVersion) { + outName += "_" + BetaSignature; + } QFile out(outName); if (!out.open(QIODevice::WriteOnly)) { cout << "Can't open '" << outName.toUtf8().constData() << "' for write..\n"; @@ -463,7 +491,63 @@ int main(int argc, char *argv[]) out.write(compressed); out.close(); + if (BetaVersion) { + QString keyName(QString("tbeta_%1_key").arg(BetaVersion)); + QFile key(keyName); + if (!key.open(QIODevice::WriteOnly)) { + cout << "Can't open '" << keyName.toUtf8().constData() << "' for write..\n"; + return -1; + } + key.write(BetaSignature.toUtf8()); + key.close(); + } + cout << "Update file '" << outName.toUtf8().constData() << "' written successfully!\n"; return 0; } + +QString countBetaVersionSignature(quint64 version) { // duplicated in autoupdate.cpp + QByteArray cBetaPrivateKey(BetaPrivateKey); + if (cBetaPrivateKey.isEmpty()) { + cout << "Error: Trying to count beta version signature without beta private key!\n"; + return QString(); + } + + QByteArray signedData = (QLatin1String("TelegramBeta_") + QString::number(version, 16).toLower()).toUtf8(); + + static const int32 shaSize = 20, keySize = 128; + + uchar sha1Buffer[shaSize]; + hashSha1(signedData.constData(), signedData.size(), sha1Buffer); // count sha1 + + uint32 siglen = 0; + + RSA *prKey = PEM_read_bio_RSAPrivateKey(BIO_new_mem_buf(const_cast(cBetaPrivateKey.constData()), -1), 0, 0, 0); + if (!prKey) { + cout << "Error: Could not read beta private key!\n"; + return QString(); + } + if (RSA_size(prKey) != keySize) { + cout << "Error: Bad beta private key size: " << RSA_size(prKey) << "\n"; + RSA_free(prKey); + return QString(); + } + QByteArray signature; + signature.resize(keySize); + if (RSA_sign(NID_sha1, (const uchar*)(sha1Buffer), shaSize, (uchar*)(signature.data()), &siglen, prKey) != 1) { // count signature + cout << "Error: Counting beta version signature failed!\n"; + RSA_free(prKey); + return QString(); + } + RSA_free(prKey); + + if (siglen != keySize) { + cout << "Error: Bad beta version signature length: " << siglen << "\n"; + return QString(); + } + + signature = signature.toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); + signature = signature.replace('-', '8').replace('_', 'B'); + return QString::fromUtf8(signature.mid(19, 32)); +} diff --git a/Telegram/SourceFiles/_other/updater.cpp b/Telegram/SourceFiles/_other/updater.cpp index 484026f26..103803a88 100644 --- a/Telegram/SourceFiles/_other/updater.cpp +++ b/Telegram/SourceFiles/_other/updater.cpp @@ -148,10 +148,14 @@ bool update() { if (versionFile != INVALID_HANDLE_VALUE) { if (!ReadFile(versionFile, &versionNum, sizeof(DWORD), &readLen, NULL) || readLen != sizeof(DWORD)) { versionNum = 0; - } else if (!ReadFile(versionFile, &versionLen, sizeof(DWORD), &readLen, NULL) || readLen != sizeof(DWORD) || versionLen > 63) { - versionNum = 0; - } else if (!ReadFile(versionFile, versionStr, versionLen, &readLen, NULL) || readLen != versionLen) { - versionNum = 0; + } else { + if (versionNum == 0x7FFFFFFF) { // beta version + + } else if (!ReadFile(versionFile, &versionLen, sizeof(DWORD), &readLen, NULL) || readLen != sizeof(DWORD) || versionLen > 63) { + versionNum = 0; + } else if (!ReadFile(versionFile, versionStr, versionLen, &readLen, NULL) || readLen != versionLen) { + versionNum = 0; + } } CloseHandle(versionFile); writeLog(L"Version file read."); @@ -270,7 +274,7 @@ bool update() { } void updateRegistry() { - if (versionNum) { + if (versionNum && versionNum != 0x7FFFFFFF) { writeLog(L"Updating registry.."); versionStr[versionLen / 2] = 0; HKEY rkey; diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 4461772be..d81582eff 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -726,29 +726,19 @@ void ApiWrap::gotStickerSet(uint64 setId, const MTPmessages_StickerSet &result) it->access = s.vaccess_hash.v; it->hash = s.vhash.v; it->shortName = qs(s.vshort_name); - QString title = qs(s.vtitle); - if ((it->flags & MTPDstickerSet::flag_official) && !title.compare(qstr("Great Minds"), Qt::CaseInsensitive)) { - title = lang(lng_stickers_default_set); - } - it->title = title; + it->title = stickerSetTitle(s); it->flags = s.vflags.v; const QVector &d_docs(d.vdocuments.c_vector().v); StickerSets::iterator custom = sets.find(CustomStickerSetId); - QSet found; - int32 wasCount = -1; + StickerPack pack; + pack.reserve(d_docs.size()); for (int32 i = 0, l = d_docs.size(); i != l; ++i) { DocumentData *doc = App::feedDocument(d_docs.at(i)); if (!doc || !doc->sticker()) continue; - if (wasCount < 0) wasCount = it->stickers.size(); - if (it->stickers.indexOf(doc) < 0) { - it->stickers.push_back(doc); - } else { - found.insert(doc); - } - + pack.push_back(doc); if (custom != sets.cend()) { int32 index = custom->stickers.indexOf(doc); if (index >= 0) { @@ -763,39 +753,20 @@ void ApiWrap::gotStickerSet(uint64 setId, const MTPmessages_StickerSet &result) bool writeRecent = false; RecentStickerPack &recent(cGetRecentStickers()); - - if (wasCount < 0) { // no stickers received - for (RecentStickerPack::iterator i = recent.begin(); i != recent.cend();) { - if (it->stickers.indexOf(i->first) >= 0) { - i = recent.erase(i); - writeRecent = true; - } else { - ++i; - } + for (RecentStickerPack::iterator i = recent.begin(); i != recent.cend();) { + if (it->stickers.indexOf(i->first) >= 0 && pack.indexOf(i->first) < 0) { + i = recent.erase(i); + writeRecent = true; + } else { + ++i; } - cRefStickerSetsOrder().removeOne(setId); + } + if (pack.isEmpty()) { + int32 removeIndex = cStickerSetsOrder().indexOf(setId); + if (removeIndex >= 0) cRefStickerSetsOrder().removeAt(removeIndex); sets.erase(it); } else { - for (int32 j = 0, l = wasCount; j < l;) { - if (found.contains(it->stickers.at(j))) { - ++j; - } else { - for (RecentStickerPack::iterator i = recent.begin(); i != recent.cend();) { - if (it->stickers.at(j) == i->first) { - i = recent.erase(i); - writeRecent = true; - } else { - ++i; - } - } - it->stickers.removeAt(j); - --l; - } - } - if (it->stickers.isEmpty()) { - cRefStickerSetsOrder().removeOne(setId); - sets.erase(it); - } + it->stickers = pack; } if (writeRecent) { diff --git a/Telegram/SourceFiles/app.cpp b/Telegram/SourceFiles/app.cpp index 0241ee9ab..81ba97b9d 100644 --- a/Telegram/SourceFiles/app.cpp +++ b/Telegram/SourceFiles/app.cpp @@ -1632,8 +1632,9 @@ namespace App { convert->sticker()->loc = thumbLocation; } - if (convert->location.check()) { - Local::writeFileLocation(mediaKey(DocumentFileLocation, convert->dc, convert->id), convert->location); + const FileLocation &loc(convert->location(true)); + if (!loc.isEmpty()) { + Local::writeFileLocation(mediaKey(DocumentFileLocation, convert->dc, convert->id), loc); } } DocumentsData::const_iterator i = documentsData.constFind(document); @@ -1984,7 +1985,7 @@ namespace App { webPagesData.clear(); if (api()) api()->clearWebPageRequests(); cSetRecentStickers(RecentStickerPack()); - cSetStickersHash(QByteArray()); + cSetStickersHash(0); cSetStickerSets(StickerSets()); cSetStickerSetsOrder(StickerSetsOrder()); cSetLastStickersUpdate(0); @@ -2804,79 +2805,4 @@ namespace App { WallPapers gServerBackgrounds; - void sendBotCommand(const QString &cmd, MsgId replyTo) { - if (MainWidget *m = main()) m->sendBotCommand(cmd, replyTo); - } - - void insertBotCommand(const QString &cmd) { - if (MainWidget *m = main()) m->insertBotCommand(cmd); - } - - void searchByHashtag(const QString &tag, PeerData *inPeer) { - if (MainWidget *m = main()) m->searchMessages(tag + ' ', (inPeer && inPeer->isChannel()) ? inPeer : 0); - } - - void openPeerByName(const QString &username, bool toProfile, const QString &startToken) { - if (MainWidget *m = main()) m->openPeerByName(username, toProfile, startToken); - } - - void joinGroupByHash(const QString &hash) { - if (MainWidget *m = main()) m->joinGroupByHash(hash); - } - - void stickersBox(const QString &name) { - if (MainWidget *m = main()) m->stickersBox(MTP_inputStickerSetShortName(MTP_string(name))); - } - - void openLocalUrl(const QString &url) { - if (MainWidget *m = main()) m->openLocalUrl(url); - } - - bool forward(const PeerId &peer, ForwardWhatMessages what) { - if (MainWidget *m = main()) return m->onForward(peer, what); - return false; - } - - void removeDialog(History *history) { - if (MainWidget *m = main()) m->removeDialog(history); - } - - void showSettings() { - if (Window *win = wnd()) win->showSettings(); - } - - void showLayer(LayeredWidget *w, bool forceFast) { - if (Window *win = wnd()) win->showLayer(w, forceFast); - } - - void replaceLayer(LayeredWidget *w) { - if (Window *win = wnd()) win->replaceLayer(w); - } - - void showLayerLast(LayeredWidget *w) { - if (Window *win = wnd()) win->showLayerLast(w); - } - -} - -namespace Notify { - - void userIsBotChanged(UserData *user) { - if (MainWidget *m = App::main()) { - m->notifyUserIsBotChanged(user); - } - } - - void botCommandsChanged(UserData *user) { - if (MainWidget *m = App::main()) { - m->notifyBotCommandsChanged(user); - } - } - - void migrateUpdated(PeerData *peer) { - if (MainWidget *m = App::main()) { - m->notifyMigrateUpdated(peer); - } - } - } diff --git a/Telegram/SourceFiles/app.h b/Telegram/SourceFiles/app.h index dd6c07c7f..1402a7e05 100644 --- a/Telegram/SourceFiles/app.h +++ b/Telegram/SourceFiles/app.h @@ -80,13 +80,6 @@ enum RoundCorners { RoundCornersCount }; -enum ForwardWhatMessages { - ForwardSelectedMessages, - ForwardContextMessage, - ForwardPressedMessage, - ForwardPressedLinkMessage -}; - class LayeredWidget; namespace App { @@ -233,7 +226,7 @@ namespace App { bool quiting(); void setQuiting(); - QImage readImage(QByteArray data, QByteArray *format = 0, bool opaque = true, bool *animated = 0); + QImage readImage(QByteArray data, QByteArray *format = 0, bool opaque = true, bool *animated = 0); QImage readImage(const QString &file, QByteArray *format = 0, bool opaque = true, bool *animated = 0, QByteArray *content = 0); void regVideoItem(VideoData *data, HistoryItem *item); @@ -300,26 +293,27 @@ namespace App { typedef QList WallPapers; DeclareSetting(WallPapers, ServerBackgrounds); - void sendBotCommand(const QString &cmd, MsgId replyTo = 0); - void insertBotCommand(const QString &cmd); - void searchByHashtag(const QString &tag, PeerData *inPeer); - void openPeerByName(const QString &username, bool toProfile = false, const QString &startToken = QString()); - void joinGroupByHash(const QString &hash); - void stickersBox(const QString &name); - void openLocalUrl(const QString &url); - bool forward(const PeerId &peer, ForwardWhatMessages what); - void removeDialog(History *history); - void showSettings(); - void showLayer(LayeredWidget *w, bool forceFast = false); - void replaceLayer(LayeredWidget *w); - void showLayerLast(LayeredWidget *w); - }; -namespace Notify { +inline int32 stickersCountHash(bool checkOfficial = false) { + uint32 acc = 0; + bool foundOfficial = false, foundBad = false;; + const StickerSets &sets(cStickerSets()); + const StickerSetsOrder &order(cStickerSetsOrder()); + for (StickerSetsOrder::const_iterator i = order.cbegin(), e = order.cend(); i != e; ++i) { + StickerSets::const_iterator j = sets.constFind(*i); + if (j != sets.cend()) { + if (j->id == 0) { + foundBad = true; + } else if (j->flags & MTPDstickerSet::flag_official) { + foundOfficial = true; + } + if (!(j->flags & MTPDstickerSet::flag_disabled)) { + acc = (acc * 20261) + j->hash; + } + } + } + return (!checkOfficial || (!foundBad && foundOfficial)) ? int32(acc & 0x7FFFFFFF) : 0; +} - void userIsBotChanged(UserData *user); - void botCommandsChanged(UserData *user); - void migrateUpdated(PeerData *peer); - -}; +#include "facades.h" diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp index 14db723a7..d6e7ae35f 100644 --- a/Telegram/SourceFiles/application.cpp +++ b/Telegram/SourceFiles/application.cpp @@ -60,7 +60,7 @@ namespace { bool eventFilter(QObject *o, QEvent *e) { if (e->type() == QEvent::KeyPress) { QKeyEvent *ev = static_cast(e); - if (cPlatform() == dbipMac) { + if (cPlatform() == dbipMac || cPlatform() == dbipMacOld) { if (ev->key() == Qt::Key_W && (ev->modifiers() & Qt::ControlModifier)) { if (cWorkMode() == dbiwmTrayOnly || cWorkMode() == dbiwmWindowAndTray) { App::wnd()->minimizeToTray(); @@ -210,11 +210,17 @@ void Application::updateGotCurrent() { cSetLastUpdateCheck(unixtime()); QRegularExpressionMatch m = QRegularExpression(qsl("^\\s*(\\d+)\\s*:\\s*([\\x21-\\x7f]+)\\s*$")).match(QString::fromUtf8(updateReply->readAll())); if (m.hasMatch()) { - int32 currentVersion = m.captured(1).toInt(); - if (currentVersion > AppVersion) { + uint64 currentVersion = m.captured(1).toULongLong(); + QString url = m.captured(2); + bool betaVersion = false; + if (url.startsWith(qstr("beta_"))) { + betaVersion = true; + url = url.mid(5) + '_' + countBetaVersionSignature(currentVersion); + } + if ((!betaVersion || cBetaVersion()) && currentVersion > (betaVersion ? cBetaVersion() : uint64(AppVersion))) { updateThread = new QThread(); connect(updateThread, SIGNAL(finished()), updateThread, SLOT(deleteLater())); - updateDownloader = new UpdateDownloader(updateThread, m.captured(2)); + updateDownloader = new UpdateDownloader(updateThread, url); updateThread->start(); } } @@ -225,7 +231,7 @@ void Application::updateGotCurrent() { if (updates.exists()) { QFileInfoList list = updates.entryInfoList(QDir::Files); for (QFileInfoList::iterator i = list.begin(), e = list.end(); i != e; ++i) { - if (QRegularExpression("^(tupdate|tmacupd|tmac32upd|tlinuxupd|tlinux32upd)\\d+$", QRegularExpression::CaseInsensitiveOption).match(i->fileName()).hasMatch()) { + if (QRegularExpression("^(tupdate|tmacupd|tmac32upd|tlinuxupd|tlinux32upd)\\d+(_[a-z\\d]+)?$", QRegularExpression::CaseInsensitiveOption).match(i->fileName()).hasMatch()) { QFile(i->absoluteFilePath()).remove(); } } @@ -543,14 +549,15 @@ void Application::startUpdateCheck(bool forceWait) { updateCheckTimer.stop(); if (updateRequestId || updateThread || updateReply || !cAutoUpdate()) return; - int32 updateInSecs = cLastUpdateCheck() + UpdateDelayConstPart + (rand() % UpdateDelayRandPart) - unixtime(); - bool sendRequest = (updateInSecs <= 0 || updateInSecs > (UpdateDelayConstPart + UpdateDelayRandPart)); + int32 constDelay = cBetaVersion() ? 600 : UpdateDelayConstPart, randDelay = cBetaVersion() ? 300 : UpdateDelayRandPart; + int32 updateInSecs = cLastUpdateCheck() + constDelay + (rand() % randDelay) - unixtime(); + bool sendRequest = (updateInSecs <= 0 || updateInSecs > (constDelay + randDelay)); if (!sendRequest && !forceWait) { QDir updates(cWorkingDir() + "tupdates"); if (updates.exists()) { QFileInfoList list = updates.entryInfoList(QDir::Files); for (QFileInfoList::iterator i = list.begin(), e = list.end(); i != e; ++i) { - if (QRegularExpression("^(tupdate|tmacupd|tmac32upd|tlinuxupd|tlinux32upd)\\d+$", QRegularExpression::CaseInsensitiveOption).match(i->fileName()).hasMatch()) { + if (QRegularExpression("^(tupdate|tmacupd|tmac32upd|tlinuxupd|tlinux32upd)\\d+(_[a-z\\d]+)?$", QRegularExpression::CaseInsensitiveOption).match(i->fileName()).hasMatch()) { sendRequest = true; } } @@ -560,7 +567,9 @@ void Application::startUpdateCheck(bool forceWait) { if (sendRequest) { QUrl url(cUpdateURL()); - if (cDevVersion()) { + if (cBetaVersion()) { + url.setQuery(qsl("version=%1&beta=%2").arg(AppVersion).arg(cBetaVersion())); + } else if (cDevVersion()) { url.setQuery(qsl("version=%1&dev=1").arg(AppVersion)); } else { url.setQuery(qsl("version=%1").arg(AppVersion)); @@ -696,10 +705,10 @@ void Application::checkMapVersion() { if (Local::oldMapVersion() < AppVersion) { if (Local::oldMapVersion()) { QString versionFeatures; - if (cDevVersion() && Local::oldMapVersion() < 9011) { - versionFeatures = QString::fromUtf8("\xe2\x80\x94 Groups can now have multiple administrators with the ability to edit the name and logo, and add and remove members.\n\xe2\x80\x94 Groups that have reached their capacity of 200 users can be upgraded to supergroups of up to 1,000 members.\n\nWARNING: Only updated Telegram apps will be able to open supergroups. DO NOT upgrade your groups before the stable version is out and updates for other apps are released.");// .replace('@', qsl("@") + QChar(0x200D)); - } else if (Local::oldMapVersion() < 9013) { - versionFeatures = lng_new_version_text(lt_link, qsl("https://telegram.org/blog/supergroups")).trimmed(); + if (cDevVersion() && Local::oldMapVersion() < 9014) { + versionFeatures = QString::fromUtf8("\xe2\x80\x94 Sticker management: manually rearrange your sticker packs, pack order is now synced across all your devices\n\xe2\x80\x94 Click and hold on a sticker to preview it before sending\n\xe2\x80\x94 New context menu for chats in chats list\n\xe2\x80\x94 Support for all existing emoji");// .replace('@', qsl("@") + QChar(0x200D)); + } else if (Local::oldMapVersion() < 9015) { + versionFeatures = lang(lng_new_version_text).trimmed(); } else { versionFeatures = lang(lng_new_version_minor).trimmed(); } @@ -709,6 +718,9 @@ void Application::checkMapVersion() { } } } + if (cNeedConfigResave()) { + Local::writeUserSettings(); + } } void Application::startApp() { diff --git a/Telegram/SourceFiles/art/emoji.webp b/Telegram/SourceFiles/art/emoji.webp index 5676b5648..52c672556 100644 Binary files a/Telegram/SourceFiles/art/emoji.webp and b/Telegram/SourceFiles/art/emoji.webp differ diff --git a/Telegram/SourceFiles/art/emoji_125x.webp b/Telegram/SourceFiles/art/emoji_125x.webp index ac82c92c8..ae52f655c 100644 Binary files a/Telegram/SourceFiles/art/emoji_125x.webp and b/Telegram/SourceFiles/art/emoji_125x.webp differ diff --git a/Telegram/SourceFiles/art/emoji_150x.webp b/Telegram/SourceFiles/art/emoji_150x.webp index d40e59738..e15d52dd7 100644 Binary files a/Telegram/SourceFiles/art/emoji_150x.webp and b/Telegram/SourceFiles/art/emoji_150x.webp differ diff --git a/Telegram/SourceFiles/art/emoji_200x.webp b/Telegram/SourceFiles/art/emoji_200x.webp index c7a998a49..6149cc081 100644 Binary files a/Telegram/SourceFiles/art/emoji_200x.webp and b/Telegram/SourceFiles/art/emoji_200x.webp differ diff --git a/Telegram/SourceFiles/art/emoji_250x.webp b/Telegram/SourceFiles/art/emoji_250x.webp index f09e6b06e..9e1d62cae 100644 Binary files a/Telegram/SourceFiles/art/emoji_250x.webp and b/Telegram/SourceFiles/art/emoji_250x.webp differ diff --git a/Telegram/SourceFiles/art/sprite.png b/Telegram/SourceFiles/art/sprite.png index f984e7f41..b40fa3297 100644 Binary files a/Telegram/SourceFiles/art/sprite.png and b/Telegram/SourceFiles/art/sprite.png differ diff --git a/Telegram/SourceFiles/art/sprite_200x.png b/Telegram/SourceFiles/art/sprite_200x.png index b36d86425..05d810234 100644 Binary files a/Telegram/SourceFiles/art/sprite_200x.png and b/Telegram/SourceFiles/art/sprite_200x.png differ diff --git a/Telegram/SourceFiles/audio.cpp b/Telegram/SourceFiles/audio.cpp index 9bcb19641..433e549d3 100644 --- a/Telegram/SourceFiles/audio.cpp +++ b/Telegram/SourceFiles/audio.cpp @@ -270,7 +270,7 @@ void audioFinish() { } void AudioPlayer::Msg::clearData() { - fname = QString(); + file = FileLocation(); data = QByteArray(); position = duration = 0; frequency = AudioVoiceMsgFrequency; @@ -463,9 +463,9 @@ void AudioPlayer::play(const AudioMsgId &audio, int64 position) { current = &_audioData[_audioCurrent]; } current->audio = audio; - current->fname = audio.audio->already(true); + current->file = audio.audio->location(true); current->data = audio.audio->data; - if (current->fname.isEmpty() && current->data.isEmpty()) { + if (current->file.isEmpty() && current->data.isEmpty()) { setStoppedState(current, AudioPlayerStoppedAtError); onError(audio); } else { @@ -507,9 +507,9 @@ void AudioPlayer::play(const SongMsgId &song, int64 position) { current = &_songData[_songCurrent]; } current->song = song; - current->fname = song.song->already(true); + current->file = song.song->location(true); current->data = song.song->data; - if (current->fname.isEmpty() && current->data.isEmpty()) { + if (current->file.isEmpty() && current->data.isEmpty()) { setStoppedState(current); if (!song.song->loader) { DocumentOpenLink::doOpen(song.song); @@ -1076,13 +1076,17 @@ void AudioPlayerFader::resumeDevice() { class AudioPlayerLoader { public: - AudioPlayerLoader(const QString &fname, const QByteArray &data) : fname(fname), data(data), dataPos(0) { + AudioPlayerLoader(const FileLocation &file, const QByteArray &data) : file(file), access(false), data(data), dataPos(0) { } virtual ~AudioPlayerLoader() { + if (access) { + file.accessDisable(); + access = false; + } } - bool check(const QString &fname, const QByteArray &data) { - return this->fname == fname && this->data.size() == data.size(); + bool check(const FileLocation &file, const QByteArray &data) { + return this->file == file && this->data.size() == data.size(); } virtual bool open(qint64 position = 0) = 0; @@ -1093,7 +1097,8 @@ public: protected: - QString fname; + FileLocation file; + bool access; QByteArray data; QFile f; @@ -1102,9 +1107,16 @@ protected: bool openFile() { if (data.isEmpty()) { if (f.isOpen()) f.close(); - f.setFileName(fname); + if (!access) { + if (!file.accessEnable()) { + LOG(("Audio Error: could not open file access '%1', data size '%2', error %3, %4").arg(file.name()).arg(data.size()).arg(f.error()).arg(f.errorString())); + return false; + } + access = true; + } + f.setFileName(file.name()); if (!f.open(QIODevice::ReadOnly)) { - LOG(("Audio Error: could not open file '%1', data size '%2', error %3, %4").arg(fname).arg(data.size()).arg(f.error()).arg(f.errorString())); + LOG(("Audio Error: could not open file '%1', data size '%2', error %3, %4").arg(file.name()).arg(data.size()).arg(f.error()).arg(f.errorString())); return false; } } @@ -1121,7 +1133,7 @@ static const int32 _toChannels = 2; class FFMpegLoader : public AudioPlayerLoader { public: - FFMpegLoader(const QString &fname, const QByteArray &data) : AudioPlayerLoader(fname, data), + FFMpegLoader(const FileLocation &file, const QByteArray &data) : AudioPlayerLoader(file, data), freq(AudioVoiceMsgFrequency), fmt(AL_FORMAT_STEREO16), sampleSize(2 * sizeof(short)), srcRate(AudioVoiceMsgFrequency), dstRate(AudioVoiceMsgFrequency), maxResampleSamples(1024), dstSamplesData(0), len(0), @@ -1143,7 +1155,7 @@ public: } fmtContext = avformat_alloc_context(); if (!fmtContext) { - LOG(("Audio Error: Unable to avformat_alloc_context for file '%1', data size '%2'").arg(fname).arg(data.size())); + LOG(("Audio Error: Unable to avformat_alloc_context for file '%1', data size '%2'").arg(file.name()).arg(data.size())); return false; } fmtContext->pb = ioContext; @@ -1153,19 +1165,19 @@ public: if ((res = avformat_open_input(&fmtContext, 0, 0, 0)) < 0) { ioBuffer = 0; - LOG(("Audio Error: Unable to avformat_open_input for file '%1', data size '%2', error %3, %4").arg(fname).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); + LOG(("Audio Error: Unable to avformat_open_input for file '%1', data size '%2', error %3, %4").arg(file.name()).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); return false; } _opened = true; if ((res = avformat_find_stream_info(fmtContext, 0)) < 0) { - LOG(("Audio Error: Unable to avformat_find_stream_info for file '%1', data size '%2', error %3, %4").arg(fname).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); + LOG(("Audio Error: Unable to avformat_find_stream_info for file '%1', data size '%2', error %3, %4").arg(file.name()).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); return false; } streamId = av_find_best_stream(fmtContext, AVMEDIA_TYPE_AUDIO, -1, -1, &codec, 0); if (streamId < 0) { - LOG(("Audio Error: Unable to av_find_best_stream for file '%1', data size '%2', error %3, %4").arg(fname).arg(data.size()).arg(streamId).arg(av_make_error_string(err, sizeof(err), streamId))); + LOG(("Audio Error: Unable to av_find_best_stream for file '%1', data size '%2', error %3, %4").arg(file.name()).arg(data.size()).arg(streamId).arg(av_make_error_string(err, sizeof(err), streamId))); return false; } @@ -1173,7 +1185,7 @@ public: codecContext = fmtContext->streams[streamId]->codec; av_opt_set_int(codecContext, "refcounted_frames", 1, 0); if ((res = avcodec_open2(codecContext, codec, 0)) < 0) { - LOG(("Audio Error: Unable to avcodec_open2 for file '%1', data size '%2', error %3, %4").arg(fname).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); + LOG(("Audio Error: Unable to avcodec_open2 for file '%1', data size '%2', error %3, %4").arg(file.name()).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); return false; } @@ -1217,7 +1229,7 @@ public: if (sampleSize < 0) { swrContext = swr_alloc(); if (!swrContext) { - LOG(("Audio Error: Unable to swr_alloc for file '%1', data size '%2'").arg(fname).arg(data.size())); + LOG(("Audio Error: Unable to swr_alloc for file '%1', data size '%2'").arg(file.name()).arg(data.size())); return false; } int64_t src_ch_layout = layout, dst_ch_layout = _toChannelLayout; @@ -1233,7 +1245,7 @@ public: av_opt_set_sample_fmt(swrContext, "out_sample_fmt", dst_sample_fmt, 0); if ((res = swr_init(swrContext)) < 0) { - LOG(("Audio Error: Unable to swr_init for file '%1', data size '%2', error %3, %4").arg(fname).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); + LOG(("Audio Error: Unable to swr_init for file '%1', data size '%2', error %3, %4").arg(file.name()).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); return false; } @@ -1244,7 +1256,7 @@ public: maxResampleSamples = av_rescale_rnd(AVBlockSize / sampleSize, dstRate, srcRate, AV_ROUND_UP); if ((res = av_samples_alloc_array_and_samples(&dstSamplesData, 0, _toChannels, maxResampleSamples, _toFormat, 0)) < 0) { - LOG(("Audio Error: Unable to av_samples_alloc for file '%1', data size '%2', error %3, %4").arg(fname).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); + LOG(("Audio Error: Unable to av_samples_alloc for file '%1', data size '%2', error %3, %4").arg(file.name()).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); return false; } } @@ -1279,7 +1291,7 @@ public: if ((res = av_read_frame(fmtContext, &avpkt)) < 0) { if (res != AVERROR_EOF) { char err[AV_ERROR_MAX_STRING_SIZE] = { 0 }; - LOG(("Audio Error: Unable to av_read_frame() file '%1', data size '%2', error %3, %4").arg(fname).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); + LOG(("Audio Error: Unable to av_read_frame() file '%1', data size '%2', error %3, %4").arg(file.name()).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); } return -1; } @@ -1288,7 +1300,7 @@ public: int got_frame = 0; if ((res = avcodec_decode_audio4(codecContext, frame, &got_frame, &avpkt)) < 0) { char err[AV_ERROR_MAX_STRING_SIZE] = { 0 }; - LOG(("Audio Error: Unable to avcodec_decode_audio4() file '%1', data size '%2', error %3, %4").arg(fname).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); + LOG(("Audio Error: Unable to avcodec_decode_audio4() file '%1', data size '%2', error %3, %4").arg(file.name()).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); av_free_packet(&avpkt); if (res == AVERROR_INVALIDDATA) return 0; // try to skip bad packet @@ -1305,7 +1317,7 @@ public: if ((res = av_samples_alloc(dstSamplesData, 0, _toChannels, maxResampleSamples, _toFormat, 1)) < 0) { dstSamplesData[0] = 0; char err[AV_ERROR_MAX_STRING_SIZE] = { 0 }; - LOG(("Audio Error: Unable to av_samples_alloc for file '%1', data size '%2', error %3, %4").arg(fname).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); + LOG(("Audio Error: Unable to av_samples_alloc for file '%1', data size '%2', error %3, %4").arg(file.name()).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); av_free_packet(&avpkt); return -1; @@ -1313,7 +1325,7 @@ public: } if ((res = swr_convert(swrContext, dstSamplesData, dstSamples, (const uint8_t**)frame->extended_data, frame->nb_samples)) < 0) { char err[AV_ERROR_MAX_STRING_SIZE] = { 0 }; - LOG(("Audio Error: Unable to swr_convert for file '%1', data size '%2', error %3, %4").arg(fname).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); + LOG(("Audio Error: Unable to swr_convert for file '%1', data size '%2', error %3, %4").arg(file.name()).arg(data.size()).arg(res).arg(av_make_error_string(err, sizeof(err), res))); av_free_packet(&avpkt); return -1; @@ -1678,7 +1690,7 @@ AudioPlayerLoader *AudioPlayerLoaders::setupLoader(MediaOverviewType type, const return 0; } - if (*l && (!isGoodId || !(*l)->check(m->fname, m->data))) { + if (*l && (!isGoodId || !(*l)->check(m->file, m->data))) { delete *l; *l = 0; switch (type) { @@ -1693,23 +1705,23 @@ AudioPlayerLoader *AudioPlayerLoaders::setupLoader(MediaOverviewType type, const case OverviewDocuments: _song = *static_cast(objId); break; } - QByteArray header = m->data.mid(0, 8); - if (header.isEmpty()) { - QFile f(m->fname); - if (!f.open(QIODevice::ReadOnly)) { - LOG(("Audio Error: could not open file '%1'").arg(m->fname)); - m->state = AudioPlayerStoppedAtStart; - return 0; - } - header = f.read(8); - } - if (header.size() < 8) { - LOG(("Audio Error: could not read header from file '%1', data size %2").arg(m->fname).arg(m->data.isEmpty() ? QFileInfo(m->fname).size() : m->data.size())); - m->state = AudioPlayerStoppedAtStart; - return 0; - } +// QByteArray header = m->data.mid(0, 8); +// if (header.isEmpty()) { +// QFile f(m->fname); +// if (!f.open(QIODevice::ReadOnly)) { +// LOG(("Audio Error: could not open file '%1'").arg(m->fname)); +// m->state = AudioPlayerStoppedAtStart; +// return 0; +// } +// header = f.read(8); +// } +// if (header.size() < 8) { +// LOG(("Audio Error: could not read header from file '%1', data size %2").arg(m->fname).arg(m->data.isEmpty() ? QFileInfo(m->fname).size() : m->data.size())); +// m->state = AudioPlayerStoppedAtStart; +// return 0; +// } - *l = new FFMpegLoader(m->fname, m->data); + *l = new FFMpegLoader(m->file, m->data); int ret; if (!(*l)->open(position)) { @@ -1758,7 +1770,7 @@ AudioPlayer::Msg *AudioPlayerLoaders::checkLoader(MediaOverviewType type) { } if (!l || !m) return 0; - if (!isGoodId || !m->loading || !(*l)->check(m->fname, m->data)) { + if (!isGoodId || !m->loading || !(*l)->check(m->file, m->data)) { LOG(("Audio Error: playing changed while loading")); return 0; } @@ -2278,7 +2290,7 @@ void AudioCaptureInner::writeFrame(int32 offset, int32 framesize) { class FFMpegAttributesReader : public AudioPlayerLoader { public: - FFMpegAttributesReader(const QString &fname, const QByteArray &data) : AudioPlayerLoader(fname, data), + FFMpegAttributesReader(const FileLocation &file, const QByteArray &data) : AudioPlayerLoader(file, data), ioBuffer(0), ioContext(0), fmtContext(0), codec(0), streamId(0), _opened(false) { } @@ -2488,7 +2500,7 @@ private: }; MTPDocumentAttribute audioReadSongAttributes(const QString &fname, const QByteArray &data, QImage &cover, QByteArray &coverBytes, QByteArray &coverFormat) { - FFMpegAttributesReader reader(fname, data); + FFMpegAttributesReader reader(FileLocation(StorageFilePartial, fname), data); if (reader.open()) { int32 duration = reader.duration() / reader.frequency(); if (reader.duration() > 0) { diff --git a/Telegram/SourceFiles/audio.h b/Telegram/SourceFiles/audio.h index 97fa0c342..941323350 100644 --- a/Telegram/SourceFiles/audio.h +++ b/Telegram/SourceFiles/audio.h @@ -127,7 +127,7 @@ private: void clearData(); - QString fname; + FileLocation file; QByteArray data; int64 position, duration; int32 frequency; diff --git a/Telegram/SourceFiles/autoupdater.cpp b/Telegram/SourceFiles/autoupdater.cpp index 3f4910e0c..e438ae83d 100644 --- a/Telegram/SourceFiles/autoupdater.cpp +++ b/Telegram/SourceFiles/autoupdater.cpp @@ -269,7 +269,7 @@ void UpdateDownloader::unpackUpdate() { } if (RSA_verify(NID_sha1, (const uchar*)(compressed.constData() + hSigLen), hShaLen, (const uchar*)(compressed.constData()), hSigLen, pbKey) != 1) { // verify signature RSA_free(pbKey); - if (cDevVersion()) { // try other public key, if we are in dev version + if (cDevVersion() || cBetaVersion()) { // try other public key, if we are in dev or beta version pbKey = PEM_read_bio_RSAPublicKey(BIO_new_mem_buf(const_cast(DevVersion ? UpdatesPublicKey : UpdatesPublicDevKey), -1), 0, 0, 0); if (!pbKey) { LOG(("Update Error: cant read public rsa key!")); @@ -360,7 +360,19 @@ void UpdateDownloader::unpackUpdate() { LOG(("Update Error: cant read version from downloaded stream, status: %1").arg(stream.status())); return fatalFail(); } - if (int32(version) <= AppVersion) { + + quint64 betaVersion = 0; + if (version == 0x7FFFFFFF) { // beta version + stream >> betaVersion; + if (stream.status() != QDataStream::Ok) { + LOG(("Update Error: cant read beta version from downloaded stream, status: %1").arg(stream.status())); + return fatalFail(); + } + if (!cBetaVersion() || betaVersion <= cBetaVersion()) { + LOG(("Update Error: downloaded beta version %1 is not greater, than mine %2").arg(betaVersion).arg(cBetaVersion())); + return fatalFail(); + } + } else if (int32(version) <= AppVersion) { LOG(("Update Error: downloaded version %1 is not greater, than mine %2").arg(version).arg(AppVersion)); return fatalFail(); } @@ -430,8 +442,12 @@ void UpdateDownloader::unpackUpdate() { return fatalFail(); } fVersion.write((const char*)&versionNum, sizeof(VerInt)); - fVersion.write((const char*)&versionLen, sizeof(VerInt)); - fVersion.write((const char*)&versionStr[0], versionLen); + if (versionNum == 0x7FFFFFFF) { // beta version + fVersion.write((const char*)&betaVersion, sizeof(quint64)); + } else { + fVersion.write((const char*)&versionLen, sizeof(VerInt)); + fVersion.write((const char*)&versionStr[0], versionLen); + } fVersion.close(); } @@ -481,12 +497,24 @@ bool checkReadyUpdate() { UpdateDownloader::clearAll(); return false; } - fVersion.close(); - if (versionNum <= AppVersion) { + if (versionNum == 0x7FFFFFFF) { // beta version + quint64 betaVersion = 0; + if (fVersion.read((char*)&betaVersion, sizeof(quint64)) != sizeof(quint64)) { + LOG(("Update Error: cant read beta version from file '%1'").arg(versionPath)); + UpdateDownloader::clearAll(); + return false; + } + if (!cBetaVersion() || betaVersion <= cBetaVersion()) { + LOG(("Update Error: cant install beta version %1 having beta version %2").arg(betaVersion).arg(cBetaVersion())); + UpdateDownloader::clearAll(); + return false; + } + } else if (versionNum <= AppVersion) { LOG(("Update Error: cant install version %1 having version %2").arg(versionNum).arg(AppVersion)); UpdateDownloader::clearAll(); return false; } + fVersion.close(); } #ifdef Q_OS_WIN @@ -542,3 +570,47 @@ bool checkReadyUpdate() { } #endif + +QString countBetaVersionSignature(uint64 version) { // duplicated in packer.cpp + if (cBetaPrivateKey().isEmpty()) { + LOG(("Error: Trying to count beta version signature without beta private key!")); + return QString(); + } + + QByteArray signedData = (qstr("TelegramBeta_") + QString::number(version, 16).toLower()).toUtf8(); + + static const int32 shaSize = 20, keySize = 128; + + uchar sha1Buffer[shaSize]; + hashSha1(signedData.constData(), signedData.size(), sha1Buffer); // count sha1 + + uint32 siglen = 0; + + RSA *prKey = PEM_read_bio_RSAPrivateKey(BIO_new_mem_buf(const_cast(cBetaPrivateKey().constData()), -1), 0, 0, 0); + if (!prKey) { + LOG(("Error: Could not read beta private key!")); + return QString(); + } + if (RSA_size(prKey) != keySize) { + LOG(("Error: Bad beta private key size: %1").arg(RSA_size(prKey))); + RSA_free(prKey); + return QString(); + } + QByteArray signature; + signature.resize(keySize); + if (RSA_sign(NID_sha1, (const uchar*)(sha1Buffer), shaSize, (uchar*)(signature.data()), &siglen, prKey) != 1) { // count signature + LOG(("Error: Counting beta version signature failed!")); + RSA_free(prKey); + return QString(); + } + RSA_free(prKey); + + if (siglen != keySize) { + LOG(("Error: Bad beta version signature length: %1").arg(siglen)); + return QString(); + } + + signature = signature.toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); + signature = signature.replace('-', '8').replace('_', 'B'); + return QString::fromUtf8(signature.mid(19, 32)); +} diff --git a/Telegram/SourceFiles/autoupdater.h b/Telegram/SourceFiles/autoupdater.h index f8f7f8717..e2f2a9ac9 100644 --- a/Telegram/SourceFiles/autoupdater.h +++ b/Telegram/SourceFiles/autoupdater.h @@ -67,3 +67,5 @@ private: bool checkReadyUpdate(); #endif + +QString countBetaVersionSignature(uint64 version); diff --git a/Telegram/SourceFiles/boxes/aboutbox.cpp b/Telegram/SourceFiles/boxes/aboutbox.cpp index 11cf21899..ee2db425d 100644 --- a/Telegram/SourceFiles/boxes/aboutbox.cpp +++ b/Telegram/SourceFiles/boxes/aboutbox.cpp @@ -25,8 +25,13 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "mainwidget.h" #include "window.h" +#include "autoupdater.h" +#include "boxes/confirmbox.h" + +#include "application.h" + AboutBox::AboutBox() : AbstractBox(st::aboutWidth) -, _version(this, lng_about_version(lt_version, QString::fromWCharArray(AppVersionStr) + (cDevVersion() ? " dev" : "")), st::aboutVersionLink) +, _version(this, lng_about_version(lt_version, QString::fromWCharArray(AppVersionStr) + (cDevVersion() ? " dev" : "") + (cBetaVersion() ? qsl(" beta %1").arg(cBetaVersion()) : QString())), st::aboutVersionLink) , _text1(this, lang(lng_about_text_1), st::aboutLabel, st::aboutTextStyle) , _text2(this, lang(lng_about_text_2), st::aboutLabel, st::aboutTextStyle) , _text3(this, QString(), st::aboutLabel, st::aboutTextStyle) @@ -66,7 +71,23 @@ void AboutBox::resizeEvent(QResizeEvent *e) { } void AboutBox::onVersion() { - QDesktopServices::openUrl(qsl("https://desktop.telegram.org/?_hash=changelog")); + if (cRealBetaVersion()) { + QString url = qsl("https://tdesktop.com/"); + switch (cPlatform()) { + case dbipWindows: url += qsl("win/%1.zip"); break; + case dbipMac: url += qsl("mac/%1.zip"); break; + case dbipMacOld: url += qsl("mac32/%1.zip"); break; + case dbipLinux32: url += qsl("linux32/%1.tar.xz"); break; + case dbipLinux64: url += qsl("linux/%1.tar.xz"); break; + } + url = url.arg(qsl("tbeta%1_%2").arg(cRealBetaVersion()).arg(countBetaVersionSignature(cRealBetaVersion()))); + + App::app()->clipboard()->setText(url); + + App::showLayer(new InformBox("The link to the current private beta version of Telegram Desktop was copied to the clipboard.")); + } else { + QDesktopServices::openUrl(qsl("https://desktop.telegram.org/?_hash=changelog")); + } } void AboutBox::keyPressEvent(QKeyEvent *e) { diff --git a/Telegram/SourceFiles/boxes/contactsbox.cpp b/Telegram/SourceFiles/boxes/contactsbox.cpp index 8039c4784..a7827d193 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.cpp +++ b/Telegram/SourceFiles/boxes/contactsbox.cpp @@ -94,7 +94,7 @@ namespace { ContactsInner::ContactsInner(ChatData *chat, MembersFilter membersFilter) : TWidget() , _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) -, _newItemHeight((membersFilter == MembersFilterAdmins) ? (st::contactsNewItemHeight + st::contactsAboutHeight) : 0) +, _newItemHeight(0) , _newItemSel(false) , _chat(chat) , _channel(0) @@ -119,8 +119,11 @@ ContactsInner::ContactsInner(ChatData *chat, MembersFilter membersFilter) : TWid , _addContactLnk(this, lang(lng_add_contact_button)) , _saving(false) { initList(); - if (membersFilter == MembersFilterAdmins && !_contacts->list.count) { - App::api()->requestFullPeer(_chat); + if (membersFilter == MembersFilterAdmins) { + _newItemHeight = st::contactsNewItemHeight + qMax(_aboutAllAdmins.countHeight(_aboutWidth), _aboutAdmins.countHeight(_aboutWidth)) + st::contactsAboutHeight; + if (!_contacts->list.count) { + App::api()->requestFullPeer(_chat); + } } init(); } @@ -775,9 +778,9 @@ void ContactsInner::changeCheckState(ContactData *data, PeerData *peer) { int32 ContactsInner::selectedCount() const { int32 result = _selCount; if (_chat) { - result += (_chat->count > 0) ? _chat->count : 1; + result += qMax(_chat->count, 1); } else if (_channel) { - result += _already.size(); + result += qMax(_channel->count, _already.size()); } else if (_creating == CreatingGroupGroup) { result += 1; } @@ -1379,6 +1382,7 @@ void ContactsBox::init() { connect(&_scroll, SIGNAL(scrolled()), &_inner, SLOT(updateSel())); connect(&_scroll, SIGNAL(scrolled()), this, SLOT(onScroll())); connect(&_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate())); + connect(&_filter, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); connect(&_filterCancel, SIGNAL(clicked()), this, SLOT(onFilterCancel())); connect(&_inner, SIGNAL(mustScrollTo(int, int)), &_scroll, SLOT(scrollToY(int, int))); connect(&_inner, SIGNAL(selectAllQuery()), &_filter, SLOT(selectAll())); @@ -1500,14 +1504,12 @@ void ContactsBox::showDone() { _filter.setFocus(); } +void ContactsBox::onSubmit() { + _inner.chooseParticipant(); +} + void ContactsBox::keyPressEvent(QKeyEvent *e) { - if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) { - if (_filter.hasFocus()) { - _inner.chooseParticipant(); - } else { - ItemListBox::keyPressEvent(e); - } - } else if (_filter.hasFocus()) { + if (_filter.hasFocus()) { if (e->key() == Qt::Key_Down) { _inner.selectSkip(1); } else if (e->key() == Qt::Key_Up) { @@ -1770,7 +1772,10 @@ MembersInner::MembersInner(ChannelData *channel, MembersFilter filter) : TWidget , _kickRequestId(0) , _kickBox(0) , _loading(true) -, _loadingRequestId(0) { +, _loadingRequestId(0) +, _aboutWidth(st::boxWideWidth - st::contactsPadding.left() - st::contactsPadding.right()) +, _about(_aboutWidth) +, _aboutHeight(0) { connect(App::wnd(), SIGNAL(imageLoaded()), this, SLOT(update())); connect(App::main(), SIGNAL(peerNameChanged(PeerData*, const PeerData::Names&, const PeerData::NameFirstChars&)), this, SLOT(onPeerNameChanged(PeerData*, const PeerData::Names&, const PeerData::NameFirstChars&))); connect(App::main(), SIGNAL(peerPhotoChanged(PeerData*)), this, SLOT(peerUpdated(PeerData*))); @@ -1821,6 +1826,10 @@ void MembersInner::paintEvent(QPaintEvent *e) { paintDialog(p, _rows[from], data(from), sel, kickSel, kickDown); p.translate(0, _rowHeight); } + if (to == _rows.size() && _filter == MembersFilterRecent && (_rows.size() < _channel->count || _rows.size() >= cMaxGroupCount())) { + p.setPen(st::stickersReorderFg); + _about.draw(p, st::contactsPadding.left(), st::stickersReorderPadding.top(), _aboutWidth, style::al_center); + } } } @@ -1909,7 +1918,7 @@ void MembersInner::paintDialog(Painter &p, PeerData *peer, MemberData *data, boo } p.setFont(st::contactsStatusFont->f); - p.setPen(sel ? st::contactsStatusFgOver : (data->onlineColor ? st::contactsStatusFgOnline : st::contactsStatusFg)); + p.setPen(data->onlineColor ? st::contactsStatusFgOnline : (sel ? st::contactsStatusFgOver : st::contactsStatusFg)); p.drawTextLeft(namex, st::contactsPadding.top() + st::contactsStatusTop, width(), data->online); } @@ -1992,8 +2001,14 @@ void MembersInner::chooseParticipant() { void MembersInner::refresh() { if (_rows.isEmpty()) { resize(width(), st::membersPadding.top() + st::noContactsHeight + st::membersPadding.bottom()); + _aboutHeight = 0; } else { - resize(width(), st::membersPadding.top() + _newItemHeight + _rows.size() * _rowHeight + st::membersPadding.bottom()); + _about.setText(st::boxTextFont, lng_channel_only_last_shown(lt_count, _rows.size())); + _aboutHeight = st::stickersReorderPadding.top() + _about.countHeight(_aboutWidth) + st::stickersReorderPadding.bottom(); + if (_filter != MembersFilterRecent || (_rows.size() >= _channel->count && _rows.size() < cMaxGroupCount())) { + _aboutHeight = 0; + } + resize(width(), st::membersPadding.top() + _newItemHeight + _rows.size() * _rowHeight + st::membersPadding.bottom() + _aboutHeight); } update(); } @@ -2228,6 +2243,7 @@ void MembersInner::removeKicked() { --_channel->adminsCount; if (App::main()) emit App::main()->peerUpdated(_channel); } + refresh(); } _kickConfirm = 0; } diff --git a/Telegram/SourceFiles/boxes/contactsbox.h b/Telegram/SourceFiles/boxes/contactsbox.h index 994c547c7..540f35b40 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.h +++ b/Telegram/SourceFiles/boxes/contactsbox.h @@ -216,6 +216,8 @@ public slots: void onCreate(); void onSaveAdmins(); + void onSubmit(); + bool onSearchByUsername(bool searchCache = false); void onNeedSearchByUsername(); @@ -386,6 +388,10 @@ private: MemberRoles _roles; MemberDatas _datas; + int32 _aboutWidth; + Text _about; + int32 _aboutHeight; + QPoint _lastMousePos; }; diff --git a/Telegram/SourceFiles/boxes/downloadpathbox.cpp b/Telegram/SourceFiles/boxes/downloadpathbox.cpp index f9a53d54c..b5d7f5d58 100644 --- a/Telegram/SourceFiles/boxes/downloadpathbox.cpp +++ b/Telegram/SourceFiles/boxes/downloadpathbox.cpp @@ -25,15 +25,17 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "downloadpathbox.h" #include "gui/filedialog.h" +#include "pspecific.h" -DownloadPathBox::DownloadPathBox() : - _path(cDownloadPath()), - _default(this, qsl("dir_type"), 0, lang(lng_download_path_default_radio), _path.isEmpty()), - _temp(this, qsl("dir_type"), 1, lang(lng_download_path_temp_radio), _path == qsl("tmp")), - _dir(this, qsl("dir_type"), 2, lang(lng_download_path_dir_radio), !_path.isEmpty() && _path != qsl("tmp")), - _pathLink(this, QString(), st::defaultBoxLinkButton), - _save(this, lang(lng_connection_save), st::defaultBoxButton), - _cancel(this, lang(lng_cancel), st::cancelBoxButton) { +DownloadPathBox::DownloadPathBox() : AbstractBox() +, _path(cDownloadPath()) +, _pathBookmark(cDownloadPathBookmark()) +, _default(this, qsl("dir_type"), 0, lang(lng_download_path_default_radio), _path.isEmpty()) +, _temp(this, qsl("dir_type"), 1, lang(lng_download_path_temp_radio), _path == qsl("tmp")) +, _dir(this, qsl("dir_type"), 2, lang(lng_download_path_dir_radio), !_path.isEmpty() && _path != qsl("tmp")) +, _pathLink(this, QString(), st::defaultBoxLinkButton) +, _save(this, lang(lng_connection_save), st::defaultBoxButton) +, _cancel(this, lang(lng_cancel), st::cancelBoxButton) { connect(&_save, SIGNAL(clicked()), this, SLOT(onSave())); connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); @@ -124,12 +126,13 @@ void DownloadPathBox::onChange() { void DownloadPathBox::onEditPath() { filedialogInit(); QString path, lastPath = cDialogLastPath(); - if (!cDownloadPath().isEmpty()) { - cSetDialogLastPath(cDownloadPath()); + if (!cDownloadPath().isEmpty() && cDownloadPath() != qstr("tmp")) { + cSetDialogLastPath(cDownloadPath().left(cDownloadPath().size() - (cDownloadPath().endsWith('/') ? 1 : 0))); } if (filedialogGetDir(path, lang(lng_download_path_choose))) { if (!path.isEmpty()) { _path = path + '/'; + _pathBookmark = psDownloadPathBookmark(_path); setPathText(QDir::toNativeSeparators(_path)); } } @@ -138,6 +141,7 @@ void DownloadPathBox::onEditPath() { void DownloadPathBox::onSave() { cSetDownloadPath(_default.checked() ? QString() : (_temp.checked() ? qsl("tmp") : _path)); + cSetDownloadPathBookmark((_default.checked() || _temp.checked()) ? QByteArray() : _pathBookmark); Local::writeUserSettings(); emit closed(); } diff --git a/Telegram/SourceFiles/boxes/downloadpathbox.h b/Telegram/SourceFiles/boxes/downloadpathbox.h index 2b0432f24..c4a335e30 100644 --- a/Telegram/SourceFiles/boxes/downloadpathbox.h +++ b/Telegram/SourceFiles/boxes/downloadpathbox.h @@ -47,6 +47,7 @@ private: void setPathText(const QString &text); QString _path; + QByteArray _pathBookmark; Radiobutton _default, _temp, _dir; LinkButton _pathLink; diff --git a/Telegram/SourceFiles/boxes/photosendbox.cpp b/Telegram/SourceFiles/boxes/photosendbox.cpp index 323617806..177520701 100644 --- a/Telegram/SourceFiles/boxes/photosendbox.cpp +++ b/Telegram/SourceFiles/boxes/photosendbox.cpp @@ -125,7 +125,11 @@ PhotoSendBox::PhotoSendBox(const QString &phone, const QString &fname, const QSt , _compressed(this, lang(lng_send_image_compressed), true) , _send(this, lang(lng_send_button), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, _phone(phone), _fname(fname), _lname(lname), _replyTo(replyTo) { +, _phone(phone) +, _fname(fname) +, _lname(lname) +, _replyTo(replyTo) +, _confirmed(false) { connect(&_send, SIGNAL(clicked()), this, SLOT(onSend())); connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); diff --git a/Telegram/SourceFiles/boxes/stickersetbox.cpp b/Telegram/SourceFiles/boxes/stickersetbox.cpp index a0ab14ccd..cfa0790d3 100644 --- a/Telegram/SourceFiles/boxes/stickersetbox.cpp +++ b/Telegram/SourceFiles/boxes/stickersetbox.cpp @@ -38,7 +38,6 @@ _input(set), _installRequest(0) { case mtpc_inputStickerSetShortName: _setShortName = qs(set.c_inputStickerSetShortName().vshort_name); break; } MTP::send(MTPmessages_GetStickerSet(_input), rpcDone(&StickerSetInner::gotSet), rpcFail(&StickerSetInner::failedSet)); - cSetLastStickersUpdate(0); App::main()->updateStickers(); } @@ -56,7 +55,7 @@ void StickerSetInner::gotSet(const MTPmessages_StickerSet &set) { } if (d.vset.type() == mtpc_stickerSet) { const MTPDstickerSet &s(d.vset.c_stickerSet()); - _setTitle = qs(s.vtitle); + _setTitle = stickerSetTitle(s); _title = st::boxTitleFont->elided(_setTitle, width() - st::boxTitlePosition.x() - st::boxTitleHeight); _setShortName = qs(s.vshort_name); _setId = s.vid.v; @@ -91,23 +90,14 @@ bool StickerSetInner::failedSet(const RPCError &error) { void StickerSetInner::installDone(const MTPBool &result) { StickerSets &sets(cRefStickerSets()); + _setFlags &= ~MTPDstickerSet::flag_disabled; sets.insert(_setId, StickerSet(_setId, _setAccess, _setTitle, _setShortName, _setCount, _setHash, _setFlags)).value().stickers = _pack; - int32 insertAtIndex = 0; StickerSetsOrder &order(cRefStickerSetsOrder()); - for (int32 s = order.size(); insertAtIndex < s; ++insertAtIndex) { - StickerSets::const_iterator i = sets.constFind(order.at(insertAtIndex)); - if (i == sets.cend() || !(i->flags & MTPDstickerSet::flag_official)) { - break; - } - } - int32 currentIndex = cStickerSetsOrder().indexOf(_setId); + int32 insertAtIndex = 0, currentIndex = order.indexOf(_setId); if (currentIndex != insertAtIndex) { if (currentIndex > 0) { order.removeAt(currentIndex); - if (currentIndex < insertAtIndex) { - --insertAtIndex; - } } order.insert(insertAtIndex, _setId); } @@ -115,13 +105,14 @@ void StickerSetInner::installDone(const MTPBool &result) { StickerSets::iterator custom = sets.find(CustomStickerSetId); if (custom != sets.cend()) { for (int32 i = 0, l = _pack.size(); i < l; ++i) { - custom->stickers.removeOne(_pack.at(i)); + int32 removeIndex = custom->stickers.indexOf(_pack.at(i)); + if (removeIndex >= 0) custom->stickers.removeAt(removeIndex); } if (custom->stickers.isEmpty()) { sets.erase(custom); } } - cSetStickersHash(QByteArray()); + cSetStickersHash(stickersCountHash()); Local::writeStickers(); emit installed(_setId); App::wnd()->hideLayer(); @@ -195,7 +186,10 @@ bool StickerSetInner::loaded() const { } int32 StickerSetInner::notInstalled() const { - return (_loaded && (cStickerSets().constFind(_setId) == cStickerSets().cend())) ? _pack.size() : 0; + if (!_loaded) return 0; + StickerSets::const_iterator it = cStickerSets().constFind(_setId); + if (it == cStickerSets().cend() || (it->flags & MTPDstickerSet::flag_disabled)) return _pack.size(); + return 0; } bool StickerSetInner::official() const { @@ -285,16 +279,16 @@ void StickerSetBox::showAll() { int32 cnt = _inner.notInstalled(); if (_inner.loaded()) { _shadow.show(); - if (_inner.official()) { - _add.hide(); - _share.hide(); - _cancel.hide(); - _done.show(); - } else if (_inner.notInstalled()) { + if (_inner.notInstalled()) { _add.show(); _cancel.show(); _share.hide(); _done.hide(); + } else if (_inner.official()) { + _add.hide(); + _share.hide(); + _cancel.hide(); + _done.show(); } else { _share.show(); _cancel.show(); @@ -334,3 +328,625 @@ void StickerSetBox::resizeEvent(QResizeEvent *e) { _cancel.moveToRight(st::boxButtonPadding.right() + _add.width() + st::boxButtonPadding.left(), _add.y()); } } + +StickersInner::StickersInner() : TWidget() +, _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) +, _aboveShadowFadeStart(0) +, _aboveShadowFadeOpacity(0, 0) +, _a_shifting(animFunc(this, &StickersInner::animStep_shifting)) +, _itemsTop(st::membersPadding.top()) +, _saving(false) +, _removeSel(-1) +, _removeDown(-1) +, _removeWidth(st::normalFont->width(lang(lng_stickers_remove))) +, _returnWidth(st::normalFont->width(lang(lng_stickers_return))) +, _restoreWidth(st::normalFont->width(lang(lng_stickers_restore))) +, _selected(-1) +, _started(-1) +, _dragging(-1) +, _above(-1) +, _aboveShadow(st::boxShadow) +, _scrollbar(0) { + connect(App::wnd(), SIGNAL(imageLoaded()), this, SLOT(update())); + setMouseTracking(true); +} + +void StickersInner::paintEvent(QPaintEvent *e) { + QRect r(e->rect()); + Painter p(this); + + updateAnimatedValues(); + + p.fillRect(r, st::white); + p.setClipRect(r); + if (_rows.isEmpty()) { + p.setFont(st::noContactsFont->f); + p.setPen(st::noContactsColor->p); + p.drawText(QRect(0, 0, width(), st::noContactsHeight), lang(lng_contacts_loading), style::al_center); + } else { + p.translate(0, _itemsTop); + + int32 yFrom = r.y() - _itemsTop, yTo = r.y() + r.height() - _itemsTop; + int32 from = floorclamp(yFrom - _rowHeight, _rowHeight, 0, _rows.size()); + int32 to = ceilclamp(yTo + _rowHeight, _rowHeight, 0, _rows.size()); + p.translate(0, from * _rowHeight); + for (int32 i = from; i < to; ++i) { + if (i != _above) { + paintRow(p, i); + } + p.translate(0, _rowHeight); + } + if (from <= _above && _above < to) { + p.translate(0, (_above - to) * _rowHeight); + paintRow(p, _above); + } + } +} + +void StickersInner::paintRow(Painter &p, int32 index) { + const StickerSetRow *s(_rows.at(index)); + + int32 xadd = 0, yadd = s->yadd.current(); + if (xadd || yadd) p.translate(xadd, yadd); + + bool removeSel = (index == _removeSel && (_removeDown < 0 || index == _removeDown)); + bool removeDown = removeSel && (index == _removeDown); + + p.setFont((removeSel ? st::linkOverFont : st::linkFont)->f); + if (removeDown) { + p.setPen(st::btnDefLink.downColor->p); + } else { + p.setPen(st::btnDefLink.color->p); + } + int32 remWidth = s->disabled ? (s->official ? _restoreWidth : _returnWidth) : _removeWidth; + QString remText = lang(s->disabled ? (s->official ? lng_stickers_restore : lng_stickers_return) : lng_stickers_remove); + p.drawTextRight(st::contactsPadding.right() + st::contactsCheckPosition.x(), st::contactsPadding.top() + (st::contactsPhotoSize - st::normalFont->height) / 2, width(), remText, remWidth); + + if (index == _above) { + float64 current = _aboveShadowFadeOpacity.current(); + if (_started >= 0) { + float64 o = aboveShadowOpacity(); + if (o > current) { + _aboveShadowFadeOpacity = anim::fvalue(o, o); + current = o; + } + } + p.setOpacity(current); + QRect row(myrtlrect(_aboveShadow.getDimensions(st::boxShadowShift).left(), st::contactsPadding.top() / 2, width() - (st::contactsPadding.left() / 2) - _scrollbar - _aboveShadow.getDimensions(st::boxShadowShift).right(), _rowHeight - ((st::contactsPadding.top() + st::contactsPadding.bottom()) / 2))); + _aboveShadow.paint(p, row, st::boxShadowShift); + p.fillRect(row, st::white); + p.setOpacity(1); + } + + if (s->disabled) p.setOpacity(st::stickersRowDisabledOpacity); + if (s->sticker) { + s->sticker->thumb->load(); + QPixmap pix(s->sticker->thumb->pix(s->pixw, s->pixh)); + p.drawPixmapLeft(st::contactsPadding.left() + (st::contactsPhotoSize - s->pixw) / 2, st::contactsPadding.top() + (st::contactsPhotoSize - s->pixh) / 2, width(), pix); + } + p.setFont(st::contactsNameFont); + p.setPen(st::black); + + int32 namex = st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(); + p.drawTextLeft(namex, st::contactsPadding.top() + st::contactsNameTop, width(), s->title); + + p.setFont(st::contactsStatusFont); + p.setPen(st::contactsStatusFg); + p.drawTextLeft(namex, st::contactsPadding.top() + st::contactsStatusTop, width(), lng_stickers_count(lt_count, s->count)); + + p.setOpacity(1); + if (xadd || yadd) p.translate(-xadd, -yadd); +} + +void StickersInner::mousePressEvent(QMouseEvent *e) { + if (_saving) return; + if (_dragging >= 0) mouseReleaseEvent(e); + _mouse = e->globalPos(); + onUpdateSelected(); + if (_removeSel >= 0) { + _removeDown = _removeSel; + update(0, _itemsTop + _removeSel * _rowHeight, width(), _rowHeight); + } else if (_selected >= 0) { + _above = _dragging = _started = _selected; + _dragStart = mapFromGlobal(_mouse); + } +} + +void StickersInner::mouseMoveEvent(QMouseEvent *e) { + if (_saving) return; + _mouse = e->globalPos(); + onUpdateSelected(); +} + +void StickersInner::onUpdateSelected() { + if (_saving) return; + QPoint local(mapFromGlobal(_mouse)); + if (_dragging >= 0) { + int32 shift = 0; + uint64 ms = getms(); + if (_dragStart.y() > local.y() && _dragging > 0) { + shift = -floorclamp(_dragStart.y() - local.y() + (_rowHeight / 2), _rowHeight, 0, _dragging); + for (int32 from = _dragging, to = _dragging + shift; from > to; --from) { + qSwap(_rows[from], _rows[from - 1]); + _rows.at(from)->yadd = anim::ivalue(_rows.at(from)->yadd.current() - _rowHeight, 0); + _animStartTimes[from] = ms; + } + } else if (_dragStart.y() < local.y() && _dragging + 1 < _rows.size()) { + shift = floorclamp(local.y() - _dragStart.y() + (_rowHeight / 2), _rowHeight, 0, _rows.size() - _dragging - 1); + for (int32 from = _dragging, to = _dragging + shift; from < to; ++from) { + qSwap(_rows[from], _rows[from + 1]); + _rows.at(from)->yadd = anim::ivalue(_rows.at(from)->yadd.current() + _rowHeight, 0); + _animStartTimes[from] = ms; + } + } + if (shift) { + _dragging += shift; + _above = _dragging; + _dragStart.setY(_dragStart.y() + shift * _rowHeight); + if (!_a_shifting.animating()) { + _a_shifting.start(); + } + } + _rows.at(_dragging)->yadd = anim::ivalue(local.y() - _dragStart.y(), local.y() - _dragStart.y()); + _animStartTimes[_dragging] = 0; + updateAnimatedRegions(); + + emit checkDraggingScroll(local.y()); + } else { + bool in = rect().marginsRemoved(QMargins(0, _itemsTop, 0, st::membersPadding.bottom())).contains(local); + _selected = in ? floorclamp(local.y() - _itemsTop, _rowHeight, 0, _rows.size() - 1) : -1; + int32 removeSel = -1; + + if (_selected >= 0) { + int32 remw = _rows.at(_selected)->disabled ? (_rows.at(_selected)->official ? _restoreWidth : _returnWidth) : _removeWidth; + QRect rem(myrtlrect(width() - st::contactsPadding.right() - st::contactsCheckPosition.x() - remw, st::contactsPadding.top() + (st::contactsPhotoSize - st::normalFont->height) / 2, remw, st::normalFont->height)); + removeSel = rem.contains(local.x(), local.y() - _itemsTop - _selected * _rowHeight) ? _selected : -1; + } + setRemoveSel(removeSel); + emit noDraggingScroll(); + } +} + +float64 StickersInner::aboveShadowOpacity() const { + if (_above < 0) return 0; + + int32 dx = 0; + int32 dy = qAbs(_above * _rowHeight + _rows.at(_above)->yadd.current() - _started * _rowHeight); + return qMin((dx + dy) * 2. / _rowHeight, 1.); +} + +void StickersInner::mouseReleaseEvent(QMouseEvent *e) { + if (_saving) return; + _mouse = e->globalPos(); + onUpdateSelected(); + if (_removeDown == _removeSel && _removeSel >= 0) { + _rows[_removeDown]->disabled = !_rows[_removeDown]->disabled; + } else if (_dragging >= 0) { + QPoint local(mapFromGlobal(_mouse)); + _rows[_dragging]->yadd.start(0); + _aboveShadowFadeStart = _animStartTimes[_dragging] = getms(); + _aboveShadowFadeOpacity = anim::fvalue(aboveShadowOpacity(), 0); + if (!_a_shifting.animating()) { + _a_shifting.start(); + } + + _dragging = _started = -1; + } + if (_removeDown >= 0) { + update(0, _itemsTop + _removeDown * _rowHeight, width(), _rowHeight); + _removeDown = -1; + } +} + +void StickersInner::updateAnimatedRegions() { + int32 updateMin = -1, updateMax = 0; + for (int32 i = 0, l = _animStartTimes.size(); i < l; ++i) { + if (_animStartTimes.at(i)) { + if (updateMin < 0) updateMin = i; + updateMax = i; + } + } + if (_aboveShadowFadeStart) { + if (updateMin < 0 || updateMin > _above) updateMin = _above; + if (updateMax < _above) updateMin = _above; + } + if (_dragging >= 0) { + if (updateMin < 0 || updateMin > _dragging) updateMin = _dragging; + if (updateMax < _dragging) updateMax = _dragging; + } + if (updateMin >= 0) { + update(0, _itemsTop + _rowHeight * (updateMin - 1), width(), _rowHeight * (updateMax - updateMin + 3)); + } +} + +bool StickersInner::updateAnimatedValues() { + bool animating = false; + uint64 ms = getms(); + for (int32 i = 0, l = _animStartTimes.size(); i < l; ++i) { + uint64 start = _animStartTimes.at(i); + if (start) { + if (start + st::stickersRowDuration > ms && ms >= start) { + _rows.at(i)->yadd.update((ms - start) / st::stickersRowDuration, anim::sineInOut); + animating = true; + } else { + _rows.at(i)->yadd.finish(); + _animStartTimes[i] = 0; + } + } + } + if (_aboveShadowFadeStart) { + if (_aboveShadowFadeStart + st::stickersRowDuration > ms && ms > _aboveShadowFadeStart) { + _aboveShadowFadeOpacity.update((ms - _aboveShadowFadeStart) / st::stickersRowDuration, anim::sineInOut); + animating = true; + } else { + _aboveShadowFadeOpacity.finish(); + _aboveShadowFadeStart = 0; + } + } + return animating; +} + +bool StickersInner::animStep_shifting(float64) { + updateAnimatedRegions(); + + bool animating = updateAnimatedValues(); + if (!animating) { + _above = _dragging; + } + return animating; +} + +void StickersInner::clear() { + for (int32 i = 0, l = _rows.size(); i < l; ++i) { + delete _rows.at(i); + } + _rows.clear(); + _animStartTimes.clear(); + _aboveShadowFadeStart = 0; + _aboveShadowFadeOpacity = anim::fvalue(0, 0); + _a_shifting.stop(); + _above = _dragging = _started = -1; + _selected = -1; + _removeDown = -1; + setRemoveSel(-1); + update(); +} + +void StickersInner::setRemoveSel(int32 removeSel) { + if (removeSel != _removeSel) { + if (_removeSel >= 0) update(0, _itemsTop + _removeSel * _rowHeight, width(), _rowHeight); + _removeSel = removeSel; + if (_removeSel >= 0) update(0, _itemsTop + _removeSel * _rowHeight, width(), _rowHeight); + setCursor((_removeSel >= 0 && (_removeDown < 0 || _removeDown == _removeSel)) ? style::cur_pointer : style::cur_default); + } +} + +void StickersInner::rebuild() { + QList rows, rowsDisabled; + + int32 namex = st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(); + int32 namew = st::boxWideWidth - namex - st::contactsPadding.right() - st::contactsCheckPosition.x() - qMax(qMax(_returnWidth, _removeWidth), _restoreWidth); + + clear(); + const StickerSetsOrder &order(cStickerSetsOrder()); + _animStartTimes.reserve(order.size()); + + const StickerSets &sets(cStickerSets()); + for (int32 i = 0, l = order.size(); i < l; ++i) { + StickerSets::const_iterator it = sets.constFind(order.at(i)); + if (it != sets.cend()) { + bool disabled = (it->flags & MTPDstickerSet::flag_disabled); + + DocumentData *sticker = it->stickers.isEmpty() ? 0 : it->stickers.at(0); + int32 pixw = 0, pixh = 0; + if (sticker) { + pixw = sticker->thumb->width(); + pixh = sticker->thumb->height(); + if (pixw > st::contactsPhotoSize) { + if (pixw > pixh) { + pixh = (pixh * st::contactsPhotoSize) / pixw; + pixw = st::contactsPhotoSize; + } else { + pixw = (pixw * st::contactsPhotoSize) / pixh; + pixh = st::contactsPhotoSize; + } + } else if (pixh > st::contactsPhotoSize) { + pixw = (pixw * st::contactsPhotoSize) / pixh; + pixh = st::contactsPhotoSize; + } + } + QString title = it->title; + int32 titleWidth = st::contactsNameFont->width(title); + if (titleWidth > namew) { + title = st::contactsNameFont->elided(title, namew); + } + bool official = (it->flags & MTPDstickerSet::flag_official); + (disabled ? rowsDisabled : rows).push_back(new StickerSetRow(it->id, sticker, it->stickers.size(), title, official, disabled, pixw, pixh)); + _animStartTimes.push_back(0); + if (it->stickers.isEmpty() || (it->flags & MTPDstickerSet_flag_NOT_LOADED)) { + App::api()->scheduleStickerSetRequest(it->id, it->access); + } + } + } + App::api()->requestStickerSets(); + _rows = rows + rowsDisabled; + resize(width(), _itemsTop + _rows.size() * _rowHeight + st::membersPadding.bottom()); +} + +QVector StickersInner::getOrder() const { + QVector result; + result.reserve(_rows.size()); + for (int32 i = 0, l = _rows.size(); i < l; ++i) { + if (_rows.at(i)->disabled) { + StickerSets::const_iterator it = cStickerSets().constFind(_rows.at(i)->id); + if (it == cStickerSets().cend() || !(it->flags & MTPDstickerSet::flag_official)) { + continue; + } + } + result.push_back(_rows.at(i)->id); + } + return result; +} + +QVector StickersInner::getDisabledSets() const { + QVector result; + result.reserve(_rows.size()); + for (int32 i = 0, l = _rows.size(); i < l; ++i) { + if (_rows.at(i)->disabled) { + result.push_back(_rows.at(i)->id); + } + } + return result; +} + +void StickersInner::setVisibleScrollbar(int32 width) { + _scrollbar = width; +} + +StickersInner::~StickersInner() { + clear(); +} + +StickersBox::StickersBox() : ItemListBox(st::boxScroll) +, _save(this, lang(lng_settings_save), st::defaultBoxButton) +, _cancel(this, lang(lng_cancel), st::cancelBoxButton) +, _reorderRequest(0) +, _topShadow(this, st::contactsAboutShadow) +, _bottomShadow(this) +, _scrollDelta(0) +, _aboutWidth(st::boxWideWidth - st::contactsPadding.left() - st::contactsPhotoSize - st::contactsPadding.left() - st::contactsPadding.right()) +, _about(st::boxTextFont, lang(lng_stickers_reorder), _defaultOptions, _aboutWidth) +, _aboutHeight(st::stickersReorderPadding.top() + _about.countHeight(_aboutWidth) + st::stickersReorderPadding.bottom()) { + ItemListBox::init(&_inner, st::boxButtonPadding.top() + _save.height() + st::boxButtonPadding.bottom(), st::boxTitleHeight + _aboutHeight); + setMaxHeight(snap(countHeight(), int32(st::sessionsHeight), int32(st::boxMaxListHeight))); + + connect(App::main(), SIGNAL(stickersUpdated()), this, SLOT(onStickersUpdated())); + + connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); + connect(&_save, SIGNAL(clicked()), this, SLOT(onSave())); + + connect(&_inner, SIGNAL(checkDraggingScroll(int)), this, SLOT(onCheckDraggingScroll(int))); + connect(&_inner, SIGNAL(noDraggingScroll()), this, SLOT(onNoDraggingScroll())); + connect(&_scroll, SIGNAL(scrolled()), &_inner, SLOT(onUpdateSelected())); + connect(&_scrollTimer, SIGNAL(timeout()), this, SLOT(onScrollTimer())); + _scrollTimer.setSingleShot(false); + + onStickersUpdated(); + + prepare(); +} + +int32 StickersBox::countHeight() const { + return st::boxTitleHeight + _aboutHeight + _inner.height() + st::boxButtonPadding.top() + _save.height() + st::boxButtonPadding.bottom(); +} + +void StickersBox::disenableDone(const MTPBool & result, mtpRequestId req) { + _disenableRequests.remove(req); + if (_disenableRequests.isEmpty()) { + saveOrder(); + } +} + +bool StickersBox::disenableFail(const RPCError &error, mtpRequestId req) { + if (mtpIsFlood(error)) return false; + _disenableRequests.remove(req); + if (_disenableRequests.isEmpty()) { + saveOrder(); + } + return true; +} + +void StickersBox::saveOrder() { + QVector order = _inner.getOrder(); + if (order.size() > 1) { + QVector mtpOrder; + mtpOrder.reserve(order.size()); + for (int32 i = 0, l = order.size(); i < l; ++i) { + mtpOrder.push_back(MTP_long(order.at(i))); + } + _reorderRequest = MTP::send(MTPmessages_ReorderStickerSets(MTP_vector(mtpOrder)), rpcDone(&StickersBox::reorderDone), rpcFail(&StickersBox::reorderFail)); + } else { + reorderDone(MTP_boolTrue()); + } +} + +void StickersBox::reorderDone(const MTPBool &result) { + _reorderRequest = 0; + onClose(); +} + +bool StickersBox::reorderFail(const RPCError &result) { + if (mtpIsFlood(result)) return false; + _reorderRequest = 0; + cSetLastStickersUpdate(0); + App::main()->updateStickers(); + onClose(); + return true; +} + +void StickersBox::paintEvent(QPaintEvent *e) { + Painter p(this); + if (paint(p)) return; + + paintTitle(p, lang(lng_stickers_packs)); + p.translate(0, st::boxTitleHeight); + + p.fillRect(0, 0, width(), _aboutHeight, st::contactsAboutBg); + p.setPen(st::stickersReorderFg); + _about.drawLeft(p, st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(), st::stickersReorderPadding.top(), _aboutWidth, width()); +} + +void StickersBox::closePressed() { + if (!_disenableRequests.isEmpty()) { + for (QMap::const_iterator i = _disenableRequests.cbegin(), e = _disenableRequests.cend(); i != e; ++i) { + MTP::cancel(i.key()); + } + _disenableRequests.clear(); + cSetLastStickersUpdate(0); + App::main()->updateStickers(); + } else if (_reorderRequest) { + MTP::cancel(_reorderRequest); + _reorderRequest = 0; + cSetLastStickersUpdate(0); + App::main()->updateStickers(); + } +} + +void StickersBox::resizeEvent(QResizeEvent *e) { + ItemListBox::resizeEvent(e); + _save.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _save.height()); + _cancel.moveToRight(st::boxButtonPadding.right() + _save.width() + st::boxButtonPadding.left(), _save.y()); + _inner.resize(width(), _inner.height()); + _topShadow.setGeometry(0, st::boxTitleHeight + _aboutHeight, width(), st::lineWidth); + _bottomShadow.setGeometry(0, height() - st::boxButtonPadding.bottom() - _save.height() - st::boxButtonPadding.top() - st::lineWidth, width(), st::lineWidth); + _inner.setVisibleScrollbar((_scroll.scrollTopMax() > 0) ? (st::boxScroll.width - st::boxScroll.deltax) : 0); +} + +void StickersBox::onStickersUpdated() { + _inner.rebuild(); + setMaxHeight(snap(countHeight(), int32(st::sessionsHeight), int32(st::boxMaxListHeight))); + _inner.setVisibleScrollbar((_scroll.scrollTopMax() > 0) ? (st::boxScroll.width - st::boxScroll.deltax) : 0); +} + +void StickersBox::onCheckDraggingScroll(int localY) { + if (localY < _scroll.scrollTop()) { + _scrollDelta = localY - _scroll.scrollTop(); + } else if (localY >= _scroll.scrollTop() + _scroll.height()) { + _scrollDelta = localY - _scroll.scrollTop() - _scroll.height() + 1; + } else { + _scrollDelta = 0; + } + if (_scrollDelta) { + _scrollTimer.start(15); + } else { + _scrollTimer.stop(); + } +} + +void StickersBox::onNoDraggingScroll() { + _scrollTimer.stop(); +} + +void StickersBox::onScrollTimer() { + int32 d = (_scrollDelta > 0) ? qMin(_scrollDelta * 3 / 20 + 1, int32(MaxScrollSpeed)) : qMax(_scrollDelta * 3 / 20 - 1, -int32(MaxScrollSpeed)); + _scroll.scrollToY(_scroll.scrollTop() + d); +} + +void StickersBox::onSave() { + if (!_inner.savingStart()) { + return; + } + + bool writeRecent = false; + RecentStickerPack &recent(cGetRecentStickers()); + StickerSets &sets(cRefStickerSets()); + + QVector reorder = _inner.getOrder(), disabled = _inner.getDisabledSets(); + for (int32 i = 0, l = disabled.size(); i < l; ++i) { + StickerSets::iterator it = sets.find(disabled.at(i)); + if (it != sets.cend()) { + for (RecentStickerPack::iterator i = recent.begin(); i != recent.cend();) { + if (it->stickers.indexOf(i->first) >= 0) { + i = recent.erase(i); + writeRecent = true; + } else { + ++i; + } + } + if (!(it->flags & MTPDstickerSet::flag_disabled)) { + MTPInputStickerSet setId = (it->id && it->access) ? MTP_inputStickerSetID(MTP_long(it->id), MTP_long(it->access)) : MTP_inputStickerSetShortName(MTP_string(it->shortName)); + if (it->flags & MTPDstickerSet::flag_official) { + _disenableRequests.insert(MTP::send(MTPmessages_InstallStickerSet(setId, MTP_boolTrue()), rpcDone(&StickersBox::disenableDone), rpcFail(&StickersBox::disenableFail), 0, 5), NullType()); + it->flags |= MTPDstickerSet::flag_disabled; + } else { + _disenableRequests.insert(MTP::send(MTPmessages_UninstallStickerSet(setId), rpcDone(&StickersBox::disenableDone), rpcFail(&StickersBox::disenableFail), 0, 5), NullType()); + int32 removeIndex = cStickerSetsOrder().indexOf(it->id); + if (removeIndex >= 0) cRefStickerSetsOrder().removeAt(removeIndex); + sets.erase(it); + } + } + } + } + StickerSetsOrder &order(cRefStickerSetsOrder()); + order.clear(); + for (int32 i = 0, l = reorder.size(); i < l; ++i) { + StickerSets::iterator it = sets.find(reorder.at(i)); + if (it != sets.cend()) { + if ((it->flags & MTPDstickerSet::flag_disabled) && !disabled.contains(it->id)) { + MTPInputStickerSet setId = (it->id && it->access) ? MTP_inputStickerSetID(MTP_long(it->id), MTP_long(it->access)) : MTP_inputStickerSetShortName(MTP_string(it->shortName)); + _disenableRequests.insert(MTP::send(MTPmessages_InstallStickerSet(setId, MTP_boolFalse()), rpcDone(&StickersBox::disenableDone), rpcFail(&StickersBox::disenableFail), 0, 5), NullType()); + it->flags &= ~MTPDstickerSet::flag_disabled; + } + order.push_back(reorder.at(i)); + } + } + for (StickerSets::iterator it = sets.begin(); it != sets.cend();) { + if (it->id == CustomStickerSetId || it->id == RecentStickerSetId || order.contains(it->id)) { + ++it; + } else { + it = sets.erase(it); + } + } + + cSetStickersHash(stickersCountHash()); + Local::writeStickers(); + if (writeRecent) Local::writeUserSettings(); + emit App::main()->stickersUpdated(); + + if (_disenableRequests.isEmpty()) { + saveOrder(); + } else { + MTP::sendAnything(); + } +} + +void StickersBox::hideAll() { + _save.hide(); + _cancel.hide(); + _topShadow.hide(); + _bottomShadow.hide(); + ItemListBox::hideAll(); +} + +void StickersBox::showAll() { + _save.show(); + _cancel.show(); + _topShadow.show(); + _bottomShadow.show(); + ItemListBox::showAll(); +} + +int32 stickerPacksCount(bool includeDisabledOfficial) { + int32 result = 0; + const StickerSetsOrder &order(cStickerSetsOrder()); + const StickerSets &sets(cStickerSets()); + for (int32 i = 0, l = order.size(); i < l; ++i) { + StickerSets::const_iterator it = sets.constFind(order.at(i)); + if (it != sets.cend()) { + if (!(it->flags & MTPDstickerSet::flag_disabled) || ((it->flags & MTPDstickerSet::flag_official) && includeDisabledOfficial)) { + ++result; + } + } + } + return result; +} diff --git a/Telegram/SourceFiles/boxes/stickersetbox.h b/Telegram/SourceFiles/boxes/stickersetbox.h index c57e32bfd..b896c8af4 100644 --- a/Telegram/SourceFiles/boxes/stickersetbox.h +++ b/Telegram/SourceFiles/boxes/stickersetbox.h @@ -106,3 +106,145 @@ private: BoxButton _add, _share, _cancel, _done; QString _title; }; + +class StickersInner : public TWidget { + Q_OBJECT + +public: + + StickersInner(); + + void paintEvent(QPaintEvent *e); + void mousePressEvent(QMouseEvent *e); + void mouseMoveEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + + void rebuild(); + bool savingStart() { + if (_saving) return false; + _saving = true; + return true; + } + + QVector getOrder() const; + QVector getDisabledSets() const; + + void setVisibleScrollbar(int32 width); + + ~StickersInner(); + +signals: + + void checkDraggingScroll(int localY); + void noDraggingScroll(); + +public slots: + + void onUpdateSelected(); + +private: + + bool animStep_shifting(float64 ms); + void paintRow(Painter &p, int32 index); + void clear(); + void setRemoveSel(int32 removeSel); + float64 aboveShadowOpacity() const; + void updateAnimatedRegions(); + bool updateAnimatedValues(); + + int32 _rowHeight; + struct StickerSetRow { + StickerSetRow(uint64 id, DocumentData *sticker, int32 count, const QString &title, bool official, bool disabled, int32 pixw, int32 pixh) : id(id) + , sticker(sticker) + , count(count) + , title(title) + , official(official) + , disabled(disabled) + , pixw(pixw) + , pixh(pixh) + , yadd(0, 0) { + } + uint64 id; + DocumentData *sticker; + int32 count; + QString title; + bool official, disabled; + int32 pixw, pixh; + anim::ivalue yadd; + }; + typedef QList StickerSetRows; + StickerSetRows _rows; + QList _animStartTimes; + uint64 _aboveShadowFadeStart; + anim::fvalue _aboveShadowFadeOpacity; + Animation _a_shifting; + + int32 _itemsTop; + + bool _saving; + + int32 _removeSel, _removeDown, _removeWidth, _returnWidth, _restoreWidth; + + QPoint _mouse; + int32 _selected; + QPoint _dragStart; + int32 _started, _dragging, _above; + + BoxShadow _aboveShadow; + + int32 _scrollbar; +}; + +class StickersBox : public ItemListBox, public RPCSender { + Q_OBJECT + +public: + + StickersBox(); + void resizeEvent(QResizeEvent *e); + void paintEvent(QPaintEvent *e); + + void closePressed(); + +public slots: + + void onStickersUpdated(); + + void onCheckDraggingScroll(int localY); + void onNoDraggingScroll(); + void onScrollTimer(); + + void onSave(); + +protected: + + void hideAll(); + void showAll(); + +private: + + int32 countHeight() const; + + void disenableDone(const MTPBool &result, mtpRequestId req); + bool disenableFail(const RPCError &error, mtpRequestId req); + void reorderDone(const MTPBool &result); + bool reorderFail(const RPCError &result); + void saveOrder(); + + StickersInner _inner; + BoxButton _save, _cancel; + QMap _disenableRequests; + mtpRequestId _reorderRequest; + PlainShadow _topShadow; + ScrollableBoxShadow _bottomShadow; + + QTimer _scrollTimer; + int32 _scrollDelta; + + int32 _aboutWidth; + Text _about; + int32 _aboutHeight; + +}; + +int32 stickerPacksCount(bool includeDisabledOfficial = false); diff --git a/Telegram/SourceFiles/config.h b/Telegram/SourceFiles/config.h index 4f82b094c..8a5457413 100644 --- a/Telegram/SourceFiles/config.h +++ b/Telegram/SourceFiles/config.h @@ -20,9 +20,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org */ #pragma once -static const int32 AppVersion = 9013; -static const wchar_t *AppVersionStr = L"0.9.13"; +static const int32 AppVersion = 9015; +static const wchar_t *AppVersionStr = L"0.9.15"; static const bool DevVersion = false; +//#define BETA_VERSION (9014003ULL) // just comment this line to build public version static const wchar_t *AppNameOld = L"Telegram Win (Unofficial)"; static const wchar_t *AppName = L"Telegram Desktop"; @@ -58,6 +59,8 @@ enum { MTPDebugBufferSize = 1024 * 1024, // 1 mb start size + MaxUsersPerInvite = 100, // max users in one super group invite request + MTPPingDelayDisconnect = 60, // 1 min MTPPingSendAfterAuto = 30, // send new ping starting from 30 seconds (add to existing container) MTPPingSendAfter = 45, // send new ping after 45 seconds without ping @@ -67,7 +70,7 @@ enum { MaxSelectedItems = 100, MaxPhoneCodeLength = 4, // max length of country phone code - MaxPhoneTailLength = 18, // rest of the phone number, without country code (seen 12 at least) + MaxPhoneTailLength = 32, // rest of the phone number, without country code (seen 12 at least), need more for service numbers MaxScrollSpeed = 37, // 37px per 15ms while select-by-drag FingerAccuracyThreshold = 3, // touch flick ignore 3px @@ -265,6 +268,18 @@ static const int32 ApiId = 17349; static const char *ApiHash = "344583e45741c457fe1862106095a5eb"; #endif +#ifndef BETA_VERSION +#define BETA_VERSION (0) +#endif + +#if (defined CUSTOM_API_ID) && (BETA_VERSION > 0) +#include "../../../TelegramPrivate/beta_private.h" // private key for downloading closed betas +#else +static const char *BetaPrivateKey = ""; +#undef BETA_VERSION +#define BETA_VERSION 0 +#endif + inline const char *cApiDeviceModel() { #ifdef Q_OS_WIN return "PC"; diff --git a/Telegram/SourceFiles/dialogswidget.cpp b/Telegram/SourceFiles/dialogswidget.cpp index e45797acc..56d96241d 100644 --- a/Telegram/SourceFiles/dialogswidget.cpp +++ b/Telegram/SourceFiles/dialogswidget.cpp @@ -28,6 +28,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "mainwidget.h" #include "boxes/addcontactbox.h" #include "boxes/contactsbox.h" +#include "boxes/confirmbox.h" #include "localstorage.h" @@ -53,7 +54,10 @@ DialogsInner::DialogsInner(QWidget *parent, MainWidget *main) : SplittedWidget(p , _cancelSearchInPeer(this, st::btnCancelSearch) , _overDelete(false) , _searchInPeer(0) -, _searchInMigrated(0) { +, _searchInMigrated(0) +, _menuPeer(0) +, _menuActionPeer(0) +, _menu(0) { connect(App::wnd(), SIGNAL(imageLoaded()), this, SLOT(update())); connect(main, SIGNAL(peerNameChanged(PeerData*, const PeerData::Names&, const PeerData::NameFirstChars&)), this, SLOT(onPeerNameChanged(PeerData*, const PeerData::Names&, const PeerData::NameFirstChars&))); connect(main, SIGNAL(peerPhotoChanged(PeerData*)), this, SLOT(onPeerPhotoChanged(PeerData*))); @@ -61,7 +65,7 @@ DialogsInner::DialogsInner(QWidget *parent, MainWidget *main) : SplittedWidget(p connect(&_addContactLnk, SIGNAL(clicked()), App::wnd(), SLOT(onShowAddContact())); connect(&_cancelSearchInPeer, SIGNAL(clicked()), this, SIGNAL(cancelSearchInPeer())); _cancelSearchInPeer.hide(); - refresh(false); + refresh(); } int32 DialogsInner::filteredOffset() const { @@ -91,7 +95,7 @@ void DialogsInner::paintRegion(Painter &p, const QRegion ®ion, bool paintingO if (_state == DefaultState) { int32 otherStart = dialogs.list.count * st::dlgHeight; - PeerData *active = App::main()->activePeer(), *selected = sel ? sel->history->peer : 0; + PeerData *active = App::main()->activePeer(), *selected = _menuPeer ? _menuPeer : (sel ? sel->history->peer : 0); if (otherStart) { dialogs.list.paint(p, fullWidth(), r.top(), r.top() + r.height(), active, selected, paintingOther); } @@ -160,7 +164,7 @@ void DialogsInner::paintRegion(Painter &p, const QRegion ®ion, bool paintingO MsgId actId = App::main()->activeMsgId(); for (; from < to; ++from) { bool active = ((_filterResults[from]->history->peer == act) || (_filterResults[from]->history->peer->migrateTo() && _filterResults[from]->history->peer->migrateTo() == act)) && !actId; - bool selected = (from == _filteredSel); + bool selected = (from == _filteredSel) || (_filterResults[from]->history->peer == _menuPeer); _filterResults[from]->paint(p, w, active, selected, paintingOther); p.translate(0, st::dlgHeight); } @@ -461,6 +465,9 @@ void DialogsInner::createDialog(History *history) { void DialogsInner::removeDialog(History *history) { if (!history) return; + if (history->peer == _menuPeer && _menu) { + _menu->deleteLater(); + } if (sel && sel->history == history) { sel = 0; } @@ -549,13 +556,26 @@ void DialogsInner::enterEvent(QEvent *e) { onUpdateSelected(true); } -void DialogsInner::updateSelectedRow() { +void DialogsInner::updateSelectedRow(PeerData *peer) { if (_state == DefaultState) { - if (sel) { + if (peer) { + if (History *h = App::historyLoaded(peer->id)) { + if (h->dialogs.contains(0)) { + update(0, h->dialogs.value(0)->pos * st::dlgHeight, fullWidth(), st::dlgHeight); + } + } + } else if (sel) { update(0, sel->pos * st::dlgHeight, fullWidth(), st::dlgHeight); } } else if (_state == FilteredState || _state == SearchedState) { - if (_hashtagSel >= 0) { + if (peer) { + for (int32 i = 0, l = _filterResults.size(); i != l; ++i) { + if (_filterResults.at(i)->history->peer == peer) { + update(0, filteredOffset() + i * st::dlgHeight, fullWidth(), st::dlgHeight); + break; + } + } + } else if (_hashtagSel >= 0) { update(0, _hashtagSel * st::mentionHeight, fullWidth(), st::mentionHeight); } else if (_filteredSel >= 0) { update(0, filteredOffset() + _filteredSel * st::dlgHeight, fullWidth(), st::dlgHeight); @@ -579,6 +599,148 @@ void DialogsInner::leaveEvent(QEvent *e) { } } +void DialogsInner::contextMenuEvent(QContextMenuEvent *e) { + if (_menu) { + _menu->deleteLater(); + _menu = 0; + } + if (_menuPeer) { + updateSelectedRow(_menuPeer); + _menuPeer = 0; + disconnect(App::main(), SIGNAL(peerUpdated(PeerData*)), this, SLOT(peerUpdated(PeerData*))); + } + + if (e->reason() == QContextMenuEvent::Mouse) { + lastMousePos = e->globalPos(); + selByMouse = true; + onUpdateSelected(true); + } + + History *history = 0; + if (_state == DefaultState) { + if (sel) history = sel->history; + } else if (_state == FilteredState || _state == SearchedState) { + if (_filteredSel >= 0 && _filteredSel < _filterResults.size()) { + history = _filterResults[_filteredSel]->history; + } + } + if (!history) return; + _menuPeer = history->peer; + + _menu = new PopupMenu(); + _menu->addAction(lang((_menuPeer->isChat() || _menuPeer->isMegagroup()) ? lng_context_view_group : (_menuPeer->isUser() ? lng_context_view_profile : lng_context_view_channel)), this, SLOT(onContextProfile()))->setEnabled(true); + _menu->addAction(lang(menuPeerMuted() ? lng_enable_notifications_from_tray : lng_disable_notifications_from_tray), this, SLOT(onContextToggleNotifications()))->setEnabled(true); + _menu->addAction(lang(lng_profile_search_messages), this, SLOT(onContextSearch()))->setEnabled(true); + if (_menuPeer->isUser()) { + _menu->addAction(lang(lng_profile_clear_history), this, SLOT(onContextClearHistory()))->setEnabled(true); + _menu->addAction(lang(lng_profile_delete_conversation), this, SLOT(onContextDeleteAndLeave()))->setEnabled(true); + if (_menuPeer->asUser()->access != UserNoAccess) { + _menu->addAction(lang((_menuPeer->asUser()->blocked == UserIsBlocked) ? (_menuPeer->asUser()->botInfo ? lng_profile_unblock_bot : lng_profile_unblock_user) : (_menuPeer->asUser()->botInfo ? lng_profile_block_bot : lng_profile_block_user)), this, SLOT(onContextToggleBlock()))->setEnabled(true); + connect(App::main(), SIGNAL(peerUpdated(PeerData*)), this, SLOT(peerUpdated(PeerData*))); + } + } else if (_menuPeer->isChat()) { + _menu->addAction(lang(lng_profile_clear_history), this, SLOT(onContextClearHistory()))->setEnabled(true); + _menu->addAction(lang(lng_profile_clear_and_exit), this, SLOT(onContextDeleteAndLeave()))->setEnabled(true); + } else if (_menuPeer->isChannel() && _menuPeer->asChannel()->amIn() && !_menuPeer->asChannel()->amCreator()) { + _menu->addAction(lang(_menuPeer->isMegagroup() ? lng_profile_leave_group : lng_profile_leave_channel), this, SLOT(onContextDeleteAndLeave()))->setEnabled(true); + } + + connect(_menu, SIGNAL(destroyed(QObject*)), this, SLOT(onMenuDestroyed(QObject*))); + _menu->popup(e->globalPos()); + e->accept(); +} + +bool DialogsInner::menuPeerMuted() { + return _menuPeer && _menuPeer->notify != EmptyNotifySettings && _menuPeer->notify != UnknownNotifySettings && _menuPeer->notify->mute >= unixtime(); +} + +void DialogsInner::onContextProfile() { + if (!_menuPeer) return; + App::main()->showPeerProfile(_menuPeer); +} + +void DialogsInner::onContextToggleNotifications() { + if (!_menuPeer) return; + App::main()->updateNotifySetting(_menuPeer, menuPeerMuted()); +} + +void DialogsInner::onContextSearch() { + if (!_menuPeer) return; + App::main()->searchInPeer(_menuPeer); +} + +void DialogsInner::onContextClearHistory() { + if (!_menuPeer || _menuPeer->isChannel()) return; + + _menuActionPeer = _menuPeer; + ConfirmBox *box = new ConfirmBox(_menuPeer->isUser() ? lng_sure_delete_history(lt_contact, _menuPeer->name) : lng_sure_delete_group_history(lt_group, _menuPeer->name), lang(lng_box_delete), st::attentionBoxButton); + connect(box, SIGNAL(confirmed()), this, SLOT(onContextClearHistorySure())); + App::showLayer(box); +} + +void DialogsInner::onContextClearHistorySure() { + if (!_menuActionPeer || _menuActionPeer->isChannel()) return; + App::wnd()->hideLayer(); + App::main()->clearHistory(_menuActionPeer); +} + +void DialogsInner::onContextDeleteAndLeave() { + if (!_menuPeer) return; + + _menuActionPeer = _menuPeer; + ConfirmBox *box = new ConfirmBox(_menuPeer->isUser() ? lng_sure_delete_history(lt_contact, _menuPeer->name) : (_menuPeer->isChat() ? lng_sure_delete_and_exit(lt_group, _menuPeer->name) : lang(_menuPeer->isMegagroup() ? lng_sure_leave_group : lng_sure_leave_channel)), lang(_menuPeer->isUser() ? lng_box_delete : lng_box_leave), _menuPeer->isChannel() ? st::defaultBoxButton : st::attentionBoxButton); + connect(box, SIGNAL(confirmed()), this, SLOT(onContextDeleteAndLeaveSure())); + App::wnd()->showLayer(box); +} + +void DialogsInner::onContextDeleteAndLeaveSure() { + if (!_menuActionPeer) return; + + App::wnd()->hideLayer(); + App::main()->showDialogs(); + if (_menuActionPeer->isUser()) { + App::main()->deleteConversation(_menuActionPeer); + } else if (_menuActionPeer->isChat()) { + MTP::send(MTPmessages_DeleteChatUser(_menuActionPeer->asChat()->inputChat, App::self()->inputUser), App::main()->rpcDone(&MainWidget::deleteHistoryAfterLeave, _menuActionPeer), App::main()->rpcFail(&MainWidget::leaveChatFailed, _menuActionPeer)); + } else if (_menuActionPeer->isChannel()) { + if (_menuActionPeer->migrateFrom()) { + App::main()->deleteConversation(_menuActionPeer->migrateFrom()); + } + MTP::send(MTPchannels_LeaveChannel(_menuActionPeer->asChannel()->inputChannel), App::main()->rpcDone(&MainWidget::sentUpdatesReceived)); + } +} + +void DialogsInner::onContextToggleBlock() { + if (!_menuPeer || !_menuPeer->isUser()) return; + if (_menuPeer->asUser()->blocked == UserIsBlocked) { + MTP::send(MTPcontacts_Unblock(_menuPeer->asUser()->inputUser), rpcDone(&DialogsInner::contextBlockDone, qMakePair(_menuPeer->asUser(), false))); + } else { + MTP::send(MTPcontacts_Block(_menuPeer->asUser()->inputUser), rpcDone(&DialogsInner::contextBlockDone, qMakePair(_menuPeer->asUser(), true))); + } +} + +void DialogsInner::contextBlockDone(QPair data, const MTPBool &result) { + data.first->blocked = data.second ? UserIsBlocked : UserIsNotBlocked; + emit App::main()->peerUpdated(data.first); +} + +void DialogsInner::onMenuDestroyed(QObject *obj) { + if (_menu == obj) { + _menu = 0; + if (_menuPeer) { + updateSelectedRow(_menuPeer); + _menuPeer = 0; + disconnect(App::main(), SIGNAL(peerUpdated(PeerData*)), this, SLOT(peerUpdated(PeerData*))); + } + lastMousePos = QCursor::pos(); + if (rect().contains(mapFromGlobal(lastMousePos))) { + selByMouse = true; + setMouseTracking(true); + onUpdateSelected(true); + } + } +} + void DialogsInner::onParentGeometryChanged() { lastMousePos = QCursor::pos(); if (rect().contains(mapFromGlobal(lastMousePos))) { @@ -763,6 +925,18 @@ void DialogsInner::itemReplaced(HistoryItem *oldItem, HistoryItem *newItem) { } } +void DialogsInner::updateNotifySettings(PeerData *peer) { + if (_menu && _menuPeer == peer && _menu->actions().size() > 1) { + _menu->actions().at(1)->setText(lang(menuPeerMuted() ? lng_enable_notifications_from_tray : lng_disable_notifications_from_tray)); + } +} + +void DialogsInner::peerUpdated(PeerData *peer) { + if (_menu && _menuPeer == peer && _menuPeer->isUser() && _menu->actions().size() > 5) { + _menu->actions().at(5)->setText(lang((_menuPeer->asUser()->blocked == UserIsBlocked) ? (_menuPeer->asUser()->botInfo ? lng_profile_unblock_bot : lng_profile_unblock_user) : (_menuPeer->asUser()->botInfo ? lng_profile_block_bot : lng_profile_block_user))); + } +} + PeerData *DialogsInner::updateFromParentDrag(QPoint globalPos) { lastMousePos = globalPos; selByMouse = true; @@ -1008,7 +1182,6 @@ void DialogsInner::setState(State newState) { _filteredSel = -1; } onFilterUpdate(_filter, true); - refresh(true); } DialogsInner::State DialogsInner::state() const { @@ -1681,7 +1854,9 @@ bool DialogsWidget::animStep_show(float64 ms) { _scroll.show(); _filter.show(); - onFilterUpdate(true); + _a_show.stop(); + + onFilterUpdate(); activate(); if (App::app()) App::app()->mtpUnpause(); @@ -1708,6 +1883,10 @@ void DialogsWidget::itemReplaced(HistoryItem *oldItem, HistoryItem *newItem) { _inner.itemReplaced(oldItem, newItem); } +void DialogsWidget::updateNotifySettings(PeerData *peer) { + _inner.updateNotifySettings(peer); +} + void DialogsWidget::unreadCountsReceived(const QVector &dialogs) { for (QVector::const_iterator i = dialogs.cbegin(), e = dialogs.cend(); i != e; ++i) { switch (i->type()) { diff --git a/Telegram/SourceFiles/dialogswidget.h b/Telegram/SourceFiles/dialogswidget.h index 89d0f008a..602774d23 100644 --- a/Telegram/SourceFiles/dialogswidget.h +++ b/Telegram/SourceFiles/dialogswidget.h @@ -31,7 +31,7 @@ enum DialogsSearchRequestType { DialogsSearchMigratedFromOffset, }; -class DialogsInner : public SplittedWidget { +class DialogsInner : public SplittedWidget, public RPCSender { Q_OBJECT public: @@ -59,6 +59,7 @@ public: void resizeEvent(QResizeEvent *e); void enterEvent(QEvent *e); void leaveEvent(QEvent *e); + void contextMenuEvent(QContextMenuEvent *e); void peopleResultPaint(PeerData *peer, Painter &p, int32 w, bool act, bool sel, bool onlyBackground) const; void searchInPeerPaint(Painter &p, int32 w, bool onlyBackground) const; @@ -120,6 +121,8 @@ public: PeerData *updateFromParentDrag(QPoint globalPos); + void updateNotifySettings(PeerData *peer); + ~DialogsInner(); public slots: @@ -130,6 +133,19 @@ public slots: void onPeerPhotoChanged(PeerData *peer); void onDialogRowReplaced(DialogRow *oldRow, DialogRow *newRow); + void onContextProfile(); + void onContextToggleNotifications(); + void onContextSearch(); + void onContextClearHistory(); + void onContextClearHistorySure(); + void onContextDeleteAndLeave(); + void onContextDeleteAndLeaveSure(); + void onContextToggleBlock(); + + void onMenuDestroyed(QObject*); + + void peerUpdated(PeerData *peer); + signals: void mustScrollTo(int scrollToTop, int scrollToBottom); @@ -147,7 +163,9 @@ protected: private: void clearSearchResults(bool clearPeople = true); - void updateSelectedRow(); + void updateSelectedRow(PeerData *peer = 0); + bool menuPeerMuted(); + void contextBlockDone(QPair data, const MTPBool &result); DialogsIndexed dialogs; DialogsIndexed contactsNoDialogs; @@ -186,7 +204,9 @@ private: bool _overDelete; - PeerData *_searchInPeer, *_searchInMigrated; + PeerData *_searchInPeer, *_searchInMigrated, *_menuPeer, *_menuActionPeer; + + PopupMenu *_menu; }; @@ -242,6 +262,8 @@ public: void itemRemoved(HistoryItem *item); void itemReplaced(HistoryItem *oldItem, HistoryItem *newItem); + void updateNotifySettings(PeerData *peer); + signals: void cancelled(); diff --git a/Telegram/SourceFiles/dropdown.cpp b/Telegram/SourceFiles/dropdown.cpp index c8b066bf3..20071440c 100644 --- a/Telegram/SourceFiles/dropdown.cpp +++ b/Telegram/SourceFiles/dropdown.cpp @@ -30,6 +30,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "apiwrap.h" #include "boxes/confirmbox.h" +#include "boxes/stickersetbox.h" Dropdown::Dropdown(QWidget *parent, const style::dropdown &st) : TWidget(parent), _ignore(false), _selected(-1), _st(st), _width(_st.width), _hiding(false), a_opacity(0), _shadow(_st.shadow) { @@ -38,7 +39,7 @@ _ignore(false), _selected(-1), _st(st), _width(_st.width), _hiding(false), a_opa _hideTimer.setSingleShot(true); connect(&_hideTimer, SIGNAL(timeout()), this, SLOT(hideStart())); - if (cPlatform() == dbipMac) { + if (cPlatform() == dbipMac || cPlatform() == dbipMacOld) { connect(App::wnd()->windowHandle(), SIGNAL(activeChanged()), this, SLOT(onWndActiveChanged())); } } @@ -1195,22 +1196,31 @@ void EmojiPanInner::showEmojiPack(DBIEmojiTab packIndex) { update(); } -StickerPanInner::StickerPanInner() : _maxHeight(st::emojiPanMaxHeight), -_top(0), _selected(-1), _pressedSel(-1) { - resize(st::emojiPanWidth - st::emojiScroll.width, countHeight()); +StickerPanInner::StickerPanInner() : TWidget() +, _top(0) +, _selected(-1) +, _pressedSel(-1) +, _settings(this, lang(lng_stickers_you_have)) +, _previewShown(false) { + setMaxHeight(st::emojiPanMaxHeight); setMouseTracking(true); setFocusPolicy(Qt::NoFocus); setAttribute(Qt::WA_OpaquePaintEvent); connect(App::wnd(), SIGNAL(imageLoaded()), this, SLOT(update())); + connect(&_settings, SIGNAL(clicked()), this, SLOT(onSettings())); + _previewTimer.setSingleShot(true); + connect(&_previewTimer, SIGNAL(timeout()), this, SLOT(onPreview())); + refreshStickers(); } void StickerPanInner::setMaxHeight(int32 h) { _maxHeight = h; resize(st::emojiPanWidth - st::emojiScroll.width, countHeight()); + _settings.moveToLeft((st::emojiPanWidth - _settings.width()) / 2, height() / 3); } void StickerPanInner::setScrollTop(int top) { @@ -1228,7 +1238,7 @@ int StickerPanInner::countHeight() { if (i == _sets.size() - 1 && h < minLastH) h = minLastH; result += h; } - return result + st::stickerPanPadding; + return qMax(minLastH, result) + st::stickerPanPadding; } QRect StickerPanInner::stickerRect(int tab, int sel) { @@ -1343,15 +1353,23 @@ void StickerPanInner::mousePressEvent(QMouseEvent *e) { updateSelected(); _pressedSel = _selected; + _previewTimer.start(QApplication::startDragTime()); } void StickerPanInner::mouseReleaseEvent(QMouseEvent *e) { + _previewTimer.stop(); + int32 pressed = _pressedSel; _pressedSel = -1; _lastMousePos = e->globalPos(); updateSelected(); + if (_previewShown) { + _previewShown = false; + return; + } + if (_selected < 0 || _selected != pressed) return; if (_selected >= MatrixRowShift * _sets.size()) { return; @@ -1461,6 +1479,8 @@ void StickerPanInner::refreshStickers() { int32 h = countHeight(); if (h != height()) resize(width(), h); + _settings.setVisible(_sets.isEmpty()); + emit refreshIcons(); updateSelected(); @@ -1512,7 +1532,7 @@ uint64 StickerPanInner::currentSet(int yOffset) const { void StickerPanInner::appendSet(uint64 setId) { const StickerSets &sets(cStickerSets()); StickerSets::const_iterator it = sets.constFind(setId); - if (it == sets.cend() || it->stickers.isEmpty()) return; + if (it == sets.cend() || (it->flags & MTPDstickerSet::flag_disabled) || it->stickers.isEmpty()) return; StickerPack pack; pack.reserve(it->stickers.size()); @@ -1630,7 +1650,7 @@ void StickerPanInner::refreshPanels(QVector &panels) { } void StickerPanInner::updateSelected() { - if (_pressedSel >= 0) return; + if (_pressedSel >= 0 && !_previewShown) return; int32 selIndex = -1; QPoint p(mapFromGlobal(_lastMousePos)); @@ -1707,9 +1727,29 @@ void StickerPanInner::updateSelected() { } } _selected = selIndex; + if (_pressedSel >= 0 && _selected >= 0 && _pressedSel != _selected) { + _pressedSel = _selected; + if (newSel >= 0 && xNewSel < 0) { + Ui::showStickerPreview(_sets.at(newSelTab).pack.at(newSel % MatrixRowShift)); + } + } if (startanim) anim::start(this); } +void StickerPanInner::onSettings() { + App::showLayer(new StickersBox()); +} + +void StickerPanInner::onPreview() { + if (_pressedSel >= 0 && _pressedSel < MatrixRowShift * _sets.size()) { + int tab = (_pressedSel / MatrixRowShift), sel = _pressedSel % MatrixRowShift; + if (sel < _sets.at(tab).pack.size()) { + Ui::showStickerPreview(_sets.at(tab).pack.at(sel)); + _previewShown = true; + } + } +} + bool StickerPanInner::animStep(float64 ms) { uint64 now = getms(); QRegion toUpdate; @@ -1831,14 +1871,14 @@ void EmojiSwitchButton::paintEvent(QPaintEvent *e) { EmojiPan::EmojiPan(QWidget *parent) : TWidget(parent), _maxHeight(st::emojiPanMaxHeight), _horizontal(false), _noTabUpdate(false), _hiding(false), a_opacity(0), _shadow(st::dropdownDef.shadow), -_recent(this , qsl("emoji_group"), dbietRecent , QString(), true , st::rbEmojiRecent), -_people(this , qsl("emoji_group"), dbietPeople , QString(), false, st::rbEmojiPeople), -_nature(this , qsl("emoji_group"), dbietNature , QString(), false, st::rbEmojiNature), -_food(this , qsl("emoji_group"), dbietFood , QString(), false, st::rbEmojiFood), -_celebration(this, qsl("emoji_group"), dbietCelebration, QString(), false, st::rbEmojiCelebration), -_activity(this , qsl("emoji_group"), dbietActivity , QString(), false, st::rbEmojiActivity), -_travel(this , qsl("emoji_group"), dbietTravel , QString(), false, st::rbEmojiTravel), -_objects(this , qsl("emoji_group"), dbietObjects , QString(), false, st::rbEmojiObjects), +_recent(this , qsl("emoji_group"), dbietRecent , QString(), true , st::rbEmojiRecent), +_people(this , qsl("emoji_group"), dbietPeople , QString(), false, st::rbEmojiPeople), +_nature(this , qsl("emoji_group"), dbietNature , QString(), false, st::rbEmojiNature), +_food(this , qsl("emoji_group"), dbietFood , QString(), false, st::rbEmojiFood), +_activity(this, qsl("emoji_group"), dbietActivity, QString(), false, st::rbEmojiActivity), +_travel(this , qsl("emoji_group"), dbietTravel , QString(), false, st::rbEmojiTravel), +_objects(this , qsl("emoji_group"), dbietObjects , QString(), false, st::rbEmojiObjects), +_symbols(this , qsl("emoji_group"), dbietSymbols , QString(), false, st::rbEmojiSymbols), _iconOver(-1), _iconSel(0), _iconDown(-1), _iconsDragging(false), _iconAnim(animFunc(this, &EmojiPan::iconAnim)), _iconsLeft(0), _iconsTop(0), _iconsStartX(0), _iconsMax(0), _iconsX(0, 0), _iconSelX(0, 0), _iconsStartAnim(0), @@ -1872,10 +1912,10 @@ s_scroll(this, st::emojiScroll), s_inner(), s_switch(&s_scroll, false), _removin prepareTab(left, top, _width, _people); prepareTab(left, top, _width, _nature); prepareTab(left, top, _width, _food); - prepareTab(left, top, _width, _celebration); prepareTab(left, top, _width, _activity); prepareTab(left, top, _width, _travel); prepareTab(left, top, _width, _objects); + prepareTab(left, top, _width, _symbols); e_inner.fillPanels(e_panels); updatePanelsPositions(e_panels, 0); @@ -1903,7 +1943,7 @@ s_scroll(this, st::emojiScroll), s_inner(), s_switch(&s_scroll, false), _removin connect(&e_inner, SIGNAL(needRefreshPanels()), this, SLOT(onRefreshPanels())); connect(&s_inner, SIGNAL(needRefreshPanels()), this, SLOT(onRefreshPanels())); - if (cPlatform() == dbipMac) { + if (cPlatform() == dbipMac || cPlatform() == dbipMacOld) { connect(App::wnd()->windowHandle(), SIGNAL(activeChanged()), this, SLOT(onWndActiveChanged())); } @@ -1938,10 +1978,10 @@ void EmojiPan::setMaxHeight(int32 h) { _people.move(_people.x(), _iconsTop); _nature.move(_nature.x(), _iconsTop); _food.move(_food.x(), _iconsTop); - _celebration.move(_celebration.x(), _iconsTop); _activity.move(_activity.x(), _iconsTop); _travel.move(_travel.x(), _iconsTop); _objects.move(_objects.x(), _iconsTop); + _symbols.move(_symbols.x(), _iconsTop); update(); } @@ -1976,6 +2016,8 @@ void EmojiPan::paintEvent(QPaintEvent *e) { p.fillRect(myrtlrect(r.x() + r.width() - st::emojiScroll.width, r.y(), st::emojiScroll.width, e_scroll.height()), st::white->b); if (_stickersShown) { p.fillRect(r.left(), _iconsTop, r.width(), st::rbEmoji.height, st::emojiPanCategories->b); + p.drawSpriteLeft(_iconsLeft + 7 * st::rbEmoji.width + st::rbEmojiRecent.imagePos.x(), _iconsTop + st::rbEmojiRecent.imagePos.y(), width(), st::stickersSettings); + if (!_icons.isEmpty()) { int32 x = _iconsLeft, i = 0, selxrel = _iconSelX.current(), selx = x + selxrel - _iconsX.current(); if (!_icons.at(i).sticker) { @@ -1996,13 +2038,13 @@ void EmojiPan::paintEvent(QPaintEvent *e) { ++i; } - QRect clip(x, _iconsTop, _iconsLeft + 8 * st::rbEmoji.width - x, st::rbEmoji.height); + QRect clip(x, _iconsTop, _iconsLeft + 7 * st::rbEmoji.width - x, st::rbEmoji.height); if (rtl()) clip.moveLeft(width() - x - clip.width()); p.setClipRect(clip); i += _iconsX.current() / int(st::rbEmoji.width); x -= _iconsX.current() % int(st::rbEmoji.width); - for (int32 l = qMin(_icons.size(), i + 8 + (_icons.at(0).sticker ? 1 : 0)); i < l; ++i) { + for (int32 l = qMin(_icons.size(), i + 7 + (_icons.at(0).sticker ? 1 : 0)); i < l; ++i) { const StickerIcon &s(_icons.at(i)); s.sticker->thumb->load(); QPixmap pix(s.sticker->thumb->pix(s.pixw, s.pixh)); @@ -2028,7 +2070,7 @@ void EmojiPan::paintEvent(QPaintEvent *e) { float64 o_right = snap(float64(_iconsMax - _iconsX.current()) / st::stickerIconRight.pxWidth(), 0., 1.); if (o_right > 0) { p.setOpacity(o_right); - p.drawSpriteRight(QRect(width() - _iconsLeft - 8 * st::rbEmoji.width, _iconsTop, st::stickerIconRight.pxWidth(), st::rbEmoji.height), width(), st::stickerIconRight); + p.drawSpriteRight(QRect(width() - _iconsLeft - 7 * st::rbEmoji.width, _iconsTop, st::stickerIconRight.pxWidth(), st::rbEmoji.height), width(), st::stickerIconRight); } } } else { @@ -2100,27 +2142,31 @@ void EmojiPan::otherLeave() { } void EmojiPan::mousePressEvent(QMouseEvent *e) { - if (!_stickersShown || _icons.isEmpty()) return; + if (!_stickersShown) return; _iconsMousePos = e ? e->globalPos() : QCursor::pos(); updateSelected(); - _iconDown = _iconOver; - _iconsMouseDown = _iconsMousePos; - _iconsStartX = _iconsX.current(); + if (_iconOver == _icons.size()) { + App::showLayer(new StickersBox()); + } else { + _iconDown = _iconOver; + _iconsMouseDown = _iconsMousePos; + _iconsStartX = _iconsX.current(); + } } void EmojiPan::mouseMoveEvent(QMouseEvent *e) { - if (!_stickersShown || _icons.isEmpty()) return; + if (!_stickersShown) return; _iconsMousePos = e ? e->globalPos() : QCursor::pos(); updateSelected(); - if (!_iconsDragging && _iconDown >= (_icons.at(0).sticker ? 0 : 1)) { + if (!_iconsDragging && !_icons.isEmpty() && _iconDown >= (_icons.at(0).sticker ? 0 : 1)) { if ((_iconsMousePos - _iconsMouseDown).manhattanLength() >= QApplication::startDragDistance()) { _iconsDragging = true; } } if (_iconsDragging) { - int32 newX = snap(_iconsStartX + _iconsMouseDown.x() - _iconsMousePos.x(), 0, _iconsMax); + int32 newX = snap(_iconsStartX + (rtl() ? -1 : 1) * (_iconsMouseDown.x() - _iconsMousePos.x()), 0, _iconsMax); if (newX != _iconsX.current()) { _iconsX = anim::ivalue(newX, newX); _iconsStartAnim = 0; @@ -2150,7 +2196,7 @@ void EmojiPan::mouseReleaseEvent(QMouseEvent *e) { } else { updateSelected(); - if (wasDown == _iconOver && _iconOver >= 0) { + if (wasDown == _iconOver && _iconOver >= 0 && _iconOver < _icons.size()) { _iconSelX = anim::ivalue(_iconOver * st::rbEmoji.width, _iconOver * st::rbEmoji.width); s_inner.showStickerSet(_icons.at(_iconOver).setId); } @@ -2160,7 +2206,7 @@ void EmojiPan::mouseReleaseEvent(QMouseEvent *e) { bool EmojiPan::event(QEvent *e) { if (e->type() == QEvent::TouchBegin) { int a = 0; - } else if (e->type() == QEvent::Wheel && _iconOver >= ((_icons.isEmpty() || _icons.at(0).sticker) ? 0 : 1) && _iconDown < 0) { + } else if (e->type() == QEvent::Wheel && !_icons.isEmpty() && _iconOver >= (_icons.at(0).sticker ? 0 : 1) && _iconOver < _icons.size() && _iconDown < 0) { QWheelEvent *ev = static_cast(e); bool hor = (ev->angleDelta().x() != 0 || ev->orientation() == Qt::Horizontal); bool ver = (ev->angleDelta().y() != 0 || ev->orientation() == Qt::Vertical); @@ -2213,7 +2259,7 @@ void EmojiPan::onRefreshIcons() { _iconsMax = 0; } else { _iconHovers = QVector(_icons.size(), 0); - _iconsMax = qMax(int((_icons.size() - 8) * st::rbEmoji.width), 0); + _iconsMax = qMax(int((_icons.size() - 7) * st::rbEmoji.width), 0); } updatePanelsPositions(s_panels, s_scroll.scrollTop()); updateSelected(); @@ -2237,23 +2283,29 @@ void EmojiPan::leaveToChildEvent(QEvent *e) { } void EmojiPan::updateSelected() { - if (_icons.isEmpty() || _iconDown >= 0) return; + if (_iconDown >= 0) { + return; + } QPoint p(mapFromGlobal(_iconsMousePos)); int32 x = p.x(), y = p.y(), newOver = -1; if (rtl()) x = width() - x; x -= _iconsLeft; - if (y >= _iconsTop && y < _iconsTop + st::rbEmoji.height && x >= 0 && x < 8 * st::rbEmoji.width && x < _icons.size() * st::rbEmoji.width) { - if (!_icons.at(0).sticker) { - if (x < st::rbEmoji.width) { - newOver = 0; - } else { - x -= st::rbEmoji.width; + if (x >= st::rbEmoji.width * 7 && x < st::rbEmoji.width * 8 && y >= _iconsTop && y < _iconsTop + st::rbEmoji.height) { + newOver = _icons.size(); + } else if (!_icons.isEmpty()) { + if (y >= _iconsTop && y < _iconsTop + st::rbEmoji.height && x >= 0 && x < 7 * st::rbEmoji.width && x < _icons.size() * st::rbEmoji.width) { + if (!_icons.at(0).sticker) { + if (x < st::rbEmoji.width) { + newOver = 0; + } else { + x -= st::rbEmoji.width; + } + } + if (newOver < 0) { + x += _iconsX.current(); + newOver = qFloor(x / st::rbEmoji.width) + (_icons.at(0).sticker ? 0 : 1); } - } - if (newOver < 0) { - x += _iconsX.current(); - newOver = qFloor(x / st::rbEmoji.width) + (_icons.at(0).sticker ? 0 : 1); } } if (newOver != _iconOver) { @@ -2263,7 +2315,7 @@ void EmojiPan::updateSelected() { setCursor(style::cur_pointer); } bool startanim = false; - if (_iconOver >= 0) { + if (_iconOver >= 0 && _iconOver < _icons.size()) { _iconAnimations.remove(_iconOver + 1); if (_iconAnimations.find(-_iconOver - 1) == _iconAnimations.end()) { if (_iconAnimations.isEmpty() && !_iconsStartAnim) startanim = true; @@ -2271,7 +2323,7 @@ void EmojiPan::updateSelected() { } } _iconOver = newOver; - if (_iconOver >= 0) { + if (_iconOver >= 0 && _iconOver < _icons.size()) { _iconAnimations.remove(-_iconOver - 1); if (_iconAnimations.find(_iconOver + 1) == _iconAnimations.end()) { if (_iconAnimations.isEmpty() && !_iconsStartAnim) startanim = true; @@ -2474,10 +2526,10 @@ void EmojiPan::showAll() { _people.hide(); _nature.hide(); _food.hide(); - _celebration.hide(); _activity.hide(); _travel.hide(); _objects.hide(); + _symbols.hide(); e_scroll.hide(); } else { s_scroll.hide(); @@ -2485,10 +2537,10 @@ void EmojiPan::showAll() { _people.show(); _nature.show(); _food.show(); - _celebration.show(); _activity.show(); _travel.show(); _objects.show(); + _symbols.show(); e_scroll.show(); } } @@ -2498,10 +2550,10 @@ void EmojiPan::hideAll() { _people.hide(); _nature.hide(); _food.hide(); - _celebration.hide(); _activity.hide(); _travel.hide(); _objects.hide(); + _symbols.hide(); e_scroll.hide(); s_scroll.hide(); e_inner.clearSelection(true); @@ -2514,10 +2566,10 @@ void EmojiPan::onTabChange() { if (_people.checked()) newTab = dbietPeople; else if (_nature.checked()) newTab = dbietNature; else if (_food.checked()) newTab = dbietFood; - else if (_celebration.checked()) newTab = dbietCelebration; else if (_activity.checked()) newTab = dbietActivity; else if (_travel.checked()) newTab = dbietTravel; else if (_objects.checked()) newTab = dbietObjects; + else if (_symbols.checked()) newTab = dbietSymbols; e_inner.showEmojiPack(newTab); } @@ -2540,14 +2592,14 @@ void EmojiPan::onScroll() { DBIEmojiTab tab = e_inner.currentTab(st); FlatRadiobutton *check = 0; switch (tab) { - case dbietRecent : check = &_recent ; break; - case dbietPeople : check = &_people ; break; - case dbietNature : check = &_nature ; break; - case dbietFood : check = &_food ; break; - case dbietCelebration: check = &_celebration; break; - case dbietActivity : check = &_activity ; break; - case dbietTravel : check = &_travel ; break; - case dbietObjects : check = &_objects ; break; + case dbietRecent : check = &_recent ; break; + case dbietPeople : check = &_people ; break; + case dbietNature : check = &_nature ; break; + case dbietFood : check = &_food ; break; + case dbietActivity: check = &_activity; break; + case dbietTravel : check = &_travel ; break; + case dbietObjects : check = &_objects ; break; + case dbietSymbols : check = &_symbols ; break; } if (check && !check->checked()) { _noTabUpdate = true; @@ -2644,8 +2696,9 @@ void EmojiPan::onRemoveSetSure() { } } cRefStickerSets().erase(it); - cRefStickerSetsOrder().removeOne(_removingSetId); - cSetStickersHash(QByteArray()); + int32 removeIndex = cStickerSetsOrder().indexOf(_removingSetId); + if (removeIndex >= 0) cRefStickerSetsOrder().removeAt(removeIndex); + cSetStickersHash(stickersCountHash()); refreshStickers(); Local::writeStickers(); if (writeRecent) Local::writeUserSettings(); @@ -2920,6 +2973,8 @@ _scroll(this, st::mentionScroll), _inner(this, &_rows, &_hrows, &_crows), _chat( connect(&_inner, SIGNAL(chosen(QString)), this, SIGNAL(chosen(QString))); connect(&_inner, SIGNAL(mustScrollTo(int,int)), &_scroll, SLOT(scrollToY(int,int))); + connect(App::wnd(), SIGNAL(imageLoaded()), &_inner, SLOT(update())); + setFocusPolicy(Qt::NoFocus); _scroll.setFocusPolicy(Qt::NoFocus); _scroll.viewport()->setFocusPolicy(Qt::NoFocus); @@ -2934,7 +2989,7 @@ _scroll(this, st::mentionScroll), _inner(this, &_rows, &_hrows, &_crows), _chat( connect(&_scroll, SIGNAL(geometryChanged()), &_inner, SLOT(onParentGeometryChanged())); connect(&_scroll, SIGNAL(scrolled()), &_inner, SLOT(onUpdateSelected())); - if (cPlatform() == dbipMac) { + if (cPlatform() == dbipMac || cPlatform() == dbipMacOld) { connect(App::wnd()->windowHandle(), SIGNAL(activeChanged()), this, SLOT(onWndActiveChanged())); } } diff --git a/Telegram/SourceFiles/dropdown.h b/Telegram/SourceFiles/dropdown.h index 25304c82c..9a64fce25 100644 --- a/Telegram/SourceFiles/dropdown.h +++ b/Telegram/SourceFiles/dropdown.h @@ -348,6 +348,8 @@ public: public slots: void updateSelected(); + void onSettings(); + void onPreview(); signals: @@ -391,6 +393,11 @@ private: int32 _selected, _pressedSel; QPoint _lastMousePos; + + LinkButton _settings; + + QTimer _previewTimer; + bool _previewShown; }; class EmojiPanel : public TWidget { @@ -545,7 +552,7 @@ private: BoxShadow _shadow; - FlatRadiobutton _recent, _people, _nature, _food, _celebration, _activity, _travel, _objects; + FlatRadiobutton _recent, _people, _nature, _food, _activity, _travel, _objects, _symbols; QVector _icons; QVector _iconHovers; int32 _iconOver, _iconSel, _iconDown; diff --git a/Telegram/SourceFiles/facades.cpp b/Telegram/SourceFiles/facades.cpp new file mode 100644 index 000000000..caa7fb9de --- /dev/null +++ b/Telegram/SourceFiles/facades.cpp @@ -0,0 +1,109 @@ +/* +This file is part of Telegram Desktop, +the official desktop version of Telegram messaging app, see https://telegram.org + +Telegram Desktop is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +It is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +In addition, as a special exception, the copyright holders give permission +to link the code of portions of this program with the OpenSSL library. + +Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE +Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org +*/ +#include "stdafx.h" + +#include "window.h" +#include "mainwidget.h" + +namespace App { + + void sendBotCommand(const QString &cmd, MsgId replyTo) { + if (MainWidget *m = main()) m->sendBotCommand(cmd, replyTo); + } + + void insertBotCommand(const QString &cmd) { + if (MainWidget *m = main()) m->insertBotCommand(cmd); + } + + void searchByHashtag(const QString &tag, PeerData *inPeer) { + if (MainWidget *m = main()) m->searchMessages(tag + ' ', (inPeer && inPeer->isChannel()) ? inPeer : 0); + } + + void openPeerByName(const QString &username, bool toProfile, const QString &startToken) { + if (MainWidget *m = main()) m->openPeerByName(username, toProfile, startToken); + } + + void joinGroupByHash(const QString &hash) { + if (MainWidget *m = main()) m->joinGroupByHash(hash); + } + + void stickersBox(const QString &name) { + if (MainWidget *m = main()) m->stickersBox(MTP_inputStickerSetShortName(MTP_string(name))); + } + + void openLocalUrl(const QString &url) { + if (MainWidget *m = main()) m->openLocalUrl(url); + } + + bool forward(const PeerId &peer, ForwardWhatMessages what) { + if (MainWidget *m = main()) return m->onForward(peer, what); + return false; + } + + void removeDialog(History *history) { + if (MainWidget *m = main()) m->removeDialog(history); + } + + void showSettings() { + if (Window *win = wnd()) win->showSettings(); + } + + void showLayer(LayeredWidget *widget, bool forceFast) { + if (Window *w = wnd()) w->showLayer(widget, forceFast); + } + + void replaceLayer(LayeredWidget *widget) { + if (Window *w = wnd()) w->replaceLayer(widget); + } + + void showLayerLast(LayeredWidget *widget) { + if (Window *w = wnd()) w->showLayerLast(widget); + } + +} + +namespace Ui { + + void showStickerPreview(DocumentData *sticker) { + if (MainWidget *m = App::main()) m->ui_showStickerPreview(sticker); + } + + void hideStickerPreview() { + if (MainWidget *m = App::main()) m->ui_hideStickerPreview(); + } + +} + +namespace Notify { + + void userIsBotChanged(UserData *user) { + if (MainWidget *m = App::main()) m->notifyUserIsBotChanged(user); + } + + void botCommandsChanged(UserData *user) { + if (MainWidget *m = App::main()) m->notifyBotCommandsChanged(user); + } + + void migrateUpdated(PeerData *peer) { + if (MainWidget *m = App::main()) m->notifyMigrateUpdated(peer); + } + +} diff --git a/Telegram/SourceFiles/facades.h b/Telegram/SourceFiles/facades.h new file mode 100644 index 000000000..afbbb8e07 --- /dev/null +++ b/Telegram/SourceFiles/facades.h @@ -0,0 +1,56 @@ +/* +This file is part of Telegram Desktop, +the official desktop version of Telegram messaging app, see https://telegram.org + +Telegram Desktop is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +It is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +In addition, as a special exception, the copyright holders give permission +to link the code of portions of this program with the OpenSSL library. + +Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE +Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org +*/ +#pragma once + +class LayeredWidget; + +namespace App { + + void sendBotCommand(const QString &cmd, MsgId replyTo = 0); + void insertBotCommand(const QString &cmd); + void searchByHashtag(const QString &tag, PeerData *inPeer); + void openPeerByName(const QString &username, bool toProfile = false, const QString &startToken = QString()); + void joinGroupByHash(const QString &hash); + void stickersBox(const QString &name); + void openLocalUrl(const QString &url); + bool forward(const PeerId &peer, ForwardWhatMessages what); + void removeDialog(History *history); + void showSettings(); + void showLayer(LayeredWidget *w, bool forceFast = false); + void replaceLayer(LayeredWidget *w); + void showLayerLast(LayeredWidget *w); + +}; + +namespace Ui { // it doesn't allow me to use UI :( + + void showStickerPreview(DocumentData *sticker); + void hideStickerPreview(); + +}; + +namespace Notify { + + void userIsBotChanged(UserData *user); + void botCommandsChanged(UserData *user); + void migrateUpdated(PeerData *peer); + +}; diff --git a/Telegram/SourceFiles/fileuploader.cpp b/Telegram/SourceFiles/fileuploader.cpp index 12f5b4e85..3a2c7eae2 100644 --- a/Telegram/SourceFiles/fileuploader.cpp +++ b/Telegram/SourceFiles/fileuploader.cpp @@ -41,7 +41,7 @@ void FileUploader::uploadMedia(const FullMsgId &msgId, const ReadyLocalMedia &me } document->status = FileUploading; if (!media.file.isEmpty()) { - document->location = FileLocation(StorageFilePartial, media.file); + document->setLocation(FileLocation(StorageFilePartial, media.file)); } } else if (media.type == PrepareAudio) { AudioData *audio = App::feedAudio(media.audio); @@ -64,7 +64,7 @@ void FileUploader::upload(const FullMsgId &msgId, const FileLoadResultPtr &file) } document->status = FileUploading; if (!file->filepath.isEmpty()) { - document->location = FileLocation(StorageFilePartial, file->filepath); + document->setLocation(FileLocation(StorageFilePartial, file->filepath)); } } else if (file->type == PrepareAudio) { AudioData *audio = App::feedAudio(file->audio); diff --git a/Telegram/SourceFiles/gui/animation.cpp b/Telegram/SourceFiles/gui/animation.cpp index 8cd76f8b0..72a2a8d27 100644 --- a/Telegram/SourceFiles/gui/animation.cpp +++ b/Telegram/SourceFiles/gui/animation.cpp @@ -161,10 +161,17 @@ bool AnimatedGif::animStep(float64 ms) { return true; } -void AnimatedGif::start(HistoryItem *row, const QString &file) { +void AnimatedGif::start(HistoryItem *row, const FileLocation &f) { stop(); - reader = new QImageReader(file); + file = new FileLocation(f); + if (!file->accessEnable()) { + stop(); + return; + } + access = true; + + reader = new QImageReader(file->name()); if (!reader->canRead() || !reader->supportsAnimation()) { stop(); return; @@ -206,6 +213,15 @@ void AnimatedGif::start(HistoryItem *row, const QString &file) { } void AnimatedGif::stop(bool onItemRemoved) { + if (file) { + if (access) { + file->accessDisable(); + } + delete file; + file = 0; + } + access = false; + if (isNull()) return; delete reader; diff --git a/Telegram/SourceFiles/gui/animation.h b/Telegram/SourceFiles/gui/animation.h index 7ed62ca0d..4f92671ed 100644 --- a/Telegram/SourceFiles/gui/animation.h +++ b/Telegram/SourceFiles/gui/animation.h @@ -387,17 +387,18 @@ private: }; class HistoryItem; +class FileLocation; class AnimatedGif : public QObject, public Animated { Q_OBJECT public: - AnimatedGif() : msg(0), reader(0), w(0), h(0), frame(0), framesCount(0), duration(0) { + AnimatedGif() : msg(0), file(0), access(false), reader(0), w(0), h(0), frame(0), framesCount(0), duration(0) { } bool animStep(float64 ms); - void start(HistoryItem *row, const QString &file); + void start(HistoryItem *row, const FileLocation &file); void stop(bool onItemRemoved = false); bool isNull() const { @@ -418,6 +419,8 @@ public: HistoryItem *msg; QImage img; + FileLocation *file; + bool access; QImageReader *reader; int32 w, h, frame; diff --git a/Telegram/SourceFiles/gui/countryinput.h b/Telegram/SourceFiles/gui/countryinput.h index ff6c7e234..457c177e4 100644 --- a/Telegram/SourceFiles/gui/countryinput.h +++ b/Telegram/SourceFiles/gui/countryinput.h @@ -151,98 +151,3 @@ private: ScrollableBoxShadow _topShadow; }; - -/** / -class CountryList : public QWidget { - Q_OBJECT - -public: - - CountryList(QWidget *parent, const style::countryList &st = st::countryList); - - void paintEvent(QPaintEvent *e); - void mouseMoveEvent(QMouseEvent *e); - void mousePressEvent(QMouseEvent *e); - void enterEvent(QEvent *e); - void leaveEvent(QEvent *e); - - void selectSkip(int delta); - void selectSkipPage(int h, int delta); - - void updateFiltered(); - - QString getSelectedCountry() const; - -public slots: - - void onUpdateSelected(bool force = false); - void onParentGeometryChanged(); - -signals: - - void countrySelected(); - void mustScrollTo(int scrollToTop, int scrollToBottom); - -private: - - void resetList(); - void setSelected(int newSelected); - - int _sel; - style::countryList _st; - QPoint _mousePos; - - bool _mouseSel; - -}; - -class CountrySelect : public QWidget, public Animated { - Q_OBJECT - -public: - - CountrySelect(); - - void paintEvent(QPaintEvent *e); - void keyPressEvent(QKeyEvent *e); - void mousePressEvent(QMouseEvent *e); - void resizeEvent(QResizeEvent *e); - - bool animStep(float64 ms); - - ~CountrySelect(); - -signals: - - void countryChosen(const QString &country = QString()); - void countryFinished(); - -public slots: - - void onParentResize(const QSize &newSize); - void onCountryChoose(); - void onCountryCancel(); - void onScrollFinished(); - void onFilterUpdate(); - -private: - - void finish(const QString &res); - void prepareAnimation(int to); - - QString _result; - FlatInput _filter; - ScrollArea _scroll; - CountryList _list; - BoxButton _doneButton, _cancelButton; - int32 _innerLeft, _innerTop, _innerWidth, _innerHeight; - - anim::fvalue a_alpha, a_bgAlpha; - anim::ivalue a_coord; - anim::transition af_alpha, af_bgAlpha, af_coord; - QPixmap _cache; - - BoxShadow _shadow; - -}; -*/ \ No newline at end of file diff --git a/Telegram/SourceFiles/gui/emoji_config.cpp b/Telegram/SourceFiles/gui/emoji_config.cpp index f6f79aaf0..32e28e62b 100644 --- a/Telegram/SourceFiles/gui/emoji_config.cpp +++ b/Telegram/SourceFiles/gui/emoji_config.cpp @@ -27,7 +27,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org namespace { EmojiData *emojis = 0; - char emojisData[sizeof(EmojiData) * 1180]; + char emojisData[sizeof(EmojiData) * 1604]; } int EmojiSizes[] = { 18, 22, 27, 36, 45 }, EIndex = -1, ESize = 0; @@ -46,1186 +46,1610 @@ void emojiInit() { EmojiData *toFill = emojis = (EmojiData*)emojisData; - new (toFill++) EmojiData(18, 27, 0xA9U, 0, 1, 0, 0); - new (toFill++) EmojiData(19, 27, 0xAEU, 0, 1, 0, 0); - new (toFill++) EmojiData(29, 27, 0x203CU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(30, 27, 0x2049U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(17, 27, 0x2122U, 0, 1, 0, 0); - new (toFill++) EmojiData(6, 27, 0x2139U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(21, 26, 0x2194U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(20, 26, 0x2195U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(19, 26, 0x2196U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(16, 26, 0x2197U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(17, 26, 0x2198U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(18, 26, 0x2199U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(24, 26, 0x21A9U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(23, 26, 0x21AAU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(35, 20, 0x231AU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(1, 21, 0x231BU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(8, 26, 0x23E9U, 0, 1, 0, 0); - new (toFill++) EmojiData(9, 26, 0x23EAU, 0, 1, 0, 0); - new (toFill++) EmojiData(10, 26, 0x23EBU, 0, 1, 0, 0); - new (toFill++) EmojiData(11, 26, 0x23ECU, 0, 1, 0, 0); - new (toFill++) EmojiData(39, 20, 0x23F0U, 0, 1, 0, 0); - new (toFill++) EmojiData(0, 21, 0x23F3U, 0, 1, 0, 0); - new (toFill++) EmojiData(0, 28, 0x24C2U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(26, 28, 0x25AAU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(27, 28, 0x25ABU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(4, 26, 0x25B6U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(5, 26, 0x25C0U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(31, 28, 0x25FBU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(30, 28, 0x25FCU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(33, 28, 0x25FDU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(32, 28, 0x25FEU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(37, 11, 0x2600U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(39, 11, 0x2601U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(9, 21, 0x260EU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(14, 28, 0x2611U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(2, 12, 0x2614U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(3, 14, 0x2615U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(30, 7, 0x261DU, 0, 1, 0xFE0F, 0xFFFF0355U); - new (toFill++) EmojiData(12, 0, 0x263AU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(24, 25, 0x2648U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(25, 25, 0x2649U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(26, 25, 0x264AU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(27, 25, 0x264BU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(28, 25, 0x264CU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(29, 25, 0x264DU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(30, 25, 0x264EU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(31, 25, 0x264FU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(32, 25, 0x2650U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(33, 25, 0x2651U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(34, 25, 0x2652U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(35, 25, 0x2653U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(10, 28, 0x2660U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(11, 28, 0x2663U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(12, 28, 0x2665U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(13, 28, 0x2666U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(6, 28, 0x2668U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(7, 28, 0x267BU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(0, 26, 0x267FU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(32, 18, 0x2693U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(5, 28, 0x26A0U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(34, 11, 0x26A1U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(15, 28, 0x26AAU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(16, 28, 0x26ABU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(35, 16, 0x26BDU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(38, 16, 0x26BEU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(14, 16, 0x26C4U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(38, 11, 0x26C5U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(1, 28, 0x26CEU, 0, 1, 0, 0); - new (toFill++) EmojiData(13, 24, 0x26D4U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(30, 19, 0x26EAU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(11, 19, 0x26F2U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(1, 17, 0x26F3U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(35, 18, 0x26F5U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(33, 16, 0x26FAU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(24, 18, 0x26FDU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(24, 23, 0x2702U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(3, 25, 0x2705U, 0, 1, 0, 0); - new (toFill++) EmojiData(30, 18, 0x2708U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(26, 22, 0x2709U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(38, 8, 0x270AU, 0, 1, 0, 0xFFFF035AU); - new (toFill++) EmojiData(4, 9, 0x270BU, 0, 1, 0, 0xFFFF035FU); - new (toFill++) EmojiData(26, 8, 0x270CU, 0, 1, 0xFE0F, 0xFFFF0364U); - new (toFill++) EmojiData(32, 23, 0x270FU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(31, 23, 0x2712U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(15, 27, 0x2714U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(14, 27, 0x2716U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(25, 14, 0x2728U, 0, 1, 0, 0); - new (toFill++) EmojiData(1, 25, 0x2733U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(4, 25, 0x2734U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(4, 12, 0x2744U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(0, 25, 0x2747U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(31, 27, 0x274CU, 0, 1, 0, 0); - new (toFill++) EmojiData(2, 25, 0x274EU, 0, 1, 0, 0); - new (toFill++) EmojiData(26, 27, 0x2753U, 0, 1, 0, 0); - new (toFill++) EmojiData(28, 27, 0x2754U, 0, 1, 0, 0); - new (toFill++) EmojiData(27, 27, 0x2755U, 0, 1, 0, 0); - new (toFill++) EmojiData(25, 27, 0x2757U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(35, 14, 0x2764U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(10, 27, 0x2795U, 0, 1, 0, 0); - new (toFill++) EmojiData(11, 27, 0x2796U, 0, 1, 0, 0); - new (toFill++) EmojiData(13, 27, 0x2797U, 0, 1, 0, 0); - new (toFill++) EmojiData(12, 26, 0x27A1U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(22, 27, 0x27B0U, 0, 1, 0, 0); - new (toFill++) EmojiData(23, 27, 0x27BFU, 0, 1, 0, 0); - new (toFill++) EmojiData(25, 26, 0x2934U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(26, 26, 0x2935U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(13, 26, 0x2B05U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(14, 26, 0x2B06U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(15, 26, 0x2B07U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(28, 28, 0x2B1BU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(29, 28, 0x2B1CU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(6, 12, 0x2B50U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(32, 27, 0x2B55U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(12, 27, 0x3030U, 0, 1, 0, 0); - new (toFill++) EmojiData(24, 27, 0x303DU, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(25, 24, 0x3297U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(24, 24, 0x3299U, 0, 1, 0xFE0F, 0); - new (toFill++) EmojiData(30, 26, 0x2320E3U, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 26, 0x3020E3U, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 26, 0x3120E3U, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 26, 0x3220E3U, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 26, 0x3320E3U, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 26, 0x3420E3U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 26, 0x3520E3U, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 26, 0x3620E3U, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 26, 0x3720E3U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 26, 0x3820E3U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 27, 0x3920E3U, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 17, 0xD83CDC04U, 0, 2, 0xFE0F, 0); - new (toFill++) EmojiData(28, 17, 0xD83CDCCFU, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 25, 0xD83CDD70U, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 25, 0xD83CDD71U, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 25, 0xD83CDD7EU, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 25, 0xD83CDD7FU, 0, 2, 0xFE0F, 0); - new (toFill++) EmojiData(10, 25, 0xD83CDD8EU, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 25, 0xD83CDD91U, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 25, 0xD83CDD92U, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 25, 0xD83CDD93U, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 25, 0xD83CDD94U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 25, 0xD83CDD95U, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 25, 0xD83CDD96U, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 25, 0xD83CDD97U, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 25, 0xD83CDD98U, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 25, 0xD83CDD99U, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 25, 0xD83CDD9AU, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 24, 0xD83CDE01U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 24, 0xD83CDE02U, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 24, 0xD83CDE1AU, 0, 2, 0xFE0F, 0); - new (toFill++) EmojiData(38, 24, 0xD83CDE2FU, 0, 2, 0xFE0F, 0); - new (toFill++) EmojiData(28, 24, 0xD83CDE32U, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 24, 0xD83CDE33U, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 24, 0xD83CDE34U, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 24, 0xD83CDE35U, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 24, 0xD83CDE36U, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 24, 0xD83CDE37U, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 24, 0xD83CDE38U, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 24, 0xD83CDE39U, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 24, 0xD83CDE3AU, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 24, 0xD83CDE50U, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 24, 0xD83CDE51U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 27, 0xD83CDF00U, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 19, 0xD83CDF01U, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 21, 0xD83CDF02U, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 19, 0xD83CDF03U, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 12, 0xD83CDF04U, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 12, 0xD83CDF05U, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 19, 0xD83CDF06U, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 19, 0xD83CDF07U, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 12, 0xD83CDF08U, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 19, 0xD83CDF09U, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 12, 0xD83CDF0AU, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 12, 0xD83CDF0BU, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 12, 0xD83CDF0CU, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 12, 0xD83CDF0DU, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 12, 0xD83CDF0EU, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 12, 0xD83CDF0FU, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 12, 0xD83CDF10U, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 12, 0xD83CDF11U, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 12, 0xD83CDF12U, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 12, 0xD83CDF13U, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 12, 0xD83CDF14U, 0, 2, 0, 0); - new (toFill++) EmojiData(24, 12, 0xD83CDF15U, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 12, 0xD83CDF16U, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 12, 0xD83CDF17U, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 12, 0xD83CDF18U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 11, 0xD83CDF19U, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 12, 0xD83CDF1AU, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 12, 0xD83CDF1BU, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 12, 0xD83CDF1CU, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 12, 0xD83CDF1DU, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 12, 0xD83CDF1EU, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 12, 0xD83CDF1FU, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 12, 0xD83CDF20U, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 10, 0xD83CDF30U, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 9, 0xD83CDF31U, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 9, 0xD83CDF32U, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 9, 0xD83CDF33U, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 9, 0xD83CDF34U, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 9, 0xD83CDF35U, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 9, 0xD83CDF37U, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 9, 0xD83CDF38U, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 9, 0xD83CDF39U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 9, 0xD83CDF3AU, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 9, 0xD83CDF3BU, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 9, 0xD83CDF3CU, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 12, 0xD83CDF3DU, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 10, 0xD83CDF3EU, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 10, 0xD83CDF3FU, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 10, 0xD83CDF40U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 10, 0xD83CDF41U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 10, 0xD83CDF42U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 10, 0xD83CDF43U, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 10, 0xD83CDF44U, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 12, 0xD83CDF45U, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 12, 0xD83CDF46U, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 12, 0xD83CDF47U, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 12, 0xD83CDF48U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 12, 0xD83CDF49U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 13, 0xD83CDF4AU, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 13, 0xD83CDF4BU, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 13, 0xD83CDF4CU, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 13, 0xD83CDF4DU, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 13, 0xD83CDF4EU, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 13, 0xD83CDF4FU, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 13, 0xD83CDF50U, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 13, 0xD83CDF51U, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 13, 0xD83CDF52U, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 13, 0xD83CDF53U, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 13, 0xD83CDF54U, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 13, 0xD83CDF55U, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 13, 0xD83CDF56U, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 13, 0xD83CDF57U, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 13, 0xD83CDF58U, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 13, 0xD83CDF59U, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 13, 0xD83CDF5AU, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 13, 0xD83CDF5BU, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 13, 0xD83CDF5CU, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 13, 0xD83CDF5DU, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 13, 0xD83CDF5EU, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 13, 0xD83CDF5FU, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 12, 0xD83CDF60U, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 13, 0xD83CDF61U, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 13, 0xD83CDF62U, 0, 2, 0, 0); - new (toFill++) EmojiData(24, 13, 0xD83CDF63U, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 13, 0xD83CDF64U, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 13, 0xD83CDF65U, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 13, 0xD83CDF66U, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 13, 0xD83CDF67U, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 13, 0xD83CDF68U, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 13, 0xD83CDF69U, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 13, 0xD83CDF6AU, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 13, 0xD83CDF6BU, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 13, 0xD83CDF6CU, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 13, 0xD83CDF6DU, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 13, 0xD83CDF6EU, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 13, 0xD83CDF6FU, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 13, 0xD83CDF70U, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 13, 0xD83CDF71U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 13, 0xD83CDF72U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 14, 0xD83CDF73U, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 14, 0xD83CDF74U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 14, 0xD83CDF75U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 14, 0xD83CDF76U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 14, 0xD83CDF77U, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 14, 0xD83CDF78U, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 14, 0xD83CDF79U, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 14, 0xD83CDF7AU, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 14, 0xD83CDF7BU, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 14, 0xD83CDF7CU, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 14, 0xD83CDF80U, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 14, 0xD83CDF81U, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 14, 0xD83CDF82U, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 14, 0xD83CDF83U, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 14, 0xD83CDF84U, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 4, 0xD83CDF85U, 0, 2, 0, 0xFFFF0393U); - new (toFill++) EmojiData(19, 14, 0xD83CDF86U, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 14, 0xD83CDF87U, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 14, 0xD83CDF88U, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 14, 0xD83CDF89U, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 14, 0xD83CDF8AU, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 14, 0xD83CDF8BU, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 14, 0xD83CDF8CU, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 14, 0xD83CDF8DU, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 14, 0xD83CDF8EU, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 14, 0xD83CDF8FU, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 14, 0xD83CDF90U, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 14, 0xD83CDF91U, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 21, 0xD83CDF92U, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 14, 0xD83CDF93U, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 17, 0xD83CDFA0U, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 17, 0xD83CDFA1U, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 17, 0xD83CDFA2U, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 16, 0xD83CDFA3U, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 17, 0xD83CDFA4U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 21, 0xD83CDFA5U, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 27, 0xD83CDFA6U, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 17, 0xD83CDFA7U, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 17, 0xD83CDFA8U, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 17, 0xD83CDFA9U, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 17, 0xD83CDFAAU, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 17, 0xD83CDFABU, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 17, 0xD83CDFACU, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 17, 0xD83CDFADU, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 17, 0xD83CDFAEU, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 17, 0xD83CDFAFU, 0, 2, 0, 0); - new (toFill++) EmojiData(24, 17, 0xD83CDFB0U, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 17, 0xD83CDFB1U, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 17, 0xD83CDFB2U, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 17, 0xD83CDFB3U, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 17, 0xD83CDFB4U, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 17, 0xD83CDFB5U, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 17, 0xD83CDFB6U, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 17, 0xD83CDFB7U, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 17, 0xD83CDFB8U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 17, 0xD83CDFB9U, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 17, 0xD83CDFBAU, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 17, 0xD83CDFBBU, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 17, 0xD83CDFBCU, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 17, 0xD83CDFBDU, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 16, 0xD83CDFBEU, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 16, 0xD83CDFBFU, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 16, 0xD83CDFC0U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 17, 0xD83CDFC1U, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 16, 0xD83CDFC2U, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 15, 0xD83CDFC3U, 0, 2, 0, 0xFFFF0398U); - new (toFill++) EmojiData(0, 16, 0xD83CDFC4U, 0, 2, 0, 0xFFFF039DU); - new (toFill++) EmojiData(2, 17, 0xD83CDFC6U, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 16, 0xD83CDFC7U, 0, 2, 0, 0xFFFF03A2U); - new (toFill++) EmojiData(37, 16, 0xD83CDFC8U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 17, 0xD83CDFC9U, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 15, 0xD83CDFCAU, 0, 2, 0, 0xFFFF03A7U); - new (toFill++) EmojiData(18, 19, 0xD83CDFE0U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 19, 0xD83CDFE1U, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 19, 0xD83CDFE2U, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 19, 0xD83CDFE3U, 0, 2, 0, 0); - new (toFill++) EmojiData(24, 19, 0xD83CDFE4U, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 19, 0xD83CDFE5U, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 19, 0xD83CDFE6U, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 25, 0xD83CDFE7U, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 19, 0xD83CDFE8U, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 19, 0xD83CDFE9U, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 19, 0xD83CDFEAU, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 19, 0xD83CDFEBU, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 19, 0xD83CDFECU, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 19, 0xD83CDFEDU, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 14, 0xD83CDFEEU, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 19, 0xD83CDFEFU, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 19, 0xD83CDFF0U, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 10, 0xD83DDC00U, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 10, 0xD83DDC01U, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 10, 0xD83DDC02U, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 10, 0xD83DDC03U, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 10, 0xD83DDC04U, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 10, 0xD83DDC05U, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 10, 0xD83DDC06U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 10, 0xD83DDC07U, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 10, 0xD83DDC08U, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 11, 0xD83DDC09U, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 11, 0xD83DDC0AU, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 11, 0xD83DDC0BU, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 11, 0xD83DDC0CU, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 11, 0xD83DDC0DU, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 10, 0xD83DDC0EU, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 10, 0xD83DDC0FU, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 10, 0xD83DDC10U, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 10, 0xD83DDC11U, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 11, 0xD83DDC12U, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 10, 0xD83DDC13U, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 10, 0xD83DDC14U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 11, 0xD83DDC15U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 10, 0xD83DDC16U, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 10, 0xD83DDC17U, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 10, 0xD83DDC18U, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 11, 0xD83DDC19U, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 11, 0xD83DDC1AU, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 11, 0xD83DDC1BU, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 11, 0xD83DDC1CU, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 11, 0xD83DDC1DU, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 11, 0xD83DDC1EU, 0, 2, 0, 0); - new (toFill++) EmojiData(24, 11, 0xD83DDC1FU, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 11, 0xD83DDC20U, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 11, 0xD83DDC21U, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 11, 0xD83DDC22U, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 10, 0xD83DDC23U, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 10, 0xD83DDC24U, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 10, 0xD83DDC25U, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 10, 0xD83DDC26U, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 10, 0xD83DDC27U, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 11, 0xD83DDC28U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 11, 0xD83DDC29U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 10, 0xD83DDC2AU, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 10, 0xD83DDC2BU, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 11, 0xD83DDC2CU, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 10, 0xD83DDC2DU, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 10, 0xD83DDC2EU, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 10, 0xD83DDC2FU, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 10, 0xD83DDC30U, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 10, 0xD83DDC31U, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 11, 0xD83DDC32U, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 11, 0xD83DDC33U, 0, 2, 0, 0); - new (toFill++) EmojiData(24, 10, 0xD83DDC34U, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 11, 0xD83DDC35U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 11, 0xD83DDC36U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 11, 0xD83DDC37U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 11, 0xD83DDC38U, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 10, 0xD83DDC39U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 11, 0xD83DDC3AU, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 11, 0xD83DDC3BU, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 11, 0xD83DDC3CU, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 11, 0xD83DDC3DU, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 11, 0xD83DDC3EU, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 6, 0xD83DDC40U, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 6, 0xD83DDC42U, 0, 2, 0, 0xFFFF03ACU); - new (toFill++) EmojiData(37, 6, 0xD83DDC43U, 0, 2, 0, 0xFFFF03B1U); - new (toFill++) EmojiData(3, 7, 0xD83DDC44U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 7, 0xD83DDC45U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 7, 0xD83DDC46U, 0, 2, 0, 0xFFFF03B6U); - new (toFill++) EmojiData(2, 8, 0xD83DDC47U, 0, 2, 0, 0xFFFF03BBU); - new (toFill++) EmojiData(8, 8, 0xD83DDC48U, 0, 2, 0, 0xFFFF03C0U); - new (toFill++) EmojiData(14, 8, 0xD83DDC49U, 0, 2, 0, 0xFFFF03C5U); - new (toFill++) EmojiData(32, 8, 0xD83DDC4AU, 0, 2, 0, 0xFFFF03CAU); - new (toFill++) EmojiData(12, 7, 0xD83DDC4BU, 0, 2, 0, 0xFFFF03CFU); - new (toFill++) EmojiData(20, 8, 0xD83DDC4CU, 0, 2, 0, 0xFFFF03D4U); - new (toFill++) EmojiData(18, 7, 0xD83DDC4DU, 0, 2, 0, 0xFFFF03D9U); - new (toFill++) EmojiData(24, 7, 0xD83DDC4EU, 0, 2, 0, 0xFFFF03DEU); - new (toFill++) EmojiData(24, 6, 0xD83DDC4FU, 0, 2, 0, 0xFFFF03E3U); - new (toFill++) EmojiData(16, 9, 0xD83DDC50U, 0, 2, 0, 0xFFFF03E8U); - new (toFill++) EmojiData(28, 14, 0xD83DDC51U, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 21, 0xD83DDC52U, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 21, 0xD83DDC53U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 22, 0xD83DDC54U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 22, 0xD83DDC55U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 22, 0xD83DDC56U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 22, 0xD83DDC57U, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 22, 0xD83DDC58U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 21, 0xD83DDC59U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 22, 0xD83DDC5AU, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 21, 0xD83DDC5BU, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 21, 0xD83DDC5CU, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 21, 0xD83DDC5DU, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 21, 0xD83DDC5EU, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 21, 0xD83DDC5FU, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 21, 0xD83DDC60U, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 21, 0xD83DDC61U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 21, 0xD83DDC62U, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 1, 0xD83DDC63U, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 1, 0xD83DDC64U, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 1, 0xD83DDC65U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 1, 0xD83DDC66U, 0, 2, 0, 0xFFFF03EDU); - new (toFill++) EmojiData(2, 2, 0xD83DDC67U, 0, 2, 0, 0xFFFF03F2U); - new (toFill++) EmojiData(8, 2, 0xD83DDC68U, 0, 2, 0, 0xFFFF03F7U); - new (toFill++) EmojiData(14, 2, 0xD83DDC69U, 0, 2, 0, 0xFFFF03FCU); - new (toFill++) EmojiData(20, 2, 0xD83DDC6AU, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 2, 0xD83DDC6BU, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 2, 0xD83DDC6CU, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 2, 0xD83DDC6DU, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 3, 0xD83DDC6EU, 0, 2, 0, 0xFFFF0401U); - new (toFill++) EmojiData(38, 2, 0xD83DDC6FU, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 2, 0xD83DDC70U, 0, 2, 0, 0xFFFF0406U); - new (toFill++) EmojiData(5, 3, 0xD83DDC71U, 0, 2, 0, 0xFFFF040BU); - new (toFill++) EmojiData(11, 3, 0xD83DDC72U, 0, 2, 0, 0xFFFF0410U); - new (toFill++) EmojiData(17, 3, 0xD83DDC73U, 0, 2, 0, 0xFFFF0415U); - new (toFill++) EmojiData(23, 3, 0xD83DDC74U, 0, 2, 0, 0xFFFF041AU); - new (toFill++) EmojiData(29, 3, 0xD83DDC75U, 0, 2, 0, 0xFFFF041FU); - new (toFill++) EmojiData(30, 1, 0xD83DDC76U, 0, 2, 0, 0xFFFF0424U); - new (toFill++) EmojiData(1, 4, 0xD83DDC77U, 0, 2, 0, 0xFFFF0429U); - new (toFill++) EmojiData(7, 4, 0xD83DDC78U, 0, 2, 0, 0xFFFF042EU); - new (toFill++) EmojiData(32, 4, 0xD83DDC79U, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 4, 0xD83DDC7AU, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 4, 0xD83DDC7BU, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 4, 0xD83DDC7CU, 0, 2, 0, 0xFFFF0433U); - new (toFill++) EmojiData(36, 4, 0xD83DDC7DU, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 4, 0xD83DDC7EU, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 0, 0xD83DDC7FU, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 4, 0xD83DDC80U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 5, 0xD83DDC81U, 0, 2, 0, 0xFFFF0438U); - new (toFill++) EmojiData(13, 4, 0xD83DDC82U, 0, 2, 0, 0xFFFF043DU); - new (toFill++) EmojiData(22, 15, 0xD83DDC83U, 0, 2, 0, 0xFFFF0442U); - new (toFill++) EmojiData(31, 21, 0xD83DDC84U, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 7, 0xD83DDC85U, 0, 2, 0, 0xFFFF0447U); - new (toFill++) EmojiData(0, 6, 0xD83DDC86U, 0, 2, 0, 0xFFFF044CU); - new (toFill++) EmojiData(6, 6, 0xD83DDC87U, 0, 2, 0, 0xFFFF0451U); - new (toFill++) EmojiData(10, 22, 0xD83DDC88U, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 22, 0xD83DDC89U, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 22, 0xD83DDC8AU, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 7, 0xD83DDC8BU, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 14, 0xD83DDC8CU, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 14, 0xD83DDC8DU, 0, 2, 0, 0); - new (toFill++) EmojiData(24, 21, 0xD83DDC8EU, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 6, 0xD83DDC8FU, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 9, 0xD83DDC90U, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 6, 0xD83DDC91U, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 19, 0xD83DDC92U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 15, 0xD83DDC93U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 14, 0xD83DDC94U, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 14, 0xD83DDC95U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 15, 0xD83DDC96U, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 15, 0xD83DDC97U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 15, 0xD83DDC98U, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 15, 0xD83DDC99U, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 15, 0xD83DDC9AU, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 15, 0xD83DDC9BU, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 15, 0xD83DDC9CU, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 15, 0xD83DDC9DU, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 14, 0xD83DDC9EU, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 15, 0xD83DDC9FU, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 28, 0xD83DDCA0U, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 21, 0xD83DDCA1U, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 28, 0xD83DDCA2U, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 22, 0xD83DDCA3U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 24, 0xD83DDCA4U, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 14, 0xD83DDCA5U, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 12, 0xD83DDCA6U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 12, 0xD83DDCA7U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 12, 0xD83DDCA8U, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 4, 0xD83DDCA9U, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 9, 0xD83DDCAAU, 0, 2, 0, 0xFFFF0456U); - new (toFill++) EmojiData(24, 14, 0xD83DDCABU, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 24, 0xD83DDCACU, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 24, 0xD83DDCADU, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 24, 0xD83DDCAEU, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 27, 0xD83DDCAFU, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 21, 0xD83DDCB0U, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 27, 0xD83DDCB1U, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 27, 0xD83DDCB2U, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 21, 0xD83DDCB3U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 19, 0xD83DDCB4U, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 19, 0xD83DDCB5U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 19, 0xD83DDCB6U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 19, 0xD83DDCB7U, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 21, 0xD83DDCB8U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 24, 0xD83DDCB9U, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 18, 0xD83DDCBAU, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 20, 0xD83DDCBBU, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 21, 0xD83DDCBCU, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 21, 0xD83DDCBDU, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 21, 0xD83DDCBEU, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 21, 0xD83DDCBFU, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 21, 0xD83DDCC0U, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 23, 0xD83DDCC1U, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 23, 0xD83DDCC2U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 23, 0xD83DDCC3U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 22, 0xD83DDCC4U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 23, 0xD83DDCC5U, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 23, 0xD83DDCC6U, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 23, 0xD83DDCC7U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 23, 0xD83DDCC8U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 23, 0xD83DDCC9U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 23, 0xD83DDCCAU, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 23, 0xD83DDCCBU, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 23, 0xD83DDCCCU, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 23, 0xD83DDCCDU, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 23, 0xD83DDCCEU, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 23, 0xD83DDCCFU, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 23, 0xD83DDCD0U, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 23, 0xD83DDCD1U, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 23, 0xD83DDCD2U, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 23, 0xD83DDCD3U, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 23, 0xD83DDCD4U, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 23, 0xD83DDCD5U, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 23, 0xD83DDCD6U, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 23, 0xD83DDCD7U, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 23, 0xD83DDCD8U, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 23, 0xD83DDCD9U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 23, 0xD83DDCDAU, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 24, 0xD83DDCDBU, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 23, 0xD83DDCDCU, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 23, 0xD83DDCDDU, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 21, 0xD83DDCDEU, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 21, 0xD83DDCDFU, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 21, 0xD83DDCE0U, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 21, 0xD83DDCE1U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 23, 0xD83DDCE2U, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 23, 0xD83DDCE3U, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 22, 0xD83DDCE4U, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 22, 0xD83DDCE5U, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 22, 0xD83DDCE6U, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 22, 0xD83DDCE7U, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 22, 0xD83DDCE8U, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 22, 0xD83DDCE9U, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 22, 0xD83DDCEAU, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 22, 0xD83DDCEBU, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 22, 0xD83DDCECU, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 22, 0xD83DDCEDU, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 22, 0xD83DDCEEU, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 22, 0xD83DDCEFU, 0, 2, 0, 0); - new (toFill++) EmojiData(24, 22, 0xD83DDCF0U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 20, 0xD83DDCF1U, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 20, 0xD83DDCF2U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 25, 0xD83DDCF3U, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 25, 0xD83DDCF4U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 24, 0xD83DDCF5U, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 27, 0xD83DDCF6U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 21, 0xD83DDCF7U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 21, 0xD83DDCF9U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 21, 0xD83DDCFAU, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 21, 0xD83DDCFBU, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 21, 0xD83DDCFCU, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 26, 0xD83DDD00U, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 26, 0xD83DDD01U, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 26, 0xD83DDD02U, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 27, 0xD83DDD03U, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 26, 0xD83DDD04U, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 23, 0xD83DDD05U, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 23, 0xD83DDD06U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 24, 0xD83DDD07U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 24, 0xD83DDD08U, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 24, 0xD83DDD09U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 24, 0xD83DDD0AU, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 21, 0xD83DDD0BU, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 21, 0xD83DDD0CU, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 24, 0xD83DDD0DU, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 24, 0xD83DDD0EU, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 23, 0xD83DDD0FU, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 23, 0xD83DDD10U, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 22, 0xD83DDD11U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 23, 0xD83DDD12U, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 23, 0xD83DDD13U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 24, 0xD83DDD14U, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 24, 0xD83DDD15U, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 22, 0xD83DDD16U, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 23, 0xD83DDD17U, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 28, 0xD83DDD18U, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 27, 0xD83DDD19U, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 27, 0xD83DDD1AU, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 27, 0xD83DDD1BU, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 27, 0xD83DDD1CU, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 27, 0xD83DDD1DU, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 24, 0xD83DDD1EU, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 27, 0xD83DDD1FU, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 27, 0xD83DDD20U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 27, 0xD83DDD21U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 27, 0xD83DDD22U, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 27, 0xD83DDD23U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 27, 0xD83DDD24U, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 11, 0xD83DDD25U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 21, 0xD83DDD26U, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 22, 0xD83DDD27U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 22, 0xD83DDD28U, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 22, 0xD83DDD29U, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 22, 0xD83DDD2AU, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 22, 0xD83DDD2BU, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 22, 0xD83DDD2CU, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 22, 0xD83DDD2DU, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 22, 0xD83DDD2EU, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 28, 0xD83DDD2FU, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 28, 0xD83DDD30U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 28, 0xD83DDD31U, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 28, 0xD83DDD32U, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 28, 0xD83DDD33U, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 28, 0xD83DDD34U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 28, 0xD83DDD35U, 0, 2, 0, 0); - new (toFill++) EmojiData(24, 28, 0xD83DDD36U, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 28, 0xD83DDD37U, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 28, 0xD83DDD38U, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 28, 0xD83DDD39U, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 28, 0xD83DDD3AU, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 28, 0xD83DDD3BU, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 26, 0xD83DDD3CU, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 26, 0xD83DDD3DU, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 28, 0xD83DDD50U, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 28, 0xD83DDD51U, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 28, 0xD83DDD52U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 28, 0xD83DDD53U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 29, 0xD83DDD54U, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 29, 0xD83DDD55U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 29, 0xD83DDD56U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 29, 0xD83DDD57U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 29, 0xD83DDD58U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 29, 0xD83DDD59U, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 29, 0xD83DDD5AU, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 29, 0xD83DDD5BU, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 29, 0xD83DDD5CU, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 29, 0xD83DDD5DU, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 29, 0xD83DDD5EU, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 29, 0xD83DDD5FU, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 29, 0xD83DDD60U, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 29, 0xD83DDD61U, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 29, 0xD83DDD62U, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 29, 0xD83DDD63U, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 29, 0xD83DDD64U, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 29, 0xD83DDD65U, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 29, 0xD83DDD66U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 29, 0xD83DDD67U, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 12, 0xD83DDDFBU, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 19, 0xD83DDDFCU, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 19, 0xD83DDDFDU, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 12, 0xD83DDDFEU, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 19, 0xD83DDDFFU, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 32, 0xA9U, 0, 1, 0, 0); + new (toFill++) EmojiData(5, 32, 0xAEU, 0, 1, 0, 0); + new (toFill++) EmojiData(13, 29, 0x203CU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(14, 29, 0x2049U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(6, 32, 0x2122U, 0, 1, 0, 0); + new (toFill++) EmojiData(27, 31, 0x2139U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(19, 31, 0x2194U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(18, 31, 0x2195U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(17, 31, 0x2196U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(14, 31, 0x2197U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(15, 31, 0x2198U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(16, 31, 0x2199U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(22, 31, 0x21A9U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(21, 31, 0x21AAU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(30, 22, 0x231AU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(26, 23, 0x231BU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(34, 22, 0x2328U, 0, 1, 0, 0); + new (toFill++) EmojiData(0, 31, 0x23E9U, 0, 1, 0, 0); + new (toFill++) EmojiData(1, 31, 0x23EAU, 0, 1, 0, 0); + new (toFill++) EmojiData(8, 31, 0x23EBU, 0, 1, 0, 0); + new (toFill++) EmojiData(9, 31, 0x23ECU, 0, 1, 0, 0); + new (toFill++) EmojiData(38, 30, 0x23EDU, 0, 1, 0, 0); + new (toFill++) EmojiData(39, 30, 0x23EEU, 0, 1, 0, 0); + new (toFill++) EmojiData(35, 30, 0x23EFU, 0, 1, 0, 0); + new (toFill++) EmojiData(23, 23, 0x23F0U, 0, 1, 0, 0); + new (toFill++) EmojiData(21, 23, 0x23F1U, 0, 1, 0, 0); + new (toFill++) EmojiData(22, 23, 0x23F2U, 0, 1, 0, 0); + new (toFill++) EmojiData(25, 23, 0x23F3U, 0, 1, 0, 0); + new (toFill++) EmojiData(34, 30, 0x23F8U, 0, 1, 0, 0); + new (toFill++) EmojiData(36, 30, 0x23F9U, 0, 1, 0, 0); + new (toFill++) EmojiData(37, 30, 0x23FAU, 0, 1, 0, 0); + new (toFill++) EmojiData(35, 29, 0x24C2U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(23, 32, 0x25AAU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(24, 32, 0x25ABU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(33, 30, 0x25B6U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(5, 31, 0x25C0U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(29, 32, 0x25FBU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(28, 32, 0x25FCU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(31, 32, 0x25FDU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(30, 32, 0x25FEU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(1, 15, 0x2600U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(6, 15, 0x2601U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(21, 15, 0x2602U, 0, 1, 0, 0); + new (toFill++) EmojiData(15, 15, 0x2603U, 0, 1, 0, 0); + new (toFill++) EmojiData(0, 15, 0x2604U, 0, 1, 0, 0); + new (toFill++) EmojiData(13, 23, 0x260EU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(12, 32, 0x2611U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(22, 15, 0x2614U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(9, 17, 0x2615U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(39, 13, 0x2618U, 0, 1, 0, 0); + new (toFill++) EmojiData(5, 4, 0x261DU, 0, 1, 0xFE0F, 0xFFFF040DU); + new (toFill++) EmojiData(19, 24, 0x2620U, 0, 1, 0, 0); + new (toFill++) EmojiData(11, 28, 0x2622U, 0, 1, 0, 0); + new (toFill++) EmojiData(12, 28, 0x2623U, 0, 1, 0, 0); + new (toFill++) EmojiData(32, 27, 0x2626U, 0, 1, 0, 0); + new (toFill++) EmojiData(25, 27, 0x262AU, 0, 1, 0, 0); + new (toFill++) EmojiData(23, 27, 0x262EU, 0, 1, 0, 0); + new (toFill++) EmojiData(31, 27, 0x262FU, 0, 1, 0, 0); + new (toFill++) EmojiData(27, 27, 0x2638U, 0, 1, 0, 0); + new (toFill++) EmojiData(3, 1, 0x2639U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(13, 0, 0x263AU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(35, 27, 0x2648U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(36, 27, 0x2649U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(37, 27, 0x264AU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(38, 27, 0x264BU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(39, 27, 0x264CU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(0, 28, 0x264DU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(1, 28, 0x264EU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(2, 28, 0x264FU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(3, 28, 0x2650U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(4, 28, 0x2651U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(5, 28, 0x2652U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(6, 28, 0x2653U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(4, 33, 0x2660U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(5, 33, 0x2663U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(6, 33, 0x2665U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(7, 33, 0x2666U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(2, 29, 0x2668U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(24, 29, 0x267BU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(2, 30, 0x267FU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(6, 24, 0x2692U, 0, 1, 0, 0); + new (toFill++) EmojiData(3, 21, 0x2693U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(16, 24, 0x2694U, 0, 1, 0, 0); + new (toFill++) EmojiData(3, 24, 0x2696U, 0, 1, 0, 0); + new (toFill++) EmojiData(26, 24, 0x2697U, 0, 1, 0, 0); + new (toFill++) EmojiData(10, 24, 0x2699U, 0, 1, 0, 0); + new (toFill++) EmojiData(8, 28, 0x269BU, 0, 1, 0, 0); + new (toFill++) EmojiData(19, 29, 0x269CU, 0, 1, 0, 0); + new (toFill++) EmojiData(21, 29, 0x26A0U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(10, 15, 0x26A1U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(14, 32, 0x26AAU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(15, 32, 0x26ABU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(20, 24, 0x26B0U, 0, 1, 0, 0); + new (toFill++) EmojiData(21, 24, 0x26B1U, 0, 1, 0, 0); + new (toFill++) EmojiData(13, 17, 0x26BDU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(16, 17, 0x26BEU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(16, 15, 0x26C4U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(3, 15, 0x26C5U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(8, 15, 0x26C8U, 0, 1, 0, 0); + new (toFill++) EmojiData(34, 27, 0x26CEU, 0, 1, 0, 0); + new (toFill++) EmojiData(8, 24, 0x26CFU, 0, 1, 0, 0); + new (toFill++) EmojiData(29, 11, 0x26D1U, 0, 1, 0, 0); + new (toFill++) EmojiData(11, 24, 0x26D3U, 0, 1, 0, 0); + new (toFill++) EmojiData(36, 28, 0x26D4U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(29, 22, 0x26E9U, 0, 1, 0, 0); + new (toFill++) EmojiData(25, 22, 0x26EAU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(20, 21, 0x26F0U, 0, 1, 0, 0); + new (toFill++) EmojiData(7, 25, 0x26F1U, 0, 1, 0, 0); + new (toFill++) EmojiData(18, 21, 0x26F2U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(21, 17, 0x26F3U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(38, 20, 0x26F4U, 0, 1, 0, 0); + new (toFill++) EmojiData(35, 20, 0x26F5U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(29, 17, 0x26F7U, 0, 1, 0, 0); + new (toFill++) EmojiData(31, 17, 0x26F8U, 0, 1, 0, 0); + new (toFill++) EmojiData(18, 18, 0x26F9U, 0, 1, 0, 0xFFFF0412U); + new (toFill++) EmojiData(26, 21, 0x26FAU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(5, 21, 0x26FDU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(27, 26, 0x2702U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(30, 29, 0x2705U, 0, 1, 0, 0); + new (toFill++) EmojiData(32, 20, 0x2708U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(20, 25, 0x2709U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(3, 3, 0x270AU, 0, 1, 0, 0xFFFF0417U); + new (toFill++) EmojiData(21, 3, 0x270BU, 0, 1, 0, 0xFFFF041CU); + new (toFill++) EmojiData(9, 3, 0x270CU, 0, 1, 0, 0xFFFF0421U); + new (toFill++) EmojiData(19, 5, 0x270DU, 0, 1, 0, 0xFFFF0426U); + new (toFill++) EmojiData(3, 27, 0x270FU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(1, 27, 0x2712U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(36, 31, 0x2714U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(1, 32, 0x2716U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(24, 27, 0x271DU, 0, 1, 0, 0); + new (toFill++) EmojiData(28, 27, 0x2721U, 0, 1, 0, 0); + new (toFill++) EmojiData(39, 14, 0x2728U, 0, 1, 0, 0); + new (toFill++) EmojiData(28, 29, 0x2733U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(20, 28, 0x2734U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(13, 15, 0x2744U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(27, 29, 0x2747U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(39, 28, 0x274CU, 0, 1, 0, 0); + new (toFill++) EmojiData(29, 29, 0x274EU, 0, 1, 0, 0); + new (toFill++) EmojiData(11, 29, 0x2753U, 0, 1, 0, 0); + new (toFill++) EmojiData(12, 29, 0x2754U, 0, 1, 0, 0); + new (toFill++) EmojiData(10, 29, 0x2755U, 0, 1, 0, 0); + new (toFill++) EmojiData(9, 29, 0x2757U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(14, 27, 0x2763U, 0, 1, 0, 0); + new (toFill++) EmojiData(8, 27, 0x2764U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(38, 31, 0x2795U, 0, 1, 0, 0); + new (toFill++) EmojiData(39, 31, 0x2796U, 0, 1, 0, 0); + new (toFill++) EmojiData(0, 32, 0x2797U, 0, 1, 0, 0); + new (toFill++) EmojiData(10, 31, 0x27A1U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(35, 31, 0x27B0U, 0, 1, 0, 0); + new (toFill++) EmojiData(33, 29, 0x27BFU, 0, 1, 0, 0); + new (toFill++) EmojiData(23, 31, 0x2934U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(24, 31, 0x2935U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(11, 31, 0x2B05U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(12, 31, 0x2B06U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(13, 31, 0x2B07U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(25, 32, 0x2B1BU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(26, 32, 0x2B1CU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(36, 14, 0x2B50U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(0, 29, 0x2B55U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(34, 31, 0x3030U, 0, 1, 0, 0); + new (toFill++) EmojiData(20, 29, 0x303DU, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(26, 28, 0x3297U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(25, 28, 0x3299U, 0, 1, 0xFE0F, 0); + new (toFill++) EmojiData(25, 31, 0x2320E3U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 31, 0x2A20E3U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 30, 0x3020E3U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 30, 0x3120E3U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 30, 0x3220E3U, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 30, 0x3320E3U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 30, 0x3420E3U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 30, 0x3520E3U, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 30, 0x3620E3U, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 30, 0x3720E3U, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 30, 0x3820E3U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 30, 0x3920E3U, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 33, 0xD83CDC04U, 0, 2, 0xFE0F, 0); + new (toFill++) EmojiData(2, 33, 0xD83CDCCFU, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 28, 0xD83CDD70U, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 28, 0xD83CDD71U, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 28, 0xD83CDD7EU, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 30, 0xD83CDD7FU, 0, 2, 0xFE0F, 0); + new (toFill++) EmojiData(32, 28, 0xD83CDD8EU, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 28, 0xD83CDD91U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 30, 0xD83CDD92U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 30, 0xD83CDD93U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 28, 0xD83CDD94U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 30, 0xD83CDD95U, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 30, 0xD83CDD96U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 30, 0xD83CDD97U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 28, 0xD83CDD98U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 30, 0xD83CDD99U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 28, 0xD83CDD9AU, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 30, 0xD83CDE01U, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 29, 0xD83CDE02U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 28, 0xD83CDE1AU, 0, 2, 0xFE0F, 0); + new (toFill++) EmojiData(25, 29, 0xD83CDE2FU, 0, 2, 0xFE0F, 0); + new (toFill++) EmojiData(29, 28, 0xD83CDE32U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 28, 0xD83CDE33U, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 28, 0xD83CDE34U, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 28, 0xD83CDE35U, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 28, 0xD83CDE36U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 28, 0xD83CDE37U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 28, 0xD83CDE38U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 28, 0xD83CDE39U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 28, 0xD83CDE3AU, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 28, 0xD83CDE50U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 28, 0xD83CDE51U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 29, 0xD83CDF00U, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 21, 0xD83CDF01U, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 11, 0xD83CDF02U, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 21, 0xD83CDF03U, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 21, 0xD83CDF04U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 21, 0xD83CDF05U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 21, 0xD83CDF06U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 21, 0xD83CDF07U, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 22, 0xD83CDF08U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 21, 0xD83CDF09U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 15, 0xD83CDF0AU, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 21, 0xD83CDF0BU, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 22, 0xD83CDF0CU, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 14, 0xD83CDF0DU, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 14, 0xD83CDF0EU, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 14, 0xD83CDF0FU, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 29, 0xD83CDF10U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 14, 0xD83CDF11U, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 14, 0xD83CDF12U, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 14, 0xD83CDF13U, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 14, 0xD83CDF14U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 14, 0xD83CDF15U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 14, 0xD83CDF16U, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 14, 0xD83CDF17U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 14, 0xD83CDF18U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 14, 0xD83CDF19U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 14, 0xD83CDF1AU, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 14, 0xD83CDF1BU, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 14, 0xD83CDF1CU, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 14, 0xD83CDF1DU, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 14, 0xD83CDF1EU, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 14, 0xD83CDF1FU, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 22, 0xD83CDF20U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 24, 0xD83CDF21U, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 15, 0xD83CDF24U, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 15, 0xD83CDF25U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 15, 0xD83CDF26U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 15, 0xD83CDF27U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 15, 0xD83CDF28U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 15, 0xD83CDF29U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 15, 0xD83CDF2AU, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 15, 0xD83CDF2BU, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 15, 0xD83CDF2CU, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 16, 0xD83CDF2DU, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 16, 0xD83CDF2EU, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 16, 0xD83CDF2FU, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 14, 0xD83CDF30U, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 13, 0xD83CDF31U, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 13, 0xD83CDF32U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 13, 0xD83CDF33U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 13, 0xD83CDF34U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 13, 0xD83CDF35U, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 16, 0xD83CDF36U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 14, 0xD83CDF37U, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 14, 0xD83CDF38U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 14, 0xD83CDF39U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 14, 0xD83CDF3AU, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 14, 0xD83CDF3BU, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 14, 0xD83CDF3CU, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 16, 0xD83CDF3DU, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 14, 0xD83CDF3EU, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 13, 0xD83CDF3FU, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 14, 0xD83CDF40U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 14, 0xD83CDF41U, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 14, 0xD83CDF42U, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 14, 0xD83CDF43U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 14, 0xD83CDF44U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 15, 0xD83CDF45U, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 16, 0xD83CDF46U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 15, 0xD83CDF47U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 15, 0xD83CDF48U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 15, 0xD83CDF49U, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 15, 0xD83CDF4AU, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 15, 0xD83CDF4BU, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 15, 0xD83CDF4CU, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 15, 0xD83CDF4DU, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 15, 0xD83CDF4EU, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 15, 0xD83CDF4FU, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 15, 0xD83CDF50U, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 15, 0xD83CDF51U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 15, 0xD83CDF52U, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 15, 0xD83CDF53U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 16, 0xD83CDF54U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 16, 0xD83CDF55U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 16, 0xD83CDF56U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 16, 0xD83CDF57U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 16, 0xD83CDF58U, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 16, 0xD83CDF59U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 16, 0xD83CDF5AU, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 16, 0xD83CDF5BU, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 16, 0xD83CDF5CU, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 16, 0xD83CDF5DU, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 16, 0xD83CDF5EU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 16, 0xD83CDF5FU, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 16, 0xD83CDF60U, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 16, 0xD83CDF61U, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 16, 0xD83CDF62U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 16, 0xD83CDF63U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 16, 0xD83CDF64U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 16, 0xD83CDF65U, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 16, 0xD83CDF66U, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 16, 0xD83CDF67U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 16, 0xD83CDF68U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 16, 0xD83CDF69U, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 17, 0xD83CDF6AU, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 16, 0xD83CDF6BU, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 16, 0xD83CDF6CU, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 16, 0xD83CDF6DU, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 16, 0xD83CDF6EU, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 16, 0xD83CDF6FU, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 16, 0xD83CDF70U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 16, 0xD83CDF71U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 16, 0xD83CDF72U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 16, 0xD83CDF73U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 17, 0xD83CDF74U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 17, 0xD83CDF75U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 17, 0xD83CDF76U, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 17, 0xD83CDF77U, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 17, 0xD83CDF78U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 17, 0xD83CDF79U, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 17, 0xD83CDF7AU, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 17, 0xD83CDF7BU, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 17, 0xD83CDF7CU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 17, 0xD83CDF7DU, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 17, 0xD83CDF7EU, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 16, 0xD83CDF7FU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 25, 0xD83CDF80U, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 25, 0xD83CDF81U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 16, 0xD83CDF82U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 14, 0xD83CDF83U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 13, 0xD83CDF84U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 8, 0xD83CDF85U, 0, 2, 0, 0xFFFF0522U); + new (toFill++) EmojiData(3, 22, 0xD83CDF86U, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 22, 0xD83CDF87U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 25, 0xD83CDF88U, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 25, 0xD83CDF89U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 25, 0xD83CDF8AU, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 14, 0xD83CDF8BU, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 25, 0xD83CDF8CU, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 14, 0xD83CDF8DU, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 25, 0xD83CDF8EU, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 25, 0xD83CDF8FU, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 25, 0xD83CDF90U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 21, 0xD83CDF91U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 11, 0xD83CDF92U, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 11, 0xD83CDF93U, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 19, 0xD83CDF96U, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 19, 0xD83CDF97U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 23, 0xD83CDF99U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 23, 0xD83CDF9AU, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 23, 0xD83CDF9BU, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 23, 0xD83CDF9EU, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 19, 0xD83CDF9FU, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 21, 0xD83CDFA0U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 21, 0xD83CDFA1U, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 21, 0xD83CDFA2U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 17, 0xD83CDFA3U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 19, 0xD83CDFA4U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 23, 0xD83CDFA5U, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 30, 0xD83CDFA6U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 19, 0xD83CDFA7U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 19, 0xD83CDFA8U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 11, 0xD83CDFA9U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 19, 0xD83CDFAAU, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 19, 0xD83CDFABU, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 19, 0xD83CDFACU, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 19, 0xD83CDFADU, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 19, 0xD83CDFAEU, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 19, 0xD83CDFAFU, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 19, 0xD83CDFB0U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 17, 0xD83CDFB1U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 19, 0xD83CDFB2U, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 19, 0xD83CDFB3U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 33, 0xD83CDFB4U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 31, 0xD83CDFB5U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 31, 0xD83CDFB6U, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 19, 0xD83CDFB7U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 19, 0xD83CDFB8U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 19, 0xD83CDFB9U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 19, 0xD83CDFBAU, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 19, 0xD83CDFBBU, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 19, 0xD83CDFBCU, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 19, 0xD83CDFBDU, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 17, 0xD83CDFBEU, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 17, 0xD83CDFBFU, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 17, 0xD83CDFC0U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 21, 0xD83CDFC1U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 17, 0xD83CDFC2U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 8, 0xD83CDFC3U, 0, 2, 0, 0xFFFF0527U); + new (toFill++) EmojiData(6, 18, 0xD83CDFC4U, 0, 2, 0, 0xFFFF052CU); + new (toFill++) EmojiData(11, 19, 0xD83CDFC5U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 19, 0xD83CDFC6U, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 19, 0xD83CDFC7U, 0, 2, 0, 0xFFFF0531U); + new (toFill++) EmojiData(15, 17, 0xD83CDFC8U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 17, 0xD83CDFC9U, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 18, 0xD83CDFCAU, 0, 2, 0, 0xFFFF0536U); + new (toFill++) EmojiData(24, 18, 0xD83CDFCBU, 0, 2, 0, 0xFFFF053BU); + new (toFill++) EmojiData(22, 17, 0xD83CDFCCU, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 20, 0xD83CDFCDU, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 20, 0xD83CDFCEU, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 17, 0xD83CDFCFU, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 17, 0xD83CDFD0U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 17, 0xD83CDFD1U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 17, 0xD83CDFD2U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 17, 0xD83CDFD3U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 21, 0xD83CDFD4U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 21, 0xD83CDFD5U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 21, 0xD83CDFD6U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 21, 0xD83CDFD7U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 22, 0xD83CDFD8U, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 21, 0xD83CDFD9U, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 22, 0xD83CDFDAU, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 22, 0xD83CDFDBU, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 21, 0xD83CDFDCU, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 21, 0xD83CDFDDU, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 21, 0xD83CDFDEU, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 22, 0xD83CDFDFU, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 22, 0xD83CDFE0U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 22, 0xD83CDFE1U, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 22, 0xD83CDFE2U, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 22, 0xD83CDFE3U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 22, 0xD83CDFE4U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 22, 0xD83CDFE5U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 22, 0xD83CDFE6U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 29, 0xD83CDFE7U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 22, 0xD83CDFE8U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 22, 0xD83CDFE9U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 22, 0xD83CDFEAU, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 22, 0xD83CDFEBU, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 22, 0xD83CDFECU, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 21, 0xD83CDFEDU, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 25, 0xD83CDFEEU, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 22, 0xD83CDFEFU, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 22, 0xD83CDFF0U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 26, 0xD83CDFF3U, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 26, 0xD83CDFF4U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 19, 0xD83CDFF5U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 24, 0xD83CDFF7U, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 17, 0xD83CDFF8U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 17, 0xD83CDFF9U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 24, 0xD83CDFFAU, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 13, 0xD83DDC00U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 13, 0xD83DDC01U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 13, 0xD83DDC02U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 13, 0xD83DDC03U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 13, 0xD83DDC04U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 13, 0xD83DDC05U, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 13, 0xD83DDC06U, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 13, 0xD83DDC07U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 13, 0xD83DDC08U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 13, 0xD83DDC09U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 13, 0xD83DDC0AU, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 13, 0xD83DDC0BU, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 12, 0xD83DDC0CU, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 12, 0xD83DDC0DU, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 13, 0xD83DDC0EU, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 13, 0xD83DDC0FU, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 13, 0xD83DDC10U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 13, 0xD83DDC11U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 12, 0xD83DDC12U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 13, 0xD83DDC13U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 12, 0xD83DDC14U, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 13, 0xD83DDC15U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 13, 0xD83DDC16U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 12, 0xD83DDC17U, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 13, 0xD83DDC18U, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 12, 0xD83DDC19U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 14, 0xD83DDC1AU, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 12, 0xD83DDC1BU, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 12, 0xD83DDC1CU, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 12, 0xD83DDC1DU, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 12, 0xD83DDC1EU, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 13, 0xD83DDC1FU, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 12, 0xD83DDC20U, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 13, 0xD83DDC21U, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 12, 0xD83DDC22U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 12, 0xD83DDC23U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 12, 0xD83DDC24U, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 12, 0xD83DDC25U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 12, 0xD83DDC26U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 12, 0xD83DDC27U, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 12, 0xD83DDC28U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 13, 0xD83DDC29U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 13, 0xD83DDC2AU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 13, 0xD83DDC2BU, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 13, 0xD83DDC2CU, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 12, 0xD83DDC2DU, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 12, 0xD83DDC2EU, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 12, 0xD83DDC2FU, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 12, 0xD83DDC30U, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 12, 0xD83DDC31U, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 13, 0xD83DDC32U, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 13, 0xD83DDC33U, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 12, 0xD83DDC34U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 12, 0xD83DDC35U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 11, 0xD83DDC36U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 12, 0xD83DDC37U, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 12, 0xD83DDC38U, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 12, 0xD83DDC39U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 12, 0xD83DDC3AU, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 12, 0xD83DDC3BU, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 12, 0xD83DDC3CU, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 12, 0xD83DDC3DU, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 13, 0xD83DDC3EU, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 13, 0xD83DDC3FU, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 6, 0xD83DDC40U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 6, 0xD83DDC41U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 5, 0xD83DDC42U, 0, 2, 0, 0xFFFF0540U); + new (toFill++) EmojiData(39, 5, 0xD83DDC43U, 0, 2, 0, 0xFFFF0545U); + new (toFill++) EmojiData(31, 5, 0xD83DDC44U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 5, 0xD83DDC45U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 4, 0xD83DDC46U, 0, 2, 0, 0xFFFF054AU); + new (toFill++) EmojiData(17, 4, 0xD83DDC47U, 0, 2, 0, 0xFFFF054FU); + new (toFill++) EmojiData(23, 4, 0xD83DDC48U, 0, 2, 0, 0xFFFF0554U); + new (toFill++) EmojiData(29, 4, 0xD83DDC49U, 0, 2, 0, 0xFFFF0559U); + new (toFill++) EmojiData(37, 2, 0xD83DDC4AU, 0, 2, 0, 0xFFFF055EU); + new (toFill++) EmojiData(19, 2, 0xD83DDC4BU, 0, 2, 0, 0xFFFF0563U); + new (toFill++) EmojiData(15, 3, 0xD83DDC4CU, 0, 2, 0, 0xFFFF0568U); + new (toFill++) EmojiData(25, 2, 0xD83DDC4DU, 0, 2, 0, 0xFFFF056DU); + new (toFill++) EmojiData(31, 2, 0xD83DDC4EU, 0, 2, 0, 0xFFFF0572U); + new (toFill++) EmojiData(13, 2, 0xD83DDC4FU, 0, 2, 0, 0xFFFF0577U); + new (toFill++) EmojiData(27, 3, 0xD83DDC50U, 0, 2, 0, 0xFFFF057CU); + new (toFill++) EmojiData(28, 11, 0xD83DDC51U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 11, 0xD83DDC52U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 11, 0xD83DDC53U, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 11, 0xD83DDC54U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 11, 0xD83DDC55U, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 11, 0xD83DDC56U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 11, 0xD83DDC57U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 11, 0xD83DDC58U, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 11, 0xD83DDC59U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 11, 0xD83DDC5AU, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 11, 0xD83DDC5BU, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 11, 0xD83DDC5CU, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 11, 0xD83DDC5DU, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 11, 0xD83DDC5EU, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 11, 0xD83DDC5FU, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 11, 0xD83DDC60U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 11, 0xD83DDC61U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 11, 0xD83DDC62U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 11, 0xD83DDC63U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 6, 0xD83DDC64U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 6, 0xD83DDC65U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 6, 0xD83DDC66U, 0, 2, 0, 0xFFFF0581U); + new (toFill++) EmojiData(22, 6, 0xD83DDC67U, 0, 2, 0, 0xFFFF0586U); + new (toFill++) EmojiData(28, 6, 0xD83DDC68U, 0, 2, 0, 0xFFFF058BU); + new (toFill++) EmojiData(34, 6, 0xD83DDC69U, 0, 2, 0, 0xFFFF0590U); + new (toFill++) EmojiData(35, 10, 0xD83DDC6AU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 9, 0xD83DDC6BU, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 9, 0xD83DDC6CU, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 9, 0xD83DDC6DU, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 7, 0xD83DDC6EU, 0, 2, 0, 0xFFFF0595U); + new (toFill++) EmojiData(11, 9, 0xD83DDC6FU, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 8, 0xD83DDC70U, 0, 2, 0, 0xFFFF059AU); + new (toFill++) EmojiData(0, 7, 0xD83DDC71U, 0, 2, 0, 0xFFFF059FU); + new (toFill++) EmojiData(18, 7, 0xD83DDC72U, 0, 2, 0, 0xFFFF05A4U); + new (toFill++) EmojiData(24, 7, 0xD83DDC73U, 0, 2, 0, 0xFFFF05A9U); + new (toFill++) EmojiData(6, 7, 0xD83DDC74U, 0, 2, 0, 0xFFFF05AEU); + new (toFill++) EmojiData(12, 7, 0xD83DDC75U, 0, 2, 0, 0xFFFF05B3U); + new (toFill++) EmojiData(10, 6, 0xD83DDC76U, 0, 2, 0, 0xFFFF05B8U); + new (toFill++) EmojiData(36, 7, 0xD83DDC77U, 0, 2, 0, 0xFFFF05BDU); + new (toFill++) EmojiData(21, 8, 0xD83DDC78U, 0, 2, 0, 0xFFFF05C2U); + new (toFill++) EmojiData(32, 1, 0xD83DDC79U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 1, 0xD83DDC7AU, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 1, 0xD83DDC7BU, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 8, 0xD83DDC7CU, 0, 2, 0, 0xFFFF05C7U); + new (toFill++) EmojiData(36, 1, 0xD83DDC7DU, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 19, 0xD83DDC7EU, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 1, 0xD83DDC7FU, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 1, 0xD83DDC80U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 9, 0xD83DDC81U, 0, 2, 0, 0xFFFF05CCU); + new (toFill++) EmojiData(2, 8, 0xD83DDC82U, 0, 2, 0, 0xFFFF05D1U); + new (toFill++) EmojiData(5, 9, 0xD83DDC83U, 0, 2, 0, 0xFFFF05D6U); + new (toFill++) EmojiData(17, 11, 0xD83DDC84U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 5, 0xD83DDC85U, 0, 2, 0, 0xFFFF05DBU); + new (toFill++) EmojiData(23, 10, 0xD83DDC86U, 0, 2, 0, 0xFFFF05E0U); + new (toFill++) EmojiData(17, 10, 0xD83DDC87U, 0, 2, 0, 0xFFFF05E5U); + new (toFill++) EmojiData(25, 24, 0xD83DDC88U, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 24, 0xD83DDC89U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 24, 0xD83DDC8AU, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 11, 0xD83DDC8BU, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 25, 0xD83DDC8CU, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 11, 0xD83DDC8DU, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 24, 0xD83DDC8EU, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 10, 0xD83DDC8FU, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 14, 0xD83DDC90U, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 10, 0xD83DDC91U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 22, 0xD83DDC92U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 27, 0xD83DDC93U, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 27, 0xD83DDC94U, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 27, 0xD83DDC95U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 27, 0xD83DDC96U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 27, 0xD83DDC97U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 27, 0xD83DDC98U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 27, 0xD83DDC99U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 27, 0xD83DDC9AU, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 27, 0xD83DDC9BU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 27, 0xD83DDC9CU, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 27, 0xD83DDC9DU, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 27, 0xD83DDC9EU, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 27, 0xD83DDC9FU, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 29, 0xD83DDCA0U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 23, 0xD83DDCA1U, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 29, 0xD83DDCA2U, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 24, 0xD83DDCA3U, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 1, 0xD83DDCA4U, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 15, 0xD83DDCA5U, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 15, 0xD83DDCA6U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 15, 0xD83DDCA7U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 15, 0xD83DDCA8U, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 1, 0xD83DDCA9U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 3, 0xD83DDCAAU, 0, 2, 0, 0xFFFF05EAU); + new (toFill++) EmojiData(38, 14, 0xD83DDCABU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 33, 0xD83DDCACU, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 33, 0xD83DDCADU, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 28, 0xD83DDCAEU, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 29, 0xD83DDCAFU, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 24, 0xD83DDCB0U, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 32, 0xD83DDCB1U, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 32, 0xD83DDCB2U, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 24, 0xD83DDCB3U, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 23, 0xD83DDCB4U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 23, 0xD83DDCB5U, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 23, 0xD83DDCB6U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 23, 0xD83DDCB7U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 23, 0xD83DDCB8U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 29, 0xD83DDCB9U, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 21, 0xD83DDCBAU, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 22, 0xD83DDCBBU, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 11, 0xD83DDCBCU, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 23, 0xD83DDCBDU, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 23, 0xD83DDCBEU, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 23, 0xD83DDCBFU, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 23, 0xD83DDCC0U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 26, 0xD83DDCC1U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 26, 0xD83DDCC2U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 25, 0xD83DDCC3U, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 26, 0xD83DDCC4U, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 26, 0xD83DDCC5U, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 26, 0xD83DDCC6U, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 26, 0xD83DDCC7U, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 25, 0xD83DDCC8U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 25, 0xD83DDCC9U, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 25, 0xD83DDCCAU, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 26, 0xD83DDCCBU, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 26, 0xD83DDCCCU, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 26, 0xD83DDCCDU, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 26, 0xD83DDCCEU, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 26, 0xD83DDCCFU, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 26, 0xD83DDCD0U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 25, 0xD83DDCD1U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 26, 0xD83DDCD2U, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 26, 0xD83DDCD3U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 26, 0xD83DDCD4U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 26, 0xD83DDCD5U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 26, 0xD83DDCD6U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 26, 0xD83DDCD7U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 26, 0xD83DDCD8U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 26, 0xD83DDCD9U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 26, 0xD83DDCDAU, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 28, 0xD83DDCDBU, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 25, 0xD83DDCDCU, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 27, 0xD83DDCDDU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 23, 0xD83DDCDEU, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 23, 0xD83DDCDFU, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 23, 0xD83DDCE0U, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 23, 0xD83DDCE1U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 32, 0xD83DDCE2U, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 32, 0xD83DDCE3U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 25, 0xD83DDCE4U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 25, 0xD83DDCE5U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 25, 0xD83DDCE6U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 25, 0xD83DDCE7U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 25, 0xD83DDCE8U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 25, 0xD83DDCE9U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 25, 0xD83DDCEAU, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 25, 0xD83DDCEBU, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 25, 0xD83DDCECU, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 25, 0xD83DDCEDU, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 25, 0xD83DDCEEU, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 25, 0xD83DDCEFU, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 26, 0xD83DDCF0U, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 22, 0xD83DDCF1U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 22, 0xD83DDCF2U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 28, 0xD83DDCF3U, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 28, 0xD83DDCF4U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 29, 0xD83DDCF5U, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 30, 0xD83DDCF6U, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 23, 0xD83DDCF7U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 23, 0xD83DDCF8U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 23, 0xD83DDCF9U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 23, 0xD83DDCFAU, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 23, 0xD83DDCFBU, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 23, 0xD83DDCFCU, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 23, 0xD83DDCFDU, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 24, 0xD83DDCFFU, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 31, 0xD83DDD00U, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 31, 0xD83DDD01U, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 31, 0xD83DDD02U, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 31, 0xD83DDD03U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 31, 0xD83DDD04U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 29, 0xD83DDD05U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 29, 0xD83DDD06U, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 32, 0xD83DDD07U, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 32, 0xD83DDD08U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 32, 0xD83DDD09U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 32, 0xD83DDD0AU, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 23, 0xD83DDD0BU, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 23, 0xD83DDD0CU, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 27, 0xD83DDD0DU, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 27, 0xD83DDD0EU, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 26, 0xD83DDD0FU, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 26, 0xD83DDD10U, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 24, 0xD83DDD11U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 26, 0xD83DDD12U, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 26, 0xD83DDD13U, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 33, 0xD83DDD14U, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 33, 0xD83DDD15U, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 24, 0xD83DDD16U, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 26, 0xD83DDD17U, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 32, 0xD83DDD18U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 32, 0xD83DDD19U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 32, 0xD83DDD1AU, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 32, 0xD83DDD1BU, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 32, 0xD83DDD1CU, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 32, 0xD83DDD1DU, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 29, 0xD83DDD1EU, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 30, 0xD83DDD1FU, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 31, 0xD83DDD20U, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 31, 0xD83DDD21U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 30, 0xD83DDD22U, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 31, 0xD83DDD23U, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 31, 0xD83DDD24U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 15, 0xD83DDD25U, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 23, 0xD83DDD26U, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 24, 0xD83DDD27U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 24, 0xD83DDD28U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 24, 0xD83DDD29U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 24, 0xD83DDD2AU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 24, 0xD83DDD2BU, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 24, 0xD83DDD2CU, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 24, 0xD83DDD2DU, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 24, 0xD83DDD2EU, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 27, 0xD83DDD2FU, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 29, 0xD83DDD30U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 29, 0xD83DDD31U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 32, 0xD83DDD32U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 32, 0xD83DDD33U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 32, 0xD83DDD34U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 32, 0xD83DDD35U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 32, 0xD83DDD36U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 32, 0xD83DDD37U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 32, 0xD83DDD38U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 32, 0xD83DDD39U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 32, 0xD83DDD3AU, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 32, 0xD83DDD3BU, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 31, 0xD83DDD3CU, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 31, 0xD83DDD3DU, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 27, 0xD83DDD49U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 13, 0xD83DDD4AU, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 22, 0xD83DDD4BU, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 22, 0xD83DDD4CU, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 22, 0xD83DDD4DU, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 27, 0xD83DDD4EU, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 33, 0xD83DDD50U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 33, 0xD83DDD51U, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 33, 0xD83DDD52U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 33, 0xD83DDD53U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 33, 0xD83DDD54U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 33, 0xD83DDD55U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 33, 0xD83DDD56U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 33, 0xD83DDD57U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 33, 0xD83DDD58U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 33, 0xD83DDD59U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 33, 0xD83DDD5AU, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 33, 0xD83DDD5BU, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 33, 0xD83DDD5CU, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 33, 0xD83DDD5DU, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 33, 0xD83DDD5EU, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 33, 0xD83DDD5FU, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 33, 0xD83DDD60U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 33, 0xD83DDD61U, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 33, 0xD83DDD62U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 33, 0xD83DDD63U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 33, 0xD83DDD64U, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 33, 0xD83DDD65U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 33, 0xD83DDD66U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 33, 0xD83DDD67U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 23, 0xD83DDD6FU, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 23, 0xD83DDD70U, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 24, 0xD83DDD73U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 19, 0xD83DDD74U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 8, 0xD83DDD75U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 11, 0xD83DDD76U, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 12, 0xD83DDD77U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 14, 0xD83DDD78U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 22, 0xD83DDD79U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 26, 0xD83DDD87U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 26, 0xD83DDD8AU, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 27, 0xD83DDD8BU, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 27, 0xD83DDD8CU, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 27, 0xD83DDD8DU, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 5, 0xD83DDD90U, 0, 2, 0, 0xFFFF05EFU); + new (toFill++) EmojiData(35, 4, 0xD83DDD95U, 0, 2, 0, 0xFFFF05F4U); + new (toFill++) EmojiData(13, 5, 0xD83DDD96U, 0, 2, 0, 0xFFFF05F9U); + new (toFill++) EmojiData(35, 22, 0xD83DDDA5U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 22, 0xD83DDDA8U, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 22, 0xD83DDDB1U, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 22, 0xD83DDDB2U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 25, 0xD83DDDBCU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 26, 0xD83DDDC2U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 26, 0xD83DDDC3U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 26, 0xD83DDDC4U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 23, 0xD83DDDD1U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 26, 0xD83DDDD2U, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 26, 0xD83DDDD3U, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 23, 0xD83DDDDCU, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 24, 0xD83DDDDDU, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 26, 0xD83DDDDEU, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 24, 0xD83DDDE1U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 6, 0xD83DDDE3U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 33, 0xD83DDDEFU, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 26, 0xD83DDDF3U, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 25, 0xD83DDDFAU, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 21, 0xD83DDDFBU, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 21, 0xD83DDDFCU, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 22, 0xD83DDDFDU, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 21, 0xD83DDDFEU, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 25, 0xD83DDDFFU, 0, 2, 0, 0); new (toFill++) EmojiData(0, 0, 0xD83DDE00U, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 0, 0xD83DDE01U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 0, 0xD83DDE02U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 0, 0xD83DDE03U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 0, 0xD83DDE04U, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 0, 0xD83DDE05U, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 0, 0xD83DDE06U, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 0, 0xD83DDE07U, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 0, 0xD83DDE08U, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 0, 0xD83DDE09U, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 0, 0xD83DDE0AU, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 0, 0xD83DDE0BU, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 0, 0xD83DDE0CU, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 0, 0xD83DDE0DU, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 0, 0xD83DDE0EU, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 0, 0xD83DDE0FU, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 0, 0xD83DDE10U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 0, 0xD83DDE11U, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 0, 0xD83DDE12U, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 0, 0xD83DDE13U, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 0, 0xD83DDE14U, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 0, 0xD83DDE15U, 0, 2, 0, 0); - new (toFill++) EmojiData(24, 0, 0xD83DDE16U, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 0, 0xD83DDE17U, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 0, 0xD83DDE18U, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 0, 0xD83DDE19U, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 0, 0xD83DDE1AU, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 0, 0xD83DDE1BU, 0, 2, 0, 0); - new (toFill++) EmojiData(30, 0, 0xD83DDE1CU, 0, 2, 0, 0); - new (toFill++) EmojiData(31, 0, 0xD83DDE1DU, 0, 2, 0, 0); - new (toFill++) EmojiData(32, 0, 0xD83DDE1EU, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 0, 0xD83DDE1FU, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 0, 0xD83DDE20U, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 0, 0xD83DDE21U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 0, 0xD83DDE22U, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 0, 0xD83DDE23U, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 0, 0xD83DDE24U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 0, 0xD83DDE25U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 1, 0xD83DDE26U, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 1, 0xD83DDE27U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 1, 0xD83DDE28U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 1, 0xD83DDE29U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 1, 0xD83DDE2AU, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 1, 0xD83DDE2BU, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 1, 0xD83DDE2CU, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 1, 0xD83DDE2DU, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 1, 0xD83DDE2EU, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 1, 0xD83DDE2FU, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 1, 0xD83DDE30U, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 1, 0xD83DDE31U, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 1, 0xD83DDE32U, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 1, 0xD83DDE33U, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 1, 0xD83DDE34U, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 1, 0xD83DDE35U, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 1, 0xD83DDE36U, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 1, 0xD83DDE37U, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 1, 0xD83DDE38U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 1, 0xD83DDE39U, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 1, 0xD83DDE3AU, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 1, 0xD83DDE3BU, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 1, 0xD83DDE3CU, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 1, 0xD83DDE3DU, 0, 2, 0, 0); - new (toFill++) EmojiData(24, 1, 0xD83DDE3EU, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 1, 0xD83DDE3FU, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 1, 0xD83DDE40U, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 5, 0xD83DDE45U, 0, 2, 0, 0xFFFF045BU); - new (toFill++) EmojiData(16, 5, 0xD83DDE46U, 0, 2, 0, 0xFFFF0460U); - new (toFill++) EmojiData(38, 4, 0xD83DDE47U, 0, 2, 0, 0xFFFF0465U); - new (toFill++) EmojiData(10, 11, 0xD83DDE48U, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 11, 0xD83DDE49U, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 11, 0xD83DDE4AU, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 5, 0xD83DDE4BU, 0, 2, 0, 0xFFFF046AU); - new (toFill++) EmojiData(18, 6, 0xD83DDE4CU, 0, 2, 0, 0xFFFF046FU); - new (toFill++) EmojiData(34, 5, 0xD83DDE4DU, 0, 2, 0, 0xFFFF0474U); - new (toFill++) EmojiData(28, 5, 0xD83DDE4EU, 0, 2, 0, 0xFFFF0479U); - new (toFill++) EmojiData(22, 9, 0xD83DDE4FU, 0, 2, 0, 0xFFFF047EU); - new (toFill++) EmojiData(28, 18, 0xD83DDE80U, 0, 2, 0, 0); - new (toFill++) EmojiData(29, 18, 0xD83DDE81U, 0, 2, 0, 0); - new (toFill++) EmojiData(35, 17, 0xD83DDE82U, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 17, 0xD83DDE83U, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 17, 0xD83DDE84U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 17, 0xD83DDE85U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 18, 0xD83DDE86U, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 18, 0xD83DDE87U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 18, 0xD83DDE88U, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 18, 0xD83DDE89U, 0, 2, 0, 0); - new (toFill++) EmojiData(4, 18, 0xD83DDE8AU, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 17, 0xD83DDE8BU, 0, 2, 0, 0); - new (toFill++) EmojiData(5, 18, 0xD83DDE8CU, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 18, 0xD83DDE8DU, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 18, 0xD83DDE8EU, 0, 2, 0, 0); - new (toFill++) EmojiData(23, 18, 0xD83DDE8FU, 0, 2, 0, 0); - new (toFill++) EmojiData(8, 18, 0xD83DDE90U, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 18, 0xD83DDE91U, 0, 2, 0, 0); - new (toFill++) EmojiData(10, 18, 0xD83DDE92U, 0, 2, 0, 0); - new (toFill++) EmojiData(11, 18, 0xD83DDE93U, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 18, 0xD83DDE94U, 0, 2, 0, 0); - new (toFill++) EmojiData(14, 18, 0xD83DDE95U, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 18, 0xD83DDE96U, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 18, 0xD83DDE97U, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 18, 0xD83DDE98U, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 18, 0xD83DDE99U, 0, 2, 0, 0); - new (toFill++) EmojiData(19, 18, 0xD83DDE9AU, 0, 2, 0, 0); - new (toFill++) EmojiData(20, 18, 0xD83DDE9BU, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 18, 0xD83DDE9CU, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 17, 0xD83DDE9DU, 0, 2, 0, 0); - new (toFill++) EmojiData(34, 17, 0xD83DDE9EU, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 18, 0xD83DDE9FU, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 18, 0xD83DDEA0U, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 18, 0xD83DDEA1U, 0, 2, 0, 0); - new (toFill++) EmojiData(33, 18, 0xD83DDEA2U, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 15, 0xD83DDEA3U, 0, 2, 0, 0xFFFF0483U); - new (toFill++) EmojiData(34, 18, 0xD83DDEA4U, 0, 2, 0, 0); - new (toFill++) EmojiData(27, 18, 0xD83DDEA5U, 0, 2, 0, 0); - new (toFill++) EmojiData(26, 18, 0xD83DDEA6U, 0, 2, 0, 0); - new (toFill++) EmojiData(25, 18, 0xD83DDEA7U, 0, 2, 0, 0); - new (toFill++) EmojiData(13, 18, 0xD83DDEA8U, 0, 2, 0, 0); - new (toFill++) EmojiData(28, 23, 0xD83DDEA9U, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 22, 0xD83DDEAAU, 0, 2, 0, 0); - new (toFill++) EmojiData(12, 24, 0xD83DDEABU, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 22, 0xD83DDEACU, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 26, 0xD83DDEADU, 0, 2, 0, 0); - new (toFill++) EmojiData(3, 26, 0xD83DDEAEU, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 24, 0xD83DDEAFU, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 26, 0xD83DDEB0U, 0, 2, 0, 0); - new (toFill++) EmojiData(18, 24, 0xD83DDEB1U, 0, 2, 0, 0); - new (toFill++) EmojiData(22, 18, 0xD83DDEB2U, 0, 2, 0, 0); - new (toFill++) EmojiData(17, 24, 0xD83DDEB3U, 0, 2, 0, 0); - new (toFill++) EmojiData(15, 16, 0xD83DDEB4U, 0, 2, 0, 0xFFFF0488U); - new (toFill++) EmojiData(21, 16, 0xD83DDEB5U, 0, 2, 0, 0xFFFF048DU); - new (toFill++) EmojiData(16, 15, 0xD83DDEB6U, 0, 2, 0, 0xFFFF0492U); - new (toFill++) EmojiData(15, 24, 0xD83DDEB7U, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 24, 0xD83DDEB8U, 0, 2, 0, 0); - new (toFill++) EmojiData(37, 25, 0xD83DDEB9U, 0, 2, 0, 0); - new (toFill++) EmojiData(38, 25, 0xD83DDEBAU, 0, 2, 0, 0); - new (toFill++) EmojiData(36, 25, 0xD83DDEBBU, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 25, 0xD83DDEBCU, 0, 2, 0, 0); - new (toFill++) EmojiData(9, 22, 0xD83DDEBDU, 0, 2, 0, 0); - new (toFill++) EmojiData(16, 25, 0xD83DDEBEU, 0, 2, 0, 0); - new (toFill++) EmojiData(7, 22, 0xD83DDEBFU, 0, 2, 0, 0); - new (toFill++) EmojiData(6, 16, 0xD83DDEC0U, 0, 2, 0, 0xFFFF0497U); - new (toFill++) EmojiData(8, 22, 0xD83DDEC1U, 0, 2, 0, 0); - new (toFill++) EmojiData(39, 18, 0xD83DDEC2U, 0, 2, 0, 0); - new (toFill++) EmojiData(0, 19, 0xD83DDEC3U, 0, 2, 0, 0); - new (toFill++) EmojiData(1, 19, 0xD83DDEC4U, 0, 2, 0, 0); - new (toFill++) EmojiData(2, 19, 0xD83DDEC5U, 0, 2, 0, 0); - new (toFill++) EmojiData(21, 2, 0xFFFF0000U, 0, 8, 0, 0); - new (toFill++) EmojiData(22, 2, 0xFFFF0001U, 0, 11, 0, 0); - new (toFill++) EmojiData(23, 2, 0xFFFF0002U, 0, 11, 0, 0); - new (toFill++) EmojiData(24, 2, 0xFFFF0003U, 0, 11, 0, 0); - new (toFill++) EmojiData(25, 2, 0xFFFF0004U, 0, 8, 0, 0); - new (toFill++) EmojiData(26, 2, 0xFFFF0005U, 0, 8, 0, 0); - new (toFill++) EmojiData(27, 2, 0xFFFF0006U, 0, 11, 0, 0); - new (toFill++) EmojiData(28, 2, 0xFFFF0007U, 0, 11, 0, 0); - new (toFill++) EmojiData(29, 2, 0xFFFF0008U, 0, 11, 0, 0); - new (toFill++) EmojiData(30, 2, 0xFFFF0009U, 0, 8, 0, 0); - new (toFill++) EmojiData(31, 2, 0xFFFF000AU, 0, 8, 0, 0); - new (toFill++) EmojiData(32, 2, 0xFFFF000BU, 0, 11, 0, 0); - new (toFill++) EmojiData(33, 2, 0xFFFF000CU, 0, 11, 0, 0); - new (toFill++) EmojiData(34, 2, 0xFFFF000DU, 0, 11, 0, 0); - new (toFill++) EmojiData(13, 6, 0xFFFF000EU, 0, 8, 0, 0); - new (toFill++) EmojiData(14, 6, 0xFFFF000FU, 0, 8, 0, 0); - new (toFill++) EmojiData(16, 6, 0xFFFF0010U, 0, 11, 0, 0); - new (toFill++) EmojiData(17, 6, 0xFFFF0011U, 0, 11, 0, 0); - new (toFill++) EmojiData(31, 7, 0x261DU, 0, 3, 0xFE0F, 0xD83CDFFBU); - new (toFill++) EmojiData(32, 7, 0x261DU, 0, 3, 0xFE0F, 0xD83CDFFCU); - new (toFill++) EmojiData(33, 7, 0x261DU, 0, 3, 0xFE0F, 0xD83CDFFDU); - new (toFill++) EmojiData(34, 7, 0x261DU, 0, 3, 0xFE0F, 0xD83CDFFEU); - new (toFill++) EmojiData(35, 7, 0x261DU, 0, 3, 0xFE0F, 0xD83CDFFFU); - new (toFill++) EmojiData(39, 8, 0x270AU, 0, 3, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(0, 9, 0x270AU, 0, 3, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(1, 9, 0x270AU, 0, 3, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(2, 9, 0x270AU, 0, 3, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(3, 9, 0x270AU, 0, 3, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(5, 9, 0x270BU, 0, 3, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(6, 9, 0x270BU, 0, 3, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(7, 9, 0x270BU, 0, 3, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(8, 9, 0x270BU, 0, 3, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(9, 9, 0x270BU, 0, 3, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(27, 8, 0x270CU, 0, 3, 0xFE0F, 0xD83CDFFBU); - new (toFill++) EmojiData(28, 8, 0x270CU, 0, 3, 0xFE0F, 0xD83CDFFCU); - new (toFill++) EmojiData(29, 8, 0x270CU, 0, 3, 0xFE0F, 0xD83CDFFDU); - new (toFill++) EmojiData(30, 8, 0x270CU, 0, 3, 0xFE0F, 0xD83CDFFEU); - new (toFill++) EmojiData(31, 8, 0x270CU, 0, 3, 0xFE0F, 0xD83CDFFFU); - new (toFill++) EmojiData(33, 20, 0xD83CDDE6U, 0xD83CDDEAU, 4, 0, 0); - new (toFill++) EmojiData(34, 19, 0xD83CDDE6U, 0xD83CDDF9U, 4, 0, 0); - new (toFill++) EmojiData(33, 19, 0xD83CDDE6U, 0xD83CDDFAU, 4, 0, 0); - new (toFill++) EmojiData(35, 19, 0xD83CDDE7U, 0xD83CDDEAU, 4, 0, 0); - new (toFill++) EmojiData(36, 19, 0xD83CDDE7U, 0xD83CDDF7U, 4, 0, 0); - new (toFill++) EmojiData(37, 19, 0xD83CDDE8U, 0xD83CDDE6U, 4, 0, 0); - new (toFill++) EmojiData(29, 20, 0xD83CDDE8U, 0xD83CDDEDU, 4, 0, 0); - new (toFill++) EmojiData(38, 19, 0xD83CDDE8U, 0xD83CDDF1U, 4, 0, 0); - new (toFill++) EmojiData(39, 19, 0xD83CDDE8U, 0xD83CDDF3U, 4, 0, 0); - new (toFill++) EmojiData(0, 20, 0xD83CDDE8U, 0xD83CDDF4U, 4, 0, 0); - new (toFill++) EmojiData(4, 20, 0xD83CDDE9U, 0xD83CDDEAU, 4, 0, 0); - new (toFill++) EmojiData(1, 20, 0xD83CDDE9U, 0xD83CDDF0U, 4, 0, 0); - new (toFill++) EmojiData(27, 20, 0xD83CDDEAU, 0xD83CDDF8U, 4, 0, 0); - new (toFill++) EmojiData(2, 20, 0xD83CDDEBU, 0xD83CDDEEU, 4, 0, 0); - new (toFill++) EmojiData(3, 20, 0xD83CDDEBU, 0xD83CDDF7U, 4, 0, 0); - new (toFill++) EmojiData(31, 20, 0xD83CDDECU, 0xD83CDDE7U, 4, 0, 0); - new (toFill++) EmojiData(5, 20, 0xD83CDDEDU, 0xD83CDDF0U, 4, 0, 0); - new (toFill++) EmojiData(7, 20, 0xD83CDDEEU, 0xD83CDDE9U, 4, 0, 0); - new (toFill++) EmojiData(8, 20, 0xD83CDDEEU, 0xD83CDDEAU, 4, 0, 0); - new (toFill++) EmojiData(9, 20, 0xD83CDDEEU, 0xD83CDDF1U, 4, 0, 0); - new (toFill++) EmojiData(6, 20, 0xD83CDDEEU, 0xD83CDDF3U, 4, 0, 0); - new (toFill++) EmojiData(10, 20, 0xD83CDDEEU, 0xD83CDDF9U, 4, 0, 0); - new (toFill++) EmojiData(11, 20, 0xD83CDDEFU, 0xD83CDDF5U, 4, 0, 0); - new (toFill++) EmojiData(12, 20, 0xD83CDDF0U, 0xD83CDDF7U, 4, 0, 0); - new (toFill++) EmojiData(13, 20, 0xD83CDDF2U, 0xD83CDDF4U, 4, 0, 0); - new (toFill++) EmojiData(15, 20, 0xD83CDDF2U, 0xD83CDDFDU, 4, 0, 0); - new (toFill++) EmojiData(14, 20, 0xD83CDDF2U, 0xD83CDDFEU, 4, 0, 0); - new (toFill++) EmojiData(16, 20, 0xD83CDDF3U, 0xD83CDDF1U, 4, 0, 0); - new (toFill++) EmojiData(18, 20, 0xD83CDDF3U, 0xD83CDDF4U, 4, 0, 0); - new (toFill++) EmojiData(17, 20, 0xD83CDDF3U, 0xD83CDDFFU, 4, 0, 0); - new (toFill++) EmojiData(19, 20, 0xD83CDDF5U, 0xD83CDDEDU, 4, 0, 0); - new (toFill++) EmojiData(20, 20, 0xD83CDDF5U, 0xD83CDDF1U, 4, 0, 0); - new (toFill++) EmojiData(22, 20, 0xD83CDDF5U, 0xD83CDDF7U, 4, 0, 0); - new (toFill++) EmojiData(21, 20, 0xD83CDDF5U, 0xD83CDDF9U, 4, 0, 0); - new (toFill++) EmojiData(23, 20, 0xD83CDDF7U, 0xD83CDDFAU, 4, 0, 0); - new (toFill++) EmojiData(24, 20, 0xD83CDDF8U, 0xD83CDDE6U, 4, 0, 0); - new (toFill++) EmojiData(28, 20, 0xD83CDDF8U, 0xD83CDDEAU, 4, 0, 0); - new (toFill++) EmojiData(25, 20, 0xD83CDDF8U, 0xD83CDDECU, 4, 0, 0); - new (toFill++) EmojiData(30, 20, 0xD83CDDF9U, 0xD83CDDF7U, 4, 0, 0); - new (toFill++) EmojiData(32, 20, 0xD83CDDFAU, 0xD83CDDF8U, 4, 0, 0); - new (toFill++) EmojiData(34, 20, 0xD83CDDFBU, 0xD83CDDF3U, 4, 0, 0); - new (toFill++) EmojiData(26, 20, 0xD83CDDFFU, 0xD83CDDE6U, 4, 0, 0); - new (toFill++) EmojiData(26, 4, 0xD83CDF85U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(27, 4, 0xD83CDF85U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(28, 4, 0xD83CDF85U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(29, 4, 0xD83CDF85U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(30, 4, 0xD83CDF85U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(11, 15, 0xD83CDFC3U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(12, 15, 0xD83CDFC3U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(13, 15, 0xD83CDFC3U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(14, 15, 0xD83CDFC3U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(15, 15, 0xD83CDFC3U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(1, 16, 0xD83CDFC4U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(2, 16, 0xD83CDFC4U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(3, 16, 0xD83CDFC4U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(4, 16, 0xD83CDFC4U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(5, 16, 0xD83CDFC4U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(28, 16, 0xD83CDFC7U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(29, 16, 0xD83CDFC7U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(30, 16, 0xD83CDFC7U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(31, 16, 0xD83CDFC7U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(32, 16, 0xD83CDFC7U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(35, 15, 0xD83CDFCAU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(36, 15, 0xD83CDFCAU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(37, 15, 0xD83CDFCAU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(38, 15, 0xD83CDFCAU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(39, 15, 0xD83CDFCAU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(31, 6, 0xD83DDC42U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(32, 6, 0xD83DDC42U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(33, 6, 0xD83DDC42U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(34, 6, 0xD83DDC42U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(35, 6, 0xD83DDC42U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(38, 6, 0xD83DDC43U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(39, 6, 0xD83DDC43U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(0, 7, 0xD83DDC43U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(1, 7, 0xD83DDC43U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(2, 7, 0xD83DDC43U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(37, 7, 0xD83DDC46U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(38, 7, 0xD83DDC46U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(39, 7, 0xD83DDC46U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(0, 8, 0xD83DDC46U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(1, 8, 0xD83DDC46U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(3, 8, 0xD83DDC47U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(4, 8, 0xD83DDC47U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(5, 8, 0xD83DDC47U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(6, 8, 0xD83DDC47U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(7, 8, 0xD83DDC47U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(9, 8, 0xD83DDC48U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(10, 8, 0xD83DDC48U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(11, 8, 0xD83DDC48U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(12, 8, 0xD83DDC48U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(13, 8, 0xD83DDC48U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(15, 8, 0xD83DDC49U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(16, 8, 0xD83DDC49U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(17, 8, 0xD83DDC49U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(18, 8, 0xD83DDC49U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(19, 8, 0xD83DDC49U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(33, 8, 0xD83DDC4AU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(34, 8, 0xD83DDC4AU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(35, 8, 0xD83DDC4AU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(36, 8, 0xD83DDC4AU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(37, 8, 0xD83DDC4AU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(13, 7, 0xD83DDC4BU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(14, 7, 0xD83DDC4BU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(15, 7, 0xD83DDC4BU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(16, 7, 0xD83DDC4BU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(17, 7, 0xD83DDC4BU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(21, 8, 0xD83DDC4CU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(22, 8, 0xD83DDC4CU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(23, 8, 0xD83DDC4CU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(24, 8, 0xD83DDC4CU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(25, 8, 0xD83DDC4CU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(19, 7, 0xD83DDC4DU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(20, 7, 0xD83DDC4DU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(21, 7, 0xD83DDC4DU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(22, 7, 0xD83DDC4DU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(23, 7, 0xD83DDC4DU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(25, 7, 0xD83DDC4EU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(26, 7, 0xD83DDC4EU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(27, 7, 0xD83DDC4EU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(28, 7, 0xD83DDC4EU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(29, 7, 0xD83DDC4EU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(25, 6, 0xD83DDC4FU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(26, 6, 0xD83DDC4FU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(27, 6, 0xD83DDC4FU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(28, 6, 0xD83DDC4FU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(29, 6, 0xD83DDC4FU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(17, 9, 0xD83DDC50U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(18, 9, 0xD83DDC50U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(19, 9, 0xD83DDC50U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(20, 9, 0xD83DDC50U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(21, 9, 0xD83DDC50U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(37, 1, 0xD83DDC66U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(38, 1, 0xD83DDC66U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(39, 1, 0xD83DDC66U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(0, 2, 0xD83DDC66U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(1, 2, 0xD83DDC66U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(3, 2, 0xD83DDC67U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(4, 2, 0xD83DDC67U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(5, 2, 0xD83DDC67U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(6, 2, 0xD83DDC67U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(7, 2, 0xD83DDC67U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(9, 2, 0xD83DDC68U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(10, 2, 0xD83DDC68U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(11, 2, 0xD83DDC68U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(12, 2, 0xD83DDC68U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(13, 2, 0xD83DDC68U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(15, 2, 0xD83DDC69U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(16, 2, 0xD83DDC69U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(17, 2, 0xD83DDC69U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(18, 2, 0xD83DDC69U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(19, 2, 0xD83DDC69U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(36, 3, 0xD83DDC6EU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(37, 3, 0xD83DDC6EU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(38, 3, 0xD83DDC6EU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(39, 3, 0xD83DDC6EU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(0, 4, 0xD83DDC6EU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(0, 3, 0xD83DDC70U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(1, 3, 0xD83DDC70U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(2, 3, 0xD83DDC70U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(3, 3, 0xD83DDC70U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(4, 3, 0xD83DDC70U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(6, 3, 0xD83DDC71U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(7, 3, 0xD83DDC71U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(8, 3, 0xD83DDC71U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(9, 3, 0xD83DDC71U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(10, 3, 0xD83DDC71U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(12, 3, 0xD83DDC72U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(13, 3, 0xD83DDC72U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(14, 3, 0xD83DDC72U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(15, 3, 0xD83DDC72U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(16, 3, 0xD83DDC72U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(18, 3, 0xD83DDC73U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(19, 3, 0xD83DDC73U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(20, 3, 0xD83DDC73U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(21, 3, 0xD83DDC73U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(22, 3, 0xD83DDC73U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(24, 3, 0xD83DDC74U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(25, 3, 0xD83DDC74U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(26, 3, 0xD83DDC74U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(27, 3, 0xD83DDC74U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(28, 3, 0xD83DDC74U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(30, 3, 0xD83DDC75U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(31, 3, 0xD83DDC75U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(32, 3, 0xD83DDC75U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(33, 3, 0xD83DDC75U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(34, 3, 0xD83DDC75U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(31, 1, 0xD83DDC76U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(32, 1, 0xD83DDC76U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(33, 1, 0xD83DDC76U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(34, 1, 0xD83DDC76U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(35, 1, 0xD83DDC76U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(2, 4, 0xD83DDC77U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(3, 4, 0xD83DDC77U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(4, 4, 0xD83DDC77U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(5, 4, 0xD83DDC77U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(6, 4, 0xD83DDC77U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(8, 4, 0xD83DDC78U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(9, 4, 0xD83DDC78U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(10, 4, 0xD83DDC78U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(11, 4, 0xD83DDC78U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(12, 4, 0xD83DDC78U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(20, 4, 0xD83DDC7CU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(21, 4, 0xD83DDC7CU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(22, 4, 0xD83DDC7CU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(23, 4, 0xD83DDC7CU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(24, 4, 0xD83DDC7CU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(5, 5, 0xD83DDC81U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(6, 5, 0xD83DDC81U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(7, 5, 0xD83DDC81U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(8, 5, 0xD83DDC81U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(9, 5, 0xD83DDC81U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(14, 4, 0xD83DDC82U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(15, 4, 0xD83DDC82U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(16, 4, 0xD83DDC82U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(17, 4, 0xD83DDC82U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(18, 4, 0xD83DDC82U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(23, 15, 0xD83DDC83U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(24, 15, 0xD83DDC83U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(25, 15, 0xD83DDC83U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(26, 15, 0xD83DDC83U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(27, 15, 0xD83DDC83U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(7, 7, 0xD83DDC85U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(8, 7, 0xD83DDC85U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(9, 7, 0xD83DDC85U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(10, 7, 0xD83DDC85U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(11, 7, 0xD83DDC85U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(1, 6, 0xD83DDC86U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(2, 6, 0xD83DDC86U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(3, 6, 0xD83DDC86U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(4, 6, 0xD83DDC86U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(5, 6, 0xD83DDC86U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(7, 6, 0xD83DDC87U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(8, 6, 0xD83DDC87U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(9, 6, 0xD83DDC87U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(10, 6, 0xD83DDC87U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(11, 6, 0xD83DDC87U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(11, 9, 0xD83DDCAAU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(12, 9, 0xD83DDCAAU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(13, 9, 0xD83DDCAAU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(14, 9, 0xD83DDCAAU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(15, 9, 0xD83DDCAAU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(11, 5, 0xD83DDE45U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(12, 5, 0xD83DDE45U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(13, 5, 0xD83DDE45U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(14, 5, 0xD83DDE45U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(15, 5, 0xD83DDE45U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(17, 5, 0xD83DDE46U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(18, 5, 0xD83DDE46U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(19, 5, 0xD83DDE46U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(20, 5, 0xD83DDE46U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(21, 5, 0xD83DDE46U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(39, 4, 0xD83DDE47U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(0, 5, 0xD83DDE47U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(1, 5, 0xD83DDE47U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(2, 5, 0xD83DDE47U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(3, 5, 0xD83DDE47U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(23, 5, 0xD83DDE4BU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(24, 5, 0xD83DDE4BU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(25, 5, 0xD83DDE4BU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(26, 5, 0xD83DDE4BU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(27, 5, 0xD83DDE4BU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(19, 6, 0xD83DDE4CU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(20, 6, 0xD83DDE4CU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(21, 6, 0xD83DDE4CU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(22, 6, 0xD83DDE4CU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(23, 6, 0xD83DDE4CU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(35, 5, 0xD83DDE4DU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(36, 5, 0xD83DDE4DU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(37, 5, 0xD83DDE4DU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(38, 5, 0xD83DDE4DU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(39, 5, 0xD83DDE4DU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(29, 5, 0xD83DDE4EU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(30, 5, 0xD83DDE4EU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(31, 5, 0xD83DDE4EU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(32, 5, 0xD83DDE4EU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(33, 5, 0xD83DDE4EU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(23, 9, 0xD83DDE4FU, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(24, 9, 0xD83DDE4FU, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(25, 9, 0xD83DDE4FU, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(26, 9, 0xD83DDE4FU, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(27, 9, 0xD83DDE4FU, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(29, 15, 0xD83DDEA3U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(30, 15, 0xD83DDEA3U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(31, 15, 0xD83DDEA3U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(32, 15, 0xD83DDEA3U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(33, 15, 0xD83DDEA3U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(16, 16, 0xD83DDEB4U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(17, 16, 0xD83DDEB4U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(18, 16, 0xD83DDEB4U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(19, 16, 0xD83DDEB4U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(20, 16, 0xD83DDEB4U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(22, 16, 0xD83DDEB5U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(23, 16, 0xD83DDEB5U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(24, 16, 0xD83DDEB5U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(25, 16, 0xD83DDEB5U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(26, 16, 0xD83DDEB5U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(17, 15, 0xD83DDEB6U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(18, 15, 0xD83DDEB6U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(19, 15, 0xD83DDEB6U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(20, 15, 0xD83DDEB6U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(21, 15, 0xD83DDEB6U, 0, 4, 0, 0xD83CDFFFU); - new (toFill++) EmojiData(7, 16, 0xD83DDEC0U, 0, 4, 0, 0xD83CDFFBU); - new (toFill++) EmojiData(8, 16, 0xD83DDEC0U, 0, 4, 0, 0xD83CDFFCU); - new (toFill++) EmojiData(9, 16, 0xD83DDEC0U, 0, 4, 0, 0xD83CDFFDU); - new (toFill++) EmojiData(10, 16, 0xD83DDEC0U, 0, 4, 0, 0xD83CDFFEU); - new (toFill++) EmojiData(11, 16, 0xD83DDEC0U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(2, 0, 0xD83DDE01U, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 0, 0xD83DDE02U, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 0, 0xD83DDE03U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 0, 0xD83DDE04U, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 0, 0xD83DDE05U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 0, 0xD83DDE06U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 0, 0xD83DDE07U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 1, 0xD83DDE08U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 0, 0xD83DDE09U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 0, 0xD83DDE0AU, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 0, 0xD83DDE0BU, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 0, 0xD83DDE0CU, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 0, 0xD83DDE0DU, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 0, 0xD83DDE0EU, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 0, 0xD83DDE0FU, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 0, 0xD83DDE10U, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 0, 0xD83DDE11U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 0, 0xD83DDE12U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 1, 0xD83DDE13U, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 1, 0xD83DDE14U, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 1, 0xD83DDE15U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 1, 0xD83DDE16U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 0, 0xD83DDE17U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 0, 0xD83DDE18U, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 0, 0xD83DDE19U, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 0, 0xD83DDE1AU, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 0, 0xD83DDE1BU, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 0, 0xD83DDE1CU, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 0, 0xD83DDE1DU, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 0, 0xD83DDE1EU, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 0, 0xD83DDE1FU, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 0, 0xD83DDE20U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 0, 0xD83DDE21U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 1, 0xD83DDE22U, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 1, 0xD83DDE23U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 1, 0xD83DDE24U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 1, 0xD83DDE25U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 1, 0xD83DDE26U, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 1, 0xD83DDE27U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 1, 0xD83DDE28U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 1, 0xD83DDE29U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 1, 0xD83DDE2AU, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 1, 0xD83DDE2BU, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 0, 0xD83DDE2CU, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 1, 0xD83DDE2DU, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 1, 0xD83DDE2EU, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 1, 0xD83DDE2FU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 1, 0xD83DDE30U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 1, 0xD83DDE31U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 1, 0xD83DDE32U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 0, 0xD83DDE33U, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 1, 0xD83DDE34U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 1, 0xD83DDE35U, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 0, 0xD83DDE36U, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 1, 0xD83DDE37U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 1, 0xD83DDE38U, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 2, 0xD83DDE39U, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 1, 0xD83DDE3AU, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 2, 0xD83DDE3BU, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 2, 0xD83DDE3CU, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 2, 0xD83DDE3DU, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 2, 0xD83DDE3EU, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 2, 0xD83DDE3FU, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 2, 0xD83DDE40U, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 1, 0xD83DDE41U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 0, 0xD83DDE42U, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 0, 0xD83DDE43U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 0, 0xD83DDE44U, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 9, 0xD83DDE45U, 0, 2, 0, 0xFFFF05FEU); + new (toFill++) EmojiData(33, 9, 0xD83DDE46U, 0, 2, 0, 0xFFFF0603U); + new (toFill++) EmojiData(15, 9, 0xD83DDE47U, 0, 2, 0, 0xFFFF0608U); + new (toFill++) EmojiData(15, 12, 0xD83DDE48U, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 12, 0xD83DDE49U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 12, 0xD83DDE4AU, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 9, 0xD83DDE4BU, 0, 2, 0, 0xFFFF060DU); + new (toFill++) EmojiData(7, 2, 0xD83DDE4CU, 0, 2, 0, 0xFFFF0612U); + new (toFill++) EmojiData(11, 10, 0xD83DDE4DU, 0, 2, 0, 0xFFFF0617U); + new (toFill++) EmojiData(5, 10, 0xD83DDE4EU, 0, 2, 0, 0xFFFF061CU); + new (toFill++) EmojiData(39, 3, 0xD83DDE4FU, 0, 2, 0, 0xFFFF0621U); + new (toFill++) EmojiData(0, 21, 0xD83DDE80U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 20, 0xD83DDE81U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 20, 0xD83DDE82U, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 20, 0xD83DDE83U, 0, 2, 0, 0); + new (toFill++) EmojiData(21, 20, 0xD83DDE84U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 20, 0xD83DDE85U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 20, 0xD83DDE86U, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 20, 0xD83DDE87U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 20, 0xD83DDE88U, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 20, 0xD83DDE89U, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 20, 0xD83DDE8AU, 0, 2, 0, 0); + new (toFill++) EmojiData(19, 20, 0xD83DDE8BU, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 19, 0xD83DDE8CU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 20, 0xD83DDE8DU, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 19, 0xD83DDE8EU, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 21, 0xD83DDE8FU, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 20, 0xD83DDE90U, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 20, 0xD83DDE91U, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 20, 0xD83DDE92U, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 20, 0xD83DDE93U, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 20, 0xD83DDE94U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 19, 0xD83DDE95U, 0, 2, 0, 0); + new (toFill++) EmojiData(14, 20, 0xD83DDE96U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 19, 0xD83DDE97U, 0, 2, 0, 0); + new (toFill++) EmojiData(13, 20, 0xD83DDE98U, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 19, 0xD83DDE99U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 20, 0xD83DDE9AU, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 20, 0xD83DDE9BU, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 20, 0xD83DDE9CU, 0, 2, 0, 0); + new (toFill++) EmojiData(20, 20, 0xD83DDE9DU, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 20, 0xD83DDE9EU, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 20, 0xD83DDE9FU, 0, 2, 0, 0); + new (toFill++) EmojiData(16, 20, 0xD83DDEA0U, 0, 2, 0, 0); + new (toFill++) EmojiData(15, 20, 0xD83DDEA1U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 21, 0xD83DDEA2U, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 17, 0xD83DDEA3U, 0, 2, 0, 0xFFFF0626U); + new (toFill++) EmojiData(37, 20, 0xD83DDEA4U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 21, 0xD83DDEA5U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 21, 0xD83DDEA6U, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 21, 0xD83DDEA7U, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 20, 0xD83DDEA8U, 0, 2, 0, 0); + new (toFill++) EmojiData(32, 26, 0xD83DDEA9U, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 25, 0xD83DDEAAU, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 28, 0xD83DDEABU, 0, 2, 0, 0); + new (toFill++) EmojiData(18, 24, 0xD83DDEACU, 0, 2, 0, 0); + new (toFill++) EmojiData(3, 30, 0xD83DDEADU, 0, 2, 0, 0); + new (toFill++) EmojiData(11, 30, 0xD83DDEAEU, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 29, 0xD83DDEAFU, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 30, 0xD83DDEB0U, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 29, 0xD83DDEB1U, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 20, 0xD83DDEB2U, 0, 2, 0, 0); + new (toFill++) EmojiData(5, 29, 0xD83DDEB3U, 0, 2, 0, 0); + new (toFill++) EmojiData(30, 18, 0xD83DDEB4U, 0, 2, 0, 0xFFFF062BU); + new (toFill++) EmojiData(36, 18, 0xD83DDEB5U, 0, 2, 0, 0xFFFF0630U); + new (toFill++) EmojiData(33, 8, 0xD83DDEB6U, 0, 2, 0, 0xFFFF0635U); + new (toFill++) EmojiData(3, 29, 0xD83DDEB7U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 29, 0xD83DDEB8U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 30, 0xD83DDEB9U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 30, 0xD83DDEBAU, 0, 2, 0, 0); + new (toFill++) EmojiData(10, 30, 0xD83DDEBBU, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 30, 0xD83DDEBCU, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 24, 0xD83DDEBDU, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 30, 0xD83DDEBEU, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 24, 0xD83DDEBFU, 0, 2, 0, 0); + new (toFill++) EmojiData(12, 18, 0xD83DDEC0U, 0, 2, 0, 0xFFFF063AU); + new (toFill++) EmojiData(37, 24, 0xD83DDEC1U, 0, 2, 0, 0); + new (toFill++) EmojiData(38, 29, 0xD83DDEC2U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 29, 0xD83DDEC3U, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 30, 0xD83DDEC4U, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 30, 0xD83DDEC5U, 0, 2, 0, 0); + new (toFill++) EmojiData(0, 25, 0xD83DDECBU, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 25, 0xD83DDECCU, 0, 2, 0, 0); + new (toFill++) EmojiData(9, 25, 0xD83DDECDU, 0, 2, 0, 0); + new (toFill++) EmojiData(4, 25, 0xD83DDECEU, 0, 2, 0, 0); + new (toFill++) EmojiData(2, 25, 0xD83DDECFU, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 27, 0xD83DDED0U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 24, 0xD83DDEE0U, 0, 2, 0, 0); + new (toFill++) EmojiData(17, 24, 0xD83DDEE1U, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 23, 0xD83DDEE2U, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 21, 0xD83DDEE3U, 0, 2, 0, 0); + new (toFill++) EmojiData(29, 21, 0xD83DDEE4U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 20, 0xD83DDEE5U, 0, 2, 0, 0); + new (toFill++) EmojiData(31, 20, 0xD83DDEE9U, 0, 2, 0, 0); + new (toFill++) EmojiData(33, 20, 0xD83DDEEBU, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 20, 0xD83DDEECU, 0, 2, 0, 0); + new (toFill++) EmojiData(1, 21, 0xD83DDEF0U, 0, 2, 0, 0); + new (toFill++) EmojiData(39, 20, 0xD83DDEF3U, 0, 2, 0, 0); + new (toFill++) EmojiData(23, 1, 0xD83EDD10U, 0, 2, 0, 0); + new (toFill++) EmojiData(24, 0, 0xD83EDD11U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 1, 0xD83EDD12U, 0, 2, 0, 0); + new (toFill++) EmojiData(25, 0, 0xD83EDD13U, 0, 2, 0, 0); + new (toFill++) EmojiData(34, 0, 0xD83EDD14U, 0, 2, 0, 0); + new (toFill++) EmojiData(26, 1, 0xD83EDD15U, 0, 2, 0, 0); + new (toFill++) EmojiData(37, 1, 0xD83EDD16U, 0, 2, 0, 0); + new (toFill++) EmojiData(27, 0, 0xD83EDD17U, 0, 2, 0, 0); + new (toFill++) EmojiData(7, 5, 0xD83EDD18U, 0, 2, 0, 0xFFFF063FU); + new (toFill++) EmojiData(36, 12, 0xD83EDD80U, 0, 2, 0, 0); + new (toFill++) EmojiData(8, 12, 0xD83EDD81U, 0, 2, 0, 0); + new (toFill++) EmojiData(35, 12, 0xD83EDD82U, 0, 2, 0, 0); + new (toFill++) EmojiData(22, 13, 0xD83EDD83U, 0, 2, 0, 0); + new (toFill++) EmojiData(28, 12, 0xD83EDD84U, 0, 2, 0, 0); + new (toFill++) EmojiData(6, 16, 0xD83EDDC0U, 0, 2, 0, 0); + new (toFill++) EmojiData(36, 10, 0xFFFF0000U, 0, 8, 0, 0); + new (toFill++) EmojiData(37, 10, 0xFFFF0001U, 0, 11, 0, 0); + new (toFill++) EmojiData(38, 10, 0xFFFF0002U, 0, 11, 0, 0); + new (toFill++) EmojiData(39, 10, 0xFFFF0003U, 0, 11, 0, 0); + new (toFill++) EmojiData(0, 11, 0xFFFF0004U, 0, 8, 0, 0); + new (toFill++) EmojiData(1, 11, 0xFFFF0005U, 0, 8, 0, 0); + new (toFill++) EmojiData(2, 11, 0xFFFF0006U, 0, 11, 0, 0); + new (toFill++) EmojiData(3, 11, 0xFFFF0007U, 0, 11, 0, 0); + new (toFill++) EmojiData(4, 11, 0xFFFF0008U, 0, 11, 0, 0); + new (toFill++) EmojiData(5, 11, 0xFFFF0009U, 0, 8, 0, 0); + new (toFill++) EmojiData(6, 11, 0xFFFF000AU, 0, 8, 0, 0); + new (toFill++) EmojiData(7, 11, 0xFFFF000BU, 0, 11, 0, 0); + new (toFill++) EmojiData(8, 11, 0xFFFF000CU, 0, 11, 0, 0); + new (toFill++) EmojiData(9, 11, 0xFFFF000DU, 0, 11, 0, 0); + new (toFill++) EmojiData(30, 10, 0xFFFF000EU, 0, 8, 0, 0); + new (toFill++) EmojiData(31, 10, 0xFFFF000FU, 0, 8, 0, 0); + new (toFill++) EmojiData(33, 10, 0xFFFF0010U, 0, 11, 0, 0); + new (toFill++) EmojiData(34, 10, 0xFFFF0011U, 0, 11, 0, 0); + new (toFill++) EmojiData(9, 33, 0xFFFF0012U, 0, 5, 0, 0); + new (toFill++) EmojiData(6, 4, 0x261DU, 0, 3, 0xFE0F, 0xD83CDFFBU); + new (toFill++) EmojiData(7, 4, 0x261DU, 0, 3, 0xFE0F, 0xD83CDFFCU); + new (toFill++) EmojiData(8, 4, 0x261DU, 0, 3, 0xFE0F, 0xD83CDFFDU); + new (toFill++) EmojiData(9, 4, 0x261DU, 0, 3, 0xFE0F, 0xD83CDFFEU); + new (toFill++) EmojiData(10, 4, 0x261DU, 0, 3, 0xFE0F, 0xD83CDFFFU); + new (toFill++) EmojiData(19, 18, 0x26F9U, 0, 3, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(20, 18, 0x26F9U, 0, 3, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(21, 18, 0x26F9U, 0, 3, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(22, 18, 0x26F9U, 0, 3, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(23, 18, 0x26F9U, 0, 3, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(4, 3, 0x270AU, 0, 3, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(5, 3, 0x270AU, 0, 3, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(6, 3, 0x270AU, 0, 3, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(7, 3, 0x270AU, 0, 3, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(8, 3, 0x270AU, 0, 3, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(22, 3, 0x270BU, 0, 3, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(23, 3, 0x270BU, 0, 3, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(24, 3, 0x270BU, 0, 3, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(25, 3, 0x270BU, 0, 3, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(26, 3, 0x270BU, 0, 3, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(10, 3, 0x270CU, 0, 3, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(11, 3, 0x270CU, 0, 3, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(12, 3, 0x270CU, 0, 3, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(13, 3, 0x270CU, 0, 3, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(14, 3, 0x270CU, 0, 3, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(20, 5, 0x270DU, 0, 3, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(21, 5, 0x270DU, 0, 3, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(22, 5, 0x270DU, 0, 3, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(23, 5, 0x270DU, 0, 3, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(24, 5, 0x270DU, 0, 3, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(2, 34, 0xD83CDDE6U, 0xD83CDDE9U, 4, 0, 0); + new (toFill++) EmojiData(30, 39, 0xD83CDDE6U, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(37, 33, 0xD83CDDE6U, 0xD83CDDEBU, 4, 0, 0); + new (toFill++) EmojiData(6, 34, 0xD83CDDE6U, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(4, 34, 0xD83CDDE6U, 0xD83CDDEEU, 4, 0, 0); + new (toFill++) EmojiData(39, 33, 0xD83CDDE6U, 0xD83CDDF1U, 4, 0, 0); + new (toFill++) EmojiData(8, 34, 0xD83CDDE6U, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(3, 34, 0xD83CDDE6U, 0xD83CDDF4U, 4, 0, 0); + new (toFill++) EmojiData(5, 34, 0xD83CDDE6U, 0xD83CDDF6U, 4, 0, 0); + new (toFill++) EmojiData(7, 34, 0xD83CDDE6U, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(1, 34, 0xD83CDDE6U, 0xD83CDDF8U, 4, 0, 0); + new (toFill++) EmojiData(11, 34, 0xD83CDDE6U, 0xD83CDDF9U, 4, 0, 0); + new (toFill++) EmojiData(10, 34, 0xD83CDDE6U, 0xD83CDDFAU, 4, 0, 0); + new (toFill++) EmojiData(9, 34, 0xD83CDDE6U, 0xD83CDDFCU, 4, 0, 0); + new (toFill++) EmojiData(38, 33, 0xD83CDDE6U, 0xD83CDDFDU, 4, 0, 0); + new (toFill++) EmojiData(12, 34, 0xD83CDDE6U, 0xD83CDDFFU, 4, 0, 0); + new (toFill++) EmojiData(24, 34, 0xD83CDDE7U, 0xD83CDDE6U, 4, 0, 0); + new (toFill++) EmojiData(16, 34, 0xD83CDDE7U, 0xD83CDDE7U, 4, 0, 0); + new (toFill++) EmojiData(15, 34, 0xD83CDDE7U, 0xD83CDDE9U, 4, 0, 0); + new (toFill++) EmojiData(18, 34, 0xD83CDDE7U, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(31, 34, 0xD83CDDE7U, 0xD83CDDEBU, 4, 0, 0); + new (toFill++) EmojiData(30, 34, 0xD83CDDE7U, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(14, 34, 0xD83CDDE7U, 0xD83CDDEDU, 4, 0, 0); + new (toFill++) EmojiData(32, 34, 0xD83CDDE7U, 0xD83CDDEEU, 4, 0, 0); + new (toFill++) EmojiData(20, 34, 0xD83CDDE7U, 0xD83CDDEFU, 4, 0, 0); + new (toFill++) EmojiData(1, 39, 0xD83CDDE7U, 0xD83CDDF1U, 4, 0, 0); + new (toFill++) EmojiData(21, 34, 0xD83CDDE7U, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(29, 34, 0xD83CDDE7U, 0xD83CDDF3U, 4, 0, 0); + new (toFill++) EmojiData(23, 34, 0xD83CDDE7U, 0xD83CDDF4U, 4, 0, 0); + new (toFill++) EmojiData(38, 34, 0xD83CDDE7U, 0xD83CDDF6U, 4, 0, 0); + new (toFill++) EmojiData(26, 34, 0xD83CDDE7U, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(13, 34, 0xD83CDDE7U, 0xD83CDDF8U, 4, 0, 0); + new (toFill++) EmojiData(22, 34, 0xD83CDDE7U, 0xD83CDDF9U, 4, 0, 0); + new (toFill++) EmojiData(25, 34, 0xD83CDDE7U, 0xD83CDDFCU, 4, 0, 0); + new (toFill++) EmojiData(17, 34, 0xD83CDDE7U, 0xD83CDDFEU, 4, 0, 0); + new (toFill++) EmojiData(19, 34, 0xD83CDDE7U, 0xD83CDDFFU, 4, 0, 0); + new (toFill++) EmojiData(35, 34, 0xD83CDDE8U, 0xD83CDDE6U, 4, 0, 0); + new (toFill++) EmojiData(5, 35, 0xD83CDDE8U, 0xD83CDDE8U, 4, 0, 0); + new (toFill++) EmojiData(9, 35, 0xD83CDDE8U, 0xD83CDDE9U, 4, 0, 0); + new (toFill++) EmojiData(0, 35, 0xD83CDDE8U, 0xD83CDDEBU, 4, 0, 0); + new (toFill++) EmojiData(8, 35, 0xD83CDDE8U, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(11, 39, 0xD83CDDE8U, 0xD83CDDEDU, 4, 0, 0); + new (toFill++) EmojiData(12, 35, 0xD83CDDE8U, 0xD83CDDEEU, 4, 0, 0); + new (toFill++) EmojiData(10, 35, 0xD83CDDE8U, 0xD83CDDF0U, 4, 0, 0); + new (toFill++) EmojiData(2, 35, 0xD83CDDE8U, 0xD83CDDF1U, 4, 0, 0); + new (toFill++) EmojiData(34, 34, 0xD83CDDE8U, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(3, 35, 0xD83CDDE8U, 0xD83CDDF3U, 4, 0, 0); + new (toFill++) EmojiData(6, 35, 0xD83CDDE8U, 0xD83CDDF4U, 4, 0, 0); + new (toFill++) EmojiData(11, 35, 0xD83CDDE8U, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(14, 35, 0xD83CDDE8U, 0xD83CDDFAU, 4, 0, 0); + new (toFill++) EmojiData(37, 34, 0xD83CDDE8U, 0xD83CDDFBU, 4, 0, 0); + new (toFill++) EmojiData(15, 35, 0xD83CDDE8U, 0xD83CDDFCU, 4, 0, 0); + new (toFill++) EmojiData(4, 35, 0xD83CDDE8U, 0xD83CDDFDU, 4, 0, 0); + new (toFill++) EmojiData(16, 35, 0xD83CDDE8U, 0xD83CDDFEU, 4, 0, 0); + new (toFill++) EmojiData(17, 35, 0xD83CDDE8U, 0xD83CDDFFU, 4, 0, 0); + new (toFill++) EmojiData(1, 36, 0xD83CDDE9U, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(19, 35, 0xD83CDDE9U, 0xD83CDDEFU, 4, 0, 0); + new (toFill++) EmojiData(18, 35, 0xD83CDDE9U, 0xD83CDDF0U, 4, 0, 0); + new (toFill++) EmojiData(20, 35, 0xD83CDDE9U, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(21, 35, 0xD83CDDE9U, 0xD83CDDF4U, 4, 0, 0); + new (toFill++) EmojiData(0, 34, 0xD83CDDE9U, 0xD83CDDFFU, 4, 0, 0); + new (toFill++) EmojiData(22, 35, 0xD83CDDEAU, 0xD83CDDE8U, 4, 0, 0); + new (toFill++) EmojiData(27, 35, 0xD83CDDEAU, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(23, 35, 0xD83CDDEAU, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(0, 40, 0xD83CDDEAU, 0xD83CDDEDU, 4, 0, 0); + new (toFill++) EmojiData(26, 35, 0xD83CDDEAU, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(39, 38, 0xD83CDDEAU, 0xD83CDDF8U, 4, 0, 0); + new (toFill++) EmojiData(28, 35, 0xD83CDDEAU, 0xD83CDDF9U, 4, 0, 0); + new (toFill++) EmojiData(29, 35, 0xD83CDDEAU, 0xD83CDDFAU, 4, 0, 0); + new (toFill++) EmojiData(33, 35, 0xD83CDDEBU, 0xD83CDDEEU, 4, 0, 0); + new (toFill++) EmojiData(32, 35, 0xD83CDDEBU, 0xD83CDDEFU, 4, 0, 0); + new (toFill++) EmojiData(30, 35, 0xD83CDDEBU, 0xD83CDDF0U, 4, 0, 0); + new (toFill++) EmojiData(20, 37, 0xD83CDDEBU, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(31, 35, 0xD83CDDEBU, 0xD83CDDF4U, 4, 0, 0); + new (toFill++) EmojiData(34, 35, 0xD83CDDEBU, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(38, 35, 0xD83CDDECU, 0xD83CDDE6U, 4, 0, 0); + new (toFill++) EmojiData(31, 39, 0xD83CDDECU, 0xD83CDDE7U, 4, 0, 0); + new (toFill++) EmojiData(6, 36, 0xD83CDDECU, 0xD83CDDE9U, 4, 0, 0); + new (toFill++) EmojiData(0, 36, 0xD83CDDECU, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(35, 35, 0xD83CDDECU, 0xD83CDDEBU, 4, 0, 0); + new (toFill++) EmojiData(10, 36, 0xD83CDDECU, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(2, 36, 0xD83CDDECU, 0xD83CDDEDU, 4, 0, 0); + new (toFill++) EmojiData(3, 36, 0xD83CDDECU, 0xD83CDDEEU, 4, 0, 0); + new (toFill++) EmojiData(5, 36, 0xD83CDDECU, 0xD83CDDF1U, 4, 0, 0); + new (toFill++) EmojiData(39, 35, 0xD83CDDECU, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(11, 36, 0xD83CDDECU, 0xD83CDDF3U, 4, 0, 0); + new (toFill++) EmojiData(7, 36, 0xD83CDDECU, 0xD83CDDF5U, 4, 0, 0); + new (toFill++) EmojiData(25, 35, 0xD83CDDECU, 0xD83CDDF6U, 4, 0, 0); + new (toFill++) EmojiData(4, 36, 0xD83CDDECU, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(33, 38, 0xD83CDDECU, 0xD83CDDF8U, 4, 0, 0); + new (toFill++) EmojiData(9, 36, 0xD83CDDECU, 0xD83CDDF9U, 4, 0, 0); + new (toFill++) EmojiData(8, 36, 0xD83CDDECU, 0xD83CDDFAU, 4, 0, 0); + new (toFill++) EmojiData(12, 36, 0xD83CDDECU, 0xD83CDDFCU, 4, 0, 0); + new (toFill++) EmojiData(13, 36, 0xD83CDDECU, 0xD83CDDFEU, 4, 0, 0); + new (toFill++) EmojiData(16, 36, 0xD83CDDEDU, 0xD83CDDF0U, 4, 0, 0); + new (toFill++) EmojiData(15, 36, 0xD83CDDEDU, 0xD83CDDF3U, 4, 0, 0); + new (toFill++) EmojiData(13, 35, 0xD83CDDEDU, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(14, 36, 0xD83CDDEDU, 0xD83CDDF9U, 4, 0, 0); + new (toFill++) EmojiData(17, 36, 0xD83CDDEDU, 0xD83CDDFAU, 4, 0, 0); + new (toFill++) EmojiData(36, 34, 0xD83CDDEEU, 0xD83CDDE8U, 4, 0, 0); + new (toFill++) EmojiData(20, 36, 0xD83CDDEEU, 0xD83CDDE9U, 4, 0, 0); + new (toFill++) EmojiData(23, 36, 0xD83CDDEEU, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(25, 36, 0xD83CDDEEU, 0xD83CDDF1U, 4, 0, 0); + new (toFill++) EmojiData(24, 36, 0xD83CDDEEU, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(19, 36, 0xD83CDDEEU, 0xD83CDDF3U, 4, 0, 0); + new (toFill++) EmojiData(27, 34, 0xD83CDDEEU, 0xD83CDDF4U, 4, 0, 0); + new (toFill++) EmojiData(22, 36, 0xD83CDDEEU, 0xD83CDDF6U, 4, 0, 0); + new (toFill++) EmojiData(21, 36, 0xD83CDDEEU, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(18, 36, 0xD83CDDEEU, 0xD83CDDF8U, 4, 0, 0); + new (toFill++) EmojiData(26, 36, 0xD83CDDEEU, 0xD83CDDF9U, 4, 0, 0); + new (toFill++) EmojiData(29, 36, 0xD83CDDEFU, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(27, 36, 0xD83CDDEFU, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(30, 36, 0xD83CDDEFU, 0xD83CDDF4U, 4, 0, 0); + new (toFill++) EmojiData(28, 36, 0xD83CDDEFU, 0xD83CDDF5U, 4, 0, 0); + new (toFill++) EmojiData(32, 36, 0xD83CDDF0U, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(36, 36, 0xD83CDDF0U, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(33, 34, 0xD83CDDF0U, 0xD83CDDEDU, 4, 0, 0); + new (toFill++) EmojiData(33, 36, 0xD83CDDF0U, 0xD83CDDEEU, 4, 0, 0); + new (toFill++) EmojiData(7, 35, 0xD83CDDF0U, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(3, 39, 0xD83CDDF0U, 0xD83CDDF3U, 4, 0, 0); + new (toFill++) EmojiData(0, 38, 0xD83CDDF0U, 0xD83CDDF5U, 4, 0, 0); + new (toFill++) EmojiData(37, 38, 0xD83CDDF0U, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(35, 36, 0xD83CDDF0U, 0xD83CDDFCU, 4, 0, 0); + new (toFill++) EmojiData(39, 34, 0xD83CDDF0U, 0xD83CDDFEU, 4, 0, 0); + new (toFill++) EmojiData(31, 36, 0xD83CDDF0U, 0xD83CDDFFU, 4, 0, 0); + new (toFill++) EmojiData(37, 36, 0xD83CDDF1U, 0xD83CDDE6U, 4, 0, 0); + new (toFill++) EmojiData(39, 36, 0xD83CDDF1U, 0xD83CDDE7U, 4, 0, 0); + new (toFill++) EmojiData(4, 39, 0xD83CDDF1U, 0xD83CDDE8U, 4, 0, 0); + new (toFill++) EmojiData(3, 37, 0xD83CDDF1U, 0xD83CDDEEU, 4, 0, 0); + new (toFill++) EmojiData(0, 39, 0xD83CDDF1U, 0xD83CDDF0U, 4, 0, 0); + new (toFill++) EmojiData(1, 37, 0xD83CDDF1U, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(0, 37, 0xD83CDDF1U, 0xD83CDDF8U, 4, 0, 0); + new (toFill++) EmojiData(4, 37, 0xD83CDDF1U, 0xD83CDDF9U, 4, 0, 0); + new (toFill++) EmojiData(5, 37, 0xD83CDDF1U, 0xD83CDDFAU, 4, 0, 0); + new (toFill++) EmojiData(38, 36, 0xD83CDDF1U, 0xD83CDDFBU, 4, 0, 0); + new (toFill++) EmojiData(2, 37, 0xD83CDDF1U, 0xD83CDDFEU, 4, 0, 0); + new (toFill++) EmojiData(26, 37, 0xD83CDDF2U, 0xD83CDDE6U, 4, 0, 0); + new (toFill++) EmojiData(22, 37, 0xD83CDDF2U, 0xD83CDDE8U, 4, 0, 0); + new (toFill++) EmojiData(21, 37, 0xD83CDDF2U, 0xD83CDDE9U, 4, 0, 0); + new (toFill++) EmojiData(24, 37, 0xD83CDDF2U, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(8, 37, 0xD83CDDF2U, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(14, 37, 0xD83CDDF2U, 0xD83CDDEDU, 4, 0, 0); + new (toFill++) EmojiData(7, 37, 0xD83CDDF2U, 0xD83CDDF0U, 4, 0, 0); + new (toFill++) EmojiData(12, 37, 0xD83CDDF2U, 0xD83CDDF1U, 4, 0, 0); + new (toFill++) EmojiData(28, 37, 0xD83CDDF2U, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(23, 37, 0xD83CDDF2U, 0xD83CDDF3U, 4, 0, 0); + new (toFill++) EmojiData(6, 37, 0xD83CDDF2U, 0xD83CDDF4U, 4, 0, 0); + new (toFill++) EmojiData(1, 38, 0xD83CDDF2U, 0xD83CDDF5U, 4, 0, 0); + new (toFill++) EmojiData(15, 37, 0xD83CDDF2U, 0xD83CDDF6U, 4, 0, 0); + new (toFill++) EmojiData(16, 37, 0xD83CDDF2U, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(25, 37, 0xD83CDDF2U, 0xD83CDDF8U, 4, 0, 0); + new (toFill++) EmojiData(13, 37, 0xD83CDDF2U, 0xD83CDDF9U, 4, 0, 0); + new (toFill++) EmojiData(17, 37, 0xD83CDDF2U, 0xD83CDDFAU, 4, 0, 0); + new (toFill++) EmojiData(11, 37, 0xD83CDDF2U, 0xD83CDDFBU, 4, 0, 0); + new (toFill++) EmojiData(9, 37, 0xD83CDDF2U, 0xD83CDDFCU, 4, 0, 0); + new (toFill++) EmojiData(19, 37, 0xD83CDDF2U, 0xD83CDDFDU, 4, 0, 0); + new (toFill++) EmojiData(10, 37, 0xD83CDDF2U, 0xD83CDDFEU, 4, 0, 0); + new (toFill++) EmojiData(27, 37, 0xD83CDDF2U, 0xD83CDDFFU, 4, 0, 0); + new (toFill++) EmojiData(29, 37, 0xD83CDDF3U, 0xD83CDDE6U, 4, 0, 0); + new (toFill++) EmojiData(33, 37, 0xD83CDDF3U, 0xD83CDDE8U, 4, 0, 0); + new (toFill++) EmojiData(36, 37, 0xD83CDDF3U, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(39, 37, 0xD83CDDF3U, 0xD83CDDEBU, 4, 0, 0); + new (toFill++) EmojiData(37, 37, 0xD83CDDF3U, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(35, 37, 0xD83CDDF3U, 0xD83CDDEEU, 4, 0, 0); + new (toFill++) EmojiData(32, 37, 0xD83CDDF3U, 0xD83CDDF1U, 4, 0, 0); + new (toFill++) EmojiData(2, 38, 0xD83CDDF3U, 0xD83CDDF4U, 4, 0, 0); + new (toFill++) EmojiData(31, 37, 0xD83CDDF3U, 0xD83CDDF5U, 4, 0, 0); + new (toFill++) EmojiData(30, 37, 0xD83CDDF3U, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(38, 37, 0xD83CDDF3U, 0xD83CDDFAU, 4, 0, 0); + new (toFill++) EmojiData(34, 37, 0xD83CDDF3U, 0xD83CDDFFU, 4, 0, 0); + new (toFill++) EmojiData(3, 38, 0xD83CDDF4U, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(7, 38, 0xD83CDDF5U, 0xD83CDDE6U, 4, 0, 0); + new (toFill++) EmojiData(10, 38, 0xD83CDDF5U, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(36, 35, 0xD83CDDF5U, 0xD83CDDEBU, 4, 0, 0); + new (toFill++) EmojiData(8, 38, 0xD83CDDF5U, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(11, 38, 0xD83CDDF5U, 0xD83CDDEDU, 4, 0, 0); + new (toFill++) EmojiData(4, 38, 0xD83CDDF5U, 0xD83CDDF0U, 4, 0, 0); + new (toFill++) EmojiData(13, 38, 0xD83CDDF5U, 0xD83CDDF1U, 4, 0, 0); + new (toFill++) EmojiData(5, 39, 0xD83CDDF5U, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(12, 38, 0xD83CDDF5U, 0xD83CDDF3U, 4, 0, 0); + new (toFill++) EmojiData(15, 38, 0xD83CDDF5U, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(6, 38, 0xD83CDDF5U, 0xD83CDDF8U, 4, 0, 0); + new (toFill++) EmojiData(14, 38, 0xD83CDDF5U, 0xD83CDDF9U, 4, 0, 0); + new (toFill++) EmojiData(5, 38, 0xD83CDDF5U, 0xD83CDDFCU, 4, 0, 0); + new (toFill++) EmojiData(9, 38, 0xD83CDDF5U, 0xD83CDDFEU, 4, 0, 0); + new (toFill++) EmojiData(16, 38, 0xD83CDDF6U, 0xD83CDDE6U, 4, 0, 0); + new (toFill++) EmojiData(17, 38, 0xD83CDDF7U, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(18, 38, 0xD83CDDF7U, 0xD83CDDF4U, 4, 0, 0); + new (toFill++) EmojiData(26, 38, 0xD83CDDF7U, 0xD83CDDF8U, 4, 0, 0); + new (toFill++) EmojiData(19, 38, 0xD83CDDF7U, 0xD83CDDFAU, 4, 0, 0); + new (toFill++) EmojiData(20, 38, 0xD83CDDF7U, 0xD83CDDFCU, 4, 0, 0); + new (toFill++) EmojiData(24, 38, 0xD83CDDF8U, 0xD83CDDE6U, 4, 0, 0); + new (toFill++) EmojiData(34, 38, 0xD83CDDF8U, 0xD83CDDE7U, 4, 0, 0); + new (toFill++) EmojiData(27, 38, 0xD83CDDF8U, 0xD83CDDE8U, 4, 0, 0); + new (toFill++) EmojiData(7, 39, 0xD83CDDF8U, 0xD83CDDE9U, 4, 0, 0); + new (toFill++) EmojiData(10, 39, 0xD83CDDF8U, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(29, 38, 0xD83CDDF8U, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(2, 39, 0xD83CDDF8U, 0xD83CDDEDU, 4, 0, 0); + new (toFill++) EmojiData(32, 38, 0xD83CDDF8U, 0xD83CDDEEU, 4, 0, 0); + new (toFill++) EmojiData(31, 38, 0xD83CDDF8U, 0xD83CDDF0U, 4, 0, 0); + new (toFill++) EmojiData(28, 38, 0xD83CDDF8U, 0xD83CDDF1U, 4, 0, 0); + new (toFill++) EmojiData(22, 38, 0xD83CDDF8U, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(25, 38, 0xD83CDDF8U, 0xD83CDDF3U, 4, 0, 0); + new (toFill++) EmojiData(35, 38, 0xD83CDDF8U, 0xD83CDDF4U, 4, 0, 0); + new (toFill++) EmojiData(8, 39, 0xD83CDDF8U, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(38, 38, 0xD83CDDF8U, 0xD83CDDF8U, 4, 0, 0); + new (toFill++) EmojiData(23, 38, 0xD83CDDF8U, 0xD83CDDF9U, 4, 0, 0); + new (toFill++) EmojiData(24, 35, 0xD83CDDF8U, 0xD83CDDFBU, 4, 0, 0); + new (toFill++) EmojiData(30, 38, 0xD83CDDF8U, 0xD83CDDFDU, 4, 0, 0); + new (toFill++) EmojiData(12, 39, 0xD83CDDF8U, 0xD83CDDFEU, 4, 0, 0); + new (toFill++) EmojiData(9, 39, 0xD83CDDF8U, 0xD83CDDFFU, 4, 0, 0); + new (toFill++) EmojiData(25, 39, 0xD83CDDF9U, 0xD83CDDE8U, 4, 0, 0); + new (toFill++) EmojiData(1, 35, 0xD83CDDF9U, 0xD83CDDE9U, 4, 0, 0); + new (toFill++) EmojiData(37, 35, 0xD83CDDF9U, 0xD83CDDEBU, 4, 0, 0); + new (toFill++) EmojiData(18, 39, 0xD83CDDF9U, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(16, 39, 0xD83CDDF9U, 0xD83CDDEDU, 4, 0, 0); + new (toFill++) EmojiData(14, 39, 0xD83CDDF9U, 0xD83CDDEFU, 4, 0, 0); + new (toFill++) EmojiData(19, 39, 0xD83CDDF9U, 0xD83CDDF0U, 4, 0, 0); + new (toFill++) EmojiData(17, 39, 0xD83CDDF9U, 0xD83CDDF1U, 4, 0, 0); + new (toFill++) EmojiData(24, 39, 0xD83CDDF9U, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(22, 39, 0xD83CDDF9U, 0xD83CDDF3U, 4, 0, 0); + new (toFill++) EmojiData(20, 39, 0xD83CDDF9U, 0xD83CDDF4U, 4, 0, 0); + new (toFill++) EmojiData(23, 39, 0xD83CDDF9U, 0xD83CDDF7U, 4, 0, 0); + new (toFill++) EmojiData(21, 39, 0xD83CDDF9U, 0xD83CDDF9U, 4, 0, 0); + new (toFill++) EmojiData(26, 39, 0xD83CDDF9U, 0xD83CDDFBU, 4, 0, 0); + new (toFill++) EmojiData(13, 39, 0xD83CDDF9U, 0xD83CDDFCU, 4, 0, 0); + new (toFill++) EmojiData(15, 39, 0xD83CDDF9U, 0xD83CDDFFU, 4, 0, 0); + new (toFill++) EmojiData(29, 39, 0xD83CDDFAU, 0xD83CDDE6U, 4, 0, 0); + new (toFill++) EmojiData(28, 39, 0xD83CDDFAU, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(32, 39, 0xD83CDDFAU, 0xD83CDDF8U, 4, 0, 0); + new (toFill++) EmojiData(33, 39, 0xD83CDDFAU, 0xD83CDDFEU, 4, 0, 0); + new (toFill++) EmojiData(34, 39, 0xD83CDDFAU, 0xD83CDDFFU, 4, 0, 0); + new (toFill++) EmojiData(36, 39, 0xD83CDDFBU, 0xD83CDDE6U, 4, 0, 0); + new (toFill++) EmojiData(6, 39, 0xD83CDDFBU, 0xD83CDDE8U, 4, 0, 0); + new (toFill++) EmojiData(37, 39, 0xD83CDDFBU, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(28, 34, 0xD83CDDFBU, 0xD83CDDECU, 4, 0, 0); + new (toFill++) EmojiData(27, 39, 0xD83CDDFBU, 0xD83CDDEEU, 4, 0, 0); + new (toFill++) EmojiData(38, 39, 0xD83CDDFBU, 0xD83CDDF3U, 4, 0, 0); + new (toFill++) EmojiData(35, 39, 0xD83CDDFBU, 0xD83CDDFAU, 4, 0, 0); + new (toFill++) EmojiData(39, 39, 0xD83CDDFCU, 0xD83CDDEBU, 4, 0, 0); + new (toFill++) EmojiData(21, 38, 0xD83CDDFCU, 0xD83CDDF8U, 4, 0, 0); + new (toFill++) EmojiData(34, 36, 0xD83CDDFDU, 0xD83CDDF0U, 4, 0, 0); + new (toFill++) EmojiData(1, 40, 0xD83CDDFEU, 0xD83CDDEAU, 4, 0, 0); + new (toFill++) EmojiData(18, 37, 0xD83CDDFEU, 0xD83CDDF9U, 4, 0, 0); + new (toFill++) EmojiData(36, 38, 0xD83CDDFFU, 0xD83CDDE6U, 4, 0, 0); + new (toFill++) EmojiData(2, 40, 0xD83CDDFFU, 0xD83CDDF2U, 4, 0, 0); + new (toFill++) EmojiData(3, 40, 0xD83CDDFFU, 0xD83CDDFCU, 4, 0, 0); + new (toFill++) EmojiData(10, 8, 0xD83CDF85U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(11, 8, 0xD83CDF85U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(12, 8, 0xD83CDF85U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(13, 8, 0xD83CDF85U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(14, 8, 0xD83CDF85U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(0, 9, 0xD83CDFC3U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(1, 9, 0xD83CDFC3U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(2, 9, 0xD83CDFC3U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(3, 9, 0xD83CDFC3U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(4, 9, 0xD83CDFC3U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(7, 18, 0xD83CDFC4U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(8, 18, 0xD83CDFC4U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(9, 18, 0xD83CDFC4U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(10, 18, 0xD83CDFC4U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(11, 18, 0xD83CDFC4U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(3, 19, 0xD83CDFC7U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(4, 19, 0xD83CDFC7U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(5, 19, 0xD83CDFC7U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(6, 19, 0xD83CDFC7U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(7, 19, 0xD83CDFC7U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(1, 18, 0xD83CDFCAU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(2, 18, 0xD83CDFCAU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(3, 18, 0xD83CDFCAU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(4, 18, 0xD83CDFCAU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(5, 18, 0xD83CDFCAU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(25, 18, 0xD83CDFCBU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(26, 18, 0xD83CDFCBU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(27, 18, 0xD83CDFCBU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(28, 18, 0xD83CDFCBU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(29, 18, 0xD83CDFCBU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(34, 5, 0xD83DDC42U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(35, 5, 0xD83DDC42U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(36, 5, 0xD83DDC42U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(37, 5, 0xD83DDC42U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(38, 5, 0xD83DDC42U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(0, 6, 0xD83DDC43U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(1, 6, 0xD83DDC43U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(2, 6, 0xD83DDC43U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(3, 6, 0xD83DDC43U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(4, 6, 0xD83DDC43U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(12, 4, 0xD83DDC46U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(13, 4, 0xD83DDC46U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(14, 4, 0xD83DDC46U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(15, 4, 0xD83DDC46U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(16, 4, 0xD83DDC46U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(18, 4, 0xD83DDC47U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(19, 4, 0xD83DDC47U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(20, 4, 0xD83DDC47U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(21, 4, 0xD83DDC47U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(22, 4, 0xD83DDC47U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(24, 4, 0xD83DDC48U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(25, 4, 0xD83DDC48U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(26, 4, 0xD83DDC48U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(27, 4, 0xD83DDC48U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(28, 4, 0xD83DDC48U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(30, 4, 0xD83DDC49U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(31, 4, 0xD83DDC49U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(32, 4, 0xD83DDC49U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(33, 4, 0xD83DDC49U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(34, 4, 0xD83DDC49U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(38, 2, 0xD83DDC4AU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(39, 2, 0xD83DDC4AU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(0, 3, 0xD83DDC4AU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(1, 3, 0xD83DDC4AU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(2, 3, 0xD83DDC4AU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(20, 2, 0xD83DDC4BU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(21, 2, 0xD83DDC4BU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(22, 2, 0xD83DDC4BU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(23, 2, 0xD83DDC4BU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(24, 2, 0xD83DDC4BU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(16, 3, 0xD83DDC4CU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(17, 3, 0xD83DDC4CU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(18, 3, 0xD83DDC4CU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(19, 3, 0xD83DDC4CU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(20, 3, 0xD83DDC4CU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(26, 2, 0xD83DDC4DU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(27, 2, 0xD83DDC4DU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(28, 2, 0xD83DDC4DU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(29, 2, 0xD83DDC4DU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(30, 2, 0xD83DDC4DU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(32, 2, 0xD83DDC4EU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(33, 2, 0xD83DDC4EU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(34, 2, 0xD83DDC4EU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(35, 2, 0xD83DDC4EU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(36, 2, 0xD83DDC4EU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(14, 2, 0xD83DDC4FU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(15, 2, 0xD83DDC4FU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(16, 2, 0xD83DDC4FU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(17, 2, 0xD83DDC4FU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(18, 2, 0xD83DDC4FU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(28, 3, 0xD83DDC50U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(29, 3, 0xD83DDC50U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(30, 3, 0xD83DDC50U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(31, 3, 0xD83DDC50U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(32, 3, 0xD83DDC50U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(17, 6, 0xD83DDC66U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(18, 6, 0xD83DDC66U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(19, 6, 0xD83DDC66U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(20, 6, 0xD83DDC66U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(21, 6, 0xD83DDC66U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(23, 6, 0xD83DDC67U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(24, 6, 0xD83DDC67U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(25, 6, 0xD83DDC67U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(26, 6, 0xD83DDC67U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(27, 6, 0xD83DDC67U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(29, 6, 0xD83DDC68U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(30, 6, 0xD83DDC68U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(31, 6, 0xD83DDC68U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(32, 6, 0xD83DDC68U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(33, 6, 0xD83DDC68U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(35, 6, 0xD83DDC69U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(36, 6, 0xD83DDC69U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(37, 6, 0xD83DDC69U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(38, 6, 0xD83DDC69U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(39, 6, 0xD83DDC69U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(31, 7, 0xD83DDC6EU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(32, 7, 0xD83DDC6EU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(33, 7, 0xD83DDC6EU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(34, 7, 0xD83DDC6EU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(35, 7, 0xD83DDC6EU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(28, 8, 0xD83DDC70U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(29, 8, 0xD83DDC70U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(30, 8, 0xD83DDC70U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(31, 8, 0xD83DDC70U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(32, 8, 0xD83DDC70U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(1, 7, 0xD83DDC71U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(2, 7, 0xD83DDC71U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(3, 7, 0xD83DDC71U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(4, 7, 0xD83DDC71U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(5, 7, 0xD83DDC71U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(19, 7, 0xD83DDC72U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(20, 7, 0xD83DDC72U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(21, 7, 0xD83DDC72U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(22, 7, 0xD83DDC72U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(23, 7, 0xD83DDC72U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(25, 7, 0xD83DDC73U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(26, 7, 0xD83DDC73U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(27, 7, 0xD83DDC73U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(28, 7, 0xD83DDC73U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(29, 7, 0xD83DDC73U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(7, 7, 0xD83DDC74U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(8, 7, 0xD83DDC74U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(9, 7, 0xD83DDC74U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(10, 7, 0xD83DDC74U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(11, 7, 0xD83DDC74U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(13, 7, 0xD83DDC75U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(14, 7, 0xD83DDC75U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(15, 7, 0xD83DDC75U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(16, 7, 0xD83DDC75U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(17, 7, 0xD83DDC75U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(11, 6, 0xD83DDC76U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(12, 6, 0xD83DDC76U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(13, 6, 0xD83DDC76U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(14, 6, 0xD83DDC76U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(15, 6, 0xD83DDC76U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(37, 7, 0xD83DDC77U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(38, 7, 0xD83DDC77U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(39, 7, 0xD83DDC77U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(0, 8, 0xD83DDC77U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(1, 8, 0xD83DDC77U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(22, 8, 0xD83DDC78U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(23, 8, 0xD83DDC78U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(24, 8, 0xD83DDC78U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(25, 8, 0xD83DDC78U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(26, 8, 0xD83DDC78U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(16, 8, 0xD83DDC7CU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(17, 8, 0xD83DDC7CU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(18, 8, 0xD83DDC7CU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(19, 8, 0xD83DDC7CU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(20, 8, 0xD83DDC7CU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(22, 9, 0xD83DDC81U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(23, 9, 0xD83DDC81U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(24, 9, 0xD83DDC81U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(25, 9, 0xD83DDC81U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(26, 9, 0xD83DDC81U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(3, 8, 0xD83DDC82U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(4, 8, 0xD83DDC82U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(5, 8, 0xD83DDC82U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(6, 8, 0xD83DDC82U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(7, 8, 0xD83DDC82U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(6, 9, 0xD83DDC83U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(7, 9, 0xD83DDC83U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(8, 9, 0xD83DDC83U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(9, 9, 0xD83DDC83U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(10, 9, 0xD83DDC83U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(26, 5, 0xD83DDC85U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(27, 5, 0xD83DDC85U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(28, 5, 0xD83DDC85U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(29, 5, 0xD83DDC85U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(30, 5, 0xD83DDC85U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(24, 10, 0xD83DDC86U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(25, 10, 0xD83DDC86U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(26, 10, 0xD83DDC86U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(27, 10, 0xD83DDC86U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(28, 10, 0xD83DDC86U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(18, 10, 0xD83DDC87U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(19, 10, 0xD83DDC87U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(20, 10, 0xD83DDC87U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(21, 10, 0xD83DDC87U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(22, 10, 0xD83DDC87U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(34, 3, 0xD83DDCAAU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(35, 3, 0xD83DDCAAU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(36, 3, 0xD83DDCAAU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(37, 3, 0xD83DDCAAU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(38, 3, 0xD83DDCAAU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(2, 5, 0xD83DDD90U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(3, 5, 0xD83DDD90U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(4, 5, 0xD83DDD90U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(5, 5, 0xD83DDD90U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(6, 5, 0xD83DDD90U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(36, 4, 0xD83DDD95U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(37, 4, 0xD83DDD95U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(38, 4, 0xD83DDD95U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(39, 4, 0xD83DDD95U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(0, 5, 0xD83DDD95U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(14, 5, 0xD83DDD96U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(15, 5, 0xD83DDD96U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(16, 5, 0xD83DDD96U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(17, 5, 0xD83DDD96U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(18, 5, 0xD83DDD96U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(28, 9, 0xD83DDE45U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(29, 9, 0xD83DDE45U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(30, 9, 0xD83DDE45U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(31, 9, 0xD83DDE45U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(32, 9, 0xD83DDE45U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(34, 9, 0xD83DDE46U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(35, 9, 0xD83DDE46U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(36, 9, 0xD83DDE46U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(37, 9, 0xD83DDE46U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(38, 9, 0xD83DDE46U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(16, 9, 0xD83DDE47U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(17, 9, 0xD83DDE47U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(18, 9, 0xD83DDE47U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(19, 9, 0xD83DDE47U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(20, 9, 0xD83DDE47U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(0, 10, 0xD83DDE4BU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(1, 10, 0xD83DDE4BU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(2, 10, 0xD83DDE4BU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(3, 10, 0xD83DDE4BU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(4, 10, 0xD83DDE4BU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(8, 2, 0xD83DDE4CU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(9, 2, 0xD83DDE4CU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(10, 2, 0xD83DDE4CU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(11, 2, 0xD83DDE4CU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(12, 2, 0xD83DDE4CU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(12, 10, 0xD83DDE4DU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(13, 10, 0xD83DDE4DU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(14, 10, 0xD83DDE4DU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(15, 10, 0xD83DDE4DU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(16, 10, 0xD83DDE4DU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(6, 10, 0xD83DDE4EU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(7, 10, 0xD83DDE4EU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(8, 10, 0xD83DDE4EU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(9, 10, 0xD83DDE4EU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(10, 10, 0xD83DDE4EU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(0, 4, 0xD83DDE4FU, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(1, 4, 0xD83DDE4FU, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(2, 4, 0xD83DDE4FU, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(3, 4, 0xD83DDE4FU, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(4, 4, 0xD83DDE4FU, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(35, 17, 0xD83DDEA3U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(36, 17, 0xD83DDEA3U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(37, 17, 0xD83DDEA3U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(38, 17, 0xD83DDEA3U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(39, 17, 0xD83DDEA3U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(31, 18, 0xD83DDEB4U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(32, 18, 0xD83DDEB4U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(33, 18, 0xD83DDEB4U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(34, 18, 0xD83DDEB4U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(35, 18, 0xD83DDEB4U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(37, 18, 0xD83DDEB5U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(38, 18, 0xD83DDEB5U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(39, 18, 0xD83DDEB5U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(0, 19, 0xD83DDEB5U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(1, 19, 0xD83DDEB5U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(34, 8, 0xD83DDEB6U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(35, 8, 0xD83DDEB6U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(36, 8, 0xD83DDEB6U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(37, 8, 0xD83DDEB6U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(38, 8, 0xD83DDEB6U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(13, 18, 0xD83DDEC0U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(14, 18, 0xD83DDEC0U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(15, 18, 0xD83DDEC0U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(16, 18, 0xD83DDEC0U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(17, 18, 0xD83DDEC0U, 0, 4, 0, 0xD83CDFFFU); + new (toFill++) EmojiData(8, 5, 0xD83EDD18U, 0, 4, 0, 0xD83CDFFBU); + new (toFill++) EmojiData(9, 5, 0xD83EDD18U, 0, 4, 0, 0xD83CDFFCU); + new (toFill++) EmojiData(10, 5, 0xD83EDD18U, 0, 4, 0, 0xD83CDFFDU); + new (toFill++) EmojiData(11, 5, 0xD83EDD18U, 0, 4, 0, 0xD83CDFFEU); + new (toFill++) EmojiData(12, 5, 0xD83EDD18U, 0, 4, 0, 0xD83CDFFFU); }; EmojiPtr emojiGet(uint32 code) { @@ -1255,867 +1679,1051 @@ EmojiPtr emojiGet(uint32 code) { case 0x21AAU: return &emojis[13]; case 0x231AU: return &emojis[14]; case 0x231BU: return &emojis[15]; - case 0x23E9U: return &emojis[16]; - case 0x23EAU: return &emojis[17]; - case 0x23EBU: return &emojis[18]; - case 0x23ECU: return &emojis[19]; - case 0x23F0U: return &emojis[20]; - case 0x23F3U: return &emojis[21]; - case 0x24C2U: return &emojis[22]; - case 0x25AAU: return &emojis[23]; - case 0x25ABU: return &emojis[24]; - case 0x25B6U: return &emojis[25]; - case 0x25C0U: return &emojis[26]; - case 0x25FBU: return &emojis[27]; - case 0x25FCU: return &emojis[28]; - case 0x25FDU: return &emojis[29]; - case 0x25FEU: return &emojis[30]; - case 0x2600U: return &emojis[31]; - case 0x2601U: return &emojis[32]; - case 0x260EU: return &emojis[33]; - case 0x2611U: return &emojis[34]; - case 0x2614U: return &emojis[35]; - case 0x2615U: return &emojis[36]; - case 0x261DU: return &emojis[37]; - case 0x263AU: return &emojis[38]; - case 0x2648U: return &emojis[39]; - case 0x2649U: return &emojis[40]; - case 0x264AU: return &emojis[41]; - case 0x264BU: return &emojis[42]; - case 0x264CU: return &emojis[43]; - case 0x264DU: return &emojis[44]; - case 0x264EU: return &emojis[45]; - case 0x264FU: return &emojis[46]; - case 0x2650U: return &emojis[47]; - case 0x2651U: return &emojis[48]; - case 0x2652U: return &emojis[49]; - case 0x2653U: return &emojis[50]; - case 0x2660U: return &emojis[51]; - case 0x2663U: return &emojis[52]; - case 0x2665U: return &emojis[53]; - case 0x2666U: return &emojis[54]; - case 0x2668U: return &emojis[55]; - case 0x267BU: return &emojis[56]; - case 0x267FU: return &emojis[57]; - case 0x2693U: return &emojis[58]; - case 0x26A0U: return &emojis[59]; - case 0x26A1U: return &emojis[60]; - case 0x26AAU: return &emojis[61]; - case 0x26ABU: return &emojis[62]; - case 0x26BDU: return &emojis[63]; - case 0x26BEU: return &emojis[64]; - case 0x26C4U: return &emojis[65]; - case 0x26C5U: return &emojis[66]; - case 0x26CEU: return &emojis[67]; - case 0x26D4U: return &emojis[68]; - case 0x26EAU: return &emojis[69]; - case 0x26F2U: return &emojis[70]; - case 0x26F3U: return &emojis[71]; - case 0x26F5U: return &emojis[72]; - case 0x26FAU: return &emojis[73]; - case 0x26FDU: return &emojis[74]; - case 0x2702U: return &emojis[75]; - case 0x2705U: return &emojis[76]; - case 0x2708U: return &emojis[77]; - case 0x2709U: return &emojis[78]; - case 0x270AU: return &emojis[79]; - case 0x270BU: return &emojis[80]; - case 0x270CU: return &emojis[81]; - case 0x270FU: return &emojis[82]; - case 0x2712U: return &emojis[83]; - case 0x2714U: return &emojis[84]; - case 0x2716U: return &emojis[85]; - case 0x2728U: return &emojis[86]; - case 0x2733U: return &emojis[87]; - case 0x2734U: return &emojis[88]; - case 0x2744U: return &emojis[89]; - case 0x2747U: return &emojis[90]; - case 0x274CU: return &emojis[91]; - case 0x274EU: return &emojis[92]; - case 0x2753U: return &emojis[93]; - case 0x2754U: return &emojis[94]; - case 0x2755U: return &emojis[95]; - case 0x2757U: return &emojis[96]; - case 0x2764U: return &emojis[97]; - case 0x2795U: return &emojis[98]; - case 0x2796U: return &emojis[99]; - case 0x2797U: return &emojis[100]; - case 0x27A1U: return &emojis[101]; - case 0x27B0U: return &emojis[102]; - case 0x27BFU: return &emojis[103]; - case 0x2934U: return &emojis[104]; - case 0x2935U: return &emojis[105]; - case 0x2B05U: return &emojis[106]; - case 0x2B06U: return &emojis[107]; - case 0x2B07U: return &emojis[108]; - case 0x2B1BU: return &emojis[109]; - case 0x2B1CU: return &emojis[110]; - case 0x2B50U: return &emojis[111]; - case 0x2B55U: return &emojis[112]; - case 0x3030U: return &emojis[113]; - case 0x303DU: return &emojis[114]; - case 0x3297U: return &emojis[115]; - case 0x3299U: return &emojis[116]; + case 0x2328U: return &emojis[16]; + case 0x23E9U: return &emojis[17]; + case 0x23EAU: return &emojis[18]; + case 0x23EBU: return &emojis[19]; + case 0x23ECU: return &emojis[20]; + case 0x23EDU: return &emojis[21]; + case 0x23EEU: return &emojis[22]; + case 0x23EFU: return &emojis[23]; + case 0x23F0U: return &emojis[24]; + case 0x23F1U: return &emojis[25]; + case 0x23F2U: return &emojis[26]; + case 0x23F3U: return &emojis[27]; + case 0x23F8U: return &emojis[28]; + case 0x23F9U: return &emojis[29]; + case 0x23FAU: return &emojis[30]; + case 0x24C2U: return &emojis[31]; + case 0x25AAU: return &emojis[32]; + case 0x25ABU: return &emojis[33]; + case 0x25B6U: return &emojis[34]; + case 0x25C0U: return &emojis[35]; + case 0x25FBU: return &emojis[36]; + case 0x25FCU: return &emojis[37]; + case 0x25FDU: return &emojis[38]; + case 0x25FEU: return &emojis[39]; + case 0x2600U: return &emojis[40]; + case 0x2601U: return &emojis[41]; + case 0x2602U: return &emojis[42]; + case 0x2603U: return &emojis[43]; + case 0x2604U: return &emojis[44]; + case 0x260EU: return &emojis[45]; + case 0x2611U: return &emojis[46]; + case 0x2614U: return &emojis[47]; + case 0x2615U: return &emojis[48]; + case 0x2618U: return &emojis[49]; + case 0x261DU: return &emojis[50]; + case 0x2620U: return &emojis[51]; + case 0x2622U: return &emojis[52]; + case 0x2623U: return &emojis[53]; + case 0x2626U: return &emojis[54]; + case 0x262AU: return &emojis[55]; + case 0x262EU: return &emojis[56]; + case 0x262FU: return &emojis[57]; + case 0x2638U: return &emojis[58]; + case 0x2639U: return &emojis[59]; + case 0x263AU: return &emojis[60]; + case 0x2648U: return &emojis[61]; + case 0x2649U: return &emojis[62]; + case 0x264AU: return &emojis[63]; + case 0x264BU: return &emojis[64]; + case 0x264CU: return &emojis[65]; + case 0x264DU: return &emojis[66]; + case 0x264EU: return &emojis[67]; + case 0x264FU: return &emojis[68]; + case 0x2650U: return &emojis[69]; + case 0x2651U: return &emojis[70]; + case 0x2652U: return &emojis[71]; + case 0x2653U: return &emojis[72]; + case 0x2660U: return &emojis[73]; + case 0x2663U: return &emojis[74]; + case 0x2665U: return &emojis[75]; + case 0x2666U: return &emojis[76]; + case 0x2668U: return &emojis[77]; + case 0x267BU: return &emojis[78]; + case 0x267FU: return &emojis[79]; + case 0x2692U: return &emojis[80]; + case 0x2693U: return &emojis[81]; + case 0x2694U: return &emojis[82]; + case 0x2696U: return &emojis[83]; + case 0x2697U: return &emojis[84]; + case 0x2699U: return &emojis[85]; + case 0x269BU: return &emojis[86]; + case 0x269CU: return &emojis[87]; + case 0x26A0U: return &emojis[88]; + case 0x26A1U: return &emojis[89]; + case 0x26AAU: return &emojis[90]; + case 0x26ABU: return &emojis[91]; + case 0x26B0U: return &emojis[92]; + case 0x26B1U: return &emojis[93]; + case 0x26BDU: return &emojis[94]; + case 0x26BEU: return &emojis[95]; + case 0x26C4U: return &emojis[96]; + case 0x26C5U: return &emojis[97]; + case 0x26C8U: return &emojis[98]; + case 0x26CEU: return &emojis[99]; + case 0x26CFU: return &emojis[100]; + case 0x26D1U: return &emojis[101]; + case 0x26D3U: return &emojis[102]; + case 0x26D4U: return &emojis[103]; + case 0x26E9U: return &emojis[104]; + case 0x26EAU: return &emojis[105]; + case 0x26F0U: return &emojis[106]; + case 0x26F1U: return &emojis[107]; + case 0x26F2U: return &emojis[108]; + case 0x26F3U: return &emojis[109]; + case 0x26F4U: return &emojis[110]; + case 0x26F5U: return &emojis[111]; + case 0x26F7U: return &emojis[112]; + case 0x26F8U: return &emojis[113]; + case 0x26F9U: return &emojis[114]; + case 0x26FAU: return &emojis[115]; + case 0x26FDU: return &emojis[116]; + case 0x2702U: return &emojis[117]; + case 0x2705U: return &emojis[118]; + case 0x2708U: return &emojis[119]; + case 0x2709U: return &emojis[120]; + case 0x270AU: return &emojis[121]; + case 0x270BU: return &emojis[122]; + case 0x270CU: return &emojis[123]; + case 0x270DU: return &emojis[124]; + case 0x270FU: return &emojis[125]; + case 0x2712U: return &emojis[126]; + case 0x2714U: return &emojis[127]; + case 0x2716U: return &emojis[128]; + case 0x271DU: return &emojis[129]; + case 0x2721U: return &emojis[130]; + case 0x2728U: return &emojis[131]; + case 0x2733U: return &emojis[132]; + case 0x2734U: return &emojis[133]; + case 0x2744U: return &emojis[134]; + case 0x2747U: return &emojis[135]; + case 0x274CU: return &emojis[136]; + case 0x274EU: return &emojis[137]; + case 0x2753U: return &emojis[138]; + case 0x2754U: return &emojis[139]; + case 0x2755U: return &emojis[140]; + case 0x2757U: return &emojis[141]; + case 0x2763U: return &emojis[142]; + case 0x2764U: return &emojis[143]; + case 0x2795U: return &emojis[144]; + case 0x2796U: return &emojis[145]; + case 0x2797U: return &emojis[146]; + case 0x27A1U: return &emojis[147]; + case 0x27B0U: return &emojis[148]; + case 0x27BFU: return &emojis[149]; + case 0x2934U: return &emojis[150]; + case 0x2935U: return &emojis[151]; + case 0x2B05U: return &emojis[152]; + case 0x2B06U: return &emojis[153]; + case 0x2B07U: return &emojis[154]; + case 0x2B1BU: return &emojis[155]; + case 0x2B1CU: return &emojis[156]; + case 0x2B50U: return &emojis[157]; + case 0x2B55U: return &emojis[158]; + case 0x3030U: return &emojis[159]; + case 0x303DU: return &emojis[160]; + case 0x3297U: return &emojis[161]; + case 0x3299U: return &emojis[162]; } return 0; } - if (highCode == 35 || (highCode >= 48 && highCode < 58)) { + if (highCode == 0x23 || highCode == 0x2A || (highCode >= 0x30 && highCode < 0x3A)) { if ((code & 0xFFFFU) != 0x20E3U) return 0; switch (code) { - case 0x2320E3U: return &emojis[117]; - case 0x3020E3U: return &emojis[118]; - case 0x3120E3U: return &emojis[119]; - case 0x3220E3U: return &emojis[120]; - case 0x3320E3U: return &emojis[121]; - case 0x3420E3U: return &emojis[122]; - case 0x3520E3U: return &emojis[123]; - case 0x3620E3U: return &emojis[124]; - case 0x3720E3U: return &emojis[125]; - case 0x3820E3U: return &emojis[126]; - case 0x3920E3U: return &emojis[127]; + case 0x2320E3U: return &emojis[163]; + case 0x2A20E3U: return &emojis[164]; + case 0x3020E3U: return &emojis[165]; + case 0x3120E3U: return &emojis[166]; + case 0x3220E3U: return &emojis[167]; + case 0x3320E3U: return &emojis[168]; + case 0x3420E3U: return &emojis[169]; + case 0x3520E3U: return &emojis[170]; + case 0x3620E3U: return &emojis[171]; + case 0x3720E3U: return &emojis[172]; + case 0x3820E3U: return &emojis[173]; + case 0x3920E3U: return &emojis[174]; } return 0; } if (highCode == 0xFFFFU) { - static const int sequenceOffset = 835; + static const int sequenceOffset = 1018; uint32 index = (code & 0xFFFFU); - return (index < 18) ? &emojis[sequenceOffset + index] : 0; + return (index < 19) ? &emojis[sequenceOffset + index] : 0; } - if (code < 0xD83CDC04U || code > 0xD83DDEC5U) return 0; + if (code < 0xD83CDC04U || code > 0xD83EDDC0U) return 0; switch (code) { - case 0xD83CDC04U: return &emojis[128]; - case 0xD83CDCCFU: return &emojis[129]; - case 0xD83CDD70U: return &emojis[130]; - case 0xD83CDD71U: return &emojis[131]; - case 0xD83CDD7EU: return &emojis[132]; - case 0xD83CDD7FU: return &emojis[133]; - case 0xD83CDD8EU: return &emojis[134]; - case 0xD83CDD91U: return &emojis[135]; - case 0xD83CDD92U: return &emojis[136]; - case 0xD83CDD93U: return &emojis[137]; - case 0xD83CDD94U: return &emojis[138]; - case 0xD83CDD95U: return &emojis[139]; - case 0xD83CDD96U: return &emojis[140]; - case 0xD83CDD97U: return &emojis[141]; - case 0xD83CDD98U: return &emojis[142]; - case 0xD83CDD99U: return &emojis[143]; - case 0xD83CDD9AU: return &emojis[144]; - case 0xD83CDE01U: return &emojis[145]; - case 0xD83CDE02U: return &emojis[146]; - case 0xD83CDE1AU: return &emojis[147]; - case 0xD83CDE2FU: return &emojis[148]; - case 0xD83CDE32U: return &emojis[149]; - case 0xD83CDE33U: return &emojis[150]; - case 0xD83CDE34U: return &emojis[151]; - case 0xD83CDE35U: return &emojis[152]; - case 0xD83CDE36U: return &emojis[153]; - case 0xD83CDE37U: return &emojis[154]; - case 0xD83CDE38U: return &emojis[155]; - case 0xD83CDE39U: return &emojis[156]; - case 0xD83CDE3AU: return &emojis[157]; - case 0xD83CDE50U: return &emojis[158]; - case 0xD83CDE51U: return &emojis[159]; - case 0xD83CDF00U: return &emojis[160]; - case 0xD83CDF01U: return &emojis[161]; - case 0xD83CDF02U: return &emojis[162]; - case 0xD83CDF03U: return &emojis[163]; - case 0xD83CDF04U: return &emojis[164]; - case 0xD83CDF05U: return &emojis[165]; - case 0xD83CDF06U: return &emojis[166]; - case 0xD83CDF07U: return &emojis[167]; - case 0xD83CDF08U: return &emojis[168]; - case 0xD83CDF09U: return &emojis[169]; - case 0xD83CDF0AU: return &emojis[170]; - case 0xD83CDF0BU: return &emojis[171]; - case 0xD83CDF0CU: return &emojis[172]; - case 0xD83CDF0DU: return &emojis[173]; - case 0xD83CDF0EU: return &emojis[174]; - case 0xD83CDF0FU: return &emojis[175]; - case 0xD83CDF10U: return &emojis[176]; - case 0xD83CDF11U: return &emojis[177]; - case 0xD83CDF12U: return &emojis[178]; - case 0xD83CDF13U: return &emojis[179]; - case 0xD83CDF14U: return &emojis[180]; - case 0xD83CDF15U: return &emojis[181]; - case 0xD83CDF16U: return &emojis[182]; - case 0xD83CDF17U: return &emojis[183]; - case 0xD83CDF18U: return &emojis[184]; - case 0xD83CDF19U: return &emojis[185]; - case 0xD83CDF1AU: return &emojis[186]; - case 0xD83CDF1BU: return &emojis[187]; - case 0xD83CDF1CU: return &emojis[188]; - case 0xD83CDF1DU: return &emojis[189]; - case 0xD83CDF1EU: return &emojis[190]; - case 0xD83CDF1FU: return &emojis[191]; - case 0xD83CDF20U: return &emojis[192]; - case 0xD83CDF30U: return &emojis[193]; - case 0xD83CDF31U: return &emojis[194]; - case 0xD83CDF32U: return &emojis[195]; - case 0xD83CDF33U: return &emojis[196]; - case 0xD83CDF34U: return &emojis[197]; - case 0xD83CDF35U: return &emojis[198]; - case 0xD83CDF37U: return &emojis[199]; - case 0xD83CDF38U: return &emojis[200]; - case 0xD83CDF39U: return &emojis[201]; - case 0xD83CDF3AU: return &emojis[202]; - case 0xD83CDF3BU: return &emojis[203]; - case 0xD83CDF3CU: return &emojis[204]; - case 0xD83CDF3DU: return &emojis[205]; - case 0xD83CDF3EU: return &emojis[206]; - case 0xD83CDF3FU: return &emojis[207]; - case 0xD83CDF40U: return &emojis[208]; - case 0xD83CDF41U: return &emojis[209]; - case 0xD83CDF42U: return &emojis[210]; - case 0xD83CDF43U: return &emojis[211]; - case 0xD83CDF44U: return &emojis[212]; - case 0xD83CDF45U: return &emojis[213]; - case 0xD83CDF46U: return &emojis[214]; - case 0xD83CDF47U: return &emojis[215]; - case 0xD83CDF48U: return &emojis[216]; - case 0xD83CDF49U: return &emojis[217]; - case 0xD83CDF4AU: return &emojis[218]; - case 0xD83CDF4BU: return &emojis[219]; - case 0xD83CDF4CU: return &emojis[220]; - case 0xD83CDF4DU: return &emojis[221]; - case 0xD83CDF4EU: return &emojis[222]; - case 0xD83CDF4FU: return &emojis[223]; - case 0xD83CDF50U: return &emojis[224]; - case 0xD83CDF51U: return &emojis[225]; - case 0xD83CDF52U: return &emojis[226]; - case 0xD83CDF53U: return &emojis[227]; - case 0xD83CDF54U: return &emojis[228]; - case 0xD83CDF55U: return &emojis[229]; - case 0xD83CDF56U: return &emojis[230]; - case 0xD83CDF57U: return &emojis[231]; - case 0xD83CDF58U: return &emojis[232]; - case 0xD83CDF59U: return &emojis[233]; - case 0xD83CDF5AU: return &emojis[234]; - case 0xD83CDF5BU: return &emojis[235]; - case 0xD83CDF5CU: return &emojis[236]; - case 0xD83CDF5DU: return &emojis[237]; - case 0xD83CDF5EU: return &emojis[238]; - case 0xD83CDF5FU: return &emojis[239]; - case 0xD83CDF60U: return &emojis[240]; - case 0xD83CDF61U: return &emojis[241]; - case 0xD83CDF62U: return &emojis[242]; - case 0xD83CDF63U: return &emojis[243]; - case 0xD83CDF64U: return &emojis[244]; - case 0xD83CDF65U: return &emojis[245]; - case 0xD83CDF66U: return &emojis[246]; - case 0xD83CDF67U: return &emojis[247]; - case 0xD83CDF68U: return &emojis[248]; - case 0xD83CDF69U: return &emojis[249]; - case 0xD83CDF6AU: return &emojis[250]; - case 0xD83CDF6BU: return &emojis[251]; - case 0xD83CDF6CU: return &emojis[252]; - case 0xD83CDF6DU: return &emojis[253]; - case 0xD83CDF6EU: return &emojis[254]; - case 0xD83CDF6FU: return &emojis[255]; - case 0xD83CDF70U: return &emojis[256]; - case 0xD83CDF71U: return &emojis[257]; - case 0xD83CDF72U: return &emojis[258]; - case 0xD83CDF73U: return &emojis[259]; - case 0xD83CDF74U: return &emojis[260]; - case 0xD83CDF75U: return &emojis[261]; - case 0xD83CDF76U: return &emojis[262]; - case 0xD83CDF77U: return &emojis[263]; - case 0xD83CDF78U: return &emojis[264]; - case 0xD83CDF79U: return &emojis[265]; - case 0xD83CDF7AU: return &emojis[266]; - case 0xD83CDF7BU: return &emojis[267]; - case 0xD83CDF7CU: return &emojis[268]; - case 0xD83CDF80U: return &emojis[269]; - case 0xD83CDF81U: return &emojis[270]; - case 0xD83CDF82U: return &emojis[271]; - case 0xD83CDF83U: return &emojis[272]; - case 0xD83CDF84U: return &emojis[273]; - case 0xD83CDF85U: return &emojis[274]; - case 0xD83CDF86U: return &emojis[275]; - case 0xD83CDF87U: return &emojis[276]; - case 0xD83CDF88U: return &emojis[277]; - case 0xD83CDF89U: return &emojis[278]; - case 0xD83CDF8AU: return &emojis[279]; - case 0xD83CDF8BU: return &emojis[280]; - case 0xD83CDF8CU: return &emojis[281]; - case 0xD83CDF8DU: return &emojis[282]; - case 0xD83CDF8EU: return &emojis[283]; - case 0xD83CDF8FU: return &emojis[284]; - case 0xD83CDF90U: return &emojis[285]; - case 0xD83CDF91U: return &emojis[286]; - case 0xD83CDF92U: return &emojis[287]; - case 0xD83CDF93U: return &emojis[288]; - case 0xD83CDFA0U: return &emojis[289]; - case 0xD83CDFA1U: return &emojis[290]; - case 0xD83CDFA2U: return &emojis[291]; - case 0xD83CDFA3U: return &emojis[292]; - case 0xD83CDFA4U: return &emojis[293]; - case 0xD83CDFA5U: return &emojis[294]; - case 0xD83CDFA6U: return &emojis[295]; - case 0xD83CDFA7U: return &emojis[296]; - case 0xD83CDFA8U: return &emojis[297]; - case 0xD83CDFA9U: return &emojis[298]; - case 0xD83CDFAAU: return &emojis[299]; - case 0xD83CDFABU: return &emojis[300]; - case 0xD83CDFACU: return &emojis[301]; - case 0xD83CDFADU: return &emojis[302]; - case 0xD83CDFAEU: return &emojis[303]; - case 0xD83CDFAFU: return &emojis[304]; - case 0xD83CDFB0U: return &emojis[305]; - case 0xD83CDFB1U: return &emojis[306]; - case 0xD83CDFB2U: return &emojis[307]; - case 0xD83CDFB3U: return &emojis[308]; - case 0xD83CDFB4U: return &emojis[309]; - case 0xD83CDFB5U: return &emojis[310]; - case 0xD83CDFB6U: return &emojis[311]; - case 0xD83CDFB7U: return &emojis[312]; - case 0xD83CDFB8U: return &emojis[313]; - case 0xD83CDFB9U: return &emojis[314]; - case 0xD83CDFBAU: return &emojis[315]; - case 0xD83CDFBBU: return &emojis[316]; - case 0xD83CDFBCU: return &emojis[317]; - case 0xD83CDFBDU: return &emojis[318]; - case 0xD83CDFBEU: return &emojis[319]; - case 0xD83CDFBFU: return &emojis[320]; - case 0xD83CDFC0U: return &emojis[321]; - case 0xD83CDFC1U: return &emojis[322]; - case 0xD83CDFC2U: return &emojis[323]; - case 0xD83CDFC3U: return &emojis[324]; - case 0xD83CDFC4U: return &emojis[325]; - case 0xD83CDFC6U: return &emojis[326]; - case 0xD83CDFC7U: return &emojis[327]; - case 0xD83CDFC8U: return &emojis[328]; - case 0xD83CDFC9U: return &emojis[329]; - case 0xD83CDFCAU: return &emojis[330]; - case 0xD83CDFE0U: return &emojis[331]; - case 0xD83CDFE1U: return &emojis[332]; - case 0xD83CDFE2U: return &emojis[333]; - case 0xD83CDFE3U: return &emojis[334]; - case 0xD83CDFE4U: return &emojis[335]; - case 0xD83CDFE5U: return &emojis[336]; - case 0xD83CDFE6U: return &emojis[337]; - case 0xD83CDFE7U: return &emojis[338]; - case 0xD83CDFE8U: return &emojis[339]; - case 0xD83CDFE9U: return &emojis[340]; - case 0xD83CDFEAU: return &emojis[341]; - case 0xD83CDFEBU: return &emojis[342]; - case 0xD83CDFECU: return &emojis[343]; - case 0xD83CDFEDU: return &emojis[344]; - case 0xD83CDFEEU: return &emojis[345]; - case 0xD83CDFEFU: return &emojis[346]; - case 0xD83CDFF0U: return &emojis[347]; - case 0xD83DDC00U: return &emojis[348]; - case 0xD83DDC01U: return &emojis[349]; - case 0xD83DDC02U: return &emojis[350]; - case 0xD83DDC03U: return &emojis[351]; - case 0xD83DDC04U: return &emojis[352]; - case 0xD83DDC05U: return &emojis[353]; - case 0xD83DDC06U: return &emojis[354]; - case 0xD83DDC07U: return &emojis[355]; - case 0xD83DDC08U: return &emojis[356]; - case 0xD83DDC09U: return &emojis[357]; - case 0xD83DDC0AU: return &emojis[358]; - case 0xD83DDC0BU: return &emojis[359]; - case 0xD83DDC0CU: return &emojis[360]; - case 0xD83DDC0DU: return &emojis[361]; - case 0xD83DDC0EU: return &emojis[362]; - case 0xD83DDC0FU: return &emojis[363]; - case 0xD83DDC10U: return &emojis[364]; - case 0xD83DDC11U: return &emojis[365]; - case 0xD83DDC12U: return &emojis[366]; - case 0xD83DDC13U: return &emojis[367]; - case 0xD83DDC14U: return &emojis[368]; - case 0xD83DDC15U: return &emojis[369]; - case 0xD83DDC16U: return &emojis[370]; - case 0xD83DDC17U: return &emojis[371]; - case 0xD83DDC18U: return &emojis[372]; - case 0xD83DDC19U: return &emojis[373]; - case 0xD83DDC1AU: return &emojis[374]; - case 0xD83DDC1BU: return &emojis[375]; - case 0xD83DDC1CU: return &emojis[376]; - case 0xD83DDC1DU: return &emojis[377]; - case 0xD83DDC1EU: return &emojis[378]; - case 0xD83DDC1FU: return &emojis[379]; - case 0xD83DDC20U: return &emojis[380]; - case 0xD83DDC21U: return &emojis[381]; - case 0xD83DDC22U: return &emojis[382]; - case 0xD83DDC23U: return &emojis[383]; - case 0xD83DDC24U: return &emojis[384]; - case 0xD83DDC25U: return &emojis[385]; - case 0xD83DDC26U: return &emojis[386]; - case 0xD83DDC27U: return &emojis[387]; - case 0xD83DDC28U: return &emojis[388]; - case 0xD83DDC29U: return &emojis[389]; - case 0xD83DDC2AU: return &emojis[390]; - case 0xD83DDC2BU: return &emojis[391]; - case 0xD83DDC2CU: return &emojis[392]; - case 0xD83DDC2DU: return &emojis[393]; - case 0xD83DDC2EU: return &emojis[394]; - case 0xD83DDC2FU: return &emojis[395]; - case 0xD83DDC30U: return &emojis[396]; - case 0xD83DDC31U: return &emojis[397]; - case 0xD83DDC32U: return &emojis[398]; - case 0xD83DDC33U: return &emojis[399]; - case 0xD83DDC34U: return &emojis[400]; - case 0xD83DDC35U: return &emojis[401]; - case 0xD83DDC36U: return &emojis[402]; - case 0xD83DDC37U: return &emojis[403]; - case 0xD83DDC38U: return &emojis[404]; - case 0xD83DDC39U: return &emojis[405]; - case 0xD83DDC3AU: return &emojis[406]; - case 0xD83DDC3BU: return &emojis[407]; - case 0xD83DDC3CU: return &emojis[408]; - case 0xD83DDC3DU: return &emojis[409]; - case 0xD83DDC3EU: return &emojis[410]; - case 0xD83DDC40U: return &emojis[411]; - case 0xD83DDC42U: return &emojis[412]; - case 0xD83DDC43U: return &emojis[413]; - case 0xD83DDC44U: return &emojis[414]; - case 0xD83DDC45U: return &emojis[415]; - case 0xD83DDC46U: return &emojis[416]; - case 0xD83DDC47U: return &emojis[417]; - case 0xD83DDC48U: return &emojis[418]; - case 0xD83DDC49U: return &emojis[419]; - case 0xD83DDC4AU: return &emojis[420]; - case 0xD83DDC4BU: return &emojis[421]; - case 0xD83DDC4CU: return &emojis[422]; - case 0xD83DDC4DU: return &emojis[423]; - case 0xD83DDC4EU: return &emojis[424]; - case 0xD83DDC4FU: return &emojis[425]; - case 0xD83DDC50U: return &emojis[426]; - case 0xD83DDC51U: return &emojis[427]; - case 0xD83DDC52U: return &emojis[428]; - case 0xD83DDC53U: return &emojis[429]; - case 0xD83DDC54U: return &emojis[430]; - case 0xD83DDC55U: return &emojis[431]; - case 0xD83DDC56U: return &emojis[432]; - case 0xD83DDC57U: return &emojis[433]; - case 0xD83DDC58U: return &emojis[434]; - case 0xD83DDC59U: return &emojis[435]; - case 0xD83DDC5AU: return &emojis[436]; - case 0xD83DDC5BU: return &emojis[437]; - case 0xD83DDC5CU: return &emojis[438]; - case 0xD83DDC5DU: return &emojis[439]; - case 0xD83DDC5EU: return &emojis[440]; - case 0xD83DDC5FU: return &emojis[441]; - case 0xD83DDC60U: return &emojis[442]; - case 0xD83DDC61U: return &emojis[443]; - case 0xD83DDC62U: return &emojis[444]; - case 0xD83DDC63U: return &emojis[445]; - case 0xD83DDC64U: return &emojis[446]; - case 0xD83DDC65U: return &emojis[447]; - case 0xD83DDC66U: return &emojis[448]; - case 0xD83DDC67U: return &emojis[449]; - case 0xD83DDC68U: return &emojis[450]; - case 0xD83DDC69U: return &emojis[451]; - case 0xD83DDC6AU: return &emojis[452]; - case 0xD83DDC6BU: return &emojis[453]; - case 0xD83DDC6CU: return &emojis[454]; - case 0xD83DDC6DU: return &emojis[455]; - case 0xD83DDC6EU: return &emojis[456]; - case 0xD83DDC6FU: return &emojis[457]; - case 0xD83DDC70U: return &emojis[458]; - case 0xD83DDC71U: return &emojis[459]; - case 0xD83DDC72U: return &emojis[460]; - case 0xD83DDC73U: return &emojis[461]; - case 0xD83DDC74U: return &emojis[462]; - case 0xD83DDC75U: return &emojis[463]; - case 0xD83DDC76U: return &emojis[464]; - case 0xD83DDC77U: return &emojis[465]; - case 0xD83DDC78U: return &emojis[466]; - case 0xD83DDC79U: return &emojis[467]; - case 0xD83DDC7AU: return &emojis[468]; - case 0xD83DDC7BU: return &emojis[469]; - case 0xD83DDC7CU: return &emojis[470]; - case 0xD83DDC7DU: return &emojis[471]; - case 0xD83DDC7EU: return &emojis[472]; - case 0xD83DDC7FU: return &emojis[473]; - case 0xD83DDC80U: return &emojis[474]; - case 0xD83DDC81U: return &emojis[475]; - case 0xD83DDC82U: return &emojis[476]; - case 0xD83DDC83U: return &emojis[477]; - case 0xD83DDC84U: return &emojis[478]; - case 0xD83DDC85U: return &emojis[479]; - case 0xD83DDC86U: return &emojis[480]; - case 0xD83DDC87U: return &emojis[481]; - case 0xD83DDC88U: return &emojis[482]; - case 0xD83DDC89U: return &emojis[483]; - case 0xD83DDC8AU: return &emojis[484]; - case 0xD83DDC8BU: return &emojis[485]; - case 0xD83DDC8CU: return &emojis[486]; - case 0xD83DDC8DU: return &emojis[487]; - case 0xD83DDC8EU: return &emojis[488]; - case 0xD83DDC8FU: return &emojis[489]; - case 0xD83DDC90U: return &emojis[490]; - case 0xD83DDC91U: return &emojis[491]; - case 0xD83DDC92U: return &emojis[492]; - case 0xD83DDC93U: return &emojis[493]; - case 0xD83DDC94U: return &emojis[494]; - case 0xD83DDC95U: return &emojis[495]; - case 0xD83DDC96U: return &emojis[496]; - case 0xD83DDC97U: return &emojis[497]; - case 0xD83DDC98U: return &emojis[498]; - case 0xD83DDC99U: return &emojis[499]; - case 0xD83DDC9AU: return &emojis[500]; - case 0xD83DDC9BU: return &emojis[501]; - case 0xD83DDC9CU: return &emojis[502]; - case 0xD83DDC9DU: return &emojis[503]; - case 0xD83DDC9EU: return &emojis[504]; - case 0xD83DDC9FU: return &emojis[505]; - case 0xD83DDCA0U: return &emojis[506]; - case 0xD83DDCA1U: return &emojis[507]; - case 0xD83DDCA2U: return &emojis[508]; - case 0xD83DDCA3U: return &emojis[509]; - case 0xD83DDCA4U: return &emojis[510]; - case 0xD83DDCA5U: return &emojis[511]; - case 0xD83DDCA6U: return &emojis[512]; - case 0xD83DDCA7U: return &emojis[513]; - case 0xD83DDCA8U: return &emojis[514]; - case 0xD83DDCA9U: return &emojis[515]; - case 0xD83DDCAAU: return &emojis[516]; - case 0xD83DDCABU: return &emojis[517]; - case 0xD83DDCACU: return &emojis[518]; - case 0xD83DDCADU: return &emojis[519]; - case 0xD83DDCAEU: return &emojis[520]; - case 0xD83DDCAFU: return &emojis[521]; - case 0xD83DDCB0U: return &emojis[522]; - case 0xD83DDCB1U: return &emojis[523]; - case 0xD83DDCB2U: return &emojis[524]; - case 0xD83DDCB3U: return &emojis[525]; - case 0xD83DDCB4U: return &emojis[526]; - case 0xD83DDCB5U: return &emojis[527]; - case 0xD83DDCB6U: return &emojis[528]; - case 0xD83DDCB7U: return &emojis[529]; - case 0xD83DDCB8U: return &emojis[530]; - case 0xD83DDCB9U: return &emojis[531]; - case 0xD83DDCBAU: return &emojis[532]; - case 0xD83DDCBBU: return &emojis[533]; - case 0xD83DDCBCU: return &emojis[534]; - case 0xD83DDCBDU: return &emojis[535]; - case 0xD83DDCBEU: return &emojis[536]; - case 0xD83DDCBFU: return &emojis[537]; - case 0xD83DDCC0U: return &emojis[538]; - case 0xD83DDCC1U: return &emojis[539]; - case 0xD83DDCC2U: return &emojis[540]; - case 0xD83DDCC3U: return &emojis[541]; - case 0xD83DDCC4U: return &emojis[542]; - case 0xD83DDCC5U: return &emojis[543]; - case 0xD83DDCC6U: return &emojis[544]; - case 0xD83DDCC7U: return &emojis[545]; - case 0xD83DDCC8U: return &emojis[546]; - case 0xD83DDCC9U: return &emojis[547]; - case 0xD83DDCCAU: return &emojis[548]; - case 0xD83DDCCBU: return &emojis[549]; - case 0xD83DDCCCU: return &emojis[550]; - case 0xD83DDCCDU: return &emojis[551]; - case 0xD83DDCCEU: return &emojis[552]; - case 0xD83DDCCFU: return &emojis[553]; - case 0xD83DDCD0U: return &emojis[554]; - case 0xD83DDCD1U: return &emojis[555]; - case 0xD83DDCD2U: return &emojis[556]; - case 0xD83DDCD3U: return &emojis[557]; - case 0xD83DDCD4U: return &emojis[558]; - case 0xD83DDCD5U: return &emojis[559]; - case 0xD83DDCD6U: return &emojis[560]; - case 0xD83DDCD7U: return &emojis[561]; - case 0xD83DDCD8U: return &emojis[562]; - case 0xD83DDCD9U: return &emojis[563]; - case 0xD83DDCDAU: return &emojis[564]; - case 0xD83DDCDBU: return &emojis[565]; - case 0xD83DDCDCU: return &emojis[566]; - case 0xD83DDCDDU: return &emojis[567]; - case 0xD83DDCDEU: return &emojis[568]; - case 0xD83DDCDFU: return &emojis[569]; - case 0xD83DDCE0U: return &emojis[570]; - case 0xD83DDCE1U: return &emojis[571]; - case 0xD83DDCE2U: return &emojis[572]; - case 0xD83DDCE3U: return &emojis[573]; - case 0xD83DDCE4U: return &emojis[574]; - case 0xD83DDCE5U: return &emojis[575]; - case 0xD83DDCE6U: return &emojis[576]; - case 0xD83DDCE7U: return &emojis[577]; - case 0xD83DDCE8U: return &emojis[578]; - case 0xD83DDCE9U: return &emojis[579]; - case 0xD83DDCEAU: return &emojis[580]; - case 0xD83DDCEBU: return &emojis[581]; - case 0xD83DDCECU: return &emojis[582]; - case 0xD83DDCEDU: return &emojis[583]; - case 0xD83DDCEEU: return &emojis[584]; - case 0xD83DDCEFU: return &emojis[585]; - case 0xD83DDCF0U: return &emojis[586]; - case 0xD83DDCF1U: return &emojis[587]; - case 0xD83DDCF2U: return &emojis[588]; - case 0xD83DDCF3U: return &emojis[589]; - case 0xD83DDCF4U: return &emojis[590]; - case 0xD83DDCF5U: return &emojis[591]; - case 0xD83DDCF6U: return &emojis[592]; - case 0xD83DDCF7U: return &emojis[593]; - case 0xD83DDCF9U: return &emojis[594]; - case 0xD83DDCFAU: return &emojis[595]; - case 0xD83DDCFBU: return &emojis[596]; - case 0xD83DDCFCU: return &emojis[597]; - case 0xD83DDD00U: return &emojis[598]; - case 0xD83DDD01U: return &emojis[599]; - case 0xD83DDD02U: return &emojis[600]; - case 0xD83DDD03U: return &emojis[601]; - case 0xD83DDD04U: return &emojis[602]; - case 0xD83DDD05U: return &emojis[603]; - case 0xD83DDD06U: return &emojis[604]; - case 0xD83DDD07U: return &emojis[605]; - case 0xD83DDD08U: return &emojis[606]; - case 0xD83DDD09U: return &emojis[607]; - case 0xD83DDD0AU: return &emojis[608]; - case 0xD83DDD0BU: return &emojis[609]; - case 0xD83DDD0CU: return &emojis[610]; - case 0xD83DDD0DU: return &emojis[611]; - case 0xD83DDD0EU: return &emojis[612]; - case 0xD83DDD0FU: return &emojis[613]; - case 0xD83DDD10U: return &emojis[614]; - case 0xD83DDD11U: return &emojis[615]; - case 0xD83DDD12U: return &emojis[616]; - case 0xD83DDD13U: return &emojis[617]; - case 0xD83DDD14U: return &emojis[618]; - case 0xD83DDD15U: return &emojis[619]; - case 0xD83DDD16U: return &emojis[620]; - case 0xD83DDD17U: return &emojis[621]; - case 0xD83DDD18U: return &emojis[622]; - case 0xD83DDD19U: return &emojis[623]; - case 0xD83DDD1AU: return &emojis[624]; - case 0xD83DDD1BU: return &emojis[625]; - case 0xD83DDD1CU: return &emojis[626]; - case 0xD83DDD1DU: return &emojis[627]; - case 0xD83DDD1EU: return &emojis[628]; - case 0xD83DDD1FU: return &emojis[629]; - case 0xD83DDD20U: return &emojis[630]; - case 0xD83DDD21U: return &emojis[631]; - case 0xD83DDD22U: return &emojis[632]; - case 0xD83DDD23U: return &emojis[633]; - case 0xD83DDD24U: return &emojis[634]; - case 0xD83DDD25U: return &emojis[635]; - case 0xD83DDD26U: return &emojis[636]; - case 0xD83DDD27U: return &emojis[637]; - case 0xD83DDD28U: return &emojis[638]; - case 0xD83DDD29U: return &emojis[639]; - case 0xD83DDD2AU: return &emojis[640]; - case 0xD83DDD2BU: return &emojis[641]; - case 0xD83DDD2CU: return &emojis[642]; - case 0xD83DDD2DU: return &emojis[643]; - case 0xD83DDD2EU: return &emojis[644]; - case 0xD83DDD2FU: return &emojis[645]; - case 0xD83DDD30U: return &emojis[646]; - case 0xD83DDD31U: return &emojis[647]; - case 0xD83DDD32U: return &emojis[648]; - case 0xD83DDD33U: return &emojis[649]; - case 0xD83DDD34U: return &emojis[650]; - case 0xD83DDD35U: return &emojis[651]; - case 0xD83DDD36U: return &emojis[652]; - case 0xD83DDD37U: return &emojis[653]; - case 0xD83DDD38U: return &emojis[654]; - case 0xD83DDD39U: return &emojis[655]; - case 0xD83DDD3AU: return &emojis[656]; - case 0xD83DDD3BU: return &emojis[657]; - case 0xD83DDD3CU: return &emojis[658]; - case 0xD83DDD3DU: return &emojis[659]; - case 0xD83DDD50U: return &emojis[660]; - case 0xD83DDD51U: return &emojis[661]; - case 0xD83DDD52U: return &emojis[662]; - case 0xD83DDD53U: return &emojis[663]; - case 0xD83DDD54U: return &emojis[664]; - case 0xD83DDD55U: return &emojis[665]; - case 0xD83DDD56U: return &emojis[666]; - case 0xD83DDD57U: return &emojis[667]; - case 0xD83DDD58U: return &emojis[668]; - case 0xD83DDD59U: return &emojis[669]; - case 0xD83DDD5AU: return &emojis[670]; - case 0xD83DDD5BU: return &emojis[671]; - case 0xD83DDD5CU: return &emojis[672]; - case 0xD83DDD5DU: return &emojis[673]; - case 0xD83DDD5EU: return &emojis[674]; - case 0xD83DDD5FU: return &emojis[675]; - case 0xD83DDD60U: return &emojis[676]; - case 0xD83DDD61U: return &emojis[677]; - case 0xD83DDD62U: return &emojis[678]; - case 0xD83DDD63U: return &emojis[679]; - case 0xD83DDD64U: return &emojis[680]; - case 0xD83DDD65U: return &emojis[681]; - case 0xD83DDD66U: return &emojis[682]; - case 0xD83DDD67U: return &emojis[683]; - case 0xD83DDDFBU: return &emojis[684]; - case 0xD83DDDFCU: return &emojis[685]; - case 0xD83DDDFDU: return &emojis[686]; - case 0xD83DDDFEU: return &emojis[687]; - case 0xD83DDDFFU: return &emojis[688]; - case 0xD83DDE00U: return &emojis[689]; - case 0xD83DDE01U: return &emojis[690]; - case 0xD83DDE02U: return &emojis[691]; - case 0xD83DDE03U: return &emojis[692]; - case 0xD83DDE04U: return &emojis[693]; - case 0xD83DDE05U: return &emojis[694]; - case 0xD83DDE06U: return &emojis[695]; - case 0xD83DDE07U: return &emojis[696]; - case 0xD83DDE08U: return &emojis[697]; - case 0xD83DDE09U: return &emojis[698]; - case 0xD83DDE0AU: return &emojis[699]; - case 0xD83DDE0BU: return &emojis[700]; - case 0xD83DDE0CU: return &emojis[701]; - case 0xD83DDE0DU: return &emojis[702]; - case 0xD83DDE0EU: return &emojis[703]; - case 0xD83DDE0FU: return &emojis[704]; - case 0xD83DDE10U: return &emojis[705]; - case 0xD83DDE11U: return &emojis[706]; - case 0xD83DDE12U: return &emojis[707]; - case 0xD83DDE13U: return &emojis[708]; - case 0xD83DDE14U: return &emojis[709]; - case 0xD83DDE15U: return &emojis[710]; - case 0xD83DDE16U: return &emojis[711]; - case 0xD83DDE17U: return &emojis[712]; - case 0xD83DDE18U: return &emojis[713]; - case 0xD83DDE19U: return &emojis[714]; - case 0xD83DDE1AU: return &emojis[715]; - case 0xD83DDE1BU: return &emojis[716]; - case 0xD83DDE1CU: return &emojis[717]; - case 0xD83DDE1DU: return &emojis[718]; - case 0xD83DDE1EU: return &emojis[719]; - case 0xD83DDE1FU: return &emojis[720]; - case 0xD83DDE20U: return &emojis[721]; - case 0xD83DDE21U: return &emojis[722]; - case 0xD83DDE22U: return &emojis[723]; - case 0xD83DDE23U: return &emojis[724]; - case 0xD83DDE24U: return &emojis[725]; - case 0xD83DDE25U: return &emojis[726]; - case 0xD83DDE26U: return &emojis[727]; - case 0xD83DDE27U: return &emojis[728]; - case 0xD83DDE28U: return &emojis[729]; - case 0xD83DDE29U: return &emojis[730]; - case 0xD83DDE2AU: return &emojis[731]; - case 0xD83DDE2BU: return &emojis[732]; - case 0xD83DDE2CU: return &emojis[733]; - case 0xD83DDE2DU: return &emojis[734]; - case 0xD83DDE2EU: return &emojis[735]; - case 0xD83DDE2FU: return &emojis[736]; - case 0xD83DDE30U: return &emojis[737]; - case 0xD83DDE31U: return &emojis[738]; - case 0xD83DDE32U: return &emojis[739]; - case 0xD83DDE33U: return &emojis[740]; - case 0xD83DDE34U: return &emojis[741]; - case 0xD83DDE35U: return &emojis[742]; - case 0xD83DDE36U: return &emojis[743]; - case 0xD83DDE37U: return &emojis[744]; - case 0xD83DDE38U: return &emojis[745]; - case 0xD83DDE39U: return &emojis[746]; - case 0xD83DDE3AU: return &emojis[747]; - case 0xD83DDE3BU: return &emojis[748]; - case 0xD83DDE3CU: return &emojis[749]; - case 0xD83DDE3DU: return &emojis[750]; - case 0xD83DDE3EU: return &emojis[751]; - case 0xD83DDE3FU: return &emojis[752]; - case 0xD83DDE40U: return &emojis[753]; - case 0xD83DDE45U: return &emojis[754]; - case 0xD83DDE46U: return &emojis[755]; - case 0xD83DDE47U: return &emojis[756]; - case 0xD83DDE48U: return &emojis[757]; - case 0xD83DDE49U: return &emojis[758]; - case 0xD83DDE4AU: return &emojis[759]; - case 0xD83DDE4BU: return &emojis[760]; - case 0xD83DDE4CU: return &emojis[761]; - case 0xD83DDE4DU: return &emojis[762]; - case 0xD83DDE4EU: return &emojis[763]; - case 0xD83DDE4FU: return &emojis[764]; - case 0xD83DDE80U: return &emojis[765]; - case 0xD83DDE81U: return &emojis[766]; - case 0xD83DDE82U: return &emojis[767]; - case 0xD83DDE83U: return &emojis[768]; - case 0xD83DDE84U: return &emojis[769]; - case 0xD83DDE85U: return &emojis[770]; - case 0xD83DDE86U: return &emojis[771]; - case 0xD83DDE87U: return &emojis[772]; - case 0xD83DDE88U: return &emojis[773]; - case 0xD83DDE89U: return &emojis[774]; - case 0xD83DDE8AU: return &emojis[775]; - case 0xD83DDE8BU: return &emojis[776]; - case 0xD83DDE8CU: return &emojis[777]; - case 0xD83DDE8DU: return &emojis[778]; - case 0xD83DDE8EU: return &emojis[779]; - case 0xD83DDE8FU: return &emojis[780]; - case 0xD83DDE90U: return &emojis[781]; - case 0xD83DDE91U: return &emojis[782]; - case 0xD83DDE92U: return &emojis[783]; - case 0xD83DDE93U: return &emojis[784]; - case 0xD83DDE94U: return &emojis[785]; - case 0xD83DDE95U: return &emojis[786]; - case 0xD83DDE96U: return &emojis[787]; - case 0xD83DDE97U: return &emojis[788]; - case 0xD83DDE98U: return &emojis[789]; - case 0xD83DDE99U: return &emojis[790]; - case 0xD83DDE9AU: return &emojis[791]; - case 0xD83DDE9BU: return &emojis[792]; - case 0xD83DDE9CU: return &emojis[793]; - case 0xD83DDE9DU: return &emojis[794]; - case 0xD83DDE9EU: return &emojis[795]; - case 0xD83DDE9FU: return &emojis[796]; - case 0xD83DDEA0U: return &emojis[797]; - case 0xD83DDEA1U: return &emojis[798]; - case 0xD83DDEA2U: return &emojis[799]; - case 0xD83DDEA3U: return &emojis[800]; - case 0xD83DDEA4U: return &emojis[801]; - case 0xD83DDEA5U: return &emojis[802]; - case 0xD83DDEA6U: return &emojis[803]; - case 0xD83DDEA7U: return &emojis[804]; - case 0xD83DDEA8U: return &emojis[805]; - case 0xD83DDEA9U: return &emojis[806]; - case 0xD83DDEAAU: return &emojis[807]; - case 0xD83DDEABU: return &emojis[808]; - case 0xD83DDEACU: return &emojis[809]; - case 0xD83DDEADU: return &emojis[810]; - case 0xD83DDEAEU: return &emojis[811]; - case 0xD83DDEAFU: return &emojis[812]; - case 0xD83DDEB0U: return &emojis[813]; - case 0xD83DDEB1U: return &emojis[814]; - case 0xD83DDEB2U: return &emojis[815]; - case 0xD83DDEB3U: return &emojis[816]; - case 0xD83DDEB4U: return &emojis[817]; - case 0xD83DDEB5U: return &emojis[818]; - case 0xD83DDEB6U: return &emojis[819]; - case 0xD83DDEB7U: return &emojis[820]; - case 0xD83DDEB8U: return &emojis[821]; - case 0xD83DDEB9U: return &emojis[822]; - case 0xD83DDEBAU: return &emojis[823]; - case 0xD83DDEBBU: return &emojis[824]; - case 0xD83DDEBCU: return &emojis[825]; - case 0xD83DDEBDU: return &emojis[826]; - case 0xD83DDEBEU: return &emojis[827]; - case 0xD83DDEBFU: return &emojis[828]; - case 0xD83DDEC0U: return &emojis[829]; - case 0xD83DDEC1U: return &emojis[830]; - case 0xD83DDEC2U: return &emojis[831]; - case 0xD83DDEC3U: return &emojis[832]; - case 0xD83DDEC4U: return &emojis[833]; - case 0xD83DDEC5U: return &emojis[834]; - case 0xFFFF0000U: return &emojis[835]; - case 0xFFFF0001U: return &emojis[836]; - case 0xFFFF0002U: return &emojis[837]; - case 0xFFFF0003U: return &emojis[838]; - case 0xFFFF0004U: return &emojis[839]; - case 0xFFFF0005U: return &emojis[840]; - case 0xFFFF0006U: return &emojis[841]; - case 0xFFFF0007U: return &emojis[842]; - case 0xFFFF0008U: return &emojis[843]; - case 0xFFFF0009U: return &emojis[844]; - case 0xFFFF000AU: return &emojis[845]; - case 0xFFFF000BU: return &emojis[846]; - case 0xFFFF000CU: return &emojis[847]; - case 0xFFFF000DU: return &emojis[848]; - case 0xFFFF000EU: return &emojis[849]; - case 0xFFFF000FU: return &emojis[850]; - case 0xFFFF0010U: return &emojis[851]; - case 0xFFFF0011U: return &emojis[852]; + case 0xD83CDC04U: return &emojis[175]; + case 0xD83CDCCFU: return &emojis[176]; + case 0xD83CDD70U: return &emojis[177]; + case 0xD83CDD71U: return &emojis[178]; + case 0xD83CDD7EU: return &emojis[179]; + case 0xD83CDD7FU: return &emojis[180]; + case 0xD83CDD8EU: return &emojis[181]; + case 0xD83CDD91U: return &emojis[182]; + case 0xD83CDD92U: return &emojis[183]; + case 0xD83CDD93U: return &emojis[184]; + case 0xD83CDD94U: return &emojis[185]; + case 0xD83CDD95U: return &emojis[186]; + case 0xD83CDD96U: return &emojis[187]; + case 0xD83CDD97U: return &emojis[188]; + case 0xD83CDD98U: return &emojis[189]; + case 0xD83CDD99U: return &emojis[190]; + case 0xD83CDD9AU: return &emojis[191]; + case 0xD83CDE01U: return &emojis[192]; + case 0xD83CDE02U: return &emojis[193]; + case 0xD83CDE1AU: return &emojis[194]; + case 0xD83CDE2FU: return &emojis[195]; + case 0xD83CDE32U: return &emojis[196]; + case 0xD83CDE33U: return &emojis[197]; + case 0xD83CDE34U: return &emojis[198]; + case 0xD83CDE35U: return &emojis[199]; + case 0xD83CDE36U: return &emojis[200]; + case 0xD83CDE37U: return &emojis[201]; + case 0xD83CDE38U: return &emojis[202]; + case 0xD83CDE39U: return &emojis[203]; + case 0xD83CDE3AU: return &emojis[204]; + case 0xD83CDE50U: return &emojis[205]; + case 0xD83CDE51U: return &emojis[206]; + case 0xD83CDF00U: return &emojis[207]; + case 0xD83CDF01U: return &emojis[208]; + case 0xD83CDF02U: return &emojis[209]; + case 0xD83CDF03U: return &emojis[210]; + case 0xD83CDF04U: return &emojis[211]; + case 0xD83CDF05U: return &emojis[212]; + case 0xD83CDF06U: return &emojis[213]; + case 0xD83CDF07U: return &emojis[214]; + case 0xD83CDF08U: return &emojis[215]; + case 0xD83CDF09U: return &emojis[216]; + case 0xD83CDF0AU: return &emojis[217]; + case 0xD83CDF0BU: return &emojis[218]; + case 0xD83CDF0CU: return &emojis[219]; + case 0xD83CDF0DU: return &emojis[220]; + case 0xD83CDF0EU: return &emojis[221]; + case 0xD83CDF0FU: return &emojis[222]; + case 0xD83CDF10U: return &emojis[223]; + case 0xD83CDF11U: return &emojis[224]; + case 0xD83CDF12U: return &emojis[225]; + case 0xD83CDF13U: return &emojis[226]; + case 0xD83CDF14U: return &emojis[227]; + case 0xD83CDF15U: return &emojis[228]; + case 0xD83CDF16U: return &emojis[229]; + case 0xD83CDF17U: return &emojis[230]; + case 0xD83CDF18U: return &emojis[231]; + case 0xD83CDF19U: return &emojis[232]; + case 0xD83CDF1AU: return &emojis[233]; + case 0xD83CDF1BU: return &emojis[234]; + case 0xD83CDF1CU: return &emojis[235]; + case 0xD83CDF1DU: return &emojis[236]; + case 0xD83CDF1EU: return &emojis[237]; + case 0xD83CDF1FU: return &emojis[238]; + case 0xD83CDF20U: return &emojis[239]; + case 0xD83CDF21U: return &emojis[240]; + case 0xD83CDF24U: return &emojis[241]; + case 0xD83CDF25U: return &emojis[242]; + case 0xD83CDF26U: return &emojis[243]; + case 0xD83CDF27U: return &emojis[244]; + case 0xD83CDF28U: return &emojis[245]; + case 0xD83CDF29U: return &emojis[246]; + case 0xD83CDF2AU: return &emojis[247]; + case 0xD83CDF2BU: return &emojis[248]; + case 0xD83CDF2CU: return &emojis[249]; + case 0xD83CDF2DU: return &emojis[250]; + case 0xD83CDF2EU: return &emojis[251]; + case 0xD83CDF2FU: return &emojis[252]; + case 0xD83CDF30U: return &emojis[253]; + case 0xD83CDF31U: return &emojis[254]; + case 0xD83CDF32U: return &emojis[255]; + case 0xD83CDF33U: return &emojis[256]; + case 0xD83CDF34U: return &emojis[257]; + case 0xD83CDF35U: return &emojis[258]; + case 0xD83CDF36U: return &emojis[259]; + case 0xD83CDF37U: return &emojis[260]; + case 0xD83CDF38U: return &emojis[261]; + case 0xD83CDF39U: return &emojis[262]; + case 0xD83CDF3AU: return &emojis[263]; + case 0xD83CDF3BU: return &emojis[264]; + case 0xD83CDF3CU: return &emojis[265]; + case 0xD83CDF3DU: return &emojis[266]; + case 0xD83CDF3EU: return &emojis[267]; + case 0xD83CDF3FU: return &emojis[268]; + case 0xD83CDF40U: return &emojis[269]; + case 0xD83CDF41U: return &emojis[270]; + case 0xD83CDF42U: return &emojis[271]; + case 0xD83CDF43U: return &emojis[272]; + case 0xD83CDF44U: return &emojis[273]; + case 0xD83CDF45U: return &emojis[274]; + case 0xD83CDF46U: return &emojis[275]; + case 0xD83CDF47U: return &emojis[276]; + case 0xD83CDF48U: return &emojis[277]; + case 0xD83CDF49U: return &emojis[278]; + case 0xD83CDF4AU: return &emojis[279]; + case 0xD83CDF4BU: return &emojis[280]; + case 0xD83CDF4CU: return &emojis[281]; + case 0xD83CDF4DU: return &emojis[282]; + case 0xD83CDF4EU: return &emojis[283]; + case 0xD83CDF4FU: return &emojis[284]; + case 0xD83CDF50U: return &emojis[285]; + case 0xD83CDF51U: return &emojis[286]; + case 0xD83CDF52U: return &emojis[287]; + case 0xD83CDF53U: return &emojis[288]; + case 0xD83CDF54U: return &emojis[289]; + case 0xD83CDF55U: return &emojis[290]; + case 0xD83CDF56U: return &emojis[291]; + case 0xD83CDF57U: return &emojis[292]; + case 0xD83CDF58U: return &emojis[293]; + case 0xD83CDF59U: return &emojis[294]; + case 0xD83CDF5AU: return &emojis[295]; + case 0xD83CDF5BU: return &emojis[296]; + case 0xD83CDF5CU: return &emojis[297]; + case 0xD83CDF5DU: return &emojis[298]; + case 0xD83CDF5EU: return &emojis[299]; + case 0xD83CDF5FU: return &emojis[300]; + case 0xD83CDF60U: return &emojis[301]; + case 0xD83CDF61U: return &emojis[302]; + case 0xD83CDF62U: return &emojis[303]; + case 0xD83CDF63U: return &emojis[304]; + case 0xD83CDF64U: return &emojis[305]; + case 0xD83CDF65U: return &emojis[306]; + case 0xD83CDF66U: return &emojis[307]; + case 0xD83CDF67U: return &emojis[308]; + case 0xD83CDF68U: return &emojis[309]; + case 0xD83CDF69U: return &emojis[310]; + case 0xD83CDF6AU: return &emojis[311]; + case 0xD83CDF6BU: return &emojis[312]; + case 0xD83CDF6CU: return &emojis[313]; + case 0xD83CDF6DU: return &emojis[314]; + case 0xD83CDF6EU: return &emojis[315]; + case 0xD83CDF6FU: return &emojis[316]; + case 0xD83CDF70U: return &emojis[317]; + case 0xD83CDF71U: return &emojis[318]; + case 0xD83CDF72U: return &emojis[319]; + case 0xD83CDF73U: return &emojis[320]; + case 0xD83CDF74U: return &emojis[321]; + case 0xD83CDF75U: return &emojis[322]; + case 0xD83CDF76U: return &emojis[323]; + case 0xD83CDF77U: return &emojis[324]; + case 0xD83CDF78U: return &emojis[325]; + case 0xD83CDF79U: return &emojis[326]; + case 0xD83CDF7AU: return &emojis[327]; + case 0xD83CDF7BU: return &emojis[328]; + case 0xD83CDF7CU: return &emojis[329]; + case 0xD83CDF7DU: return &emojis[330]; + case 0xD83CDF7EU: return &emojis[331]; + case 0xD83CDF7FU: return &emojis[332]; + case 0xD83CDF80U: return &emojis[333]; + case 0xD83CDF81U: return &emojis[334]; + case 0xD83CDF82U: return &emojis[335]; + case 0xD83CDF83U: return &emojis[336]; + case 0xD83CDF84U: return &emojis[337]; + case 0xD83CDF85U: return &emojis[338]; + case 0xD83CDF86U: return &emojis[339]; + case 0xD83CDF87U: return &emojis[340]; + case 0xD83CDF88U: return &emojis[341]; + case 0xD83CDF89U: return &emojis[342]; + case 0xD83CDF8AU: return &emojis[343]; + case 0xD83CDF8BU: return &emojis[344]; + case 0xD83CDF8CU: return &emojis[345]; + case 0xD83CDF8DU: return &emojis[346]; + case 0xD83CDF8EU: return &emojis[347]; + case 0xD83CDF8FU: return &emojis[348]; + case 0xD83CDF90U: return &emojis[349]; + case 0xD83CDF91U: return &emojis[350]; + case 0xD83CDF92U: return &emojis[351]; + case 0xD83CDF93U: return &emojis[352]; + case 0xD83CDF96U: return &emojis[353]; + case 0xD83CDF97U: return &emojis[354]; + case 0xD83CDF99U: return &emojis[355]; + case 0xD83CDF9AU: return &emojis[356]; + case 0xD83CDF9BU: return &emojis[357]; + case 0xD83CDF9EU: return &emojis[358]; + case 0xD83CDF9FU: return &emojis[359]; + case 0xD83CDFA0U: return &emojis[360]; + case 0xD83CDFA1U: return &emojis[361]; + case 0xD83CDFA2U: return &emojis[362]; + case 0xD83CDFA3U: return &emojis[363]; + case 0xD83CDFA4U: return &emojis[364]; + case 0xD83CDFA5U: return &emojis[365]; + case 0xD83CDFA6U: return &emojis[366]; + case 0xD83CDFA7U: return &emojis[367]; + case 0xD83CDFA8U: return &emojis[368]; + case 0xD83CDFA9U: return &emojis[369]; + case 0xD83CDFAAU: return &emojis[370]; + case 0xD83CDFABU: return &emojis[371]; + case 0xD83CDFACU: return &emojis[372]; + case 0xD83CDFADU: return &emojis[373]; + case 0xD83CDFAEU: return &emojis[374]; + case 0xD83CDFAFU: return &emojis[375]; + case 0xD83CDFB0U: return &emojis[376]; + case 0xD83CDFB1U: return &emojis[377]; + case 0xD83CDFB2U: return &emojis[378]; + case 0xD83CDFB3U: return &emojis[379]; + case 0xD83CDFB4U: return &emojis[380]; + case 0xD83CDFB5U: return &emojis[381]; + case 0xD83CDFB6U: return &emojis[382]; + case 0xD83CDFB7U: return &emojis[383]; + case 0xD83CDFB8U: return &emojis[384]; + case 0xD83CDFB9U: return &emojis[385]; + case 0xD83CDFBAU: return &emojis[386]; + case 0xD83CDFBBU: return &emojis[387]; + case 0xD83CDFBCU: return &emojis[388]; + case 0xD83CDFBDU: return &emojis[389]; + case 0xD83CDFBEU: return &emojis[390]; + case 0xD83CDFBFU: return &emojis[391]; + case 0xD83CDFC0U: return &emojis[392]; + case 0xD83CDFC1U: return &emojis[393]; + case 0xD83CDFC2U: return &emojis[394]; + case 0xD83CDFC3U: return &emojis[395]; + case 0xD83CDFC4U: return &emojis[396]; + case 0xD83CDFC5U: return &emojis[397]; + case 0xD83CDFC6U: return &emojis[398]; + case 0xD83CDFC7U: return &emojis[399]; + case 0xD83CDFC8U: return &emojis[400]; + case 0xD83CDFC9U: return &emojis[401]; + case 0xD83CDFCAU: return &emojis[402]; + case 0xD83CDFCBU: return &emojis[403]; + case 0xD83CDFCCU: return &emojis[404]; + case 0xD83CDFCDU: return &emojis[405]; + case 0xD83CDFCEU: return &emojis[406]; + case 0xD83CDFCFU: return &emojis[407]; + case 0xD83CDFD0U: return &emojis[408]; + case 0xD83CDFD1U: return &emojis[409]; + case 0xD83CDFD2U: return &emojis[410]; + case 0xD83CDFD3U: return &emojis[411]; + case 0xD83CDFD4U: return &emojis[412]; + case 0xD83CDFD5U: return &emojis[413]; + case 0xD83CDFD6U: return &emojis[414]; + case 0xD83CDFD7U: return &emojis[415]; + case 0xD83CDFD8U: return &emojis[416]; + case 0xD83CDFD9U: return &emojis[417]; + case 0xD83CDFDAU: return &emojis[418]; + case 0xD83CDFDBU: return &emojis[419]; + case 0xD83CDFDCU: return &emojis[420]; + case 0xD83CDFDDU: return &emojis[421]; + case 0xD83CDFDEU: return &emojis[422]; + case 0xD83CDFDFU: return &emojis[423]; + case 0xD83CDFE0U: return &emojis[424]; + case 0xD83CDFE1U: return &emojis[425]; + case 0xD83CDFE2U: return &emojis[426]; + case 0xD83CDFE3U: return &emojis[427]; + case 0xD83CDFE4U: return &emojis[428]; + case 0xD83CDFE5U: return &emojis[429]; + case 0xD83CDFE6U: return &emojis[430]; + case 0xD83CDFE7U: return &emojis[431]; + case 0xD83CDFE8U: return &emojis[432]; + case 0xD83CDFE9U: return &emojis[433]; + case 0xD83CDFEAU: return &emojis[434]; + case 0xD83CDFEBU: return &emojis[435]; + case 0xD83CDFECU: return &emojis[436]; + case 0xD83CDFEDU: return &emojis[437]; + case 0xD83CDFEEU: return &emojis[438]; + case 0xD83CDFEFU: return &emojis[439]; + case 0xD83CDFF0U: return &emojis[440]; + case 0xD83CDFF3U: return &emojis[441]; + case 0xD83CDFF4U: return &emojis[442]; + case 0xD83CDFF5U: return &emojis[443]; + case 0xD83CDFF7U: return &emojis[444]; + case 0xD83CDFF8U: return &emojis[445]; + case 0xD83CDFF9U: return &emojis[446]; + case 0xD83CDFFAU: return &emojis[447]; + case 0xD83DDC00U: return &emojis[448]; + case 0xD83DDC01U: return &emojis[449]; + case 0xD83DDC02U: return &emojis[450]; + case 0xD83DDC03U: return &emojis[451]; + case 0xD83DDC04U: return &emojis[452]; + case 0xD83DDC05U: return &emojis[453]; + case 0xD83DDC06U: return &emojis[454]; + case 0xD83DDC07U: return &emojis[455]; + case 0xD83DDC08U: return &emojis[456]; + case 0xD83DDC09U: return &emojis[457]; + case 0xD83DDC0AU: return &emojis[458]; + case 0xD83DDC0BU: return &emojis[459]; + case 0xD83DDC0CU: return &emojis[460]; + case 0xD83DDC0DU: return &emojis[461]; + case 0xD83DDC0EU: return &emojis[462]; + case 0xD83DDC0FU: return &emojis[463]; + case 0xD83DDC10U: return &emojis[464]; + case 0xD83DDC11U: return &emojis[465]; + case 0xD83DDC12U: return &emojis[466]; + case 0xD83DDC13U: return &emojis[467]; + case 0xD83DDC14U: return &emojis[468]; + case 0xD83DDC15U: return &emojis[469]; + case 0xD83DDC16U: return &emojis[470]; + case 0xD83DDC17U: return &emojis[471]; + case 0xD83DDC18U: return &emojis[472]; + case 0xD83DDC19U: return &emojis[473]; + case 0xD83DDC1AU: return &emojis[474]; + case 0xD83DDC1BU: return &emojis[475]; + case 0xD83DDC1CU: return &emojis[476]; + case 0xD83DDC1DU: return &emojis[477]; + case 0xD83DDC1EU: return &emojis[478]; + case 0xD83DDC1FU: return &emojis[479]; + case 0xD83DDC20U: return &emojis[480]; + case 0xD83DDC21U: return &emojis[481]; + case 0xD83DDC22U: return &emojis[482]; + case 0xD83DDC23U: return &emojis[483]; + case 0xD83DDC24U: return &emojis[484]; + case 0xD83DDC25U: return &emojis[485]; + case 0xD83DDC26U: return &emojis[486]; + case 0xD83DDC27U: return &emojis[487]; + case 0xD83DDC28U: return &emojis[488]; + case 0xD83DDC29U: return &emojis[489]; + case 0xD83DDC2AU: return &emojis[490]; + case 0xD83DDC2BU: return &emojis[491]; + case 0xD83DDC2CU: return &emojis[492]; + case 0xD83DDC2DU: return &emojis[493]; + case 0xD83DDC2EU: return &emojis[494]; + case 0xD83DDC2FU: return &emojis[495]; + case 0xD83DDC30U: return &emojis[496]; + case 0xD83DDC31U: return &emojis[497]; + case 0xD83DDC32U: return &emojis[498]; + case 0xD83DDC33U: return &emojis[499]; + case 0xD83DDC34U: return &emojis[500]; + case 0xD83DDC35U: return &emojis[501]; + case 0xD83DDC36U: return &emojis[502]; + case 0xD83DDC37U: return &emojis[503]; + case 0xD83DDC38U: return &emojis[504]; + case 0xD83DDC39U: return &emojis[505]; + case 0xD83DDC3AU: return &emojis[506]; + case 0xD83DDC3BU: return &emojis[507]; + case 0xD83DDC3CU: return &emojis[508]; + case 0xD83DDC3DU: return &emojis[509]; + case 0xD83DDC3EU: return &emojis[510]; + case 0xD83DDC3FU: return &emojis[511]; + case 0xD83DDC40U: return &emojis[512]; + case 0xD83DDC41U: return &emojis[513]; + case 0xD83DDC42U: return &emojis[514]; + case 0xD83DDC43U: return &emojis[515]; + case 0xD83DDC44U: return &emojis[516]; + case 0xD83DDC45U: return &emojis[517]; + case 0xD83DDC46U: return &emojis[518]; + case 0xD83DDC47U: return &emojis[519]; + case 0xD83DDC48U: return &emojis[520]; + case 0xD83DDC49U: return &emojis[521]; + case 0xD83DDC4AU: return &emojis[522]; + case 0xD83DDC4BU: return &emojis[523]; + case 0xD83DDC4CU: return &emojis[524]; + case 0xD83DDC4DU: return &emojis[525]; + case 0xD83DDC4EU: return &emojis[526]; + case 0xD83DDC4FU: return &emojis[527]; + case 0xD83DDC50U: return &emojis[528]; + case 0xD83DDC51U: return &emojis[529]; + case 0xD83DDC52U: return &emojis[530]; + case 0xD83DDC53U: return &emojis[531]; + case 0xD83DDC54U: return &emojis[532]; + case 0xD83DDC55U: return &emojis[533]; + case 0xD83DDC56U: return &emojis[534]; + case 0xD83DDC57U: return &emojis[535]; + case 0xD83DDC58U: return &emojis[536]; + case 0xD83DDC59U: return &emojis[537]; + case 0xD83DDC5AU: return &emojis[538]; + case 0xD83DDC5BU: return &emojis[539]; + case 0xD83DDC5CU: return &emojis[540]; + case 0xD83DDC5DU: return &emojis[541]; + case 0xD83DDC5EU: return &emojis[542]; + case 0xD83DDC5FU: return &emojis[543]; + case 0xD83DDC60U: return &emojis[544]; + case 0xD83DDC61U: return &emojis[545]; + case 0xD83DDC62U: return &emojis[546]; + case 0xD83DDC63U: return &emojis[547]; + case 0xD83DDC64U: return &emojis[548]; + case 0xD83DDC65U: return &emojis[549]; + case 0xD83DDC66U: return &emojis[550]; + case 0xD83DDC67U: return &emojis[551]; + case 0xD83DDC68U: return &emojis[552]; + case 0xD83DDC69U: return &emojis[553]; + case 0xD83DDC6AU: return &emojis[554]; + case 0xD83DDC6BU: return &emojis[555]; + case 0xD83DDC6CU: return &emojis[556]; + case 0xD83DDC6DU: return &emojis[557]; + case 0xD83DDC6EU: return &emojis[558]; + case 0xD83DDC6FU: return &emojis[559]; + case 0xD83DDC70U: return &emojis[560]; + case 0xD83DDC71U: return &emojis[561]; + case 0xD83DDC72U: return &emojis[562]; + case 0xD83DDC73U: return &emojis[563]; + case 0xD83DDC74U: return &emojis[564]; + case 0xD83DDC75U: return &emojis[565]; + case 0xD83DDC76U: return &emojis[566]; + case 0xD83DDC77U: return &emojis[567]; + case 0xD83DDC78U: return &emojis[568]; + case 0xD83DDC79U: return &emojis[569]; + case 0xD83DDC7AU: return &emojis[570]; + case 0xD83DDC7BU: return &emojis[571]; + case 0xD83DDC7CU: return &emojis[572]; + case 0xD83DDC7DU: return &emojis[573]; + case 0xD83DDC7EU: return &emojis[574]; + case 0xD83DDC7FU: return &emojis[575]; + case 0xD83DDC80U: return &emojis[576]; + case 0xD83DDC81U: return &emojis[577]; + case 0xD83DDC82U: return &emojis[578]; + case 0xD83DDC83U: return &emojis[579]; + case 0xD83DDC84U: return &emojis[580]; + case 0xD83DDC85U: return &emojis[581]; + case 0xD83DDC86U: return &emojis[582]; + case 0xD83DDC87U: return &emojis[583]; + case 0xD83DDC88U: return &emojis[584]; + case 0xD83DDC89U: return &emojis[585]; + case 0xD83DDC8AU: return &emojis[586]; + case 0xD83DDC8BU: return &emojis[587]; + case 0xD83DDC8CU: return &emojis[588]; + case 0xD83DDC8DU: return &emojis[589]; + case 0xD83DDC8EU: return &emojis[590]; + case 0xD83DDC8FU: return &emojis[591]; + case 0xD83DDC90U: return &emojis[592]; + case 0xD83DDC91U: return &emojis[593]; + case 0xD83DDC92U: return &emojis[594]; + case 0xD83DDC93U: return &emojis[595]; + case 0xD83DDC94U: return &emojis[596]; + case 0xD83DDC95U: return &emojis[597]; + case 0xD83DDC96U: return &emojis[598]; + case 0xD83DDC97U: return &emojis[599]; + case 0xD83DDC98U: return &emojis[600]; + case 0xD83DDC99U: return &emojis[601]; + case 0xD83DDC9AU: return &emojis[602]; + case 0xD83DDC9BU: return &emojis[603]; + case 0xD83DDC9CU: return &emojis[604]; + case 0xD83DDC9DU: return &emojis[605]; + case 0xD83DDC9EU: return &emojis[606]; + case 0xD83DDC9FU: return &emojis[607]; + case 0xD83DDCA0U: return &emojis[608]; + case 0xD83DDCA1U: return &emojis[609]; + case 0xD83DDCA2U: return &emojis[610]; + case 0xD83DDCA3U: return &emojis[611]; + case 0xD83DDCA4U: return &emojis[612]; + case 0xD83DDCA5U: return &emojis[613]; + case 0xD83DDCA6U: return &emojis[614]; + case 0xD83DDCA7U: return &emojis[615]; + case 0xD83DDCA8U: return &emojis[616]; + case 0xD83DDCA9U: return &emojis[617]; + case 0xD83DDCAAU: return &emojis[618]; + case 0xD83DDCABU: return &emojis[619]; + case 0xD83DDCACU: return &emojis[620]; + case 0xD83DDCADU: return &emojis[621]; + case 0xD83DDCAEU: return &emojis[622]; + case 0xD83DDCAFU: return &emojis[623]; + case 0xD83DDCB0U: return &emojis[624]; + case 0xD83DDCB1U: return &emojis[625]; + case 0xD83DDCB2U: return &emojis[626]; + case 0xD83DDCB3U: return &emojis[627]; + case 0xD83DDCB4U: return &emojis[628]; + case 0xD83DDCB5U: return &emojis[629]; + case 0xD83DDCB6U: return &emojis[630]; + case 0xD83DDCB7U: return &emojis[631]; + case 0xD83DDCB8U: return &emojis[632]; + case 0xD83DDCB9U: return &emojis[633]; + case 0xD83DDCBAU: return &emojis[634]; + case 0xD83DDCBBU: return &emojis[635]; + case 0xD83DDCBCU: return &emojis[636]; + case 0xD83DDCBDU: return &emojis[637]; + case 0xD83DDCBEU: return &emojis[638]; + case 0xD83DDCBFU: return &emojis[639]; + case 0xD83DDCC0U: return &emojis[640]; + case 0xD83DDCC1U: return &emojis[641]; + case 0xD83DDCC2U: return &emojis[642]; + case 0xD83DDCC3U: return &emojis[643]; + case 0xD83DDCC4U: return &emojis[644]; + case 0xD83DDCC5U: return &emojis[645]; + case 0xD83DDCC6U: return &emojis[646]; + case 0xD83DDCC7U: return &emojis[647]; + case 0xD83DDCC8U: return &emojis[648]; + case 0xD83DDCC9U: return &emojis[649]; + case 0xD83DDCCAU: return &emojis[650]; + case 0xD83DDCCBU: return &emojis[651]; + case 0xD83DDCCCU: return &emojis[652]; + case 0xD83DDCCDU: return &emojis[653]; + case 0xD83DDCCEU: return &emojis[654]; + case 0xD83DDCCFU: return &emojis[655]; + case 0xD83DDCD0U: return &emojis[656]; + case 0xD83DDCD1U: return &emojis[657]; + case 0xD83DDCD2U: return &emojis[658]; + case 0xD83DDCD3U: return &emojis[659]; + case 0xD83DDCD4U: return &emojis[660]; + case 0xD83DDCD5U: return &emojis[661]; + case 0xD83DDCD6U: return &emojis[662]; + case 0xD83DDCD7U: return &emojis[663]; + case 0xD83DDCD8U: return &emojis[664]; + case 0xD83DDCD9U: return &emojis[665]; + case 0xD83DDCDAU: return &emojis[666]; + case 0xD83DDCDBU: return &emojis[667]; + case 0xD83DDCDCU: return &emojis[668]; + case 0xD83DDCDDU: return &emojis[669]; + case 0xD83DDCDEU: return &emojis[670]; + case 0xD83DDCDFU: return &emojis[671]; + case 0xD83DDCE0U: return &emojis[672]; + case 0xD83DDCE1U: return &emojis[673]; + case 0xD83DDCE2U: return &emojis[674]; + case 0xD83DDCE3U: return &emojis[675]; + case 0xD83DDCE4U: return &emojis[676]; + case 0xD83DDCE5U: return &emojis[677]; + case 0xD83DDCE6U: return &emojis[678]; + case 0xD83DDCE7U: return &emojis[679]; + case 0xD83DDCE8U: return &emojis[680]; + case 0xD83DDCE9U: return &emojis[681]; + case 0xD83DDCEAU: return &emojis[682]; + case 0xD83DDCEBU: return &emojis[683]; + case 0xD83DDCECU: return &emojis[684]; + case 0xD83DDCEDU: return &emojis[685]; + case 0xD83DDCEEU: return &emojis[686]; + case 0xD83DDCEFU: return &emojis[687]; + case 0xD83DDCF0U: return &emojis[688]; + case 0xD83DDCF1U: return &emojis[689]; + case 0xD83DDCF2U: return &emojis[690]; + case 0xD83DDCF3U: return &emojis[691]; + case 0xD83DDCF4U: return &emojis[692]; + case 0xD83DDCF5U: return &emojis[693]; + case 0xD83DDCF6U: return &emojis[694]; + case 0xD83DDCF7U: return &emojis[695]; + case 0xD83DDCF8U: return &emojis[696]; + case 0xD83DDCF9U: return &emojis[697]; + case 0xD83DDCFAU: return &emojis[698]; + case 0xD83DDCFBU: return &emojis[699]; + case 0xD83DDCFCU: return &emojis[700]; + case 0xD83DDCFDU: return &emojis[701]; + case 0xD83DDCFFU: return &emojis[702]; + case 0xD83DDD00U: return &emojis[703]; + case 0xD83DDD01U: return &emojis[704]; + case 0xD83DDD02U: return &emojis[705]; + case 0xD83DDD03U: return &emojis[706]; + case 0xD83DDD04U: return &emojis[707]; + case 0xD83DDD05U: return &emojis[708]; + case 0xD83DDD06U: return &emojis[709]; + case 0xD83DDD07U: return &emojis[710]; + case 0xD83DDD08U: return &emojis[711]; + case 0xD83DDD09U: return &emojis[712]; + case 0xD83DDD0AU: return &emojis[713]; + case 0xD83DDD0BU: return &emojis[714]; + case 0xD83DDD0CU: return &emojis[715]; + case 0xD83DDD0DU: return &emojis[716]; + case 0xD83DDD0EU: return &emojis[717]; + case 0xD83DDD0FU: return &emojis[718]; + case 0xD83DDD10U: return &emojis[719]; + case 0xD83DDD11U: return &emojis[720]; + case 0xD83DDD12U: return &emojis[721]; + case 0xD83DDD13U: return &emojis[722]; + case 0xD83DDD14U: return &emojis[723]; + case 0xD83DDD15U: return &emojis[724]; + case 0xD83DDD16U: return &emojis[725]; + case 0xD83DDD17U: return &emojis[726]; + case 0xD83DDD18U: return &emojis[727]; + case 0xD83DDD19U: return &emojis[728]; + case 0xD83DDD1AU: return &emojis[729]; + case 0xD83DDD1BU: return &emojis[730]; + case 0xD83DDD1CU: return &emojis[731]; + case 0xD83DDD1DU: return &emojis[732]; + case 0xD83DDD1EU: return &emojis[733]; + case 0xD83DDD1FU: return &emojis[734]; + case 0xD83DDD20U: return &emojis[735]; + case 0xD83DDD21U: return &emojis[736]; + case 0xD83DDD22U: return &emojis[737]; + case 0xD83DDD23U: return &emojis[738]; + case 0xD83DDD24U: return &emojis[739]; + case 0xD83DDD25U: return &emojis[740]; + case 0xD83DDD26U: return &emojis[741]; + case 0xD83DDD27U: return &emojis[742]; + case 0xD83DDD28U: return &emojis[743]; + case 0xD83DDD29U: return &emojis[744]; + case 0xD83DDD2AU: return &emojis[745]; + case 0xD83DDD2BU: return &emojis[746]; + case 0xD83DDD2CU: return &emojis[747]; + case 0xD83DDD2DU: return &emojis[748]; + case 0xD83DDD2EU: return &emojis[749]; + case 0xD83DDD2FU: return &emojis[750]; + case 0xD83DDD30U: return &emojis[751]; + case 0xD83DDD31U: return &emojis[752]; + case 0xD83DDD32U: return &emojis[753]; + case 0xD83DDD33U: return &emojis[754]; + case 0xD83DDD34U: return &emojis[755]; + case 0xD83DDD35U: return &emojis[756]; + case 0xD83DDD36U: return &emojis[757]; + case 0xD83DDD37U: return &emojis[758]; + case 0xD83DDD38U: return &emojis[759]; + case 0xD83DDD39U: return &emojis[760]; + case 0xD83DDD3AU: return &emojis[761]; + case 0xD83DDD3BU: return &emojis[762]; + case 0xD83DDD3CU: return &emojis[763]; + case 0xD83DDD3DU: return &emojis[764]; + case 0xD83DDD49U: return &emojis[765]; + case 0xD83DDD4AU: return &emojis[766]; + case 0xD83DDD4BU: return &emojis[767]; + case 0xD83DDD4CU: return &emojis[768]; + case 0xD83DDD4DU: return &emojis[769]; + case 0xD83DDD4EU: return &emojis[770]; + case 0xD83DDD50U: return &emojis[771]; + case 0xD83DDD51U: return &emojis[772]; + case 0xD83DDD52U: return &emojis[773]; + case 0xD83DDD53U: return &emojis[774]; + case 0xD83DDD54U: return &emojis[775]; + case 0xD83DDD55U: return &emojis[776]; + case 0xD83DDD56U: return &emojis[777]; + case 0xD83DDD57U: return &emojis[778]; + case 0xD83DDD58U: return &emojis[779]; + case 0xD83DDD59U: return &emojis[780]; + case 0xD83DDD5AU: return &emojis[781]; + case 0xD83DDD5BU: return &emojis[782]; + case 0xD83DDD5CU: return &emojis[783]; + case 0xD83DDD5DU: return &emojis[784]; + case 0xD83DDD5EU: return &emojis[785]; + case 0xD83DDD5FU: return &emojis[786]; + case 0xD83DDD60U: return &emojis[787]; + case 0xD83DDD61U: return &emojis[788]; + case 0xD83DDD62U: return &emojis[789]; + case 0xD83DDD63U: return &emojis[790]; + case 0xD83DDD64U: return &emojis[791]; + case 0xD83DDD65U: return &emojis[792]; + case 0xD83DDD66U: return &emojis[793]; + case 0xD83DDD67U: return &emojis[794]; + case 0xD83DDD6FU: return &emojis[795]; + case 0xD83DDD70U: return &emojis[796]; + case 0xD83DDD73U: return &emojis[797]; + case 0xD83DDD74U: return &emojis[798]; + case 0xD83DDD75U: return &emojis[799]; + case 0xD83DDD76U: return &emojis[800]; + case 0xD83DDD77U: return &emojis[801]; + case 0xD83DDD78U: return &emojis[802]; + case 0xD83DDD79U: return &emojis[803]; + case 0xD83DDD87U: return &emojis[804]; + case 0xD83DDD8AU: return &emojis[805]; + case 0xD83DDD8BU: return &emojis[806]; + case 0xD83DDD8CU: return &emojis[807]; + case 0xD83DDD8DU: return &emojis[808]; + case 0xD83DDD90U: return &emojis[809]; + case 0xD83DDD95U: return &emojis[810]; + case 0xD83DDD96U: return &emojis[811]; + case 0xD83DDDA5U: return &emojis[812]; + case 0xD83DDDA8U: return &emojis[813]; + case 0xD83DDDB1U: return &emojis[814]; + case 0xD83DDDB2U: return &emojis[815]; + case 0xD83DDDBCU: return &emojis[816]; + case 0xD83DDDC2U: return &emojis[817]; + case 0xD83DDDC3U: return &emojis[818]; + case 0xD83DDDC4U: return &emojis[819]; + case 0xD83DDDD1U: return &emojis[820]; + case 0xD83DDDD2U: return &emojis[821]; + case 0xD83DDDD3U: return &emojis[822]; + case 0xD83DDDDCU: return &emojis[823]; + case 0xD83DDDDDU: return &emojis[824]; + case 0xD83DDDDEU: return &emojis[825]; + case 0xD83DDDE1U: return &emojis[826]; + case 0xD83DDDE3U: return &emojis[827]; + case 0xD83DDDEFU: return &emojis[828]; + case 0xD83DDDF3U: return &emojis[829]; + case 0xD83DDDFAU: return &emojis[830]; + case 0xD83DDDFBU: return &emojis[831]; + case 0xD83DDDFCU: return &emojis[832]; + case 0xD83DDDFDU: return &emojis[833]; + case 0xD83DDDFEU: return &emojis[834]; + case 0xD83DDDFFU: return &emojis[835]; + case 0xD83DDE00U: return &emojis[836]; + case 0xD83DDE01U: return &emojis[837]; + case 0xD83DDE02U: return &emojis[838]; + case 0xD83DDE03U: return &emojis[839]; + case 0xD83DDE04U: return &emojis[840]; + case 0xD83DDE05U: return &emojis[841]; + case 0xD83DDE06U: return &emojis[842]; + case 0xD83DDE07U: return &emojis[843]; + case 0xD83DDE08U: return &emojis[844]; + case 0xD83DDE09U: return &emojis[845]; + case 0xD83DDE0AU: return &emojis[846]; + case 0xD83DDE0BU: return &emojis[847]; + case 0xD83DDE0CU: return &emojis[848]; + case 0xD83DDE0DU: return &emojis[849]; + case 0xD83DDE0EU: return &emojis[850]; + case 0xD83DDE0FU: return &emojis[851]; + case 0xD83DDE10U: return &emojis[852]; + case 0xD83DDE11U: return &emojis[853]; + case 0xD83DDE12U: return &emojis[854]; + case 0xD83DDE13U: return &emojis[855]; + case 0xD83DDE14U: return &emojis[856]; + case 0xD83DDE15U: return &emojis[857]; + case 0xD83DDE16U: return &emojis[858]; + case 0xD83DDE17U: return &emojis[859]; + case 0xD83DDE18U: return &emojis[860]; + case 0xD83DDE19U: return &emojis[861]; + case 0xD83DDE1AU: return &emojis[862]; + case 0xD83DDE1BU: return &emojis[863]; + case 0xD83DDE1CU: return &emojis[864]; + case 0xD83DDE1DU: return &emojis[865]; + case 0xD83DDE1EU: return &emojis[866]; + case 0xD83DDE1FU: return &emojis[867]; + case 0xD83DDE20U: return &emojis[868]; + case 0xD83DDE21U: return &emojis[869]; + case 0xD83DDE22U: return &emojis[870]; + case 0xD83DDE23U: return &emojis[871]; + case 0xD83DDE24U: return &emojis[872]; + case 0xD83DDE25U: return &emojis[873]; + case 0xD83DDE26U: return &emojis[874]; + case 0xD83DDE27U: return &emojis[875]; + case 0xD83DDE28U: return &emojis[876]; + case 0xD83DDE29U: return &emojis[877]; + case 0xD83DDE2AU: return &emojis[878]; + case 0xD83DDE2BU: return &emojis[879]; + case 0xD83DDE2CU: return &emojis[880]; + case 0xD83DDE2DU: return &emojis[881]; + case 0xD83DDE2EU: return &emojis[882]; + case 0xD83DDE2FU: return &emojis[883]; + case 0xD83DDE30U: return &emojis[884]; + case 0xD83DDE31U: return &emojis[885]; + case 0xD83DDE32U: return &emojis[886]; + case 0xD83DDE33U: return &emojis[887]; + case 0xD83DDE34U: return &emojis[888]; + case 0xD83DDE35U: return &emojis[889]; + case 0xD83DDE36U: return &emojis[890]; + case 0xD83DDE37U: return &emojis[891]; + case 0xD83DDE38U: return &emojis[892]; + case 0xD83DDE39U: return &emojis[893]; + case 0xD83DDE3AU: return &emojis[894]; + case 0xD83DDE3BU: return &emojis[895]; + case 0xD83DDE3CU: return &emojis[896]; + case 0xD83DDE3DU: return &emojis[897]; + case 0xD83DDE3EU: return &emojis[898]; + case 0xD83DDE3FU: return &emojis[899]; + case 0xD83DDE40U: return &emojis[900]; + case 0xD83DDE41U: return &emojis[901]; + case 0xD83DDE42U: return &emojis[902]; + case 0xD83DDE43U: return &emojis[903]; + case 0xD83DDE44U: return &emojis[904]; + case 0xD83DDE45U: return &emojis[905]; + case 0xD83DDE46U: return &emojis[906]; + case 0xD83DDE47U: return &emojis[907]; + case 0xD83DDE48U: return &emojis[908]; + case 0xD83DDE49U: return &emojis[909]; + case 0xD83DDE4AU: return &emojis[910]; + case 0xD83DDE4BU: return &emojis[911]; + case 0xD83DDE4CU: return &emojis[912]; + case 0xD83DDE4DU: return &emojis[913]; + case 0xD83DDE4EU: return &emojis[914]; + case 0xD83DDE4FU: return &emojis[915]; + case 0xD83DDE80U: return &emojis[916]; + case 0xD83DDE81U: return &emojis[917]; + case 0xD83DDE82U: return &emojis[918]; + case 0xD83DDE83U: return &emojis[919]; + case 0xD83DDE84U: return &emojis[920]; + case 0xD83DDE85U: return &emojis[921]; + case 0xD83DDE86U: return &emojis[922]; + case 0xD83DDE87U: return &emojis[923]; + case 0xD83DDE88U: return &emojis[924]; + case 0xD83DDE89U: return &emojis[925]; + case 0xD83DDE8AU: return &emojis[926]; + case 0xD83DDE8BU: return &emojis[927]; + case 0xD83DDE8CU: return &emojis[928]; + case 0xD83DDE8DU: return &emojis[929]; + case 0xD83DDE8EU: return &emojis[930]; + case 0xD83DDE8FU: return &emojis[931]; + case 0xD83DDE90U: return &emojis[932]; + case 0xD83DDE91U: return &emojis[933]; + case 0xD83DDE92U: return &emojis[934]; + case 0xD83DDE93U: return &emojis[935]; + case 0xD83DDE94U: return &emojis[936]; + case 0xD83DDE95U: return &emojis[937]; + case 0xD83DDE96U: return &emojis[938]; + case 0xD83DDE97U: return &emojis[939]; + case 0xD83DDE98U: return &emojis[940]; + case 0xD83DDE99U: return &emojis[941]; + case 0xD83DDE9AU: return &emojis[942]; + case 0xD83DDE9BU: return &emojis[943]; + case 0xD83DDE9CU: return &emojis[944]; + case 0xD83DDE9DU: return &emojis[945]; + case 0xD83DDE9EU: return &emojis[946]; + case 0xD83DDE9FU: return &emojis[947]; + case 0xD83DDEA0U: return &emojis[948]; + case 0xD83DDEA1U: return &emojis[949]; + case 0xD83DDEA2U: return &emojis[950]; + case 0xD83DDEA3U: return &emojis[951]; + case 0xD83DDEA4U: return &emojis[952]; + case 0xD83DDEA5U: return &emojis[953]; + case 0xD83DDEA6U: return &emojis[954]; + case 0xD83DDEA7U: return &emojis[955]; + case 0xD83DDEA8U: return &emojis[956]; + case 0xD83DDEA9U: return &emojis[957]; + case 0xD83DDEAAU: return &emojis[958]; + case 0xD83DDEABU: return &emojis[959]; + case 0xD83DDEACU: return &emojis[960]; + case 0xD83DDEADU: return &emojis[961]; + case 0xD83DDEAEU: return &emojis[962]; + case 0xD83DDEAFU: return &emojis[963]; + case 0xD83DDEB0U: return &emojis[964]; + case 0xD83DDEB1U: return &emojis[965]; + case 0xD83DDEB2U: return &emojis[966]; + case 0xD83DDEB3U: return &emojis[967]; + case 0xD83DDEB4U: return &emojis[968]; + case 0xD83DDEB5U: return &emojis[969]; + case 0xD83DDEB6U: return &emojis[970]; + case 0xD83DDEB7U: return &emojis[971]; + case 0xD83DDEB8U: return &emojis[972]; + case 0xD83DDEB9U: return &emojis[973]; + case 0xD83DDEBAU: return &emojis[974]; + case 0xD83DDEBBU: return &emojis[975]; + case 0xD83DDEBCU: return &emojis[976]; + case 0xD83DDEBDU: return &emojis[977]; + case 0xD83DDEBEU: return &emojis[978]; + case 0xD83DDEBFU: return &emojis[979]; + case 0xD83DDEC0U: return &emojis[980]; + case 0xD83DDEC1U: return &emojis[981]; + case 0xD83DDEC2U: return &emojis[982]; + case 0xD83DDEC3U: return &emojis[983]; + case 0xD83DDEC4U: return &emojis[984]; + case 0xD83DDEC5U: return &emojis[985]; + case 0xD83DDECBU: return &emojis[986]; + case 0xD83DDECCU: return &emojis[987]; + case 0xD83DDECDU: return &emojis[988]; + case 0xD83DDECEU: return &emojis[989]; + case 0xD83DDECFU: return &emojis[990]; + case 0xD83DDED0U: return &emojis[991]; + case 0xD83DDEE0U: return &emojis[992]; + case 0xD83DDEE1U: return &emojis[993]; + case 0xD83DDEE2U: return &emojis[994]; + case 0xD83DDEE3U: return &emojis[995]; + case 0xD83DDEE4U: return &emojis[996]; + case 0xD83DDEE5U: return &emojis[997]; + case 0xD83DDEE9U: return &emojis[998]; + case 0xD83DDEEBU: return &emojis[999]; + case 0xD83DDEECU: return &emojis[1000]; + case 0xD83DDEF0U: return &emojis[1001]; + case 0xD83DDEF3U: return &emojis[1002]; + case 0xD83EDD10U: return &emojis[1003]; + case 0xD83EDD11U: return &emojis[1004]; + case 0xD83EDD12U: return &emojis[1005]; + case 0xD83EDD13U: return &emojis[1006]; + case 0xD83EDD14U: return &emojis[1007]; + case 0xD83EDD15U: return &emojis[1008]; + case 0xD83EDD16U: return &emojis[1009]; + case 0xD83EDD17U: return &emojis[1010]; + case 0xD83EDD18U: return &emojis[1011]; + case 0xD83EDD80U: return &emojis[1012]; + case 0xD83EDD81U: return &emojis[1013]; + case 0xD83EDD82U: return &emojis[1014]; + case 0xD83EDD83U: return &emojis[1015]; + case 0xD83EDD84U: return &emojis[1016]; + case 0xD83EDDC0U: return &emojis[1017]; + case 0xFFFF0000U: return &emojis[1018]; + case 0xFFFF0001U: return &emojis[1019]; + case 0xFFFF0002U: return &emojis[1020]; + case 0xFFFF0003U: return &emojis[1021]; + case 0xFFFF0004U: return &emojis[1022]; + case 0xFFFF0005U: return &emojis[1023]; + case 0xFFFF0006U: return &emojis[1024]; + case 0xFFFF0007U: return &emojis[1025]; + case 0xFFFF0008U: return &emojis[1026]; + case 0xFFFF0009U: return &emojis[1027]; + case 0xFFFF000AU: return &emojis[1028]; + case 0xFFFF000BU: return &emojis[1029]; + case 0xFFFF000CU: return &emojis[1030]; + case 0xFFFF000DU: return &emojis[1031]; + case 0xFFFF000EU: return &emojis[1032]; + case 0xFFFF000FU: return &emojis[1033]; + case 0xFFFF0010U: return &emojis[1034]; + case 0xFFFF0011U: return &emojis[1035]; + case 0xFFFF0012U: return &emojis[1036]; case 0xD83CDDE6U: return TwoSymbolEmoji; case 0xD83CDDE7U: return TwoSymbolEmoji; case 0xD83CDDE8U: return TwoSymbolEmoji; @@ -2127,14 +2735,20 @@ EmojiPtr emojiGet(uint32 code) { case 0xD83CDDEEU: return TwoSymbolEmoji; case 0xD83CDDEFU: return TwoSymbolEmoji; case 0xD83CDDF0U: return TwoSymbolEmoji; + case 0xD83CDDF1U: return TwoSymbolEmoji; case 0xD83CDDF2U: return TwoSymbolEmoji; case 0xD83CDDF3U: return TwoSymbolEmoji; + case 0xD83CDDF4U: return TwoSymbolEmoji; case 0xD83CDDF5U: return TwoSymbolEmoji; + case 0xD83CDDF6U: return TwoSymbolEmoji; case 0xD83CDDF7U: return TwoSymbolEmoji; case 0xD83CDDF8U: return TwoSymbolEmoji; case 0xD83CDDF9U: return TwoSymbolEmoji; case 0xD83CDDFAU: return TwoSymbolEmoji; case 0xD83CDDFBU: return TwoSymbolEmoji; + case 0xD83CDDFCU: return TwoSymbolEmoji; + case 0xD83CDDFDU: return TwoSymbolEmoji; + case 0xD83CDDFEU: return TwoSymbolEmoji; case 0xD83CDDFFU: return TwoSymbolEmoji; } @@ -2146,105 +2760,328 @@ EmojiPtr emojiGet(uint32 code, uint32 code2) { switch (code) { case 0xD83CDDE6U: switch (code2) { - case 0xD83CDDEAU: return &emojis[873]; - case 0xD83CDDF9U: return &emojis[874]; - case 0xD83CDDFAU: return &emojis[875]; + case 0xD83CDDE9U: return &emojis[1067]; + case 0xD83CDDEAU: return &emojis[1068]; + case 0xD83CDDEBU: return &emojis[1069]; + case 0xD83CDDECU: return &emojis[1070]; + case 0xD83CDDEEU: return &emojis[1071]; + case 0xD83CDDF1U: return &emojis[1072]; + case 0xD83CDDF2U: return &emojis[1073]; + case 0xD83CDDF4U: return &emojis[1074]; + case 0xD83CDDF6U: return &emojis[1075]; + case 0xD83CDDF7U: return &emojis[1076]; + case 0xD83CDDF8U: return &emojis[1077]; + case 0xD83CDDF9U: return &emojis[1078]; + case 0xD83CDDFAU: return &emojis[1079]; + case 0xD83CDDFCU: return &emojis[1080]; + case 0xD83CDDFDU: return &emojis[1081]; + case 0xD83CDDFFU: return &emojis[1082]; default: return 0; } break; case 0xD83CDDE7U: switch (code2) { - case 0xD83CDDEAU: return &emojis[876]; - case 0xD83CDDF7U: return &emojis[877]; + case 0xD83CDDE6U: return &emojis[1083]; + case 0xD83CDDE7U: return &emojis[1084]; + case 0xD83CDDE9U: return &emojis[1085]; + case 0xD83CDDEAU: return &emojis[1086]; + case 0xD83CDDEBU: return &emojis[1087]; + case 0xD83CDDECU: return &emojis[1088]; + case 0xD83CDDEDU: return &emojis[1089]; + case 0xD83CDDEEU: return &emojis[1090]; + case 0xD83CDDEFU: return &emojis[1091]; + case 0xD83CDDF1U: return &emojis[1092]; + case 0xD83CDDF2U: return &emojis[1093]; + case 0xD83CDDF3U: return &emojis[1094]; + case 0xD83CDDF4U: return &emojis[1095]; + case 0xD83CDDF6U: return &emojis[1096]; + case 0xD83CDDF7U: return &emojis[1097]; + case 0xD83CDDF8U: return &emojis[1098]; + case 0xD83CDDF9U: return &emojis[1099]; + case 0xD83CDDFCU: return &emojis[1100]; + case 0xD83CDDFEU: return &emojis[1101]; + case 0xD83CDDFFU: return &emojis[1102]; default: return 0; } break; case 0xD83CDDE8U: switch (code2) { - case 0xD83CDDE6U: return &emojis[878]; - case 0xD83CDDEDU: return &emojis[879]; - case 0xD83CDDF1U: return &emojis[880]; - case 0xD83CDDF3U: return &emojis[881]; - case 0xD83CDDF4U: return &emojis[882]; + case 0xD83CDDE6U: return &emojis[1103]; + case 0xD83CDDE8U: return &emojis[1104]; + case 0xD83CDDE9U: return &emojis[1105]; + case 0xD83CDDEBU: return &emojis[1106]; + case 0xD83CDDECU: return &emojis[1107]; + case 0xD83CDDEDU: return &emojis[1108]; + case 0xD83CDDEEU: return &emojis[1109]; + case 0xD83CDDF0U: return &emojis[1110]; + case 0xD83CDDF1U: return &emojis[1111]; + case 0xD83CDDF2U: return &emojis[1112]; + case 0xD83CDDF3U: return &emojis[1113]; + case 0xD83CDDF4U: return &emojis[1114]; + case 0xD83CDDF7U: return &emojis[1115]; + case 0xD83CDDFAU: return &emojis[1116]; + case 0xD83CDDFBU: return &emojis[1117]; + case 0xD83CDDFCU: return &emojis[1118]; + case 0xD83CDDFDU: return &emojis[1119]; + case 0xD83CDDFEU: return &emojis[1120]; + case 0xD83CDDFFU: return &emojis[1121]; default: return 0; } break; case 0xD83CDDE9U: switch (code2) { - case 0xD83CDDEAU: return &emojis[883]; - case 0xD83CDDF0U: return &emojis[884]; + case 0xD83CDDEAU: return &emojis[1122]; + case 0xD83CDDEFU: return &emojis[1123]; + case 0xD83CDDF0U: return &emojis[1124]; + case 0xD83CDDF2U: return &emojis[1125]; + case 0xD83CDDF4U: return &emojis[1126]; + case 0xD83CDDFFU: return &emojis[1127]; default: return 0; } break; case 0xD83CDDEAU: switch (code2) { - case 0xD83CDDF8U: return &emojis[885]; + case 0xD83CDDE8U: return &emojis[1128]; + case 0xD83CDDEAU: return &emojis[1129]; + case 0xD83CDDECU: return &emojis[1130]; + case 0xD83CDDEDU: return &emojis[1131]; + case 0xD83CDDF7U: return &emojis[1132]; + case 0xD83CDDF8U: return &emojis[1133]; + case 0xD83CDDF9U: return &emojis[1134]; + case 0xD83CDDFAU: return &emojis[1135]; default: return 0; } break; case 0xD83CDDEBU: switch (code2) { - case 0xD83CDDEEU: return &emojis[886]; - case 0xD83CDDF7U: return &emojis[887]; + case 0xD83CDDEEU: return &emojis[1136]; + case 0xD83CDDEFU: return &emojis[1137]; + case 0xD83CDDF0U: return &emojis[1138]; + case 0xD83CDDF2U: return &emojis[1139]; + case 0xD83CDDF4U: return &emojis[1140]; + case 0xD83CDDF7U: return &emojis[1141]; default: return 0; } break; case 0xD83CDDECU: switch (code2) { - case 0xD83CDDE7U: return &emojis[888]; + case 0xD83CDDE6U: return &emojis[1142]; + case 0xD83CDDE7U: return &emojis[1143]; + case 0xD83CDDE9U: return &emojis[1144]; + case 0xD83CDDEAU: return &emojis[1145]; + case 0xD83CDDEBU: return &emojis[1146]; + case 0xD83CDDECU: return &emojis[1147]; + case 0xD83CDDEDU: return &emojis[1148]; + case 0xD83CDDEEU: return &emojis[1149]; + case 0xD83CDDF1U: return &emojis[1150]; + case 0xD83CDDF2U: return &emojis[1151]; + case 0xD83CDDF3U: return &emojis[1152]; + case 0xD83CDDF5U: return &emojis[1153]; + case 0xD83CDDF6U: return &emojis[1154]; + case 0xD83CDDF7U: return &emojis[1155]; + case 0xD83CDDF8U: return &emojis[1156]; + case 0xD83CDDF9U: return &emojis[1157]; + case 0xD83CDDFAU: return &emojis[1158]; + case 0xD83CDDFCU: return &emojis[1159]; + case 0xD83CDDFEU: return &emojis[1160]; default: return 0; } break; case 0xD83CDDEDU: switch (code2) { - case 0xD83CDDF0U: return &emojis[889]; + case 0xD83CDDF0U: return &emojis[1161]; + case 0xD83CDDF3U: return &emojis[1162]; + case 0xD83CDDF7U: return &emojis[1163]; + case 0xD83CDDF9U: return &emojis[1164]; + case 0xD83CDDFAU: return &emojis[1165]; default: return 0; } break; case 0xD83CDDEEU: switch (code2) { - case 0xD83CDDE9U: return &emojis[890]; - case 0xD83CDDEAU: return &emojis[891]; - case 0xD83CDDF1U: return &emojis[892]; - case 0xD83CDDF3U: return &emojis[893]; - case 0xD83CDDF9U: return &emojis[894]; + case 0xD83CDDE8U: return &emojis[1166]; + case 0xD83CDDE9U: return &emojis[1167]; + case 0xD83CDDEAU: return &emojis[1168]; + case 0xD83CDDF1U: return &emojis[1169]; + case 0xD83CDDF2U: return &emojis[1170]; + case 0xD83CDDF3U: return &emojis[1171]; + case 0xD83CDDF4U: return &emojis[1172]; + case 0xD83CDDF6U: return &emojis[1173]; + case 0xD83CDDF7U: return &emojis[1174]; + case 0xD83CDDF8U: return &emojis[1175]; + case 0xD83CDDF9U: return &emojis[1176]; default: return 0; } break; case 0xD83CDDEFU: switch (code2) { - case 0xD83CDDF5U: return &emojis[895]; + case 0xD83CDDEAU: return &emojis[1177]; + case 0xD83CDDF2U: return &emojis[1178]; + case 0xD83CDDF4U: return &emojis[1179]; + case 0xD83CDDF5U: return &emojis[1180]; default: return 0; } break; case 0xD83CDDF0U: switch (code2) { - case 0xD83CDDF7U: return &emojis[896]; + case 0xD83CDDEAU: return &emojis[1181]; + case 0xD83CDDECU: return &emojis[1182]; + case 0xD83CDDEDU: return &emojis[1183]; + case 0xD83CDDEEU: return &emojis[1184]; + case 0xD83CDDF2U: return &emojis[1185]; + case 0xD83CDDF3U: return &emojis[1186]; + case 0xD83CDDF5U: return &emojis[1187]; + case 0xD83CDDF7U: return &emojis[1188]; + case 0xD83CDDFCU: return &emojis[1189]; + case 0xD83CDDFEU: return &emojis[1190]; + case 0xD83CDDFFU: return &emojis[1191]; + default: return 0; + } break; + case 0xD83CDDF1U: switch (code2) { + case 0xD83CDDE6U: return &emojis[1192]; + case 0xD83CDDE7U: return &emojis[1193]; + case 0xD83CDDE8U: return &emojis[1194]; + case 0xD83CDDEEU: return &emojis[1195]; + case 0xD83CDDF0U: return &emojis[1196]; + case 0xD83CDDF7U: return &emojis[1197]; + case 0xD83CDDF8U: return &emojis[1198]; + case 0xD83CDDF9U: return &emojis[1199]; + case 0xD83CDDFAU: return &emojis[1200]; + case 0xD83CDDFBU: return &emojis[1201]; + case 0xD83CDDFEU: return &emojis[1202]; default: return 0; } break; case 0xD83CDDF2U: switch (code2) { - case 0xD83CDDF4U: return &emojis[897]; - case 0xD83CDDFDU: return &emojis[898]; - case 0xD83CDDFEU: return &emojis[899]; + case 0xD83CDDE6U: return &emojis[1203]; + case 0xD83CDDE8U: return &emojis[1204]; + case 0xD83CDDE9U: return &emojis[1205]; + case 0xD83CDDEAU: return &emojis[1206]; + case 0xD83CDDECU: return &emojis[1207]; + case 0xD83CDDEDU: return &emojis[1208]; + case 0xD83CDDF0U: return &emojis[1209]; + case 0xD83CDDF1U: return &emojis[1210]; + case 0xD83CDDF2U: return &emojis[1211]; + case 0xD83CDDF3U: return &emojis[1212]; + case 0xD83CDDF4U: return &emojis[1213]; + case 0xD83CDDF5U: return &emojis[1214]; + case 0xD83CDDF6U: return &emojis[1215]; + case 0xD83CDDF7U: return &emojis[1216]; + case 0xD83CDDF8U: return &emojis[1217]; + case 0xD83CDDF9U: return &emojis[1218]; + case 0xD83CDDFAU: return &emojis[1219]; + case 0xD83CDDFBU: return &emojis[1220]; + case 0xD83CDDFCU: return &emojis[1221]; + case 0xD83CDDFDU: return &emojis[1222]; + case 0xD83CDDFEU: return &emojis[1223]; + case 0xD83CDDFFU: return &emojis[1224]; default: return 0; } break; case 0xD83CDDF3U: switch (code2) { - case 0xD83CDDF1U: return &emojis[900]; - case 0xD83CDDF4U: return &emojis[901]; - case 0xD83CDDFFU: return &emojis[902]; + case 0xD83CDDE6U: return &emojis[1225]; + case 0xD83CDDE8U: return &emojis[1226]; + case 0xD83CDDEAU: return &emojis[1227]; + case 0xD83CDDEBU: return &emojis[1228]; + case 0xD83CDDECU: return &emojis[1229]; + case 0xD83CDDEEU: return &emojis[1230]; + case 0xD83CDDF1U: return &emojis[1231]; + case 0xD83CDDF4U: return &emojis[1232]; + case 0xD83CDDF5U: return &emojis[1233]; + case 0xD83CDDF7U: return &emojis[1234]; + case 0xD83CDDFAU: return &emojis[1235]; + case 0xD83CDDFFU: return &emojis[1236]; + default: return 0; + } break; + case 0xD83CDDF4U: switch (code2) { + case 0xD83CDDF2U: return &emojis[1237]; default: return 0; } break; case 0xD83CDDF5U: switch (code2) { - case 0xD83CDDEDU: return &emojis[903]; - case 0xD83CDDF1U: return &emojis[904]; - case 0xD83CDDF7U: return &emojis[905]; - case 0xD83CDDF9U: return &emojis[906]; + case 0xD83CDDE6U: return &emojis[1238]; + case 0xD83CDDEAU: return &emojis[1239]; + case 0xD83CDDEBU: return &emojis[1240]; + case 0xD83CDDECU: return &emojis[1241]; + case 0xD83CDDEDU: return &emojis[1242]; + case 0xD83CDDF0U: return &emojis[1243]; + case 0xD83CDDF1U: return &emojis[1244]; + case 0xD83CDDF2U: return &emojis[1245]; + case 0xD83CDDF3U: return &emojis[1246]; + case 0xD83CDDF7U: return &emojis[1247]; + case 0xD83CDDF8U: return &emojis[1248]; + case 0xD83CDDF9U: return &emojis[1249]; + case 0xD83CDDFCU: return &emojis[1250]; + case 0xD83CDDFEU: return &emojis[1251]; + default: return 0; + } break; + case 0xD83CDDF6U: switch (code2) { + case 0xD83CDDE6U: return &emojis[1252]; default: return 0; } break; case 0xD83CDDF7U: switch (code2) { - case 0xD83CDDFAU: return &emojis[907]; + case 0xD83CDDEAU: return &emojis[1253]; + case 0xD83CDDF4U: return &emojis[1254]; + case 0xD83CDDF8U: return &emojis[1255]; + case 0xD83CDDFAU: return &emojis[1256]; + case 0xD83CDDFCU: return &emojis[1257]; default: return 0; } break; case 0xD83CDDF8U: switch (code2) { - case 0xD83CDDE6U: return &emojis[908]; - case 0xD83CDDEAU: return &emojis[909]; - case 0xD83CDDECU: return &emojis[910]; + case 0xD83CDDE6U: return &emojis[1258]; + case 0xD83CDDE7U: return &emojis[1259]; + case 0xD83CDDE8U: return &emojis[1260]; + case 0xD83CDDE9U: return &emojis[1261]; + case 0xD83CDDEAU: return &emojis[1262]; + case 0xD83CDDECU: return &emojis[1263]; + case 0xD83CDDEDU: return &emojis[1264]; + case 0xD83CDDEEU: return &emojis[1265]; + case 0xD83CDDF0U: return &emojis[1266]; + case 0xD83CDDF1U: return &emojis[1267]; + case 0xD83CDDF2U: return &emojis[1268]; + case 0xD83CDDF3U: return &emojis[1269]; + case 0xD83CDDF4U: return &emojis[1270]; + case 0xD83CDDF7U: return &emojis[1271]; + case 0xD83CDDF8U: return &emojis[1272]; + case 0xD83CDDF9U: return &emojis[1273]; + case 0xD83CDDFBU: return &emojis[1274]; + case 0xD83CDDFDU: return &emojis[1275]; + case 0xD83CDDFEU: return &emojis[1276]; + case 0xD83CDDFFU: return &emojis[1277]; default: return 0; } break; case 0xD83CDDF9U: switch (code2) { - case 0xD83CDDF7U: return &emojis[911]; + case 0xD83CDDE8U: return &emojis[1278]; + case 0xD83CDDE9U: return &emojis[1279]; + case 0xD83CDDEBU: return &emojis[1280]; + case 0xD83CDDECU: return &emojis[1281]; + case 0xD83CDDEDU: return &emojis[1282]; + case 0xD83CDDEFU: return &emojis[1283]; + case 0xD83CDDF0U: return &emojis[1284]; + case 0xD83CDDF1U: return &emojis[1285]; + case 0xD83CDDF2U: return &emojis[1286]; + case 0xD83CDDF3U: return &emojis[1287]; + case 0xD83CDDF4U: return &emojis[1288]; + case 0xD83CDDF7U: return &emojis[1289]; + case 0xD83CDDF9U: return &emojis[1290]; + case 0xD83CDDFBU: return &emojis[1291]; + case 0xD83CDDFCU: return &emojis[1292]; + case 0xD83CDDFFU: return &emojis[1293]; default: return 0; } break; case 0xD83CDDFAU: switch (code2) { - case 0xD83CDDF8U: return &emojis[912]; + case 0xD83CDDE6U: return &emojis[1294]; + case 0xD83CDDECU: return &emojis[1295]; + case 0xD83CDDF8U: return &emojis[1296]; + case 0xD83CDDFEU: return &emojis[1297]; + case 0xD83CDDFFU: return &emojis[1298]; default: return 0; } break; case 0xD83CDDFBU: switch (code2) { - case 0xD83CDDF3U: return &emojis[913]; + case 0xD83CDDE6U: return &emojis[1299]; + case 0xD83CDDE8U: return &emojis[1300]; + case 0xD83CDDEAU: return &emojis[1301]; + case 0xD83CDDECU: return &emojis[1302]; + case 0xD83CDDEEU: return &emojis[1303]; + case 0xD83CDDF3U: return &emojis[1304]; + case 0xD83CDDFAU: return &emojis[1305]; + default: return 0; + } break; + case 0xD83CDDFCU: switch (code2) { + case 0xD83CDDEBU: return &emojis[1306]; + case 0xD83CDDF8U: return &emojis[1307]; + default: return 0; + } break; + case 0xD83CDDFDU: switch (code2) { + case 0xD83CDDF0U: return &emojis[1308]; + default: return 0; + } break; + case 0xD83CDDFEU: switch (code2) { + case 0xD83CDDEAU: return &emojis[1309]; + case 0xD83CDDF9U: return &emojis[1310]; default: return 0; } break; case 0xD83CDDFFU: switch (code2) { - case 0xD83CDDE6U: return &emojis[914]; + case 0xD83CDDE6U: return &emojis[1311]; + case 0xD83CDDF2U: return &emojis[1312]; + case 0xD83CDDFCU: return &emojis[1313]; default: return 0; } break; } @@ -2269,7 +3106,14 @@ EmojiPtr emojiGet(EmojiPtr emoji, uint32 color) { } EmojiPtr emojiGet(const QChar *from, const QChar *end) { - static const int sequenceOffset = 835; + static const int sequenceOffset = 1018; + + if (from + 4 < end && (from + 2)->unicode() == 0x200D) { + uint32 one = (uint32(from->unicode()) << 16) | uint32((from + 1)->unicode()), two = (uint32((from + 3)->unicode()) << 16) | uint32((from + 4)->unicode()); + if (one == 0xD83DDC41 && two == 0xD83DDDE8) { + return &emojis[sequenceOffset + 18]; + } + } if (end < from + 8 || (from + 2)->unicode() != 0x200D || (from + 5)->unicode() != 0x200D) return 0; @@ -2335,7 +3179,7 @@ EmojiPtr emojiGet(const QChar *from, const QChar *end) { QString emojiGetSequence(int index) { static QVector sequences; if (sequences.isEmpty()) { - sequences.reserve(18); + sequences.reserve(19); sequences.push_back(QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7")); sequences.push_back(QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7\xe2\x80\x8d\xf0\x9f\x91\xa6")); @@ -2355,6 +3199,7 @@ QString emojiGetSequence(int index) { sequences.push_back(QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f\x91\xa8")); sequences.push_back(QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f\x92\x8b\xe2\x80\x8d\xf0\x9f\x91\xa9")); sequences.push_back(QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f\x92\x8b\xe2\x80\x8d\xf0\x9f\x91\xa8")); + sequences.push_back(QString::fromUtf8("\xf0\x9f\x91\x81\xe2\x80\x8d\xf0\x9f\x97\xa8")); } return (index >= 0 && index < sequences.size()) ? sequences.at(index) : QString(); @@ -2800,14 +3645,14 @@ void emojiFind(const QChar *ch, const QChar *e, const QChar *&newEmojiEnd, uint3 int emojiPackCount(DBIEmojiTab tab) { switch (tab) { - case dbietRecent : return cGetRecentEmojis().size(); - case dbietPeople : return 153; - case dbietNature : return 125; - case dbietFood : return 58; - case dbietCelebration: return 39; - case dbietActivity : return 53; - case dbietTravel : return 122; - case dbietObjects : return 345; + case dbietRecent : return cGetRecentEmojis().size(); + case dbietPeople : return 204; + case dbietNature : return 147; + case dbietFood : return 67; + case dbietActivity: return 57; + case dbietTravel : return 115; + case dbietObjects : return 178; + case dbietSymbols : return 516; }; return 0; } @@ -2818,160 +3663,211 @@ EmojiPack emojiPack(DBIEmojiTab tab) { case dbietPeople: { static QVector vPeople; if (vPeople.isEmpty()) { - vPeople.resize(153); - vPeople[0] = &emojis[689]; - vPeople[1] = &emojis[690]; - vPeople[2] = &emojis[691]; - vPeople[3] = &emojis[692]; - vPeople[4] = &emojis[693]; - vPeople[5] = &emojis[694]; - vPeople[6] = &emojis[695]; - vPeople[7] = &emojis[696]; - vPeople[8] = &emojis[697]; - vPeople[9] = &emojis[473]; - vPeople[10] = &emojis[698]; - vPeople[11] = &emojis[699]; - vPeople[12] = &emojis[38]; - vPeople[13] = &emojis[700]; - vPeople[14] = &emojis[701]; - vPeople[15] = &emojis[702]; - vPeople[16] = &emojis[703]; - vPeople[17] = &emojis[704]; - vPeople[18] = &emojis[705]; - vPeople[19] = &emojis[706]; - vPeople[20] = &emojis[707]; - vPeople[21] = &emojis[708]; - vPeople[22] = &emojis[709]; - vPeople[23] = &emojis[710]; - vPeople[24] = &emojis[711]; - vPeople[25] = &emojis[712]; - vPeople[26] = &emojis[713]; - vPeople[27] = &emojis[714]; - vPeople[28] = &emojis[715]; - vPeople[29] = &emojis[716]; - vPeople[30] = &emojis[717]; - vPeople[31] = &emojis[718]; - vPeople[32] = &emojis[719]; - vPeople[33] = &emojis[720]; - vPeople[34] = &emojis[721]; - vPeople[35] = &emojis[722]; - vPeople[36] = &emojis[723]; - vPeople[37] = &emojis[724]; - vPeople[38] = &emojis[725]; - vPeople[39] = &emojis[726]; - vPeople[40] = &emojis[727]; - vPeople[41] = &emojis[728]; - vPeople[42] = &emojis[729]; - vPeople[43] = &emojis[730]; - vPeople[44] = &emojis[731]; - vPeople[45] = &emojis[732]; - vPeople[46] = &emojis[733]; - vPeople[47] = &emojis[734]; - vPeople[48] = &emojis[735]; - vPeople[49] = &emojis[736]; - vPeople[50] = &emojis[737]; - vPeople[51] = &emojis[738]; - vPeople[52] = &emojis[739]; - vPeople[53] = &emojis[740]; - vPeople[54] = &emojis[741]; - vPeople[55] = &emojis[742]; - vPeople[56] = &emojis[743]; - vPeople[57] = &emojis[744]; - vPeople[58] = &emojis[745]; - vPeople[59] = &emojis[746]; - vPeople[60] = &emojis[747]; - vPeople[61] = &emojis[748]; - vPeople[62] = &emojis[749]; - vPeople[63] = &emojis[750]; - vPeople[64] = &emojis[751]; - vPeople[65] = &emojis[752]; - vPeople[66] = &emojis[753]; - vPeople[67] = &emojis[445]; - vPeople[68] = &emojis[446]; - vPeople[69] = &emojis[447]; - vPeople[70] = &emojis[464]; - vPeople[71] = &emojis[448]; - vPeople[72] = &emojis[449]; - vPeople[73] = &emojis[450]; - vPeople[74] = &emojis[451]; - vPeople[75] = &emojis[452]; - vPeople[76] = &emojis[835]; - vPeople[77] = &emojis[836]; - vPeople[78] = &emojis[837]; - vPeople[79] = &emojis[838]; - vPeople[80] = &emojis[839]; - vPeople[81] = &emojis[840]; - vPeople[82] = &emojis[841]; - vPeople[83] = &emojis[842]; - vPeople[84] = &emojis[843]; - vPeople[85] = &emojis[844]; - vPeople[86] = &emojis[845]; - vPeople[87] = &emojis[846]; - vPeople[88] = &emojis[847]; - vPeople[89] = &emojis[848]; - vPeople[90] = &emojis[453]; - vPeople[91] = &emojis[454]; - vPeople[92] = &emojis[455]; - vPeople[93] = &emojis[457]; - vPeople[94] = &emojis[458]; - vPeople[95] = &emojis[459]; - vPeople[96] = &emojis[460]; - vPeople[97] = &emojis[461]; - vPeople[98] = &emojis[462]; - vPeople[99] = &emojis[463]; - vPeople[100] = &emojis[456]; - vPeople[101] = &emojis[465]; - vPeople[102] = &emojis[466]; - vPeople[103] = &emojis[476]; - vPeople[104] = &emojis[470]; - vPeople[105] = &emojis[274]; - vPeople[106] = &emojis[469]; - vPeople[107] = &emojis[467]; - vPeople[108] = &emojis[468]; - vPeople[109] = &emojis[515]; - vPeople[110] = &emojis[474]; - vPeople[111] = &emojis[471]; - vPeople[112] = &emojis[472]; - vPeople[113] = &emojis[756]; - vPeople[114] = &emojis[475]; - vPeople[115] = &emojis[754]; - vPeople[116] = &emojis[755]; - vPeople[117] = &emojis[760]; - vPeople[118] = &emojis[763]; - vPeople[119] = &emojis[762]; - vPeople[120] = &emojis[480]; - vPeople[121] = &emojis[481]; - vPeople[122] = &emojis[491]; - vPeople[123] = &emojis[849]; - vPeople[124] = &emojis[850]; - vPeople[125] = &emojis[489]; - vPeople[126] = &emojis[851]; - vPeople[127] = &emojis[852]; - vPeople[128] = &emojis[761]; - vPeople[129] = &emojis[425]; - vPeople[130] = &emojis[412]; - vPeople[131] = &emojis[411]; - vPeople[132] = &emojis[413]; - vPeople[133] = &emojis[414]; - vPeople[134] = &emojis[485]; - vPeople[135] = &emojis[415]; - vPeople[136] = &emojis[479]; - vPeople[137] = &emojis[421]; - vPeople[138] = &emojis[423]; - vPeople[139] = &emojis[424]; - vPeople[140] = &emojis[37]; - vPeople[141] = &emojis[416]; - vPeople[142] = &emojis[417]; - vPeople[143] = &emojis[418]; - vPeople[144] = &emojis[419]; - vPeople[145] = &emojis[422]; - vPeople[146] = &emojis[81]; - vPeople[147] = &emojis[420]; - vPeople[148] = &emojis[79]; - vPeople[149] = &emojis[80]; - vPeople[150] = &emojis[516]; - vPeople[151] = &emojis[426]; - vPeople[152] = &emojis[764]; + vPeople.resize(204); + vPeople[0] = &emojis[836]; + vPeople[1] = &emojis[880]; + vPeople[2] = &emojis[837]; + vPeople[3] = &emojis[838]; + vPeople[4] = &emojis[839]; + vPeople[5] = &emojis[840]; + vPeople[6] = &emojis[841]; + vPeople[7] = &emojis[842]; + vPeople[8] = &emojis[843]; + vPeople[9] = &emojis[845]; + vPeople[10] = &emojis[846]; + vPeople[11] = &emojis[902]; + vPeople[12] = &emojis[903]; + vPeople[13] = &emojis[60]; + vPeople[14] = &emojis[847]; + vPeople[15] = &emojis[848]; + vPeople[16] = &emojis[849]; + vPeople[17] = &emojis[860]; + vPeople[18] = &emojis[859]; + vPeople[19] = &emojis[861]; + vPeople[20] = &emojis[862]; + vPeople[21] = &emojis[864]; + vPeople[22] = &emojis[865]; + vPeople[23] = &emojis[863]; + vPeople[24] = &emojis[1004]; + vPeople[25] = &emojis[1006]; + vPeople[26] = &emojis[850]; + vPeople[27] = &emojis[1010]; + vPeople[28] = &emojis[851]; + vPeople[29] = &emojis[890]; + vPeople[30] = &emojis[852]; + vPeople[31] = &emojis[853]; + vPeople[32] = &emojis[854]; + vPeople[33] = &emojis[904]; + vPeople[34] = &emojis[1007]; + vPeople[35] = &emojis[887]; + vPeople[36] = &emojis[866]; + vPeople[37] = &emojis[867]; + vPeople[38] = &emojis[868]; + vPeople[39] = &emojis[869]; + vPeople[40] = &emojis[856]; + vPeople[41] = &emojis[857]; + vPeople[42] = &emojis[901]; + vPeople[43] = &emojis[59]; + vPeople[44] = &emojis[871]; + vPeople[45] = &emojis[858]; + vPeople[46] = &emojis[879]; + vPeople[47] = &emojis[877]; + vPeople[48] = &emojis[872]; + vPeople[49] = &emojis[882]; + vPeople[50] = &emojis[885]; + vPeople[51] = &emojis[876]; + vPeople[52] = &emojis[884]; + vPeople[53] = &emojis[883]; + vPeople[54] = &emojis[874]; + vPeople[55] = &emojis[875]; + vPeople[56] = &emojis[870]; + vPeople[57] = &emojis[873]; + vPeople[58] = &emojis[878]; + vPeople[59] = &emojis[855]; + vPeople[60] = &emojis[881]; + vPeople[61] = &emojis[889]; + vPeople[62] = &emojis[886]; + vPeople[63] = &emojis[1003]; + vPeople[64] = &emojis[891]; + vPeople[65] = &emojis[1005]; + vPeople[66] = &emojis[1008]; + vPeople[67] = &emojis[888]; + vPeople[68] = &emojis[612]; + vPeople[69] = &emojis[617]; + vPeople[70] = &emojis[844]; + vPeople[71] = &emojis[575]; + vPeople[72] = &emojis[569]; + vPeople[73] = &emojis[570]; + vPeople[74] = &emojis[576]; + vPeople[75] = &emojis[571]; + vPeople[76] = &emojis[573]; + vPeople[77] = &emojis[1009]; + vPeople[78] = &emojis[894]; + vPeople[79] = &emojis[892]; + vPeople[80] = &emojis[893]; + vPeople[81] = &emojis[895]; + vPeople[82] = &emojis[896]; + vPeople[83] = &emojis[897]; + vPeople[84] = &emojis[900]; + vPeople[85] = &emojis[899]; + vPeople[86] = &emojis[898]; + vPeople[87] = &emojis[912]; + vPeople[88] = &emojis[527]; + vPeople[89] = &emojis[523]; + vPeople[90] = &emojis[525]; + vPeople[91] = &emojis[526]; + vPeople[92] = &emojis[522]; + vPeople[93] = &emojis[121]; + vPeople[94] = &emojis[123]; + vPeople[95] = &emojis[524]; + vPeople[96] = &emojis[122]; + vPeople[97] = &emojis[528]; + vPeople[98] = &emojis[618]; + vPeople[99] = &emojis[915]; + vPeople[100] = &emojis[50]; + vPeople[101] = &emojis[518]; + vPeople[102] = &emojis[519]; + vPeople[103] = &emojis[520]; + vPeople[104] = &emojis[521]; + vPeople[105] = &emojis[810]; + vPeople[106] = &emojis[809]; + vPeople[107] = &emojis[1011]; + vPeople[108] = &emojis[811]; + vPeople[109] = &emojis[124]; + vPeople[110] = &emojis[581]; + vPeople[111] = &emojis[516]; + vPeople[112] = &emojis[517]; + vPeople[113] = &emojis[514]; + vPeople[114] = &emojis[515]; + vPeople[115] = &emojis[513]; + vPeople[116] = &emojis[512]; + vPeople[117] = &emojis[548]; + vPeople[118] = &emojis[549]; + vPeople[119] = &emojis[827]; + vPeople[120] = &emojis[566]; + vPeople[121] = &emojis[550]; + vPeople[122] = &emojis[551]; + vPeople[123] = &emojis[552]; + vPeople[124] = &emojis[553]; + vPeople[125] = &emojis[561]; + vPeople[126] = &emojis[564]; + vPeople[127] = &emojis[565]; + vPeople[128] = &emojis[562]; + vPeople[129] = &emojis[563]; + vPeople[130] = &emojis[558]; + vPeople[131] = &emojis[567]; + vPeople[132] = &emojis[578]; + vPeople[133] = &emojis[799]; + vPeople[134] = &emojis[338]; + vPeople[135] = &emojis[572]; + vPeople[136] = &emojis[568]; + vPeople[137] = &emojis[560]; + vPeople[138] = &emojis[970]; + vPeople[139] = &emojis[395]; + vPeople[140] = &emojis[579]; + vPeople[141] = &emojis[559]; + vPeople[142] = &emojis[555]; + vPeople[143] = &emojis[556]; + vPeople[144] = &emojis[557]; + vPeople[145] = &emojis[907]; + vPeople[146] = &emojis[577]; + vPeople[147] = &emojis[905]; + vPeople[148] = &emojis[906]; + vPeople[149] = &emojis[911]; + vPeople[150] = &emojis[914]; + vPeople[151] = &emojis[913]; + vPeople[152] = &emojis[583]; + vPeople[153] = &emojis[582]; + vPeople[154] = &emojis[593]; + vPeople[155] = &emojis[1032]; + vPeople[156] = &emojis[1033]; + vPeople[157] = &emojis[591]; + vPeople[158] = &emojis[1034]; + vPeople[159] = &emojis[1035]; + vPeople[160] = &emojis[554]; + vPeople[161] = &emojis[1018]; + vPeople[162] = &emojis[1019]; + vPeople[163] = &emojis[1020]; + vPeople[164] = &emojis[1021]; + vPeople[165] = &emojis[1022]; + vPeople[166] = &emojis[1023]; + vPeople[167] = &emojis[1024]; + vPeople[168] = &emojis[1025]; + vPeople[169] = &emojis[1026]; + vPeople[170] = &emojis[1027]; + vPeople[171] = &emojis[1028]; + vPeople[172] = &emojis[1029]; + vPeople[173] = &emojis[1030]; + vPeople[174] = &emojis[1031]; + vPeople[175] = &emojis[538]; + vPeople[176] = &emojis[533]; + vPeople[177] = &emojis[534]; + vPeople[178] = &emojis[532]; + vPeople[179] = &emojis[535]; + vPeople[180] = &emojis[537]; + vPeople[181] = &emojis[536]; + vPeople[182] = &emojis[580]; + vPeople[183] = &emojis[587]; + vPeople[184] = &emojis[547]; + vPeople[185] = &emojis[544]; + vPeople[186] = &emojis[545]; + vPeople[187] = &emojis[546]; + vPeople[188] = &emojis[542]; + vPeople[189] = &emojis[543]; + vPeople[190] = &emojis[530]; + vPeople[191] = &emojis[369]; + vPeople[192] = &emojis[352]; + vPeople[193] = &emojis[529]; + vPeople[194] = &emojis[101]; + vPeople[195] = &emojis[351]; + vPeople[196] = &emojis[541]; + vPeople[197] = &emojis[539]; + vPeople[198] = &emojis[540]; + vPeople[199] = &emojis[636]; + vPeople[200] = &emojis[531]; + vPeople[201] = &emojis[800]; + vPeople[202] = &emojis[589]; + vPeople[203] = &emojis[209]; } return vPeople; } break; @@ -2979,132 +3875,154 @@ EmojiPack emojiPack(DBIEmojiTab tab) { case dbietNature: { static QVector vNature; if (vNature.isEmpty()) { - vNature.resize(125); - vNature[0] = &emojis[194]; - vNature[1] = &emojis[195]; - vNature[2] = &emojis[196]; - vNature[3] = &emojis[197]; - vNature[4] = &emojis[198]; - vNature[5] = &emojis[199]; - vNature[6] = &emojis[200]; - vNature[7] = &emojis[201]; - vNature[8] = &emojis[202]; - vNature[9] = &emojis[203]; - vNature[10] = &emojis[204]; - vNature[11] = &emojis[490]; - vNature[12] = &emojis[206]; - vNature[13] = &emojis[207]; - vNature[14] = &emojis[208]; - vNature[15] = &emojis[209]; - vNature[16] = &emojis[210]; - vNature[17] = &emojis[211]; - vNature[18] = &emojis[212]; - vNature[19] = &emojis[193]; - vNature[20] = &emojis[348]; - vNature[21] = &emojis[349]; - vNature[22] = &emojis[393]; - vNature[23] = &emojis[405]; - vNature[24] = &emojis[350]; - vNature[25] = &emojis[351]; - vNature[26] = &emojis[352]; - vNature[27] = &emojis[394]; - vNature[28] = &emojis[353]; - vNature[29] = &emojis[354]; - vNature[30] = &emojis[395]; - vNature[31] = &emojis[355]; - vNature[32] = &emojis[396]; - vNature[33] = &emojis[356]; - vNature[34] = &emojis[397]; - vNature[35] = &emojis[362]; - vNature[36] = &emojis[400]; - vNature[37] = &emojis[363]; - vNature[38] = &emojis[365]; - vNature[39] = &emojis[364]; - vNature[40] = &emojis[367]; - vNature[41] = &emojis[368]; - vNature[42] = &emojis[384]; - vNature[43] = &emojis[383]; - vNature[44] = &emojis[385]; - vNature[45] = &emojis[386]; - vNature[46] = &emojis[387]; - vNature[47] = &emojis[372]; - vNature[48] = &emojis[390]; - vNature[49] = &emojis[391]; - vNature[50] = &emojis[371]; - vNature[51] = &emojis[370]; - vNature[52] = &emojis[403]; - vNature[53] = &emojis[409]; - vNature[54] = &emojis[369]; - vNature[55] = &emojis[389]; - vNature[56] = &emojis[402]; - vNature[57] = &emojis[406]; - vNature[58] = &emojis[407]; - vNature[59] = &emojis[388]; - vNature[60] = &emojis[408]; - vNature[61] = &emojis[401]; - vNature[62] = &emojis[757]; - vNature[63] = &emojis[758]; - vNature[64] = &emojis[759]; - vNature[65] = &emojis[366]; - vNature[66] = &emojis[357]; - vNature[67] = &emojis[398]; - vNature[68] = &emojis[358]; - vNature[69] = &emojis[361]; - vNature[70] = &emojis[382]; - vNature[71] = &emojis[404]; - vNature[72] = &emojis[359]; - vNature[73] = &emojis[399]; - vNature[74] = &emojis[392]; - vNature[75] = &emojis[373]; - vNature[76] = &emojis[379]; - vNature[77] = &emojis[380]; - vNature[78] = &emojis[381]; - vNature[79] = &emojis[374]; - vNature[80] = &emojis[360]; - vNature[81] = &emojis[375]; - vNature[82] = &emojis[376]; - vNature[83] = &emojis[377]; - vNature[84] = &emojis[378]; - vNature[85] = &emojis[410]; - vNature[86] = &emojis[60]; - vNature[87] = &emojis[635]; - vNature[88] = &emojis[185]; - vNature[89] = &emojis[31]; - vNature[90] = &emojis[66]; - vNature[91] = &emojis[32]; - vNature[92] = &emojis[513]; - vNature[93] = &emojis[512]; - vNature[94] = &emojis[35]; - vNature[95] = &emojis[514]; - vNature[96] = &emojis[89]; - vNature[97] = &emojis[191]; - vNature[98] = &emojis[111]; - vNature[99] = &emojis[192]; - vNature[100] = &emojis[164]; - vNature[101] = &emojis[165]; - vNature[102] = &emojis[168]; - vNature[103] = &emojis[170]; - vNature[104] = &emojis[171]; - vNature[105] = &emojis[172]; - vNature[106] = &emojis[684]; - vNature[107] = &emojis[687]; - vNature[108] = &emojis[176]; - vNature[109] = &emojis[173]; - vNature[110] = &emojis[174]; - vNature[111] = &emojis[175]; - vNature[112] = &emojis[177]; - vNature[113] = &emojis[178]; - vNature[114] = &emojis[179]; - vNature[115] = &emojis[180]; - vNature[116] = &emojis[181]; - vNature[117] = &emojis[182]; - vNature[118] = &emojis[183]; - vNature[119] = &emojis[184]; - vNature[120] = &emojis[186]; - vNature[121] = &emojis[189]; - vNature[122] = &emojis[187]; - vNature[123] = &emojis[188]; - vNature[124] = &emojis[190]; + vNature.resize(147); + vNature[0] = &emojis[502]; + vNature[1] = &emojis[497]; + vNature[2] = &emojis[493]; + vNature[3] = &emojis[505]; + vNature[4] = &emojis[496]; + vNature[5] = &emojis[507]; + vNature[6] = &emojis[508]; + vNature[7] = &emojis[488]; + vNature[8] = &emojis[495]; + vNature[9] = &emojis[1013]; + vNature[10] = &emojis[494]; + vNature[11] = &emojis[503]; + vNature[12] = &emojis[509]; + vNature[13] = &emojis[504]; + vNature[14] = &emojis[473]; + vNature[15] = &emojis[501]; + vNature[16] = &emojis[908]; + vNature[17] = &emojis[909]; + vNature[18] = &emojis[910]; + vNature[19] = &emojis[466]; + vNature[20] = &emojis[468]; + vNature[21] = &emojis[487]; + vNature[22] = &emojis[486]; + vNature[23] = &emojis[484]; + vNature[24] = &emojis[483]; + vNature[25] = &emojis[485]; + vNature[26] = &emojis[506]; + vNature[27] = &emojis[471]; + vNature[28] = &emojis[500]; + vNature[29] = &emojis[1016]; + vNature[30] = &emojis[477]; + vNature[31] = &emojis[475]; + vNature[32] = &emojis[460]; + vNature[33] = &emojis[478]; + vNature[34] = &emojis[476]; + vNature[35] = &emojis[801]; + vNature[36] = &emojis[1014]; + vNature[37] = &emojis[1012]; + vNature[38] = &emojis[461]; + vNature[39] = &emojis[482]; + vNature[40] = &emojis[480]; + vNature[41] = &emojis[479]; + vNature[42] = &emojis[481]; + vNature[43] = &emojis[492]; + vNature[44] = &emojis[499]; + vNature[45] = &emojis[459]; + vNature[46] = &emojis[458]; + vNature[47] = &emojis[454]; + vNature[48] = &emojis[453]; + vNature[49] = &emojis[451]; + vNature[50] = &emojis[450]; + vNature[51] = &emojis[452]; + vNature[52] = &emojis[490]; + vNature[53] = &emojis[491]; + vNature[54] = &emojis[472]; + vNature[55] = &emojis[464]; + vNature[56] = &emojis[463]; + vNature[57] = &emojis[465]; + vNature[58] = &emojis[462]; + vNature[59] = &emojis[470]; + vNature[60] = &emojis[448]; + vNature[61] = &emojis[449]; + vNature[62] = &emojis[467]; + vNature[63] = &emojis[1015]; + vNature[64] = &emojis[766]; + vNature[65] = &emojis[469]; + vNature[66] = &emojis[489]; + vNature[67] = &emojis[456]; + vNature[68] = &emojis[455]; + vNature[69] = &emojis[511]; + vNature[70] = &emojis[510]; + vNature[71] = &emojis[457]; + vNature[72] = &emojis[498]; + vNature[73] = &emojis[258]; + vNature[74] = &emojis[337]; + vNature[75] = &emojis[255]; + vNature[76] = &emojis[256]; + vNature[77] = &emojis[257]; + vNature[78] = &emojis[254]; + vNature[79] = &emojis[268]; + vNature[80] = &emojis[49]; + vNature[81] = &emojis[269]; + vNature[82] = &emojis[346]; + vNature[83] = &emojis[344]; + vNature[84] = &emojis[272]; + vNature[85] = &emojis[271]; + vNature[86] = &emojis[270]; + vNature[87] = &emojis[267]; + vNature[88] = &emojis[263]; + vNature[89] = &emojis[264]; + vNature[90] = &emojis[262]; + vNature[91] = &emojis[260]; + vNature[92] = &emojis[265]; + vNature[93] = &emojis[261]; + vNature[94] = &emojis[592]; + vNature[95] = &emojis[273]; + vNature[96] = &emojis[253]; + vNature[97] = &emojis[336]; + vNature[98] = &emojis[474]; + vNature[99] = &emojis[802]; + vNature[100] = &emojis[221]; + vNature[101] = &emojis[220]; + vNature[102] = &emojis[222]; + vNature[103] = &emojis[228]; + vNature[104] = &emojis[229]; + vNature[105] = &emojis[230]; + vNature[106] = &emojis[231]; + vNature[107] = &emojis[224]; + vNature[108] = &emojis[225]; + vNature[109] = &emojis[226]; + vNature[110] = &emojis[227]; + vNature[111] = &emojis[233]; + vNature[112] = &emojis[236]; + vNature[113] = &emojis[234]; + vNature[114] = &emojis[235]; + vNature[115] = &emojis[237]; + vNature[116] = &emojis[232]; + vNature[117] = &emojis[157]; + vNature[118] = &emojis[238]; + vNature[119] = &emojis[619]; + vNature[120] = &emojis[131]; + vNature[121] = &emojis[44]; + vNature[122] = &emojis[40]; + vNature[123] = &emojis[241]; + vNature[124] = &emojis[97]; + vNature[125] = &emojis[242]; + vNature[126] = &emojis[243]; + vNature[127] = &emojis[41]; + vNature[128] = &emojis[244]; + vNature[129] = &emojis[98]; + vNature[130] = &emojis[246]; + vNature[131] = &emojis[89]; + vNature[132] = &emojis[740]; + vNature[133] = &emojis[613]; + vNature[134] = &emojis[134]; + vNature[135] = &emojis[245]; + vNature[136] = &emojis[43]; + vNature[137] = &emojis[96]; + vNature[138] = &emojis[249]; + vNature[139] = &emojis[616]; + vNature[140] = &emojis[247]; + vNature[141] = &emojis[248]; + vNature[142] = &emojis[42]; + vNature[143] = &emojis[47]; + vNature[144] = &emojis[615]; + vNature[145] = &emojis[614]; + vNature[146] = &emojis[217]; } return vNature; } break; @@ -3112,173 +4030,139 @@ EmojiPack emojiPack(DBIEmojiTab tab) { case dbietFood: { static QVector vFood; if (vFood.isEmpty()) { - vFood.resize(58); - vFood[0] = &emojis[213]; - vFood[1] = &emojis[214]; - vFood[2] = &emojis[205]; - vFood[3] = &emojis[240]; - vFood[4] = &emojis[215]; - vFood[5] = &emojis[216]; - vFood[6] = &emojis[217]; - vFood[7] = &emojis[218]; - vFood[8] = &emojis[219]; - vFood[9] = &emojis[220]; - vFood[10] = &emojis[221]; - vFood[11] = &emojis[222]; - vFood[12] = &emojis[223]; - vFood[13] = &emojis[224]; - vFood[14] = &emojis[225]; - vFood[15] = &emojis[226]; - vFood[16] = &emojis[227]; - vFood[17] = &emojis[228]; - vFood[18] = &emojis[229]; - vFood[19] = &emojis[230]; - vFood[20] = &emojis[231]; - vFood[21] = &emojis[232]; - vFood[22] = &emojis[233]; - vFood[23] = &emojis[234]; - vFood[24] = &emojis[235]; - vFood[25] = &emojis[236]; - vFood[26] = &emojis[237]; - vFood[27] = &emojis[238]; - vFood[28] = &emojis[239]; - vFood[29] = &emojis[241]; - vFood[30] = &emojis[242]; - vFood[31] = &emojis[243]; - vFood[32] = &emojis[244]; - vFood[33] = &emojis[245]; - vFood[34] = &emojis[246]; - vFood[35] = &emojis[247]; - vFood[36] = &emojis[248]; - vFood[37] = &emojis[249]; - vFood[38] = &emojis[250]; - vFood[39] = &emojis[251]; - vFood[40] = &emojis[252]; - vFood[41] = &emojis[253]; - vFood[42] = &emojis[254]; - vFood[43] = &emojis[255]; - vFood[44] = &emojis[256]; - vFood[45] = &emojis[257]; - vFood[46] = &emojis[258]; - vFood[47] = &emojis[259]; - vFood[48] = &emojis[260]; - vFood[49] = &emojis[261]; - vFood[50] = &emojis[36]; - vFood[51] = &emojis[262]; - vFood[52] = &emojis[263]; - vFood[53] = &emojis[264]; - vFood[54] = &emojis[265]; - vFood[55] = &emojis[266]; - vFood[56] = &emojis[267]; - vFood[57] = &emojis[268]; + vFood.resize(67); + vFood[0] = &emojis[284]; + vFood[1] = &emojis[283]; + vFood[2] = &emojis[285]; + vFood[3] = &emojis[279]; + vFood[4] = &emojis[280]; + vFood[5] = &emojis[281]; + vFood[6] = &emojis[278]; + vFood[7] = &emojis[276]; + vFood[8] = &emojis[288]; + vFood[9] = &emojis[277]; + vFood[10] = &emojis[287]; + vFood[11] = &emojis[286]; + vFood[12] = &emojis[282]; + vFood[13] = &emojis[274]; + vFood[14] = &emojis[275]; + vFood[15] = &emojis[259]; + vFood[16] = &emojis[266]; + vFood[17] = &emojis[301]; + vFood[18] = &emojis[316]; + vFood[19] = &emojis[299]; + vFood[20] = &emojis[1017]; + vFood[21] = &emojis[292]; + vFood[22] = &emojis[291]; + vFood[23] = &emojis[305]; + vFood[24] = &emojis[320]; + vFood[25] = &emojis[289]; + vFood[26] = &emojis[300]; + vFood[27] = &emojis[250]; + vFood[28] = &emojis[290]; + vFood[29] = &emojis[298]; + vFood[30] = &emojis[251]; + vFood[31] = &emojis[252]; + vFood[32] = &emojis[297]; + vFood[33] = &emojis[319]; + vFood[34] = &emojis[306]; + vFood[35] = &emojis[304]; + vFood[36] = &emojis[318]; + vFood[37] = &emojis[296]; + vFood[38] = &emojis[294]; + vFood[39] = &emojis[295]; + vFood[40] = &emojis[293]; + vFood[41] = &emojis[303]; + vFood[42] = &emojis[302]; + vFood[43] = &emojis[308]; + vFood[44] = &emojis[309]; + vFood[45] = &emojis[307]; + vFood[46] = &emojis[317]; + vFood[47] = &emojis[335]; + vFood[48] = &emojis[315]; + vFood[49] = &emojis[313]; + vFood[50] = &emojis[314]; + vFood[51] = &emojis[312]; + vFood[52] = &emojis[332]; + vFood[53] = &emojis[310]; + vFood[54] = &emojis[311]; + vFood[55] = &emojis[327]; + vFood[56] = &emojis[328]; + vFood[57] = &emojis[324]; + vFood[58] = &emojis[325]; + vFood[59] = &emojis[326]; + vFood[60] = &emojis[331]; + vFood[61] = &emojis[323]; + vFood[62] = &emojis[322]; + vFood[63] = &emojis[48]; + vFood[64] = &emojis[329]; + vFood[65] = &emojis[321]; + vFood[66] = &emojis[330]; } return vFood; } break; - case dbietCelebration: { - static QVector vCelebration; - if (vCelebration.isEmpty()) { - vCelebration.resize(39); - vCelebration[0] = &emojis[269]; - vCelebration[1] = &emojis[270]; - vCelebration[2] = &emojis[271]; - vCelebration[3] = &emojis[272]; - vCelebration[4] = &emojis[273]; - vCelebration[5] = &emojis[280]; - vCelebration[6] = &emojis[282]; - vCelebration[7] = &emojis[286]; - vCelebration[8] = &emojis[275]; - vCelebration[9] = &emojis[276]; - vCelebration[10] = &emojis[278]; - vCelebration[11] = &emojis[279]; - vCelebration[12] = &emojis[277]; - vCelebration[13] = &emojis[517]; - vCelebration[14] = &emojis[86]; - vCelebration[15] = &emojis[511]; - vCelebration[16] = &emojis[288]; - vCelebration[17] = &emojis[427]; - vCelebration[18] = &emojis[283]; - vCelebration[19] = &emojis[284]; - vCelebration[20] = &emojis[285]; - vCelebration[21] = &emojis[281]; - vCelebration[22] = &emojis[345]; - vCelebration[23] = &emojis[487]; - vCelebration[24] = &emojis[97]; - vCelebration[25] = &emojis[494]; - vCelebration[26] = &emojis[486]; - vCelebration[27] = &emojis[495]; - vCelebration[28] = &emojis[504]; - vCelebration[29] = &emojis[493]; - vCelebration[30] = &emojis[497]; - vCelebration[31] = &emojis[496]; - vCelebration[32] = &emojis[498]; - vCelebration[33] = &emojis[503]; - vCelebration[34] = &emojis[505]; - vCelebration[35] = &emojis[502]; - vCelebration[36] = &emojis[501]; - vCelebration[37] = &emojis[500]; - vCelebration[38] = &emojis[499]; - } - return vCelebration; - } break; - case dbietActivity: { static QVector vActivity; if (vActivity.isEmpty()) { - vActivity.resize(53); - vActivity[0] = &emojis[324]; - vActivity[1] = &emojis[819]; - vActivity[2] = &emojis[477]; - vActivity[3] = &emojis[800]; - vActivity[4] = &emojis[330]; - vActivity[5] = &emojis[325]; - vActivity[6] = &emojis[829]; - vActivity[7] = &emojis[323]; - vActivity[8] = &emojis[320]; - vActivity[9] = &emojis[65]; - vActivity[10] = &emojis[817]; - vActivity[11] = &emojis[818]; - vActivity[12] = &emojis[327]; - vActivity[13] = &emojis[73]; - vActivity[14] = &emojis[292]; - vActivity[15] = &emojis[63]; - vActivity[16] = &emojis[321]; - vActivity[17] = &emojis[328]; - vActivity[18] = &emojis[64]; - vActivity[19] = &emojis[319]; - vActivity[20] = &emojis[329]; - vActivity[21] = &emojis[71]; - vActivity[22] = &emojis[326]; - vActivity[23] = &emojis[318]; - vActivity[24] = &emojis[322]; - vActivity[25] = &emojis[314]; - vActivity[26] = &emojis[313]; - vActivity[27] = &emojis[316]; - vActivity[28] = &emojis[312]; - vActivity[29] = &emojis[315]; - vActivity[30] = &emojis[310]; - vActivity[31] = &emojis[311]; - vActivity[32] = &emojis[317]; - vActivity[33] = &emojis[296]; - vActivity[34] = &emojis[293]; - vActivity[35] = &emojis[302]; - vActivity[36] = &emojis[300]; - vActivity[37] = &emojis[298]; - vActivity[38] = &emojis[299]; - vActivity[39] = &emojis[301]; - vActivity[40] = &emojis[297]; - vActivity[41] = &emojis[304]; - vActivity[42] = &emojis[306]; - vActivity[43] = &emojis[308]; - vActivity[44] = &emojis[305]; - vActivity[45] = &emojis[307]; - vActivity[46] = &emojis[303]; - vActivity[47] = &emojis[309]; - vActivity[48] = &emojis[129]; - vActivity[49] = &emojis[128]; - vActivity[50] = &emojis[289]; - vActivity[51] = &emojis[290]; - vActivity[52] = &emojis[291]; + vActivity.resize(57); + vActivity[0] = &emojis[94]; + vActivity[1] = &emojis[392]; + vActivity[2] = &emojis[400]; + vActivity[3] = &emojis[95]; + vActivity[4] = &emojis[390]; + vActivity[5] = &emojis[408]; + vActivity[6] = &emojis[401]; + vActivity[7] = &emojis[377]; + vActivity[8] = &emojis[109]; + vActivity[9] = &emojis[404]; + vActivity[10] = &emojis[411]; + vActivity[11] = &emojis[445]; + vActivity[12] = &emojis[410]; + vActivity[13] = &emojis[409]; + vActivity[14] = &emojis[407]; + vActivity[15] = &emojis[391]; + vActivity[16] = &emojis[112]; + vActivity[17] = &emojis[394]; + vActivity[18] = &emojis[113]; + vActivity[19] = &emojis[446]; + vActivity[20] = &emojis[363]; + vActivity[21] = &emojis[951]; + vActivity[22] = &emojis[402]; + vActivity[23] = &emojis[396]; + vActivity[24] = &emojis[980]; + vActivity[25] = &emojis[114]; + vActivity[26] = &emojis[403]; + vActivity[27] = &emojis[968]; + vActivity[28] = &emojis[969]; + vActivity[29] = &emojis[399]; + vActivity[30] = &emojis[798]; + vActivity[31] = &emojis[398]; + vActivity[32] = &emojis[389]; + vActivity[33] = &emojis[397]; + vActivity[34] = &emojis[353]; + vActivity[35] = &emojis[354]; + vActivity[36] = &emojis[443]; + vActivity[37] = &emojis[371]; + vActivity[38] = &emojis[359]; + vActivity[39] = &emojis[373]; + vActivity[40] = &emojis[368]; + vActivity[41] = &emojis[370]; + vActivity[42] = &emojis[364]; + vActivity[43] = &emojis[367]; + vActivity[44] = &emojis[388]; + vActivity[45] = &emojis[385]; + vActivity[46] = &emojis[383]; + vActivity[47] = &emojis[386]; + vActivity[48] = &emojis[384]; + vActivity[49] = &emojis[387]; + vActivity[50] = &emojis[372]; + vActivity[51] = &emojis[374]; + vActivity[52] = &emojis[574]; + vActivity[53] = &emojis[375]; + vActivity[54] = &emojis[378]; + vActivity[55] = &emojis[376]; + vActivity[56] = &emojis[379]; } return vActivity; } break; @@ -3286,129 +4170,122 @@ EmojiPack emojiPack(DBIEmojiTab tab) { case dbietTravel: { static QVector vTravel; if (vTravel.isEmpty()) { - vTravel.resize(122); - vTravel[0] = &emojis[768]; - vTravel[1] = &emojis[795]; - vTravel[2] = &emojis[767]; - vTravel[3] = &emojis[776]; - vTravel[4] = &emojis[794]; - vTravel[5] = &emojis[769]; - vTravel[6] = &emojis[770]; - vTravel[7] = &emojis[771]; - vTravel[8] = &emojis[772]; - vTravel[9] = &emojis[773]; - vTravel[10] = &emojis[774]; - vTravel[11] = &emojis[775]; - vTravel[12] = &emojis[777]; - vTravel[13] = &emojis[778]; - vTravel[14] = &emojis[779]; - vTravel[15] = &emojis[781]; - vTravel[16] = &emojis[782]; - vTravel[17] = &emojis[783]; - vTravel[18] = &emojis[784]; - vTravel[19] = &emojis[785]; - vTravel[20] = &emojis[805]; - vTravel[21] = &emojis[786]; - vTravel[22] = &emojis[787]; - vTravel[23] = &emojis[788]; - vTravel[24] = &emojis[789]; - vTravel[25] = &emojis[790]; - vTravel[26] = &emojis[791]; - vTravel[27] = &emojis[792]; - vTravel[28] = &emojis[793]; - vTravel[29] = &emojis[815]; - vTravel[30] = &emojis[780]; - vTravel[31] = &emojis[74]; - vTravel[32] = &emojis[804]; - vTravel[33] = &emojis[803]; - vTravel[34] = &emojis[802]; - vTravel[35] = &emojis[765]; - vTravel[36] = &emojis[766]; - vTravel[37] = &emojis[77]; - vTravel[38] = &emojis[532]; - vTravel[39] = &emojis[58]; - vTravel[40] = &emojis[799]; - vTravel[41] = &emojis[801]; - vTravel[42] = &emojis[72]; - vTravel[43] = &emojis[798]; - vTravel[44] = &emojis[797]; - vTravel[45] = &emojis[796]; - vTravel[46] = &emojis[831]; - vTravel[47] = &emojis[832]; - vTravel[48] = &emojis[833]; - vTravel[49] = &emojis[834]; - vTravel[50] = &emojis[526]; - vTravel[51] = &emojis[528]; - vTravel[52] = &emojis[529]; - vTravel[53] = &emojis[527]; - vTravel[54] = &emojis[686]; - vTravel[55] = &emojis[688]; - vTravel[56] = &emojis[161]; - vTravel[57] = &emojis[685]; - vTravel[58] = &emojis[70]; - vTravel[59] = &emojis[347]; - vTravel[60] = &emojis[346]; - vTravel[61] = &emojis[167]; - vTravel[62] = &emojis[166]; - vTravel[63] = &emojis[163]; - vTravel[64] = &emojis[169]; - vTravel[65] = &emojis[331]; - vTravel[66] = &emojis[332]; - vTravel[67] = &emojis[333]; - vTravel[68] = &emojis[343]; - vTravel[69] = &emojis[344]; - vTravel[70] = &emojis[334]; - vTravel[71] = &emojis[335]; - vTravel[72] = &emojis[336]; - vTravel[73] = &emojis[337]; - vTravel[74] = &emojis[339]; - vTravel[75] = &emojis[340]; - vTravel[76] = &emojis[492]; - vTravel[77] = &emojis[69]; - vTravel[78] = &emojis[341]; - vTravel[79] = &emojis[342]; - vTravel[80] = &emojis[875]; - vTravel[81] = &emojis[874]; - vTravel[82] = &emojis[876]; - vTravel[83] = &emojis[877]; - vTravel[84] = &emojis[878]; - vTravel[85] = &emojis[880]; - vTravel[86] = &emojis[881]; - vTravel[87] = &emojis[882]; - vTravel[88] = &emojis[884]; - vTravel[89] = &emojis[886]; - vTravel[90] = &emojis[887]; - vTravel[91] = &emojis[883]; - vTravel[92] = &emojis[889]; - vTravel[93] = &emojis[893]; - vTravel[94] = &emojis[890]; - vTravel[95] = &emojis[891]; - vTravel[96] = &emojis[892]; - vTravel[97] = &emojis[894]; - vTravel[98] = &emojis[895]; - vTravel[99] = &emojis[896]; - vTravel[100] = &emojis[897]; - vTravel[101] = &emojis[899]; - vTravel[102] = &emojis[898]; - vTravel[103] = &emojis[900]; - vTravel[104] = &emojis[902]; - vTravel[105] = &emojis[901]; - vTravel[106] = &emojis[903]; - vTravel[107] = &emojis[904]; - vTravel[108] = &emojis[906]; - vTravel[109] = &emojis[905]; - vTravel[110] = &emojis[907]; - vTravel[111] = &emojis[908]; - vTravel[112] = &emojis[910]; - vTravel[113] = &emojis[914]; - vTravel[114] = &emojis[885]; - vTravel[115] = &emojis[909]; - vTravel[116] = &emojis[879]; - vTravel[117] = &emojis[911]; - vTravel[118] = &emojis[888]; - vTravel[119] = &emojis[912]; - vTravel[120] = &emojis[873]; - vTravel[121] = &emojis[913]; + vTravel.resize(115); + vTravel[0] = &emojis[939]; + vTravel[1] = &emojis[937]; + vTravel[2] = &emojis[941]; + vTravel[3] = &emojis[928]; + vTravel[4] = &emojis[930]; + vTravel[5] = &emojis[406]; + vTravel[6] = &emojis[935]; + vTravel[7] = &emojis[933]; + vTravel[8] = &emojis[934]; + vTravel[9] = &emojis[932]; + vTravel[10] = &emojis[942]; + vTravel[11] = &emojis[943]; + vTravel[12] = &emojis[944]; + vTravel[13] = &emojis[405]; + vTravel[14] = &emojis[966]; + vTravel[15] = &emojis[956]; + vTravel[16] = &emojis[936]; + vTravel[17] = &emojis[929]; + vTravel[18] = &emojis[940]; + vTravel[19] = &emojis[938]; + vTravel[20] = &emojis[949]; + vTravel[21] = &emojis[948]; + vTravel[22] = &emojis[947]; + vTravel[23] = &emojis[919]; + vTravel[24] = &emojis[927]; + vTravel[25] = &emojis[945]; + vTravel[26] = &emojis[920]; + vTravel[27] = &emojis[921]; + vTravel[28] = &emojis[924]; + vTravel[29] = &emojis[946]; + vTravel[30] = &emojis[918]; + vTravel[31] = &emojis[922]; + vTravel[32] = &emojis[923]; + vTravel[33] = &emojis[926]; + vTravel[34] = &emojis[925]; + vTravel[35] = &emojis[917]; + vTravel[36] = &emojis[998]; + vTravel[37] = &emojis[119]; + vTravel[38] = &emojis[999]; + vTravel[39] = &emojis[1000]; + vTravel[40] = &emojis[111]; + vTravel[41] = &emojis[997]; + vTravel[42] = &emojis[952]; + vTravel[43] = &emojis[110]; + vTravel[44] = &emojis[1002]; + vTravel[45] = &emojis[916]; + vTravel[46] = &emojis[1001]; + vTravel[47] = &emojis[634]; + vTravel[48] = &emojis[81]; + vTravel[49] = &emojis[955]; + vTravel[50] = &emojis[116]; + vTravel[51] = &emojis[931]; + vTravel[52] = &emojis[954]; + vTravel[53] = &emojis[953]; + vTravel[54] = &emojis[393]; + vTravel[55] = &emojis[950]; + vTravel[56] = &emojis[361]; + vTravel[57] = &emojis[362]; + vTravel[58] = &emojis[360]; + vTravel[59] = &emojis[415]; + vTravel[60] = &emojis[208]; + vTravel[61] = &emojis[832]; + vTravel[62] = &emojis[437]; + vTravel[63] = &emojis[108]; + vTravel[64] = &emojis[350]; + vTravel[65] = &emojis[106]; + vTravel[66] = &emojis[412]; + vTravel[67] = &emojis[831]; + vTravel[68] = &emojis[218]; + vTravel[69] = &emojis[834]; + vTravel[70] = &emojis[413]; + vTravel[71] = &emojis[115]; + vTravel[72] = &emojis[422]; + vTravel[73] = &emojis[995]; + vTravel[74] = &emojis[996]; + vTravel[75] = &emojis[212]; + vTravel[76] = &emojis[211]; + vTravel[77] = &emojis[420]; + vTravel[78] = &emojis[414]; + vTravel[79] = &emojis[421]; + vTravel[80] = &emojis[214]; + vTravel[81] = &emojis[213]; + vTravel[82] = &emojis[417]; + vTravel[83] = &emojis[210]; + vTravel[84] = &emojis[216]; + vTravel[85] = &emojis[219]; + vTravel[86] = &emojis[239]; + vTravel[87] = &emojis[340]; + vTravel[88] = &emojis[339]; + vTravel[89] = &emojis[215]; + vTravel[90] = &emojis[416]; + vTravel[91] = &emojis[440]; + vTravel[92] = &emojis[439]; + vTravel[93] = &emojis[423]; + vTravel[94] = &emojis[833]; + vTravel[95] = &emojis[424]; + vTravel[96] = &emojis[425]; + vTravel[97] = &emojis[418]; + vTravel[98] = &emojis[426]; + vTravel[99] = &emojis[436]; + vTravel[100] = &emojis[427]; + vTravel[101] = &emojis[428]; + vTravel[102] = &emojis[429]; + vTravel[103] = &emojis[430]; + vTravel[104] = &emojis[432]; + vTravel[105] = &emojis[434]; + vTravel[106] = &emojis[435]; + vTravel[107] = &emojis[433]; + vTravel[108] = &emojis[594]; + vTravel[109] = &emojis[419]; + vTravel[110] = &emojis[105]; + vTravel[111] = &emojis[768]; + vTravel[112] = &emojis[769]; + vTravel[113] = &emojis[767]; + vTravel[114] = &emojis[104]; } return vTravel; } break; @@ -3416,356 +4293,713 @@ EmojiPack emojiPack(DBIEmojiTab tab) { case dbietObjects: { static QVector vObjects; if (vObjects.isEmpty()) { - vObjects.resize(345); + vObjects.resize(178); vObjects[0] = &emojis[14]; - vObjects[1] = &emojis[587]; - vObjects[2] = &emojis[588]; - vObjects[3] = &emojis[533]; - vObjects[4] = &emojis[20]; - vObjects[5] = &emojis[21]; - vObjects[6] = &emojis[15]; - vObjects[7] = &emojis[593]; - vObjects[8] = &emojis[594]; - vObjects[9] = &emojis[294]; - vObjects[10] = &emojis[595]; - vObjects[11] = &emojis[596]; - vObjects[12] = &emojis[569]; - vObjects[13] = &emojis[568]; - vObjects[14] = &emojis[33]; - vObjects[15] = &emojis[570]; - vObjects[16] = &emojis[535]; - vObjects[17] = &emojis[536]; - vObjects[18] = &emojis[537]; - vObjects[19] = &emojis[538]; - vObjects[20] = &emojis[597]; - vObjects[21] = &emojis[609]; - vObjects[22] = &emojis[610]; - vObjects[23] = &emojis[507]; - vObjects[24] = &emojis[636]; - vObjects[25] = &emojis[571]; - vObjects[26] = &emojis[525]; - vObjects[27] = &emojis[530]; - vObjects[28] = &emojis[522]; - vObjects[29] = &emojis[488]; - vObjects[30] = &emojis[162]; - vObjects[31] = &emojis[439]; - vObjects[32] = &emojis[437]; - vObjects[33] = &emojis[438]; - vObjects[34] = &emojis[534]; - vObjects[35] = &emojis[287]; - vObjects[36] = &emojis[478]; - vObjects[37] = &emojis[429]; - vObjects[38] = &emojis[428]; - vObjects[39] = &emojis[443]; - vObjects[40] = &emojis[442]; - vObjects[41] = &emojis[444]; - vObjects[42] = &emojis[440]; - vObjects[43] = &emojis[441]; - vObjects[44] = &emojis[435]; - vObjects[45] = &emojis[433]; - vObjects[46] = &emojis[434]; - vObjects[47] = &emojis[436]; - vObjects[48] = &emojis[431]; - vObjects[49] = &emojis[430]; - vObjects[50] = &emojis[432]; - vObjects[51] = &emojis[807]; - vObjects[52] = &emojis[828]; - vObjects[53] = &emojis[830]; - vObjects[54] = &emojis[826]; - vObjects[55] = &emojis[482]; - vObjects[56] = &emojis[483]; - vObjects[57] = &emojis[484]; - vObjects[58] = &emojis[642]; - vObjects[59] = &emojis[643]; - vObjects[60] = &emojis[644]; - vObjects[61] = &emojis[637]; - vObjects[62] = &emojis[640]; - vObjects[63] = &emojis[639]; - vObjects[64] = &emojis[638]; - vObjects[65] = &emojis[509]; - vObjects[66] = &emojis[809]; - vObjects[67] = &emojis[641]; - vObjects[68] = &emojis[620]; - vObjects[69] = &emojis[586]; - vObjects[70] = &emojis[615]; - vObjects[71] = &emojis[78]; - vObjects[72] = &emojis[579]; - vObjects[73] = &emojis[578]; - vObjects[74] = &emojis[577]; - vObjects[75] = &emojis[575]; - vObjects[76] = &emojis[574]; - vObjects[77] = &emojis[576]; - vObjects[78] = &emojis[585]; - vObjects[79] = &emojis[584]; - vObjects[80] = &emojis[580]; - vObjects[81] = &emojis[581]; - vObjects[82] = &emojis[582]; - vObjects[83] = &emojis[583]; - vObjects[84] = &emojis[542]; - vObjects[85] = &emojis[541]; - vObjects[86] = &emojis[555]; - vObjects[87] = &emojis[546]; - vObjects[88] = &emojis[547]; - vObjects[89] = &emojis[548]; - vObjects[90] = &emojis[543]; - vObjects[91] = &emojis[544]; - vObjects[92] = &emojis[603]; - vObjects[93] = &emojis[604]; - vObjects[94] = &emojis[566]; - vObjects[95] = &emojis[549]; - vObjects[96] = &emojis[560]; - vObjects[97] = &emojis[557]; - vObjects[98] = &emojis[558]; - vObjects[99] = &emojis[556]; - vObjects[100] = &emojis[559]; - vObjects[101] = &emojis[561]; - vObjects[102] = &emojis[562]; - vObjects[103] = &emojis[563]; - vObjects[104] = &emojis[564]; - vObjects[105] = &emojis[545]; - vObjects[106] = &emojis[621]; - vObjects[107] = &emojis[552]; - vObjects[108] = &emojis[550]; - vObjects[109] = &emojis[75]; - vObjects[110] = &emojis[554]; - vObjects[111] = &emojis[551]; - vObjects[112] = &emojis[553]; - vObjects[113] = &emojis[806]; - vObjects[114] = &emojis[539]; - vObjects[115] = &emojis[540]; - vObjects[116] = &emojis[83]; - vObjects[117] = &emojis[82]; - vObjects[118] = &emojis[567]; - vObjects[119] = &emojis[613]; - vObjects[120] = &emojis[614]; - vObjects[121] = &emojis[616]; - vObjects[122] = &emojis[617]; - vObjects[123] = &emojis[573]; - vObjects[124] = &emojis[572]; - vObjects[125] = &emojis[606]; - vObjects[126] = &emojis[607]; - vObjects[127] = &emojis[608]; - vObjects[128] = &emojis[605]; - vObjects[129] = &emojis[510]; - vObjects[130] = &emojis[618]; - vObjects[131] = &emojis[619]; - vObjects[132] = &emojis[519]; - vObjects[133] = &emojis[518]; - vObjects[134] = &emojis[821]; - vObjects[135] = &emojis[611]; - vObjects[136] = &emojis[612]; - vObjects[137] = &emojis[808]; - vObjects[138] = &emojis[68]; - vObjects[139] = &emojis[565]; - vObjects[140] = &emojis[820]; - vObjects[141] = &emojis[812]; - vObjects[142] = &emojis[816]; - vObjects[143] = &emojis[814]; - vObjects[144] = &emojis[591]; - vObjects[145] = &emojis[628]; - vObjects[146] = &emojis[159]; - vObjects[147] = &emojis[158]; - vObjects[148] = &emojis[520]; - vObjects[149] = &emojis[116]; - vObjects[150] = &emojis[115]; - vObjects[151] = &emojis[151]; - vObjects[152] = &emojis[152]; - vObjects[153] = &emojis[149]; - vObjects[154] = &emojis[153]; - vObjects[155] = &emojis[147]; - vObjects[156] = &emojis[155]; - vObjects[157] = &emojis[157]; - vObjects[158] = &emojis[154]; - vObjects[159] = &emojis[156]; - vObjects[160] = &emojis[150]; - vObjects[161] = &emojis[146]; - vObjects[162] = &emojis[145]; - vObjects[163] = &emojis[148]; - vObjects[164] = &emojis[531]; - vObjects[165] = &emojis[90]; - vObjects[166] = &emojis[87]; - vObjects[167] = &emojis[92]; - vObjects[168] = &emojis[76]; - vObjects[169] = &emojis[88]; - vObjects[170] = &emojis[589]; - vObjects[171] = &emojis[590]; - vObjects[172] = &emojis[144]; - vObjects[173] = &emojis[130]; - vObjects[174] = &emojis[131]; - vObjects[175] = &emojis[134]; - vObjects[176] = &emojis[135]; - vObjects[177] = &emojis[132]; - vObjects[178] = &emojis[142]; - vObjects[179] = &emojis[138]; - vObjects[180] = &emojis[133]; - vObjects[181] = &emojis[827]; - vObjects[182] = &emojis[136]; - vObjects[183] = &emojis[137]; - vObjects[184] = &emojis[139]; - vObjects[185] = &emojis[140]; - vObjects[186] = &emojis[141]; - vObjects[187] = &emojis[143]; - vObjects[188] = &emojis[338]; - vObjects[189] = &emojis[39]; - vObjects[190] = &emojis[40]; - vObjects[191] = &emojis[41]; - vObjects[192] = &emojis[42]; - vObjects[193] = &emojis[43]; - vObjects[194] = &emojis[44]; - vObjects[195] = &emojis[45]; - vObjects[196] = &emojis[46]; - vObjects[197] = &emojis[47]; - vObjects[198] = &emojis[48]; - vObjects[199] = &emojis[49]; - vObjects[200] = &emojis[50]; - vObjects[201] = &emojis[824]; - vObjects[202] = &emojis[822]; - vObjects[203] = &emojis[823]; - vObjects[204] = &emojis[825]; - vObjects[205] = &emojis[57]; - vObjects[206] = &emojis[813]; - vObjects[207] = &emojis[810]; - vObjects[208] = &emojis[811]; - vObjects[209] = &emojis[25]; - vObjects[210] = &emojis[26]; - vObjects[211] = &emojis[658]; - vObjects[212] = &emojis[659]; - vObjects[213] = &emojis[16]; - vObjects[214] = &emojis[17]; - vObjects[215] = &emojis[18]; - vObjects[216] = &emojis[19]; - vObjects[217] = &emojis[101]; - vObjects[218] = &emojis[106]; - vObjects[219] = &emojis[107]; - vObjects[220] = &emojis[108]; - vObjects[221] = &emojis[9]; - vObjects[222] = &emojis[10]; - vObjects[223] = &emojis[11]; - vObjects[224] = &emojis[8]; - vObjects[225] = &emojis[7]; - vObjects[226] = &emojis[6]; - vObjects[227] = &emojis[602]; - vObjects[228] = &emojis[13]; - vObjects[229] = &emojis[12]; - vObjects[230] = &emojis[104]; - vObjects[231] = &emojis[105]; - vObjects[232] = &emojis[598]; - vObjects[233] = &emojis[599]; - vObjects[234] = &emojis[600]; - vObjects[235] = &emojis[117]; - vObjects[236] = &emojis[118]; - vObjects[237] = &emojis[119]; - vObjects[238] = &emojis[120]; - vObjects[239] = &emojis[121]; - vObjects[240] = &emojis[122]; - vObjects[241] = &emojis[123]; - vObjects[242] = &emojis[124]; - vObjects[243] = &emojis[125]; - vObjects[244] = &emojis[126]; - vObjects[245] = &emojis[127]; - vObjects[246] = &emojis[629]; - vObjects[247] = &emojis[632]; - vObjects[248] = &emojis[634]; - vObjects[249] = &emojis[631]; - vObjects[250] = &emojis[630]; - vObjects[251] = &emojis[5]; - vObjects[252] = &emojis[592]; - vObjects[253] = &emojis[295]; - vObjects[254] = &emojis[633]; - vObjects[255] = &emojis[98]; - vObjects[256] = &emojis[99]; - vObjects[257] = &emojis[113]; - vObjects[258] = &emojis[100]; - vObjects[259] = &emojis[85]; - vObjects[260] = &emojis[84]; - vObjects[261] = &emojis[601]; - vObjects[262] = &emojis[4]; - vObjects[263] = &emojis[0]; - vObjects[264] = &emojis[1]; - vObjects[265] = &emojis[523]; - vObjects[266] = &emojis[524]; - vObjects[267] = &emojis[102]; - vObjects[268] = &emojis[103]; - vObjects[269] = &emojis[114]; - vObjects[270] = &emojis[96]; - vObjects[271] = &emojis[93]; - vObjects[272] = &emojis[95]; - vObjects[273] = &emojis[94]; - vObjects[274] = &emojis[2]; - vObjects[275] = &emojis[3]; - vObjects[276] = &emojis[91]; - vObjects[277] = &emojis[112]; - vObjects[278] = &emojis[521]; - vObjects[279] = &emojis[624]; - vObjects[280] = &emojis[623]; - vObjects[281] = &emojis[625]; - vObjects[282] = &emojis[627]; - vObjects[283] = &emojis[626]; - vObjects[284] = &emojis[160]; - vObjects[285] = &emojis[22]; - vObjects[286] = &emojis[67]; - vObjects[287] = &emojis[645]; - vObjects[288] = &emojis[646]; - vObjects[289] = &emojis[647]; - vObjects[290] = &emojis[59]; - vObjects[291] = &emojis[55]; - vObjects[292] = &emojis[56]; - vObjects[293] = &emojis[508]; - vObjects[294] = &emojis[506]; - vObjects[295] = &emojis[51]; - vObjects[296] = &emojis[52]; - vObjects[297] = &emojis[53]; - vObjects[298] = &emojis[54]; - vObjects[299] = &emojis[34]; - vObjects[300] = &emojis[61]; - vObjects[301] = &emojis[62]; - vObjects[302] = &emojis[622]; - vObjects[303] = &emojis[650]; - vObjects[304] = &emojis[651]; - vObjects[305] = &emojis[656]; - vObjects[306] = &emojis[657]; - vObjects[307] = &emojis[654]; - vObjects[308] = &emojis[655]; - vObjects[309] = &emojis[652]; - vObjects[310] = &emojis[653]; - vObjects[311] = &emojis[23]; - vObjects[312] = &emojis[24]; - vObjects[313] = &emojis[109]; - vObjects[314] = &emojis[110]; - vObjects[315] = &emojis[28]; - vObjects[316] = &emojis[27]; - vObjects[317] = &emojis[30]; - vObjects[318] = &emojis[29]; - vObjects[319] = &emojis[648]; - vObjects[320] = &emojis[649]; - vObjects[321] = &emojis[660]; - vObjects[322] = &emojis[661]; - vObjects[323] = &emojis[662]; - vObjects[324] = &emojis[663]; - vObjects[325] = &emojis[664]; - vObjects[326] = &emojis[665]; - vObjects[327] = &emojis[666]; - vObjects[328] = &emojis[667]; - vObjects[329] = &emojis[668]; - vObjects[330] = &emojis[669]; - vObjects[331] = &emojis[670]; - vObjects[332] = &emojis[671]; - vObjects[333] = &emojis[672]; - vObjects[334] = &emojis[673]; - vObjects[335] = &emojis[674]; - vObjects[336] = &emojis[675]; - vObjects[337] = &emojis[676]; - vObjects[338] = &emojis[677]; - vObjects[339] = &emojis[678]; - vObjects[340] = &emojis[679]; - vObjects[341] = &emojis[680]; - vObjects[342] = &emojis[681]; - vObjects[343] = &emojis[682]; - vObjects[344] = &emojis[683]; + vObjects[1] = &emojis[689]; + vObjects[2] = &emojis[690]; + vObjects[3] = &emojis[635]; + vObjects[4] = &emojis[16]; + vObjects[5] = &emojis[812]; + vObjects[6] = &emojis[813]; + vObjects[7] = &emojis[814]; + vObjects[8] = &emojis[815]; + vObjects[9] = &emojis[803]; + vObjects[10] = &emojis[823]; + vObjects[11] = &emojis[637]; + vObjects[12] = &emojis[638]; + vObjects[13] = &emojis[639]; + vObjects[14] = &emojis[640]; + vObjects[15] = &emojis[700]; + vObjects[16] = &emojis[695]; + vObjects[17] = &emojis[696]; + vObjects[18] = &emojis[697]; + vObjects[19] = &emojis[365]; + vObjects[20] = &emojis[701]; + vObjects[21] = &emojis[358]; + vObjects[22] = &emojis[670]; + vObjects[23] = &emojis[45]; + vObjects[24] = &emojis[671]; + vObjects[25] = &emojis[672]; + vObjects[26] = &emojis[698]; + vObjects[27] = &emojis[699]; + vObjects[28] = &emojis[355]; + vObjects[29] = &emojis[356]; + vObjects[30] = &emojis[357]; + vObjects[31] = &emojis[25]; + vObjects[32] = &emojis[26]; + vObjects[33] = &emojis[24]; + vObjects[34] = &emojis[796]; + vObjects[35] = &emojis[27]; + vObjects[36] = &emojis[15]; + vObjects[37] = &emojis[673]; + vObjects[38] = &emojis[714]; + vObjects[39] = &emojis[715]; + vObjects[40] = &emojis[609]; + vObjects[41] = &emojis[741]; + vObjects[42] = &emojis[795]; + vObjects[43] = &emojis[820]; + vObjects[44] = &emojis[994]; + vObjects[45] = &emojis[632]; + vObjects[46] = &emojis[629]; + vObjects[47] = &emojis[628]; + vObjects[48] = &emojis[630]; + vObjects[49] = &emojis[631]; + vObjects[50] = &emojis[624]; + vObjects[51] = &emojis[627]; + vObjects[52] = &emojis[590]; + vObjects[53] = &emojis[83]; + vObjects[54] = &emojis[742]; + vObjects[55] = &emojis[743]; + vObjects[56] = &emojis[80]; + vObjects[57] = &emojis[992]; + vObjects[58] = &emojis[100]; + vObjects[59] = &emojis[744]; + vObjects[60] = &emojis[85]; + vObjects[61] = &emojis[102]; + vObjects[62] = &emojis[746]; + vObjects[63] = &emojis[611]; + vObjects[64] = &emojis[745]; + vObjects[65] = &emojis[826]; + vObjects[66] = &emojis[82]; + vObjects[67] = &emojis[993]; + vObjects[68] = &emojis[960]; + vObjects[69] = &emojis[51]; + vObjects[70] = &emojis[92]; + vObjects[71] = &emojis[93]; + vObjects[72] = &emojis[447]; + vObjects[73] = &emojis[749]; + vObjects[74] = &emojis[702]; + vObjects[75] = &emojis[584]; + vObjects[76] = &emojis[84]; + vObjects[77] = &emojis[748]; + vObjects[78] = &emojis[747]; + vObjects[79] = &emojis[797]; + vObjects[80] = &emojis[586]; + vObjects[81] = &emojis[585]; + vObjects[82] = &emojis[240]; + vObjects[83] = &emojis[444]; + vObjects[84] = &emojis[725]; + vObjects[85] = &emojis[977]; + vObjects[86] = &emojis[979]; + vObjects[87] = &emojis[981]; + vObjects[88] = &emojis[720]; + vObjects[89] = &emojis[824]; + vObjects[90] = &emojis[986]; + vObjects[91] = &emojis[987]; + vObjects[92] = &emojis[990]; + vObjects[93] = &emojis[958]; + vObjects[94] = &emojis[989]; + vObjects[95] = &emojis[816]; + vObjects[96] = &emojis[830]; + vObjects[97] = &emojis[107]; + vObjects[98] = &emojis[835]; + vObjects[99] = &emojis[988]; + vObjects[100] = &emojis[341]; + vObjects[101] = &emojis[348]; + vObjects[102] = &emojis[333]; + vObjects[103] = &emojis[334]; + vObjects[104] = &emojis[343]; + vObjects[105] = &emojis[342]; + vObjects[106] = &emojis[347]; + vObjects[107] = &emojis[349]; + vObjects[108] = &emojis[345]; + vObjects[109] = &emojis[438]; + vObjects[110] = &emojis[120]; + vObjects[111] = &emojis[681]; + vObjects[112] = &emojis[680]; + vObjects[113] = &emojis[679]; + vObjects[114] = &emojis[588]; + vObjects[115] = &emojis[686]; + vObjects[116] = &emojis[682]; + vObjects[117] = &emojis[683]; + vObjects[118] = &emojis[684]; + vObjects[119] = &emojis[685]; + vObjects[120] = &emojis[678]; + vObjects[121] = &emojis[687]; + vObjects[122] = &emojis[677]; + vObjects[123] = &emojis[676]; + vObjects[124] = &emojis[668]; + vObjects[125] = &emojis[643]; + vObjects[126] = &emojis[657]; + vObjects[127] = &emojis[650]; + vObjects[128] = &emojis[648]; + vObjects[129] = &emojis[649]; + vObjects[130] = &emojis[644]; + vObjects[131] = &emojis[645]; + vObjects[132] = &emojis[646]; + vObjects[133] = &emojis[822]; + vObjects[134] = &emojis[647]; + vObjects[135] = &emojis[818]; + vObjects[136] = &emojis[829]; + vObjects[137] = &emojis[819]; + vObjects[138] = &emojis[651]; + vObjects[139] = &emojis[821]; + vObjects[140] = &emojis[641]; + vObjects[141] = &emojis[642]; + vObjects[142] = &emojis[817]; + vObjects[143] = &emojis[825]; + vObjects[144] = &emojis[688]; + vObjects[145] = &emojis[659]; + vObjects[146] = &emojis[661]; + vObjects[147] = &emojis[663]; + vObjects[148] = &emojis[664]; + vObjects[149] = &emojis[665]; + vObjects[150] = &emojis[660]; + vObjects[151] = &emojis[658]; + vObjects[152] = &emojis[666]; + vObjects[153] = &emojis[662]; + vObjects[154] = &emojis[726]; + vObjects[155] = &emojis[654]; + vObjects[156] = &emojis[804]; + vObjects[157] = &emojis[117]; + vObjects[158] = &emojis[656]; + vObjects[159] = &emojis[655]; + vObjects[160] = &emojis[652]; + vObjects[161] = &emojis[653]; + vObjects[162] = &emojis[957]; + vObjects[163] = &emojis[441]; + vObjects[164] = &emojis[442]; + vObjects[165] = &emojis[719]; + vObjects[166] = &emojis[721]; + vObjects[167] = &emojis[722]; + vObjects[168] = &emojis[718]; + vObjects[169] = &emojis[805]; + vObjects[170] = &emojis[806]; + vObjects[171] = &emojis[126]; + vObjects[172] = &emojis[669]; + vObjects[173] = &emojis[125]; + vObjects[174] = &emojis[808]; + vObjects[175] = &emojis[807]; + vObjects[176] = &emojis[716]; + vObjects[177] = &emojis[717]; } return vObjects; } break; + case dbietSymbols: { + static QVector vSymbols; + if (vSymbols.isEmpty()) { + vSymbols.resize(516); + vSymbols[0] = &emojis[143]; + vSymbols[1] = &emojis[603]; + vSymbols[2] = &emojis[602]; + vSymbols[3] = &emojis[601]; + vSymbols[4] = &emojis[604]; + vSymbols[5] = &emojis[596]; + vSymbols[6] = &emojis[142]; + vSymbols[7] = &emojis[597]; + vSymbols[8] = &emojis[606]; + vSymbols[9] = &emojis[595]; + vSymbols[10] = &emojis[599]; + vSymbols[11] = &emojis[598]; + vSymbols[12] = &emojis[600]; + vSymbols[13] = &emojis[605]; + vSymbols[14] = &emojis[607]; + vSymbols[15] = &emojis[56]; + vSymbols[16] = &emojis[129]; + vSymbols[17] = &emojis[55]; + vSymbols[18] = &emojis[765]; + vSymbols[19] = &emojis[58]; + vSymbols[20] = &emojis[130]; + vSymbols[21] = &emojis[750]; + vSymbols[22] = &emojis[770]; + vSymbols[23] = &emojis[57]; + vSymbols[24] = &emojis[54]; + vSymbols[25] = &emojis[991]; + vSymbols[26] = &emojis[99]; + vSymbols[27] = &emojis[61]; + vSymbols[28] = &emojis[62]; + vSymbols[29] = &emojis[63]; + vSymbols[30] = &emojis[64]; + vSymbols[31] = &emojis[65]; + vSymbols[32] = &emojis[66]; + vSymbols[33] = &emojis[67]; + vSymbols[34] = &emojis[68]; + vSymbols[35] = &emojis[69]; + vSymbols[36] = &emojis[70]; + vSymbols[37] = &emojis[71]; + vSymbols[38] = &emojis[72]; + vSymbols[39] = &emojis[185]; + vSymbols[40] = &emojis[86]; + vSymbols[41] = &emojis[197]; + vSymbols[42] = &emojis[203]; + vSymbols[43] = &emojis[52]; + vSymbols[44] = &emojis[53]; + vSymbols[45] = &emojis[692]; + vSymbols[46] = &emojis[691]; + vSymbols[47] = &emojis[200]; + vSymbols[48] = &emojis[194]; + vSymbols[49] = &emojis[202]; + vSymbols[50] = &emojis[204]; + vSymbols[51] = &emojis[201]; + vSymbols[52] = &emojis[133]; + vSymbols[53] = &emojis[191]; + vSymbols[54] = &emojis[206]; + vSymbols[55] = &emojis[622]; + vSymbols[56] = &emojis[205]; + vSymbols[57] = &emojis[162]; + vSymbols[58] = &emojis[161]; + vSymbols[59] = &emojis[198]; + vSymbols[60] = &emojis[199]; + vSymbols[61] = &emojis[196]; + vSymbols[62] = &emojis[177]; + vSymbols[63] = &emojis[178]; + vSymbols[64] = &emojis[181]; + vSymbols[65] = &emojis[182]; + vSymbols[66] = &emojis[179]; + vSymbols[67] = &emojis[189]; + vSymbols[68] = &emojis[103]; + vSymbols[69] = &emojis[667]; + vSymbols[70] = &emojis[959]; + vSymbols[71] = &emojis[136]; + vSymbols[72] = &emojis[158]; + vSymbols[73] = &emojis[610]; + vSymbols[74] = &emojis[77]; + vSymbols[75] = &emojis[971]; + vSymbols[76] = &emojis[963]; + vSymbols[77] = &emojis[967]; + vSymbols[78] = &emojis[965]; + vSymbols[79] = &emojis[733]; + vSymbols[80] = &emojis[693]; + vSymbols[81] = &emojis[141]; + vSymbols[82] = &emojis[140]; + vSymbols[83] = &emojis[138]; + vSymbols[84] = &emojis[139]; + vSymbols[85] = &emojis[2]; + vSymbols[86] = &emojis[3]; + vSymbols[87] = &emojis[623]; + vSymbols[88] = &emojis[708]; + vSymbols[89] = &emojis[709]; + vSymbols[90] = &emojis[752]; + vSymbols[91] = &emojis[87]; + vSymbols[92] = &emojis[160]; + vSymbols[93] = &emojis[88]; + vSymbols[94] = &emojis[972]; + vSymbols[95] = &emojis[751]; + vSymbols[96] = &emojis[78]; + vSymbols[97] = &emojis[195]; + vSymbols[98] = &emojis[633]; + vSymbols[99] = &emojis[135]; + vSymbols[100] = &emojis[132]; + vSymbols[101] = &emojis[137]; + vSymbols[102] = &emojis[118]; + vSymbols[103] = &emojis[608]; + vSymbols[104] = &emojis[207]; + vSymbols[105] = &emojis[149]; + vSymbols[106] = &emojis[223]; + vSymbols[107] = &emojis[31]; + vSymbols[108] = &emojis[431]; + vSymbols[109] = &emojis[193]; + vSymbols[110] = &emojis[982]; + vSymbols[111] = &emojis[983]; + vSymbols[112] = &emojis[984]; + vSymbols[113] = &emojis[985]; + vSymbols[114] = &emojis[79]; + vSymbols[115] = &emojis[961]; + vSymbols[116] = &emojis[978]; + vSymbols[117] = &emojis[180]; + vSymbols[118] = &emojis[964]; + vSymbols[119] = &emojis[973]; + vSymbols[120] = &emojis[974]; + vSymbols[121] = &emojis[976]; + vSymbols[122] = &emojis[975]; + vSymbols[123] = &emojis[962]; + vSymbols[124] = &emojis[366]; + vSymbols[125] = &emojis[694]; + vSymbols[126] = &emojis[192]; + vSymbols[127] = &emojis[187]; + vSymbols[128] = &emojis[188]; + vSymbols[129] = &emojis[190]; + vSymbols[130] = &emojis[183]; + vSymbols[131] = &emojis[186]; + vSymbols[132] = &emojis[184]; + vSymbols[133] = &emojis[165]; + vSymbols[134] = &emojis[166]; + vSymbols[135] = &emojis[167]; + vSymbols[136] = &emojis[168]; + vSymbols[137] = &emojis[169]; + vSymbols[138] = &emojis[170]; + vSymbols[139] = &emojis[171]; + vSymbols[140] = &emojis[172]; + vSymbols[141] = &emojis[173]; + vSymbols[142] = &emojis[174]; + vSymbols[143] = &emojis[734]; + vSymbols[144] = &emojis[737]; + vSymbols[145] = &emojis[34]; + vSymbols[146] = &emojis[28]; + vSymbols[147] = &emojis[23]; + vSymbols[148] = &emojis[29]; + vSymbols[149] = &emojis[30]; + vSymbols[150] = &emojis[21]; + vSymbols[151] = &emojis[22]; + vSymbols[152] = &emojis[17]; + vSymbols[153] = &emojis[18]; + vSymbols[154] = &emojis[703]; + vSymbols[155] = &emojis[704]; + vSymbols[156] = &emojis[705]; + vSymbols[157] = &emojis[35]; + vSymbols[158] = &emojis[763]; + vSymbols[159] = &emojis[764]; + vSymbols[160] = &emojis[19]; + vSymbols[161] = &emojis[20]; + vSymbols[162] = &emojis[147]; + vSymbols[163] = &emojis[152]; + vSymbols[164] = &emojis[153]; + vSymbols[165] = &emojis[154]; + vSymbols[166] = &emojis[9]; + vSymbols[167] = &emojis[10]; + vSymbols[168] = &emojis[11]; + vSymbols[169] = &emojis[8]; + vSymbols[170] = &emojis[7]; + vSymbols[171] = &emojis[6]; + vSymbols[172] = &emojis[707]; + vSymbols[173] = &emojis[13]; + vSymbols[174] = &emojis[12]; + vSymbols[175] = &emojis[150]; + vSymbols[176] = &emojis[151]; + vSymbols[177] = &emojis[163]; + vSymbols[178] = &emojis[164]; + vSymbols[179] = &emojis[5]; + vSymbols[180] = &emojis[739]; + vSymbols[181] = &emojis[736]; + vSymbols[182] = &emojis[735]; + vSymbols[183] = &emojis[738]; + vSymbols[184] = &emojis[381]; + vSymbols[185] = &emojis[382]; + vSymbols[186] = &emojis[159]; + vSymbols[187] = &emojis[148]; + vSymbols[188] = &emojis[127]; + vSymbols[189] = &emojis[706]; + vSymbols[190] = &emojis[144]; + vSymbols[191] = &emojis[145]; + vSymbols[192] = &emojis[146]; + vSymbols[193] = &emojis[128]; + vSymbols[194] = &emojis[626]; + vSymbols[195] = &emojis[625]; + vSymbols[196] = &emojis[0]; + vSymbols[197] = &emojis[1]; + vSymbols[198] = &emojis[4]; + vSymbols[199] = &emojis[729]; + vSymbols[200] = &emojis[728]; + vSymbols[201] = &emojis[730]; + vSymbols[202] = &emojis[732]; + vSymbols[203] = &emojis[731]; + vSymbols[204] = &emojis[46]; + vSymbols[205] = &emojis[727]; + vSymbols[206] = &emojis[90]; + vSymbols[207] = &emojis[91]; + vSymbols[208] = &emojis[755]; + vSymbols[209] = &emojis[756]; + vSymbols[210] = &emojis[759]; + vSymbols[211] = &emojis[760]; + vSymbols[212] = &emojis[757]; + vSymbols[213] = &emojis[758]; + vSymbols[214] = &emojis[761]; + vSymbols[215] = &emojis[32]; + vSymbols[216] = &emojis[33]; + vSymbols[217] = &emojis[155]; + vSymbols[218] = &emojis[156]; + vSymbols[219] = &emojis[762]; + vSymbols[220] = &emojis[37]; + vSymbols[221] = &emojis[36]; + vSymbols[222] = &emojis[39]; + vSymbols[223] = &emojis[38]; + vSymbols[224] = &emojis[753]; + vSymbols[225] = &emojis[754]; + vSymbols[226] = &emojis[711]; + vSymbols[227] = &emojis[712]; + vSymbols[228] = &emojis[713]; + vSymbols[229] = &emojis[710]; + vSymbols[230] = &emojis[675]; + vSymbols[231] = &emojis[674]; + vSymbols[232] = &emojis[723]; + vSymbols[233] = &emojis[724]; + vSymbols[234] = &emojis[176]; + vSymbols[235] = &emojis[175]; + vSymbols[236] = &emojis[73]; + vSymbols[237] = &emojis[74]; + vSymbols[238] = &emojis[75]; + vSymbols[239] = &emojis[76]; + vSymbols[240] = &emojis[380]; + vSymbols[241] = &emojis[1036]; + vSymbols[242] = &emojis[621]; + vSymbols[243] = &emojis[828]; + vSymbols[244] = &emojis[620]; + vSymbols[245] = &emojis[771]; + vSymbols[246] = &emojis[772]; + vSymbols[247] = &emojis[773]; + vSymbols[248] = &emojis[774]; + vSymbols[249] = &emojis[775]; + vSymbols[250] = &emojis[776]; + vSymbols[251] = &emojis[777]; + vSymbols[252] = &emojis[778]; + vSymbols[253] = &emojis[779]; + vSymbols[254] = &emojis[780]; + vSymbols[255] = &emojis[781]; + vSymbols[256] = &emojis[782]; + vSymbols[257] = &emojis[783]; + vSymbols[258] = &emojis[784]; + vSymbols[259] = &emojis[785]; + vSymbols[260] = &emojis[786]; + vSymbols[261] = &emojis[787]; + vSymbols[262] = &emojis[788]; + vSymbols[263] = &emojis[789]; + vSymbols[264] = &emojis[790]; + vSymbols[265] = &emojis[791]; + vSymbols[266] = &emojis[792]; + vSymbols[267] = &emojis[793]; + vSymbols[268] = &emojis[794]; + vSymbols[269] = &emojis[1069]; + vSymbols[270] = &emojis[1081]; + vSymbols[271] = &emojis[1072]; + vSymbols[272] = &emojis[1127]; + vSymbols[273] = &emojis[1077]; + vSymbols[274] = &emojis[1067]; + vSymbols[275] = &emojis[1074]; + vSymbols[276] = &emojis[1071]; + vSymbols[277] = &emojis[1075]; + vSymbols[278] = &emojis[1070]; + vSymbols[279] = &emojis[1076]; + vSymbols[280] = &emojis[1073]; + vSymbols[281] = &emojis[1080]; + vSymbols[282] = &emojis[1079]; + vSymbols[283] = &emojis[1078]; + vSymbols[284] = &emojis[1082]; + vSymbols[285] = &emojis[1098]; + vSymbols[286] = &emojis[1089]; + vSymbols[287] = &emojis[1085]; + vSymbols[288] = &emojis[1084]; + vSymbols[289] = &emojis[1101]; + vSymbols[290] = &emojis[1086]; + vSymbols[291] = &emojis[1102]; + vSymbols[292] = &emojis[1091]; + vSymbols[293] = &emojis[1093]; + vSymbols[294] = &emojis[1099]; + vSymbols[295] = &emojis[1095]; + vSymbols[296] = &emojis[1083]; + vSymbols[297] = &emojis[1100]; + vSymbols[298] = &emojis[1097]; + vSymbols[299] = &emojis[1172]; + vSymbols[300] = &emojis[1302]; + vSymbols[301] = &emojis[1094]; + vSymbols[302] = &emojis[1088]; + vSymbols[303] = &emojis[1087]; + vSymbols[304] = &emojis[1090]; + vSymbols[305] = &emojis[1183]; + vSymbols[306] = &emojis[1112]; + vSymbols[307] = &emojis[1103]; + vSymbols[308] = &emojis[1166]; + vSymbols[309] = &emojis[1117]; + vSymbols[310] = &emojis[1096]; + vSymbols[311] = &emojis[1190]; + vSymbols[312] = &emojis[1106]; + vSymbols[313] = &emojis[1279]; + vSymbols[314] = &emojis[1111]; + vSymbols[315] = &emojis[1113]; + vSymbols[316] = &emojis[1119]; + vSymbols[317] = &emojis[1104]; + vSymbols[318] = &emojis[1114]; + vSymbols[319] = &emojis[1185]; + vSymbols[320] = &emojis[1107]; + vSymbols[321] = &emojis[1105]; + vSymbols[322] = &emojis[1110]; + vSymbols[323] = &emojis[1115]; + vSymbols[324] = &emojis[1109]; + vSymbols[325] = &emojis[1163]; + vSymbols[326] = &emojis[1116]; + vSymbols[327] = &emojis[1118]; + vSymbols[328] = &emojis[1120]; + vSymbols[329] = &emojis[1121]; + vSymbols[330] = &emojis[1124]; + vSymbols[331] = &emojis[1123]; + vSymbols[332] = &emojis[1125]; + vSymbols[333] = &emojis[1126]; + vSymbols[334] = &emojis[1128]; + vSymbols[335] = &emojis[1130]; + vSymbols[336] = &emojis[1274]; + vSymbols[337] = &emojis[1154]; + vSymbols[338] = &emojis[1132]; + vSymbols[339] = &emojis[1129]; + vSymbols[340] = &emojis[1134]; + vSymbols[341] = &emojis[1135]; + vSymbols[342] = &emojis[1138]; + vSymbols[343] = &emojis[1140]; + vSymbols[344] = &emojis[1137]; + vSymbols[345] = &emojis[1136]; + vSymbols[346] = &emojis[1141]; + vSymbols[347] = &emojis[1146]; + vSymbols[348] = &emojis[1240]; + vSymbols[349] = &emojis[1280]; + vSymbols[350] = &emojis[1142]; + vSymbols[351] = &emojis[1151]; + vSymbols[352] = &emojis[1145]; + vSymbols[353] = &emojis[1122]; + vSymbols[354] = &emojis[1148]; + vSymbols[355] = &emojis[1149]; + vSymbols[356] = &emojis[1155]; + vSymbols[357] = &emojis[1150]; + vSymbols[358] = &emojis[1144]; + vSymbols[359] = &emojis[1153]; + vSymbols[360] = &emojis[1158]; + vSymbols[361] = &emojis[1157]; + vSymbols[362] = &emojis[1147]; + vSymbols[363] = &emojis[1152]; + vSymbols[364] = &emojis[1159]; + vSymbols[365] = &emojis[1160]; + vSymbols[366] = &emojis[1164]; + vSymbols[367] = &emojis[1162]; + vSymbols[368] = &emojis[1161]; + vSymbols[369] = &emojis[1165]; + vSymbols[370] = &emojis[1175]; + vSymbols[371] = &emojis[1171]; + vSymbols[372] = &emojis[1167]; + vSymbols[373] = &emojis[1174]; + vSymbols[374] = &emojis[1173]; + vSymbols[375] = &emojis[1168]; + vSymbols[376] = &emojis[1170]; + vSymbols[377] = &emojis[1169]; + vSymbols[378] = &emojis[1176]; + vSymbols[379] = &emojis[1178]; + vSymbols[380] = &emojis[1180]; + vSymbols[381] = &emojis[1177]; + vSymbols[382] = &emojis[1179]; + vSymbols[383] = &emojis[1191]; + vSymbols[384] = &emojis[1181]; + vSymbols[385] = &emojis[1184]; + vSymbols[386] = &emojis[1308]; + vSymbols[387] = &emojis[1189]; + vSymbols[388] = &emojis[1182]; + vSymbols[389] = &emojis[1192]; + vSymbols[390] = &emojis[1201]; + vSymbols[391] = &emojis[1193]; + vSymbols[392] = &emojis[1198]; + vSymbols[393] = &emojis[1197]; + vSymbols[394] = &emojis[1202]; + vSymbols[395] = &emojis[1195]; + vSymbols[396] = &emojis[1199]; + vSymbols[397] = &emojis[1200]; + vSymbols[398] = &emojis[1213]; + vSymbols[399] = &emojis[1209]; + vSymbols[400] = &emojis[1207]; + vSymbols[401] = &emojis[1221]; + vSymbols[402] = &emojis[1223]; + vSymbols[403] = &emojis[1220]; + vSymbols[404] = &emojis[1210]; + vSymbols[405] = &emojis[1218]; + vSymbols[406] = &emojis[1208]; + vSymbols[407] = &emojis[1215]; + vSymbols[408] = &emojis[1216]; + vSymbols[409] = &emojis[1219]; + vSymbols[410] = &emojis[1310]; + vSymbols[411] = &emojis[1222]; + vSymbols[412] = &emojis[1139]; + vSymbols[413] = &emojis[1205]; + vSymbols[414] = &emojis[1204]; + vSymbols[415] = &emojis[1212]; + vSymbols[416] = &emojis[1206]; + vSymbols[417] = &emojis[1217]; + vSymbols[418] = &emojis[1203]; + vSymbols[419] = &emojis[1224]; + vSymbols[420] = &emojis[1211]; + vSymbols[421] = &emojis[1225]; + vSymbols[422] = &emojis[1234]; + vSymbols[423] = &emojis[1233]; + vSymbols[424] = &emojis[1231]; + vSymbols[425] = &emojis[1226]; + vSymbols[426] = &emojis[1236]; + vSymbols[427] = &emojis[1230]; + vSymbols[428] = &emojis[1227]; + vSymbols[429] = &emojis[1229]; + vSymbols[430] = &emojis[1235]; + vSymbols[431] = &emojis[1228]; + vSymbols[432] = &emojis[1187]; + vSymbols[433] = &emojis[1214]; + vSymbols[434] = &emojis[1232]; + vSymbols[435] = &emojis[1237]; + vSymbols[436] = &emojis[1243]; + vSymbols[437] = &emojis[1250]; + vSymbols[438] = &emojis[1248]; + vSymbols[439] = &emojis[1238]; + vSymbols[440] = &emojis[1241]; + vSymbols[441] = &emojis[1251]; + vSymbols[442] = &emojis[1239]; + vSymbols[443] = &emojis[1242]; + vSymbols[444] = &emojis[1246]; + vSymbols[445] = &emojis[1244]; + vSymbols[446] = &emojis[1249]; + vSymbols[447] = &emojis[1247]; + vSymbols[448] = &emojis[1252]; + vSymbols[449] = &emojis[1253]; + vSymbols[450] = &emojis[1254]; + vSymbols[451] = &emojis[1256]; + vSymbols[452] = &emojis[1257]; + vSymbols[453] = &emojis[1307]; + vSymbols[454] = &emojis[1268]; + vSymbols[455] = &emojis[1273]; + vSymbols[456] = &emojis[1258]; + vSymbols[457] = &emojis[1269]; + vSymbols[458] = &emojis[1255]; + vSymbols[459] = &emojis[1260]; + vSymbols[460] = &emojis[1267]; + vSymbols[461] = &emojis[1263]; + vSymbols[462] = &emojis[1275]; + vSymbols[463] = &emojis[1266]; + vSymbols[464] = &emojis[1265]; + vSymbols[465] = &emojis[1156]; + vSymbols[466] = &emojis[1259]; + vSymbols[467] = &emojis[1270]; + vSymbols[468] = &emojis[1311]; + vSymbols[469] = &emojis[1188]; + vSymbols[470] = &emojis[1272]; + vSymbols[471] = &emojis[1133]; + vSymbols[472] = &emojis[1196]; + vSymbols[473] = &emojis[1092]; + vSymbols[474] = &emojis[1264]; + vSymbols[475] = &emojis[1186]; + vSymbols[476] = &emojis[1194]; + vSymbols[477] = &emojis[1245]; + vSymbols[478] = &emojis[1300]; + vSymbols[479] = &emojis[1261]; + vSymbols[480] = &emojis[1271]; + vSymbols[481] = &emojis[1277]; + vSymbols[482] = &emojis[1262]; + vSymbols[483] = &emojis[1108]; + vSymbols[484] = &emojis[1276]; + vSymbols[485] = &emojis[1292]; + vSymbols[486] = &emojis[1283]; + vSymbols[487] = &emojis[1293]; + vSymbols[488] = &emojis[1282]; + vSymbols[489] = &emojis[1285]; + vSymbols[490] = &emojis[1281]; + vSymbols[491] = &emojis[1284]; + vSymbols[492] = &emojis[1288]; + vSymbols[493] = &emojis[1290]; + vSymbols[494] = &emojis[1287]; + vSymbols[495] = &emojis[1289]; + vSymbols[496] = &emojis[1286]; + vSymbols[497] = &emojis[1278]; + vSymbols[498] = &emojis[1291]; + vSymbols[499] = &emojis[1303]; + vSymbols[500] = &emojis[1295]; + vSymbols[501] = &emojis[1294]; + vSymbols[502] = &emojis[1068]; + vSymbols[503] = &emojis[1143]; + vSymbols[504] = &emojis[1296]; + vSymbols[505] = &emojis[1297]; + vSymbols[506] = &emojis[1298]; + vSymbols[507] = &emojis[1305]; + vSymbols[508] = &emojis[1299]; + vSymbols[509] = &emojis[1301]; + vSymbols[510] = &emojis[1304]; + vSymbols[511] = &emojis[1306]; + vSymbols[512] = &emojis[1131]; + vSymbols[513] = &emojis[1309]; + vSymbols[514] = &emojis[1312]; + vSymbols[515] = &emojis[1313]; + } + return vSymbols; + } break; + }; EmojiPack result; diff --git a/Telegram/SourceFiles/gui/emoji_config.h b/Telegram/SourceFiles/gui/emoji_config.h index 1dbc62dc2..e377374ba 100644 --- a/Telegram/SourceFiles/gui/emoji_config.h +++ b/Telegram/SourceFiles/gui/emoji_config.h @@ -85,7 +85,7 @@ inline EmojiPtr emojiFromUrl(const QString &url) { inline EmojiPtr emojiFromText(const QChar *ch, const QChar *e, int &len) { EmojiPtr emoji = 0; - if (ch + 1 < e && ((ch->isHighSurrogate() && (ch + 1)->isLowSurrogate()) || (((ch->unicode() >= 48 && ch->unicode() < 58) || ch->unicode() == 35) && (ch + 1)->unicode() == 0x20E3))) { + if (ch + 1 < e && ((ch->isHighSurrogate() && (ch + 1)->isLowSurrogate()) || (((ch->unicode() >= 0x30 && ch->unicode() < 0x3A) || ch->unicode() == 0x23 || ch->unicode() == 0x2A) && (ch + 1)->unicode() == 0x20E3))) { uint32 code = (ch->unicode() << 16) | (ch + 1)->unicode(); emoji = emojiGet(code); if (emoji) { @@ -105,6 +105,11 @@ inline EmojiPtr emojiFromText(const QChar *ch, const QChar *e, int &len) { } } } + } else if (ch + 2 < e && ((ch->unicode() >= 0x30 && ch->unicode() < 0x3A) || ch->unicode() == 0x23 || ch->unicode() == 0x2A) && (ch + 1)->unicode() == 0xFE0F && (ch + 2)->unicode() == 0x20E3) { + uint32 code = (ch->unicode() << 16) | (ch + 2)->unicode(); + emoji = emojiGet(code); + len = emoji->len + 1; + return emoji; } else if (ch < e) { emoji = emojiGet(ch->unicode()); Q_ASSERT(emoji != TwoSymbolEmoji); diff --git a/Telegram/SourceFiles/gui/filedialog.cpp b/Telegram/SourceFiles/gui/filedialog.cpp index 8d8ea291e..4727f81c7 100644 --- a/Telegram/SourceFiles/gui/filedialog.cpp +++ b/Telegram/SourceFiles/gui/filedialog.cpp @@ -89,7 +89,7 @@ bool _filedialogGetFiles(QStringList &files, QByteArray &remoteContent, const QS } return !files.isEmpty(); } else if (multipleFiles < -1) { - file = QFileDialog::getExistingDirectory(App::wnd() ? App::wnd()->filedialogParent() : 0, caption); + file = QFileDialog::getExistingDirectory(App::wnd() ? App::wnd()->filedialogParent() : 0, caption, startFile); } else if (multipleFiles < 0) { file = QFileDialog::getSaveFileName(App::wnd() ? App::wnd()->filedialogParent() : 0, caption, startFile, filter); } else { diff --git a/Telegram/SourceFiles/gui/flatinput.cpp b/Telegram/SourceFiles/gui/flatinput.cpp index f92a96d0a..f217b16f7 100644 --- a/Telegram/SourceFiles/gui/flatinput.cpp +++ b/Telegram/SourceFiles/gui/flatinput.cpp @@ -1180,7 +1180,7 @@ void InputArea::setCtrlEnterSubmit(CtrlEnterSubmit ctrlEnterSubmit) { void InputArea::InputAreaInner::keyPressEvent(QKeyEvent *e) { bool shift = e->modifiers().testFlag(Qt::ShiftModifier), alt = e->modifiers().testFlag(Qt::AltModifier); - bool macmeta = (cPlatform() == dbipMac) && e->modifiers().testFlag(Qt::ControlModifier) && !e->modifiers().testFlag(Qt::MetaModifier) && !e->modifiers().testFlag(Qt::AltModifier); + bool macmeta = (cPlatform() == dbipMac || cPlatform() == dbipMacOld) && e->modifiers().testFlag(Qt::ControlModifier) && !e->modifiers().testFlag(Qt::MetaModifier) && !e->modifiers().testFlag(Qt::AltModifier); bool ctrl = e->modifiers().testFlag(Qt::ControlModifier) || e->modifiers().testFlag(Qt::MetaModifier); bool ctrlGood = (ctrl && shift) || (ctrl && (f()->_ctrlEnterSubmit == CtrlEnterSubmitCtrlEnter || f()->_ctrlEnterSubmit == CtrlEnterSubmitBoth)) || @@ -1904,7 +1904,7 @@ void InputField::customUpDown(bool custom) { void InputField::InputFieldInner::keyPressEvent(QKeyEvent *e) { bool shift = e->modifiers().testFlag(Qt::ShiftModifier), alt = e->modifiers().testFlag(Qt::AltModifier); - bool macmeta = (cPlatform() == dbipMac) && e->modifiers().testFlag(Qt::ControlModifier) && !e->modifiers().testFlag(Qt::MetaModifier) && !e->modifiers().testFlag(Qt::AltModifier); + bool macmeta = (cPlatform() == dbipMac || cPlatform() == dbipMacOld) && e->modifiers().testFlag(Qt::ControlModifier) && !e->modifiers().testFlag(Qt::MetaModifier) && !e->modifiers().testFlag(Qt::AltModifier); bool ctrl = e->modifiers().testFlag(Qt::ControlModifier) || e->modifiers().testFlag(Qt::MetaModifier), ctrlGood = true; bool enter = (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return); diff --git a/Telegram/SourceFiles/gui/flattextarea.cpp b/Telegram/SourceFiles/gui/flattextarea.cpp index 8d917d475..7dccc46b1 100644 --- a/Telegram/SourceFiles/gui/flattextarea.cpp +++ b/Telegram/SourceFiles/gui/flattextarea.cpp @@ -860,7 +860,7 @@ void FlatTextarea::setCtrlEnterSubmit(bool ctrlEnterSubmit) { void FlatTextarea::keyPressEvent(QKeyEvent *e) { bool shift = e->modifiers().testFlag(Qt::ShiftModifier); - bool macmeta = (cPlatform() == dbipMac) && e->modifiers().testFlag(Qt::ControlModifier) && !e->modifiers().testFlag(Qt::MetaModifier) && !e->modifiers().testFlag(Qt::AltModifier); + bool macmeta = (cPlatform() == dbipMac || cPlatform() == dbipMacOld) && e->modifiers().testFlag(Qt::ControlModifier) && !e->modifiers().testFlag(Qt::MetaModifier) && !e->modifiers().testFlag(Qt::AltModifier); bool ctrl = e->modifiers().testFlag(Qt::ControlModifier) || e->modifiers().testFlag(Qt::MetaModifier), ctrlGood = (ctrl && _ctrlEnterSubmit) || (!ctrl && !shift && !_ctrlEnterSubmit) || (ctrl && shift); bool enter = (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return); diff --git a/Telegram/SourceFiles/gui/images.cpp b/Telegram/SourceFiles/gui/images.cpp index c155e512f..6b9b74756 100644 --- a/Telegram/SourceFiles/gui/images.cpp +++ b/Telegram/SourceFiles/gui/images.cpp @@ -24,6 +24,8 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "mainwidget.h" #include "localstorage.h" +#include "pspecific.h" + namespace { typedef QMap LocalImages; LocalImages localImages; @@ -712,3 +714,82 @@ StorageImage *getImage(const StorageImageLocation &location, const QByteArray &b } return i.value(); } + +ReadAccessEnabler::ReadAccessEnabler(const PsFileBookmark *bookmark) : _bookmark(bookmark), _failed(_bookmark ? !_bookmark->enable() : false) { +} + +ReadAccessEnabler::ReadAccessEnabler(const QSharedPointer &bookmark) : _bookmark(bookmark.data()), _failed(_bookmark ? !_bookmark->enable() : false) { +} + +ReadAccessEnabler::~ReadAccessEnabler() { + if (_bookmark && !_failed) _bookmark->disable(); +} + +FileLocation::FileLocation(StorageFileType type, const QString &name) : type(type), fname(name) { + if (fname.isEmpty()) { + size = 0; + type = StorageFileUnknown; + } else { + setBookmark(psPathBookmark(name)); + + QFileInfo f(name); + if (f.exists()) { + qint64 s = f.size(); + if (s > INT_MAX) { + fname = QString(); + _bookmark.reset(0); + size = 0; + type = StorageFileUnknown; + } else { + modified = f.lastModified(); + size = qint32(s); + } + } else { + fname = QString(); + _bookmark.reset(0); + size = 0; + type = StorageFileUnknown; + } + } +} + +bool FileLocation::check() const { + if (fname.isEmpty()) return false; + + ReadAccessEnabler enabler(_bookmark); + if (enabler.failed()) { + const_cast(this)->_bookmark.reset(0); + } + + QFileInfo f(name()); + if (!f.isReadable()) return false; + + quint64 s = f.size(); + if (s > INT_MAX) return false; + + return (f.lastModified() == modified) && (qint32(s) == size); +} + +const QString &FileLocation::name() const { + return _bookmark ? _bookmark->name(fname) : fname; +} + +QByteArray FileLocation::bookmark() const { + return _bookmark ? _bookmark->bookmark() : QByteArray(); +} + +void FileLocation::setBookmark(const QByteArray &bm) { + if (bm.isEmpty()) { + _bookmark.reset(0); + } else { + _bookmark.reset(new PsFileBookmark(bm)); + } +} + +bool FileLocation::accessEnable() const { + return isEmpty() ? false : (_bookmark ? _bookmark->enable() : true); +} + +void FileLocation::accessDisable() const { + return _bookmark ? _bookmark->disable() : (void)0; +} diff --git a/Telegram/SourceFiles/gui/images.h b/Telegram/SourceFiles/gui/images.h index d625f0e03..384da3da1 100644 --- a/Telegram/SourceFiles/gui/images.h +++ b/Telegram/SourceFiles/gui/images.h @@ -240,46 +240,50 @@ void clearStorageImages(); void clearAllImages(); int64 imageCacheSize(); -struct FileLocation { - FileLocation(StorageFileType type, const QString &name, const QDateTime &modified, qint32 size) : type(type), name(name), modified(modified), size(size) { - } - FileLocation(StorageFileType type, const QString &name) : type(type), name(name) { - QFileInfo f(name); - if (f.exists()) { - qint64 s = f.size(); - if (s > INT_MAX) { - this->name = QString(); - size = 0; - type = StorageFileUnknown; - } else { - modified = f.lastModified(); - size = qint32(s); - } - } else { - this->name = QString(); - size = 0; - type = StorageFileUnknown; - } +class PsFileBookmark; +class ReadAccessEnabler { +public: + ReadAccessEnabler(const PsFileBookmark *bookmark); + ReadAccessEnabler(const QSharedPointer &bookmark); + bool failed() const { + return _failed; } + ~ReadAccessEnabler(); + +private: + const PsFileBookmark *_bookmark; + bool _failed; + +}; + +class FileLocation { +public: + FileLocation(StorageFileType type, const QString &name); FileLocation() : size(0) { } - bool check() const { - if (name.isEmpty()) return false; - QFileInfo f(name); - if (!f.exists()) return false; - quint64 s = f.size(); - if (s > INT_MAX) return false; - - return (f.lastModified() == modified) && (qint32(s) == size); + bool check() const; + const QString &name() const; + void setBookmark(const QByteArray &bookmark); + QByteArray bookmark() const; + bool isEmpty() const { + return name().isEmpty(); } + + bool accessEnable() const; + void accessDisable() const; + StorageFileType type; - QString name; + QString fname; QDateTime modified; qint32 size; + +private: + QSharedPointer _bookmark; + }; inline bool operator==(const FileLocation &a, const FileLocation &b) { - return a.type == b.type && a.name == b.name && a.modified == b.modified && a.size == b.size; + return a.type == b.type && a.name() == b.name() && a.modified == b.modified && a.size == b.size; } inline bool operator!=(const FileLocation &a, const FileLocation &b) { return !(a == b); diff --git a/Telegram/SourceFiles/gui/text.cpp b/Telegram/SourceFiles/gui/text.cpp index 623714e48..562112207 100644 --- a/Telegram/SourceFiles/gui/text.cpp +++ b/Telegram/SourceFiles/gui/text.cpp @@ -545,7 +545,7 @@ public: void parseCurrentChar() { int skipBack = 0; ch = ((ptr < end) ? *ptr : 0); - chInt = ch.unicode(); + emojiLookback = 0; bool skip = false, isNewLine = multiline && chIsNewline(ch), isSpace = chIsSpace(ch), isDiac = chIsDiac(ch), isTilde = checkTilde && (ch == '~'); if (chIsBad(ch) || ch.isLowSurrogate()) { skip = true; @@ -561,15 +561,7 @@ public: skipBack = -1; ++ptr; ch = *ptr; - chInt = (chInt << 16) | ch.unicode(); - } - } else if ((ch >= 48 && ch < 58) || ch == 35) { // check for digit emoji - if (ptr + 1 < end && (ptr + 1)->unicode() == 0x20E3) { - _t->_text.push_back(ch); - skipBack = -1; - ++ptr; - ch = *ptr; - chInt = (chInt << 16) | 0x20E3; + emojiLookback = 1; } } @@ -601,11 +593,11 @@ public: } void parseEmojiFromCurrent() { - int len = 0, skipped = (chInt > 0xFFFFU) ? 1 : 0; - EmojiPtr e = emojiFromText(ptr - skipped, end, len); + int len = 0; + EmojiPtr e = emojiFromText(ptr - emojiLookback, end, len); if (!e) return; - for (int l = len - skipped - 1; l > 0; --l) { + for (int l = len - emojiLookback - 1; l > 0; --l) { _t->_text.push_back(*++ptr); } if (e->postfix && _t->_text.at(_t->_text.size() - 1).unicode() != e->postfix) { @@ -688,7 +680,7 @@ public: blockStart = 0; emoji = 0; - ch = chInt = 0; + ch = emojiLookback = 0; lastSkipped = false; checkTilde = !cRetina() && _t->_font->size() == 13 && _t->_font->flags() == 0; // tilde Open Sans fix entitiesEnd = entities.cend(); @@ -789,7 +781,7 @@ private: // current char data QChar ch; // current char (low surrogate, if current char is surrogate pair) - uint32 chInt; // full ch, could be surrogate pair + int32 emojiLookback; // how far behind the current ptr to look for current emoji bool lastSkipped; // did we skip current char bool checkTilde; // do we need a special text block for tilde symbol }; @@ -1112,8 +1104,8 @@ public: if (_btype == TextBlockTText) { TextBlock *t = static_cast(b); - QFixed f_wLeft = _wLeft; - int32 f_lineHeight = _lineHeight; + QFixed f_wLeft = _wLeft; // vars for saving state of the last word start + int32 f_lineHeight = _lineHeight; // f points to the last word-start element of t->_words for (TextBlock::TextWords::const_iterator j = t->_words.cbegin(), en = t->_words.cend(), f = j; j != en; ++j) { bool wordEndsHere = (j->width >= 0); QFixed j_width = wordEndsHere ? j->width : -j->width; @@ -1131,9 +1123,9 @@ public: longWordLine = false; } if (wordEndsHere || longWordLine) { + f = j + 1; f_wLeft = _wLeft; f_lineHeight = _lineHeight; - f = j + 1; } continue; } @@ -1143,6 +1135,7 @@ public: if (elidedLine) { _lineHeight = elidedLineHeight; } else if (f != j) { + // word did not fit completely, so we roll back the state to the beginning of this long word j = f; _wLeft = f_wLeft; _lineHeight = f_lineHeight; @@ -1166,6 +1159,28 @@ public: f_wLeft = _wLeft; f_lineHeight = _lineHeight; } + if (lpadding > 0) { // no words in this block, spaces only + int32 elidedLineHeight = qMax(_lineHeight, blockHeight); + bool elidedLine = _elideLast && (_y + elidedLineHeight >= _yTo); + if (elidedLine) { + _lineHeight = elidedLineHeight; + } + ushort nextStart = _blockEnd(_t, i, e); + if (!drawLine(nextStart, i + 1, e)) return; + _y += _lineHeight; + _lineHeight = qMax(0, blockHeight); + _lineStart = nextStart; + _lineStartBlock = blockIndex + 1; + + last_rBearing = _rb; + last_rPadding = b->rpadding(); + _wLeft = _w; + if (_elideLast && _elideRemoveFromEnd > 0 && (_y + blockHeight >= _yTo)) { + _wLeft -= _elideRemoveFromEnd; + } + + longWordLine = true; + } continue; } @@ -2553,7 +2568,7 @@ void Text::setMarkedText(style::font font, const QString &text, const EntitiesIn _font = font; clean(); { -// QByteArray ba = text.toUtf8(); +// QByteArray ba = text.toUtf8(); // chars for OS X crash investigation // const char *ch = ba.constData(); // LOG(("STR: %1").arg(text)); // LOG(("BYTES: %1").arg(mb(ba.constData(), ba.size()).str())); @@ -2562,6 +2577,36 @@ void Text::setMarkedText(style::font font, const QString &text, const EntitiesIn // } // int32 w = _font->width(text); +// QString newText; // utf16 of the text for emoji +// newText.reserve(8 * text.size()); +// for (const QChar *ch = text.constData(), *e = ch + text.size(); ch != e; ++ch) { +// if (chIsNewline(*ch)) { +// newText.append(*ch); +// } else { +// if (ch->isHighSurrogate() || ch->isLowSurrogate()) { +// if (ch->isHighSurrogate() && (ch + 1 != e) && ((ch + 1)->isLowSurrogate())) { +// newText.append("0x").append(QString::number((uint32(ch->unicode()) << 16) | uint32((ch + 1)->unicode()), 16).toUpper()).append("LLU,"); +// ++ch; +// } else { +// newText.append("BADx").append(QString::number(ch->unicode(), 16).toUpper()).append("LLU,"); +// } +// } else { +// newText.append("0x").append(QString::number(ch->unicode(), 16).toUpper()).append("LLU,"); +// } +// } +// } +// newText.append("\n\n").append(text); +// TextParser parser(this, newText, EntitiesInText(), options); + +// QString newText; // utf8 of the text for emoji sequences +// newText.reserve(8 * text.size()); +// QByteArray ba = text.toUtf8(); +// for (int32 i = 0, l = ba.size(); i < l; ++i) { +// newText.append("\\x").append(QString::number(uchar(ba.at(i)), 16).toLower()); +// } +// newText.append("\n\n").append(text); +// TextParser parser(this, newText, EntitiesInText(), options); + TextParser parser(this, text, entities, options); } recountNaturalSize(true, options.dir); diff --git a/Telegram/SourceFiles/gui/text.h b/Telegram/SourceFiles/gui/text.h index 38db378ad..c1ff5a911 100644 --- a/Telegram/SourceFiles/gui/text.h +++ b/Telegram/SourceFiles/gui/text.h @@ -698,7 +698,7 @@ inline bool chIsDiac(QChar ch) { // diac and variation selectors return (ch.category() == QChar::Mark_NonSpacing) || (ch.unicode() == 1652); } inline bool chIsBad(QChar ch) { - return (ch == 0) || (ch >= 8232 && ch < 8237) || (ch >= 65024 && ch < 65040 && ch != 65039) || (ch >= 127 && ch < 160 && ch != 156) || (cPlatform() == dbipMac && ch >= 0x0B00 && ch <= 0x0B7F && chIsDiac(ch) && QSysInfo::macVersion() >= QSysInfo::MV_10_11); // tmp hack see https://bugreports.qt.io/browse/QTBUG-48910 + return (ch == 0) || (ch >= 8232 && ch < 8237) || (ch >= 65024 && ch < 65040 && ch != 65039) || (ch >= 127 && ch < 160 && ch != 156) || (cPlatform() == dbipMac && ch >= 0x0B00 && ch <= 0x0B7F && chIsDiac(ch) && cIsElCapitan()); // tmp hack see https://bugreports.qt.io/browse/QTBUG-48910 } inline bool chIsTrimmed(QChar ch, bool rich = false) { return (!rich || ch != TextCommand) && (chIsSpace(ch) || chIsBad(ch)); diff --git a/Telegram/SourceFiles/history.cpp b/Telegram/SourceFiles/history.cpp index b909a4c86..28854b397 100644 --- a/Telegram/SourceFiles/history.cpp +++ b/Telegram/SourceFiles/history.cpp @@ -150,7 +150,7 @@ void historyInit() { _initTextOptions(); } -void startGif(HistoryItem *row, const QString &file) { +void startGif(HistoryItem *row, const FileLocation &file) { if (row == animated.msg) { stopGif(); } else { diff --git a/Telegram/SourceFiles/history.h b/Telegram/SourceFiles/history.h index fd6f49e18..8abc9b95b 100644 --- a/Telegram/SourceFiles/history.h +++ b/Telegram/SourceFiles/history.h @@ -24,7 +24,7 @@ void historyInit(); class HistoryItem; -void startGif(HistoryItem *row, const QString &file); +void startGif(HistoryItem *row, const FileLocation &file); void itemRemovedGif(HistoryItem *item); void itemReplacedGif(HistoryItem *oldItem, HistoryItem *newItem); void stopGif(); diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index 7cb850fec..02762346c 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -874,6 +874,8 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { isUponSelected = hasSelected; } + _menu = new PopupMenu(); + _contextMenuLnk = textlnkOver(); HistoryItem *item = App::hoveredItem() ? App::hoveredItem() : App::hoveredLinkItem(); PhotoLink *lnkPhoto = dynamic_cast(_contextMenuLnk.data()); @@ -881,7 +883,6 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { AudioLink *lnkAudio = dynamic_cast(_contextMenuLnk.data()); DocumentLink *lnkDocument = dynamic_cast(_contextMenuLnk.data()); if (lnkPhoto || lnkVideo || lnkAudio || lnkDocument) { - _menu = new PopupMenu(); if (isUponSelected > 0) { _menu->addAction(lang(lng_context_copy_selected), this, SLOT(copySelectedText()))->setEnabled(true); } @@ -897,7 +898,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { _menu->addAction(lang(lng_context_cancel_download), this, SLOT(cancelContextDownload()))->setEnabled(true); } else { if ((lnkVideo && !lnkVideo->video()->already(true).isEmpty()) || (lnkAudio && !lnkAudio->audio()->already(true).isEmpty()) || (lnkDocument && !lnkDocument->document()->already(true).isEmpty())) { - _menu->addAction(lang(cPlatform() == dbipMac ? lng_context_show_in_finder : lng_context_show_in_folder), this, SLOT(showContextInFolder()))->setEnabled(true); + _menu->addAction(lang((cPlatform() == dbipMac || cPlatform() == dbipMacOld) ? lng_context_show_in_finder : lng_context_show_in_folder), this, SLOT(showContextInFolder()))->setEnabled(true); } _menu->addAction(lang(lnkVideo ? lng_context_open_video : (lnkAudio ? lng_context_open_audio : lng_context_open_file)), this, SLOT(openContextFile()))->setEnabled(true); _menu->addAction(lang(lnkVideo ? lng_context_save_video : (lnkAudio ? lng_context_save_audio : lng_context_save_file)), this, SLOT(saveContextFile()))->setEnabled(true); @@ -931,59 +932,49 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { HistoryServiceMsg *srv = dynamic_cast(item); if (isUponSelected > 0) { - if (!_menu) _menu = new PopupMenu(); _menu->addAction(lang(lng_context_copy_selected), this, SLOT(copySelectedText()))->setEnabled(true); if (item && item->id > 0 && isUponSelected != 2 && canSendMessages) { _menu->addAction(lang(lng_context_reply_msg), _widget, SLOT(onReplyToMessage())); } } else { if (item && item->id > 0 && isUponSelected != -2 && canSendMessages) { - if (!_menu) _menu = new PopupMenu(); _menu->addAction(lang(lng_context_reply_msg), _widget, SLOT(onReplyToMessage())); } if (item && !isUponSelected && !_contextMenuLnk) { if (HistorySticker *sticker = dynamic_cast(msg ? msg->getMedia() : 0)) { DocumentData *doc = sticker->document(); if (doc && doc->sticker() && doc->sticker()->set.type() != mtpc_inputStickerSetEmpty) { - if (!_menu) _menu = new PopupMenu(); _menu->addAction(lang(doc->sticker()->setInstalled() ? lng_context_pack_info : lng_context_pack_add), _widget, SLOT(onStickerPackInfo())); } } QString contextMenuText = item->selectedText(FullItemSel); if (!contextMenuText.isEmpty() && (!msg || !msg->getMedia() || msg->getMedia()->type() != MediaTypeSticker)) { - if (!_menu) _menu = new PopupMenu(); _menu->addAction(lang(lng_context_copy_text), this, SLOT(copyContextText()))->setEnabled(true); } } } if (_contextMenuLnk && dynamic_cast(_contextMenuLnk.data())) { - if (!_menu) _menu = new PopupMenu(); _menu->addAction(lang(lng_context_open_link), this, SLOT(openContextUrl()))->setEnabled(true); _menu->addAction(lang(lng_context_copy_link), this, SLOT(copyContextUrl()))->setEnabled(true); } else if (_contextMenuLnk && dynamic_cast(_contextMenuLnk.data())) { - if (!_menu) _menu = new PopupMenu(); _menu->addAction(lang(lng_context_open_email), this, SLOT(openContextUrl()))->setEnabled(true); _menu->addAction(lang(lng_context_copy_email), this, SLOT(copyContextUrl()))->setEnabled(true); } else if (_contextMenuLnk && dynamic_cast(_contextMenuLnk.data())) { - if (!_menu) _menu = new PopupMenu(); _menu->addAction(lang(lng_context_open_mention), this, SLOT(openContextUrl()))->setEnabled(true); _menu->addAction(lang(lng_context_copy_mention), this, SLOT(copyContextUrl()))->setEnabled(true); } else if (_contextMenuLnk && dynamic_cast(_contextMenuLnk.data())) { - if (!_menu) _menu = new PopupMenu(); _menu->addAction(lang(lng_context_open_hashtag), this, SLOT(openContextUrl()))->setEnabled(true); _menu->addAction(lang(lng_context_copy_hashtag), this, SLOT(copyContextUrl()))->setEnabled(true); } else { } if (isUponSelected > 1) { - if (!_menu) _menu = new PopupMenu(); _menu->addAction(lang(lng_context_forward_selected), _widget, SLOT(onForwardSelected())); if (selectedForDelete == selectedForForward) { _menu->addAction(lang(lng_context_delete_selected), _widget, SLOT(onDeleteSelected())); } _menu->addAction(lang(lng_context_clear_selection), _widget, SLOT(onClearSelected())); } else if (item && ((isUponSelected != -2 && (canForward || canDelete)) || item->id > 0)) { - if (!_menu) _menu = new PopupMenu(); if (isUponSelected != -2) { if (canForward) { _menu->addAction(lang(lng_context_forward_msg), _widget, SLOT(forwardMessage()))->setEnabled(true); @@ -998,7 +989,6 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { } } else { if (App::mousedItem() && !App::mousedItem()->serviceMsg() && App::mousedItem()->id > 0) { - if (!_menu) _menu = new PopupMenu(); _menu->addAction(lang(lng_context_select_msg), _widget, SLOT(selectMessage()))->setEnabled(true); item = App::mousedItem(); } @@ -1006,7 +996,10 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { App::contextItem(item); } - if (_menu) { + if (_menu->actions().isEmpty()) { + delete _menu; + _menu = 0; + } else { connect(_menu, SIGNAL(destroyed(QObject*)), this, SLOT(onMenuDestroy(QObject*))); _menu->popup(e->globalPos()); e->accept(); @@ -2943,7 +2936,8 @@ void HistoryWidget::updateStickers() { if (cLastStickersUpdate() && getms(true) < cLastStickersUpdate() + StickersUpdateTimeout) return; if (_stickersUpdateRequest) return; - _stickersUpdateRequest = MTP::send(MTPmessages_GetAllStickers(MTP_string(cStickersHash())), rpcDone(&HistoryWidget::stickersGot), rpcFail(&HistoryWidget::stickersFailed)); + cSetStickersHash(stickersCountHash(true)); + _stickersUpdateRequest = MTP::send(MTPmessages_GetAllStickers(MTP_int(cStickersHash())), rpcDone(&HistoryWidget::stickersGot), rpcFail(&HistoryWidget::stickersFailed)); } void HistoryWidget::notifyBotCommandsChanged(UserData *user) { @@ -2993,9 +2987,6 @@ void HistoryWidget::stickersGot(const MTPmessages_AllStickers &stickers) { const QVector &d_sets(d.vsets.c_vector().v); - QByteArray wasHash = cStickersHash(); - cSetStickersHash(qba(d.vhash)); - StickerSetsOrder &setsOrder(cRefStickerSetsOrder()); setsOrder.clear(); @@ -3008,21 +2999,9 @@ void HistoryWidget::stickersGot(const MTPmessages_AllStickers &stickers) { if (d_sets.at(i).type() == mtpc_stickerSet) { const MTPDstickerSet &set(d_sets.at(i).c_stickerSet()); StickerSets::iterator i = sets.find(set.vid.v); - QString title = qs(set.vtitle); - if (set.vflags.v & MTPDstickerSet::flag_official) { - if (!title.compare(qstr("Great Minds"), Qt::CaseInsensitive)) { - title = lang(lng_stickers_default_set); - } - setsOrder.push_front(set.vid.v); - } else { - setsOrder.push_back(set.vid.v); - } - + QString title = stickerSetTitle(set); if (i == sets.cend()) { i = sets.insert(set.vid.v, StickerSet(set.vid.v, set.vaccess_hash.v, title, qs(set.vshort_name), set.vcount.v, set.vhash.v, set.vflags.v | MTPDstickerSet_flag_NOT_LOADED)); - if (!(i->flags & MTPDstickerSet::flag_disabled)) { - setsToRequest.insert(set.vid.v, set.vaccess_hash.v); - } } else { i->access = set.vaccess_hash.v; i->title = title; @@ -3032,21 +3011,40 @@ void HistoryWidget::stickersGot(const MTPmessages_AllStickers &stickers) { i->count = set.vcount.v; i->hash = set.vhash.v; i->flags |= MTPDstickerSet_flag_NOT_LOADED; // need to request this set - if (!(i->flags & MTPDstickerSet::flag_disabled)) { - setsToRequest.insert(set.vid.v, set.vaccess_hash.v); - } + } + } + if (!(i->flags & MTPDstickerSet::flag_disabled) || (i->flags & MTPDstickerSet::flag_official)) { + setsOrder.push_back(set.vid.v); + if (i->stickers.isEmpty() || (i->flags & MTPDstickerSet_flag_NOT_LOADED)) { + setsToRequest.insert(set.vid.v, set.vaccess_hash.v); } } } } - for (StickerSets::iterator i = sets.begin(), e = sets.end(); i != e;) { - if (i->id == CustomStickerSetId || i->access != 0) { - ++i; + bool writeRecent = false; + RecentStickerPack &recent(cGetRecentStickers()); + for (StickerSets::iterator it = sets.begin(), e = sets.end(); it != e;) { + if (it->id == CustomStickerSetId || it->access != 0) { + ++it; } else { - i = sets.erase(i); + for (RecentStickerPack::iterator i = recent.begin(); i != recent.cend();) { + if (it->stickers.indexOf(i->first) >= 0) { + i = recent.erase(i); + writeRecent = true; + } else { + ++i; + } + } + it = sets.erase(it); } } + int32 countedHash = stickersCountHash(); + cSetStickersHash(countedHash); + if (countedHash != d.vhash.v) { + LOG(("API Error: received stickers hash %1 while counted hash is %2").arg(d.vhash.v).arg(countedHash)); + } + if (!setsToRequest.isEmpty() && App::api()) { for (QMap::const_iterator i = setsToRequest.cbegin(), e = setsToRequest.cend(); i != e; ++i) { App::api()->scheduleStickerSetRequest(i.key(), i.value()); @@ -3055,6 +3053,7 @@ void HistoryWidget::stickersGot(const MTPmessages_AllStickers &stickers) { } Local::writeStickers(); + if (writeRecent) Local::writeUserSettings(); if (App::main()) emit App::main()->stickersUpdated(); } @@ -3217,6 +3216,7 @@ void HistoryWidget::showHistory(const PeerId &peerId, MsgId showAtMsgId, bool re if (_history) { _history->draft = _field.getLastText(); + if (_migrated) _migrated->draft = QString(); // use migrated draft only once _history->draftCursor.fillFrom(_field); _history->draftToId = _replyToId; _history->draftPreviewCancelled = _previewCancelled; @@ -3326,6 +3326,7 @@ void HistoryWidget::showHistory(const PeerId &peerId, MsgId showAtMsgId, bool re _history->draftCursor = _migrated->draftCursor; _history->draftPreviewCancelled = _migrated->draftPreviewCancelled; _history->draftToId = 0; + _migrated->draft = QString(); // use migrated draft only once applyDraft(false); _replyToId = 0; } else { @@ -4246,7 +4247,7 @@ void HistoryWidget::blockDone(PeerData *peer, const MTPBool &result) { } void HistoryWidget::onBotStart() { - if (!_peer || !_peer->isUser() || !_peer->asUser()->botInfo) { + if (!_peer || !_peer->isUser() || !_peer->asUser()->botInfo || !_canSendMessages) { updateControlsVisibility(); return; } @@ -4813,7 +4814,7 @@ bool HistoryWidget::hasBroadcastToggle() const { } bool HistoryWidget::isBotStart() const { - if (!_peer || !_peer->isUser() || !_peer->asUser()->botInfo) return false; + if (!_peer || !_peer->isUser() || !_peer->asUser()->botInfo || !_canSendMessages) return false; return !_peer->asUser()->botInfo->startToken.isEmpty() || (_history->isEmpty() && !_history->lastMsg); } @@ -5291,11 +5292,12 @@ void HistoryWidget::cancelSendFile(const FileLoadResultPtr &file) { void HistoryWidget::confirmShareContact(const QString &phone, const QString &fname, const QString &lname, MsgId replyTo, bool ctrlShiftEnter) { if (!_peer) return; + PeerId shareToId = _peer->id; if (_confirmWithTextId == 0xFFFFFFFFFFFFFFFFL) { onSend(ctrlShiftEnter, replyTo); _confirmWithTextId = 0; } - shareContact(_peer->id, phone, fname, lname, replyTo); + shareContact(shareToId, phone, fname, lname, replyTo); } void HistoryWidget::cancelShareContact() { @@ -5893,7 +5895,7 @@ void HistoryWidget::updateBotKeyboard(History *h) { if (_keyboard.singleUse() && _keyboard.hasMarkup() && _keyboard.forMsgId() == FullMsgId(_channel, _history->lastKeyboardId) && _history->lastKeyboardUsed) { _history->lastKeyboardHiddenId = _history->lastKeyboardId; } - if (!isBotStart() && !isBlocked() && (wasVisible || _replyTo || (!_field.hasSendText() && !kbWasHidden()))) { + if (!isBotStart() && !isBlocked() && _canSendMessages && (wasVisible || _replyTo || (!_field.hasSendText() && !kbWasHidden()))) { if (!_a_show.animating()) { if (hasMarkup) { _kbScroll.show(); diff --git a/Telegram/SourceFiles/lang.cpp b/Telegram/SourceFiles/lang.cpp index db2cb4dc7..015b934af 100644 --- a/Telegram/SourceFiles/lang.cpp +++ b/Telegram/SourceFiles/lang.cpp @@ -85,8 +85,8 @@ QString Translator::translate(const char *context, const char *sourceText, const return QString(); } if (qstr("QWidgetTextControl") == context || qstr("QLineEdit") == context) { - if (qstr("&Undo") == sourceText) return lang((cPlatform() == dbipWindows) ? lng_wnd_menu_undo : ((cPlatform() == dbipMac) ? lng_mac_menu_undo : lng_linux_menu_undo)); - if (qstr("&Redo") == sourceText) return lang((cPlatform() == dbipWindows) ? lng_wnd_menu_redo : ((cPlatform() == dbipMac) ? lng_mac_menu_redo : lng_linux_menu_redo)); + if (qstr("&Undo") == sourceText) return lang((cPlatform() == dbipWindows) ? lng_wnd_menu_undo : ((cPlatform() == dbipMac || cPlatform() == dbipMacOld) ? lng_mac_menu_undo : lng_linux_menu_undo)); + if (qstr("&Redo") == sourceText) return lang((cPlatform() == dbipWindows) ? lng_wnd_menu_redo : ((cPlatform() == dbipMac || cPlatform() == dbipMacOld) ? lng_mac_menu_redo : lng_linux_menu_redo)); if (qstr("Cu&t") == sourceText) return lang(lng_mac_menu_cut); if (qstr("&Copy") == sourceText) return lang(lng_mac_menu_copy); if (qstr("&Paste") == sourceText) return lang(lng_mac_menu_paste); diff --git a/Telegram/SourceFiles/langs/lang_de.strings b/Telegram/SourceFiles/langs/lang_de.strings index 8b646e732..851201e6f 100644 --- a/Telegram/SourceFiles/langs/lang_de.strings +++ b/Telegram/SourceFiles/langs/lang_de.strings @@ -431,6 +431,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_channel_add_admins" = "Neuer Administrator"; "lng_channel_add_members" = "Mitglieder hinzufügen"; "lng_channel_members" = "Mitglieder"; +"lng_channel_only_last_shown" = "Nur {count:_not_used_|# letztes Mitglied wird angezeigt|letzte # Mitglieder werden angezeigt}"; "lng_channel_admins" = "Administratoren"; "lng_channel_add_admin" = "Administrator hinzufügen"; "lng_channel_admin_sure" = "Soll {user} Administrator werden?"; @@ -564,10 +565,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_emoji_category1" = "Personen"; "lng_emoji_category2" = "Natur"; "lng_emoji_category3" = "Essen & Trinken"; -"lng_emoji_category4" = "Feiern"; -"lng_emoji_category5" = "Aktivität"; -"lng_emoji_category6" = "Reisen & Orte"; -"lng_emoji_category7" = "Objekte & Symbole"; +"lng_emoji_category4" = "Aktivitäten"; +"lng_emoji_category5" = "Reisen & Orte"; +"lng_emoji_category6" = "Objekte"; +"lng_emoji_category7" = "Symbole & Flaggen"; "lng_switch_stickers" = "Sticker"; "lng_switch_emoji" = "Emoji"; @@ -581,6 +582,13 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_stickers_not_found" = "Sticker-Paket nicht gefunden."; "lng_stickers_copied" = "Sticker-Paket Link in die Zwischenablage kopiert."; "lng_stickers_default_set" = "Große Denker"; +"lng_stickers_you_have" = "Sticker-Pakete verwalten"; +"lng_stickers_packs" = "Sticker-Pakete"; +"lng_stickers_reorder" = "Paket gedrückt halten und verschieben um die Anordnung zu ändern"; +"lng_stickers_remove" = "Löschen"; +"lng_stickers_return" = "Rückgängig"; +"lng_stickers_restore" = "Zeigen"; +"lng_stickers_count" = "{count:Lade..|# Sticker|# Sticker}"; "lng_in_dlg_photo" = "Bild"; "lng_in_dlg_video" = "Video"; @@ -658,6 +666,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_duration_and_size" = "{duration}, {size}"; "lng_choose_images" = "Bilder auswählen"; +"lng_context_view_profile" = "Profil öffnen"; +"lng_context_view_group" = "Gruppeninfo zeigen"; +"lng_context_view_channel" = "Kanalinfo anzeigen"; + "lng_context_open_link" = "Link öffnen"; "lng_context_copy_link" = "Link kopieren"; "lng_context_open_email" = "Email verfassen"; @@ -789,7 +801,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_new_version_wrap" = "Telegram Desktop wurde aktualisiert auf Version {version}\n\n{changes}\n\nGesamter Versionsverlauf:\n{link}"; "lng_new_version_minor" = "— Fehlerbehebungen und Softwareoptimierungen"; -"lng_new_version_text" = "— Gruppen erlauben ab sofort Administratoren: Diese können den Gruppennamen und das Bild ändern sowie Mitglieder hinzufügen und auch wieder entfernen\n— Gruppen, die das Limit von 200 Mitgliedern erreicht haben, können in eine Supergruppe (1000 Mitglieder) geändert werden\n\nAusführliche Informationen zu den neuen Supergruppen:\n{link}\n\nUnseren deutschsprachigen Infokanal findest du hier: https://telegram.me/TelegramDE"; +"lng_new_version_text" = "— Sticker-Verwaltung: Ändere die Sortierung deiner Sticker-Pakete, Sortierung wird auf all deinen Geräten synchronisiert \n— Sticker gedrückt halten vor dem Versand für eine Vorschau\n— Neues Kontextmenü für Chats in der Chatliste \n— Neue Emoji werden unterstützt\n\nUnseren deutschsprachigen Infokanal findest du hier: https://telegram.me/TelegramDE"; "lng_menu_insert_unicode" = "Unicode-Steuerzeichen einfügen"; diff --git a/Telegram/SourceFiles/langs/lang_es.strings b/Telegram/SourceFiles/langs/lang_es.strings index 70aaba955..f5453d70e 100644 --- a/Telegram/SourceFiles/langs/lang_es.strings +++ b/Telegram/SourceFiles/langs/lang_es.strings @@ -407,10 +407,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_profile_set_group_photo" = "Poner foto"; "lng_profile_add_participant" = "Añadir miembros"; "lng_profile_delete_and_exit" = "Dejar grupo"; -"lng_profile_kick" = "Expulsar"; -"lng_profile_sure_kick" = "¿Expulsar a {user} del grupo?"; -"lng_profile_sure_kick_channel" = "¿Expulsar a {user} del canal?"; -"lng_profile_sure_kick_admin" = "¿Expulsar a {user} de los administradores?"; +"lng_profile_kick" = "Eliminar"; +"lng_profile_sure_kick" = "¿Eliminar a {user} del grupo?"; +"lng_profile_sure_kick_channel" = "¿Eliminar a {user} del canal?"; +"lng_profile_sure_kick_admin" = "¿Eliminar a {user} de los administradores?"; "lng_profile_loading" = "Cargando..."; "lng_profile_shared_media" = "Multimedia"; "lng_profile_no_media" = "No hay multimedia en este chat."; @@ -431,6 +431,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_channel_add_admins" = "Nuevo administrador"; "lng_channel_add_members" = "Añadir miembros"; "lng_channel_members" = "Miembros"; +"lng_channel_only_last_shown" = "Sólo {count:_not_used_|aparece el último miembro|aparecen los últimos # miembros}"; "lng_channel_admins" = "Administradores"; "lng_channel_add_admin" = "Añadir administrador"; "lng_channel_admin_sure" = "¿Añadir a {user} como administrador?"; @@ -438,7 +439,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_chat_all_members_admins" = "Todos son administradores"; "lng_chat_about_all_admins" = "Todos pueden añadir nuevos miembros, editar el nombre y la foto del grupo."; -"lng_chat_about_admins" = "Sólo los administradores pueden añadir y quitar miembros, editar el nombre y la foto del grupo."; +"lng_chat_about_admins" = "Sólo los administradores pueden añadir y eliminar miembros, editar el nombre y la foto del grupo."; "lng_participant_filter" = "Buscar"; "lng_participant_invite" = "Invitar"; @@ -447,7 +448,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_create_group_next" = "Siguiente"; "lng_create_group_create" = "Crear"; "lng_create_group_title" = "Nuevo grupo"; -"lng_create_group_about" = "Los grupos son ideales para las comunidades más pequeñas,\nde hasta {count:_not_used|# miembro|# miembros}"; +"lng_create_group_about" = "Los grupos son ideales para las comunidades\nmás pequeñas, de hasta {count:_not_used|# miembro|# miembros}"; "lng_create_channel_title" = "Nuevo canal"; "lng_create_channel_about" = "Los canales permiten difundir tus mensajes a audiencias ilimitadas"; "lng_create_public_channel_title" = "Canal público"; @@ -477,9 +478,9 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_sure_delete_group_history" = "¿Quieres borrar todo el historial en «{group}»?\n\nEsta acción no se puede deshacer."; "lng_sure_delete_and_exit" = "¿Quieres eliminar todo el historial de mensajes y dejar el grupo «{group}»?\n\nEsta acción no se puede deshacer."; "lng_sure_leave_channel" = "¿Quieres dejar este canal?"; -"lng_sure_delete_channel" = "¿Quieres eliminar este canal? Todos los miembros y mensajes serán eliminados."; +"lng_sure_delete_channel" = "¿Quieres eliminar este canal? Todos los miembros y mensajes se perderán."; "lng_sure_leave_group" = "¿Quieres salir del grupo?\nNo puedes deshacer esta acción."; -"lng_sure_delete_group" = "¿Quieres eliminar este grupo? Todos los miembros y mensajes serán eliminados."; +"lng_sure_delete_group" = "¿Quieres eliminar este grupo? Todos los miembros y mensajes se perderán."; "lng_message_empty" = "Mensaje vacío"; "lng_media_unsupported" = "Multimedia no soportada"; @@ -492,12 +493,12 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_action_you_joined" = "Te uniste a este canal"; "lng_action_add_you_group" = "{from} te añadió al grupo"; "lng_action_you_joined_group" = "Te uniste a este grupo"; -"lng_action_kick_user" = "{from} expulsó a {user}"; +"lng_action_kick_user" = "{from} eliminó a {user}"; "lng_action_user_left" = "{from} dejó el grupo"; "lng_action_user_joined" = "{from} se unió al grupo"; "lng_action_user_joined_by_link" = "{from} se unió al grupo con un enlace de invitación"; "lng_action_user_registered" = "{from} se acaba de unir a Telegram"; -"lng_action_removed_photo" = "{from} quitó la foto del grupo"; +"lng_action_removed_photo" = "{from} eliminó la foto del grupo"; "lng_action_removed_photo_channel" = "Foto del canal eliminada"; "lng_action_changed_photo" = "{from} actualizó la foto del grupo"; "lng_action_changed_photo_channel" = "Foto del canal actualizada"; @@ -564,10 +565,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_emoji_category1" = "Personas"; "lng_emoji_category2" = "Naturaleza"; "lng_emoji_category3" = "Comida y bebida"; -"lng_emoji_category4" = "Celebración"; -"lng_emoji_category5" = "Actividad"; -"lng_emoji_category6" = "Viajes y destinos"; -"lng_emoji_category7" = "Objetos y símbolos"; +"lng_emoji_category4" = "Actividad"; +"lng_emoji_category5" = "Viajes y destinos"; +"lng_emoji_category6" = "Objetos"; +"lng_emoji_category7" = "Símbolos y banderas"; "lng_switch_stickers" = "Stickers"; "lng_switch_emoji" = "Emoji"; @@ -581,6 +582,13 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_stickers_not_found" = "Pack de stickers no encontrado."; "lng_stickers_copied" = "Enlace del pack de stickers copiado al portapapeles."; "lng_stickers_default_set" = "Grandes personajes"; +"lng_stickers_you_have" = "Administrar y ordenar los packs de stickers"; +"lng_stickers_packs" = "Packs de stickers"; +"lng_stickers_reorder" = "Haz clic y arrastra para ordenar los packs"; +"lng_stickers_remove" = "Eliminar"; +"lng_stickers_return" = "Deshacer"; +"lng_stickers_restore" = "Restaurar"; +"lng_stickers_count" = "{count:Cargando...|# sticker|# stickers}"; "lng_in_dlg_photo" = "Foto"; "lng_in_dlg_video" = "Vídeo"; @@ -658,6 +666,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_duration_and_size" = "{duration}, {size}"; "lng_choose_images" = "Elegir imágenes"; +"lng_context_view_profile" = "Ver información"; +"lng_context_view_group" = "Ver información"; +"lng_context_view_channel" = "Ver información"; + "lng_context_open_link" = "Abrir enlace"; "lng_context_copy_link" = "Copiar enlace"; "lng_context_open_email" = "Escribir a esta dirección"; @@ -789,7 +801,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_new_version_wrap" = "Telegram Desktop ha sido actualizada a la versión {version}\n\n{changes}\n\nEl historial completo está disponible aquí:\n{link}"; "lng_new_version_minor" = "— Corrección de errores y otras mejoras menores"; -"lng_new_version_text" = "– Los grupos ahora pueden tener múltiples administradores, con la habilidad de editar el nombre y foto de perfil, además de añadir y quitar miembros\n– Los grupos que alcanzan la capacidad de 200 usuarios pueden convertirse en supergrupos, que permiten hasta 1000 miembros\n\nMás sobre los administradores y supergrupos:\n{link}"; +"lng_new_version_text" = "— Administra los stickers: ordena manualmente tus packs de stickers. El orden de los packs se sincronizará en todos tus dispositivos \n— Haz clic y mantén en un sticker para ver una vista previa antes de enviar\n— Nuevo menú contextual para los chats en la lista de chats \n— Soporte de todos los emojis existentes"; "lng_menu_insert_unicode" = "Insertar caracteres de control Unicode"; diff --git a/Telegram/SourceFiles/langs/lang_it.strings b/Telegram/SourceFiles/langs/lang_it.strings index ffa9ded73..7613ae82f 100644 --- a/Telegram/SourceFiles/langs/lang_it.strings +++ b/Telegram/SourceFiles/langs/lang_it.strings @@ -431,6 +431,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_channel_add_admins" = "Nuovo amministratore"; "lng_channel_add_members" = "Aggiungi membri"; "lng_channel_members" = "Membri"; +"lng_channel_only_last_shown" = "Solo {count:_not_used_|l'ultimo membro è mostrato|gli ultimi # membri sono mostrati} qui"; "lng_channel_admins" = "Amministratori"; "lng_channel_add_admin" = "Aggiungi amministratore"; "lng_channel_admin_sure" = "Aggiungere {user} agli amministratori?"; @@ -564,10 +565,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_emoji_category1" = "Persone"; "lng_emoji_category2" = "Natura"; "lng_emoji_category3" = "Cibo e bevande"; -"lng_emoji_category4" = "Festeggiamenti"; -"lng_emoji_category5" = "Attività"; -"lng_emoji_category6" = "Viaggi e luoghi"; -"lng_emoji_category7" = "Oggetti e simboli"; +"lng_emoji_category4" = "Attività"; +"lng_emoji_category5" = "Viaggi e luoghi"; +"lng_emoji_category6" = "Oggetti"; +"lng_emoji_category7" = "Simboli e bandiere"; "lng_switch_stickers" = "Sticker"; "lng_switch_emoji" = "Emoji"; @@ -578,9 +579,16 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_stickers_remove_pack" = "Rimuovere «{sticker_pack}»?"; "lng_stickers_add_pack" = "Aggiungi sticker"; "lng_stickers_share_pack" = "Condividi sticker"; -"lng_stickers_not_found" = "Pacchetto di sticker non trovato."; +"lng_stickers_not_found" = "Set di sticker non trovato."; "lng_stickers_copied" = "Link degli sticker copiato negli appunti."; "lng_stickers_default_set" = "Grandi menti"; +"lng_stickers_you_have" = "Organizza e riordina i set di sticker"; +"lng_stickers_packs" = "Set di sticker"; +"lng_stickers_reorder" = "Clicca e tieni premuto per riordinare i set di sticker"; +"lng_stickers_remove" = "Elimina"; +"lng_stickers_return" = "Annulla"; +"lng_stickers_restore" = "Ripristina"; +"lng_stickers_count" = "{count:Caricamento..|# sticker|# sticker}"; "lng_in_dlg_photo" = "Foto"; "lng_in_dlg_video" = "Video"; @@ -658,6 +666,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_duration_and_size" = "{duration}, {size}"; "lng_choose_images" = "Scegli immagini"; +"lng_context_view_profile" = "Visualizza profilo"; +"lng_context_view_group" = "Visualizza info gruppo"; +"lng_context_view_channel" = "Visualizza info canale"; + "lng_context_open_link" = "Apri link"; "lng_context_copy_link" = "Copia link"; "lng_context_open_email" = "Scrivi a questo indirizzo"; @@ -789,7 +801,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_new_version_wrap" = "Telegram Desktop si è aggiornato alla versione {version}\n\n{changes}\n\nLa cronologia degli aggiornamenti è disponibile qui:\n{link}"; "lng_new_version_minor" = "— Bug fix e altri miglioramenti minori"; -"lng_new_version_text" = "— I gruppi ora possono avere più amministratori con la possibilità di cambiare il nome e l'immagine, e di aggiungere e rimuovere membri\n— I gruppi che hanno raggiunto i 200 membri possono essere aggiornati a supergruppi e avere fino a 1000 membri\n\nPiù info su amministratori e supergruppi:\n{link}"; +"lng_new_version_text" = "— Gestione degli sticker: Riordina manualmente i tuoi set di sticker, ora sono sincronizzati tra i tuoi dispositivi\n— Clicca e tieni premuto su uno sticker per visualizzare l'anteprima prima di inviarlo\n— Nuovo menu contestuale per le chat nella lista chat\n— Tutte le nuove emoji ora sono supportate"; "lng_menu_insert_unicode" = "Inserisci carattere di controllo Unicode"; diff --git a/Telegram/SourceFiles/langs/lang_ko.strings b/Telegram/SourceFiles/langs/lang_ko.strings index e29ec4ee9..8d1dc19b2 100644 --- a/Telegram/SourceFiles/langs/lang_ko.strings +++ b/Telegram/SourceFiles/langs/lang_ko.strings @@ -431,6 +431,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_channel_add_admins" = "새로운 관리자"; "lng_channel_add_members" = "구성원 추가"; "lng_channel_members" = "구성원"; +"lng_channel_only_last_shown" = "마지막 {count:_not_used_|# 구성원|# 구성원} 들이 표시가 됩니다."; "lng_channel_admins" = "관리자"; "lng_channel_add_admin" = "관리자 추가"; "lng_channel_admin_sure" = "{user}를 관리자로 추가하시겠습니까?"; @@ -564,10 +565,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_emoji_category1" = "사람"; "lng_emoji_category2" = "자연"; "lng_emoji_category3" = "음식점"; -"lng_emoji_category4" = "기념일"; -"lng_emoji_category5" = "활동"; -"lng_emoji_category6" = "여행 및 장소"; -"lng_emoji_category7" = "오브제 & 상징"; +"lng_emoji_category4" = "활동"; +"lng_emoji_category5" = "여행 및 장소"; +"lng_emoji_category6" = "물건"; +"lng_emoji_category7" = "심볼 및 국기"; "lng_switch_stickers" = "스티커"; "lng_switch_emoji" = "이모티콘"; @@ -581,6 +582,13 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_stickers_not_found" = "스티커 팩을 찾을 수 없습니다."; "lng_stickers_copied" = "클립보드에 스티커 팩 링크가 복사 되었습니다."; "lng_stickers_default_set" = "Great Minds"; +"lng_stickers_you_have" = "스티커팩 관리 및 변경"; +"lng_stickers_packs" = "스티커팩"; +"lng_stickers_reorder" = "클릭과 드래그를 통하여 스태커 팩을 변경하세요"; +"lng_stickers_remove" = "삭제"; +"lng_stickers_return" = "실행취소"; +"lng_stickers_restore" = "복구"; +"lng_stickers_count" = "{count:Loading..|# 스티커|# 스티커} "; "lng_in_dlg_photo" = "사진"; "lng_in_dlg_video" = "비디오"; @@ -658,6 +666,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_duration_and_size" = "{duration}, {size}"; "lng_choose_images" = "이미지 선택"; +"lng_context_view_profile" = "프로필 보기"; +"lng_context_view_group" = "그룹 정보 보기"; +"lng_context_view_channel" = "채널 정보 보기"; + "lng_context_open_link" = "링크 열기"; "lng_context_copy_link" = "링크 복사"; "lng_context_open_email" = "이 주소로 메시지 보내기"; @@ -789,7 +801,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_new_version_wrap" = "텔레그램 데스크탑은 {version} 버전으로 업데이트 되었습니다.\n\n{changes}\n\n전체 버전 히스토리는 아래에서 확인 가능합니다:\n{link}"; "lng_new_version_minor" = "— 버그 수정 및 일부 기능 향상"; -"lng_new_version_text" = "— 그룹방은 이름,로고, 초대등이 가능한 여러 관리자 설정 가능\n— 기존 200명까지 허용 가능한 그룹방은 슈퍼그룹방으로 업그레이드를 하여 1,000명까지 허용 가능\n\n관리자 및 슈퍼그룹방에 대하여:\n{link}"; +"lng_new_version_text" = "— 스티커관리 : 스티커팩을 순서를 수동으로 변경하여, 연결된 모든 기기에 동기화 \n— 스티커를 지속하여 누를 경우 전송전 프리뷰 기능 추가\n— 채팅목록에 채팅관련 메뉴 추가\n— 기존 이모티콘 지원"; "lng_menu_insert_unicode" = "유니코드 문자를 입력하세요."; diff --git a/Telegram/SourceFiles/langs/lang_nl.strings b/Telegram/SourceFiles/langs/lang_nl.strings index 0cc1e46d5..4f21e3b0d 100644 --- a/Telegram/SourceFiles/langs/lang_nl.strings +++ b/Telegram/SourceFiles/langs/lang_nl.strings @@ -431,6 +431,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_channel_add_admins" = "Beheerder toevoegen"; "lng_channel_add_members" = "Deelnemers toevoegen"; "lng_channel_members" = "Deelnemers"; +"lng_channel_only_last_shown" = "De laatste {count:_not_used_|# deelnemer|# deelnemers} worden hier weergegeven"; "lng_channel_admins" = "Beheerders"; "lng_channel_add_admin" = "Beheerder toevoegen"; "lng_channel_admin_sure" = "{user} aan beheerders toevoegen?"; @@ -564,10 +565,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_emoji_category1" = "Mensen"; "lng_emoji_category2" = "Natuur"; "lng_emoji_category3" = "Eten & drinken"; -"lng_emoji_category4" = "Feestelijkheid"; -"lng_emoji_category5" = "Activiteit"; -"lng_emoji_category6" = "Reizen & plekken"; -"lng_emoji_category7" = "Objecten & symbolen"; +"lng_emoji_category4" = "Activiteit"; +"lng_emoji_category5" = "Reizen & plekken"; +"lng_emoji_category6" = "Objecten"; +"lng_emoji_category7" = "Symbolen en vlaggen"; "lng_switch_stickers" = "Stickers"; "lng_switch_emoji" = "Emoji"; @@ -581,6 +582,13 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_stickers_not_found" = "Stickerbundel niet gevonden."; "lng_stickers_copied" = "Stickerbundel-link gekopieerd naar klembord"; "lng_stickers_default_set" = "Grote geesten"; +"lng_stickers_you_have" = "Beheer en sorteer stickerbundels"; +"lng_stickers_packs" = "Stickerbundels"; +"lng_stickers_reorder" = "Klik en sleep om stickerbundels te herschikken"; +"lng_stickers_remove" = "Verwijder"; +"lng_stickers_return" = "Ongedaan maken"; +"lng_stickers_restore" = "Herstellen"; +"lng_stickers_count" = "{count:Laden..|# sticker|# stickers}"; "lng_in_dlg_photo" = "Foto"; "lng_in_dlg_video" = "Video"; @@ -658,6 +666,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_duration_and_size" = "{duration}, {size}"; "lng_choose_images" = "Afbeeldingen kiezen"; +"lng_context_view_profile" = "Profiel weergeven"; +"lng_context_view_group" = "Groepsinformatie weergeven"; +"lng_context_view_channel" = "Kanaalinformatie weergeven"; + "lng_context_open_link" = "Link openen"; "lng_context_copy_link" = "Link kopiëren"; "lng_context_open_email" = "Naar dit adres sturen"; @@ -789,7 +801,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_new_version_wrap" = "Telegram is bijgewerkt naar versie {version}\n\n{changes} \n\nVolledige versiegeschiedenis is hier te vinden:\n{link}"; "lng_new_version_minor" = "— Probleemoplossing en andere kleine verbeteringen"; -"lng_new_version_text" = "— Meerdere beheerders in groepen, naast het wijzigen van de groepsnaam en afbeelding kunnen beheerders ook leden toevoegen en verwijderen.\n— Groepen die de limiet van 200 deelnemers hebben bereikt kunnen worden opgewaardeerd naar supergroepen met maximaal 1000 deelnemers.\n\nMeer informatie over supergroepen en de andere nieuwe functies is hier te vinden: \n{link}"; +"lng_new_version_text" = "— Stickerbeheer: Je kunt nu handmatig je stickerbundels sorteren, de volgorde synchroniseren we voor je, over al je apparaten.\n— Klik en hou een sticker vast om een voorbeeld weer te geven voor het versturen.\n— Nieuw contextmenu voor chats in het chats-overzicht\n— Ondersteuning voor alle bestaande emoji"; "lng_menu_insert_unicode" = "Unicode-besturingsteken invoegen"; diff --git a/Telegram/SourceFiles/langs/lang_pt_BR.strings b/Telegram/SourceFiles/langs/lang_pt_BR.strings index 5bf5ba957..de6d18440 100644 --- a/Telegram/SourceFiles/langs/lang_pt_BR.strings +++ b/Telegram/SourceFiles/langs/lang_pt_BR.strings @@ -431,6 +431,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_channel_add_admins" = "Novo administrador"; "lng_channel_add_members" = "Adicionar membros"; "lng_channel_members" = "Membros"; +"lng_channel_only_last_shown" = "Somente os últimos {count:_not_used_|# membro é|# membros são} exibidos"; "lng_channel_admins" = "Administradores"; "lng_channel_add_admin" = "Adicionar Administrador"; "lng_channel_admin_sure" = "Adicionar {user} aos administradores?"; @@ -510,7 +511,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_profile_migrate_reached" = "{count:_not_used_|# membro|# membros} limite alcançado"; "lng_profile_migrate_about" = "Se você deseja ir além do limite, pode converter seu grupo em um supergrupo. Nos supergrupos:"; "lng_profile_migrate_feature1" = "— O limite de membros são {count:_not_used_|# usuário|# usuários}"; -"lng_profile_migrate_feature2" = "— Novos membros podem ver o histórico completo do chat"; +"lng_profile_migrate_feature2" = "— Novos membros podem ver todo o histórico"; "lng_profile_migrate_feature3" = "— Administradores podem apagar mensagens para todos"; "lng_profile_migrate_feature4" = "— Notificações silenciadas por padrão"; "lng_profile_migrate_button" = "Atualizar para supergrupo"; @@ -564,10 +565,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_emoji_category1" = "Pessoas"; "lng_emoji_category2" = "Natureza"; "lng_emoji_category3" = "Comidas e Bebidas"; -"lng_emoji_category4" = "Celebração"; -"lng_emoji_category5" = "Atividade"; -"lng_emoji_category6" = "Viagens e Lugares"; -"lng_emoji_category7" = "Objetos e Símbolos"; +"lng_emoji_category4" = "Atividade"; +"lng_emoji_category5" = "Viagens e Lugares"; +"lng_emoji_category6" = "Objetos"; +"lng_emoji_category7" = "Símbolos e Bandeiras"; "lng_switch_stickers" = "Stickers"; "lng_switch_emoji" = "Emoji"; @@ -581,6 +582,13 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_stickers_not_found" = "Pacote de sticker não encontrado."; "lng_stickers_copied" = "Link copiado para a área de transferência."; "lng_stickers_default_set" = "Grandes Mentes"; +"lng_stickers_you_have" = "Gerenciar e reordenar os pacotes de sticker"; +"lng_stickers_packs" = "Pacotes de Sticker"; +"lng_stickers_reorder" = "Clique e arraste para reordenar os pacotes"; +"lng_stickers_remove" = "Remover"; +"lng_stickers_return" = "Desfazer"; +"lng_stickers_restore" = "Restaurar"; +"lng_stickers_count" = "{count:Carregando..|# sticker|# stickers}"; "lng_in_dlg_photo" = "Foto"; "lng_in_dlg_video" = "Vídeo"; @@ -658,6 +666,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_duration_and_size" = "{duration}, {size}"; "lng_choose_images" = "Escolher imagens"; +"lng_context_view_profile" = "Ver perfil"; +"lng_context_view_group" = "Ver info do grupo"; +"lng_context_view_channel" = "Ver info do canal"; + "lng_context_open_link" = "Abrir Link"; "lng_context_copy_link" = "Copiar Link"; "lng_context_open_email" = "Escrever para este endereço"; @@ -789,7 +801,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_new_version_wrap" = "Telegram Desktop foi atualizado para a versão {version}\n\n{changes}\n\nHistórico completo de mudanças disponível aqui:\n{link}"; "lng_new_version_minor" = "— Resolução de bugs e outras melhorias menores"; -"lng_new_version_text" = "— Grupos agora podem ter múltiplos administradores com a habilidade de editar o nome e o logo, além de adicionar e remover membros\n— Grupos que ultrapassarem o limite dos 200 usuários poderão atualizar para supergrupos e ter até 1.000 membros\n\nMais sobre administradores e supergrupos:\n{link}"; +"lng_new_version_text" = "— Gerenciamento de stickers: rearranje manualmente seus pacotes de sticker, a ordem dos pacotes agora é sincronizada entre todos os dispositivos\n— Clique e segure sobre um sticker para pré-visualizar antes de enviar\n— Novo menu de contexto para os chats na lista de chats \n— Suporte para todos os emojis existentes"; "lng_menu_insert_unicode" = "Inserir caractere de controle Unicode"; diff --git a/Telegram/SourceFiles/layerwidget.cpp b/Telegram/SourceFiles/layerwidget.cpp index 35957e532..85f0fe664 100644 --- a/Telegram/SourceFiles/layerwidget.cpp +++ b/Telegram/SourceFiles/layerwidget.cpp @@ -27,8 +27,12 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "mainwidget.h" #include "gui/filedialog.h" -BackgroundWidget::BackgroundWidget(QWidget *parent, LayeredWidget *w) : QWidget(parent), w(w), -aBackground(0), aBackgroundFunc(anim::easeOutCirc), hiding(false), shadow(st::boxShadow) { +BackgroundWidget::BackgroundWidget(QWidget *parent, LayeredWidget *w) : TWidget(parent) +, w(w) +, aBackground(0) +, aBackgroundFunc(anim::easeOutCirc) +, hiding(false) +, shadow(st::boxShadow) { w->setParent(this); if (App::app()) App::app()->mtpPause(); setGeometry(0, 0, App::wnd()->width(), App::wnd()->height()); @@ -189,3 +193,115 @@ BackgroundWidget::~BackgroundWidget() { (*i)->deleteLater(); } } + +StickerPreviewWidget::StickerPreviewWidget(QWidget *parent) : TWidget(parent) +, a_shown(0, 0) +, _a_shown(animFunc(this, &StickerPreviewWidget::animStep_shown)) +, _doc(0) +, _cacheStatus(CacheNotLoaded) { + setAttribute(Qt::WA_TransparentForMouseEvents); +} + +void StickerPreviewWidget::paintEvent(QPaintEvent *e) { + Painter p(this); + QRect r(e->rect()); + + const QPixmap &draw(currentImage()); + uint32 w = draw.width() / cIntRetinaFactor(), h = draw.height() / cIntRetinaFactor(); + if (_a_shown.animating()) { + float64 shown = a_shown.current(); + p.setOpacity(shown); +// w = qMax(qRound(w * (st::stickerPreviewMin + ((1. - st::stickerPreviewMin) * shown)) / 2.) * 2 + int(w % 2), 1); +// h = qMax(qRound(h * (st::stickerPreviewMin + ((1. - st::stickerPreviewMin) * shown)) / 2.) * 2 + int(h % 2), 1); + } + p.fillRect(r, st::stickerPreviewBg); + p.drawPixmap((width() - w) / 2, (height() - h) / 2, draw); +} + +void StickerPreviewWidget::resizeEvent(QResizeEvent *e) { + update(); +} + +bool StickerPreviewWidget::animStep_shown(float64 ms) { + float64 dt = ms / st::stickerPreviewDuration; + if (dt >= 1) { + a_shown.finish(); + _a_shown.stop(); + if (a_shown.current() < 0.5) hide(); + } else { + a_shown.update(dt, anim::linear); + } + update(); + return true; +} + +void StickerPreviewWidget::showPreview(DocumentData *sticker) { + if (sticker && !sticker->sticker()) sticker = 0; + if (sticker) { + _cache = QPixmap(); + if (isHidden() || _a_shown.animating()) { + if (isHidden()) show(); + a_shown.start(1); + _a_shown.start(); + } else { + update(); + } + } else if (isHidden()) { + return; + } else { + a_shown.start(0); + _a_shown.start(); + } + _doc = sticker; + _cacheStatus = CacheNotLoaded; +} + +void StickerPreviewWidget::hidePreview() { + showPreview(0); +} + +QSize StickerPreviewWidget::currentDimensions() const { + if (!_doc) return QSize(_cache.width() / cIntRetinaFactor(), _cache.height() / cIntRetinaFactor()); + + QSize result(qMax(_doc->dimensions.width(), 1), qMax(_doc->dimensions.height(), 1)); + if (result.width() > st::maxStickerSize) { + result.setHeight(qMax(qRound((st::maxStickerSize * result.height()) / result.width()), 1)); + result.setWidth(st::maxStickerSize); + } + if (result.height() > st::maxStickerSize) { + result.setWidth(qMax(qRound((st::maxStickerSize * result.width()) / result.height()), 1)); + result.setHeight(st::maxStickerSize); + } + return result; +} + +QPixmap StickerPreviewWidget::currentImage() const { + if (_doc && _cacheStatus != CacheLoaded) { + bool already = !_doc->already().isEmpty(), hasdata = !_doc->data.isEmpty(); + if (!_doc->loader && _doc->status != FileFailed && !already && !hasdata) { + _doc->save(QString()); + } + if (_doc->sticker()->img->isNull() && (already || hasdata)) { + if (already) { + _doc->sticker()->img = ImagePtr(_doc->already()); + } else { + _doc->sticker()->img = ImagePtr(_doc->data); + } + } + if (_doc->sticker()->img->isNull()) { + if (_cacheStatus != CacheThumbLoaded) { + QSize s = currentDimensions(); + _cache = _doc->thumb->pixBlurred(s.width(), s.height()); + _cacheStatus = CacheThumbLoaded; + } + } else { + QSize s = currentDimensions(); + _cache = _doc->sticker()->img->pix(s.width(), s.height()); + _cacheStatus = CacheLoaded; + } + } + return _cache; +} + +StickerPreviewWidget::~StickerPreviewWidget() { +} diff --git a/Telegram/SourceFiles/layerwidget.h b/Telegram/SourceFiles/layerwidget.h index 61e06cf4b..98d6eb3b3 100644 --- a/Telegram/SourceFiles/layerwidget.h +++ b/Telegram/SourceFiles/layerwidget.h @@ -57,7 +57,7 @@ signals: }; -class BackgroundWidget : public QWidget, public Animated { +class BackgroundWidget : public TWidget, public Animated { Q_OBJECT public: @@ -104,3 +104,39 @@ private: BoxShadow shadow; }; + +class StickerPreviewWidget : public TWidget { + Q_OBJECT + +public: + + StickerPreviewWidget(QWidget *parent); + + void paintEvent(QPaintEvent *e); + void resizeEvent(QResizeEvent *e); + + bool animStep_shown(float64 ms); + + void showPreview(DocumentData *sticker); + void hidePreview(); + + ~StickerPreviewWidget(); + +private: + + QSize currentDimensions() const; + QPixmap currentImage() const; + + anim::fvalue a_shown; + Animation _a_shown; + DocumentData *_doc; + + enum CacheStatus { + CacheNotLoaded, + CacheThumbLoaded, + CacheLoaded, + }; + mutable CacheStatus _cacheStatus; + mutable QPixmap _cache; + +}; diff --git a/Telegram/SourceFiles/localstorage.cpp b/Telegram/SourceFiles/localstorage.cpp index b1dfaecdf..362798d5e 100644 --- a/Telegram/SourceFiles/localstorage.cpp +++ b/Telegram/SourceFiles/localstorage.cpp @@ -579,11 +579,23 @@ namespace { } quint32 size = 0; for (FileLocations::const_iterator i = _fileLocations.cbegin(), e = _fileLocations.cend(); i != e; ++i) { - // location + type + namelen + name + date + size - size += sizeof(quint64) * 2 + sizeof(quint32) + _stringSize(i.value().name) + _dateTimeSize() + sizeof(quint32); + // location + type + namelen + name + size += sizeof(quint64) * 2 + sizeof(quint32) + _stringSize(i.value().name()); + if (AppVersion > 9013) { + // bookmark + size += _bytearraySize(i.value().bookmark()); + } + // date + size + size += _dateTimeSize() + sizeof(quint32); } + //end mark - size += sizeof(quint64) * 2 + sizeof(quint32) + _stringSize(QString()) + _dateTimeSize() + sizeof(quint32); + size += sizeof(quint64) * 2 + sizeof(quint32) + _stringSize(QString()); + if (AppVersion > 9013) { + size += _bytearraySize(QByteArray()); + } + size += _dateTimeSize() + sizeof(quint32); + size += sizeof(quint32); // aliases count for (FileLocationAliases::const_iterator i = _fileLocationAliases.cbegin(), e = _fileLocationAliases.cend(); i != e; ++i) { // alias + location @@ -592,9 +604,19 @@ namespace { EncryptedDescriptor data(size); for (FileLocations::const_iterator i = _fileLocations.cbegin(); i != _fileLocations.cend(); ++i) { - data.stream << quint64(i.key().first) << quint64(i.key().second) << quint32(i.value().type) << i.value().name << i.value().modified << quint32(i.value().size); + data.stream << quint64(i.key().first) << quint64(i.key().second) << quint32(i.value().type) << i.value().name(); + if (AppVersion > 9013) { + data.stream << i.value().bookmark(); + } + data.stream << i.value().modified << quint32(i.value().size); } - data.stream << quint64(0) << quint64(0) << quint32(0) << QString() << QDateTime::currentDateTime() << quint32(0); + + data.stream << quint64(0) << quint64(0) << quint32(0) << QString(); + if (AppVersion > 9013) { + data.stream << QByteArray(); + } + data.stream << QDateTime::currentDateTime() << quint32(0); + data.stream << quint32(_fileLocationAliases.size()); for (FileLocationAliases::const_iterator i = _fileLocationAliases.cbegin(), e = _fileLocationAliases.cend(); i != e; ++i) { data.stream << quint64(i.key().first) << quint64(i.key().second) << quint64(i.value().first) << quint64(i.value().second); @@ -617,11 +639,17 @@ namespace { bool endMarkFound = false; while (!locations.stream.atEnd()) { quint64 first, second; + QByteArray bookmark; FileLocation loc; quint32 type; - locations.stream >> first >> second >> type >> loc.name >> loc.modified >> loc.size; + locations.stream >> first >> second >> type >> loc.fname; + if (locations.version > 9013) { + locations.stream >> bookmark; + } + locations.stream >> loc.modified >> loc.size; + loc.setBookmark(bookmark); - if (!first && !second && !type && loc.name.isEmpty() && !loc.size) { // end mark + if (!first && !second && !type && loc.fname.isEmpty() && !loc.size) { // end mark endMarkFound = true; break; } @@ -629,12 +657,8 @@ namespace { MediaKey key(first, second); loc.type = StorageFileType(type); - if (loc.check()) { - _fileLocations.insert(key, loc); - _fileLocationPairs.insert(loc.name, FileLocationPair(key, loc)); - } else { - _writeLocations(); - } + _fileLocations.insert(key, loc); + _fileLocationPairs.insert(loc.fname, FileLocationPair(key, loc)); } if (endMarkFound) { @@ -1038,12 +1062,26 @@ namespace { cSetAskDownloadPath(v == 1); } break; - case dbiDownloadPath: { + case dbiDownloadPathOld: { QString v; stream >> v; if (!_checkStreamStatus(stream)) return false; + if (!v.isEmpty() && v != qstr("tmp") && !v.endsWith('/')) v += '/'; cSetDownloadPath(v); + cSetDownloadPathBookmark(QByteArray()); + } break; + + case dbiDownloadPath: { + QString v; + QByteArray bookmark; + stream >> v >> bookmark; + if (!_checkStreamStatus(stream)) return false; + + if (!v.isEmpty() && v != qstr("tmp") && !v.endsWith('/')) v += '/'; + cSetDownloadPath(v); + cSetDownloadPathBookmark(bookmark); + psDownloadPathEnableAccess(); } break; case dbiCompressPastedImage: { @@ -1054,22 +1092,12 @@ namespace { cSetCompressPastedImage(v == 1); } break; - case dbiEmojiTab: { + case dbiEmojiTabOld: { qint32 v; stream >> v; if (!_checkStreamStatus(stream)) return false; - switch (v) { - case dbietRecent : cSetEmojiTab(dbietRecent ); break; - case dbietPeople : cSetEmojiTab(dbietPeople ); break; - case dbietNature : cSetEmojiTab(dbietNature ); break; - case dbietFood : cSetEmojiTab(dbietFood ); break; - case dbietCelebration: cSetEmojiTab(dbietCelebration); break; - case dbietActivity : cSetEmojiTab(dbietActivity ); break; - case dbietTravel : cSetEmojiTab(dbietTravel ); break; - case dbietObjects : cSetEmojiTab(dbietObjects ); break; - case dbietStickers : cSetEmojiTab(dbietStickers ); break; - } + // deprecated } break; case dbiRecentEmojisOld: { @@ -1362,7 +1390,7 @@ namespace { } uint32 size = 14 * (sizeof(quint32) + sizeof(qint32)); - size += sizeof(quint32) + _stringSize(cAskDownloadPath() ? QString() : cDownloadPath()); + size += sizeof(quint32) + _stringSize(cAskDownloadPath() ? QString() : cDownloadPath()) + _bytearraySize(cAskDownloadPath() ? QByteArray() : cDownloadPathBookmark()); size += sizeof(quint32) + sizeof(qint32) + (cRecentEmojisPreload().isEmpty() ? cGetRecentEmojis().size() : cRecentEmojisPreload().size()) * (sizeof(uint64) + sizeof(ushort)); size += sizeof(quint32) + sizeof(qint32) + cEmojiVariants().size() * (sizeof(uint32) + sizeof(uint64)); size += sizeof(quint32) + sizeof(qint32) + (cRecentStickersPreload().isEmpty() ? cGetRecentStickers().size() : cRecentStickersPreload().size()) * (sizeof(uint64) + sizeof(ushort)); @@ -1380,9 +1408,8 @@ namespace { data.stream << quint32(dbiNotifyView) << qint32(cNotifyView()); data.stream << quint32(dbiWindowsNotifications) << qint32(cWindowsNotifications()); data.stream << quint32(dbiAskDownloadPath) << qint32(cAskDownloadPath()); - data.stream << quint32(dbiDownloadPath) << (cAskDownloadPath() ? QString() : cDownloadPath()); + data.stream << quint32(dbiDownloadPath) << (cAskDownloadPath() ? QString() : cDownloadPath()) << (cAskDownloadPath() ? QByteArray() : cDownloadPathBookmark()); data.stream << quint32(dbiCompressPastedImage) << qint32(cCompressPastedImage()); - data.stream << quint32(dbiEmojiTab) << qint32(cEmojiTab()); data.stream << quint32(dbiDialogLastPath) << cDialogLastPath(); data.stream << quint32(dbiSongVolume) << qint32(qRound(cSongVolume() * 1e6)); @@ -2178,14 +2205,14 @@ namespace Local { } void writeFileLocation(MediaKey location, const FileLocation &local) { - if (local.name.isEmpty()) return; + if (local.fname.isEmpty()) return; FileLocationAliases::const_iterator aliasIt = _fileLocationAliases.constFind(location); if (aliasIt != _fileLocationAliases.cend()) { location = aliasIt.value(); } - FileLocationPairs::iterator i = _fileLocationPairs.find(local.name); + FileLocationPairs::iterator i = _fileLocationPairs.find(local.fname); if (i != _fileLocationPairs.cend()) { if (i.value().second == local) { if (i.value().first != location) { @@ -2205,7 +2232,7 @@ namespace Local { } } _fileLocations.insert(location, local); - _fileLocationPairs.insert(local.name, FileLocationPair(location, local)); + _fileLocationPairs.insert(local.fname, FileLocationPair(location, local)); _writeLocations(WriteMapFast); } @@ -2218,9 +2245,8 @@ namespace Local { FileLocations::iterator i = _fileLocations.find(location); for (FileLocations::iterator i = _fileLocations.find(location); (i != _fileLocations.end()) && (i.key() == location);) { if (check) { - QFileInfo info(i.value().name); - if (!info.exists() || info.lastModified() != i.value().modified || info.size() != i.value().size) { - _fileLocationPairs.remove(i.value().name); + if (!i.value().check()) { + _fileLocationPairs.remove(i.value().fname); i = _fileLocations.erase(i); _writeLocations(); continue; @@ -2441,7 +2467,7 @@ namespace Local { TaskId startStickerImageLoad(const StorageKey &location, mtpFileLoader *loader) { StorageMap::iterator j = _stickerImagesMap.find(location); - if (j == _stickerImagesMap.cend()) { + if (j == _stickerImagesMap.cend() || !_localLoader) { return 0; } return _localLoader->addTask(new StickerImageLoadTask(j->first, location, loader)); @@ -2500,7 +2526,7 @@ namespace Local { TaskId startAudioLoad(const StorageKey &location, mtpFileLoader *loader) { StorageMap::iterator j = _audiosMap.find(location); - if (j == _audiosMap.cend()) { + if (j == _audiosMap.cend() || !_localLoader) { return 0; } return _localLoader->addTask(new AudioLoadTask(j->first, location, loader)); @@ -2582,11 +2608,12 @@ namespace Local { _writeMap(); } else { int32 setsCount = 0; - quint32 size = sizeof(quint32) + _bytearraySize(cStickersHash()); + QByteArray hashToWrite = (qsl("%d:") + QString::number(cStickersHash())).toUtf8(); + quint32 size = sizeof(quint32) + _bytearraySize(hashToWrite); for (StickerSets::const_iterator i = sets.cbegin(); i != sets.cend(); ++i) { bool notLoaded = (i->flags & MTPDstickerSet_flag_NOT_LOADED); if (notLoaded) { - if (!(i->flags & MTPDstickerSet::flag_disabled)) { // waiting to receive + if (!(i->flags & MTPDstickerSet::flag_disabled) || (i->flags & MTPDstickerSet::flag_official)) { // waiting to receive return; } } else { @@ -2613,7 +2640,7 @@ namespace Local { _writeMap(WriteMapFast); } EncryptedDescriptor data(size); - data.stream << quint32(setsCount) << cStickersHash(); + data.stream << quint32(setsCount) << hashToWrite; _writeStickerSet(data.stream, CustomStickerSetId); for (StickerSetsOrder::const_iterator i = cStickerSetsOrder().cbegin(), e = cStickerSetsOrder().cend(); i != e; ++i) { _writeStickerSet(data.stream, *i); @@ -2643,7 +2670,7 @@ namespace Local { RecentStickerPack &recent(cRefRecentStickers()); recent.clear(); - cSetStickersHash(QByteArray()); + cSetStickersHash(0); StickerSet &def(sets.insert(DefaultStickerSetId, StickerSet(DefaultStickerSetId, 0, lang(lng_stickers_default_set), QString(), 0, 0, MTPDstickerSet::flag_official)).value()); StickerSet &custom(sets.insert(CustomStickerSetId, StickerSet(CustomStickerSetId, 0, lang(lng_custom_stickers), QString(), 0, 0, 0)).value()); @@ -2801,7 +2828,11 @@ namespace Local { } } - cSetStickersHash(hash); + if (hash.startsWith(qsl("%d:").toUtf8())) { + cSetStickersHash(QString::fromUtf8(hash.mid(3)).toInt()); + } else { + cSetStickersHash(0); + } } void writeBackground(int32 id, const QImage &img) { diff --git a/Telegram/SourceFiles/logs.cpp b/Telegram/SourceFiles/logs.cpp index 7da4da032..41529c94a 100644 --- a/Telegram/SourceFiles/logs.cpp +++ b/Telegram/SourceFiles/logs.cpp @@ -183,25 +183,63 @@ void logsInit() { static _StreamCreator streamCreator; if (mainLogStream) return; - QString wasDir = cWorkingDir(); + QFile beta(cExeDir() + qsl("TelegramBeta_data/tdata/beta")); + if (cBetaVersion()) { + cForceWorkingDir(cExeDir() + qsl("TelegramBeta_data/")); + if (*BetaPrivateKey) { + cSetBetaPrivateKey(QByteArray(BetaPrivateKey)); + } + if (beta.open(QIODevice::WriteOnly)) { + QDataStream dataStream(&beta); + dataStream.setVersion(QDataStream::Qt_5_3); + dataStream << quint64(cRealBetaVersion()) << cBetaPrivateKey(); + } else { + LOG(("Error: could not open \"beta\" file for writing private key!")); + } + } else if (beta.exists()) { + if (beta.open(QIODevice::ReadOnly)) { + QDataStream dataStream(&beta); + dataStream.setVersion(QDataStream::Qt_5_3); + + quint64 v; + QByteArray k; + dataStream >> v >> k; + if (dataStream.status() == QDataStream::Ok) { + cSetBetaVersion(qMax(v, AppVersion * 1000ULL)); + cSetBetaPrivateKey(k); + cSetRealBetaVersion(v); + + cForceWorkingDir(cExeDir() + qsl("TelegramBeta_data/")); + } + } + } + + if (cBetaVersion()) { + cSetDebug(true); + } else { + QString wasDir = cWorkingDir(); #if (defined Q_OS_MAC || defined Q_OS_LINUX) #ifdef _DEBUG - cForceWorkingDir(cExeDir()); + cForceWorkingDir(cExeDir()); #else - cForceWorkingDir(psAppDataPath()); + if(cWorkingDir().isEmpty()){ + cForceWorkingDir(psAppDataPath()); + } #endif #if (defined Q_OS_LINUX && !defined _DEBUG) // fix first version - moveOldDataFiles(wasDir); + moveOldDataFiles(wasDir); #endif + #endif + } QString rightDir = cWorkingDir(); cForceWorkingDir(rightDir); mainLog.setFileName(cWorkingDir() + "log.txt"); mainLog.open(QIODevice::WriteOnly | QIODevice::Text); - if (!mainLog.isOpen()) { + if (!cBetaVersion() && !mainLog.isOpen()) { cForceWorkingDir(cExeDir()); mainLog.setFileName(cWorkingDir() + "log.txt"); mainLog.open(QIODevice::WriteOnly | QIODevice::Text); @@ -224,18 +262,23 @@ void logsInit() { cSetTestMode(true); LOG(("Switched to test mode!")); } + #ifdef Q_OS_WIN if (cWorkingDir() == psAppDataPath()) { // fix old "Telegram Win (Unofficial)" version moveOldDataFiles(psAppDataPathOld()); } #endif + if (cDebug()) { logsInitDebug(); } else if (QFile(cWorkingDir() + qsl("tdata/withdebug")).exists()) { logsInitDebug(); cSetDebug(true); } - if (!cDevVersion() && QFile(cWorkingDir() + qsl("tdata/devversion")).exists()) { + + if (cBetaVersion()) { + cSetDevVersion(false); + } else if (!cDevVersion() && QFile(cWorkingDir() + qsl("tdata/devversion")).exists()) { cSetDevVersion(true); } diff --git a/Telegram/SourceFiles/main.cpp b/Telegram/SourceFiles/main.cpp index e45f1e109..5fa9627cc 100644 --- a/Telegram/SourceFiles/main.cpp +++ b/Telegram/SourceFiles/main.cpp @@ -89,7 +89,7 @@ int main(int argc, char *argv[]) { #ifndef TDESKTOP_DISABLE_AUTOUPDATE if (cRestartingUpdate()) { - if (DevVersion) { + if (!cBetaVersion() && DevVersion) { LOG(("Writing 'devversion' file before launching the Updater!")); QFile f(cWorkingDir() + qsl("tdata/devversion")); if (!f.exists() && f.open(QIODevice::WriteOnly)) { diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 1d981960f..b5dd08893 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -30,6 +30,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "boxes/confirmbox.h" #include "boxes/stickersetbox.h" #include "boxes/contactsbox.h" +#include "boxes/downloadpathbox.h" #include "localstorage.h" @@ -394,6 +395,7 @@ MainWidget::MainWidget(Window *window) : TWidget(window) , _hider(0) , _peerInStack(0) , _msgIdInStack(0) +, _stickerPreview(0) , _playerHeight(0) , _contentScrollAddToY(0) , _mediaType(this) @@ -743,6 +745,20 @@ QPixmap MainWidget::grabTopBar() { } } +void MainWidget::ui_showStickerPreview(DocumentData *sticker) { + if (!sticker || !sticker->sticker()) return; + if (!_stickerPreview) { + _stickerPreview = new StickerPreviewWidget(this); + resizeEvent(0); + } + _stickerPreview->showPreview(sticker); +} + +void MainWidget::ui_hideStickerPreview() { + if (!_stickerPreview) return; + _stickerPreview->hidePreview(); +} + void MainWidget::noHider(HistoryHider *destroyed) { if (_hider == destroyed) { _hider = 0; @@ -970,11 +986,17 @@ void MainWidget::addParticipants(PeerData *chatOrChannel, const QVectorisChannel()) { QVector inputUsers; - inputUsers.reserve(users.size()); + inputUsers.reserve(qMin(users.size(), int(MaxUsersPerInvite))); for (QVector::const_iterator i = users.cbegin(), e = users.cend(); i != e; ++i) { inputUsers.push_back((*i)->inputUser); + if (inputUsers.size() == MaxUsersPerInvite) { + MTP::send(MTPchannels_InviteToChannel(chatOrChannel->asChannel()->inputChannel, MTP_vector(inputUsers)), rpcDone(&MainWidget::inviteToChannelDone, chatOrChannel->asChannel()), rpcFail(&MainWidget::addParticipantsFail, chatOrChannel->asChannel()), 0, 5); + inputUsers.clear(); + } + } + if (!inputUsers.isEmpty()) { + MTP::send(MTPchannels_InviteToChannel(chatOrChannel->asChannel()->inputChannel, MTP_vector(inputUsers)), rpcDone(&MainWidget::inviteToChannelDone, chatOrChannel->asChannel()), rpcFail(&MainWidget::addParticipantsFail, chatOrChannel->asChannel()), 0, 5); } - MTP::send(MTPchannels_InviteToChannel(chatOrChannel->asChannel()->inputChannel, MTP_vector(inputUsers)), rpcDone(&MainWidget::inviteToChannelDone, chatOrChannel->asChannel()), rpcFail(&MainWidget::addParticipantsFail, chatOrChannel->asChannel()), 0, 5); } } @@ -1585,6 +1607,7 @@ void MainWidget::messagesAffected(PeerData *peer, const MTPmessages_AffectedMess void MainWidget::videoLoadProgress(mtpFileLoader *loader) { VideoData *video = App::video(loader->objId()); if (video->loader) { + video->status = FileReady; if (video->loader->done()) { video->finish(); QString already = video->already(); @@ -1614,7 +1637,17 @@ void MainWidget::loadFailed(mtpFileLoader *loader, bool started, const char *ret if (started) { connect(box, SIGNAL(confirmed()), this, retrySlot); } else { - connect(box, SIGNAL(confirmed()), App::wnd(), SLOT(showSettings())); + connect(box, SIGNAL(confirmed()), this, SLOT(onDownloadPathSettings())); + } + App::wnd()->showLayer(box); +} + +void MainWidget::onDownloadPathSettings() { + cSetDownloadPath(QString()); + cSetDownloadPathBookmark(QByteArray()); + DownloadPathBox *box = new DownloadPathBox(); + if (App::wnd() && App::wnd()->settingsWidget()) { + connect(box, SIGNAL(closed()), App::wnd()->settingsWidget(), SLOT(onDownloadPathEdited())); } App::wnd()->showLayer(box); } @@ -1634,6 +1667,7 @@ void MainWidget::videoLoadRetry() { void MainWidget::audioLoadProgress(mtpFileLoader *loader) { AudioData *audio = App::audio(loader->objId()); if (audio->loader) { + audio->status = FileReady; if (audio->loader->done()) { audio->finish(); QString already = audio->already(); @@ -1688,7 +1722,7 @@ void MainWidget::audioPlayProgress(const AudioMsgId &audioId) { if (f.write(audio->data) == audio->data.size()) { f.close(); already = filename; - audio->location = FileLocation(mtpToStorageType(mtpc_storage_filePartial), filename); + audio->setLocation(FileLocation(StorageFilePartial, filename)); Local::writeFileLocation(mediaKey(mtpToLocationType(mtpc_inputAudioFileLocation), audio->dc, audio->id), FileLocation(mtpToStorageType(mtpc_storage_filePartial), filename)); } } @@ -1736,7 +1770,7 @@ void MainWidget::documentPlayProgress(const SongMsgId &songId) { if (f.write(document->data) == document->data.size()) { f.close(); already = filename; - document->location = FileLocation(mtpToStorageType(mtpc_storage_filePartial), filename); + document->setLocation(FileLocation(StorageFilePartial, filename)); Local::writeFileLocation(mediaKey(mtpToLocationType(mtpc_inputDocumentFileLocation), document->dc, document->id), FileLocation(mtpToStorageType(mtpc_storage_filePartial), filename)); } } @@ -1793,6 +1827,7 @@ void MainWidget::documentLoadProgress(mtpFileLoader *loader) { bool songPlayActivated = false; DocumentData *document = App::document(loader->objId()); if (document->loader) { + document->status = FileReady; if (document->loader->done()) { document->finish(); QString already = document->already(); @@ -1813,16 +1848,22 @@ void MainWidget::documentLoadProgress(mtpFileLoader *loader) { } songPlayActivated = true; - } else if(document->openOnSave > 0 && document->size < MediaViewImageSizeLimit) { - QImageReader reader(already); - if (reader.canRead()) { - if (reader.supportsAnimation() && reader.imageCount() > 1 && item) { - startGif(item, already); - } else if (item) { - App::wnd()->showDocument(document, item); + } else if (document->openOnSave > 0 && document->size < MediaViewImageSizeLimit) { + const FileLocation &location(document->location(true)); + if (location.accessEnable()) { + QImageReader reader(location.name()); + if (reader.canRead()) { + if (reader.supportsAnimation() && reader.imageCount() > 1 && item) { + startGif(item, location); + } else if (item) { + App::wnd()->showDocument(document, item); + } else { + psOpenFile(already); + } } else { psOpenFile(already); } + location.accessDisable(); } else { psOpenFile(already); } @@ -2320,7 +2361,9 @@ void MainWidget::showPeerHistory(quint64 peerId, qint32 showAtMsgId, bool back) //} if (!dialogs.isHidden()) { - dialogs.scrollToPeer(peerId, showAtMsgId); + if (!back) { + dialogs.scrollToPeer(peerId, showAtMsgId); + } dialogs.update(); } App::wnd()->getTitle()->updateBackButton(); @@ -2491,6 +2534,7 @@ void MainWidget::showPeerProfile(PeerData *peer, bool back, int32 lastScrollTop) if (back) clearBotStartToken(history.peer()); history.showHistory(0, 0); history.hide(); + if (!cWideMode()) dialogs.hide(); orderWidgets(); @@ -2537,6 +2581,7 @@ void MainWidget::orderWidgets() { dialogs.raise(); _mediaType.raise(); if (_hider) _hider->raise(); + if (_stickerPreview) _stickerPreview->raise(); } QRect MainWidget::historyRect() const { @@ -2690,6 +2735,7 @@ void MainWidget::hideAll() { _topBar.hide(); _mediaType.hide(); _player.hide(); + _playerHeight = 0; } void MainWidget::showAll() { @@ -2764,6 +2810,7 @@ void MainWidget::showAll() { } } } + resizeEvent(0); App::wnd()->checkHistoryActivation(); } @@ -2795,6 +2842,7 @@ void MainWidget::resizeEvent(QResizeEvent *e) { _mediaType.moveToLeft(width() - _mediaType.width(), _playerHeight + st::topBarHeight); if (profile) profile->setGeometry(history.geometry()); if (overview) overview->setGeometry(history.geometry()); + if (_stickerPreview) _stickerPreview->setGeometry(rect()); _contentScrollAddToY = 0; } @@ -3668,6 +3716,7 @@ void MainWidget::startFull(const MTPVector &users) { } void MainWidget::applyNotifySetting(const MTPNotifyPeer &peer, const MTPPeerNotifySettings &settings, History *h) { + PeerData *updatePeer = 0; switch (settings.type()) { case mtpc_peerNotifySettingsEmpty: switch (peer.type()) { @@ -3675,18 +3724,15 @@ void MainWidget::applyNotifySetting(const MTPNotifyPeer &peer, const MTPPeerNoti case mtpc_notifyUsers: globalNotifyUsersPtr = EmptyNotifySettings; break; case mtpc_notifyChats: globalNotifyChatsPtr = EmptyNotifySettings; break; case mtpc_notifyPeer: { - PeerData *data = App::peerLoaded(peerFromMTP(peer.c_notifyPeer().vpeer)); - if (data && data->notify != EmptyNotifySettings) { - if (data->notify != UnknownNotifySettings) { - delete data->notify; + updatePeer = App::peerLoaded(peerFromMTP(peer.c_notifyPeer().vpeer)); + if (updatePeer && updatePeer->notify != EmptyNotifySettings) { + if (updatePeer->notify != UnknownNotifySettings) { + delete updatePeer->notify; } - data->notify = EmptyNotifySettings; - App::unregMuted(data); - if (!h) h = App::history(data->id); + updatePeer->notify = EmptyNotifySettings; + App::unregMuted(updatePeer); + if (!h) h = App::history(updatePeer->id); h->setMute(false); - if (history.peer() == data) { - history.updateNotifySettings(); - } } } break; } @@ -3694,19 +3740,18 @@ void MainWidget::applyNotifySetting(const MTPNotifyPeer &peer, const MTPPeerNoti case mtpc_peerNotifySettings: { const MTPDpeerNotifySettings &d(settings.c_peerNotifySettings()); NotifySettingsPtr setTo = UnknownNotifySettings; - PeerData *data = 0; switch (peer.type()) { case mtpc_notifyAll: setTo = globalNotifyAllPtr = &globalNotifyAll; break; case mtpc_notifyUsers: setTo = globalNotifyUsersPtr = &globalNotifyUsers; break; case mtpc_notifyChats: setTo = globalNotifyChatsPtr = &globalNotifyChats; break; case mtpc_notifyPeer: { - data = App::peerLoaded(peerFromMTP(peer.c_notifyPeer().vpeer)); - if (!data) break; + updatePeer = App::peerLoaded(peerFromMTP(peer.c_notifyPeer().vpeer)); + if (!updatePeer) break; - if (data->notify == UnknownNotifySettings || data->notify == EmptyNotifySettings) { - data->notify = new NotifySettings(); + if (updatePeer->notify == UnknownNotifySettings || updatePeer->notify == EmptyNotifySettings) { + updatePeer->notify = new NotifySettings(); } - setTo = data->notify; + setTo = updatePeer->notify; } break; } if (setTo == UnknownNotifySettings) break; @@ -3715,25 +3760,28 @@ void MainWidget::applyNotifySetting(const MTPNotifyPeer &peer, const MTPPeerNoti setTo->sound = d.vsound.c_string().v; setTo->previews = mtpIsTrue(d.vshow_previews); setTo->events = d.vevents_mask.v; - if (data) { - if (!h) h = App::history(data->id); + if (updatePeer) { + if (!h) h = App::history(updatePeer->id); int32 changeIn = 0; if (isNotifyMuted(setTo, &changeIn)) { App::wnd()->notifyClear(h); h->setMute(true); - App::regMuted(data, changeIn); + App::regMuted(updatePeer, changeIn); } else { h->setMute(false); } - if (history.peer() == data) { - history.updateNotifySettings(); - } } } break; } - if (profile) { - profile->updateNotifySettings(); + if (updatePeer) { + if (history.peer() == updatePeer) { + history.updateNotifySettings(); + } + dialogs.updateNotifySettings(updatePeer); + if (profile && profile->peer() == updatePeer) { + profile->updateNotifySettings(); + } } } @@ -4573,5 +4621,81 @@ void MainWidget::feedUpdate(const MTPUpdate &update) { } } break; + case mtpc_updateNewStickerSet: { + const MTPDupdateNewStickerSet &d(update.c_updateNewStickerSet()); + if (d.vstickerset.type() == mtpc_messages_stickerSet) { + const MTPDmessages_stickerSet &set(d.vstickerset.c_messages_stickerSet()); + if (set.vset.type() == mtpc_stickerSet) { + const QVector &v(set.vdocuments.c_vector().v); + StickerPack pack; + pack.reserve(v.size()); + for (int32 i = 0, l = v.size(); i < l; ++i) { + DocumentData *doc = App::feedDocument(v.at(i)); + if (!doc || !doc->sticker()) continue; + + pack.push_back(doc); + } + + const MTPDstickerSet &s(set.vset.c_stickerSet()); + + StickerSets &sets(cRefStickerSets()); + + sets.insert(s.vid.v, StickerSet(s.vid.v, s.vaccess_hash.v, stickerSetTitle(s), qs(s.vshort_name), s.vcount.v, s.vhash.v, s.vflags.v)).value().stickers = pack; + + StickerSetsOrder &order(cRefStickerSetsOrder()); + int32 insertAtIndex = 0, currentIndex = order.indexOf(s.vid.v); + if (currentIndex != insertAtIndex) { + if (currentIndex > 0) { + order.removeAt(currentIndex); + } + order.insert(insertAtIndex, s.vid.v); + } + + StickerSets::iterator custom = sets.find(CustomStickerSetId); + if (custom != sets.cend()) { + for (int32 i = 0, l = pack.size(); i < l; ++i) { + int32 removeIndex = custom->stickers.indexOf(pack.at(i)); + if (removeIndex >= 0) custom->stickers.removeAt(removeIndex); + } + if (custom->stickers.isEmpty()) { + sets.erase(custom); + } + } + cSetStickersHash(stickersCountHash()); + Local::writeStickers(); + emit stickersUpdated(); + } + } + } break; + + case mtpc_updateStickerSetsOrder: { + const MTPDupdateStickerSetsOrder &d(update.c_updateStickerSetsOrder()); + const QVector &order(d.vorder.c_vector().v); + const StickerSets &sets(cStickerSets()); + StickerSetsOrder result; + for (int32 i = 0, l = order.size(); i < l; ++i) { + if (sets.constFind(order.at(i).v) == sets.cend()) { + break; + } + result.push_back(order.at(i).v); + } + if (result.size() != cStickerSetsOrder().size() || result.size() != order.size()) { + cSetLastStickersUpdate(0); + cSetStickersHash(0); + App::main()->updateStickers(); + } else { + cSetStickerSetsOrder(result); + cSetStickersHash(stickersCountHash()); + Local::writeStickers(); + emit stickersUpdated(); + } + } break; + + case mtpc_updateStickerSets: { + cSetLastStickersUpdate(0); + cSetStickersHash(0); + App::main()->updateStickers(); + } break; + } } diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index 0c64c9f9a..c8cbc6965 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -178,6 +178,8 @@ public: } }; +class StickerPreviewWidget; + class MainWidget : public TWidget, public RPCSender { Q_OBJECT @@ -412,6 +414,9 @@ public: QPixmap grabTopBar(); QPixmap grabInner(); + void ui_showStickerPreview(DocumentData *sticker); + void ui_hideStickerPreview(); + ~MainWidget(); signals: @@ -482,6 +487,8 @@ public slots: void onViewsIncrement(); void onActiveChannelUpdateFull(); + void onDownloadPathSettings(); + private: void sendReadRequest(PeerData *peer, MsgId upTo); @@ -562,7 +569,9 @@ private: StackItems _stack; PeerData *_peerInStack; MsgId _msgIdInStack; - + + StickerPreviewWidget *_stickerPreview; + int32 _playerHeight; int32 _contentScrollAddToY; diff --git a/Telegram/SourceFiles/mediaview.cpp b/Telegram/SourceFiles/mediaview.cpp index aca6465ed..e26a3bd39 100644 --- a/Telegram/SourceFiles/mediaview.cpp +++ b/Telegram/SourceFiles/mediaview.cpp @@ -155,7 +155,7 @@ MediaView::MediaView() : TWidget(App::wnd()) connect(_btnSaveCancel, SIGNAL(clicked()), this, SLOT(onSaveCancel())); _btns.push_back(_btnToMessage = _dropdown.addButton(new IconedButton(this, st::mvButton, lang(lng_context_to_msg)))); connect(_btnToMessage, SIGNAL(clicked()), this, SLOT(onToMessage())); - _btns.push_back(_btnShowInFolder = _dropdown.addButton(new IconedButton(this, st::mvButton, lang(cPlatform() == dbipMac ? lng_context_show_in_finder : lng_context_show_in_folder)))); + _btns.push_back(_btnShowInFolder = _dropdown.addButton(new IconedButton(this, st::mvButton, lang((cPlatform() == dbipMac || cPlatform() == dbipMacOld) ? lng_context_show_in_finder : lng_context_show_in_folder)))); connect(_btnShowInFolder, SIGNAL(clicked()), this, SLOT(onShowInFolder())); _btns.push_back(_btnCopy = _dropdown.addButton(new IconedButton(this, st::mvButton, lang(lng_mediaview_copy)))); connect(_btnCopy, SIGNAL(clicked()), this, SLOT(onCopy())); @@ -453,10 +453,13 @@ bool MediaView::animStep(float64 msp) { _docRadialFirst = _docRadialLast = _docRadialStart = 0; a_docRadial = anim::fvalue(0, 0); if (!_doc->already().isEmpty() && _doc->size < MediaViewImageSizeLimit) { - QString fname(_doc->already(true)); - QImageReader reader(fname); - if (reader.canRead()) { - displayDocument(_doc, App::histItemById(_msgmigrated ? 0 : _channel, _msgid)); + const FileLocation &location(_doc->location(true)); + if (location.accessEnable()) { + QImageReader reader(location.name()); + if (reader.canRead()) { + displayDocument(_doc, App::histItemById(_msgmigrated ? 0 : _channel, _msgid)); + } + location.accessDisable(); } } } else { @@ -529,8 +532,33 @@ void MediaView::onToMessage() { void MediaView::onSaveAs() { QString file; if (_doc) { - QString cur = _doc->already(true); - if (cur.isEmpty()) { + const FileLocation &location(_doc->location(true)); + if (location.accessEnable()) { + QFileInfo alreadyInfo(location.name()); + QDir alreadyDir(alreadyInfo.dir()); + QString name = alreadyInfo.fileName(), filter; + MimeType mimeType = mimeTypeForName(_doc->mime); + QStringList p = mimeType.globPatterns(); + QString pattern = p.isEmpty() ? QString() : p.front(); + if (name.isEmpty()) { + name = pattern.isEmpty() ? qsl(".unknown") : pattern.replace('*', QString()); + } + + if (pattern.isEmpty()) { + filter = QString(); + } else { + filter = mimeType.filterString() + qsl(";;All files (*.*)"); + } + + psBringToBack(this); + file = saveFileName(lang(lng_save_file), filter, qsl("doc"), name, true, alreadyDir); + psShowOverAll(this); + if (!file.isEmpty() && file != location.name()) { + QFile(location.name()).copy(file); + } + + location.accessDisable(); + } else { if (_current.isNull() && _currentGif.isNull()) { DocumentSaveLink::doSave(_doc, true); updateControls(); @@ -539,30 +567,6 @@ void MediaView::onSaveAs() { update(_saveNav); } updateOver(_lastMouseMovePos); - return; - } - - QFileInfo alreadyInfo(cur); - QDir alreadyDir(alreadyInfo.dir()); - QString name = alreadyInfo.fileName(), filter; - MimeType mimeType = mimeTypeForName(_doc->mime); - QStringList p = mimeType.globPatterns(); - QString pattern = p.isEmpty() ? QString() : p.front(); - if (name.isEmpty()) { - name = pattern.isEmpty() ? qsl(".unknown") : pattern.replace('*', QString()); - } - - if (pattern.isEmpty()) { - filter = QString(); - } else { - filter = mimeType.filterString() + qsl(";;All files (*.*)"); - } - - psBringToBack(this); - file = saveFileName(lang(lng_save_file), filter, qsl("doc"), name, true, alreadyDir); - psShowOverAll(this); - if (!file.isEmpty() && file != cur) { - QFile(cur).copy(file); } } else { if (!_photo || !_photo->full->loaded()) return; @@ -609,8 +613,15 @@ void MediaView::onDownload() { } QString toName; if (_doc) { - QString cur = _doc->already(true); - if (cur.isEmpty()) { + const FileLocation &location(_doc->location(true)); + if (location.accessEnable()) { + if (!QDir().exists(path)) QDir().mkpath(path); + toName = filedialogNextFilename(_doc->name, location.name(), path); + if (toName != location.name() && !QFile(location.name()).copy(toName)) { + toName = QString(); + } + location.accessDisable(); + } else { if (_current.isNull() && _currentGif.isNull()) { DocumentSaveLink::doSave(_doc); updateControls(); @@ -619,12 +630,6 @@ void MediaView::onDownload() { update(_saveNav); } updateOver(_lastMouseMovePos); - } else { - if (!QDir().exists(path)) QDir().mkpath(path); - toName = filedialogNextFilename(_doc->name, cur, path); - if (toName != cur && !QFile(cur).copy(toName)) { - toName = QString(); - } } } else { if (!_photo || !_photo->full->loaded()) { @@ -902,25 +907,26 @@ void MediaView::displayDocument(DocumentData *doc, HistoryItem *item) { // empty _caption = Text(); if (_doc) { - QString already = _doc->already(true); + const FileLocation &location(_doc->location(true)); if (_doc->sticker() && !_doc->sticker()->img->isNull() && _doc->sticker()->img->loaded()) { _currentGif.stop(); _current = _doc->sticker()->img->pix(); - } else if (!already.isEmpty()) { - QImageReader reader(already); + } else if (location.accessEnable()) { + QImageReader reader(location.name()); if (reader.canRead()) { if (reader.supportsAnimation() && reader.imageCount() > 1) { - _currentGif.start(0, already); + _currentGif.start(0, location); _current = QPixmap(); } else { _currentGif.stop(); - QPixmap pix = QPixmap::fromImage(App::readImage(already, 0, false), Qt::ColorOnly); + QPixmap pix = QPixmap::fromImage(App::readImage(location.name(), 0, false), Qt::ColorOnly); _current = pix; } } else { _currentGif.stop(); _current = QPixmap(); } + location.accessDisable(); } else { _currentGif.stop(); _current = QPixmap(); diff --git a/Telegram/SourceFiles/mtproto/mtpAuthKey.cpp b/Telegram/SourceFiles/mtproto/mtpAuthKey.cpp new file mode 100644 index 000000000..7e5402219 --- /dev/null +++ b/Telegram/SourceFiles/mtproto/mtpAuthKey.cpp @@ -0,0 +1,41 @@ +/* +This file is part of Telegram Desktop, +the official desktop version of Telegram messaging app, see https://telegram.org + +Telegram Desktop is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +It is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +In addition, as a special exception, the copyright holders give permission +to link the code of portions of this program with the OpenSSL library. + +Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE +Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org +*/ +#include "stdafx.h" + +void aesEncrypt(const void *src, void *dst, uint32 len, void *key, void *iv) { + uchar aes_key[32], aes_iv[32]; + memcpy(aes_key, key, 32); + memcpy(aes_iv, iv, 32); + + AES_KEY aes; + AES_set_encrypt_key(aes_key, 256, &aes); + AES_ige_encrypt((const uchar*)src, (uchar*)dst, len, &aes, aes_iv, AES_ENCRYPT); +} + +void aesDecrypt(const void *src, void *dst, uint32 len, void *key, void *iv) { + uchar aes_key[32], aes_iv[32]; + memcpy(aes_key, key, 32); + memcpy(aes_iv, iv, 32); + + AES_KEY aes; + AES_set_decrypt_key(aes_key, 256, &aes); + AES_ige_encrypt((const uchar*)src, (uchar*)dst, len, &aes, aes_iv, AES_DECRYPT); +} diff --git a/Telegram/SourceFiles/mtproto/mtpAuthKey.h b/Telegram/SourceFiles/mtproto/mtpAuthKey.h index 372f1b3e9..1b0d71f7b 100644 --- a/Telegram/SourceFiles/mtproto/mtpAuthKey.h +++ b/Telegram/SourceFiles/mtproto/mtpAuthKey.h @@ -112,15 +112,8 @@ inline bool operator==(const mtpAuthKey &a, const mtpAuthKey &b) { typedef QSharedPointer mtpAuthKeyPtr; typedef QVector mtpKeysMap; -inline void aesEncrypt(const void *src, void *dst, uint32 len, void *key, void *iv) { - uchar aes_key[32], aes_iv[32]; - memcpy(aes_key, key, 32); - memcpy(aes_iv, iv, 32); - - AES_KEY aes; - AES_set_encrypt_key(aes_key, 256, &aes); - AES_ige_encrypt((const uchar*)src, (uchar*)dst, len, &aes, aes_iv, AES_ENCRYPT); -} +void aesEncrypt(const void *src, void *dst, uint32 len, void *key, void *iv); +void aesDecrypt(const void *src, void *dst, uint32 len, void *key, void *iv); inline void aesEncrypt(const void *src, void *dst, uint32 len, const mtpAuthKeyPtr &authKey, const MTPint128 &msgKey) { MTPint256 aesKey, aesIV; @@ -136,16 +129,6 @@ inline void aesEncryptLocal(const void *src, void *dst, uint32 len, const mtpAut return aesEncrypt(src, dst, len, &aesKey, &aesIV); } -inline void aesDecrypt(const void *src, void *dst, uint32 len, void *key, void *iv) { - uchar aes_key[32], aes_iv[32]; - memcpy(aes_key, key, 32); - memcpy(aes_iv, iv, 32); - - AES_KEY aes; - AES_set_decrypt_key(aes_key, 256, &aes); - AES_ige_encrypt((const uchar*)src, (uchar*)dst, len, &aes, aes_iv, AES_DECRYPT); -} - inline void aesDecrypt(const void *src, void *dst, uint32 len, const mtpAuthKeyPtr &authKey, const MTPint128 &msgKey) { MTPint256 aesKey, aesIV; authKey->prepareAES(msgKey, aesKey, aesIV, false); diff --git a/Telegram/SourceFiles/mtproto/mtpConnection.cpp b/Telegram/SourceFiles/mtproto/mtpConnection.cpp index 26f957960..90d1f8e71 100644 --- a/Telegram/SourceFiles/mtproto/mtpConnection.cpp +++ b/Telegram/SourceFiles/mtproto/mtpConnection.cpp @@ -361,7 +361,7 @@ namespace { QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); if (statusCode.isValid()) { int status = statusCode.toInt(); - mayBeBadKey = (status == 404); + mayBeBadKey = (status == 410); if (status == 429) { LOG(("Protocol Error: 429 flood code returned!")); } @@ -845,7 +845,7 @@ void MTPautoConnection::socketPacket(mtpPrime *packet, uint32 size) { sock.disconnectFromHost(); emit connected(); } else if (status == WaitingTcp || status == UsingTcp) { - bool mayBeBadKey = (data[0] == -404) && _sentEncrypted; + bool mayBeBadKey = (data[0] == -410) && _sentEncrypted; emit error(mayBeBadKey); } else { LOG(("Strange Tcp Error; status %1").arg(status)); @@ -1016,7 +1016,7 @@ void MTPtcpConnection::socketPacket(mtpPrime *packet, uint32 size) { mtpBuffer data = _handleTcpResponse(packet, size); if (data.size() == 1) { - bool mayBeBadKey = (data[0] == -404) && _sentEncrypted; + bool mayBeBadKey = (data[0] == -410) && _sentEncrypted; emit error(mayBeBadKey); } else if (status == UsingTcp) { receivedQueue.push_back(data); @@ -1952,11 +1952,11 @@ void MTProtoConnectionPrivate::socketStart(bool afterConfig) { } } -void MTProtoConnectionPrivate::restart(bool maybeBadKey) { +void MTProtoConnectionPrivate::restart(bool mayBeBadKey) { QReadLocker lockFinished(&sessionDataMutex); if (!sessionData) return; - DEBUG_LOG(("MTP Info: restarting MTProtoConnection, maybe bad key = %1").arg(logBool(maybeBadKey))); + DEBUG_LOG(("MTP Info: restarting MTProtoConnection, maybe bad key = %1").arg(logBool(mayBeBadKey))); _waitForReceivedTimer.stop(); _waitForConnectedTimer.stop(); @@ -1964,11 +1964,11 @@ void MTProtoConnectionPrivate::restart(bool maybeBadKey) { mtpAuthKeyPtr key(sessionData->getKey()); if (key) { if (!sessionData->isCheckedKey()) { - if (maybeBadKey) { + if (mayBeBadKey) { clearMessages(); keyId = mtpAuthKey::RecreateKeyId; // retryTimeout = 1; // no ddos please - LOG(("MTP Info: key may be bad and was not checked - will be destroyed")); + LOG(("MTP Info: key may be bad and was not checked - but won't be destroyed, no log outs because of bad server right now..")); } } else { sessionData->setCheckedKey(false); diff --git a/Telegram/SourceFiles/mtproto/mtpConnection.h b/Telegram/SourceFiles/mtproto/mtpConnection.h index 63a60c2ee..7e03ee616 100644 --- a/Telegram/SourceFiles/mtproto/mtpConnection.h +++ b/Telegram/SourceFiles/mtproto/mtpConnection.h @@ -135,7 +135,7 @@ signals: void receivedData(); void receivedSome(); // to stop restart timer - void error(bool maybeBadKey = false); + void error(bool mayBeBadKey = false); void connected(); void disconnected(); @@ -355,7 +355,7 @@ public slots: void retryByTimer(); void restartNow(); - void restart(bool maybeBadKey = false); + void restart(bool mayBeBadKey = false); void onPingSender(); void onPingSendForce(); @@ -375,8 +375,8 @@ public slots: void onConnected6(); void onDisconnected4(); void onDisconnected6(); - void onError4(bool maybeBadKey = false); - void onError6(bool maybeBadKey = false); + void onError4(bool mayBeBadKey = false); + void onError6(bool mayBeBadKey = false); void doFinish(); diff --git a/Telegram/SourceFiles/mtproto/mtpCoreTypes.cpp b/Telegram/SourceFiles/mtproto/mtpCoreTypes.cpp index 57904985c..b1d00fb1e 100644 --- a/Telegram/SourceFiles/mtproto/mtpCoreTypes.cpp +++ b/Telegram/SourceFiles/mtproto/mtpCoreTypes.cpp @@ -21,6 +21,8 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "stdafx.h" #include "mtpCoreTypes.h" +#include "lang.h" + #if defined _DEBUG || defined _WITH_DEBUG QString mtpWrapNumber(float64 number) { @@ -150,3 +152,11 @@ void mtpTextSerializeCore(MTPStringLogger &to, const mtpPrime *&from, const mtpP } #endif + +QString stickerSetTitle(const MTPDstickerSet &s) { + QString title = qs(s.vtitle); + if ((s.vflags.v & MTPDstickerSet::flag_official) && !title.compare(qstr("Great Minds"), Qt::CaseInsensitive)) { + return lang(lng_stickers_default_set); + } + return title; +} diff --git a/Telegram/SourceFiles/mtproto/mtpCoreTypes.h b/Telegram/SourceFiles/mtproto/mtpCoreTypes.h index d240b34e2..290c7716c 100644 --- a/Telegram/SourceFiles/mtproto/mtpCoreTypes.h +++ b/Telegram/SourceFiles/mtproto/mtpCoreTypes.h @@ -368,7 +368,7 @@ static const mtpTypeId mtpLayers[] = { mtpTypeId(mtpc_invokeWithLayer18), }; static const uint32 mtpLayerMaxSingle = sizeof(mtpLayers) / sizeof(mtpLayers[0]); -static const mtpPrime mtpCurrentLayer = 42; +static const mtpPrime mtpCurrentLayer = 43; template class MTPBoxed : public bareT { @@ -990,3 +990,5 @@ enum { // client side flags static const MTPReplyMarkup MTPnullMarkup = MTP_replyKeyboardMarkup(MTP_int(0), MTP_vector(0)); static const MTPVector MTPnullEntities = MTP_vector(0); + +QString stickerSetTitle(const MTPDstickerSet &s); \ No newline at end of file diff --git a/Telegram/SourceFiles/mtproto/mtpScheme.cpp b/Telegram/SourceFiles/mtproto/mtpScheme.cpp index fb6962cb5..627f9d69c 100644 --- a/Telegram/SourceFiles/mtproto/mtpScheme.cpp +++ b/Telegram/SourceFiles/mtproto/mtpScheme.cpp @@ -2082,6 +2082,31 @@ void _serialize_wallPaperSolid(MTPStringLogger &to, int32 stage, int32 lev, Type } } +void _serialize_inputReportReasonSpam(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { + to.add("{ inputReportReasonSpam }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); +} + +void _serialize_inputReportReasonViolence(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { + to.add("{ inputReportReasonViolence }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); +} + +void _serialize_inputReportReasonPornography(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { + to.add("{ inputReportReasonPornography }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); +} + +void _serialize_inputReportReasonOther(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputReportReasonOther"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" text: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } +} + void _serialize_userFull(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { if (stage) { to.add(",\n").addSpaces(lev); @@ -2966,6 +2991,36 @@ void _serialize_updateChatParticipantAdmin(MTPStringLogger &to, int32 stage, int } } +void _serialize_updateNewStickerSet(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ updateNewStickerSet"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" stickerset: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } +} + +void _serialize_updateStickerSetsOrder(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ updateStickerSetsOrder"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" order: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } +} + +void _serialize_updateStickerSets(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { + to.add("{ updateStickerSets }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); +} + void _serialize_updates_state(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { if (stage) { to.add(",\n").addSpaces(lev); @@ -4052,7 +4107,7 @@ void _serialize_messages_allStickers(MTPStringLogger &to, int32 stage, int32 lev to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" hash: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; case 1: to.add(" sets: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } @@ -4970,6 +5025,19 @@ void _serialize_channels_channelParticipant(MTPStringLogger &to, int32 stage, in } } +void _serialize_help_termsOfService(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ help_termsOfService"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" text: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } +} + void _serialize_req_pq(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { if (stage) { to.add(",\n").addSpaces(lev); @@ -5229,6 +5297,20 @@ void _serialize_account_updateStatus(MTPStringLogger &to, int32 stage, int32 lev } } +void _serialize_account_reportPeer(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ account_reportPeer"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" reason: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } +} + void _serialize_account_checkUsername(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { if (stage) { to.add(",\n").addSpaces(lev); @@ -5457,6 +5539,19 @@ void _serialize_messages_editChatAdmin(MTPStringLogger &to, int32 stage, int32 l } } +void _serialize_messages_reorderStickerSets(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_reorderStickerSets"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" order: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } +} + void _serialize_upload_saveFilePart(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { if (stage) { to.add(",\n").addSpaces(lev); @@ -6835,7 +6930,7 @@ void _serialize_messages_getAllStickers(MTPStringLogger &to, int32 stage, int32 to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" hash: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } } @@ -7058,6 +7153,19 @@ void _serialize_help_getAppChangelog(MTPStringLogger &to, int32 stage, int32 lev } } +void _serialize_help_getTermsOfService(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ help_getTermsOfService"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" lang_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } +} + void _serialize_channels_getParticipants(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 flag) { if (stage) { to.add(",\n").addSpaces(lev); @@ -7305,6 +7413,10 @@ namespace { _serializers.insert(mtpc_peerNotifySettings, _serialize_peerNotifySettings); _serializers.insert(mtpc_wallPaper, _serialize_wallPaper); _serializers.insert(mtpc_wallPaperSolid, _serialize_wallPaperSolid); + _serializers.insert(mtpc_inputReportReasonSpam, _serialize_inputReportReasonSpam); + _serializers.insert(mtpc_inputReportReasonViolence, _serialize_inputReportReasonViolence); + _serializers.insert(mtpc_inputReportReasonPornography, _serialize_inputReportReasonPornography); + _serializers.insert(mtpc_inputReportReasonOther, _serialize_inputReportReasonOther); _serializers.insert(mtpc_userFull, _serialize_userFull); _serializers.insert(mtpc_contact, _serialize_contact); _serializers.insert(mtpc_importedContact, _serialize_importedContact); @@ -7372,6 +7484,9 @@ namespace { _serializers.insert(mtpc_updateChannelMessageViews, _serialize_updateChannelMessageViews); _serializers.insert(mtpc_updateChatAdmins, _serialize_updateChatAdmins); _serializers.insert(mtpc_updateChatParticipantAdmin, _serialize_updateChatParticipantAdmin); + _serializers.insert(mtpc_updateNewStickerSet, _serialize_updateNewStickerSet); + _serializers.insert(mtpc_updateStickerSetsOrder, _serialize_updateStickerSetsOrder); + _serializers.insert(mtpc_updateStickerSets, _serialize_updateStickerSets); _serializers.insert(mtpc_updates_state, _serialize_updates_state); _serializers.insert(mtpc_updates_differenceEmpty, _serialize_updates_differenceEmpty); _serializers.insert(mtpc_updates_difference, _serialize_updates_difference); @@ -7536,6 +7651,7 @@ namespace { _serializers.insert(mtpc_channelRoleEditor, _serialize_channelRoleEditor); _serializers.insert(mtpc_channels_channelParticipants, _serialize_channels_channelParticipants); _serializers.insert(mtpc_channels_channelParticipant, _serialize_channels_channelParticipant); + _serializers.insert(mtpc_help_termsOfService, _serialize_help_termsOfService); _serializers.insert(mtpc_req_pq, _serialize_req_pq); _serializers.insert(mtpc_req_DH_params, _serialize_req_DH_params); @@ -7557,6 +7673,7 @@ namespace { _serializers.insert(mtpc_account_updateNotifySettings, _serialize_account_updateNotifySettings); _serializers.insert(mtpc_account_resetNotifySettings, _serialize_account_resetNotifySettings); _serializers.insert(mtpc_account_updateStatus, _serialize_account_updateStatus); + _serializers.insert(mtpc_account_reportPeer, _serialize_account_reportPeer); _serializers.insert(mtpc_account_checkUsername, _serialize_account_checkUsername); _serializers.insert(mtpc_account_deleteAccount, _serialize_account_deleteAccount); _serializers.insert(mtpc_account_setAccountTTL, _serialize_account_setAccountTTL); @@ -7574,6 +7691,7 @@ namespace { _serializers.insert(mtpc_messages_installStickerSet, _serialize_messages_installStickerSet); _serializers.insert(mtpc_messages_uninstallStickerSet, _serialize_messages_uninstallStickerSet); _serializers.insert(mtpc_messages_editChatAdmin, _serialize_messages_editChatAdmin); + _serializers.insert(mtpc_messages_reorderStickerSets, _serialize_messages_reorderStickerSets); _serializers.insert(mtpc_upload_saveFilePart, _serialize_upload_saveFilePart); _serializers.insert(mtpc_upload_saveBigFilePart, _serialize_upload_saveBigFilePart); _serializers.insert(mtpc_help_saveAppLog, _serialize_help_saveAppLog); @@ -7693,6 +7811,7 @@ namespace { _serializers.insert(mtpc_help_getInviteText, _serialize_help_getInviteText); _serializers.insert(mtpc_help_getSupport, _serialize_help_getSupport); _serializers.insert(mtpc_help_getAppChangelog, _serialize_help_getAppChangelog); + _serializers.insert(mtpc_help_getTermsOfService, _serialize_help_getTermsOfService); _serializers.insert(mtpc_channels_getParticipants, _serialize_channels_getParticipants); _serializers.insert(mtpc_channels_getParticipant, _serialize_channels_getParticipant); diff --git a/Telegram/SourceFiles/mtproto/mtpScheme.h b/Telegram/SourceFiles/mtproto/mtpScheme.h index f53568ead..6b0d1c3a1 100644 --- a/Telegram/SourceFiles/mtproto/mtpScheme.h +++ b/Telegram/SourceFiles/mtproto/mtpScheme.h @@ -205,6 +205,10 @@ enum { mtpc_peerNotifySettings = 0x8d5e11ee, mtpc_wallPaper = 0xccb03657, mtpc_wallPaperSolid = 0x63117f24, + mtpc_inputReportReasonSpam = 0x58dbcab8, + mtpc_inputReportReasonViolence = 0x1e22c78d, + mtpc_inputReportReasonPornography = 0x2e59d922, + mtpc_inputReportReasonOther = 0xe1746d0a, mtpc_userFull = 0x5a89ac5b, mtpc_contact = 0xf911c994, mtpc_importedContact = 0xd0028438, @@ -272,6 +276,9 @@ enum { mtpc_updateChannelMessageViews = 0x98a12b4b, mtpc_updateChatAdmins = 0x6e947941, mtpc_updateChatParticipantAdmin = 0xb6901959, + mtpc_updateNewStickerSet = 0x688a30aa, + mtpc_updateStickerSetsOrder = 0xf0dfb451, + mtpc_updateStickerSets = 0x43ae3dec, mtpc_updates_state = 0xa56c2a3e, mtpc_updates_differenceEmpty = 0x5d75a138, mtpc_updates_difference = 0xf49ca0, @@ -362,7 +369,7 @@ enum { mtpc_messages_stickers = 0x8a8ecd32, mtpc_stickerPack = 0x12b299d4, mtpc_messages_allStickersNotModified = 0xe86602c3, - mtpc_messages_allStickers = 0xd51dafdb, + mtpc_messages_allStickers = 0xedfd405f, mtpc_disabledFeature = 0xae636f24, mtpc_messages_affectedMessages = 0x84d19185, mtpc_contactLinkUnknown = 0x5f4f9247, @@ -436,6 +443,7 @@ enum { mtpc_channelRoleEditor = 0x820bfe8c, mtpc_channels_channelParticipants = 0xf56ee2a8, mtpc_channels_channelParticipant = 0xd0d9b163, + mtpc_help_termsOfService = 0xf1ee3e90, mtpc_invokeAfterMsg = 0xcb9f372d, mtpc_invokeAfterMsgs = 0x3dc4b4f0, mtpc_initConnection = 0x69796de9, @@ -465,6 +473,7 @@ enum { mtpc_account_updateProfile = 0xf0888d68, mtpc_account_updateStatus = 0x6628562c, mtpc_account_getWallPapers = 0xc04cfac2, + mtpc_account_reportPeer = 0xae189d5f, mtpc_account_checkUsername = 0x2714d86c, mtpc_account_updateUsername = 0x3e0bdd7c, mtpc_account_getPrivacy = 0xdadbc950, @@ -529,7 +538,7 @@ enum { mtpc_messages_receivedQueue = 0x55a5bb66, mtpc_messages_readMessageContents = 0x36a73f77, mtpc_messages_getStickers = 0xae22e045, - mtpc_messages_getAllStickers = 0xaa3bc868, + mtpc_messages_getAllStickers = 0x1c9618b1, mtpc_messages_getWebPagePreview = 0x25223e24, mtpc_messages_exportChatInvite = 0x7d885289, mtpc_messages_checkChatInvite = 0x3eadb1bb, @@ -543,6 +552,7 @@ enum { mtpc_messages_editChatAdmin = 0xa9e69f2e, mtpc_messages_migrateChat = 0x15a3b8e3, mtpc_messages_searchGlobal = 0x9e3cacb0, + mtpc_messages_reorderStickerSets = 0x9fcfbc30, mtpc_updates_getState = 0xedd4882a, mtpc_updates_getDifference = 0xa041495, mtpc_updates_getChannelDifference = 0xbb32d7c0, @@ -560,6 +570,7 @@ enum { mtpc_help_getInviteText = 0xa4a95186, mtpc_help_getSupport = 0x9cdf08cd, mtpc_help_getAppChangelog = 0x5bab7fb2, + mtpc_help_getTermsOfService = 0x37d78f83, mtpc_channels_getDialogs = 0xa9d3d249, mtpc_channels_getImportantHistory = 0xddb929cb, mtpc_channels_readHistory = 0xcc104937, @@ -843,6 +854,9 @@ class MTPwallPaper; class MTPDwallPaper; class MTPDwallPaperSolid; +class MTPreportReason; +class MTPDinputReportReasonOther; + class MTPuserFull; class MTPDuserFull; @@ -935,6 +949,8 @@ class MTPDupdateDeleteChannelMessages; class MTPDupdateChannelMessageViews; class MTPDupdateChatAdmins; class MTPDupdateChatParticipantAdmin; +class MTPDupdateNewStickerSet; +class MTPDupdateStickerSetsOrder; class MTPupdates_state; class MTPDupdates_state; @@ -1196,6 +1212,9 @@ class MTPDchannels_channelParticipants; class MTPchannels_channelParticipant; class MTPDchannels_channelParticipant; +class MTPhelp_termsOfService; +class MTPDhelp_termsOfService; + // Boxed types definitions typedef MTPBoxed MTPResPQ; @@ -1264,6 +1283,7 @@ typedef MTPBoxed MTPInputPeerNotifySettings; typedef MTPBoxed MTPPeerNotifyEvents; typedef MTPBoxed MTPPeerNotifySettings; typedef MTPBoxed MTPWallPaper; +typedef MTPBoxed MTPReportReason; typedef MTPBoxed MTPUserFull; typedef MTPBoxed MTPContact; typedef MTPBoxed MTPImportedContact; @@ -1353,6 +1373,7 @@ typedef MTPBoxed MTPChannelParticipantsFilter; typedef MTPBoxed MTPChannelParticipantRole; typedef MTPBoxed MTPchannels_ChannelParticipants; typedef MTPBoxed MTPchannels_ChannelParticipant; +typedef MTPBoxed MTPhelp_TermsOfService; // Type classes definitions @@ -4503,6 +4524,46 @@ private: }; typedef MTPBoxed MTPWallPaper; +class MTPreportReason : private mtpDataOwner { +public: + MTPreportReason() : mtpDataOwner(0), _type(0) { + } + MTPreportReason(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) : mtpDataOwner(0), _type(0) { + read(from, end, cons); + } + + MTPDinputReportReasonOther &_inputReportReasonOther() { + if (!data) throw mtpErrorUninitialized(); + if (_type != mtpc_inputReportReasonOther) throw mtpErrorWrongTypeId(_type, mtpc_inputReportReasonOther); + split(); + return *(MTPDinputReportReasonOther*)data; + } + const MTPDinputReportReasonOther &c_inputReportReasonOther() const { + if (!data) throw mtpErrorUninitialized(); + if (_type != mtpc_inputReportReasonOther) throw mtpErrorWrongTypeId(_type, mtpc_inputReportReasonOther); + return *(const MTPDinputReportReasonOther*)data; + } + + uint32 innerLength() const; + mtpTypeId type() const; + void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons); + void write(mtpBuffer &to) const; + + typedef void ResponseType; + +private: + explicit MTPreportReason(mtpTypeId type); + explicit MTPreportReason(MTPDinputReportReasonOther *_data); + + friend MTPreportReason MTP_inputReportReasonSpam(); + friend MTPreportReason MTP_inputReportReasonViolence(); + friend MTPreportReason MTP_inputReportReasonPornography(); + friend MTPreportReason MTP_inputReportReasonOther(const MTPstring &_text); + + mtpTypeId _type; +}; +typedef MTPBoxed MTPReportReason; + class MTPuserFull : private mtpDataOwner { public: MTPuserFull(); @@ -5564,6 +5625,30 @@ public: return *(const MTPDupdateChatParticipantAdmin*)data; } + MTPDupdateNewStickerSet &_updateNewStickerSet() { + if (!data) throw mtpErrorUninitialized(); + if (_type != mtpc_updateNewStickerSet) throw mtpErrorWrongTypeId(_type, mtpc_updateNewStickerSet); + split(); + return *(MTPDupdateNewStickerSet*)data; + } + const MTPDupdateNewStickerSet &c_updateNewStickerSet() const { + if (!data) throw mtpErrorUninitialized(); + if (_type != mtpc_updateNewStickerSet) throw mtpErrorWrongTypeId(_type, mtpc_updateNewStickerSet); + return *(const MTPDupdateNewStickerSet*)data; + } + + MTPDupdateStickerSetsOrder &_updateStickerSetsOrder() { + if (!data) throw mtpErrorUninitialized(); + if (_type != mtpc_updateStickerSetsOrder) throw mtpErrorWrongTypeId(_type, mtpc_updateStickerSetsOrder); + split(); + return *(MTPDupdateStickerSetsOrder*)data; + } + const MTPDupdateStickerSetsOrder &c_updateStickerSetsOrder() const { + if (!data) throw mtpErrorUninitialized(); + if (_type != mtpc_updateStickerSetsOrder) throw mtpErrorWrongTypeId(_type, mtpc_updateStickerSetsOrder); + return *(const MTPDupdateStickerSetsOrder*)data; + } + uint32 innerLength() const; mtpTypeId type() const; void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons); @@ -5610,6 +5695,8 @@ private: explicit MTPupdate(MTPDupdateChannelMessageViews *_data); explicit MTPupdate(MTPDupdateChatAdmins *_data); explicit MTPupdate(MTPDupdateChatParticipantAdmin *_data); + explicit MTPupdate(MTPDupdateNewStickerSet *_data); + explicit MTPupdate(MTPDupdateStickerSetsOrder *_data); friend MTPupdate MTP_updateNewMessage(const MTPMessage &_message, MTPint _pts, MTPint _pts_count); friend MTPupdate MTP_updateMessageID(MTPint _id, const MTPlong &_random_id); @@ -5648,6 +5735,9 @@ private: friend MTPupdate MTP_updateChannelMessageViews(MTPint _channel_id, MTPint _id, MTPint _views); friend MTPupdate MTP_updateChatAdmins(MTPint _chat_id, MTPBool _enabled, MTPint _version); friend MTPupdate MTP_updateChatParticipantAdmin(MTPint _chat_id, MTPint _user_id, MTPBool _is_admin, MTPint _version); + friend MTPupdate MTP_updateNewStickerSet(const MTPmessages_StickerSet &_stickerset); + friend MTPupdate MTP_updateStickerSetsOrder(const MTPVector &_order); + friend MTPupdate MTP_updateStickerSets(); mtpTypeId _type; }; @@ -7318,7 +7408,7 @@ private: explicit MTPmessages_allStickers(MTPDmessages_allStickers *_data); friend MTPmessages_allStickers MTP_messages_allStickersNotModified(); - friend MTPmessages_allStickers MTP_messages_allStickers(const MTPstring &_hash, const MTPVector &_sets); + friend MTPmessages_allStickers MTP_messages_allStickers(MTPint _hash, const MTPVector &_sets); mtpTypeId _type; }; @@ -8786,6 +8876,37 @@ private: }; typedef MTPBoxed MTPchannels_ChannelParticipant; +class MTPhelp_termsOfService : private mtpDataOwner { +public: + MTPhelp_termsOfService(); + MTPhelp_termsOfService(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_help_termsOfService) : mtpDataOwner(0) { + read(from, end, cons); + } + + MTPDhelp_termsOfService &_help_termsOfService() { + if (!data) throw mtpErrorUninitialized(); + split(); + return *(MTPDhelp_termsOfService*)data; + } + const MTPDhelp_termsOfService &c_help_termsOfService() const { + if (!data) throw mtpErrorUninitialized(); + return *(const MTPDhelp_termsOfService*)data; + } + + uint32 innerLength() const; + mtpTypeId type() const; + void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_help_termsOfService); + void write(mtpBuffer &to) const; + + typedef void ResponseType; + +private: + explicit MTPhelp_termsOfService(MTPDhelp_termsOfService *_data); + + friend MTPhelp_termsOfService MTP_help_termsOfService(const MTPstring &_text); +}; +typedef MTPBoxed MTPhelp_TermsOfService; + // Type constructors with data class MTPDresPQ : public mtpDataImpl { @@ -10403,6 +10524,16 @@ public: MTPint vcolor; }; +class MTPDinputReportReasonOther : public mtpDataImpl { +public: + MTPDinputReportReasonOther() { + } + MTPDinputReportReasonOther(const MTPstring &_text) : vtext(_text) { + } + + MTPstring vtext; +}; + class MTPDuserFull : public mtpDataImpl { public: MTPDuserFull() { @@ -11082,6 +11213,26 @@ public: MTPint vversion; }; +class MTPDupdateNewStickerSet : public mtpDataImpl { +public: + MTPDupdateNewStickerSet() { + } + MTPDupdateNewStickerSet(const MTPmessages_StickerSet &_stickerset) : vstickerset(_stickerset) { + } + + MTPmessages_StickerSet vstickerset; +}; + +class MTPDupdateStickerSetsOrder : public mtpDataImpl { +public: + MTPDupdateStickerSetsOrder() { + } + MTPDupdateStickerSetsOrder(const MTPVector &_order) : vorder(_order) { + } + + MTPVector vorder; +}; + class MTPDupdates_state : public mtpDataImpl { public: MTPDupdates_state() { @@ -11914,10 +12065,10 @@ class MTPDmessages_allStickers : public mtpDataImpl { public: MTPDmessages_allStickers() { } - MTPDmessages_allStickers(const MTPstring &_hash, const MTPVector &_sets) : vhash(_hash), vsets(_sets) { + MTPDmessages_allStickers(MTPint _hash, const MTPVector &_sets) : vhash(_hash), vsets(_sets) { } - MTPstring vhash; + MTPint vhash; MTPVector vsets; }; @@ -12696,6 +12847,16 @@ public: MTPVector vusers; }; +class MTPDhelp_termsOfService : public mtpDataImpl { +public: + MTPDhelp_termsOfService() { + } + MTPDhelp_termsOfService(const MTPstring &_text) : vtext(_text) { + } + + MTPstring vtext; +}; + // RPC methods class MTPreq_pq { // RPC method 'req_pq' @@ -14287,6 +14448,48 @@ public: } }; +class MTPaccount_reportPeer { // RPC method 'account.reportPeer' +public: + MTPInputPeer vpeer; + MTPReportReason vreason; + + MTPaccount_reportPeer() { + } + MTPaccount_reportPeer(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_account_reportPeer) { + read(from, end, cons); + } + MTPaccount_reportPeer(const MTPInputPeer &_peer, const MTPReportReason &_reason) : vpeer(_peer), vreason(_reason) { + } + + uint32 innerLength() const { + return vpeer.innerLength() + vreason.innerLength(); + } + mtpTypeId type() const { + return mtpc_account_reportPeer; + } + void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_account_reportPeer) { + vpeer.read(from, end); + vreason.read(from, end); + } + void write(mtpBuffer &to) const { + vpeer.write(to); + vreason.write(to); + } + + typedef MTPBool ResponseType; +}; +class MTPaccount_ReportPeer : public MTPBoxed { +public: + MTPaccount_ReportPeer() { + } + MTPaccount_ReportPeer(const MTPaccount_reportPeer &v) : MTPBoxed(v) { + } + MTPaccount_ReportPeer(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed(from, end, cons) { + } + MTPaccount_ReportPeer(const MTPInputPeer &_peer, const MTPReportReason &_reason) : MTPBoxed(MTPaccount_reportPeer(_peer, _reason)) { + } +}; + class MTPaccount_checkUsername { // RPC method 'account.checkUsername' public: MTPstring vusername; @@ -16982,14 +17185,14 @@ public: class MTPmessages_getAllStickers { // RPC method 'messages.getAllStickers' public: - MTPstring vhash; + MTPint vhash; MTPmessages_getAllStickers() { } MTPmessages_getAllStickers(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_getAllStickers) { read(from, end, cons); } - MTPmessages_getAllStickers(const MTPstring &_hash) : vhash(_hash) { + MTPmessages_getAllStickers(MTPint _hash) : vhash(_hash) { } uint32 innerLength() const { @@ -17015,7 +17218,7 @@ public: } MTPmessages_GetAllStickers(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed(from, end, cons) { } - MTPmessages_GetAllStickers(const MTPstring &_hash) : MTPBoxed(MTPmessages_getAllStickers(_hash)) { + MTPmessages_GetAllStickers(MTPint _hash) : MTPBoxed(MTPmessages_getAllStickers(_hash)) { } }; @@ -17565,6 +17768,45 @@ public: } }; +class MTPmessages_reorderStickerSets { // RPC method 'messages.reorderStickerSets' +public: + MTPVector vorder; + + MTPmessages_reorderStickerSets() { + } + MTPmessages_reorderStickerSets(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_reorderStickerSets) { + read(from, end, cons); + } + MTPmessages_reorderStickerSets(const MTPVector &_order) : vorder(_order) { + } + + uint32 innerLength() const { + return vorder.innerLength(); + } + mtpTypeId type() const { + return mtpc_messages_reorderStickerSets; + } + void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_reorderStickerSets) { + vorder.read(from, end); + } + void write(mtpBuffer &to) const { + vorder.write(to); + } + + typedef MTPBool ResponseType; +}; +class MTPmessages_ReorderStickerSets : public MTPBoxed { +public: + MTPmessages_ReorderStickerSets() { + } + MTPmessages_ReorderStickerSets(const MTPmessages_reorderStickerSets &v) : MTPBoxed(v) { + } + MTPmessages_ReorderStickerSets(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed(from, end, cons) { + } + MTPmessages_ReorderStickerSets(const MTPVector &_order) : MTPBoxed(MTPmessages_reorderStickerSets(_order)) { + } +}; + class MTPupdates_getState { // RPC method 'updates.getState' public: MTPupdates_getState() { @@ -18271,6 +18513,45 @@ public: } }; +class MTPhelp_getTermsOfService { // RPC method 'help.getTermsOfService' +public: + MTPstring vlang_code; + + MTPhelp_getTermsOfService() { + } + MTPhelp_getTermsOfService(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_help_getTermsOfService) { + read(from, end, cons); + } + MTPhelp_getTermsOfService(const MTPstring &_lang_code) : vlang_code(_lang_code) { + } + + uint32 innerLength() const { + return vlang_code.innerLength(); + } + mtpTypeId type() const { + return mtpc_help_getTermsOfService; + } + void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_help_getTermsOfService) { + vlang_code.read(from, end); + } + void write(mtpBuffer &to) const { + vlang_code.write(to); + } + + typedef MTPhelp_TermsOfService ResponseType; +}; +class MTPhelp_GetTermsOfService : public MTPBoxed { +public: + MTPhelp_GetTermsOfService() { + } + MTPhelp_GetTermsOfService(const MTPhelp_getTermsOfService &v) : MTPBoxed(v) { + } + MTPhelp_GetTermsOfService(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed(from, end, cons) { + } + MTPhelp_GetTermsOfService(const MTPstring &_lang_code) : MTPBoxed(MTPhelp_getTermsOfService(_lang_code)) { + } +}; + class MTPchannels_getDialogs { // RPC method 'channels.getDialogs' public: MTPint voffset; @@ -23627,6 +23908,65 @@ inline MTPwallPaper MTP_wallPaperSolid(MTPint _id, const MTPstring &_title, MTPi return MTPwallPaper(new MTPDwallPaperSolid(_id, _title, _bg_color, _color)); } +inline uint32 MTPreportReason::innerLength() const { + switch (_type) { + case mtpc_inputReportReasonOther: { + const MTPDinputReportReasonOther &v(c_inputReportReasonOther()); + return v.vtext.innerLength(); + } + } + return 0; +} +inline mtpTypeId MTPreportReason::type() const { + if (!_type) throw mtpErrorUninitialized(); + return _type; +} +inline void MTPreportReason::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) { + if (cons != _type) setData(0); + switch (cons) { + case mtpc_inputReportReasonSpam: _type = cons; break; + case mtpc_inputReportReasonViolence: _type = cons; break; + case mtpc_inputReportReasonPornography: _type = cons; break; + case mtpc_inputReportReasonOther: _type = cons; { + if (!data) setData(new MTPDinputReportReasonOther()); + MTPDinputReportReasonOther &v(_inputReportReasonOther()); + v.vtext.read(from, end); + } break; + default: throw mtpErrorUnexpected(cons, "MTPreportReason"); + } +} +inline void MTPreportReason::write(mtpBuffer &to) const { + switch (_type) { + case mtpc_inputReportReasonOther: { + const MTPDinputReportReasonOther &v(c_inputReportReasonOther()); + v.vtext.write(to); + } break; + } +} +inline MTPreportReason::MTPreportReason(mtpTypeId type) : mtpDataOwner(0), _type(type) { + switch (type) { + case mtpc_inputReportReasonSpam: break; + case mtpc_inputReportReasonViolence: break; + case mtpc_inputReportReasonPornography: break; + case mtpc_inputReportReasonOther: setData(new MTPDinputReportReasonOther()); break; + default: throw mtpErrorBadTypeId(type, "MTPreportReason"); + } +} +inline MTPreportReason::MTPreportReason(MTPDinputReportReasonOther *_data) : mtpDataOwner(_data), _type(mtpc_inputReportReasonOther) { +} +inline MTPreportReason MTP_inputReportReasonSpam() { + return MTPreportReason(mtpc_inputReportReasonSpam); +} +inline MTPreportReason MTP_inputReportReasonViolence() { + return MTPreportReason(mtpc_inputReportReasonViolence); +} +inline MTPreportReason MTP_inputReportReasonPornography() { + return MTPreportReason(mtpc_inputReportReasonPornography); +} +inline MTPreportReason MTP_inputReportReasonOther(const MTPstring &_text) { + return MTPreportReason(new MTPDinputReportReasonOther(_text)); +} + inline MTPuserFull::MTPuserFull() : mtpDataOwner(new MTPDuserFull()) { } @@ -24507,6 +24847,14 @@ inline uint32 MTPupdate::innerLength() const { const MTPDupdateChatParticipantAdmin &v(c_updateChatParticipantAdmin()); return v.vchat_id.innerLength() + v.vuser_id.innerLength() + v.vis_admin.innerLength() + v.vversion.innerLength(); } + case mtpc_updateNewStickerSet: { + const MTPDupdateNewStickerSet &v(c_updateNewStickerSet()); + return v.vstickerset.innerLength(); + } + case mtpc_updateStickerSetsOrder: { + const MTPDupdateStickerSetsOrder &v(c_updateStickerSetsOrder()); + return v.vorder.innerLength(); + } } return 0; } @@ -24764,6 +25112,17 @@ inline void MTPupdate::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeI v.vis_admin.read(from, end); v.vversion.read(from, end); } break; + case mtpc_updateNewStickerSet: _type = cons; { + if (!data) setData(new MTPDupdateNewStickerSet()); + MTPDupdateNewStickerSet &v(_updateNewStickerSet()); + v.vstickerset.read(from, end); + } break; + case mtpc_updateStickerSetsOrder: _type = cons; { + if (!data) setData(new MTPDupdateStickerSetsOrder()); + MTPDupdateStickerSetsOrder &v(_updateStickerSetsOrder()); + v.vorder.read(from, end); + } break; + case mtpc_updateStickerSets: _type = cons; break; default: throw mtpErrorUnexpected(cons, "MTPupdate"); } } @@ -24979,6 +25338,14 @@ inline void MTPupdate::write(mtpBuffer &to) const { v.vis_admin.write(to); v.vversion.write(to); } break; + case mtpc_updateNewStickerSet: { + const MTPDupdateNewStickerSet &v(c_updateNewStickerSet()); + v.vstickerset.write(to); + } break; + case mtpc_updateStickerSetsOrder: { + const MTPDupdateStickerSetsOrder &v(c_updateStickerSetsOrder()); + v.vorder.write(to); + } break; } } inline MTPupdate::MTPupdate(mtpTypeId type) : mtpDataOwner(0), _type(type) { @@ -25020,6 +25387,9 @@ inline MTPupdate::MTPupdate(mtpTypeId type) : mtpDataOwner(0), _type(type) { case mtpc_updateChannelMessageViews: setData(new MTPDupdateChannelMessageViews()); break; case mtpc_updateChatAdmins: setData(new MTPDupdateChatAdmins()); break; case mtpc_updateChatParticipantAdmin: setData(new MTPDupdateChatParticipantAdmin()); break; + case mtpc_updateNewStickerSet: setData(new MTPDupdateNewStickerSet()); break; + case mtpc_updateStickerSetsOrder: setData(new MTPDupdateStickerSetsOrder()); break; + case mtpc_updateStickerSets: break; default: throw mtpErrorBadTypeId(type, "MTPupdate"); } } @@ -25097,6 +25467,10 @@ inline MTPupdate::MTPupdate(MTPDupdateChatAdmins *_data) : mtpDataOwner(_data), } inline MTPupdate::MTPupdate(MTPDupdateChatParticipantAdmin *_data) : mtpDataOwner(_data), _type(mtpc_updateChatParticipantAdmin) { } +inline MTPupdate::MTPupdate(MTPDupdateNewStickerSet *_data) : mtpDataOwner(_data), _type(mtpc_updateNewStickerSet) { +} +inline MTPupdate::MTPupdate(MTPDupdateStickerSetsOrder *_data) : mtpDataOwner(_data), _type(mtpc_updateStickerSetsOrder) { +} inline MTPupdate MTP_updateNewMessage(const MTPMessage &_message, MTPint _pts, MTPint _pts_count) { return MTPupdate(new MTPDupdateNewMessage(_message, _pts, _pts_count)); } @@ -25208,6 +25582,15 @@ inline MTPupdate MTP_updateChatAdmins(MTPint _chat_id, MTPBool _enabled, MTPint inline MTPupdate MTP_updateChatParticipantAdmin(MTPint _chat_id, MTPint _user_id, MTPBool _is_admin, MTPint _version) { return MTPupdate(new MTPDupdateChatParticipantAdmin(_chat_id, _user_id, _is_admin, _version)); } +inline MTPupdate MTP_updateNewStickerSet(const MTPmessages_StickerSet &_stickerset) { + return MTPupdate(new MTPDupdateNewStickerSet(_stickerset)); +} +inline MTPupdate MTP_updateStickerSetsOrder(const MTPVector &_order) { + return MTPupdate(new MTPDupdateStickerSetsOrder(_order)); +} +inline MTPupdate MTP_updateStickerSets() { + return MTPupdate(mtpc_updateStickerSets); +} inline MTPupdates_state::MTPupdates_state() : mtpDataOwner(new MTPDupdates_state()) { } @@ -27495,7 +27878,7 @@ inline MTPmessages_allStickers::MTPmessages_allStickers(MTPDmessages_allStickers inline MTPmessages_allStickers MTP_messages_allStickersNotModified() { return MTPmessages_allStickers(mtpc_messages_allStickersNotModified); } -inline MTPmessages_allStickers MTP_messages_allStickers(const MTPstring &_hash, const MTPVector &_sets) { +inline MTPmessages_allStickers MTP_messages_allStickers(MTPint _hash, const MTPVector &_sets) { return MTPmessages_allStickers(new MTPDmessages_allStickers(_hash, _sets)); } @@ -29383,6 +29766,33 @@ inline MTPchannels_channelParticipant MTP_channels_channelParticipant(const MTPC return MTPchannels_channelParticipant(new MTPDchannels_channelParticipant(_participant, _users)); } +inline MTPhelp_termsOfService::MTPhelp_termsOfService() : mtpDataOwner(new MTPDhelp_termsOfService()) { +} + +inline uint32 MTPhelp_termsOfService::innerLength() const { + const MTPDhelp_termsOfService &v(c_help_termsOfService()); + return v.vtext.innerLength(); +} +inline mtpTypeId MTPhelp_termsOfService::type() const { + return mtpc_help_termsOfService; +} +inline void MTPhelp_termsOfService::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) { + if (cons != mtpc_help_termsOfService) throw mtpErrorUnexpected(cons, "MTPhelp_termsOfService"); + + if (!data) setData(new MTPDhelp_termsOfService()); + MTPDhelp_termsOfService &v(_help_termsOfService()); + v.vtext.read(from, end); +} +inline void MTPhelp_termsOfService::write(mtpBuffer &to) const { + const MTPDhelp_termsOfService &v(c_help_termsOfService()); + v.vtext.write(to); +} +inline MTPhelp_termsOfService::MTPhelp_termsOfService(MTPDhelp_termsOfService *_data) : mtpDataOwner(_data) { +} +inline MTPhelp_termsOfService MTP_help_termsOfService(const MTPstring &_text) { + return MTPhelp_termsOfService(new MTPDhelp_termsOfService(_text)); +} + // Human-readable text serialization #if (defined _DEBUG || defined _WITH_DEBUG) diff --git a/Telegram/SourceFiles/mtproto/scheme.tl b/Telegram/SourceFiles/mtproto/scheme.tl index ee1e79698..db9481ad0 100644 --- a/Telegram/SourceFiles/mtproto/scheme.tl +++ b/Telegram/SourceFiles/mtproto/scheme.tl @@ -305,6 +305,11 @@ peerNotifySettings#8d5e11ee mute_until:int sound:string show_previews:Bool event wallPaper#ccb03657 id:int title:string sizes:Vector color:int = WallPaper; wallPaperSolid#63117f24 id:int title:string bg_color:int color:int = WallPaper; +inputReportReasonSpam#58dbcab8 = ReportReason; +inputReportReasonViolence#1e22c78d = ReportReason; +inputReportReasonPornography#2e59d922 = ReportReason; +inputReportReasonOther#e1746d0a text:string = ReportReason; + userFull#5a89ac5b user:User link:contacts.Link profile_photo:Photo notify_settings:PeerNotifySettings blocked:Bool bot_info:BotInfo = UserFull; contact#f911c994 user_id:int mutual:Bool = Contact; @@ -389,6 +394,9 @@ updateDeleteChannelMessages#c37521c9 channel_id:int messages:Vector pts:int updateChannelMessageViews#98a12b4b channel_id:int id:int views:int = Update; updateChatAdmins#6e947941 chat_id:int enabled:Bool version:int = Update; updateChatParticipantAdmin#b6901959 chat_id:int user_id:int is_admin:Bool version:int = Update; +updateNewStickerSet#688a30aa stickerset:messages.StickerSet = Update; +updateStickerSetsOrder#f0dfb451 order:Vector = Update; +updateStickerSets#43ae3dec = Update; updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; @@ -516,7 +524,7 @@ messages.stickers#8a8ecd32 hash:string stickers:Vector = messages.Stic stickerPack#12b299d4 emoticon:string documents:Vector = StickerPack; messages.allStickersNotModified#e86602c3 = messages.AllStickers; -messages.allStickers#d51dafdb hash:string sets:Vector = messages.AllStickers; +messages.allStickers#edfd405f hash:int sets:Vector = messages.AllStickers; disabledFeature#ae636f24 feature:string description:string = DisabledFeature; @@ -625,6 +633,8 @@ channels.channelParticipants#f56ee2a8 count:int participants:Vector = channels.ChannelParticipant; +help.termsOfService#f1ee3e90 text:string = help.TermsOfService; + ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; @@ -658,6 +668,7 @@ account.resetNotifySettings#db7e1747 = Bool; account.updateProfile#f0888d68 first_name:string last_name:string = User; account.updateStatus#6628562c offline:Bool = Bool; account.getWallPapers#c04cfac2 = Vector; +account.reportPeer#ae189d5f peer:InputPeer reason:ReportReason = Bool; account.checkUsername#2714d86c username:string = Bool; account.updateUsername#3e0bdd7c username:string = User; account.getPrivacy#dadbc950 key:InputPrivacyKey = account.PrivacyRules; @@ -725,7 +736,7 @@ messages.sendEncryptedService#32d439a4 peer:InputEncryptedChat random_id:long da messages.receivedQueue#55a5bb66 max_qts:int = Vector; messages.readMessageContents#36a73f77 id:Vector = messages.AffectedMessages; messages.getStickers#ae22e045 emoticon:string hash:string = messages.Stickers; -messages.getAllStickers#aa3bc868 hash:string = messages.AllStickers; +messages.getAllStickers#1c9618b1 hash:int = messages.AllStickers; messages.getWebPagePreview#25223e24 message:string = MessageMedia; messages.exportChatInvite#7d885289 chat_id:int = ExportedChatInvite; messages.checkChatInvite#3eadb1bb hash:string = ChatInvite; @@ -739,6 +750,7 @@ messages.toggleChatAdmins#ec8bd9e1 chat_id:int enabled:Bool = Updates; messages.editChatAdmin#a9e69f2e chat_id:int user_id:InputUser is_admin:Bool = Bool; messages.migrateChat#15a3b8e3 chat_id:int = Updates; messages.searchGlobal#9e3cacb0 q:string offset_date:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; +messages.reorderStickerSets#9fcfbc30 order:Vector = Bool; updates.getState#edd4882a = updates.State; updates.getDifference#a041495 pts:int date:int qts:int = updates.Difference; @@ -760,6 +772,7 @@ help.saveAppLog#6f02f748 events:Vector = Bool; help.getInviteText#a4a95186 lang_code:string = help.InviteText; help.getSupport#9cdf08cd = help.Support; help.getAppChangelog#5bab7fb2 device_model:string system_version:string app_version:string lang_code:string = help.AppChangelog; +help.getTermsOfService#37d78f83 lang_code:string = help.TermsOfService; channels.getDialogs#a9d3d249 offset:int limit:int = messages.Dialogs; channels.getImportantHistory#ddb929cb channel:InputChannel offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages; diff --git a/Telegram/SourceFiles/overviewwidget.cpp b/Telegram/SourceFiles/overviewwidget.cpp index e85bc2630..78c6af5eb 100644 --- a/Telegram/SourceFiles/overviewwidget.cpp +++ b/Telegram/SourceFiles/overviewwidget.cpp @@ -1878,7 +1878,7 @@ void OverviewInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { _menu->addAction(lang(lng_context_cancel_download), this, SLOT(cancelContextDownload()))->setEnabled(true); } else { if ((lnkVideo && !lnkVideo->video()->already(true).isEmpty()) || (lnkAudio && !lnkAudio->audio()->already(true).isEmpty()) || (lnkDocument && !lnkDocument->document()->already(true).isEmpty())) { - _menu->addAction(lang(cPlatform() == dbipMac ? lng_context_show_in_finder : lng_context_show_in_folder), this, SLOT(showContextInFolder()))->setEnabled(true); + _menu->addAction(lang((cPlatform() == dbipMac || cPlatform() == dbipMacOld) ? lng_context_show_in_finder : lng_context_show_in_folder), this, SLOT(showContextInFolder()))->setEnabled(true); } _menu->addAction(lang(lnkVideo ? lng_context_open_video : (lnkAudio ? lng_context_open_audio : lng_context_open_file)), this, SLOT(openContextFile()))->setEnabled(true); _menu->addAction(lang(lnkVideo ? lng_context_save_video : (lnkAudio ? lng_context_save_audio : lng_context_save_file)), this, SLOT(saveContextFile()))->setEnabled(true); diff --git a/Telegram/SourceFiles/passcodewidget.cpp b/Telegram/SourceFiles/passcodewidget.cpp index ff26cf5ed..5e97dc7a2 100644 --- a/Telegram/SourceFiles/passcodewidget.cpp +++ b/Telegram/SourceFiles/passcodewidget.cpp @@ -78,7 +78,6 @@ void PasscodeWidget::onSubmit() { } else { if (Local::readMap(_passcode.text().toUtf8()) != Local::ReadMapPassNeeded) { cSetPasscodeBadTries(0); - App::app()->checkMapVersion(); MTP::start(); if (MTP::authedId()) { @@ -86,6 +85,8 @@ void PasscodeWidget::onSubmit() { } else { App::wnd()->setupIntro(true); } + + App::app()->checkMapVersion(); } else { cSetPasscodeBadTries(cPasscodeBadTries() + 1); cSetPasscodeLastTry(getms(true)); diff --git a/Telegram/SourceFiles/playerwidget.cpp b/Telegram/SourceFiles/playerwidget.cpp index a4b269de4..5a76d3f51 100644 --- a/Telegram/SourceFiles/playerwidget.cpp +++ b/Telegram/SourceFiles/playerwidget.cpp @@ -323,7 +323,7 @@ void PlayerWidget::preloadNext() { } if (next) { if (HistoryDocument *document = static_cast(next->getMedia())) { - if (document->document()->already(true).isEmpty() && document->document()->data.isEmpty()) { + if (document->document()->location(true).isEmpty() && document->document()->data.isEmpty()) { if (!document->document()->loader) { DocumentOpenLink::doOpen(document->document()); document->document()->openOnSave = 0; diff --git a/Telegram/SourceFiles/pspecific_linux.cpp b/Telegram/SourceFiles/pspecific_linux.cpp index ac52c0084..67137e977 100644 --- a/Telegram/SourceFiles/pspecific_linux.cpp +++ b/Telegram/SourceFiles/pspecific_linux.cpp @@ -1167,7 +1167,7 @@ namespace { void psRegisterCustomScheme() { #ifndef TDESKTOP_DISABLE_REGISTER_CUSTOM_SCHEME QString home(_psHomeDir()); - if (home.isEmpty()) return; + if (home.isEmpty() || cBetaVersion()) return; // don't update desktop file for beta version DEBUG_LOG(("App Info: placing .desktop file")); if (QDir(home + qsl(".local/")).exists()) { diff --git a/Telegram/SourceFiles/pspecific_linux.h b/Telegram/SourceFiles/pspecific_linux.h index 35885c475..4aac22c21 100644 --- a/Telegram/SourceFiles/pspecific_linux.h +++ b/Telegram/SourceFiles/pspecific_linux.h @@ -175,5 +175,34 @@ void psUpdateOverlayed(QWidget *widget); inline QString psConvertFileUrl(const QString &url) { return url; } +inline QByteArray psDownloadPathBookmark(const QString &path) { + return QByteArray(); +} +inline QByteArray psPathBookmark(const QString &path) { + return QByteArray(); +} +inline void psDownloadPathEnableAccess() { +} + +class PsFileBookmark { +public: + PsFileBookmark(const QByteArray &bookmark) { + } + bool check() const { + return true; + } + bool enable() const { + return true; + } + void disable() const { + } + const QString &name(const QString &original) const { + return original; + } + QByteArray bookmark() const { + return QByteArray(); + } + +}; bool linuxMoveFile(const char *from, const char *to); diff --git a/Telegram/SourceFiles/pspecific_mac.cpp b/Telegram/SourceFiles/pspecific_mac.cpp index 0b0a12eb4..61cc6d1db 100644 --- a/Telegram/SourceFiles/pspecific_mac.cpp +++ b/Telegram/SourceFiles/pspecific_mac.cpp @@ -684,6 +684,18 @@ QString psConvertFileUrl(const QString &url) { return objc_convertFileUrl(url); } +void psDownloadPathEnableAccess() { + objc_downloadPathEnableAccess(cDownloadPathBookmark()); +} + +QByteArray psDownloadPathBookmark(const QString &path) { + return objc_downloadPathBookmark(path); +} + +QByteArray psPathBookmark(const QString &path) { + return objc_pathBookmark(path); +} + QString strNotificationAboutThemeChange() { const uint32 letters[] = { 0xE9005541, 0x5600DC70, 0x88001570, 0xF500D86C, 0x8100E165, 0xEE005949, 0x2900526E, 0xAE00FB74, 0x96000865, 0x7000CD72, 0x3B001566, 0x5F007361, 0xAE00B663, 0x74009A65, 0x29003054, 0xC6002668, 0x98003865, 0xFA00336D, 0xA3007A65, 0x93001443, 0xBB007868, 0xE100E561, 0x3500366E, 0xC0007A67, 0x200CA65, 0xBE00DF64, 0xE300BB4E, 0x2900D26F, 0xD500D374, 0xE900E269, 0x86008F66, 0xC4006669, 0x1C00A863, 0xE600A761, 0x8E00EE74, 0xB300B169, 0xCF00B36F, 0xE600D36E }; return strMakeFromLetters(letters, sizeof(letters) / sizeof(letters[0])); diff --git a/Telegram/SourceFiles/pspecific_mac.h b/Telegram/SourceFiles/pspecific_mac.h index 4ba32f458..1ac5a4294 100644 --- a/Telegram/SourceFiles/pspecific_mac.h +++ b/Telegram/SourceFiles/pspecific_mac.h @@ -198,6 +198,35 @@ void psNewVersion(); void psUpdateOverlayed(QWidget *widget); QString psConvertFileUrl(const QString &url); +void psDownloadPathEnableAccess(); +QByteArray psDownloadPathBookmark(const QString &path); +QByteArray psPathBookmark(const QString &path); + +class PsFileBookmark { +public: + PsFileBookmark(const QByteArray &bookmark) : _inner(bookmark) { + } + bool check() const { + return _inner.valid(); + } + bool enable() const { + return _inner.enable(); + } + void disable() const { + return _inner.disable(); + } + const QString &name(const QString &original) const { + return _inner.name(original); + } + QByteArray bookmark() const { + return _inner.bookmark(); + } + +private: + objc_FileBookmark _inner; + +}; + QString strNotificationAboutThemeChange(); QString strStyleOfInterface(); QString strNeedToReload(); diff --git a/Telegram/SourceFiles/pspecific_mac_p.h b/Telegram/SourceFiles/pspecific_mac_p.h index b5ade3c85..b55366c0a 100644 --- a/Telegram/SourceFiles/pspecific_mac_p.h +++ b/Telegram/SourceFiles/pspecific_mac_p.h @@ -82,3 +82,20 @@ QString objc_downloadPath(); QString objc_currentCountry(); QString objc_currentLang(); QString objc_convertFileUrl(const QString &url); +QByteArray objc_downloadPathBookmark(const QString &path); +QByteArray objc_pathBookmark(const QString &path); +void objc_downloadPathEnableAccess(const QByteArray &bookmark); + +class objc_FileBookmark { +public: + objc_FileBookmark(const QByteArray &bookmark); + bool valid() const; + bool enable() const; + void disable() const; + + const QString &name(const QString &original) const; + QByteArray bookmark() const; + + ~objc_FileBookmark(); + +}; diff --git a/Telegram/SourceFiles/pspecific_mac_p.mm b/Telegram/SourceFiles/pspecific_mac_p.mm index d02aede57..edcf51948 100644 --- a/Telegram/SourceFiles/pspecific_mac_p.mm +++ b/Telegram/SourceFiles/pspecific_mac_p.mm @@ -931,8 +931,16 @@ void objc_start() { name: NSWorkspaceDidWakeNotification object: NULL]; } +namespace { + NSURL *_downloadPathUrl = nil; +} + void objc_finish() { [_sharedDelegate release]; + if (_downloadPathUrl) { + [_downloadPathUrl stopAccessingSecurityScopedResource]; + _downloadPathUrl = nil; + } } void objc_registerCustomScheme() { @@ -1054,3 +1062,38 @@ QString objc_convertFileUrl(const QString &url) { return objcString(nsurl); } +QByteArray objc_downloadPathBookmark(const QString &path) { + return QByteArray(); +} + +QByteArray objc_pathBookmark(const QString &path) { + return QByteArray(); +} + +void objc_downloadPathEnableAccess(const QByteArray &bookmark) { +} + +objc_FileBookmark::objc_FileBookmark(const QByteArray &bookmark) { +} + +bool objc_FileBookmark::valid() const { + return true; +} + +bool objc_FileBookmark::enable() const { + return true; +} + +void objc_FileBookmark::disable() const { +} + +const QString &objc_FileBookmark::name(const QString &original) const { + return original; +} + +QByteArray objc_FileBookmark::bookmark() const { + return QByteArray(); +} + +objc_FileBookmark::~objc_FileBookmark() { +} diff --git a/Telegram/SourceFiles/pspecific_wnd.cpp b/Telegram/SourceFiles/pspecific_wnd.cpp index 77cff8cad..8bfef9751 100644 --- a/Telegram/SourceFiles/pspecific_wnd.cpp +++ b/Telegram/SourceFiles/pspecific_wnd.cpp @@ -72,7 +72,12 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #define WM_NCPOINTERUP 0x0243 #endif -const WCHAR AppUserModelId[] = L"Telegram.TelegramDesktop"; +const WCHAR AppUserModelIdRelease[] = L"Telegram.TelegramDesktop"; +const WCHAR AppUserModelIdBeta[] = L"Telegram.TelegramDesktop.Beta"; + +const WCHAR *AppUserModelId() { + return cBetaVersion() ? AppUserModelIdBeta : AppUserModelIdRelease; +} static const PROPERTYKEY pkey_AppUserModel_ID = { { 0x9F4C2855, 0x9F79, 0x4B39, { 0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3 } }, 5 }; static const PROPERTYKEY pkey_AppUserModel_StartPinOption = { { 0x9F4C2855, 0x9F79, 0x4B39, { 0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3 } }, 12 }; @@ -2301,7 +2306,7 @@ void _manageAppLnk(bool create, bool silent, int path_csidl, const wchar_t *args hr = shellLink.As(&propertyStore); if (SUCCEEDED(hr)) { PROPVARIANT appIdPropVar; - hr = InitPropVariantFromString(AppUserModelId, &appIdPropVar); + hr = InitPropVariantFromString(AppUserModelId(), &appIdPropVar); if (SUCCEEDED(hr)) { hr = propertyStore->SetValue(pkey_AppUserModel_ID, appIdPropVar); PropVariantClear(&appIdPropVar); @@ -2390,11 +2395,19 @@ HANDLE _generateDumpFileAtPath(const WCHAR *path) { GetLocalTime(&stLocalTime); - wsprintf(szFileName, L"%s%s-%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp", - szPath, szExeName, AppVersionStr, - stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, - stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond, - GetCurrentProcessId(), GetCurrentThreadId()); + if (cBetaVersion()) { + wsprintf(szFileName, L"%s%s-%ld-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp", + szPath, szExeName, cBetaVersion(), + stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, + stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond, + GetCurrentProcessId(), GetCurrentThreadId()); + } else { + wsprintf(szFileName, L"%s%s-%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp", + szPath, szExeName, AppVersionStr, + stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, + stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond, + GetCurrentProcessId(), GetCurrentThreadId()); + } return CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0); } @@ -2913,7 +2926,7 @@ void CheckPinnedAppUserModelId() { WCHAR already[MAX_PATH]; hr = propVariantToString(appIdPropVar, already, MAX_PATH); if (SUCCEEDED(hr)) { - if (std::wstring(AppUserModelId) == already) { + if (std::wstring(AppUserModelId()) == already) { LOG(("Already!")); PropVariantClear(&appIdPropVar); return; @@ -2925,7 +2938,7 @@ void CheckPinnedAppUserModelId() { } PropVariantClear(&appIdPropVar); - hr = InitPropVariantFromString(AppUserModelId, &appIdPropVar); + hr = InitPropVariantFromString(AppUserModelId(), &appIdPropVar); if (!SUCCEEDED(hr)) return; hr = propertyStore->SetValue(pkey_AppUserModel_ID, appIdPropVar); @@ -3020,7 +3033,7 @@ bool ValidateAppUserModelIdShortcutAt(const QString &path) { WCHAR already[MAX_PATH]; hr = propVariantToString(appIdPropVar, already, MAX_PATH); if (SUCCEEDED(hr)) { - if (std::wstring(AppUserModelId) == already) { + if (std::wstring(AppUserModelId()) == already) { PropVariantClear(&appIdPropVar); return true; } @@ -3031,7 +3044,7 @@ bool ValidateAppUserModelIdShortcutAt(const QString &path) { } PropVariantClear(&appIdPropVar); - hr = InitPropVariantFromString(AppUserModelId, &appIdPropVar); + hr = InitPropVariantFromString(AppUserModelId(), &appIdPropVar); if (!SUCCEEDED(hr)) return false; hr = propertyStore->SetValue(pkey_AppUserModel_ID, appIdPropVar); @@ -3054,11 +3067,16 @@ bool ValidateAppUserModelIdShortcut() { QString path = systemShortcutPath(); if (path.isEmpty()) return false; - if (ValidateAppUserModelIdShortcutAt(path + qsl("Telegram Desktop/Telegram.lnk"))) return true; - if (ValidateAppUserModelIdShortcutAt(path + qsl("Telegram Win (Unofficial)/Telegram.lnk"))) return true; - - path += qsl("Telegram.lnk"); - if (ValidateAppUserModelIdShortcutAt(path)) return true; + if (cBetaVersion()) { + path += qsl("TelegramBeta.lnk"); + if (ValidateAppUserModelIdShortcutAt(path)) return true; + } else { + if (ValidateAppUserModelIdShortcutAt(path + qsl("Telegram Desktop/Telegram.lnk"))) return true; + if (ValidateAppUserModelIdShortcutAt(path + qsl("Telegram Win (Unofficial)/Telegram.lnk"))) return true; + + path += qsl("Telegram.lnk"); + if (ValidateAppUserModelIdShortcutAt(path)) return true; + } ComPtr shellLink; HRESULT hr = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shellLink)); @@ -3078,7 +3096,7 @@ bool ValidateAppUserModelIdShortcut() { if (!SUCCEEDED(hr)) return false; PROPVARIANT appIdPropVar; - hr = InitPropVariantFromString(AppUserModelId, &appIdPropVar); + hr = InitPropVariantFromString(AppUserModelId(), &appIdPropVar); if (!SUCCEEDED(hr)) return false; hr = propertyStore->SetValue(pkey_AppUserModel_ID, appIdPropVar); @@ -3108,13 +3126,13 @@ bool ValidateAppUserModelIdShortcut() { bool InitToastManager() { if (!useToast || !ValidateAppUserModelIdShortcut()) return false; - if (!SUCCEEDED(setCurrentProcessExplicitAppUserModelID(AppUserModelId))) { + if (!SUCCEEDED(setCurrentProcessExplicitAppUserModelID(AppUserModelId()))) { return false; } if (!SUCCEEDED(wrap_GetActivationFactory(StringReferenceWrapper(RuntimeClass_Windows_UI_Notifications_ToastNotificationManager).Get(), &toastNotificationManager))) { return false; } - if (!SUCCEEDED(toastNotificationManager->CreateToastNotifierWithId(StringReferenceWrapper(AppUserModelId).Get(), &toastNotifier))) { + if (!SUCCEEDED(toastNotificationManager->CreateToastNotifierWithId(StringReferenceWrapper(AppUserModelId(), wcslen(AppUserModelId())).Get(), &toastNotifier))) { return false; } if (!SUCCEEDED(wrap_GetActivationFactory(StringReferenceWrapper(RuntimeClass_Windows_UI_Notifications_ToastNotification).Get(), &toastNotificationFactory))) { diff --git a/Telegram/SourceFiles/pspecific_wnd.h b/Telegram/SourceFiles/pspecific_wnd.h index be9bb8b6f..279de4c60 100644 --- a/Telegram/SourceFiles/pspecific_wnd.h +++ b/Telegram/SourceFiles/pspecific_wnd.h @@ -177,3 +177,32 @@ void psUpdateOverlayed(TWidget *widget); inline QString psConvertFileUrl(const QString &url) { return url; } +inline QByteArray psDownloadPathBookmark(const QString &path) { + return QByteArray(); +} +inline QByteArray psPathBookmark(const QString &path) { + return QByteArray(); +} +inline void psDownloadPathEnableAccess() { +} + +class PsFileBookmark { +public: + PsFileBookmark(const QByteArray &bookmark) { + } + bool check() const { + return true; + } + bool enable() const { + return true; + } + void disable() const { + } + const QString &name(const QString &original) const { + return original; + } + QByteArray bookmark() const { + return QByteArray(); + } + +}; diff --git a/Telegram/SourceFiles/settings.cpp b/Telegram/SourceFiles/settings.cpp index 99e07e946..65387d7df 100644 --- a/Telegram/SourceFiles/settings.cpp +++ b/Telegram/SourceFiles/settings.cpp @@ -29,6 +29,10 @@ Qt::LayoutDirection gLangDir = gRtl ? Qt::RightToLeft : Qt::LeftToRight; mtpDcOptions gDcOptions; bool gDevVersion = DevVersion; +uint64 gBetaVersion = BETA_VERSION; +uint64 gRealBetaVersion = BETA_VERSION; +QByteArray gBetaPrivateKey; + bool gTestMode = false; bool gDebug = false; bool gManyInstance = false; @@ -74,6 +78,7 @@ DBIDefaultAttach gDefaultAttach = dbidaDocument; bool gReplaceEmojis = true; bool gAskDownloadPath = false; QString gDownloadPath; +QByteArray gDownloadPathBookmark; bool gNeedConfigResave = false; @@ -99,12 +104,11 @@ bool gHasPasscode = false; bool gHasAudioPlayer = true; bool gHasAudioCapture = true; -DBIEmojiTab gEmojiTab = dbietRecent; RecentEmojiPack gRecentEmojis; RecentEmojisPreload gRecentEmojisPreload; EmojiColorVariants gEmojiVariants; -QByteArray gStickersHash; +int32 gStickersHash = 0; RecentStickerPreload gRecentStickersPreload; RecentStickerPack gRecentStickers; @@ -143,6 +147,7 @@ QUrl gUpdateURL = QUrl(qsl("http://tdesktop.com/linux/tupdates/current")); #else #error Unknown platform #endif +bool gIsElCapitan = false; bool gContactsReceived = false; bool gDialogsReceived = false; @@ -168,8 +173,10 @@ ReportSpamStatuses gReportSpamStatuses; void settingsParseArgs(int argc, char *argv[]) { #ifdef Q_OS_MAC + gIsElCapitan = (QSysInfo::macVersion() >= QSysInfo::MV_10_11); if (QSysInfo::macVersion() < QSysInfo::MV_10_8) { gUpdateURL = QUrl(qsl("http://tdesktop.com/mac32/tupdates/current")); + gPlatform = dbipMacOld; } else { gCustomNotifies = false; } diff --git a/Telegram/SourceFiles/settings.h b/Telegram/SourceFiles/settings.h index 5e9145025..18ee47753 100644 --- a/Telegram/SourceFiles/settings.h +++ b/Telegram/SourceFiles/settings.h @@ -68,6 +68,9 @@ typedef QMap mtpDcOptions; DeclareSetting(mtpDcOptions, DcOptions); DeclareSetting(bool, DevVersion); +DeclareSetting(uint64, BetaVersion); +DeclareSetting(uint64, RealBetaVersion); +DeclareSetting(QByteArray, BetaPrivateKey); DeclareSetting(bool, TestMode); DeclareSetting(QString, LoggedPhoneNumber); @@ -80,8 +83,7 @@ DeclareReadSetting(bool, FromAutoStart); DeclareSetting(QString, WorkingDir); inline void cForceWorkingDir(const QString &newDir) { cSetWorkingDir(newDir); - QDir dir; - if (!gWorkingDir.isEmpty()) dir.mkpath(gWorkingDir); + if (!gWorkingDir.isEmpty()) QDir().mkpath(gWorkingDir); } DeclareReadSetting(QString, ExeName); DeclareReadSetting(QString, ExeDir); @@ -134,6 +136,7 @@ DeclareSetting(bool, ReplaceEmojis); DeclareReadSetting(bool, ManyInstance); DeclareSetting(bool, AskDownloadPath); DeclareSetting(QString, DownloadPath); +DeclareSetting(QByteArray, DownloadPathBookmark); DeclareSetting(QByteArray, LocalSalt); DeclareSetting(DBIScale, RealScale); DeclareSetting(DBIScale, ScreenScale); @@ -168,8 +171,6 @@ T convertScale(T v) { return v; } -DeclareSetting(DBIEmojiTab, EmojiTab); - struct EmojiData { EmojiData(uint16 x, uint16 y, uint32 code, uint32 code2, uint16 len, uint16 postfix, uint32 color) : x(x), y(y), code(code), code2(code2), len(len), postfix(postfix), color(color) { } @@ -196,7 +197,7 @@ RecentEmojiPack &cGetRecentEmojis(); struct DocumentData; typedef QVector StickerPack; -DeclareSetting(QByteArray, StickersHash); +DeclareSetting(int32, StickersHash); typedef QList > RecentStickerPackOld; typedef QVector > RecentStickerPreload; @@ -297,6 +298,7 @@ DeclareSetting(bool, CustomNotifies); DeclareReadSetting(uint64, Instance); DeclareReadSetting(DBIPlatform, Platform); +DeclareReadSetting(bool, IsElCapitan); DeclareReadSetting(QUrl, UpdateURL); DeclareSetting(bool, ContactsReceived); diff --git a/Telegram/SourceFiles/settingswidget.cpp b/Telegram/SourceFiles/settingswidget.cpp index 4b3b8264a..3cd1c4945 100644 --- a/Telegram/SourceFiles/settingswidget.cpp +++ b/Telegram/SourceFiles/settingswidget.cpp @@ -38,6 +38,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "boxes/passcodebox.h" #include "boxes/autolockbox.h" #include "boxes/sessionsbox.h" +#include "boxes/stickersetbox.h" #include "langloaderplain.h" #include "gui/filedialog.h" @@ -156,9 +157,10 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : QWidget(parent), // chat options _replaceEmojis(this, lang(lng_settings_replace_emojis), cReplaceEmojis()), _viewEmojis(this, lang(lng_settings_view_emojis)), + _stickers(this, lang(lng_stickers_you_have)), _enterSend(this, qsl("send_key"), 0, lang(lng_settings_send_enter), !cCtrlEnter()), - _ctrlEnterSend(this, qsl("send_key"), 1, lang((cPlatform() == dbipMac) ? lng_settings_send_cmdenter : lng_settings_send_ctrlenter), cCtrlEnter()), + _ctrlEnterSend(this, qsl("send_key"), 1, lang((cPlatform() == dbipMac || cPlatform() == dbipMacOld) ? lng_settings_send_cmdenter : lng_settings_send_ctrlenter), cCtrlEnter()), _dontAskDownloadPath(this, lang(lng_download_path_dont_ask), !cAskDownloadPath()), _downloadPathWidth(st::linkFont->width(lang(lng_download_path_label)) + st::linkFont->spacew), @@ -201,11 +203,12 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : QWidget(parent), { if (self()) { connect(App::wnd(), SIGNAL(imageLoaded()), this, SLOT(update())); + connect(App::api(), SIGNAL(fullPeerUpdated(PeerData*)), this, SLOT(onFullPeerUpdated(PeerData*))); _nameText.setText(st::setNameFont, _nameCache, _textNameOptions); PhotoData *selfPhoto = (self()->photoId && self()->photoId != UnknownPeerPhotoId) ? App::photo(self()->photoId) : 0; if (selfPhoto && selfPhoto->date) _photoLink = TextLinkPtr(new PhotoLink(selfPhoto, self())); - MTP::send(MTPusers_GetFullUser(self()->inputUser), rpcDone(&SettingsInner::gotFullSelf), RPCFailHandlerPtr(), 0, 10); + App::api()->requestFullPeer(self()); onReloadPassword(); connect(App::main(), SIGNAL(peerPhotoChanged(PeerData *)), this, SLOT(peerUpdated(PeerData *))); @@ -253,7 +256,7 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : QWidget(parent), connect(&_dpiAutoScale, SIGNAL(changed()), this, SLOT(onScaleAuto())); connect(&_dpiSlider, SIGNAL(changed(int32)), this, SLOT(onScaleChange())); - _curVersionText = lng_settings_current_version(lt_version, QString::fromWCharArray(AppVersionStr) + (cDevVersion() ? " dev" : "")) + ' '; + _curVersionText = lng_settings_current_version(lt_version, QString::fromWCharArray(AppVersionStr) + (cDevVersion() ? " dev" : "") + (cBetaVersion() ? qsl(" beta %1").arg(cBetaVersion()) : QString())) + ' '; _curVersionWidth = st::linkFont->width(_curVersionText); _newVersionText = lang(lng_settings_update_ready) + ' '; _newVersionWidth = st::linkFont->width(_newVersionText); @@ -269,6 +272,7 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : QWidget(parent), // chat options connect(&_replaceEmojis, SIGNAL(changed()), this, SLOT(onReplaceEmojis())); connect(&_viewEmojis, SIGNAL(clicked()), this, SLOT(onViewEmojis())); + connect(&_stickers, SIGNAL(clicked()), this, SLOT(onStickers())); connect(&_enterSend, SIGNAL(changed()), this, SLOT(onEnterSend())); connect(&_ctrlEnterSend, SIGNAL(changed()), this, SLOT(onCtrlEnterSend())); @@ -343,7 +347,7 @@ void SettingsInner::peerUpdated(PeerData *data) { _photoLink = TextLinkPtr(new PhotoLink(selfPhoto, self())); } else { _photoLink = TextLinkPtr(); - MTP::send(MTPusers_GetFullUser(self()->inputUser), rpcDone(&SettingsInner::gotFullSelf)); + App::api()->requestFullPeer(self()); } } else { _photoLink = TextLinkPtr(); @@ -515,7 +519,8 @@ void SettingsInner::paintEvent(QPaintEvent *e) { p.drawText(_left + st::setHeaderLeft, top + st::setHeaderTop + st::setHeaderFont->ascent, lang(lng_settings_section_chat)); top += st::setHeaderSkip; - top += _replaceEmojis.height() + st::setSectionSkip; + top += _replaceEmojis.height() + st::setLittleSkip; + top += _stickers.height() + st::setSectionSkip; top += _enterSend.height() + st::setLittleSkip; top += _ctrlEnterSend.height() + st::setSectionSkip; @@ -706,7 +711,8 @@ void SettingsInner::resizeEvent(QResizeEvent *e) { if (self()) { top += st::setHeaderSkip; _viewEmojis.move(_left + st::setWidth - _viewEmojis.width(), top + st::cbDefFlat.textTop); - _replaceEmojis.move(_left, top); top += _replaceEmojis.height() + st::setSectionSkip; + _replaceEmojis.move(_left, top); top += _replaceEmojis.height() + st::setLittleSkip; + _stickers.move(_left + st::cbDefFlat.textLeft, top); top += _stickers.height() + st::setSectionSkip; _enterSend.move(_left, top); top += _enterSend.height() + st::setLittleSkip; _ctrlEnterSend.move(_left, top); top += _ctrlEnterSend.height() + st::setSectionSkip; _dontAskDownloadPath.move(_left, top); top += _dontAskDownloadPath.height(); @@ -892,10 +898,9 @@ void SettingsInner::updateBackgroundRect() { update(_left, _tileBackground.y() - st::setLittleSkip - st::setBackgroundSize, st::setBackgroundSize, st::setBackgroundSize); } -void SettingsInner::gotFullSelf(const MTPUserFull &selfFull) { - if (!self()) return; - App::feedPhoto(selfFull.c_userFull().vprofile_photo); - App::feedUsers(MTP_vector(1, selfFull.c_userFull().vuser)); +void SettingsInner::onFullPeerUpdated(PeerData *peer) { + if (!self() || self() != peer) return; + PhotoData *selfPhoto = (self()->photoId && self()->photoId != UnknownPeerPhotoId) ? App::photo(self()->photoId) : 0; if (selfPhoto && selfPhoto->date) { _photoLink = TextLinkPtr(new PhotoLink(selfPhoto, self())); @@ -1040,6 +1045,7 @@ void SettingsInner::showAll() { } else { _viewEmojis.hide(); } + _stickers.show(); _enterSend.show(); _ctrlEnterSend.show(); _dontAskDownloadPath.show(); @@ -1058,6 +1064,7 @@ void SettingsInner::showAll() { } else { _replaceEmojis.hide(); _viewEmojis.hide(); + _stickers.hide(); _enterSend.hide(); _ctrlEnterSend.hide(); _dontAskDownloadPath.hide(); @@ -1521,7 +1528,11 @@ void SettingsInner::onReplaceEmojis() { } void SettingsInner::onViewEmojis() { - App::wnd()->showLayer(new EmojiBox()); + App::showLayer(new EmojiBox()); +} + +void SettingsInner::onStickers() { + App::showLayer(new StickersBox()); } void SettingsInner::onEnterSend() { diff --git a/Telegram/SourceFiles/settingswidget.h b/Telegram/SourceFiles/settingswidget.h index 234d1563d..1a8dcdfac 100644 --- a/Telegram/SourceFiles/settingswidget.h +++ b/Telegram/SourceFiles/settingswidget.h @@ -77,8 +77,6 @@ public: void updateOnlineDisplay(); - void gotFullSelf(const MTPUserFull &self); - void showAll(); void chooseCustomLang(); @@ -107,6 +105,8 @@ public slots: #endif void onRestartNow(); + void onFullPeerUpdated(PeerData *peer); + void onPasscode(); void onPasscodeOff(); void onAutoLock(); @@ -138,6 +138,7 @@ public slots: void onReplaceEmojis(); void onViewEmojis(); + void onStickers(); void onEnterSend(); void onCtrlEnterSend(); @@ -242,7 +243,7 @@ private: // chat options FlatCheckbox _replaceEmojis; - LinkButton _viewEmojis; + LinkButton _viewEmojis, _stickers; FlatRadiobutton _enterSend, _ctrlEnterSend; FlatCheckbox _dontAskDownloadPath; int32 _downloadPathWidth; diff --git a/Telegram/SourceFiles/structs.cpp b/Telegram/SourceFiles/structs.cpp index 8934fa08c..b7c3bfed0 100644 --- a/Telegram/SourceFiles/structs.cpp +++ b/Telegram/SourceFiles/structs.cpp @@ -710,7 +710,7 @@ void VideoCancelLink::onClick(Qt::MouseButton button) const { VideoData::VideoData(const VideoId &id, const uint64 &access, int32 date, int32 duration, int32 w, int32 h, const ImagePtr &thumb, int32 dc, int32 size) : id(id), access(access), date(date), duration(duration), w(w), h(h), thumb(thumb), dc(dc), size(size), status(FileReady), uploadOffset(0), fileType(0), openOnSave(0), loader(0) { - location = Local::readFileLocation(mediaKey(VideoFileLocation, dc, id)); + _location = Local::readFileLocation(mediaKey(VideoFileLocation, dc, id)); } void VideoData::save(const QString &toFile) { @@ -722,9 +722,12 @@ void VideoData::save(const QString &toFile) { } QString VideoData::already(bool check) { - if (!check) return location.name; - if (!location.check()) location = Local::readFileLocation(mediaKey(VideoFileLocation, dc, id)); - return location.name; + return location(check).name(); +} + +const FileLocation &VideoData::location(bool check) { + if (check && !_location.check()) _location = Local::readFileLocation(mediaKey(VideoFileLocation, dc, id)); + return _location; } void AudioOpenLink::onClick(Qt::MouseButton button) const { @@ -804,12 +807,15 @@ void AudioCancelLink::onClick(Qt::MouseButton button) const { bool StickerData::setInstalled() const { switch (set.type()) { case mtpc_inputStickerSetID: { - return (cStickerSets().constFind(set.c_inputStickerSetID().vid.v) != cStickerSets().cend()); + StickerSets::const_iterator it = cStickerSets().constFind(set.c_inputStickerSetID().vid.v); + return (it != cStickerSets().cend()) && !(it->flags & MTPDstickerSet::flag_disabled); } break; case mtpc_inputStickerSetShortName: { QString name = qs(set.c_inputStickerSetShortName().vshort_name).toLower(); - for (StickerSets::const_iterator i = cStickerSets().cbegin(), e = cStickerSets().cend(); i != e; ++i) { - if (i->shortName.toLower() == name) return true; + for (StickerSets::const_iterator it = cStickerSets().cbegin(), e = cStickerSets().cend(); it != e; ++it) { + if (it->shortName.toLower() == name) { + return !(it->flags & MTPDstickerSet::flag_disabled); + } } } break; } @@ -818,7 +824,7 @@ bool StickerData::setInstalled() const { AudioData::AudioData(const AudioId &id, const uint64 &access, int32 date, const QString &mime, int32 duration, int32 dc, int32 size) : id(id), access(access), date(date), mime(mime), duration(duration), dc(dc), size(size), status(FileReady), uploadOffset(0), openOnSave(0), loader(0) { - location = Local::readFileLocation(mediaKey(AudioFileLocation, dc, id)); + _location = Local::readFileLocation(mediaKey(AudioFileLocation, dc, id)); } void AudioData::save(const QString &toFile) { @@ -830,17 +836,20 @@ void AudioData::save(const QString &toFile) { } QString AudioData::already(bool check) { - if (!check) return location.name; - if (!location.check()) location = Local::readFileLocation(mediaKey(AudioFileLocation, dc, id)); - return location.name; + return location(check).name(); +} + +const FileLocation &AudioData::location(bool check) { + if (check && !_location.check()) _location = Local::readFileLocation(mediaKey(AudioFileLocation, dc, id)); + return _location; } void DocumentOpenLink::doOpen(DocumentData *data) { if (!data->date) return; bool play = data->song() && App::hoveredLinkItem() && audioPlayer(); - QString already = data->already(true); - if (!already.isEmpty() || (!data->data.isEmpty() && play)) { + const FileLocation &location(data->location(true)); + if (!location.isEmpty() || (!data->data.isEmpty() && play)) { if (play) { SongMsgId playing; AudioPlayerState playingState = AudioPlayerStopped; @@ -852,21 +861,22 @@ void DocumentOpenLink::doOpen(DocumentData *data) { audioPlayer()->play(song); if (App::main()) App::main()->documentPlayProgress(song); } - } else if (data->size < MediaViewImageSizeLimit) { - QImageReader reader(already); + } else if (data->size < MediaViewImageSizeLimit && location.accessEnable()) { + QImageReader reader(location.name()); if (reader.canRead()) { if (reader.supportsAnimation() && reader.imageCount() > 1 && App::hoveredLinkItem()) { - startGif(App::hoveredLinkItem(), already); + startGif(App::hoveredLinkItem(), location); } else if (App::hoveredLinkItem() || App::contextItem()) { App::wnd()->showDocument(data, App::hoveredLinkItem() ? App::hoveredLinkItem() : App::contextItem()); } else { - psOpenFile(already); + psOpenFile(location.name()); } } else { - psOpenFile(already); + psOpenFile(location.name()); } + location.accessDisable(); } else { - psOpenFile(already); + psOpenFile(location.name()); } return; } @@ -954,7 +964,7 @@ void DocumentCancelLink::onClick(Qt::MouseButton button) const { DocumentData::DocumentData(const DocumentId &id, const uint64 &access, int32 date, const QVector &attributes, const QString &mime, const ImagePtr &thumb, int32 dc, int32 size) : id(id), type(FileDocument), access(access), date(date), mime(mime), thumb(thumb), dc(dc), size(size), status(FileReady), uploadOffset(0), openOnSave(0), loader(0), _additional(0) { setattributes(attributes); - location = Local::readFileLocation(mediaKey(DocumentFileLocation, dc, id)); + _location = Local::readFileLocation(mediaKey(DocumentFileLocation, dc, id)); } void DocumentData::setattributes(const QVector &attributes) { @@ -1016,9 +1026,12 @@ void DocumentData::save(const QString &toFile) { } QString DocumentData::already(bool check) { - if (!check) return location.name; - if (!location.check()) location = Local::readFileLocation(mediaKey(DocumentFileLocation, dc, id)); - return location.name; + return location(check).name(); +} + +const FileLocation &DocumentData::location(bool check) { + if (check && !_location.check()) _location = Local::readFileLocation(mediaKey(DocumentFileLocation, dc, id)); + return _location; } WebPageData::WebPageData(const WebPageId &id, WebPageType type, const QString &url, const QString &displayUrl, const QString &siteName, const QString &title, const QString &description, PhotoData *photo, DocumentData *doc, int32 duration, const QString &author, int32 pendingTill) : diff --git a/Telegram/SourceFiles/structs.h b/Telegram/SourceFiles/structs.h index c29b5fd85..1bc85bf05 100644 --- a/Telegram/SourceFiles/structs.h +++ b/Telegram/SourceFiles/structs.h @@ -807,7 +807,7 @@ struct VideoData { l->deleteLater(); l->rpcInvalidate(); } - location = FileLocation(); + _location = FileLocation(); if (!beforeDownload) { openOnSave = 0; openOnSaveMsgId = FullMsgId(); @@ -816,7 +816,7 @@ struct VideoData { void finish() { if (loader->done()) { - location = FileLocation(mtpToStorageType(loader->fileType()), loader->fileName()); + _location = FileLocation(mtpToStorageType(loader->fileType()), loader->fileName()); } loader->deleteLater(); loader->rpcInvalidate(); @@ -824,6 +824,7 @@ struct VideoData { } QString already(bool check = false); + const FileLocation &location(bool check = false); VideoId id; uint64 access; @@ -841,7 +842,10 @@ struct VideoData { int32 openOnSave; FullMsgId openOnSaveMsgId; mtpFileLoader *loader; - FileLocation location; + +private: + FileLocation _location; + }; class VideoLink : public ITextLink { @@ -902,7 +906,7 @@ struct AudioData { l->deleteLater(); l->rpcInvalidate(); } - location = FileLocation(); + _location = FileLocation(); if (!beforeDownload) { openOnSave = 0; openOnSaveMsgId = FullMsgId(); @@ -911,7 +915,7 @@ struct AudioData { void finish() { if (loader->done()) { - location = FileLocation(mtpToStorageType(loader->fileType()), loader->fileName()); + _location = FileLocation(mtpToStorageType(loader->fileType()), loader->fileName()); data = loader->bytes(); } loader->deleteLater(); @@ -920,6 +924,12 @@ struct AudioData { } QString already(bool check = false); + const FileLocation &location(bool check = false); + void setLocation(const FileLocation &loc) { + if (loc.check()) { + _location = loc; + } + } AudioId id; uint64 access; @@ -935,9 +945,12 @@ struct AudioData { int32 openOnSave; FullMsgId openOnSaveMsgId; mtpFileLoader *loader; - FileLocation location; QByteArray data; int32 md5[8]; + +private: + FileLocation _location; + }; struct AudioMsgId { @@ -1068,7 +1081,7 @@ struct DocumentData { l->deleteLater(); l->rpcInvalidate(); } - location = FileLocation(); + _location = FileLocation(); if (!beforeDownload) { openOnSave = 0; openOnSaveMsgId = FullMsgId(); @@ -1077,7 +1090,7 @@ struct DocumentData { void finish() { if (loader->done()) { - location = FileLocation(mtpToStorageType(loader->fileType()), loader->fileName()); + _location = FileLocation(mtpToStorageType(loader->fileType()), loader->fileName()); data = loader->bytes(); if (sticker() && !loader->imagePixmap().isNull()) { sticker()->img = ImagePtr(data, loader->imageFormat(), loader->imagePixmap()); @@ -1092,6 +1105,12 @@ struct DocumentData { } QString already(bool check = false); + const FileLocation &location(bool check = false); + void setLocation(const FileLocation &loc) { + if (loc.check()) { + _location = loc; + } + } StickerData *sticker() { return (type == StickerDocument) ? static_cast(_additional) : 0; } @@ -1115,12 +1134,15 @@ struct DocumentData { int32 openOnSave; FullMsgId openOnSaveMsgId; mtpFileLoader *loader; - FileLocation location; QByteArray data; DocumentAdditionalData *_additional; int32 md5[8]; + +private: + + FileLocation _location; }; struct SongMsgId { diff --git a/Telegram/SourceFiles/types.h b/Telegram/SourceFiles/types.h index c93a6746e..dae1346f9 100644 --- a/Telegram/SourceFiles/types.h +++ b/Telegram/SourceFiles/types.h @@ -258,9 +258,9 @@ enum DataBlockId { dbiCatsAndDogs = 0x12, dbiReplaceEmojis = 0x13, dbiAskDownloadPath = 0x14, - dbiDownloadPath = 0x15, + dbiDownloadPathOld = 0x15, dbiScale = 0x16, - dbiEmojiTab = 0x17, + dbiEmojiTabOld = 0x17, dbiRecentEmojisOld = 0x18, dbiLoggedPhoneNumber = 0x19, dbiMutedPeers = 0x1a, @@ -282,6 +282,7 @@ enum DataBlockId { dbiWindowsNotifications = 0x30, dbiIncludeMuted = 0x31, dbiMaxMegaGroupCount = 0x32, + dbiDownloadPath = 0x33, dbiEncryptedWithSalt = 333, dbiEncrypted = 444, @@ -341,15 +342,15 @@ enum DBIScale { static const int MatrixRowShift = 40000; enum DBIEmojiTab { - dbietRecent = -1, - dbietPeople = 0, - dbietNature = 1, - dbietFood = 2, - dbietCelebration = 3, - dbietActivity = 4, - dbietTravel = 5, - dbietObjects = 6, - dbietStickers = 666, + dbietRecent = -1, + dbietPeople = 0, + dbietNature = 1, + dbietFood = 2, + dbietActivity = 3, + dbietTravel = 4, + dbietObjects = 5, + dbietSymbols = 6, + dbietStickers = 666, }; static const int emojiTabCount = 8; inline DBIEmojiTab emojiTabAtIndex(int index) { @@ -361,6 +362,7 @@ enum DBIPlatform { dbipMac = 1, dbipLinux64 = 2, dbipLinux32 = 3, + dbipMacOld = 4, }; enum DBIPeerReportSpamStatus { @@ -434,3 +436,10 @@ inline int32 ceilclamp(int32 value, int32 step, int32 lowest, int32 highest) { inline int32 ceilclamp(float64 value, int32 step, int32 lowest, int32 highest) { return qMax(qMin(qCeil(value / step), highest), lowest); } + +enum ForwardWhatMessages { + ForwardSelectedMessages, + ForwardContextMessage, + ForwardPressedMessage, + ForwardPressedLinkMessage +}; diff --git a/Telegram/SourceFiles/window.cpp b/Telegram/SourceFiles/window.cpp index 6313101e8..ada34c9e4 100644 --- a/Telegram/SourceFiles/window.cpp +++ b/Telegram/SourceFiles/window.cpp @@ -453,7 +453,7 @@ void Window::firstShow() { QString notificationItem = lang(cDesktopNotify() ? lng_disable_notifications_from_tray : lng_enable_notifications_from_tray); - if (cPlatform() == dbipWindows || cPlatform() == dbipMac) { + if (cPlatform() == dbipWindows || cPlatform() == dbipMac || cPlatform() == dbipMacOld) { trayIconMenu->addAction(lang(lng_minimize_to_tray), this, SLOT(minimizeToTray()))->setEnabled(true); trayIconMenu->addAction(notificationItem, this, SLOT(toggleDisplayNotifyFromTray()))->setEnabled(true); trayIconMenu->addAction(lang(lng_quit_from_tray), this, SLOT(quitFromTray()))->setEnabled(true); @@ -987,6 +987,8 @@ bool Window::eventFilter(QObject *obj, QEvent *evt) { psUserActionDone(); main->checkIdleFinish(); } + } else if (t == QEvent::MouseButtonRelease) { + Ui::hideStickerPreview(); } if (obj == App::app()) { if (t == QEvent::ApplicationActivate) { @@ -1056,7 +1058,7 @@ void Window::updateTrayMenu(bool force) { QString notificationItem = lang(cDesktopNotify() ? lng_disable_notifications_from_tray : lng_enable_notifications_from_tray); - if (cPlatform() == dbipWindows || cPlatform() == dbipMac) { + if (cPlatform() == dbipWindows || cPlatform() == dbipMac || cPlatform() == dbipMacOld) { QAction *toggle = trayIconMenu->actions().at(0); disconnect(toggle, SIGNAL(triggered(bool)), this, SLOT(minimizeToTray())); disconnect(toggle, SIGNAL(triggered(bool)), this, SLOT(showFromTray())); @@ -1072,7 +1074,7 @@ void Window::updateTrayMenu(bool force) { } #ifndef Q_OS_WIN if (trayIcon) { - trayIcon->setContextMenu((active || cPlatform() != dbipMac) ? trayIconMenu : 0); + trayIcon->setContextMenu((active || cPlatform() == dbipLinux32 || cPlatform() == dbipLinux64) ? trayIconMenu : 0); } #endif @@ -1180,7 +1182,7 @@ void Window::showFromTray(QSystemTrayIcon::ActivationReason reason) { } void Window::toggleTray(QSystemTrayIcon::ActivationReason reason) { - if (cPlatform() == dbipMac && isActive(false)) return; + if ((cPlatform() == dbipMac || cPlatform() == dbipMacOld) && isActive(false)) return; if (reason == QSystemTrayIcon::Context) { updateTrayMenu(true); QTimer::singleShot(1, this, SLOT(psShowTrayMenu())); diff --git a/Telegram/Telegram.plist b/Telegram/Telegram.plist index 7d8c245ae..5da30bd6d 100644 --- a/Telegram/Telegram.plist +++ b/Telegram/Telegram.plist @@ -11,7 +11,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.9.13 + 0.9.15 CFBundleSignature ???? CFBundleURLTypes diff --git a/Telegram/Telegram.pro b/Telegram/Telegram.pro index 8c851b7b2..48077b5c4 100644 --- a/Telegram/Telegram.pro +++ b/Telegram/Telegram.pro @@ -89,6 +89,7 @@ SOURCES += \ ./SourceFiles/autoupdater.cpp \ ./SourceFiles/dialogswidget.cpp \ ./SourceFiles/dropdown.cpp \ + ./SourceFiles/facades.cpp \ ./SourceFiles/fileuploader.cpp \ ./SourceFiles/history.cpp \ ./SourceFiles/historywidget.cpp \ @@ -112,6 +113,7 @@ SOURCES += \ ./SourceFiles/types.cpp \ ./SourceFiles/window.cpp \ ./SourceFiles/mtproto/mtp.cpp \ + ./SourceFiles/mtproto/mtpAuthKey.cpp \ ./SourceFiles/mtproto/mtpConnection.cpp \ ./SourceFiles/mtproto/mtpCoreTypes.cpp \ ./SourceFiles/mtproto/mtpDC.cpp \ @@ -175,6 +177,7 @@ HEADERS += \ ./SourceFiles/countries.h \ ./SourceFiles/dialogswidget.h \ ./SourceFiles/dropdown.h \ + ./SourceFiles/facades.h \ ./SourceFiles/fileuploader.h \ ./SourceFiles/history.h \ ./SourceFiles/historywidget.h \ diff --git a/Telegram/Telegram.rc b/Telegram/Telegram.rc index 1ecd73036..47e1ea11c 100644 --- a/Telegram/Telegram.rc +++ b/Telegram/Telegram.rc @@ -68,8 +68,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,9,13,0 - PRODUCTVERSION 0,9,13,0 + FILEVERSION 0,9,15,0 + PRODUCTVERSION 0,9,15,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -85,10 +85,10 @@ BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Telegram Messenger LLP" - VALUE "FileVersion", "0.9.13.0" + VALUE "FileVersion", "0.9.15.0" VALUE "LegalCopyright", "Copyright (C) 2013" VALUE "ProductName", "Telegram Desktop" - VALUE "ProductVersion", "0.9.13.0" + VALUE "ProductVersion", "0.9.15.0" END END BLOCK "VarFileInfo" diff --git a/Telegram/Telegram.vcxproj b/Telegram/Telegram.vcxproj index 4a7391421..51fd57c4f 100644 --- a/Telegram/Telegram.vcxproj +++ b/Telegram/Telegram.vcxproj @@ -992,6 +992,7 @@ + @@ -1029,6 +1030,7 @@ + @@ -1552,6 +1554,7 @@ $(QTDIR)\bin\moc.exe;%(FullPath) $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) @@ -1561,7 +1564,7 @@ $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing popupmenu.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/gui/popupmenu.h" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/popupmenu.h" $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing popupmenu.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp diff --git a/Telegram/Telegram.vcxproj.filters b/Telegram/Telegram.vcxproj.filters index d761bfb31..8363c7486 100644 --- a/Telegram/Telegram.vcxproj.filters +++ b/Telegram/Telegram.vcxproj.filters @@ -900,6 +900,12 @@ gui + + Source Files + + + mtproto + @@ -989,6 +995,9 @@ Version + + Source Files + diff --git a/Telegram/Telegram.xcodeproj/project.pbxproj b/Telegram/Telegram.xcodeproj/project.pbxproj index b6b46560f..05c73417b 100644 --- a/Telegram/Telegram.xcodeproj/project.pbxproj +++ b/Telegram/Telegram.xcodeproj/project.pbxproj @@ -42,6 +42,8 @@ 07080BD21A436A5000741A51 /* lang.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 07080BD01A436A5000741A51 /* lang.cpp */; }; 0710C9FE1B0B9376001B4272 /* stickersetbox.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 0710C9FC1B0B9376001B4272 /* stickersetbox.cpp */; }; 0710CA051B0B9404001B4272 /* moc_stickersetbox.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 0710CA041B0B9404001B4272 /* moc_stickersetbox.cpp */; }; + 07129D6A1C16D230002DC495 /* mtpAuthKey.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 07129D691C16D230002DC495 /* mtpAuthKey.cpp */; }; + 07129D6E1C16D245002DC495 /* facades.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 07129D6C1C16D245002DC495 /* facades.cpp */; }; 0732E4A9199E262300D50FE7 /* overviewwidget.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 0732E4A7199E262300D50FE7 /* overviewwidget.cpp */; }; 0732E4AC199E268A00D50FE7 /* moc_overviewwidget.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 0732E4AB199E268A00D50FE7 /* moc_overviewwidget.cpp */; }; 074756191A1372C600CA07F7 /* moc_types.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 074756181A1372C600CA07F7 /* moc_types.cpp */; }; @@ -270,6 +272,9 @@ 0710C9FC1B0B9376001B4272 /* stickersetbox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = stickersetbox.cpp; path = SourceFiles/boxes/stickersetbox.cpp; sourceTree = SOURCE_ROOT; }; 0710C9FD1B0B9376001B4272 /* stickersetbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stickersetbox.h; path = SourceFiles/boxes/stickersetbox.h; sourceTree = SOURCE_ROOT; }; 0710CA041B0B9404001B4272 /* moc_stickersetbox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = moc_stickersetbox.cpp; path = GeneratedFiles/Debug/moc_stickersetbox.cpp; sourceTree = SOURCE_ROOT; }; + 07129D691C16D230002DC495 /* mtpAuthKey.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mtpAuthKey.cpp; path = SourceFiles/mtproto/mtpAuthKey.cpp; sourceTree = SOURCE_ROOT; }; + 07129D6C1C16D245002DC495 /* facades.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = facades.cpp; path = SourceFiles/facades.cpp; sourceTree = SOURCE_ROOT; }; + 07129D6D1C16D245002DC495 /* facades.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = facades.h; path = SourceFiles/facades.h; sourceTree = SOURCE_ROOT; }; 072E117A1A56EB9400A87ACC /* lang_pt_BR.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = lang_pt_BR.strings; path = SourceFiles/langs/lang_pt_BR.strings; sourceTree = SOURCE_ROOT; }; 0732E4A7199E262300D50FE7 /* overviewwidget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = overviewwidget.cpp; path = SourceFiles/overviewwidget.cpp; sourceTree = SOURCE_ROOT; }; 0732E4A8199E262300D50FE7 /* overviewwidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = overviewwidget.h; path = SourceFiles/overviewwidget.h; sourceTree = SOURCE_ROOT; }; @@ -776,6 +781,7 @@ isa = PBXGroup; children = ( 6D50D70712776D7ED3B00E5C /* mtp.cpp */, + 07129D691C16D230002DC495 /* mtpAuthKey.cpp */, B8D9AFA42E8633154A9817A2 /* mtpConnection.cpp */, 07D8509219F5C97E00623D75 /* mtpCoreTypes.cpp */, 315C7FACB4A9E18AA95486CA /* mtpDC.cpp */, @@ -896,6 +902,7 @@ 07C7596D1B1F7E0000662169 /* autoupdater.cpp */, E466873F01ABA1E55E914489 /* dialogswidget.cpp */, 710C982FC773400941B3AFBC /* dropdown.cpp */, + 07129D6C1C16D245002DC495 /* facades.cpp */, 9B36BB8C5B8CA7B07F3F35F0 /* fileuploader.cpp */, 26B83A58EE268598E703875D /* history.cpp */, A83D2C19F756D3371E5999A8 /* historywidget.cpp */, @@ -935,6 +942,7 @@ 206B4F5CBD5354BCE19FF32F /* countries.h */, 55B4A93DD455EED91C899A8E /* dialogswidget.h */, 1A4C47331E186344291B8178 /* dropdown.h */, + 07129D6D1C16D245002DC495 /* facades.h */, 8A9D926C08392F7A9BC83B0C /* fileuploader.h */, CF1690B68F3B278E78823DB9 /* history.h */, C63C6D083EBEB13A60256DF3 /* historywidget.h */, @@ -1526,6 +1534,7 @@ 074FCB9119D36E60004C6EB2 /* moc_popupmenu.cpp in Compile Sources */, B6346B66B0A2228A91D8A5D9 /* mtpDC.cpp in Compile Sources */, 0755AEDF1AD12A80004D738A /* moc_sessionsbox.cpp in Compile Sources */, + 07129D6E1C16D245002DC495 /* facades.cpp in Compile Sources */, B8CA3E1E11A7E0E7DF9E1CDE /* mtpFileLoader.cpp in Compile Sources */, 0755AEDD1AD12A80004D738A /* moc_abstractbox.cpp in Compile Sources */, 99F0A9B2AFE5ABDCBFC04510 /* mtpRPC.cpp in Compile Sources */, @@ -1546,6 +1555,7 @@ 03270F718426CFE84729079E /* flattextarea.cpp in Compile Sources */, E3D7A5CA24541D5DB69D6606 /* images.cpp in Compile Sources */, ADE99904299B99EB6135E8D9 /* scrollarea.cpp in Compile Sources */, + 07129D6A1C16D230002DC495 /* mtpAuthKey.cpp in Compile Sources */, 90085DF442550A0845D5AF37 /* style_core.cpp in Compile Sources */, 074FCB8E19D36851004C6EB2 /* popupmenu.cpp in Compile Sources */, 3AA6E7264581F82856FB37F7 /* text.cpp in Compile Sources */, @@ -1687,7 +1697,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.9.13; + CURRENT_PROJECT_VERSION = 0.9.15; DEBUG_INFORMATION_FORMAT = dwarf; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; @@ -1706,7 +1716,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 0.9.13; + CURRENT_PROJECT_VERSION = 0.9.15; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_OPTIMIZATION_LEVEL = fast; GCC_PREFIX_HEADER = ./SourceFiles/stdafx.h; @@ -1733,10 +1743,10 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = ""; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.9.13; + CURRENT_PROJECT_VERSION = 0.9.15; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DYLIB_COMPATIBILITY_VERSION = 0.9; - DYLIB_CURRENT_VERSION = 0.9.13; + DYLIB_CURRENT_VERSION = 0.9.15; ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; @@ -1867,10 +1877,10 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = ""; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.9.13; + CURRENT_PROJECT_VERSION = 0.9.15; DEBUG_INFORMATION_FORMAT = dwarf; DYLIB_COMPATIBILITY_VERSION = 0.9; - DYLIB_CURRENT_VERSION = 0.9.13; + DYLIB_CURRENT_VERSION = 0.9.15; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; diff --git a/Telegram/Updater.rc b/Telegram/Updater.rc index 5df23e756..b55372ad8 100644 Binary files a/Telegram/Updater.rc and b/Telegram/Updater.rc differ diff --git a/Telegram/Version b/Telegram/Version index 56fa5a468..88016d82f 100644 --- a/Telegram/Version +++ b/Telegram/Version @@ -1,5 +1,6 @@ -AppVersion 9013 +AppVersion 9015 AppVersionStrMajor 0.9 -AppVersionStrSmall 0.9.13 -AppVersionStr 0.9.13 +AppVersionStrSmall 0.9.15 +AppVersionStr 0.9.15 DevChannel 0 +BetaVersion 0 9014003 diff --git a/XCODE.md b/XCODE.md index 9c78f70fd..87c754728 100644 --- a/XCODE.md +++ b/XCODE.md @@ -2,35 +2,59 @@ ###Prepare folder -Choose a folder for the future build, for example **/Users/user/TBuild** There you will have two folders, **Libraries** for third-party libs and **tdesktop** (or **tdesktop-master**) for the app. +Choose a folder for the future build, for example **/Users/user/TBuild** + +There you will have two folders, **Libraries** for third-party libs and **tdesktop** (or **tdesktop-master**) for the app. + +**You will need this hierarchy to be able to follow this README !** ###Clone source code -By git – in Terminal go to **/Users/user/TBuild** and run +By git – in Terminal go to **/Users/user/TBuild** and run: git clone https://github.com/telegramdesktop/tdesktop.git -or download in ZIP and extract to **/Users/user/TBuild** rename **tdesktop-master** to **tdesktop** to have **/Users/user/TBuild/tdesktop/Telegram/Telegram.xcodeproj** project +or: +* download in ZIP and extract to **/Users/user/TBuild** +* rename **tdesktop-master** to **tdesktop**. + +The path to Telegram.xcodeproj should now be: **/Users/user/TBuild/tdesktop/Telegram/Telegram.xcodeproj** ###Prepare libraries -In your build Terminal run +In your build Terminal run: - MACOSX_DEPLOYMENT_TARGET=10.8 + MACOSX_DEPLOYMENT_TARGET=10.8 to set minimal supported OS version to 10.8 for future console builds. ####OpenSSL 1.0.1g -Get sources from https://github.com/telegramdesktop/openssl-xcode, by git – in Terminal go to **/Users/user/TBuild/Libraries** and run +#####Get openssl-xcode project file - git clone https://github.com/telegramdesktop/openssl-xcode.git +From https://github.com/telegramdesktop/openssl-xcode with git in Terminal: -or download in ZIP and extract to **/Users/user/TBuild/Libraries**, rename **openssl-xcode-master** to **openssl-xcode** to have **/Users/user/TBuild/Libraries/openssl-xcode/openssl.xcodeproj** project +* go to **/Users/user/TBuild/Libraries +* run: + + git clone https://github.com/telegramdesktop/openssl-xcode.git -http://www.openssl.org/source/ > Download [**openssl-1.0.1h.tar.gz**](http://www.openssl.org/source/openssl-1.0.1h.tar.gz) (4.3 Mb) +or: -Extract openssl-1.0.1h.tar.gz and copy everything from **openssl-1.0.1h** to **/Users/user/TBuild/Libraries/openssl-xcode** to have **/Users/user/TBuild/Libraries/openssl-xcode/include** +* download in ZIP and extract to **/Users/user/TBuild/Libraries**, +* rename **openssl-xcode-master** to **openssl-xcode** + +The path to openssl.xcodeproj should now be: **/Users/user/TBuild/Libraries/openssl-xcode/openssl.xcodeproj** + +#####Get the source code: + +Download [**openssl-1.0.1h.tar.gz**](http://www.openssl.org/source/openssl-1.0.1h.tar.gz) (4.3 Mb) + +* Extract openssl-1.0.1h.tar.gz +* Copy everything from **openssl-1.0.1h** to **/Users/user/TBuild/Libraries/openssl-xcode** + +The folder include of openssl should be: +**/Users/user/TBuild/Libraries/openssl-xcode/include** #####Building library @@ -38,14 +62,15 @@ Extract openssl-1.0.1h.tar.gz and copy everything from **openssl-1.0.1h** to **/ * Product > Build ####liblzma +#####Get the source code -http://tukaani.org/xz/ > Download [**xz-5.0.5.tar.gz**](http://tukaani.org/xz/xz-5.0.5.tar.gz) +Download [**xz-5.0.5.tar.gz**](http://tukaani.org/xz/xz-5.0.5.tar.gz) Extract to **/Users/user/TBuild/Libraries** #####Building library -In Terminal go to **/Users/user/TBuild/Libraries/xz-5.0.5** and there run +In Terminal go to **/Users/user/TBuild/Libraries/xz-5.0.5** and there run: ./configure make @@ -53,15 +78,26 @@ In Terminal go to **/Users/user/TBuild/Libraries/xz-5.0.5** and there run ####zlib 1.2.8 -Using se system lib +Using the system lib ####libexif 0.6.20 +#####Get the source code -Get sources from https://github.com/telegramdesktop/libexif-0.6.20, by git – in Terminal go to **/Users/user/TBuild/Libraries** and run +From https://github.com/telegramdesktop/libexif-0.6.20 with git in Terminal: - git clone https://github.com/telegramdesktop/libexif-0.6.20.git +* go to **/Users/user/TBuild/Libraries** +* run: -or download in ZIP and extract to **/Users/user/TBuild/Libraries**, rename **libexif-0.6.20-master** to **libexif-0.6.20** to have **/Users/user/TBuild/Libraries/libexif-0.6.20/configure** script + git clone https://github.com/telegramdesktop/libexif-0.6.20.git + +or: + +* download in ZIP +* extract to **/Users/user/TBuild/Libraries** +* rename **libexif-0.6.20-master** to **libexif-0.6.20** + +The folder configure should have this path: +**/Users/user/TBuild/Libraries/libexif-0.6.20/configure** #####Building library @@ -88,40 +124,46 @@ In Terminal go to **/Users/user/TBuild/Libraries/openal-soft/build** and there r sudo make install ####Opus codec +#####Get the source code -Download sources [opus-1.1.tar.gz](http://downloads.xiph.org/releases/opus/opus-1.1.tar.gz) from http://www.opus-codec.org/downloads/, extract to **/Users/user/TBuild/Libraries** and rename to have **/Users/user/TBuild/Libraries/opus/configure** +* Download sources [opus-1.1.tar.gz](http://downloads.xiph.org/releases/opus/opus-1.1.tar.gz) from http://www.opus-codec.org/downloads/ +* Extract them to **/Users/user/TBuild/Libraries** +* Rename opus-1.1 to opus to have **/Users/user/TBuild/Libraries/opus/configure** -#####Building libraries +#####Building library -Download [pkg-config 0.28](http://pkgconfig.freedesktop.org/releases/pkg-config-0.28.tar.gz) from http://pkg-config.freedesktop.org, extract it to **/Users/user/TBuild/Libraries** +* Download [pkg-config 0.28](http://pkgconfig.freedesktop.org/releases/pkg-config-0.28.tar.gz) from http://pkg-config.freedesktop.org +* Extract it to **/Users/user/TBuild/Libraries** -In Terminal go to **/Users/user/TBuild/Libraries/pkg-config-0.28** and run +In Terminal go to **/Users/user/TBuild/Libraries/pkg-config-0.28** and run: ./configure --with-internal-glib make sudo make install -then go to **/Users/user/TBuild/Libraries/opus** and there run +then go to **/Users/user/TBuild/Libraries/opus** and run: ./configure make sudo make install -####FFmpeg +####FFmpeg and Libiconv +#####Get the source code -Download sources [ffmpeg-2.6.3.tar.bz2](http://ffmpeg.org/releases/ffmpeg-2.6.3.tar.bz2) from https://www.ffmpeg.org/download.html, extract to **/Users/user/TBuild/Libraries** to have **/Users/user/TBuild/Libraries/ffmpeg-2.6.3** +* Download sources [ffmpeg-2.6.3.tar.bz2](http://ffmpeg.org/releases/ffmpeg-2.6.3.tar.bz2) from https://www.ffmpeg.org/download.html +* Extract to **/Users/user/TBuild/Libraries** to have **/Users/user/TBuild/Libraries/ffmpeg-2.6.3** -#####Building libraries +* Download [libiconv-1.14](http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz) from http://www.gnu.org/software/libiconv/#downloading +* Extract to **/Users/user/TBuild/Libraries** to have **/Users/user/TBuild/Libraries/ibiconv-1.14** -Download [libiconv-1.14](http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz) from http://www.gnu.org/software/libiconv/#downloading, extract it to **/Users/user/TBuild/Libraries** - -In Termianl go to **/Users/user/TBuild/Libraries/libiconv-1.14** and run +#####Building library +In Terminal go to **/Users/user/TBuild/Libraries/libiconv-1.14** and run: ./configure --enable-static make sudo make install -Then in Terminal go to **/Users/user/TBuild/Libraries/ffmpeg-2.6.3** and run +Then in Terminal go to **/Users/user/TBuild/Libraries/ffmpeg-2.6.3** and run: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" @@ -137,8 +179,9 @@ Then in Terminal go to **/Users/user/TBuild/Libraries/ffmpeg-2.6.3** and run sudo make install ####Qt 5.5.1, slightly patched +#####Get the source code -In Terminal go to **/Users/user/TBuild/Libraries** and run +In Terminal go to **/Users/user/TBuild/Libraries** and run: git clone git://code.qt.io/qt/qt5.git QtStatic cd QtStatic @@ -149,16 +192,18 @@ In Terminal go to **/Users/user/TBuild/Libraries** and run cd qtbase && git checkout v5.5.1 && cd .. #####Apply the patch +From **/Users/user/TBuild/Libraries/QtStatic/qtbase**, run: - cd qtbase && git apply ../../../tdesktop/Telegram/_qtbase_5_5_1_patch.diff && cd .. + git apply ../../../tdesktop/Telegram/_qtbase_5_5_1_patch.diff #####Building library +Go to **/Users/user/TBuild/Libraries/QtStatic** and run: ./configure -debug-and-release -opensource -confirm-license -static -opengl desktop -no-openssl -securetransport -nomake examples -nomake tests -platform macx-clang make -j4 sudo make -j4 install -building (**make** command) will take really long time. +Building (**make** command) will take a really long time. ###Building Telegram Desktop