Версия 1.2.0

Новое:
- Отображение раскладки клавиатуры
Обновлено:
- Описание программы
This commit is contained in:
Alexander Zhirov 2023-02-20 09:41:03 +03:00
parent f3f30a4cf8
commit a1d7766e47
13 changed files with 585 additions and 12854 deletions

View File

@ -1,10 +1,9 @@
# GUI для FreeRDP # GUI для FreeRDP
- Основано на базе [FreeRDP 2.9.0](https://github.com/FreeRDP/FreeRDP) ([локальная версия](http://git.belpig.ru/forks/FreeRDP)) - Основано на базе [FreeRDP 2.10.0](https://github.com/FreeRDP/FreeRDP) ([локальная версия](http://git.belpig.ru/forks/FreeRDP))
- Надстройка для FreeRDP на основе библиотеки [`IUP`](https://www.tecgraf.puc-rio.br/iup/). - Надстройка для FreeRDP на основе библиотеки [`IUP`](https://www.tecgraf.puc-rio.br/iup/).
![main.png](img/main.png) ![main.png](img/main.png)
![settings.png](img/settings.png) ![settings.png](img/settings.png)
## Сборка программы ## Сборка программы
@ -14,16 +13,16 @@
### Подготовка ### Подготовка
Скопировать файлы из [freerdp](freerdp/) в оригинальный проект `(2.9.0)`: Скопировать файлы из [freerdp](freerdp/) в оригинальный проект `(2.10.0)`:
```sh ```sh
cp -r GUI-FreeRDP/freerdp/* freerdp-2.9.0/ cp -r GUI-FreeRDP/freerdp/* freerdp-2.10.0/
``` ```
Перейти в оригинальный каталог: Перейти в оригинальный каталог:
```sh ```sh
cd freerdp-2.9.0 cd freerdp-2.10.0
``` ```
Применить патчи: Применить патчи:
@ -35,8 +34,13 @@ git apply ../GUI-FreeRDP/xrandr.patch
## Сборка ## Сборка
Параметр `IUP_WITH_COLOR_BUTTONS` отвечает за окрашивание кнопок (по умолчанию `OFF`). Параметры сборки:
Параметр `IUP_WITH_SOUND_CHECKBOX` включает поддержку параметров звука (по умолчанию `OFF`).
- `IUP_WITH_COLOR_BUTTONS` - поддержка цветных кнопок (по умолчанию `OFF`)
- `IUP_WITH_SOUND_CHECKBOX` - поддержка параметров звука (по умолчанию `OFF`)
- `IUP_DESCRIPTION_ABOUT_ARCH_X32` - в описании "О прогамме" отобразить пометку для x32 архитектур (по умолчанию `OFF`)
- `IUP_WITH_LANGUAGE_KEYBOARD_ICON` - поддержка отображения раскладки клавиатуры (по умолчанию `OFF`)
- `IUP_DESCRIPTION_ABOUT_MIRATORG` - в описании "О прогамме" отобразить рабочие контактные данные (по умолчанию `OFF`)
Создать отдельный каталог `build`: Создать отдельный каталог `build`:
@ -48,7 +52,7 @@ cd build
и выполнить в нём сборку: и выполнить в нём сборку:
```sh ```sh
cmake -B . -S ../freerdp-2.9.0 \ cmake -B . -S ../freerdp-2.10.0 \
-DWITH_WAYLAND=OFF \ -DWITH_WAYLAND=OFF \
-DWITH_OSS=OFF \ -DWITH_OSS=OFF \
-DWITH_ALSA=OFF \ -DWITH_ALSA=OFF \
@ -64,9 +68,12 @@ cmake -B . -S ../freerdp-2.9.0 \
-DWITH_DSP_FFMPEG=OFF \ -DWITH_DSP_FFMPEG=OFF \
-DWITH_FAAC=OFF \ -DWITH_FAAC=OFF \
-DWITH_SSE2=ON \ -DWITH_SSE2=ON \
-DIUP_WITH_COLOR_BUTTONS=OFF \ -DBUILD_SHARED_LIBS=OFF \
-DIUP_WITH_COLOR_BUTTONS=ON \
-DIUP_WITH_SOUND_CHECKBOX=OFF \ -DIUP_WITH_SOUND_CHECKBOX=OFF \
-DBUILD_SHARED_LIBS=OFF -DIUP_DESCRIPTION_ABOUT_ARCH_X32=OFF \
-DIUP_WITH_LANGUAGE_KEYBOARD_ICON=ON \
-DIUP_DESCRIPTION_ABOUT_MIRATORG=ON
``` ```
и компиляцию программы: и компиляцию программы:

View File

@ -9,7 +9,24 @@
char* getAbout() char* getAbout()
{ {
char *about = "" char *about =
"GUI FreeRDP\nv1.2.1\nСобрано на основе freerdp v2.9.0"; "GUI FreeRDP v1.2.0\n"
"Собрано на основе FreeRDP v2.10.0\n"
#ifdef IUP_DESCRIPTION_ABOUT_ARCH_X32
"Для тонкого клиента архитектуры x32\n"
#else
"Для тонкого клиента архитектуры x64\n"
#endif
"Все вопросы оставлять по адресу:\n"
#ifdef IUP_DESCRIPTION_ABOUT_MIRATORG
"http://git.belpig.ru/a.zhirov/GUI-FreeRDP/issues\n"
"Электронная почта: a.zhirov@agrohold.ru\n"
"© Александр Жиров"
#else
"https://git.zhirov.kz/alexander/GUI-FreeRDP\n"
"Электронная почта: alexander@zhirov.kz\n"
"© Александр Жиров"
#endif
;
return about; return about;
} }

View File

@ -15,6 +15,7 @@
#include "images.h" #include "images.h"
#include "arguments.h" #include "arguments.h"
#include "address.h" #include "address.h"
#include "keylang.h"
#include "db.h" #include "db.h"
#include "xrdp.h" #include "xrdp.h"
@ -121,6 +122,23 @@ static void createHostsList(Ihandle *iupList)
dbFreeHosts(hosts); dbFreeHosts(hosts);
} }
#ifdef IUP_WITH_LANGUAGE_KEYBOARD_ICON
static int k_any(Ihandle *self, int key)
{
int langcode = getKeyboardLanguage();
if (langcode)
{
if (langcode == 1)
IupSetAttribute(IupGetDialogChild(self, "KEYBOARD"), "IMAGE", "keyboardUs");
else if (langcode == 2)
IupSetAttribute(IupGetDialogChild(self, "KEYBOARD"), "IMAGE", "keyboardRu");
else
IupSetAttribute(IupGetDialogChild(self, "KEYBOARD"), "IMAGE", "keyboardEmpty");
}
return IUP_DEFAULT;
}
#endif
Ihandle* guiStart() Ihandle* guiStart()
{ {
Ihandle *dlg; Ihandle *dlg;
@ -184,6 +202,22 @@ Ihandle* guiStart()
hBoxPassword = IupHbox(labelPassword, inputPassword, NULL); hBoxPassword = IupHbox(labelPassword, inputPassword, NULL);
IupSetAttribute(hBoxPassword, "MARGIN", "10x10"); IupSetAttribute(hBoxPassword, "MARGIN", "10x10");
#ifdef IUP_WITH_LANGUAGE_KEYBOARD_ICON
Ihandle *keyboardRu, *keyboardUs, *keyboardEmpty, *iconLang;
keyboardEmpty = IupImageRGBA(32, 32, empty_keyboard);
IupSetHandle("keyboardEmpty", keyboardEmpty);
keyboardRu = IupImageRGBA(32, 32, ru_keyboard);
IupSetHandle("keyboardRu", keyboardRu);
keyboardUs = IupImageRGBA(32, 32, us_keyboard);
IupSetHandle("keyboardUs", keyboardUs);
iconLang = IupLabel(NULL);
IupSetAttribute(iconLang, "NAME", "KEYBOARD");
IupSetAttribute(iconLang, "IMAGE", "keyboardRu");
IupSetAttribute(iconLang, "FLOATING", "YES");
IupSetAttribute(iconLang, "POSITION", "13,222");
IupSetAttribute(iconLang, "TIP", "Текущая раскладка клавиатуры (Alt+Shift)");
#endif
btnConnect = IupButton("Подключение", NULL); btnConnect = IupButton("Подключение", NULL);
IupSetHandle("CONNECT", btnConnect); IupSetHandle("CONNECT", btnConnect);
IupSetAttribute(btnConnect, "NAME", "CONNECT"); IupSetAttribute(btnConnect, "NAME", "CONNECT");
@ -215,7 +249,11 @@ Ihandle* guiStart()
IupSetAttribute(hBoxButtons, "GAP", "10"); IupSetAttribute(hBoxButtons, "GAP", "10");
IupSetAttribute(hBoxButtons, "MARGIN", "10x10"); IupSetAttribute(hBoxButtons, "MARGIN", "10x10");
vBoxMain = IupVbox(labelImage, hBoxServer, hBoxUser, hBoxPassword, hBoxButtons, NULL); vBoxMain = IupVbox(
#ifdef IUP_WITH_LANGUAGE_KEYBOARD_ICON
iconLang,
#endif
labelImage, hBoxServer, hBoxUser, hBoxPassword, hBoxButtons, NULL);
IupSetCallback(btnConnect, "ACTION", (Icallback) guiConnect); IupSetCallback(btnConnect, "ACTION", (Icallback) guiConnect);
IupSetCallback(btnClose, "ACTION", (Icallback) guiExit); IupSetCallback(btnClose, "ACTION", (Icallback) guiExit);
@ -229,6 +267,10 @@ Ihandle* guiStart()
IupSetAttribute(dlg, "PARENTDIALOG", "MAIN_WINDOW"); IupSetAttribute(dlg, "PARENTDIALOG", "MAIN_WINDOW");
IupSetAttribute(dlg, "DEFAULTENTER", "CONNECT"); IupSetAttribute(dlg, "DEFAULTENTER", "CONNECT");
IupSetAttribute(dlg, "DEFAULTESC", "CLOSE"); IupSetAttribute(dlg, "DEFAULTESC", "CLOSE");
#ifdef IUP_WITH_LANGUAGE_KEYBOARD_ICON
IupSetCallback(dlg, "iup_XkeyAlt(K_LSHIFT)", (Icallback) k_any);
IupSetCallback(dlg, "GETFOCUS_CB", (Icallback) k_any);
#endif
return dlg; return dlg;
} }

View File

@ -1,5 +1,398 @@
#include "images.h" #include "images.h"
const unsigned char empty_keyboard[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 37, 0, 0, 0, 116, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 116, 0, 0, 0, 36,
0, 0, 0, 219, 0, 0, 0, 130, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 131, 0, 0, 0, 218,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239,
0, 0, 0, 218, 0, 0, 0, 131, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 131, 0, 0, 0, 218,
0, 0, 0, 36, 0, 0, 0, 115, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 115, 0, 0, 0, 35,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
const unsigned char ru_keyboard[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 3, 18, 30, 36, 83, 34, 43, 48, 201, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228,
30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228,
30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228,
30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 30, 39, 45, 228, 34, 43, 48, 201, 18, 30, 36, 83, 0, 0, 0, 3,
26, 33, 38, 107, 60, 67, 72, 244, 185, 188, 190, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255,
211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255,
211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255,
211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 185, 188, 190, 255, 60, 67, 72, 244, 26, 33, 38, 107,
33, 42, 47, 224, 208, 209, 211, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 208, 209, 211, 255, 33, 42, 47, 224,
18, 27, 33, 255, 248, 248, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 248, 248, 255, 18, 27, 33, 255,
18, 27, 33, 255, 248, 248, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 248, 248, 255, 18, 27, 33, 255,
18, 27, 33, 255, 248, 248, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 248, 248, 255, 18, 27, 33, 255,
18, 27, 33, 255, 248, 248, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 248, 248, 255, 18, 27, 33, 255,
18, 27, 33, 255, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253,
22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253,
22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253,
22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 22, 31, 37, 253, 18, 27, 33, 255,
18, 27, 33, 255, 16, 56, 144, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255,
16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255,
16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255,
16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 56, 144, 255, 18, 27, 33, 255,
18, 27, 33, 255, 16, 58, 151, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255,
16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255,
16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255,
16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 58, 151, 255, 18, 27, 33, 255,
18, 27, 33, 255, 16, 58, 151, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255,
16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255,
16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255,
16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 58, 151, 255, 18, 27, 33, 255,
18, 27, 33, 255, 16, 58, 151, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255,
16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255,
16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255,
16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 58, 151, 255, 18, 27, 33, 255,
18, 27, 33, 255, 16, 58, 151, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255,
16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255,
16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255,
16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 59, 155, 255, 16, 58, 151, 255, 18, 27, 33, 255,
18, 27, 33, 255, 16, 56, 144, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255,
16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255,
16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 57, 147, 255,
16, 57, 147, 255, 16, 58, 153, 255, 16, 59, 155, 255, 16, 58, 150, 255, 16, 57, 147, 255, 16, 57, 147, 255, 16, 56, 144, 255, 18, 27, 33, 255,
18, 27, 33, 255, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253,
21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253,
21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253,
21, 27, 34, 253, 82, 31, 51, 227, 176, 38, 76, 194, 35, 28, 37, 247, 21, 27, 34, 253, 21, 27, 34, 253, 21, 27, 34, 253, 18, 27, 33, 255,
18, 27, 33, 255, 230, 31, 51, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 230, 31, 51, 255, 18, 27, 33, 255,
18, 27, 33, 255, 230, 31, 51, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 230, 31, 51, 255, 18, 27, 33, 255,
18, 27, 33, 255, 230, 31, 51, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 230, 31, 51, 255, 18, 27, 33, 255,
18, 27, 33, 255, 230, 31, 51, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 230, 31, 51, 255, 18, 27, 33, 255,
31, 27, 34, 224, 193, 30, 48, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255,
237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 237, 31, 52, 255, 193, 30, 48, 255, 31, 27, 34, 224,
26, 26, 33, 107, 56, 28, 37, 244, 173, 30, 46, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255,
197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255,
197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255,
197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 197, 30, 48, 255, 173, 30, 46, 255, 56, 28, 37, 244, 26, 26, 33, 107,
0, 0, 0, 3, 18, 30, 36, 83, 34, 27, 34, 201, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228,
30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228,
30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228,
30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 30, 27, 34, 228, 34, 27, 34, 201, 18, 30, 36, 83, 0, 0, 0, 3,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
const unsigned char us_keyboard[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 37, 0, 0, 0, 116, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 116, 0, 0, 0, 36,
13, 8, 15, 248, 31, 31, 70, 255, 43, 45, 85, 255, 43, 45, 85, 255, 43, 45, 85, 255, 43, 45, 85, 255, 43, 45, 85, 255, 43, 45, 85, 255,
43, 45, 85, 255, 43, 45, 85, 255, 43, 45, 85, 255, 43, 45, 85, 255, 43, 45, 85, 255, 43, 45, 85, 255, 43, 45, 85, 255, 43, 45, 85, 255,
5, 3, 4, 255, 122, 53, 59, 255, 122, 53, 59, 255, 122, 53, 59, 255, 122, 53, 59, 255, 122, 53, 59, 255, 122, 53, 59, 255, 122, 53, 59, 255,
122, 53, 59, 255, 122, 53, 59, 255, 122, 53, 59, 255, 122, 53, 59, 255, 122, 53, 59, 255, 122, 53, 59, 255, 110, 48, 53, 253, 12, 6, 6, 230,
6, 4, 8, 254, 63, 63, 143, 255, 36, 38, 72, 255, 80, 85, 160, 255, 80, 85, 160, 255, 36, 38, 72, 255, 80, 85, 160, 255, 80, 85, 160, 255,
36, 38, 72, 255, 80, 85, 160, 255, 80, 85, 160, 255, 36, 38, 72, 255, 80, 85, 160, 255, 80, 85, 160, 255, 36, 38, 72, 255, 80, 85, 160, 255,
10, 6, 8, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255,
229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 8, 3, 4, 247,
6, 4, 8, 254, 63, 63, 143, 255, 74, 79, 148, 255, 57, 60, 114, 255, 60, 63, 119, 255, 74, 79, 148, 255, 57, 61, 114, 255, 59, 63, 118, 255,
74, 79, 148, 255, 57, 61, 114, 255, 59, 63, 118, 255, 74, 79, 148, 255, 58, 62, 116, 255, 58, 62, 117, 255, 74, 79, 148, 255, 80, 85, 160, 255,
7, 4, 6, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255,
92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 176, 93, 100, 255, 183, 97, 105, 255, 92, 49, 53, 255, 3, 2, 2, 252,
6, 4, 8, 254, 63, 63, 143, 255, 36, 39, 73, 255, 77, 81, 153, 255, 77, 82, 154, 255, 36, 39, 73, 255, 77, 82, 154, 255, 77, 82, 154, 255,
36, 39, 73, 255, 77, 82, 154, 255, 77, 82, 154, 255, 36, 39, 73, 255, 77, 82, 154, 255, 77, 82, 154, 255, 36, 39, 73, 255, 80, 85, 160, 255,
8, 7, 9, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255,
161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 219, 219, 223, 255, 223, 223, 227, 255, 161, 161, 164, 255, 8, 7, 7, 253,
6, 4, 8, 254, 63, 63, 143, 255, 74, 79, 148, 255, 57, 60, 114, 255, 60, 63, 119, 255, 74, 79, 148, 255, 57, 61, 115, 255, 59, 63, 118, 255,
74, 79, 148, 255, 57, 61, 115, 255, 59, 63, 118, 255, 74, 79, 148, 255, 58, 62, 116, 255, 58, 62, 117, 255, 74, 79, 148, 255, 80, 85, 160, 255,
10, 8, 11, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255,
242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 12, 10, 10, 251,
6, 4, 8, 254, 63, 63, 143, 255, 37, 39, 73, 255, 77, 81, 153, 255, 77, 82, 154, 255, 36, 39, 73, 255, 77, 81, 153, 255, 77, 82, 154, 255,
37, 39, 73, 255, 77, 81, 153, 255, 77, 82, 154, 255, 36, 39, 73, 255, 77, 82, 154, 255, 77, 82, 154, 255, 36, 39, 73, 255, 80, 85, 160, 255,
6, 5, 6, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255,
63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 3, 2, 2, 254,
6, 4, 8, 254, 63, 63, 143, 255, 74, 78, 147, 255, 57, 61, 114, 255, 60, 63, 119, 255, 74, 78, 147, 255, 57, 61, 115, 255, 59, 63, 119, 255,
74, 78, 147, 255, 57, 61, 115, 255, 59, 63, 119, 255, 74, 78, 147, 255, 58, 62, 116, 255, 59, 62, 117, 255, 74, 78, 147, 255, 80, 85, 160, 255,
8, 5, 7, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255,
183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 6, 3, 3, 249,
6, 4, 8, 254, 63, 63, 143, 255, 37, 39, 74, 255, 76, 81, 152, 255, 77, 82, 154, 255, 37, 39, 73, 255, 77, 81, 153, 255, 77, 82, 154, 255,
37, 39, 74, 255, 77, 81, 153, 255, 77, 82, 154, 255, 37, 39, 73, 255, 77, 81, 153, 255, 77, 82, 154, 255, 37, 39, 73, 255, 80, 85, 160, 255,
10, 6, 8, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255,
229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 8, 3, 4, 247,
6, 4, 8, 254, 63, 63, 143, 255, 73, 78, 147, 255, 57, 61, 114, 255, 60, 64, 120, 255, 73, 78, 146, 255, 57, 61, 115, 255, 59, 63, 119, 255,
73, 78, 147, 255, 57, 61, 115, 255, 59, 63, 119, 255, 73, 78, 146, 255, 58, 62, 117, 255, 59, 62, 117, 255, 73, 78, 146, 255, 80, 85, 160, 255,
6, 4, 6, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255,
31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 1, 1, 1, 254,
6, 4, 8, 254, 63, 63, 143, 255, 37, 40, 75, 255, 76, 81, 152, 255, 77, 82, 154, 255, 37, 39, 74, 255, 77, 81, 153, 255, 77, 82, 154, 255,
37, 40, 75, 255, 77, 81, 153, 255, 77, 82, 154, 255, 37, 39, 74, 255, 77, 81, 153, 255, 77, 81, 153, 255, 37, 39, 74, 255, 80, 85, 160, 255,
9, 9, 11, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255,
226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 11, 9, 9, 252,
5, 4, 8, 254, 59, 59, 133, 255, 69, 72, 136, 255, 75, 79, 149, 255, 75, 79, 149, 255, 69, 72, 136, 255, 75, 79, 149, 255, 75, 79, 149, 255,
69, 72, 136, 255, 75, 79, 149, 255, 75, 79, 149, 255, 69, 72, 136, 255, 75, 79, 149, 255, 75, 79, 149, 255, 69, 72, 136, 255, 75, 79, 149, 255,
9, 8, 11, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255,
226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 226, 226, 230, 255, 11, 9, 9, 252,
1, 1, 1, 255, 17, 9, 17, 255, 23, 13, 17, 255, 23, 13, 17, 255, 23, 13, 17, 255, 23, 13, 17, 255, 23, 13, 17, 255, 23, 13, 17, 255,
23, 13, 17, 255, 23, 13, 17, 255, 23, 13, 17, 255, 23, 13, 17, 255, 23, 13, 17, 255, 23, 13, 17, 255, 23, 13, 17, 255, 23, 13, 17, 255,
27, 16, 19, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255,
31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 31, 21, 22, 255, 1, 1, 1, 254,
11, 4, 5, 251, 219, 71, 86, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255,
229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255,
229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255,
229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 229, 100, 110, 255, 8, 3, 4, 247,
9, 3, 4, 252, 175, 57, 69, 255, 199, 87, 96, 255, 229, 100, 110, 255, 197, 86, 94, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255,
183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255,
183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255,
183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 183, 80, 88, 255, 6, 3, 3, 249,
3, 3, 3, 255, 61, 58, 59, 255, 91, 76, 79, 255, 238, 201, 207, 255, 81, 69, 71, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255,
63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255,
63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255,
63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 63, 54, 55, 255, 3, 2, 2, 254,
14, 12, 13, 254, 226, 226, 231, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255,
242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255,
242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255,
242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 242, 242, 246, 255, 12, 10, 10, 251,
9, 8, 9, 254, 150, 150, 153, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255,
161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255,
161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255,
161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 161, 161, 164, 255, 8, 7, 7, 253,
4, 2, 2, 254, 89, 46, 51, 255, 91, 45, 49, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255,
92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255,
92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255,
92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 92, 49, 53, 255, 3, 2, 2, 252,
11, 4, 5, 251, 219, 70, 85, 255, 219, 70, 85, 255, 221, 78, 91, 255, 224, 85, 97, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255,
224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255,
224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255,
224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 224, 86, 99, 255, 9, 4, 4, 249,
19, 8, 9, 238, 107, 35, 42, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255,
117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255,
117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255,
117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 117, 37, 45, 255, 107, 35, 42, 255, 19, 8, 9, 238,
0, 0, 0, 36, 0, 0, 0, 115, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119,
0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 119, 0, 0, 0, 115, 0, 0, 0, 35,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
const unsigned char idata_icon[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 191, 191, 4, 69, 144, 162, 88, 67, 143, 160, 189, 67, 142, 160, 234, 67, 142, 160, 226, 68, 142, 160, 122, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, const unsigned char idata_icon[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 191, 191, 4, 69, 144, 162, 88, 67, 143, 160, 189, 67, 142, 160, 234, 67, 142, 160, 226, 68, 142, 160, 122, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 146, 165, 40, 67, 143, 160, 196, 67, 142, 160, 254, 67, 142, 160, 255, 67, 142, 160, 255, 67, 142, 160, 255, 67, 142, 160, 253, 71, 142, 163, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 146, 165, 40, 67, 143, 160, 196, 67, 142, 160, 254, 67, 142, 160, 255, 67, 142, 160, 255, 67, 142, 160, 255, 67, 142, 160, 253, 71, 142, 163, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 142, 163, 75, 67, 142, 160, 238, 67, 142, 160, 255, 67, 142, 160, 255, 67, 142, 160, 255, 67, 142, 160, 255, 67, 142, 160, 255, 67, 142, 160, 255, 70, 143, 162, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 142, 163, 75, 67, 142, 160, 238, 67, 142, 160, 255, 67, 142, 160, 255, 67, 142, 160, 255, 67, 142, 160, 255, 67, 142, 160, 255, 67, 142, 160, 255, 70, 143, 162, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

View File

@ -8,6 +8,9 @@
#ifndef IMAGE_H_ #ifndef IMAGE_H_
#define IMAGE_H_ #define IMAGE_H_
extern const unsigned char empty_keyboard[];
extern const unsigned char ru_keyboard[];
extern const unsigned char us_keyboard[];
extern const unsigned char idata_head[]; extern const unsigned char idata_head[];
extern const unsigned char idata_icon[]; extern const unsigned char idata_icon[];

View File

@ -0,0 +1,53 @@
/*
* keylang.c
*
* Created on: 17 февр. 2023 г.
* Author: alexander
*/
#include "keylang.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/XKBlib.h>
#include <X11/extensions/XKBrules.h>
/*
* 0 - unknown
* 1 - us
* 2 - ru
*/
int getKeyboardLanguage()
{
Display *dpy = XOpenDisplay(NULL);
XkbStateRec state;
XkbGetState(dpy, XkbUseCoreKbd, &state);
XkbRF_VarDefsRec vd;
XkbRF_GetNamesProp(dpy, NULL, &vd);
int length = strlen(vd.layout) + 1;
char *current = (char *)malloc(sizeof(char) * length);
strncpy(current, vd.layout, length);
current[length] = '\0';
XCloseDisplay(dpy);
char *lang = strtok(current, ",");
for (int i = 0; i < state.group; i++)
lang = strtok(NULL, ",");
int langcode = 0;
if (!strcmp(lang, "us")) langcode = 1;
if (!strcmp(lang, "ru")) langcode = 2;
free(current);
return langcode;
}

View File

@ -0,0 +1,13 @@
/*
* keylang.h
*
* Created on: 17 февр. 2023 г.
* Author: alexander
*/
#ifndef CLIENT_X11_CLI_KEYLANG_H_
#define CLIENT_X11_CLI_KEYLANG_H_
int getKeyboardLanguage();
#endif /* CLIENT_X11_CLI_KEYLANG_H_ */

View File

@ -363,15 +363,41 @@ static Ihandle* settingsBoxMonitor()
static Ihandle* settingsBoxAbout() static Ihandle* settingsBoxAbout()
{ {
Ihandle *inputAbout; Ihandle *inputAbout, *formattag;
inputAbout = IupText(NULL); inputAbout = IupText(NULL);
formattag = IupUser();
IupSetAttribute(formattag, "ALIGNMENT", "CENTER");
IupSetAttribute(formattag, "SELECTION", "1,1:7,50");
IupSetAttribute(inputAbout, "ADDFORMATTAG_HANDLE", (char*)formattag);
formattag = IupUser();
IupSetAttribute(formattag, "WEIGHT", "BOLD");
IupSetAttribute(formattag, "SELECTION", "1,1:1,20");
IupSetAttribute(inputAbout, "ADDFORMATTAG_HANDLE", (char*)formattag);
formattag = IupUser();
IupSetAttribute(formattag, "FONTSIZE", "11");
IupSetAttribute(formattag, "SELECTION", "1,1:1,20");
IupSetAttribute(inputAbout, "ADDFORMATTAG_HANDLE", (char*)formattag);
formattag = IupUser();
IupSetAttribute(formattag, "FGCOLOR", "0 0 255");
IupSetAttribute(formattag, "SELECTION", "5,1:5,100");
IupSetAttribute(inputAbout, "ADDFORMATTAG_HANDLE", (char*)formattag);
formattag = IupUser();
IupSetAttribute(formattag, "WEIGHT", "BOLD");
IupSetAttribute(formattag, "SELECTION", "6,20:6,100");
IupSetAttribute(inputAbout, "ADDFORMATTAG_HANDLE", (char*)formattag);
IupSetAttribute(inputAbout, "READONLY", "YES"); IupSetAttribute(inputAbout, "READONLY", "YES");
IupSetAttribute(inputAbout, "MULTILINE", "YES"); IupSetAttribute(inputAbout, "MULTILINE", "YES");
IupSetAttribute(inputAbout, "SIZE", "160"); IupSetAttribute(inputAbout, "SIZE", "160");
IupSetAttribute(inputAbout, "VISIBLELINES", "6"); IupSetAttribute(inputAbout, "VISIBLELINES", "6");
IupSetAttribute(inputAbout, "PADDING", "5"); IupSetAttribute(inputAbout, "PADDING", "5");
IupSetAttribute(inputAbout, "FORMATTING", "YES");
IupSetAttribute(inputAbout, "VALUE", getAbout()); IupSetAttribute(inputAbout, "VALUE", getAbout());
return IupSetAttributes(IupFrame(IupHbox(inputAbout, NULL)), "TITLE=\"О программе\", MARGIN=10x10"); return IupSetAttributes(IupFrame(IupHbox(inputAbout, NULL)), "TITLE=\"О программе\", MARGIN=10x10");

View File

@ -1,8 +1,8 @@
diff --git a/client/X11/CMakeLists.txt b/client/X11/CMakeLists.txt diff --git a/client/X11/CMakeLists.txt b/client/X11/CMakeLists.txt
index 869652c..c1fffe4 100644 index 869652c..ab6fe67 100644
--- a/client/X11/CMakeLists.txt --- a/client/X11/CMakeLists.txt
+++ b/client/X11/CMakeLists.txt +++ b/client/X11/CMakeLists.txt
@@ -57,6 +57,38 @@ set(${MODULE_PREFIX}_SRCS @@ -57,6 +57,39 @@ set(${MODULE_PREFIX}_SRCS
xf_client.c xf_client.c
xf_client.h) xf_client.h)
@ -22,6 +22,7 @@ index 869652c..c1fffe4 100644
+ cli/address.c + cli/address.c
+ cli/monitor.c + cli/monitor.c
+ cli/about.c + cli/about.c
+ cli/keylang.c
+ cli/xrdp.c) + cli/xrdp.c)
+ +
+set(IUP_FEATURE_TYPE "REQUIRED") +set(IUP_FEATURE_TYPE "REQUIRED")
@ -41,7 +42,7 @@ index 869652c..c1fffe4 100644
if (CHANNEL_TSMF_CLIENT) if (CHANNEL_TSMF_CLIENT)
set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS}
xf_tsmf.c xf_tsmf.c
@@ -74,7 +106,7 @@ if(WITH_CLIENT_INTERFACE) @@ -74,7 +107,7 @@ if(WITH_CLIENT_INTERFACE)
endif() endif()
else() else()
@ -50,7 +51,7 @@ index 869652c..c1fffe4 100644
add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS})
set_target_properties(${MODULE_NAME} PROPERTIES OUTPUT_NAME "xfreerdp") set_target_properties(${MODULE_NAME} PROPERTIES OUTPUT_NAME "xfreerdp")
include_directories(..) include_directories(..)
@@ -226,13 +258,21 @@ if(WITH_XFIXES) @@ -226,13 +259,33 @@ if(WITH_XFIXES)
set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${XFIXES_LIBRARIES}) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${XFIXES_LIBRARIES})
endif() endif()
@ -61,6 +62,18 @@ index 869652c..c1fffe4 100644
+if(IUP_WITH_SOUND_CHECKBOX) +if(IUP_WITH_SOUND_CHECKBOX)
+ add_definitions(-DIUP_WITH_SOUND_CHECKBOX) + add_definitions(-DIUP_WITH_SOUND_CHECKBOX)
+endif() +endif()
+
+if(IUP_DESCRIPTION_ABOUT_ARCH_X32)
+ add_definitions(-DIUP_DESCRIPTION_ABOUT_ARCH_X32)
+endif()
+
+if(IUP_DESCRIPTION_ABOUT_MIRATORG)
+ add_definitions(-DIUP_DESCRIPTION_ABOUT_MIRATORG)
+endif()
+
+if(IUP_WITH_LANGUAGE_KEYBOARD_ICON)
+ add_definitions(-DIUP_WITH_LANGUAGE_KEYBOARD_ICON)
+endif()
+ +
include_directories(${CMAKE_SOURCE_DIR}/resources) include_directories(${CMAKE_SOURCE_DIR}/resources)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

File diff suppressed because it is too large Load Diff