From 257ceaa170155ff0dab7ed4d56a6cf5860ff95c4 Mon Sep 17 00:00:00 2001
From: nakst <>
Date: Tue, 12 Oct 2021 15:35:32 +0100
Subject: [PATCH] keyboard layout support

---
 LICENSE.md                             |   3 +-
 desktop/api.cpp                        |   3 +
 desktop/desktop.cpp                    |   4 +-
 desktop/gui.cpp                        |  29 ++-
 desktop/list_view.cpp                  |  57 ++++-
 desktop/os.header                      |   5 +-
 desktop/prefix.h                       |   1 +
 desktop/settings.cpp                   | 107 +++++++-
 desktop/text.cpp                       | 136 ++++------
 kernel/windows.cpp                     |   3 +-
 res/Keyboard Layouts/License.txt       | 193 +++++++++++++++
 res/Keyboard Layouts/af.dat            | Bin 0 -> 4618 bytes
 res/Keyboard Layouts/al.dat            | Bin 0 -> 4616 bytes
 res/Keyboard Layouts/am.dat            | Bin 0 -> 4778 bytes
 res/Keyboard Layouts/at.dat            | Bin 0 -> 4672 bytes
 res/Keyboard Layouts/au.dat            | Bin 0 -> 4593 bytes
 res/Keyboard Layouts/az.dat            | Bin 0 -> 4625 bytes
 res/Keyboard Layouts/bd.dat            | Bin 0 -> 4673 bytes
 res/Keyboard Layouts/be.dat            | Bin 0 -> 4641 bytes
 res/Keyboard Layouts/bg.dat            | Bin 0 -> 4770 bytes
 res/Keyboard Layouts/br.dat            | Bin 0 -> 4651 bytes
 res/Keyboard Layouts/bt.dat            | Bin 0 -> 4879 bytes
 res/Keyboard Layouts/bw.dat            | Bin 0 -> 4600 bytes
 res/Keyboard Layouts/by.dat            | Bin 0 -> 4725 bytes
 res/Keyboard Layouts/ca.dat            | Bin 0 -> 4551 bytes
 res/Keyboard Layouts/cd.dat            | Bin 0 -> 4498 bytes
 res/Keyboard Layouts/ch.dat            | Bin 0 -> 4645 bytes
 res/Keyboard Layouts/cm.dat            | Bin 0 -> 4593 bytes
 res/Keyboard Layouts/cn.dat            | Bin 0 -> 4593 bytes
 res/Keyboard Layouts/cz.dat            | Bin 0 -> 4610 bytes
 res/Keyboard Layouts/de.dat            | Bin 0 -> 4672 bytes
 res/Keyboard Layouts/dk.dat            | Bin 0 -> 4637 bytes
 res/Keyboard Layouts/dz.dat            | Bin 0 -> 4797 bytes
 res/Keyboard Layouts/ee.dat            | Bin 0 -> 4656 bytes
 res/Keyboard Layouts/es.dat            | Bin 0 -> 4647 bytes
 res/Keyboard Layouts/et.dat            | Bin 0 -> 4845 bytes
 res/Keyboard Layouts/extract_keymaps.c | 329 +++++++++++++++++++++++++
 res/Keyboard Layouts/fi.dat            | Bin 0 -> 4604 bytes
 res/Keyboard Layouts/fo.dat            | Bin 0 -> 4651 bytes
 res/Keyboard Layouts/fr.dat            | Bin 0 -> 4644 bytes
 res/Keyboard Layouts/gb.dat            | Bin 0 -> 4637 bytes
 res/Keyboard Layouts/ge.dat            | Bin 0 -> 4691 bytes
 res/Keyboard Layouts/gh.dat            | Bin 0 -> 4596 bytes
 res/Keyboard Layouts/gr.dat            | Bin 0 -> 4669 bytes
 res/Keyboard Layouts/hr.dat            | Bin 0 -> 4624 bytes
 res/Keyboard Layouts/hu.dat            | Bin 0 -> 4642 bytes
 res/Keyboard Layouts/id.dat            | Bin 0 -> 4593 bytes
 res/Keyboard Layouts/ie.dat            | Bin 0 -> 4657 bytes
 res/Keyboard Layouts/il.dat            | Bin 0 -> 4549 bytes
 res/Keyboard Layouts/in.dat            | Bin 0 -> 4717 bytes
 res/Keyboard Layouts/index.ini         |  89 +++++++
 res/Keyboard Layouts/iq.dat            | Bin 0 -> 4620 bytes
 res/Keyboard Layouts/ir.dat            | Bin 0 -> 4608 bytes
 res/Keyboard Layouts/is.dat            | Bin 0 -> 4647 bytes
 res/Keyboard Layouts/it.dat            | Bin 0 -> 4657 bytes
 res/Keyboard Layouts/jp.dat            | Bin 0 -> 4593 bytes
 res/Keyboard Layouts/jv.dat            | Bin 0 -> 4958 bytes
 res/Keyboard Layouts/ke.dat            | Bin 0 -> 4600 bytes
 res/Keyboard Layouts/kg.dat            | Bin 0 -> 4741 bytes
 res/Keyboard Layouts/kh.dat            | Bin 0 -> 4849 bytes
 res/Keyboard Layouts/kr.dat            | Bin 0 -> 4593 bytes
 res/Keyboard Layouts/kz.dat            | Bin 0 -> 4741 bytes
 res/Keyboard Layouts/la.dat            | Bin 0 -> 4905 bytes
 res/Keyboard Layouts/lk.dat            | Bin 0 -> 4716 bytes
 res/Keyboard Layouts/lt.dat            | Bin 0 -> 4649 bytes
 res/Keyboard Layouts/lv.dat            | Bin 0 -> 4660 bytes
 res/Keyboard Layouts/md.dat            | Bin 0 -> 4571 bytes
 res/Keyboard Layouts/me.dat            | Bin 0 -> 4630 bytes
 res/Keyboard Layouts/mk.dat            | Bin 0 -> 4721 bytes
 res/Keyboard Layouts/ml.dat            | Bin 0 -> 4646 bytes
 res/Keyboard Layouts/mm.dat            | Bin 0 -> 4755 bytes
 res/Keyboard Layouts/mn.dat            | Bin 0 -> 4625 bytes
 res/Keyboard Layouts/mt.dat            | Bin 0 -> 4645 bytes
 res/Keyboard Layouts/mv.dat            | Bin 0 -> 4704 bytes
 res/Keyboard Layouts/my.dat            | Bin 0 -> 4673 bytes
 res/Keyboard Layouts/ng.dat            | Bin 0 -> 4596 bytes
 res/Keyboard Layouts/nl.dat            | Bin 0 -> 4643 bytes
 res/Keyboard Layouts/no.dat            | Bin 0 -> 4654 bytes
 res/Keyboard Layouts/np.dat            | Bin 0 -> 4909 bytes
 res/Keyboard Layouts/ph.dat            | Bin 0 -> 4618 bytes
 res/Keyboard Layouts/pk.dat            | Bin 0 -> 4688 bytes
 res/Keyboard Layouts/pl.dat            | Bin 0 -> 4668 bytes
 res/Keyboard Layouts/pt.dat            | Bin 0 -> 4634 bytes
 res/Keyboard Layouts/ro.dat            | Bin 0 -> 4571 bytes
 res/Keyboard Layouts/rs.dat            | Bin 0 -> 4649 bytes
 res/Keyboard Layouts/ru.dat            | Bin 0 -> 4729 bytes
 res/Keyboard Layouts/se.dat            | Bin 0 -> 4654 bytes
 res/Keyboard Layouts/si.dat            | Bin 0 -> 4634 bytes
 res/Keyboard Layouts/sk.dat            | Bin 0 -> 4616 bytes
 res/Keyboard Layouts/sn.dat            | Bin 0 -> 4669 bytes
 res/Keyboard Layouts/sy.dat            | Bin 0 -> 4620 bytes
 res/Keyboard Layouts/tg.dat            | Bin 0 -> 4593 bytes
 res/Keyboard Layouts/th.dat            | Bin 0 -> 4925 bytes
 res/Keyboard Layouts/tj.dat            | Bin 0 -> 4727 bytes
 res/Keyboard Layouts/tr.dat            | Bin 0 -> 4591 bytes
 res/Keyboard Layouts/tw.dat            | Bin 0 -> 4621 bytes
 res/Keyboard Layouts/tz.dat            | Bin 0 -> 4661 bytes
 res/Keyboard Layouts/ua.dat            | Bin 0 -> 4732 bytes
 res/Keyboard Layouts/us.dat            | Bin 0 -> 4593 bytes
 res/Keyboard Layouts/uz.dat            | Bin 0 -> 4737 bytes
 res/Keyboard Layouts/vn.dat            | Bin 0 -> 4620 bytes
 res/Keyboard Layouts/za.dat            | Bin 0 -> 4636 bytes
 res/Theme Source.dat                   | Bin 513504 -> 515268 bytes
 res/Theme.dat                          | Bin 28956 -> 28956 bytes
 shared/strings.cpp                     |   1 +
 util/build_core.c                      |  17 ++
 util/designer2.cpp                     |   1 +
 107 files changed, 861 insertions(+), 117 deletions(-)
 create mode 100644 res/Keyboard Layouts/License.txt
 create mode 100644 res/Keyboard Layouts/af.dat
 create mode 100644 res/Keyboard Layouts/al.dat
 create mode 100644 res/Keyboard Layouts/am.dat
 create mode 100644 res/Keyboard Layouts/at.dat
 create mode 100644 res/Keyboard Layouts/au.dat
 create mode 100644 res/Keyboard Layouts/az.dat
 create mode 100644 res/Keyboard Layouts/bd.dat
 create mode 100644 res/Keyboard Layouts/be.dat
 create mode 100644 res/Keyboard Layouts/bg.dat
 create mode 100644 res/Keyboard Layouts/br.dat
 create mode 100644 res/Keyboard Layouts/bt.dat
 create mode 100644 res/Keyboard Layouts/bw.dat
 create mode 100644 res/Keyboard Layouts/by.dat
 create mode 100644 res/Keyboard Layouts/ca.dat
 create mode 100644 res/Keyboard Layouts/cd.dat
 create mode 100644 res/Keyboard Layouts/ch.dat
 create mode 100644 res/Keyboard Layouts/cm.dat
 create mode 100644 res/Keyboard Layouts/cn.dat
 create mode 100644 res/Keyboard Layouts/cz.dat
 create mode 100644 res/Keyboard Layouts/de.dat
 create mode 100644 res/Keyboard Layouts/dk.dat
 create mode 100644 res/Keyboard Layouts/dz.dat
 create mode 100644 res/Keyboard Layouts/ee.dat
 create mode 100644 res/Keyboard Layouts/es.dat
 create mode 100644 res/Keyboard Layouts/et.dat
 create mode 100644 res/Keyboard Layouts/extract_keymaps.c
 create mode 100644 res/Keyboard Layouts/fi.dat
 create mode 100644 res/Keyboard Layouts/fo.dat
 create mode 100644 res/Keyboard Layouts/fr.dat
 create mode 100644 res/Keyboard Layouts/gb.dat
 create mode 100644 res/Keyboard Layouts/ge.dat
 create mode 100644 res/Keyboard Layouts/gh.dat
 create mode 100644 res/Keyboard Layouts/gr.dat
 create mode 100644 res/Keyboard Layouts/hr.dat
 create mode 100644 res/Keyboard Layouts/hu.dat
 create mode 100644 res/Keyboard Layouts/id.dat
 create mode 100644 res/Keyboard Layouts/ie.dat
 create mode 100644 res/Keyboard Layouts/il.dat
 create mode 100644 res/Keyboard Layouts/in.dat
 create mode 100644 res/Keyboard Layouts/index.ini
 create mode 100644 res/Keyboard Layouts/iq.dat
 create mode 100644 res/Keyboard Layouts/ir.dat
 create mode 100644 res/Keyboard Layouts/is.dat
 create mode 100644 res/Keyboard Layouts/it.dat
 create mode 100644 res/Keyboard Layouts/jp.dat
 create mode 100644 res/Keyboard Layouts/jv.dat
 create mode 100644 res/Keyboard Layouts/ke.dat
 create mode 100644 res/Keyboard Layouts/kg.dat
 create mode 100644 res/Keyboard Layouts/kh.dat
 create mode 100644 res/Keyboard Layouts/kr.dat
 create mode 100644 res/Keyboard Layouts/kz.dat
 create mode 100644 res/Keyboard Layouts/la.dat
 create mode 100644 res/Keyboard Layouts/lk.dat
 create mode 100644 res/Keyboard Layouts/lt.dat
 create mode 100644 res/Keyboard Layouts/lv.dat
 create mode 100644 res/Keyboard Layouts/md.dat
 create mode 100644 res/Keyboard Layouts/me.dat
 create mode 100644 res/Keyboard Layouts/mk.dat
 create mode 100644 res/Keyboard Layouts/ml.dat
 create mode 100644 res/Keyboard Layouts/mm.dat
 create mode 100644 res/Keyboard Layouts/mn.dat
 create mode 100644 res/Keyboard Layouts/mt.dat
 create mode 100644 res/Keyboard Layouts/mv.dat
 create mode 100644 res/Keyboard Layouts/my.dat
 create mode 100644 res/Keyboard Layouts/ng.dat
 create mode 100644 res/Keyboard Layouts/nl.dat
 create mode 100644 res/Keyboard Layouts/no.dat
 create mode 100644 res/Keyboard Layouts/np.dat
 create mode 100644 res/Keyboard Layouts/ph.dat
 create mode 100644 res/Keyboard Layouts/pk.dat
 create mode 100644 res/Keyboard Layouts/pl.dat
 create mode 100644 res/Keyboard Layouts/pt.dat
 create mode 100644 res/Keyboard Layouts/ro.dat
 create mode 100644 res/Keyboard Layouts/rs.dat
 create mode 100644 res/Keyboard Layouts/ru.dat
 create mode 100644 res/Keyboard Layouts/se.dat
 create mode 100644 res/Keyboard Layouts/si.dat
 create mode 100644 res/Keyboard Layouts/sk.dat
 create mode 100644 res/Keyboard Layouts/sn.dat
 create mode 100644 res/Keyboard Layouts/sy.dat
 create mode 100644 res/Keyboard Layouts/tg.dat
 create mode 100644 res/Keyboard Layouts/th.dat
 create mode 100644 res/Keyboard Layouts/tj.dat
 create mode 100644 res/Keyboard Layouts/tr.dat
 create mode 100644 res/Keyboard Layouts/tw.dat
 create mode 100644 res/Keyboard Layouts/tz.dat
 create mode 100644 res/Keyboard Layouts/ua.dat
 create mode 100644 res/Keyboard Layouts/us.dat
 create mode 100644 res/Keyboard Layouts/uz.dat
 create mode 100644 res/Keyboard Layouts/vn.dat
 create mode 100644 res/Keyboard Layouts/za.dat

diff --git a/LICENSE.md b/LICENSE.md
index 3ae1225..e73c4eb 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -28,6 +28,7 @@ They licenses may be found in the following files:
 	- shared/stb_image.h, shared/stb_sprintf.h, shared/stb_ds.h and util/stb_truetype.h
 	- res/Fonts/Hack License.txt, res/Fonts/Inter License.txt
 	- res/Icons/elementary Icons License.txt
-	- res/Media/Licenses.txt
+	- res/Sample Images/Licenses.txt
+	- res/Keyboard Layouts/License.txt
 	- Ported applications have their licenses in their respective folders.
 Please tell me if I've forgotten something!
diff --git a/desktop/api.cpp b/desktop/api.cpp
index e401d4c..2ebf0e1 100644
--- a/desktop/api.cpp
+++ b/desktop/api.cpp
@@ -156,6 +156,9 @@ struct {
 	Array<Work> workQueue;
 	Array<EsHandle> workThreads;
 	volatile bool workFinish;
+
+	const uint16_t *keyboardLayout;
+	uint16_t keyboardLayoutIdentifier;
 } api;
 
 ptrdiff_t tlsStorageOffset;
diff --git a/desktop/desktop.cpp b/desktop/desktop.cpp
index acabb23..ae556e3 100644
--- a/desktop/desktop.cpp
+++ b/desktop/desktop.cpp
@@ -606,7 +606,7 @@ int ProcessGlobalKeyboardShortcuts(EsElement *, EsMessage *message) {
 		// Do not process global keyboard shortcuts if the installer is running.
 	} else if (message->type == ES_MSG_KEY_DOWN) {
 		bool ctrlOnly = message->keyboard.modifiers == ES_MODIFIER_CTRL;
-		int scancode = message->keyboard.scancode;
+		int scancode = ScancodeMapToLabel(message->keyboard.scancode);
 
 		if (ctrlOnly && scancode == ES_SCANCODE_N && !message->keyboard.repeat) {
 			ApplicationInstanceCreate(APPLICATION_ID_DESKTOP_BLANK_TAB, nullptr, nullptr);
@@ -651,7 +651,7 @@ int ContainerWindowMessage(EsElement *element, EsMessage *message) {
 		container->taskBarButton->MaybeRefreshStyle();
 	} else if (message->type == ES_MSG_KEY_DOWN) {
 		bool ctrlOnly = message->keyboard.modifiers == ES_MODIFIER_CTRL;
-		int scancode = message->keyboard.scancode;
+		int scancode = ScancodeMapToLabel(message->keyboard.scancode);
 
 		if (((message->keyboard.modifiers & ~ES_MODIFIER_SHIFT) == ES_MODIFIER_CTRL) && message->keyboard.scancode == ES_SCANCODE_TAB) {
 			int tab = -1;
diff --git a/desktop/gui.cpp b/desktop/gui.cpp
index 227b299..bdc93fb 100644
--- a/desktop/gui.cpp
+++ b/desktop/gui.cpp
@@ -343,7 +343,7 @@ struct ScrollPane {
 	void Setup(EsElement *parent, uint8_t xMode, uint8_t yMode, uint16_t flags);
 	void SetPosition(int axis, double newPosition, bool sendMovedMessage = true);
 	void Refresh();
-	void ReceivedMessage(EsMessage *message);
+	int ReceivedMessage(EsMessage *message);
 
 	inline void SetX(double scrollX, bool sendMovedMessage = true) { SetPosition(0, scrollX, sendMovedMessage); }
 	inline void SetY(double scrollY, bool sendMovedMessage = true) { SetPosition(1, scrollY, sendMovedMessage); }
@@ -2840,7 +2840,7 @@ void ScrollPane::Setup(EsElement *_parent, uint8_t _xMode, uint8_t _yMode, uint1
 	}
 }
 
-void ScrollPane::ReceivedMessage(EsMessage *message) {
+int ScrollPane::ReceivedMessage(EsMessage *message) {
 	if (message->type == ES_MSG_LAYOUT) {
 		Refresh();
 	} else if (message->type == ES_MSG_MOUSE_LEFT_DRAG || message->type == ES_MSG_MOUSE_RIGHT_DRAG || message->type == ES_MSG_MOUSE_MIDDLE_DRAG) {
@@ -2884,7 +2884,11 @@ void ScrollPane::ReceivedMessage(EsMessage *message) {
 	} else if (message->type == ES_MSG_SCROLL_WHEEL) {
 		SetPosition(0, position[0] + 60 * message->scrollWheel.dx / ES_SCROLL_WHEEL_NOTCH, true);
 		SetPosition(1, position[1] - 60 * message->scrollWheel.dy / ES_SCROLL_WHEEL_NOTCH, true);
+		if (message->scrollWheel.dx && mode[0]) return ES_HANDLED;
+		if (message->scrollWheel.dy && mode[1]) return ES_HANDLED;
 	}
+
+	return 0;
 }
 
 void ScrollPane::SetPosition(int axis, double newScroll, bool sendMovedMessage) {
@@ -2990,7 +2994,7 @@ struct EsScrollView : EsElement { ScrollPane scroll; };
 void EsScrollViewSetup(EsScrollView *view, uint8_t xMode, uint8_t yMode, uint16_t flags) { view->scroll.Setup(view, xMode, yMode, flags); }
 void EsScrollViewSetPosition(EsScrollView *view, int axis, double newPosition, bool notify) { view->scroll.SetPosition(axis, newPosition, notify); }
 void EsScrollViewRefresh(EsScrollView *view) { view->scroll.Refresh(); }
-void EsScrollViewReceivedMessage(EsScrollView *view, EsMessage *message) { view->scroll.ReceivedMessage(message); }
+int EsScrollViewReceivedMessage(EsScrollView *view, EsMessage *message) { return view->scroll.ReceivedMessage(message); }
 int64_t EsScrollViewGetPosition(EsScrollView *view, int axis) { return view->scroll.position[axis]; }
 int64_t EsScrollViewGetLimit(EsScrollView *view, int axis) { return view->scroll.limit[axis]; }
 void EsScrollViewSetFixedViewport(EsScrollView *view, int axis, int32_t value) { view->scroll.fixedViewport[axis] = value; }
@@ -3048,7 +3052,8 @@ int ProcessPanelMessage(EsElement *element, EsMessage *message) {
 	EsPanel *panel = (EsPanel *) element;
 	EsRectangle bounds = panel->GetBounds();
 
-	panel->scroll.ReceivedMessage(message);
+	int response = panel->scroll.ReceivedMessage(message);
+	if (response) return response;
 
 	if (message->type == ES_MSG_LAYOUT) {
 		if (panel->flags & ES_PANEL_TABLE) {
@@ -3748,7 +3753,8 @@ EsElement *CanvasPaneGetCanvas(EsElement *element) {
 int ProcessCanvasPaneMessage(EsElement *element, EsMessage *message) {
 	EsCanvasPane *pane = (EsCanvasPane *) element;
 
-	pane->scroll.ReceivedMessage(message);
+	int response = pane->scroll.ReceivedMessage(message);
+	if (response) return response;
 
 	if (message->type == ES_MSG_LAYOUT) {
 		EsElement *canvas = CanvasPaneGetCanvas(element);
@@ -6879,9 +6885,10 @@ void AccessKeyModeHandleKeyPress(EsMessage *message) {
 
 	EsWindow *window = gui.accessKeys.window;
 
-	int ic, isc;
-	ConvertScancodeToCharacter(message->keyboard.scancode, &ic, &isc, false, false);
-	ic = EsCRTtoupper(ic);
+	const char *inputString = KeyboardLayoutLookup(message->keyboard.scancode, 
+			message->keyboard.modifiers & ES_MODIFIER_SHIFT, message->keyboard.modifiers & ES_MODIFIER_ALT_GR, 
+			false, false);
+	int ic = EsCRTtoupper(inputString ? *inputString : 0);
 
 	bool keepAccessKeyModeActive = false;
 	bool regatherKeys = false;
@@ -6945,7 +6952,7 @@ bool UIHandleKeyMessage(EsWindow *window, EsMessage *message) {
 		if (message->keyboard.scancode == ES_SCANCODE_LEFT_SHIFT ) gui.leftModifiers  &= ~ES_MODIFIER_SHIFT;
 		if (message->keyboard.scancode == ES_SCANCODE_LEFT_FLAG  ) gui.leftModifiers  &= ~ES_MODIFIER_FLAG;
 		if (message->keyboard.scancode == ES_SCANCODE_RIGHT_CTRL ) gui.rightModifiers &= ~ES_MODIFIER_CTRL;
-		if (message->keyboard.scancode == ES_SCANCODE_RIGHT_ALT  ) gui.rightModifiers &= ~ES_MODIFIER_ALT;
+		if (message->keyboard.scancode == ES_SCANCODE_RIGHT_ALT  ) gui.rightModifiers &= ~ES_MODIFIER_ALT_GR;
 		if (message->keyboard.scancode == ES_SCANCODE_RIGHT_SHIFT) gui.rightModifiers &= ~ES_MODIFIER_SHIFT;
 		if (message->keyboard.scancode == ES_SCANCODE_RIGHT_FLAG ) gui.rightModifiers &= ~ES_MODIFIER_FLAG;
 
@@ -6973,7 +6980,7 @@ bool UIHandleKeyMessage(EsWindow *window, EsMessage *message) {
 	if (message->keyboard.scancode == ES_SCANCODE_LEFT_SHIFT ) gui.leftModifiers  |= ES_MODIFIER_SHIFT;
 	if (message->keyboard.scancode == ES_SCANCODE_LEFT_FLAG  ) gui.leftModifiers  |= ES_MODIFIER_FLAG;
 	if (message->keyboard.scancode == ES_SCANCODE_RIGHT_CTRL ) gui.rightModifiers |= ES_MODIFIER_CTRL;
-	if (message->keyboard.scancode == ES_SCANCODE_RIGHT_ALT  ) gui.rightModifiers |= ES_MODIFIER_ALT;
+	if (message->keyboard.scancode == ES_SCANCODE_RIGHT_ALT  ) gui.rightModifiers |= ES_MODIFIER_ALT_GR;
 	if (message->keyboard.scancode == ES_SCANCODE_RIGHT_SHIFT) gui.rightModifiers |= ES_MODIFIER_SHIFT;
 	if (message->keyboard.scancode == ES_SCANCODE_RIGHT_FLAG ) gui.rightModifiers |= ES_MODIFIER_FLAG;
 
@@ -7065,7 +7072,7 @@ bool UIHandleKeyMessage(EsWindow *window, EsMessage *message) {
 		// TODO Sort out what commands can be used from within dialogs and menus.
 
 		if (!gui.keyboardShortcutNames.itemCount) UIInitialiseKeyboardShortcutNamesTable();
-		const char *shortcutName = (const char *) HashTableGetShort(&gui.keyboardShortcutNames, message->keyboard.scancode);
+		const char *shortcutName = (const char *) HashTableGetShort(&gui.keyboardShortcutNames, ScancodeMapToLabel(message->keyboard.scancode));
 
 		if (shortcutName && window->instance && window->instance->_private) {
 			APIInstance *instance = (APIInstance *) window->instance->_private;
diff --git a/desktop/list_view.cpp b/desktop/list_view.cpp
index 6a84a19..26701e4 100644
--- a/desktop/list_view.cpp
+++ b/desktop/list_view.cpp
@@ -95,6 +95,11 @@ struct EsListView : EsElement {
 
 	int maximumItemsPerBand;
 
+	EsListViewIndex ensureVisibleGroupIndex;
+	EsListViewIndex ensureVisibleIndex;
+	uint8_t ensureVisibleAlign;
+	bool ensureVisibleQueued;
+
 	// Fixed item storage:
 	Array<ListViewFixedItem> fixedItems;
 	ptrdiff_t fixedItemSelection;
@@ -300,7 +305,15 @@ struct EsListView : EsElement {
 		*_itemSize = itemSize;
 	}
 
-	void EnsureItemVisible(EsListViewIndex groupIndex, EsListViewIndex index, bool alignTop) {
+	void EnsureItemVisible(EsListViewIndex groupIndex, EsListViewIndex index, uint8_t align) {
+		ensureVisibleQueued = true;
+		ensureVisibleGroupIndex = groupIndex;
+		ensureVisibleIndex = index;
+		ensureVisibleAlign = align;
+		EsElementRelayout(this);
+	}
+
+	void _EnsureItemVisible(EsListViewIndex groupIndex, EsListViewIndex index, uint8_t align) {
 		EsRectangle contentBounds = GetListBounds();
 
 		int64_t startInset = flags & ES_LIST_VIEW_HORIZONTAL ? style->insets.l : style->insets.t,
@@ -314,12 +327,18 @@ struct EsListView : EsElement {
 			return;
 		}
 
-		if (alignTop) {
+		if (align == 1) {
 			if (flags & ES_LIST_VIEW_HORIZONTAL) {
 				scroll.SetX(scroll.position[0] + position - startInset);
 			} else {
 				scroll.SetY(scroll.position[1] + position - startInset);
 			}
+		} else if (align == 2) {
+			if (flags & ES_LIST_VIEW_HORIZONTAL) {
+				scroll.SetX(scroll.position[0] + position + itemSize / 2 - contentSize / 2);
+			} else {
+				scroll.SetY(scroll.position[1] + position + itemSize / 2 - contentSize / 2);
+			}
 		} else {
 			if (flags & ES_LIST_VIEW_HORIZONTAL) {
 				scroll.SetX(scroll.position[0] + position + itemSize - contentSize + endInset);
@@ -1491,15 +1510,15 @@ struct EsListView : EsElement {
 			}
 
 			StartAnimating();
-			searchBufferLastKeyTime = currentTime;
-			int ic, isc;
-			ConvertScancodeToCharacter(scancode, &ic, &isc, false, false);
-			int character = shift ? isc : ic;
 
-			if (character != -1 && searchBufferBytes + 4 < sizeof(searchBuffer)) {
-				utf8_encode(character, searchBuffer + searchBufferBytes);
+			const char *inputString = KeyboardLayoutLookup(scancode, shift, false, false, false);
+			size_t inputStringBytes = EsCStringLength(inputString);
+
+			if (inputString && searchBufferBytes + inputStringBytes < sizeof(searchBuffer)) {
+				searchBufferLastKeyTime = currentTime;
+				EsMemoryCopy(searchBuffer + searchBufferBytes, inputString, inputStringBytes);
 				size_t previousSearchBufferBytes = searchBufferBytes;
-				searchBufferBytes += utf8_length_char(searchBuffer + searchBufferBytes);
+				searchBufferBytes += inputStringBytes;
 				if (!Search()) searchBufferBytes = previousSearchBufferBytes;
 				return true;
 			}
@@ -1574,7 +1593,8 @@ struct EsListView : EsElement {
 	}
 
 	int ProcessMessage(EsMessage *message) {
-		scroll.ReceivedMessage(message);
+		int response = scroll.ReceivedMessage(message);
+		if (response) return response;
 
 		if (message->type == ES_MSG_GET_WIDTH || message->type == ES_MSG_GET_HEIGHT) {
 			if (flags & ES_LIST_VIEW_HORIZONTAL) {
@@ -1590,6 +1610,13 @@ struct EsListView : EsElement {
 		} else if (message->type == ES_MSG_LAYOUT) {
 			firstLayout = true;
 			Wrap(message->layout.sizeChanged);
+
+			if (ensureVisibleQueued) {
+				ensureVisibleQueued = false;
+				_EnsureItemVisible(ensureVisibleGroupIndex, ensureVisibleIndex, ensureVisibleAlign);
+				// TODO _EnsureItemVisible may call Populate; if this happens, we don't need to call it below.
+			}
+
 			Populate();
 
 			if (columnHeader) {
@@ -2432,7 +2459,15 @@ bool EsListViewFixedItemSelect(EsListView *view, EsGeneric data) {
 	EsMessageMutexCheck();
 	EsListViewIndex index;
 	bool found = EsListViewFixedItemFindIndex(view, data, &index);
-	if (found) EsListViewSelect(view, 0, index);
+
+	if (found) {
+		EsListViewSelect(view, 0, index);
+
+		// TODO Maybe you should have to separately call EsListViewFocusItem to get this behaviour.
+		EsListViewFocusItem(view, 0, index);
+		view->EnsureItemVisible(0, index, 2 /* center */);
+	}
+
 	return found;
 }
 
diff --git a/desktop/os.header b/desktop/os.header
index bf8d5fa..5f5e955 100644
--- a/desktop/os.header
+++ b/desktop/os.header
@@ -707,6 +707,7 @@ define ES_MODIFIER_CTRL		(1 << 0)
 define ES_MODIFIER_SHIFT	(1 << 1)
 define ES_MODIFIER_ALT		(1 << 2)
 define ES_MODIFIER_FLAG		(1 << 3)
+define ES_MODIFIER_ALT_GR	(1 << 4)
 
 define ES_PROCESS_CREATE_PAUSED (1 << 0)
 
@@ -1556,7 +1557,7 @@ struct EsMessageMouseButton {
 };
 
 struct EsMessageKeyboard {
-	uint32_t scancode; 
+	uint16_t scancode; 
 	uint8_t modifiers;
 	bool repeat, numpad, numlock, single;
 };
@@ -2419,7 +2420,7 @@ function EsRectangle EsElementGetScreenBounds(EsElement *element, bool client =
 function EsElement *EsCustomElementCreate(EsElement *parent, uint64_t flags = ES_FLAGS_DEFAULT, const EsStyle *style = ES_NULL);
 function EsScrollView *EsCustomScrollViewCreate(EsElement *parent, uint64_t flags = ES_FLAGS_DEFAULT, const EsStyle *style = ES_NULL);
 
-function void EsScrollViewReceivedMessage(EsScrollView *view, EsMessage *message); // You *must* call this *before* handling any messages.
+function int EsScrollViewReceivedMessage(EsScrollView *view, EsMessage *message); // You *must* call this *before* handling any messages. If this returns non-zero, immediately return that value from your message handler.
 function void EsScrollViewSetup(EsScrollView *view, uint8_t xMode, uint8_t yMode, uint16_t flags);
 function void EsScrollViewSetPosition(EsScrollView *view, int axis, double newPosition, bool sendMovedMessage = true);
 function void EsScrollViewRefresh(EsScrollView *view);
diff --git a/desktop/prefix.h b/desktop/prefix.h
index a01a35d..c6265a0 100644
--- a/desktop/prefix.h
+++ b/desktop/prefix.h
@@ -289,6 +289,7 @@ struct GlobalData {
 	volatile float animationTimeMultiplier;
 	volatile uint64_t schedulerTimeMs;
 	volatile uint64_t schedulerTimeOffset;
+	volatile uint16_t keyboardLayout;
 };
 
 #ifdef KERNEL
diff --git a/desktop/settings.cpp b/desktop/settings.cpp
index 53e4c46..80b17c7 100644
--- a/desktop/settings.cpp
+++ b/desktop/settings.cpp
@@ -17,9 +17,11 @@ struct SettingsControl {
 #define SETTINGS_CONTROL_CHECKBOX (1)
 #define SETTINGS_CONTROL_NUMBER (2)
 #define SETTINGS_CONTROL_SLIDER (3)
+#define SETTINGS_CONTROL_CHOICE_LIST (4)
 	uint8_t type;
 	bool originalValueBool;
 	int32_t originalValueInt;
+	EsGeneric originalValueData;
 	int32_t minimumValue, maximumValue;
 	uint32_t steps;
 	double dragSpeed, dragValue, discreteStep;
@@ -193,6 +195,7 @@ void SettingsLoadDefaults() {
 	SettingsPutValue("general", "use_smart_quotes", EsLiteral("1"), nullptr, nullptr, true, false);
 	SettingsPutValue("general", "enable_hover_state", EsLiteral("1"), nullptr, nullptr, true, false);
 	SettingsPutValue("general", "enable_animations", EsLiteral("1"), nullptr, nullptr, true, false);
+	SettingsPutValue("general", "keyboard_layout", EsLiteral("us"), nullptr, nullptr, true, false);
 	SettingsPutValue("paths", "default_user_documents", EsLiteral("0:/"), nullptr, nullptr, true, false);
 }
 
@@ -204,6 +207,11 @@ void SettingsUpdateGlobalAndWindowManager() {
 	api.global->enableHoverState = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("enable_hover_state"));
 	api.global->animationTimeMultiplier = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("enable_animations")) ? 1.0f : 0.0f;
 
+	size_t keyboardLayoutBytes;
+	char *keyboardLayout = EsSystemConfigurationReadString(EsLiteral("general"), EsLiteral("keyboard_layout"), &keyboardLayoutBytes);
+	api.global->keyboardLayout = keyboardLayout && keyboardLayoutBytes == 2 ? (keyboardLayout[0] | ((uint16_t) keyboardLayout[1] << 8)) : 1;
+	EsHeapFree(keyboardLayout);
+
 	{
 		float newUIScale = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("ui_scale")) * 0.01f;
 		bool changed = api.global->uiScale != newUIScale && api.global->uiScale;
@@ -289,6 +297,8 @@ void SettingsUndoButton(EsInstance *_instance, EsElement *, EsCommand *) {
 			SettingsNumberBoxSetValue(control->element, control->originalValueInt);
 		} else if (control->type == SETTINGS_CONTROL_SLIDER) {
 			EsSliderSetValue((EsSlider *) control->element, LinearMap(control->minimumValue, control->maximumValue, 0, 1, control->originalValueInt), true);
+		} else if (control->type == SETTINGS_CONTROL_CHOICE_LIST) {
+			EsListViewFixedItemSelect((EsListView *) control->element, control->originalValueData);
 		}
 	}
 
@@ -496,6 +506,65 @@ void SettingsAddSlider(EsElement *table, const char *string, ptrdiff_t stringByt
 	instance->controls.Add(control);
 }
 
+int SettingsChoiceListMessage(EsElement *element, EsMessage *message) {
+	EsListView *list = (EsListView *) element;
+	SettingsInstance *instance = (SettingsInstance *) list->instance;
+	SettingsControl *control = (SettingsControl *) list->userData.p;
+
+	if (message->type == ES_MSG_LIST_VIEW_SELECT) {
+		EsGeneric _newValue;
+
+		if (EsListViewFixedItemGetSelected(((EsListView *) element), &_newValue)) {
+			EsMutexAcquire(&api.systemConfigurationMutex);
+
+			const char *newValue = (const char *) _newValue.p;
+			size_t newValueBytes = 0;
+			while (newValue[newValueBytes] && newValue[newValueBytes] != '=') newValueBytes++;
+
+			char *value = (char *) EsHeapAllocate(newValueBytes, false), *_oldValue;
+			EsMemoryCopy(value, newValue, newValueBytes);
+			size_t _oldValueBytes;
+			bool changed = true;
+
+			if (SettingsPutValue(control->cConfigurationSection, control->cConfigurationKey, value, newValueBytes, 
+						&_oldValue, &_oldValueBytes, false, true)) {
+				changed = _oldValueBytes != newValueBytes || EsMemoryCompare(_oldValue, newValue, newValueBytes);
+				EsHeapFree(_oldValue);
+			}
+
+			EsMutexRelease(&api.systemConfigurationMutex);
+
+			if (changed) {
+				SettingsUpdateGlobalAndWindowManager();
+				EsElementSetDisabled(instance->undoButton, false);
+				desktop.configurationModified = true;
+			}
+		}
+	}
+
+	return 0;
+}
+
+EsListView *SettingsAddChoiceList(EsElement *table, const char *string, ptrdiff_t stringBytes, char accessKey, 
+		const char *cConfigurationSection, const char *cConfigurationKey) {
+	SettingsInstance *instance = (SettingsInstance *) table->instance;
+
+	SettingsControl *control = (SettingsControl *) EsHeapAllocate(sizeof(SettingsControl), true);
+	control->type = SETTINGS_CONTROL_CHOICE_LIST;
+	control->cConfigurationSection = cConfigurationSection;
+	control->cConfigurationKey = cConfigurationKey;
+
+	EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_V_TOP, 0, string, stringBytes);
+	EsListView *list = EsListViewCreate(table, ES_CELL_H_EXPAND | ES_CELL_H_PUSH | ES_LIST_VIEW_CHOICE_SELECT | ES_LIST_VIEW_FIXED_ITEMS, ES_STYLE_LIST_CHOICE_BORDERED);
+	list->accessKey = accessKey;
+	list->userData = control;
+	list->messageUser = SettingsChoiceListMessage;
+
+	control->element = list;
+	instance->controls.Add(control);
+	return list;
+}
+
 int SettingsDoubleClickTestMessage(EsElement *element, EsMessage *message) {
 	if (message->type == ES_MSG_MOUSE_LEFT_DOWN) {
 		if (message->mouseDown.clickChainCount >= 2) {
@@ -562,15 +631,44 @@ void SettingsPageKeyboard(EsElement *element, SettingsPage *page) {
 	EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL | ES_CELL_H_SHRINK, &styleSettingsGroupContainer2);
 	SettingsAddTitle(container, page);
 
+	EsPanel *table;
+	EsTextbox *textbox;
+
+	table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
+	EsPanelSetBands(table, 2);
+
+	EsListView *list = SettingsAddChoiceList(table, INTERFACE_STRING(DesktopSettingsKeyboardLayout), 'L', "general", "keyboard_layout");
+
+	EsINIState s = {};
+	s.buffer = (char *) EsBundleFind(&bundleDesktop, EsLiteral("Keyboard Layouts.ini"), &s.bytes);
+	void *activeKeyboardLayout = nullptr;
+
+	while (EsINIParse(&s)) {
+		if (s.key[0] != ';') {
+			EsListViewFixedItemInsert(list, s.value, s.valueBytes, s.key);
+			EsAssert(s.keyBytes == 2);
+
+			if (s.key[0] + ((uint16_t) s.key[1] << 8) == api.global->keyboardLayout) {
+				activeKeyboardLayout = s.key;
+				((SettingsControl *) list->userData.p)->originalValueData = activeKeyboardLayout;
+			}
+		}
+	}
+
+	EsListViewFixedItemSelect(list, activeKeyboardLayout);
+
+	table = EsPanelCreate(container, ES_CELL_H_FILL, &styleSettingsCheckboxGroup);
+	SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsKeyboardUseSmartQuotes), 'Q', "general", "use_smart_quotes");
+
+	EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_BUTTON_GROUP_SEPARATOR);
+
 	EsPanel *warningRow = EsPanelCreate(container, ES_CELL_H_CENTER | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
 	EsIconDisplayCreate(warningRow, ES_FLAGS_DEFAULT, 0, ES_ICON_DIALOG_WARNING);
 	EsTextDisplayCreate(warningRow, ES_FLAGS_DEFAULT, 0, "Work in progress" ELLIPSIS);
 
-	EsPanel *table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
+	table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
 	EsPanelSetBands(table, 2);
 
-	EsTextbox *textbox;
-
 	EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatDelay)); // TODO.
 	textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, &styleSettingsNumberTextbox);
 	textbox->accessKey = 'D';
@@ -593,9 +691,6 @@ void SettingsPageKeyboard(EsElement *element, SettingsPage *page) {
 	EsTextDisplayCreate(testBox, ES_CELL_H_FILL, ES_STYLE_TEXT_PARAGRAPH, INTERFACE_STRING(DesktopSettingsKeyboardTestTextboxIntroduction));
 	EsSpacerCreate(testBox, ES_FLAGS_DEFAULT, 0, 0, 5);
 	EsTextboxCreate(testBox, ES_CELL_H_LEFT)->accessKey = 'T';
-
-	table = EsPanelCreate(container, ES_CELL_H_FILL, &styleSettingsCheckboxGroup);
-	SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsKeyboardUseSmartQuotes), 'Q', "general", "use_smart_quotes");
 }
 
 void SettingsPageDisplay(EsElement *element, SettingsPage *page) {
diff --git a/desktop/text.cpp b/desktop/text.cpp
index 6e741ee..8b4b27b 100644
--- a/desktop/text.cpp
+++ b/desktop/text.cpp
@@ -2970,7 +2970,37 @@ void TextboxBufferResize(void **array, uintptr_t *allocated, uintptr_t needed, u
 	*array = newArray;
 }
 
-bool IsScancodeNonTypeable(unsigned scancode) {
+void KeyboardLayoutLoad() {
+	if (api.keyboardLayoutIdentifier != api.global->keyboardLayout) {
+		char buffer[64];
+		api.keyboardLayoutIdentifier = api.global->keyboardLayout;
+		api.keyboardLayout = (const uint16_t *) EsBundleFind(&bundleDesktop, buffer, EsStringFormat(buffer, sizeof(buffer), "Keyboard Layouts/%c%c.dat", 
+					(uint8_t) api.keyboardLayoutIdentifier, (uint8_t) (api.keyboardLayoutIdentifier >> 8)));
+
+		if (!api.keyboardLayout) {
+			// Fallback to the US layout if the specifier layout was not found.
+			api.keyboardLayout = (const uint16_t *) EsBundleFind(&bundleDesktop, buffer, EsStringFormat(buffer, sizeof(buffer), "Keyboard Layouts/us.dat"));
+		}
+	}
+}
+
+const char *KeyboardLayoutLookup(uint32_t scancode, bool isShiftHeld, bool isAltGrHeld, bool enableTabs, bool enableNewline) {
+	KeyboardLayoutLoad();
+	if (scancode >= 0x200) return nullptr;
+	if (scancode == ES_SCANCODE_ENTER || scancode == ES_SCANCODE_NUM_ENTER) return enableNewline ? "\n" : nullptr;
+	if (scancode == ES_SCANCODE_TAB) return enableTabs ? "\t" : nullptr;
+	if (scancode == ES_SCANCODE_BACKSPACE || scancode == ES_SCANCODE_DELETE) return nullptr;
+	uint16_t offset = api.keyboardLayout[scancode + (isShiftHeld ? 0x200 : 0) + (isAltGrHeld ? 0x400 : 0)];
+	return offset ? ((char *) api.keyboardLayout + 0x1000 + offset) : nullptr;
+}
+
+uint32_t ScancodeMapToLabel(uint32_t scancode) {
+	KeyboardLayoutLoad();
+	// TODO.
+	return scancode;
+}
+
+bool ScancodeIsNonTypeable(uint32_t scancode) {
 	switch (scancode) {
 		case ES_SCANCODE_CAPS_LOCK:
 		case ES_SCANCODE_SCROLL_LOCK:
@@ -3025,73 +3055,14 @@ bool IsScancodeNonTypeable(unsigned scancode) {
 	}
 }
 
-void ConvertScancodeToCharacter(unsigned scancode, int *_ic, int *_isc, bool enableTabs, bool enableNewline) {
-	int ic = -1, isc = -1;
-
-	switch (scancode) {
-		case ES_SCANCODE_A: ic = 'a'; isc = 'A'; break;
-		case ES_SCANCODE_B: ic = 'b'; isc = 'B'; break;
-		case ES_SCANCODE_C: ic = 'c'; isc = 'C'; break;
-		case ES_SCANCODE_D: ic = 'd'; isc = 'D'; break;
-		case ES_SCANCODE_E: ic = 'e'; isc = 'E'; break;
-		case ES_SCANCODE_F: ic = 'f'; isc = 'F'; break;
-		case ES_SCANCODE_G: ic = 'g'; isc = 'G'; break;
-		case ES_SCANCODE_H: ic = 'h'; isc = 'H'; break;
-		case ES_SCANCODE_I: ic = 'i'; isc = 'I'; break;
-		case ES_SCANCODE_J: ic = 'j'; isc = 'J'; break;
-		case ES_SCANCODE_K: ic = 'k'; isc = 'K'; break;
-		case ES_SCANCODE_L: ic = 'l'; isc = 'L'; break;
-		case ES_SCANCODE_M: ic = 'm'; isc = 'M'; break;
-		case ES_SCANCODE_N: ic = 'n'; isc = 'N'; break;
-		case ES_SCANCODE_O: ic = 'o'; isc = 'O'; break;
-		case ES_SCANCODE_P: ic = 'p'; isc = 'P'; break;
-		case ES_SCANCODE_Q: ic = 'q'; isc = 'Q'; break;
-		case ES_SCANCODE_R: ic = 'r'; isc = 'R'; break;
-		case ES_SCANCODE_S: ic = 's'; isc = 'S'; break;
-		case ES_SCANCODE_T: ic = 't'; isc = 'T'; break;
-		case ES_SCANCODE_U: ic = 'u'; isc = 'U'; break;
-		case ES_SCANCODE_V: ic = 'v'; isc = 'V'; break;
-		case ES_SCANCODE_W: ic = 'w'; isc = 'W'; break;
-		case ES_SCANCODE_X: ic = 'x'; isc = 'X'; break;
-		case ES_SCANCODE_Y: ic = 'y'; isc = 'Y'; break;
-		case ES_SCANCODE_Z: ic = 'z'; isc = 'Z'; break;
-		case ES_SCANCODE_0: ic = '0'; isc = ')'; break;
-		case ES_SCANCODE_1: ic = '1'; isc = '!'; break;
-		case ES_SCANCODE_2: ic = '2'; isc = '@'; break;
-		case ES_SCANCODE_3: ic = '3'; isc = '#'; break;
-		case ES_SCANCODE_4: ic = '4'; isc = '$'; break;
-		case ES_SCANCODE_5: ic = '5'; isc = '%'; break;
-		case ES_SCANCODE_6: ic = '6'; isc = '^'; break;
-		case ES_SCANCODE_7: ic = '7'; isc = '&'; break;
-		case ES_SCANCODE_8: ic = '8'; isc = '*'; break;
-		case ES_SCANCODE_9: ic = '9'; isc = '('; break;
-		case ES_SCANCODE_SLASH: 	ic = '/';  isc = '?'; break;
-		case ES_SCANCODE_PUNCTUATION_1: ic = '\\'; isc = '|'; break;
-		case ES_SCANCODE_LEFT_BRACE: 	ic = '[';  isc = '{'; break;
-		case ES_SCANCODE_RIGHT_BRACE: 	ic = ']';  isc = '}'; break;
-		case ES_SCANCODE_EQUALS: 	ic = '=';  isc = '+'; break;
-		case ES_SCANCODE_PUNCTUATION_5: ic = '`';  isc = '~'; break;
-		case ES_SCANCODE_HYPHEN: 	ic = '-';  isc = '_'; break;
-		case ES_SCANCODE_PUNCTUATION_3: ic = ';';  isc = ':'; break;
-		case ES_SCANCODE_PUNCTUATION_4: ic = '\''; isc = '"'; break;
-		case ES_SCANCODE_COMMA: 	ic = ',';  isc = '<'; break;
-		case ES_SCANCODE_PERIOD: 	ic = '.';  isc = '>'; break;
-		case ES_SCANCODE_SPACE: 	ic = ' ';  isc = ' '; break;
-		case ES_SCANCODE_ENTER:		if (enableNewline) { ic = '\n'; isc = '\n'; } break;
-		case ES_SCANCODE_TAB:		if (enableTabs) { ic = '\t'; isc = '\t'; } break;
-	}
-
-	*_ic = ic, *_isc = isc;
-}
-
 size_t EsMessageGetInputText(EsMessage *message, char *buffer) {
-	int ic, isc;
-	ConvertScancodeToCharacter(message->keyboard.scancode, &ic, &isc, true, true);
-
-	if (message->keyboard.modifiers & ES_MODIFIER_SHIFT) ic = isc;
-	if (ic == -1) return 0;
-
-	return utf8_encode(ic, buffer);
+	const char *string = KeyboardLayoutLookup(message->keyboard.scancode, 
+			message->keyboard.modifiers & ES_MODIFIER_SHIFT, message->keyboard.modifiers & ES_MODIFIER_ALT_GR, 
+			true, true);
+	size_t bytes = string ? EsCStringLength(string) : 0;
+	EsAssert(bytes < 64);
+	EsMemoryCopy(buffer, string, bytes);
+	return bytes;
 }
 
 enum CharacterType {
@@ -4318,9 +4289,9 @@ int ProcessTextboxMessage(EsElement *element, EsMessage *message) {
 		if (response != 0 && message->type != ES_MSG_DESTROY) return response;
 	}
 
-	textbox->scroll.ReceivedMessage(message);
-
-	int response = ES_HANDLED;
+	int response = textbox->scroll.ReceivedMessage(message);
+	if (response) return response;
+	response = ES_HANDLED;
 
 	if (message->type == ES_MSG_PAINT) {
 		EsPainter *painter = message->painter;
@@ -4418,11 +4389,11 @@ int ProcessTextboxMessage(EsElement *element, EsMessage *message) {
 		EsHeapFree(textbox->activeLine);
 		EsHeapFree(textbox->data);
 		EsHeapFree(textbox->editStartContent);
-	} else if (message->type == ES_MSG_KEY_TYPED && !IsScancodeNonTypeable(message->keyboard.scancode)) {
+	} else if (message->type == ES_MSG_KEY_TYPED && !ScancodeIsNonTypeable(message->keyboard.scancode)) {
 		bool verticalMotion = false;
 		bool ctrl = message->keyboard.modifiers & ES_MODIFIER_CTRL;
 
-		if (message->keyboard.modifiers & ~(ES_MODIFIER_CTRL | ES_MODIFIER_ALT | ES_MODIFIER_SHIFT)) {
+		if (message->keyboard.modifiers & ~(ES_MODIFIER_CTRL | ES_MODIFIER_ALT | ES_MODIFIER_SHIFT | ES_MODIFIER_ALT_GR)) {
 			// Unused modifier.
 			return 0;
 		}
@@ -4498,27 +4469,26 @@ int ProcessTextboxMessage(EsElement *element, EsMessage *message) {
 				EsTextboxStartEdit(textbox);
 			}
 
-			int ic, isc;
-			ConvertScancodeToCharacter(message->keyboard.scancode, &ic, &isc, true, textbox->flags & ES_TEXTBOX_MULTILINE); 
-			int character = (message->keyboard.modifiers & ES_MODIFIER_SHIFT) ? isc : ic;
+			const char *inputString = KeyboardLayoutLookup(message->keyboard.scancode, 
+					message->keyboard.modifiers & ES_MODIFIER_SHIFT, message->keyboard.modifiers & ES_MODIFIER_ALT_GR, 
+					true, textbox->flags & ES_TEXTBOX_MULTILINE);
 
-			if (ic != -1 && (message->keyboard.modifiers & ~ES_MODIFIER_SHIFT) == 0) {
+			if (inputString && (message->keyboard.modifiers & ~(ES_MODIFIER_SHIFT | ES_MODIFIER_ALT_GR)) == 0) {
 				if (textbox->smartQuotes && api.global->useSmartQuotes) {
 					DocumentLine *currentLine = &textbox->lines[textbox->carets[0].line];
 					const char *buffer = currentLine->GetBuffer(textbox);
 					bool left = !textbox->carets[0].byte || buffer[textbox->carets[0].byte - 1] == ' ';
 
-					if (character == '"') {
-						character = left ? 0x201C : 0x201D;
-					} else if (character == '\'') {
-						character = left ? 0x2018 : 0x2019;
+					if (inputString[0] == '"' && inputString[1] == 0) {
+						inputString = left ? "\u201C" : "\u201D";
+					} else if (inputString[0] == '\'' && inputString[1] == 0) {
+						inputString = left ? "\u2018" : "\u2019";
 					}
 				}
 
-				char buffer[4];
-				EsTextboxInsert(textbox, buffer, utf8_encode(character, buffer));
+				EsTextboxInsert(textbox, inputString, -1);
 
-				if (buffer[0] == '\n' && textbox->carets[0].line) {
+				if (inputString[0] == '\n' && inputString[1] == 0 && textbox->carets[0].line) {
 					// Copy the indentation from the previous line.
 
 					DocumentLine *previousLine = &textbox->lines[textbox->carets[0].line - 1];
diff --git a/kernel/windows.cpp b/kernel/windows.cpp
index a126058..d42f3ff 100644
--- a/kernel/windows.cpp
+++ b/kernel/windows.cpp
@@ -321,7 +321,8 @@ void WindowManager::PressKey(unsigned scancode) {
 	if (scancode == ES_SCANCODE_RIGHT_FLAG) flag2 = true;
 	if (scancode == (ES_SCANCODE_RIGHT_FLAG | K_SCANCODE_KEY_RELEASED)) flag2 = false;
 
-	modifiers = ((alt | alt2) ? ES_MODIFIER_ALT : 0) 
+	modifiers = (alt ? ES_MODIFIER_ALT : 0) 
+		| (alt2 ? ES_MODIFIER_ALT_GR : 0) 
 		| ((ctrl | ctrl2) ? ES_MODIFIER_CTRL : 0) 
 		| ((shift | shift2) ? ES_MODIFIER_SHIFT : 0)
 		| ((flag | flag2) ? ES_MODIFIER_FLAG : 0);
diff --git a/res/Keyboard Layouts/License.txt b/res/Keyboard Layouts/License.txt
new file mode 100644
index 0000000..8c16795
--- /dev/null
+++ b/res/Keyboard Layouts/License.txt	
@@ -0,0 +1,193 @@
+Extracted from the XKB data by nakst.
+License of the XKB data (MIT) follows:
+
+Copyright 1996 by Joseph Moss
+Copyright (C) 2002-2007 Free Software Foundation, Inc.
+Copyright (C) Dmitry Golubev <lastguru@mail.ru>, 2003-2004
+Copyright (C) 2004, Gregory Mokhin <mokhin@bog.msu.ru>
+Copyright (C) 2006 Erdal Ronahî
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation, and that the name of the copyright holder(s) not be used in
+advertising or publicity pertaining to distribution of the software without
+specific, written prior permission.  The copyright holder(s) makes no
+representations about the suitability of this software for any purpose.  It
+is provided "as is" without express or implied warranty.
+
+THE COPYRIGHT HOLDER(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+
+Copyright (c) 1996  Digital Equipment Corporation
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the Digital Equipment 
+Corporation shall not be used in advertising or otherwise to promote
+the sale, use or other dealings in this Software without prior written
+authorization from Digital Equipment Corporation.
+
+
+Copyright 1996, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+
+Copyright 2004-2005 Sun Microsystems, Inc.  All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+Copyright (c) 1996 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be 
+used in advertising or publicity pertaining to distribution 
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability 
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+
+Copyright (c) 1996  X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from the X Consortium.
+
+
+Copyright (C) 2004, 2006 Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization of
+the copyright holder.
+
+
+Copyright (C) 1999, 2000 by Anton Zinoviev <anton@lml.bas.bg>
+
+This software may be used, modified, copied, distributed, and sold,
+in both source and binary form provided that the above copyright
+and these terms are retained. Under no circumstances is the author
+responsible for the proper functioning of this software, nor does
+the author assume any responsibility for damages incurred with its
+use.
+
+Permission is granted to anyone to use, distribute and modify
+this file in any way, provided that the above copyright notice
+is left intact and the author of the modification summarizes
+the changes in this header.
+
+This file is distributed without any expressed or implied warranty.
diff --git a/res/Keyboard Layouts/af.dat b/res/Keyboard Layouts/af.dat
new file mode 100644
index 0000000000000000000000000000000000000000..ed1b0bdff4d78a3fce63c1bbe80cb12b6522b6c8
GIT binary patch
literal 4618
zcmeI0duUf>7{@<fWjM2>D3Y{bWtz=&M2VQCg&-v&B~qYeQX(dTe@GN~+q~@7<}Nnf
z9A)$FHr=IN+%hj4g<2F9#rvKkf<wfzCWTZ8Qjb4>KUfFm_J8Ma-t(UKdA{d)zV8>_
zKhAd_x2}2Qu!aRp<~0`b2G6mCw^>FWn|YpDOyEgg;c1>>JrjAKsl3Y&(nx0nBe{qB
z7{zEFVy=~Yl<{mMgGZRnORToYJFH|Cg%neg>^IO<69Ifg85QiHIucJUs}e7JQp<Rb
z6^IoWgaWg43)IVlx?k7$p1-)x4K9F&DotaRp^IGNYkuT+9OrpJ-*T@)?p7`JG|)^N
z9US8Xr|9Na4szB?X6Xw~bD3WlX&r`XxbD<=O;BdC-$2x6MsU+LNl$5trbXhZI#Uzz
z7y8MjQ1Kiq5G&AEflJ8~Q?8ThRHas_S|6)Mo3vL4RI4x5tz6}6g;uLV?`eZR*Gjc(
zjau}g=4h_w>1EB=0==q*TC7sd)-o;E4|+>WRj6V$TZhAHu;&?lrEdm#LVF^(^ZHId
z$?04qp4v;0h+pg{n?l8NtU#<lUj>E@>AM=-`_<c=vOn~*eoN-B+y*yLr=byE|LB_j
z)Ze<%PtEIzcv|GEfx5)`Sb_hy0%Hi92%8B%C2S#VC2S*XCp=2nLD<M7a{|&Cj%&lU
z;_C1l@j19oTn9c6cLaABS5J`3UAPvU6)M6V#BatOz}4b&@mmNE5j4<~UCisaqqufl
zGp-5Oh-<(f$LE{*kVPgL)^sAzTDdIlV1p6pYGMoz<LmKt^j3a=ucdnjuE@}jn>FFH
z?SpiDIlc&Aj5kCHz7)R|UuJH`BG#F^Vf^;u_Tvk2`*3@3yK#s3j5@P5T($lAti^A_
zZzHJ0HyT;1_93o@8AiwLvTip+H`&dIvRh&<$yjqf#<AGkkDlz^Hn!R*;mxFiw$E02
zHr8{s<+zO#^j2-RQH8JIG4o1-9D*%YHrPpMTPPqbC1}St;g1p6-N|%<I%X1<6O<8b
nCorb@1O@mGo*>L4EHI8;pCl-*jZ#cVRAkZ2M80ePe*ymjWH=w;

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/al.dat b/res/Keyboard Layouts/al.dat
new file mode 100644
index 0000000000000000000000000000000000000000..00efdc820af7424ab345cb112b56b29e56aaf9ec
GIT binary patch
literal 4616
zcmeI0`EL|;7{)(OMN)|pCBzURrV4VFB8OlFs})4Kwa8&D2qIvMT*^&>P%Vu%ghGQz
zxB`W)wSd+rHb5$w*(DkUB1eb^7?u#ChA74}D)F7|4p}A;`v=Tqzx#dPci!_!=7;ww
zrt!(9fbl%cy*xrL1IgrZo?r-*m`E1)b2lC6Pe;0vPX=S@%rm6XjOL`%f?H|H?X;pb
z{Vd&Gw4;bSX+tj_AkQqr7|Bz-z>7>v*89I}QNUpyFYz+7cqL%>)j0`aiLZuth(L%y
z6A<_->9dcoIK_UpagYWMQG-L2!<^w8YT3gkwo^|P5l*v(6YSzkR`MF9l<@}TtY!^s
zspLaeu+ef}WIY>rj}JIz+NXTZ5x(Ob=bO-z=ki;??=lzoo*(%sVE5Ha3E>Z44et<v
z5P>Ejuvm>wS<2TK^-&A;Q?~l6o!N7gtBER5hT5ySTB@h+P#cX`y7JUoqjV)Te=<*|
z{vl1xG(DkrR2L05X^;kMh$d@F(knIa`ttmM=Uh!yp=M}y!0t!SOxPFR;H~c!-XQ`Z
z0;vexoYtrv(s`ZLVeQms`a;L_k$p+Wby62~LG?PIt$IhUYE`Fm+OBW4S6`dQa+Ro5
zWhys$jVkq)8dR*!rv0Lg_MiHk)(^TAu%*7gR#vhv-}<k9*01_qf8QX(p9%X-fha#Z
zyh8*+1g?ibTYB1--kUzQsrR+*{Xw#A+wX2nKsvWDmxWBVoqHZjm`@?InS&eQQEp>0
zuO`;{>9&{`F~gQ~x0dIOMVP>17BPhdw(rkkrZEXw^f2Ba!?Jc`fQ9xj#$bh2aO!Bw
zJw`dSH*(=VBN{w<p)*~0-W=0;nsG)#<QdVB&lsa3Mj3_RmeI*F<T9E;3^s=1NroD`
zFdVm>r4+M_XN|@fXavP$MmdZy%Hkm-H2mT@!Q#t}-|*%vu+VtPZk&C@BE(l!*r~L$
z4!0h+0rz9v4HoQH6J1NR!Uml{G(xPz`*pzGhGWq?acXf6;OsDnmRd7T#0Ji}TE940
zKVG^Cr^*t<OE=ruLj3g|9xTrLIG<Q&M{9_!Z0u|=v1*)M)|53+hx<0}R<EN~UJ<tf
k=UrlN60J56EyTL<3OhA6U?;DU{oVjJh7W~PeQhuQ0UChv_W%F@

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/am.dat b/res/Keyboard Layouts/am.dat
new file mode 100644
index 0000000000000000000000000000000000000000..977f1f6bd58213df38cd9e9988028fb7e6829d2e
GIT binary patch
literal 4778
zcmeI0ZD?0z7{-6sO_EuLWF+ZeF&dgL*}GZkuoT6x#L(W~BvC3WQIcfUHr>?uu50L;
zS~@p#tu~j_*=+C!NfM*t+{ZAA-Y6=hLJ~uY9=H8t9UA)459fS1_j&H;I`@4&KX^Vo
z&rUj@dnuui>5Sw79_BH|@+40&n`M+Tj`3W>4NT)^Zs%2o^Afl6B1SKIb1{ACM}Gz|
zkQ}Cja`_CVl3enb$Ykb+%+t)}1y-<{bzS|=7HSfLH>hAERcuM*v%~6+kJ{`ojVXbY
zz&Q|@rcTi*hACfv^EuK5x==sTM}5^#*XvsS%yB;B3r_PD-!nu`p1vVh4K&isURpUo
zI~fl0At$NllTfliA8~}=I6+S6&|g>RO5LPUx~;3<*{t1@&`s7DjniG4l*ni6Oz6l@
z?O`^nN@GeOCD5I~UtK$<Mo0Cjc4>(k)Tm}{P>WjCrZ06&mD;3Nv{ZE}*IGp?*2h|<
z!@6G&=}|qQnVO|JdREVCp0;Va7O7CbXn_{0T3dA}bZA#b2lchS(+}skL;p<Z{?Jc4
zu3vQ`k<YH>_m2GO9%i$uG^PYn0^JGJS?6eq71<)Y&qmk`d(a-SJM3|rX|t@%7F&Vc
zX@l)Ln`$@OXnWa)+Csa<7MNKt>us0VrFNNJZUbzf<=EYZ<%gOTmTP%7!6w<fFq&h}
z*mJhrR@$1be%(F%-}m-}ZmX@gO513g6Z!1FRUP>qJ<MiRX-o;E1iBL#L|le95toN!
zeY_ms!nZ{=`0L@sAD7~F`0jAXzX)$8UW{+U58&_N`-n^Mck!M0TlhP~#o;2r-^V||
zx8pnTH}Mv{9&g7R@%_X__+~OevkMPRTJb%2E&ev~61)N5i?=b9s~EvB3PQn=^a(c(
zW5_fy2(QG8gTD%{4)5A<(GV}is~Cd6Mil-n306J0+(5J&UxkON%kcF??L_;CT8V<Y
zb!UvOz*iGB6YU{t!pn$)tu=VCSdOp7tI5<8?I#M04O~izT8P^43Zg(D^j-O{(Eu;u
S^!$Zdn6!GnLe13v*XcjjJ&7p*

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/at.dat b/res/Keyboard Layouts/at.dat
new file mode 100644
index 0000000000000000000000000000000000000000..e34763cafa9ce8e7a2d62be87e55b851d59e151c
GIT binary patch
literal 4672
zcmeI0`)^cL5XV2?i$Osuii*Jov4|iR1O&8LTWb|XP!z4Ah^Q!tprD|DRkQ_K6@0XS
zP_V30%a%uDDGd}_pyAwIqtOtehNw}4t0BHZj8Q{EG)}kOhOQ6#2i%*?otbmy%*_4X
zoFC?!Ps@|RB<|vB(#R%<T++Fo8yLeBCNr2J^yVV2;$jAJH+{%s0Jr0D3Y|HPu5{xJ
z&ZGzDaD}DoMJhAsY1S}CaGU9|++yzsn99SZJMzp=3YyDwX7U(MB&{dh*>PiG!VPqQ
zK!8985IEKvQ^#j~N<HQ5rjfmbX<|P<U-AW;*g_d0cJMZp9AX_GQ^7%AppYdL^AgK=
zh1V!y1+^?<wdFj*DtlK`!vWJ#-seNU<}k6=dM8uAB?bJ#cYM!}98FqJxIf2@KN4=B
z0|WvDI)K1hwFKpAj%H|#`f8lUYl24DdY&d~f#xYgnd+_n8m)mEs#)rzX&R)d`V-Vi
zoz+F%)Lm!kY@Mqd9jBL4^`g#;XU^7?)(Vr9uSF_s^-k8>8%c4cD$>hZuGf>+6M0^Z
zudn%!-9%KN0|WvDPDCKfYw><kPp`Z8t3J~2I;P|L%5KtM!n?pb-#e^t^_~vus6Nr>
z>fwE$)4fAF)eC8ZHfoc$sz!CHSEKgn2bC*gX9s)x<9G2$+l}nxrFs3l0j>2;?BU<+
zQAu$ly>xGgH_RKJwBG(~=Kt=tj}5#4fdGM2o6#?4xXtM!ZFaws3`Q{&|1BHqyYM6n
zn8sY5BA=&ulsPtj`+JNVNZ~=|*(^VuM{Lrc$t;`9{hj!g#u7ZkLLOqi&HA%>oIzY>
z{K2JMXzz667gCH%=xUQg7OvK4f;9T#s_19TLVw%2#Q23QuCd}1n8;}381jslxRaZ>
z)p!KI+!Cd5EqBDpi5rcc7|S?r#$S!U6t~S-iF=HnxXzf2T*e#ckZGL7{cY8=ldHSk
zxb3()+#cLsTs6;fFZbC9GdceKIYbu|TU?FXNwkVsaf!)FlNI>8@b~e&W%R>DoA9?0
zDJ8m`NEMM?@pA>+i50BHHR877D$EI)l$)%_?ZDNW6*gJf*5GshXmA6uqBn8x;400s
zvqkGoEYH%4W&rJzU6ZwXU^CIemQLR#8pdt3CQFIb;+Nrva5c@17V}L*2)_ikh3GOO
lVZ*%nSV5ghgNebh+0;6dG85~)0e=mCbEm7?x@`9g{|33Y7x(}G

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/au.dat b/res/Keyboard Layouts/au.dat
new file mode 100644
index 0000000000000000000000000000000000000000..18f4c163caba2890294a8a27fccab8cdb74d238a
GIT binary patch
literal 4593
zcmeI0eP~Z{7{xzFYt7o$T9R0r8D<z}W@eiihMD(a80Kwem>HYBvDR9WBuQFpX$dV!
zOG}a#YptavNs_eWEw3dhN%Ht@Kh3SR{pGKF|9S57+|zTu-&6OGbIR#?;@QYL5(y`n
z6jGVY0@7H_7P5(E8l#CIf$>C<MHrbxvYH|I;ENyr1Q0|pAq*qV){P{TJccuZ7-Csz
zlXNmzP7d4I*~>RjDRBUb$R(eB6guYKw!rgJ>TTWXD&Q(G2nD|NVs7x5huoxrTioUj
zS7_xfZ9L@(O<bjp3$)P4B_2`F11{1<71h*G%W+O{l2e@K49y(nyzP9+S<Z2d>)f}l
zoenyA#&fy{ai%|zFAm%%UhtZ?d~nRY?K{uQS8wZ9R{>XnK`2n99?&$c)^f#aq~a8>
z1Vt!O$x6{WWoo=4HC&;J(P)KhrA8=2VM^Bze)0=6L_YGBpZpb|XniL{!<3^S1uIIE
zwb&R^wLodg(ne+X@(pyf0tYT%TeMv}mFJjy_vCu!h5dZ>qTK2#;408pfzQ2v%vE)%
zQ`dD)&AOo$UC>S4(rrD|12yWR&gi_ZsZI^Lue0h<z1np|Wvb9oRjFDvs?~9wP?L&v
z+IBwENuAOqT~V8Lchsu8dZfpCGRQyly#x0~PxV~gdgYjV@AASk|Jcu0FUqa10<Hpm
z6&S^IbLlh8r_VI+K8tu}o7<m4lKJ|f9OMYQDB>_>6tjl|=D#<wnLxI2$h>?myUpq6
zv)7#Y9445<&!(JGc2HtozkvOgBSbURQiCwtImz;cK<oU?IV5qfnNf_fuwkr43*#(k
z_!BNfGLfwY^kWt4S!f|cCL37G5>{A{P+{gGka?`}gcFM_o=9h@MGFZQTO6a(B8)8N
iTa1xvVZ$;bOJ?q0>SQPN|Gamlll=eP``+b$xqkyTTfLD0

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/az.dat b/res/Keyboard Layouts/az.dat
new file mode 100644
index 0000000000000000000000000000000000000000..4fc4bd94c844d237378dac9ae1ac7ad7fcb3361c
GIT binary patch
literal 4625
zcmeI0YiN&g6vsc`xio8*w4_aI?w4Wa&Rm-N{XWKM?#!JT=C+i3Vo8g&W=V68g(1?~
z|8F5llDpO{t%bCZByrmIh^J)lym_7%&w0-Io!>d<`PO;y{cfZBi6x0d2GWu^1~ZgS
z3}+;xna3QWi6Mg4^rtOR%p#KMv}YOt)TKUw1QARKjc80LeXLv<%~(kjn$nG)#9L%6
z6PU~b7PGXb-@nWjS3(-gSxpM-U2(@vt@=oJT+ez4cnH)2fqJS=Dx{1O{G6be+uS9e
zd)(&%<-Fk%1svlPMV#S0r5xuK=Xk+RcC(lLWN?r}WOA4+ZnB+REBTRZa=6NMo|*TM
zM?9f|cYLUB_s_R#=5i9hQ^{w(@XZOh?AI#4j_Z~y$#XpfJOutgU{B4)4Avse({M#;
zq(*D3dT6{RYO<CpS-sRpZPZCa6|HVspmv(07$qr4!3t3$HCCvasHwu#OmPZS3$@aE
zMJQ6S8lYL$Azlee)N-v-N-Z~ZhbwQJQkAAnN_WMbpV?9s-}RSMC(E-Q0v-atBM=f$
z?cLT}mFu3)>%Jc7p|0tX9_y(-=)G>}rcNtgcXd%$RH3taqsuDOer4#OGIdy4%2tkY
zbxg(Dr<1mY-*jAgDwI#9<~`R-m8epm^re;?8dNivGi&{TullYZs_Tk7=c<Ya|K-%l
z@~nq|hrsU$gd4Z-YCOF=J&ddOqPH>lF2?@*8?SF*jN5m^X!{!0l13`YM(bDME5Lu0
zh9(T8FrS4iGFrdHi2XAB`P@0eY-X~N4JI9|V=gO<xcg3U>nNS+K%|w9qMzN4HrXKE
z+7#szPIFrDdPg3yrZV(36`}*}Okqf})IcWU%Qit`5>rfeh{u0{@unvDGV$kFnK;uG
zhA_<3iV=)5y<&{17R3kHYV~K3U{c0Z1~JYA2;VMl<<Rlh3<KOV{0AI1yJz?hI27gm
GImA!A(&07$

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/bd.dat b/res/Keyboard Layouts/bd.dat
new file mode 100644
index 0000000000000000000000000000000000000000..7fb05e23e35f4859d3397d5fa6b7c15ae7abb002
GIT binary patch
literal 4673
zcmeI0{ZCF|7{|ZYvqfn!45N9eC`sitQz>I(V`F1uBxM*jhOL>ABuP?fBuOQ`oRcKI
zNhN8GVHk#Cn1^8)#)dI#^F2?Uvz*rI4>)a~u9y3|ulu^c&(1G*E872}k&8@hL@+jE
z8)C2sI}wX`6r%u3unbcWhIN>O1;|DaGB6LRu%Qq7p+5#;C`MouJmHPiY!`q@sKf+J
z#7e9}3NwjFLNZEGhVqW{dNR$Xf<{!J8nvi5<@K=6;k4+XWi16P1$v>tc4;pfAPZ%#
z43m#=m(k)SZSWC436!O>SVWxUHNIf5e8(Tmmv;!4p9ql~xP{xei+gy0hj@%9cm_AQ
zj#q3MCC~8^F5)UPdBRkgE;D4gtdNL~^LiR>i>YptM9LajD;rFCz0Z0_erq?YdX;4@
z1uO+REAYGHi>ai2A@!n2leEY+DU+LWNA4TnQz5-tBYH~jk?fFN5+@0gBq@^aSUV~e
z5+nIiAnzqha*TTYM0=NvzGAjNOqJi{t$dJA^3{~r_kDKce|58}S6S9lz*3;I0%5lH
z$c=WKZ3zDl@5pHRk%r%w-asSrFg&1*-<%k+tL?8iG4eAqolon%A8gtmWb?K8+X8LV
zOnJTIWJf-<n^nEavX%mt0-Y6bhh0@kDLG5Z$T?C@&XWpqfhh3DEI7jjcI6~tPB}wZ
zubd`1B$qUh6Rgig1R~)^Z$H_`>{X(5O`~ll$4N0!5CR`W^QFM9uueTp4$`kAoJy%D
z6?{twKp@`~#&8ZlgtBuW-yZgIrq(LB!vnM7g|QgN2MBMLjfXFySm?~n32dm1SV(v^
zrGT6wc_g1?b3G5cvBxp4HoUeYo+}ifL>ut{$s#30<r9e~;`lgXSG238l4SbTq=;N1
zbsR7Z;l{XO=5g(6Ew^1Hb)<%Ho64IOYezTWO?)azYu8)l;A$e<UeN|rsE=}pP$QKZ
zm1sjHk;{zJX|;hGX^)X3q{$c~w(A($)HRw)YLVminl>qfH&UyJ_7i8445LY_@_(0q
D)ptP$

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/be.dat b/res/Keyboard Layouts/be.dat
new file mode 100644
index 0000000000000000000000000000000000000000..11bfb53103d6e96c857ca30c45c951ddba319a1b
GIT binary patch
literal 4641
zcmeI0`)^cb5Qd-k0I621RRqO~2m*oyxhi0_mYWEQf+&hskqU^4f?Nay<Yr3%FO-G=
z3KffPX|1GyVC7QvJG)}kG$A2G4N<dELx>teNHA)Gv)gXdoY<5<;A}GA%r|Fl`<|R1
z=3P$xFNded=PqtyD8m^^KSnW{dznfB1GtqN>B*gB(}ySN#$)v6Q9N3c#>HGh2AQ;_
z9oI0#%5|bMFOo$^vj_38onv``2bs<co~v)y;<+Rcv5=X}W)3e0{Hg1_r15I%8tM>%
z5P=Io;NOOr8cy&Xhj^b_KF6_(C|~jwKl3Bi>|r|*4zQCdexQuwRC0_$R<nk6yun)(
zQ^H0zv7c3xTFp~zVXNtnIcn$Ed`lg1e&M%<el4lL0s&_^$?yEhnSeiaJ)JcEPF+JC
zA`l{Q0SK&7eb5Na)HIDz7md|8P0&E|Pt+tkXKS!>)KT3vN<GzAGt@~1>ZQq&TB(iF
zl&%b2t}E15?KDj1>7Xnv(AAcktGtH#kZ;zU##>9H6$T<#XucL{v6cn=sX9xO{?*Mq
zO+|$|L?A?<DFWAf^|#~tM`v|H2lbQU`c>c9mvmC6B=5ZHbX5CPtMB!Nj_90fbVgB~
z)|)EUMs3#HDpi>xs?<k1rq{LCaxe9&1K;8wYVD;pbZa`n|J&CFBHMfE-eq2<cU8cj
z%Dyt`zpk05si;tg2!seUMIejr_!V@q#lHux9Dk=R@4o5nw($4nB3tjL@Cwsx^`6Hf
z=JPDGY!UBjEB{N(HF{t=&m`CS=WRiM0sm9n9^5__u#l&1TQ4vspcgsZZtTI$++ZcM
zxx<qCkj^smx!pz-^rOF#3<Hg3xXlQI!A2tV#Z@!e+7C6ZVWe>f4>8G@gwe($jI%l!
zjAsHPxZ7BYdl+Lp#eK#xbi?h%?cfpPCWbSSVcc(w#x2$>yRmm}u=f)3jNEXCaEFcB
zSj^)lON|Oi{PR3wD~YeH!tEzkPP}NnNr}k@VkP*s7W{<O^CS50;#U(bCbo`fInkO#
zrnAHkaR+f_#FuY1*=A_CPa22G4-VtrBVPDU;y-jX!!ioDnUoTLtt^3*Vd6fs$?7VI
ztw>aLyNE?_AJ|C6M0XS0fM1%Js3`d^*W)UQttA?<x17kRGVF746*kIdlPw02JAl6l
IzuBSw15NG%ivR!s

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/bg.dat b/res/Keyboard Layouts/bg.dat
new file mode 100644
index 0000000000000000000000000000000000000000..285ace10e8915cb20f9e78dbf8eb750cd13e8aae
GIT binary patch
literal 4770
zcmeI0{cBfs6vtoZV6m+1Nitl<e8|##SZdlTTZxqziIG%TBV+U+_JCm+mUZXWY;AMy
z!Rd5!Q`^>bbIn?&X4bbT3ZwHWii$$IAyFYng-{6f`99TmUmE%c+%NZgKj-uQoclTN
z&kODk=Qfl4&EaXDWFBL=odw*<G!}6Wi+Pr3xQ1)FjPcyU1g7#7c|67>mZA*dOmY~?
zISk``E@U`2`Rzt>DHUAIC0x&qJmi%kmQc*|lu(u|cgp*wtc(WMQb{#+S$cX}lL$7a
zr_mS@hzOhpftw|n^b;dxxE$jnj`KSw_=-O{$=~G3DEWr(c#lu`g-`i{5%K{Sh%rpI
zv4eIx>0%c>^wLK^M``7d-*SrV;{Znp8R{#joFO?fR>sSORJ~JKo1K+cAd@6trpc@<
zJ-yG2gkCtvYC0<#BLWeDOajMJZ%n;>DDO&>tdM4DmF-e0?b0RPa#%i=a;cEVWu-LA
zDhcF$SuO`<wd|K$WuDBJ1+q{U$-Q#FJRlEBt<06BvP`~}VtGWWq(=7o3ca#N`sFkE
zT)sTbH}vPMyrc59d@o1j$1FX4mLC%OuY;_nv!XE~5D~~E(5lJVTwSTlb-s?%J9MGm
zrPK9pU93gAT36{zEznVVh2EwUHD6cgXnjH_>oWaK{*V*$mz)%Ii00_odY;bF<C5$5
ztkjEigx;Wq`lz2R(PDjA11;6^RJ}|O{}*q`%G;<Fx=z>YhAch(Y+XWc8Duq`6^#*r
zh(IQRT(0)L{&Z&eE`KJoe5YSPK9iZ^`}(tdm+wlke(WvWOSlSbKduCO1KW!$_x=63
zxGG!?_8RsM_9pf^ZVh%2+k?H0Tg#P%!B*TlY#;7rTs5u?_ab%(7hnglJ|>dqi(Z9m
z@jFiSUld+oHnBc(8BL+r$8fn9uJcP_P)}Ia$T-3^-QJ|D#CBjCuua&jSQoY#+lDn@
z8?g>zopF;bSTD97+ln<}_1JdIi*;Bt*6F`&gn<usV@=pjtOt7qYsXr#Hf#%4`>#o>
z&Ndlm7zS;gVp!GXqXz%);Bb(D83wf}oMF%u2O1~Pk^&m*!e0Y{R^t4LGJu9<-fRZZ
z`-ts|19d$(A7lWH`2(bY#@Z4@pUd_d2O9S}#(UlQpVtx}CdtORCfSC8XX>qZ7}Y7b
nDZc~Yn)l!hX24At&Y)XF%)8o+>&6X)8#kPSn=%~h80h#P_i}I8

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/br.dat b/res/Keyboard Layouts/br.dat
new file mode 100644
index 0000000000000000000000000000000000000000..b5c938d8b0a82f880e2de2cb8ebe1357fe92de79
GIT binary patch
literal 4651
zcmeI0|7(?H7{))>i^&`+!!pyUtkktMx3V<Tw3TI<rfE%0GcC(9HCv{(bZN4dERjva
zX3SYyXSQT)x^jM(=RHS}5Dn=&qE1kRz95Dm6?LDpO+4=px<BB3;eMaze%|}J@9SJ}
zez>jznw~*S;%SC(8xJs?T<+vy9$_R?d6sPMq9?r>OeTHFBZKi|F%FM5v?Ya9+S8FV
zI&l;CTDxv^=Vfl@7TXWtNqawTF`8*i=LOrf=2;jh%4a68Fq`>-^Okf@Vzam<4cCx?
zkbzb(aG|-ThNFDTHa?-AZ)o6icCm+j9OpYCY+)T0)KbYNj!@2FKIIVavYZtZQEWX{
zQo<@$vz4WMWcdk7Sz~K8F?%1d@cEt}`Pp`@d43NRo#$6ha+-62^Op2XV)JK98m=J&
zAp@;oV6~cxay3u0G*Ue@N@Fxm*>*lbd0L=+4bVV!Rfa~Wm-=e9(lt|=nxRWv<{$pU
z(+x^ds@kighU+gntBaN>O`SAYLp3ciVX~&!x~O^D^?{WHDvMR1LM>BK;5@n0s%w5t
zt_`!0fslbLuZe?S)W-W)r?gjRbXMne#QsUY=?|rPDc&(1*G?VK3HdrKyxsa+2X$F%
zwNC3*p^e(Ch^keiI{l<F?XbI@y?T59U~$O;F6g2<cxlbkuFre#KxKw^qu0gj>h%nq
zCwI!c=GWxfFbf$78A#`D)9Ck@ZXd`X?lX;lzp4HH3^QHdj(irIl7Ex8C}3eieZOIj
zKnGLt3wViHrpRCAHRdoEzlz&U;J?G$Ce#=4BCj*gOoVKPnq`n-4g2vNId(P2?1E+1
z-qn%Lt>n_noP|CKXCaF_%pvG!lgFDI@hB5`#@vTIMw!>}6ie*#L*`M$U5UrcQFy`}
zg)#Uam}ODO6ecr*iDp`iHNzopVGOx4cPS4B=enJ^ZMf~Y&A3gtt=4_2!7ntBt}5}<
zbL^I@#nlk2qOrKtVy(p*{097exO!Z*we=(T8}Vz2mJ$1qXcf^0Vk=A=SyQ(Q_Z4n8
z?n@e%S6FN?UfkEX9aqrVi~uR_Gu&RB&DcZZ`xUq?wp7wsWI*c@nD!gOtMEl|Ul_D9
zqILM?_?66vBP)*o6u&f%Ggd-0VjRcb<N0P_agGwO$_>_fqs?IXALCzzY=1Jc{{g$z
B1VsP<

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/bt.dat b/res/Keyboard Layouts/bt.dat
new file mode 100644
index 0000000000000000000000000000000000000000..95d9e2461a29fe31abaac58221c600f2963d562f
GIT binary patch
literal 4879
zcmeI0`)gKp9LL|Ew<bE8kb;4Nm6q1LEH9;{rgWpi!lcAX?LtX~MN(2y(v~h=+uD|z
zE-#zSwb@*{bh+vGd>v0>Wny7cQi4x6Dk@4!x?s`!oaZ?(9~$}xoCjX#dp+OJ`}6*s
z=a=s>WPT50D>mZ^T!W|Z44%VG6k!=wU?;X?7VgHCxE2d=BW^<zu0|bh!FmwAkcYnL
zhXELf!5D&Jn6Kl;Vm$Vv0HZMv4`8ik%29<?Xoo{*CfpgHM{{-@!9E<oK^)GRkB5h%
z&gbzkX%hz$2hPHQU6$E&gOysb-D-pEcDvK=vO=3{_uE5OZ51}oCRl&Fz;3poHo{8m
zd|P6}ZLxicZ}9_u#tEFnU-$=R=h$_29OvoGdh28PHp!;iB8?ug$84dkwi?@zjdvz#
zJ974IvrX1ujn<MgAD^=&ns4i7HQtr9i35oPT^)FwnNcrZ&&lk|wDscv4&?7Pm_s;>
z(|HsBv{QD}zOg)hZ@=0!9<z!3$;Q)}w@yphKHG2a+W|XhhpZ=e+Y$TJX7gh^Y#=#S
z5ehhxqd9{!c}F&0R}KHye>7*`e9qz=&f|kQ^YOd)Me_@~S&erkZQ?-UKvxIO?U5O^
z@N0g-HdeBO0Xw;d??(TnANd{Eu~z++Y>j4)>-m}Zgimr2pXOpd%Ox!4QkHNzo4Jq`
zTK$8iEMq+z`H@EN@dJLyUwDGQX>>Nf-dSDo-kv>9@^79ZbLQjqf1`8rx>=2PC2itB
z;y_mi1|jV>iPuHF*en{v8=_G(i7lc|tP&OIjXp>RMWR@|AeM=@#ZIwXI8h>A6w5^^
z^7X6~Riav~6gn+fEnXFCMU8k(tW%UywHw4nQ7aTZkjg+R1E~z8GLXVR3WFxyG^AY_
zMqxyxFCT@vm3SUgkZMJkp5!^naiN?QV!QfkUAvHEC%G=r{9d)yN-ymt(@Um*MM$Ps
zvOY|5kI+sp*<P~!8c`D_=Oxlhq?br9fnEZ=Z1fW8Wucda{!P)W7%!=95pRiYI<Zx4
zh%EFwgf#hg#4gdU<SxvnR;@^<r8Y)4E#q|8a)oYZCSW42!sXgJB~u}<6n*Gp7-p%$
z%3BwDyI#m!CvROX?!nxsIuaF>iE{BWzAEYvs-=^Nz^m=ht<P}vw_=V)s-F*M!*gX)
z5T+KM(14M;^(l-hQl6Dvl`H!qOv6xIj7#)#v962?a49asy(*u)59El~N9E+L(`VuI
zS-3FN-pFSq;gy6}5`H66%}A*xt__oP`IHVqS3}XEd#a{arM=d@D(sb<Z^L9=a7|Uj
MR9#kG<>~7F11am<y8r+H

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/bw.dat b/res/Keyboard Layouts/bw.dat
new file mode 100644
index 0000000000000000000000000000000000000000..805cb06fea78a0d8e124fd27c4f6824ba9f93235
GIT binary patch
literal 4600
zcmeI0XKYVl6vls#h?N!*yY}7`wOg}BZHl657e!H2)vT%#D<UEyB2pvLh%_Q1B4R~w
z?Y;Mk_#o0mM8xS||I`g>`F!t}^PY2`d(L~F<bHUbWPUvD7{zcpQHwCT(2XYapeMbF
zA)02ipc-}PKs_1}MGYcpzz_;im?9LT1Ob$!G-W7D8*5jYDomw36=_Lp23aM7ehgq7
z6PT1cFTarJ0wfSi95a~hs{7M;-yzALdeLLRW1s*GWanZIaf@plVFyP!#&Py>f|H!)
z9(UMJCfnG_VRo^H8*Jwa8C+r+DWsA{I%`<VdN#6&ES9j<dcI&YTR6Z$E?Rb$bDZY^
zk9bmmJLNz=x^N$O#w*_N-c|Rf?|g?({?v;e10DkfU?5pPKp`5X;cBny>Znk4Rzr1F
zcZDlP(Q2%w3Q|qARc+N*l&UIHbu~m^_{uj>Ar)3p6<2^tsg*ucL6tOBWmHbh6|6xv
zp_d}mU*j}ElXB<fceO+pE<v%1(+tga)%|_qef6Zjy!E5J=rQ0ike7k%+&|`^ZtAKI
zX`2q~h>j{l$8=mLbXT{vNBguz+m)pq+NJB-s>|9bN6VC=RHZ51daTh}U#A0FqRn=C
zt_|9x{mRq@%TDTy&gs4$>ah=%_XdAHe{|tK=&4@nwcfkx{;%Kq>Yx7d){pX{$AHH`
zUIu~)HkIDWbb5$s_qMd7y{Y}Cgqp4|&KwpnnFQvskoinwmg(=&j3JQm%rz|^%M?@k
zaZER5-jVvI@S{m4iHRhd){keV`3TKuZmvNM>)F`+g+R+nm~sf^R2D(hG_#?$SqpW|
zXvi@a8qkoj1}w&4Mi6c$LnI>^Mjr;6k+8_bMIc=n>N6*LnLQCfU$YiEm~F9?#b#kd
z(cNr}Ze}+0w_#y){y93#J^I()&I()HNyk}*vkqtFe=P6p#!10hp3nY^-Iw^ae?6QG
WoUDJ|J!kT2oYZ{QKehMw(cb}+naoQ7

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/by.dat b/res/Keyboard Layouts/by.dat
new file mode 100644
index 0000000000000000000000000000000000000000..cd1edd5b620fab2b6358a767329684259a44c81c
GIT binary patch
literal 4725
zcmeI0Z)nz46vsc`!!Q*sv6A6R{FB-I(@a~Mnpw)okc^QrGBdF<Lox<}U}al#jnw7L
zrmmLS@=q+ar8d-NHKal+&b1Jvv`|XKLMjA7kS@>m#QfFJcfR>OZ_d5vet-9So)6p?
z=hV^mo6I5>GL>7H#&n7q%?wJI$r2WG7kAT-Arvu`k(4rk1&m-mMh;!*N_Tp2ExqW?
z4cr&6>&s14(T7|na4+*><_YHT6faXoMZ4eSLTy5@no3@01*;PI?6x|ySeM<VF(r@^
zxB>!W)F%3c-s+*>_=3~?&RLwlILCQ%b)&xL2>Ut6NxtG+uG0a!=@4DCflV~9l@DlS
zJ3DD&7ssh*Z@hA__R!2xej+D2T;L*7p89D(yWizX8=cS<Xpn{|Un3Iv>^;LW`NB?4
zv#K<v1X2PW2^?vEF-z5?MlI8ms?u^*YoThiMr+lq-73{0J*K%T*E3q69h#+Wny<~8
zpoyBK`!z*HdO#2AAw8^@G)|AIL<d!@N3>W=)DRu&RIiQNrxtyFg)j7QLie3o^`*Yn
zH;H`qzZ}Zsf9T{it4d=^ASKX|K&iFu`r0%rvi^2KgX~tzx9&FF3T%`W+jQ$`z3iMW
z>SmK&V^i(CCR>h8vLAI!KkKA^)hV5hFYk>0P_7---*G+L&gxHHZ+&cHbSSj3Hr{4f
ziOp>H>sZ78t)EZmp0imt$L89ziG23kr!)B%Iyud%(wGuR33Mco#~qA{-Ts{v#y)=x
zV`HyBGIsa(#J;{8zL!u*copA=@4;K}U4$yayLdBUSsV)VBvcTV;~(Q6;hzy+!4Kg3
z@!j|*gq4IE9w)p(c#Tkoe@dt&loM9qO@wN0k8_3o(Q_CD@w$RIPgolLTbsy>qlST;
zsHkN;gBcfx2}8M!d}c>!SA0Fb1#iIX@VD@K{7rltUX8ECH)o3T_wh!2HNFbpfN#WO
z?Qi32@LGI3UKSmFC%zTmgujDV;_u-f;x+gVhW}gKi^<|HC3m8{<*Ks#PkBjpSC3rl
ImP^t718K2Dz5oCK

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ca.dat b/res/Keyboard Layouts/ca.dat
new file mode 100644
index 0000000000000000000000000000000000000000..9300409adddd6396248ba13c33dde16e1043631a
GIT binary patch
literal 4551
zcmeI0`D@Q{9LFC|B;-o&xo<O@YwmOIb7phQnQP2#nA?)1r6nybNseKySu<<onB$Ek
zNs^KzB|k_?N=hj&pY5BkkFVwr_<ZW~K3?zF=lOcSpY^WK^O;HIGk_FkGMG*bWjG^=
zVKfPhV;*yer4Q}s!a%wa%`7@FgC0zy2DPY79qLh^hBT%LP3dQFt!cw@n$yyQo?`6;
zdnYlUg)H`B)i)WwlnpFpC97EHi-)G^-e7BJ8uS4J0R#WRz^AI5A|CUQ5{^?!8Rg`2
zm22GKDNi_00mnE&F(*00Bl38_DekeGy=1YU103WK*&HT^LUxjCn6Eg(Q4jmBwH5Z>
z<{8g<;l-+NKKN4J^OD!R;hirYn!fc0A4Aii4;Tm-_zwnlsWK^EbCs+iYO7%yp;79t
zF&eA!TA)<*RE%1wy#}eHx@xwfl%&o|)EB<;jqm&b)l_ZORekl>XPT*n($q*z6sNwL
zZWShKvZiXWmR41(eq))w%nYqiy4GrwFCIc#@5OigV>Of&^Z^3_1K|wZueve0DpsNL
zbWq22LML@Zr*ua7wp!w4?AIY3Q?_zcqys9@VV#e7*N$qhvLdd8SFL`0$A@uKr7Bao
zuKVI4q^n-s{bMzh74!iE0R!O-MA6qYdw&KHZ~A_aIRHaU?e}Jc>H4~CX1l5G47S=|
z{Wj9s$R-+?65qlK(oBu7W({jilMkb_xdyw~VY)w)Wo%%*IS8@bD>TEPgTeK}71@_@
z<`rZawksuyj%GH*nXS;3QJ%5TgPtt0%sM17m+@vaq>##NCX;B^L<7c<Y=*=HCYqHn
zg{fvh3}ug574yxc7;82~g4q(&>He#1_V2Pc{AI27Xk0$-EbbicBJKk2GOi4F6IX$|
z74hh<0C$B2EQ(0LJ`+O=O%8=q;L33&xMJIjJ6*}aCI4prK5L|NhMzFH66wO9NIwBg
CskpQN

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/cd.dat b/res/Keyboard Layouts/cd.dat
new file mode 100644
index 0000000000000000000000000000000000000000..354ac14bb0863f10b29ed3d602b39c146a6c0038
GIT binary patch
literal 4498
zcmeI0`%jN?6vto3Wnr<_)@Cjv5edmPDz{vdTq|;qM5J7bR4OH*XlZhrHM1B-%oZ~<
z-|xQJm#^8(%*@Q1nVFfH`N7PbzCAVHhgE;T^Zar?@AI7ZInU?4JwKdxA<fSe*0Y)!
z3}q&>nM)|q#1Km|8yL%Y0tjLn!Gy4uA*^I1E9gWQyy$^9z3{;oKYA0P?FQgaI(_NS
zL?)A<nMEuijuf`A)tJ{_$TJmWlg18qvB#8eftl_@ehajsrGTYC2Nd{i)ZF7OuX(^l
z9%9GAbspj535~p?j$71F%Y80$jW=B26<2sk38fsNjAK+#NfjqK#a)UyuRT9=hI8De
zo)?Oq@{H%a=K~)*@J&r6KTUN%_{0~!^4*kgf#2MRUoFszmI9Un9Z(=qJc|MiJi>_6
zBvL~39AMxeBQ~)*OIPud9^x&%#7BI^PkPG)5g8!<GEe$QKN%zAB-~(xxntB{e9y_A
zDBe`JMCM40#L6O5-jlVw&9|Pl7P1tu6gY1BV^R&A(VE{YyY!r5;I!8K|Fz4K)sn0=
zd9qfL+Nu42hvw{26ZeqhNTC$TK~vtdM|qoXJ!>swDPSqkmq1*FxC$6X4tcueyAI$g
z!&Ry)ek9%KuExMVwE=drn`|<5g-<5~=UIl+)4h>zWRq_8n@QE(ew%LT&MMY1NEh|J
zY8_;e#CApyu10{rQU+?*U{)zLM2&-donX7EPC+PR)MXf_KEnj{48oYiX!RL_b^LS^
znWgT*GW8qcn8!l(5*jL4qa7Br)NNMGQM)3V`D#}zprM5Q+CG8hL=mrkMl4eqrNf4{
z4$n0Y4^U&nc2zx%2&Sk9V!MZ{TvJ1^SG(_Tuf=hK$A@uV#(qaf57rK@B64vY#dV3s
pg45dER^z^!>0-7z?Dg8kUV@_%XE6=c*iR|naYQ+d1vmaB{Q;Aor3L^1

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ch.dat b/res/Keyboard Layouts/ch.dat
new file mode 100644
index 0000000000000000000000000000000000000000..76f044ac99abe1bd17199f09113f68878a97b6c9
GIT binary patch
literal 4645
zcmeI0|7%ut6vtoh%San7%S^@;ThlD7rB*9zep_mmWto=cm&`I(T3Tu?zl}9*Vwy5%
zU$o}3WzXCi<|tj}Z1}m)Ls2l043P@y38@gN2$3SBbD!<8bxGPEa4($aeEFPnKIgt4
z?hog^oc5=H=}hGoaw%j4qqv$P#xRaq%;Z|Gqc3^f%mA+9A^LGY1DT9R2ItY8OfKL;
zE}|#BxWU?Glf#qrHfxB<B$M$>U?Q`5jK|IE%2N_bT1+wXd75WK@wB@zWh_m*k&Y0E
z5a<E|e{|%0$WgwgnQHd2p992b<sd%a@eMm^U<)<uVLLlG!kc_WEr%$hoYhpYmUX<s
zMk=YIiBev-o<H)c{WkIeZKe}^&X*kHdw%G+@Bh@PP{MB<=VwmvODLXpPo|91X*bdl
z0ucgTKwyK~lZv!J#Tu{6G(i(JNkc6@MN_pzi&UUt%29uf)j;KIp89Hz25Gj=fIMZW
zn=+N99_p!H8l}JJt!%AG^)1v0%}QC*G{baB%I?Bgyd27`&@z>(Oshljbg%MMeEm62
z(^-*@5Qq@yj6j~(?j6+`oz^k6Dyif8Np1EeozO{Tc%FAihqX@!^{wLiLVv17r}UYA
zSCwAVR#mG;wTh`hyVRs3s#LSp_V7LmeT%=Uo0r*fTjvS>+wK?2%<;0ki@i&{>`**i
zeQ7G5dydm|R-_{YA_O`k(1)R1Z(I9~6mXMm_`{3?7{Zmd)t}EIUSKYZd5+~g&pe*7
z?b~l5i$_^vi+nLp*qT3|r)(|v_u}us)fq#ujHS$>#CH9KEJ$$&`Nk&XlFu~^x8lLZ
z7nB*t;F{=Tp*%bE>$t)gg~7%y3`(&N-MNnkjeVGGOv7{@;7;x}9>L$q<<_8xDU9WI
zBNgs2TH!A4#;?cUj@ylUmuW^&j4>+XHtsRXp^#g7<m~k$!`H85H2rZcxC6LGR^n=T
z*fyBp?MIVXMRHXmZZC;Cl4~kWHk(wD*o^-vGb}X=KZgG{{%+!%NUSGbNBrZUaz)Uv
z6!$)Ef6zAhVztRO1I6vZHJ_bnW_Tv|4#|qQf>#+}h80z8GpQl@Qf+`)@RqGMU|T(j
za)Ze2A`!#AXM=4b-bA7bzb2S#P4IX4mAD2H>xjn;U@NephBFdZZ^LXc*=jJkPw?Ns
M|7Ru_`}a_P1GV@BKmY&$

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/cm.dat b/res/Keyboard Layouts/cm.dat
new file mode 100644
index 0000000000000000000000000000000000000000..18f4c163caba2890294a8a27fccab8cdb74d238a
GIT binary patch
literal 4593
zcmeI0eP~Z{7{xzFYt7o$T9R0r8D<z}W@eiihMD(a80Kwem>HYBvDR9WBuQFpX$dV!
zOG}a#YptavNs_eWEw3dhN%Ht@Kh3SR{pGKF|9S57+|zTu-&6OGbIR#?;@QYL5(y`n
z6jGVY0@7H_7P5(E8l#CIf$>C<MHrbxvYH|I;ENyr1Q0|pAq*qV){P{TJccuZ7-Csz
zlXNmzP7d4I*~>RjDRBUb$R(eB6guYKw!rgJ>TTWXD&Q(G2nD|NVs7x5huoxrTioUj
zS7_xfZ9L@(O<bjp3$)P4B_2`F11{1<71h*G%W+O{l2e@K49y(nyzP9+S<Z2d>)f}l
zoenyA#&fy{ai%|zFAm%%UhtZ?d~nRY?K{uQS8wZ9R{>XnK`2n99?&$c)^f#aq~a8>
z1Vt!O$x6{WWoo=4HC&;J(P)KhrA8=2VM^Bze)0=6L_YGBpZpb|XniL{!<3^S1uIIE
zwb&R^wLodg(ne+X@(pyf0tYT%TeMv}mFJjy_vCu!h5dZ>qTK2#;408pfzQ2v%vE)%
zQ`dD)&AOo$UC>S4(rrD|12yWR&gi_ZsZI^Lue0h<z1np|Wvb9oRjFDvs?~9wP?L&v
z+IBwENuAOqT~V8Lchsu8dZfpCGRQyly#x0~PxV~gdgYjV@AASk|Jcu0FUqa10<Hpm
z6&S^IbLlh8r_VI+K8tu}o7<m4lKJ|f9OMYQDB>_>6tjl|=D#<wnLxI2$h>?myUpq6
zv)7#Y9445<&!(JGc2HtozkvOgBSbURQiCwtImz;cK<oU?IV5qfnNf_fuwkr43*#(k
z_!BNfGLfwY^kWt4S!f|cCL37G5>{A{P+{gGka?`}gcFM_o=9h@MGFZQTO6a(B8)8N
iTa1xvVZ$;bOJ?q0>SQPN|Gamlll=eP``+b$xqkyTTfLD0

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/cn.dat b/res/Keyboard Layouts/cn.dat
new file mode 100644
index 0000000000000000000000000000000000000000..18f4c163caba2890294a8a27fccab8cdb74d238a
GIT binary patch
literal 4593
zcmeI0eP~Z{7{xzFYt7o$T9R0r8D<z}W@eiihMD(a80Kwem>HYBvDR9WBuQFpX$dV!
zOG}a#YptavNs_eWEw3dhN%Ht@Kh3SR{pGKF|9S57+|zTu-&6OGbIR#?;@QYL5(y`n
z6jGVY0@7H_7P5(E8l#CIf$>C<MHrbxvYH|I;ENyr1Q0|pAq*qV){P{TJccuZ7-Csz
zlXNmzP7d4I*~>RjDRBUb$R(eB6guYKw!rgJ>TTWXD&Q(G2nD|NVs7x5huoxrTioUj
zS7_xfZ9L@(O<bjp3$)P4B_2`F11{1<71h*G%W+O{l2e@K49y(nyzP9+S<Z2d>)f}l
zoenyA#&fy{ai%|zFAm%%UhtZ?d~nRY?K{uQS8wZ9R{>XnK`2n99?&$c)^f#aq~a8>
z1Vt!O$x6{WWoo=4HC&;J(P)KhrA8=2VM^Bze)0=6L_YGBpZpb|XniL{!<3^S1uIIE
zwb&R^wLodg(ne+X@(pyf0tYT%TeMv}mFJjy_vCu!h5dZ>qTK2#;408pfzQ2v%vE)%
zQ`dD)&AOo$UC>S4(rrD|12yWR&gi_ZsZI^Lue0h<z1np|Wvb9oRjFDvs?~9wP?L&v
z+IBwENuAOqT~V8Lchsu8dZfpCGRQyly#x0~PxV~gdgYjV@AASk|Jcu0FUqa10<Hpm
z6&S^IbLlh8r_VI+K8tu}o7<m4lKJ|f9OMYQDB>_>6tjl|=D#<wnLxI2$h>?myUpq6
zv)7#Y9445<&!(JGc2HtozkvOgBSbURQiCwtImz;cK<oU?IV5qfnNf_fuwkr43*#(k
z_!BNfGLfwY^kWt4S!f|cCL37G5>{A{P+{gGka?`}gcFM_o=9h@MGFZQTO6a(B8)8N
iTa1xvVZ$;bOJ?q0>SQPN|Gamlll=eP``+b$xqkyTTfLD0

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/cz.dat b/res/Keyboard Layouts/cz.dat
new file mode 100644
index 0000000000000000000000000000000000000000..d5ef361159f3c69e15161182ce22e103d1f0efc3
GIT binary patch
literal 4610
zcmeI0`EM6h6vaP>5UmY0L=0g|1i@B8D1s;=)*@0Cp~}8ki-2shgMdImr~zdQ1vI4)
zB#qFfK!IYAEz~gc9Svb|4<W=5Due)vVnT?K#rvIhNSQ$BA25@=ci+43-h1Ah<o$3@
zE|p(8Bgy7<o*{!C^rAhz$>c4@@E#p_k*8?IYqaJ$-X(=BQW-`qYV$COBvF@o)Tbd$
zNV9UyXwFogu+>X+_RIHUAVV0(`%J8ad*Hkv6fu{{Oy>hW4EclYEPt^u*hV&DAYz~f
z4E$Rav!7G^$|1hw8xG@AipO^x;WtjRlQK53g@Y8cjgu7eGbQ}UCoE+-D_O;A*77;|
z6tI`YY_yse*kJQl?BRQ}M>%fu8P4*%*_wRULP1wK&qXftSI8f1|MVBvgKcCZ1|kM(
zz`$Zv2Bm4VMyRWrC__EeOKsF!nd+<Y8mo5dpayEHbTwB?jZz~GSF*Bn3sg(B^^g*j
zs5*L7b=6rncwF^0LyuYIj_RagW(R1HhG>E&X-XB|gRZtH6gOYfG*h!RFXRvE%<=sn
z-{&-lifqI{#6WchZdbjS-8!vbv`=evP~|$TLi5M;t<LI<Hmg`G^qKZ3UmJB&tMrrB
z>xX;3wO#sD%k1P2|8%QLb;4gA(J`IVg?r{yzfZ9KFBExQmvlvc>srVk#Q)>_Z{FuL
zh>C2)K*T_G1{zymAKQReNNgou0bV)oA>2aTQrr?=A%RDj#%xCW?e|<}GM*{c-n$1(
zD@bAlGfW{E!&tw&pJ4sHw-cwBmziU|`Y2|Zt}vNNJWCr>4_eaH=2oU3B$<Mc$VUd?
zl+oB^g?1)6Ja1CN3nn&nG~uAFNe&70WiZ|7#{iQX2GWx^O_E6EX-n@yf0HXR=<drE
zZ<t*1qzMlx3^k#lD}zj|$fOUi(uv`BU~|H-%}6(`qJ=?alWbx0m~VHB|8f>NROD{Q
z`5Ld7iY0kA*4kKuyAQXVw|U2kEg-g<Sf0O&>mpt*-Xg1)Vk$`%&MqsSY!LCX*(Qag
z8AL!qYWOY*oG6KBcf;9%SA?_0;H-KX?mFBraQEWoTavpZ&aaz?vlVX{u_A-8G<TET
cCdUVHN~l=4&PIW8;2emjS#kjE6y1&dKa*hWeE<Le

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/de.dat b/res/Keyboard Layouts/de.dat
new file mode 100644
index 0000000000000000000000000000000000000000..e34763cafa9ce8e7a2d62be87e55b851d59e151c
GIT binary patch
literal 4672
zcmeI0`)^cL5XV2?i$Osuii*Jov4|iR1O&8LTWb|XP!z4Ah^Q!tprD|DRkQ_K6@0XS
zP_V30%a%uDDGd}_pyAwIqtOtehNw}4t0BHZj8Q{EG)}kOhOQ6#2i%*?otbmy%*_4X
zoFC?!Ps@|RB<|vB(#R%<T++Fo8yLeBCNr2J^yVV2;$jAJH+{%s0Jr0D3Y|HPu5{xJ
z&ZGzDaD}DoMJhAsY1S}CaGU9|++yzsn99SZJMzp=3YyDwX7U(MB&{dh*>PiG!VPqQ
zK!8985IEKvQ^#j~N<HQ5rjfmbX<|P<U-AW;*g_d0cJMZp9AX_GQ^7%AppYdL^AgK=
zh1V!y1+^?<wdFj*DtlK`!vWJ#-seNU<}k6=dM8uAB?bJ#cYM!}98FqJxIf2@KN4=B
z0|WvDI)K1hwFKpAj%H|#`f8lUYl24DdY&d~f#xYgnd+_n8m)mEs#)rzX&R)d`V-Vi
zoz+F%)Lm!kY@Mqd9jBL4^`g#;XU^7?)(Vr9uSF_s^-k8>8%c4cD$>hZuGf>+6M0^Z
zudn%!-9%KN0|WvDPDCKfYw><kPp`Z8t3J~2I;P|L%5KtM!n?pb-#e^t^_~vus6Nr>
z>fwE$)4fAF)eC8ZHfoc$sz!CHSEKgn2bC*gX9s)x<9G2$+l}nxrFs3l0j>2;?BU<+
zQAu$ly>xGgH_RKJwBG(~=Kt=tj}5#4fdGM2o6#?4xXtM!ZFaws3`Q{&|1BHqyYM6n
zn8sY5BA=&ulsPtj`+JNVNZ~=|*(^VuM{Lrc$t;`9{hj!g#u7ZkLLOqi&HA%>oIzY>
z{K2JMXzz667gCH%=xUQg7OvK4f;9T#s_19TLVw%2#Q23QuCd}1n8;}381jslxRaZ>
z)p!KI+!Cd5EqBDpi5rcc7|S?r#$S!U6t~S-iF=HnxXzf2T*e#ckZGL7{cY8=ldHSk
zxb3()+#cLsTs6;fFZbC9GdceKIYbu|TU?FXNwkVsaf!)FlNI>8@b~e&W%R>DoA9?0
zDJ8m`NEMM?@pA>+i50BHHR877D$EI)l$)%_?ZDNW6*gJf*5GshXmA6uqBn8x;400s
zvqkGoEYH%4W&rJzU6ZwXU^CIemQLR#8pdt3CQFIb;+Nrva5c@17V}L*2)_ikh3GOO
lVZ*%nSV5ghgNebh+0;6dG85~)0e=mCbEm7?x@`9g{|33Y7x(}G

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/dk.dat b/res/Keyboard Layouts/dk.dat
new file mode 100644
index 0000000000000000000000000000000000000000..923462befe68bb3cff9af4914f7bbf768b1acda0
GIT binary patch
literal 4637
zcmeI0`EOKJ6vsc`r)Uu?h^A=@A)ultVnIZdeGvgs6hzU=rYI-~BKw-Mq{UPsrMOgO
z(MrqKAhm%~wubv=NJt18Levm7WHf}RA#sgHV?1wW9w}pL`Ukw5oVoX$d+xd4`M%sA
z&UY!P(Tf6}<bFERm;Mao4hA!nVN7BIcXAi)xryG~LKmK*1LL@rv3Oj`Rb+7u*K!?g
zXv>ZCv~s!R@gh04>TdR!*>E1>5vK4Q&zskru`nZPF4LI7%go7$hwkj;VsYq3bHqTz
zKr<NlJ)Kj-=bUCAo2a9nLsW5u299x-FWJE^%Gp9KAFz!xyvJu$aEd}!v4$dEql9(5
zK`CW?%nIJNn&0uJ{Z^ZuH1j#m3BKYR&Y9Po@pDGfMG~Cn0zYQNL-+gS;@8lP=7@oa
zfo3qUR;i?cnyx7trcN56Q5vnD79XQ=nx&cQtv+h6&KjaF%GXqN&_s1rf&Stj&=qQ-
zEVWX$TI+iC*PrAnPYZN|a?-U^H;gxL&SjDRgSRFlvrzN2NK3RLBOcaRmW&rQu^VPZ
zbHqTzKw}2-yp(rFf9p4$RlUB}Ien`W_L9!)f;<oJq&`)x4(kgwD6T)WU%$xdC#}<Z
zmFX>&>wRrig(|f}r&XdFJA1XaTYHkP@nZT-{*ay<-`?~(Cygu2XzR7`T6(R#HW~47
zKRX%EZDKdfisp!ch=Ilow4(=iTi1RMy|~vp{QFD;=uTJb>Ra+Ei+F*#%x4J;c!^i6
z`}Qlz=2_-hBR`Gl*5=P(rnTjM75)L-5pH8Ci<!zo>-A?dE2$lHGc}<j-K=UqJDhKN
zL7{03u7-AWGFjnf+%`I!qL6Ru!tF`*A&W7LH}zqxDGg8a1S5IWbOgW1jt}N>9^gTf
z6h@e+Fp7uqi}A~G+wGPDQzwR+jxmJMrZ@DZ50fw5Js|UL_aTFDADO6OxLqa7c!r7A
zz8J9O$^Soy_-YcXt8shqkCG@ZHQQ)bMtoxs$;R!%--^GN*aqUS6WdPgKyb<(#qGu&
z!tErna+BF+qr>gP)m;KK;Xi=tai8F7affjgB#JiU*M)WV;u>&O2JF;M;;Vv$0M?cO
zd7^j&u^QrKfp4G=25k7H0lIhzu`1&>II$o99s2|WQlQEW)Vs!$Wrv@~RbLM2UqGG#
A`v3p{

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/dz.dat b/res/Keyboard Layouts/dz.dat
new file mode 100644
index 0000000000000000000000000000000000000000..63502e8d48480c1ad1cb862c6f98d9a80b059283
GIT binary patch
literal 4797
zcmeI0`ES)l6vaPxf?5zT8dM^v#j;od%PLwF5U^^s3ZhjMP!vQ!76Cz7pDcZ?ETt_i
zP%73^3Suo-1xitg-zgwb6B4($Mf=pK2{FWwNYtpOudSg?3H|}^C3ogKGiUB{zVG|P
zJxi(oB{PAC8A5l4F`SX~A%#0g<#8UP9|O3CYq^>0xSnxz<so{Jj-wS9(3%Tr$3<L1
z2QKGExx0#Zp5_WV>-h%m*LXMgFq%m`$y4>=&N(h@hM3PZW-^<3&Gs9YbD|H68<(*;
z#z2gL|G_{<s|W4pD?aBSCA`BS-lH7PVUF@G-%!CGwo=Lg%Gkvh6!R%N`Ir@~B1{&m
zSxYuK<dM%_UZ6-WPq2|f&6OP2c#IGDh+4kq$NF&R96L1R)d*~FKXZz|X=|9XR(6^{
z_={gT$#0x*an>e^zpUA<#@n$u#z2gLmKgY<;ftAI*_LIKZHP^^88+KS**sfd3$4KN
zY>cJbARBHIEydDojU`)#rP>PJywa|=E|y^3tcN99PwQ>ttdsS(fmUis)>nwJQU6Oc
zhHSGH*~`&&OPMs?`>q-8Yb&uz3+zj)vG?sm+h^7Gu9ev?tFYttiG3EuN1EMg>NB>A
zF%V;*DFfB6em%fVaTDEOcc~ldMz|E$-KDxTH_FX&(_NzL<=VTBZjkHj65J$ru^aE=
z-B{iHMc>;AJ87rvwEb!Sm~;KyPu5l^%iMXcwdSO#|1mCI^IW&UEsCz2=Frk=-&t^#
zuF!3DC2pO|bp>v@%WyBcGPlcBMDbN;xz$pH*j|i*7z3Tu@%vZR-uF<0-y6S^NAWxG
z#UyeIaq8|TvXIHlQRn?U&oY%+>cYFK<9~*^(T;wKdirThSI0jCe}JG;D!~Gt;|b<V
zJ(ww_U@*ya(Qdo~^puLwjwIT!O#Xv6=tN%$4E-fB43t<fNCLu55+8y+LdJ2cG>O}|
zPa48l9^g*yWfZ|SIT+0ti4-Z^9u+C>lE9EgH-a|__VS?Qi4l?~hD&r9D#0R&U<Z-a
zs}#T9eIzrtAzaUf;C%!eBDayu{4+CKN&<^`gvAm;#z`O<#(0)QN%3XWR_75}UQX?S
zEwb0~hwumS6&%}we+yqFf4)>l+o-KtOC+?3qdWAt9sf3dH-|&`eFS3cHG+fGtmW7?
zA{luE<plDz5x<|{6?J9t+Afgg$Tlj+T+Qoc8)UiSDUz{Srff1c$@0Z`B&$@>e?PMp
zpQRLZBP3iX2cJn~WeGlv4+&me_bTG>87eE6phRgG%E~!hg;zc6II<qU0l%rPs+Bqt
zq-u>^6>?NuRF&e3@Y&QT^8&mQ3Khv-qGk<8>JqI>UWtdwqOYQk=(<9JVj^MH7S?fC
gwS`qzSn#l*VL1sa+pww%3m)37M7JycfB&6-0g5<fv;Y7A

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ee.dat b/res/Keyboard Layouts/ee.dat
new file mode 100644
index 0000000000000000000000000000000000000000..1d81f07788d6a8e1f227e9049079711fffcf3a91
GIT binary patch
literal 4656
zcmeI0{ZEx;7{@=~r*dSPWmzWXC^b_<%gVF}(JYIyEY0#I$}%k~Dl*?4p<-okU`9~j
zkm!(%nYtiS(RM%QX*C<GR?Ss&?$lg0SDSOSYQ0?Nz+rgG#UJq8+jU>}ecjjF^WB~w
zuJ3Z%*EnV~lPogGCWlFkU^3TnJ$cOKB1SQg^SP2CT*#daVg?s*8y+XpgEV^5i&Hs`
zzMRQeOV^(PJiu9Yx|mCuW;&Otw%^0O%s1VgwK&D8kOk!PFps6!lh=a8VQKOj>JWht
zfo>r1ONY-pe933DP{mGmvxf-p<B0MV`+187D%eCbHPrDruki`Bv{6JcYbfCv*7H0s
zQpyH)u!?fa`5hZ=Z{%%0HvIt~+5Qa&IB2>%>qv^zPsBLH_Z&{KC$B#y4o8#MP=^SF
z2y_F1GPOHRRDl+1iZYa|shXxSW}mK^TBJga)p(_Ah$d^8Mk!zCYQ9Ejp8nu3&<Q$8
zX*xx{)kmjmf_~#{oueY1p?;PlOL>V3vouFbv`i~H>iu79FQoWAt5qu28a<t2Pv$8}
z*k3x%Ytk#!Ap#)+T@lFi+HVKd!~0u@6zB&X*3bIF{-h&1s$O1CZ@<3QUVW%<wNIbQ
z^PK)vn|@chDpjo-)heO}ZPgAn>3}w>)nW&DE!uU=-}tNgczwNo9re2Q@L%WQDSkt}
z{@y@ukT*ERo{Y^%*he1cHR%=V5P=YZt_Y-a31e(Zzl_UmcE5sgjJK(Mq)qiF^EgYm
zpF$R~j3;@JM{WA{cjGtFn|VB8v-|=U+N7V)LpGWF&G>Z;V>wH?kHt3Y7w|}eJIFLP
zA%jfInq`rrjV~zTYTS0xInQW?!MHkx8ly1U*oEQtGQq0f${k#59K#G|aXU9~i}474
z75*!hVItEL?8Fq~Cvv%woAAr=*IJd?#!g&gJjNt$Hpby9V=V6Oteu@&+r38)?hPX~
zTq~}T70lr-8(-!cQ4#<A9D>!vRyX3B3F?WhD>Zr9WCMN+{vKStrSu~NoAI|1EhBi2
zXg$%Ecwk;Ur6mr`Zx^nX*i%&|)rN{|G9a>9+1c94f3>!mSjp?{&BaPAuB6&z6S1|m
zaopTC++Kq^jkYZW#qsQJD?tSJrnOf_bUS_p{-$_)>j-M_OK}YZ>xo7T=XgXTL96xP
bwpdRUCY6Sm+ll`w{=4j}>}<_Nj_vIqhoTAO

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/es.dat b/res/Keyboard Layouts/es.dat
new file mode 100644
index 0000000000000000000000000000000000000000..b6afe2acd0e5ee3ee9d509b0178f19a39860642e
GIT binary patch
literal 4647
zcmeI0{cjaj5Qd+3C5=@oA|fgn%ZI2`K~V&;RzMU*5d^IjD~cj0C<r3ov=(epFr)<|
zAQS|o*Gd(tsRa=m&)%Dmkf0%I2vI|>hNvMVeut>h*;`iYMw0sn>`7*4&YYP!v+rhq
zn0EoKYart(<_3ClBR4UWE4i6l7{LTe>BrSv%q3jUr4&#?ckbbG#^TYA98Tv9+H)3X
za}MV+z{+*yA|B^F&NurSM%(jtlRJ5sN0?+*Hfv5KXcm*1%9A`D@rT>#8Dn0!jdhGb
zj6fC${CYCxT|Va^&1_;fd)P}oEqsK}VGgmKw^+|+n%GK$PpRb-wsC-RDp*PtFR+}K
zSV=XjXk;<#tmZeo%qymMu-~33lYM-_R~#`boAqNP=s0PP@-4?A{&4$!#`rnh#yUnI
zMj#6WR;V?oNYgY)!_`eAG*Y9~*ZgBNPBS$_{WU;cl&_)csXm&b3p7!^H9^1gCx0QG
zrX1z!Oy#MA3Uz``>a6+dXcY!&uu4rAt3=~X&o;?!EsI1h)m$yqVpT-^VYTv%|HV_B
zhEcJO5r`3Ji$E{0b$3{JCv-$D`dUZzoj$fd>6nfy$7|;u)Mwf)r!SS#e*K{j^qcnS
z7gcMu*63Aj&}({KZ>T{#bVw`JY`Go1chuD8Z~Q?&Dc5U%^0u}e{J)(aiR|We@H%;&
zy$d7$FuO~}-{TagVN|SR1Y!i*BGA=l`~EhiUu%>5bqr*XP5D>ZobNW<V4urO=JFV`
zn9Y2i<q2lk0A4^I6M4o)`N>SNL4PXKY%up5aqr_NSin3UWsc4I(|L+3=xba;AM)*4
zK%u4fGrpkQSO(W<L_v3Y;F{@W>_Trlxy*QlfPZi;cKhAjXB5O(BOC7LUZW63GsX(#
z896bI;oNHE#BGe^4kH%)8r+-s%Z$S)G2Wt>Vcf+iV>1Tx&_8z<Mekn35TiTFaC>nL
zEaU+mwBe;R^WH;9Eg`+60rwuM1nH`3lhr1x@OR;Vm<i6qufyMjzmsGQsTCv>BzFaw
zWmc}#in;B$J-98TpW9$kYmm66;Dtj#7Dbyf+|!loaa#?ObfqO#)|zZ2{rr{yF}E|o
zrp$UgP*18NDDB=RRfpSV&DD@>#9xcQ(aQQ&xCDN608MH+$vQ*WGJ?hmDZ<rTLu*ae
S8CJoUTZ8{^U#{-Ijr|P_-ve&|

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/et.dat b/res/Keyboard Layouts/et.dat
new file mode 100644
index 0000000000000000000000000000000000000000..e5556fd58d71a7c28fd98a60d969520799fc5883
GIT binary patch
literal 4845
zcmeI0eP~T_7{|ZQqh<(2O;L!fj4@&%o0mceA%s}o8ciWDO--(%&V8$?sVmB5vt2g!
zioJzK5vvi45!s4ZA&Np?zUSO~b)C8KCv{GJ&hvY|zwhrk&w1+nbD9ypHX?`swqgpl
zV;6F<5P5LnAVMg@5-i7fWMVUBVjhko9R-+;d?*so6MfJRNf?O17=~o5XSp#*Lp@S3
z8mq9@DsRBYScVGJgdg|E`%RnUI%?5~%V@Ic(e$ddxD`#E=uE(wz+X&Yr-V%-7#B;b
zbYmPR6QwWXWNUAw^p^qhowkwEU3$qfstd?mxr<h`;R)LD9Ix;i@9+V`r3GK<T_>OL
z1%qUW%%V3#W>~d=HIewI*0$MvIg%wCWRq;M>CrmbmcAp-Zq(&OX9CUyVka<D!`UNA
z(mvWD74kwl<&9jI_wrFb%U~U-H>FuZQX@~LR<24vEt8(wC<&S?dE%0TVu(-jr9c95
zTpr3EDUxDI)1aJ^J96LpBEO09Im0wrQzFlc?csOpOq*|tj?wWtK_}Vt=-G5jpB`s7
z>T;qp0cQfS6X=Y5F~=BhXrb<9EYVUu#8__awWwSDx|{10x=#=2ZLY47D>_H#>mpsM
zD|EGH=?2Z#96hSDbSHNo=r-M<hxLdyFss%}yqnj(NDOE3?=Nh=4sF#oeXP%HdbGk5
zOMe+>H|lbtGXZA;u@e}CcK;c2mXwk*a*muQ<)ngCk_MzA1BvK?cDD=dUITCIc+Lnh
zr^g#&et}eyYWnjDeZCNSQz@a-beYu*s>CpNiH8*o=KfQpn4SQ&Agk6=CvL7itY%R6
z7m^}U!oLec+0iIWW&N@I3$dTwHC4iVoho9sP(v<|i{uhvF@GJYCymJB;Y60tXM1eR
z7i7Fhst8Z|OpPZzF6#x%CfSIWijR#LY{+BQJ4sHX!^PZd?wi%9yXp4?FzsiXnO)ob
SpQoPJ^>zNmsW%n>+UE~ph`l`k

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/extract_keymaps.c b/res/Keyboard Layouts/extract_keymaps.c
new file mode 100644
index 0000000..9839ffd
--- /dev/null
+++ b/res/Keyboard Layouts/extract_keymaps.c	
@@ -0,0 +1,329 @@
+#include <X11/Xlib.h>
+#include <assert.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+// It looks like ES_SCANCODE_PUNCTUATION_1 and ES_SCANCODE_PUNCTUATION_2 are mutually exclusive 
+// (_1 only on US keyboards, and _2 on everything else),
+// and X11 merges them into key code 0x33.
+
+#define ES_SCANCODE_A				(0x04)
+#define ES_SCANCODE_B				(0x05)
+#define ES_SCANCODE_C				(0x06)
+#define ES_SCANCODE_D				(0x07)
+#define ES_SCANCODE_E				(0x08)
+#define ES_SCANCODE_F				(0x09)
+#define ES_SCANCODE_G				(0x0A)
+#define ES_SCANCODE_H				(0x0B)
+#define ES_SCANCODE_I				(0x0C)
+#define ES_SCANCODE_J				(0x0D)
+#define ES_SCANCODE_K				(0x0E)
+#define ES_SCANCODE_L				(0x0F)
+#define ES_SCANCODE_M				(0x10)
+#define ES_SCANCODE_N				(0x11)
+#define ES_SCANCODE_O				(0x12)
+#define ES_SCANCODE_P				(0x13)
+#define ES_SCANCODE_Q				(0x14)
+#define ES_SCANCODE_R				(0x15)
+#define ES_SCANCODE_S				(0x16)
+#define ES_SCANCODE_T				(0x17)
+#define ES_SCANCODE_U				(0x18)
+#define ES_SCANCODE_V				(0x19)
+#define ES_SCANCODE_W				(0x1A)
+#define ES_SCANCODE_X				(0x1B)
+#define ES_SCANCODE_Y				(0x1C)
+#define ES_SCANCODE_Z				(0x1D)
+
+#define ES_SCANCODE_1				(0x1E)
+#define ES_SCANCODE_2				(0x1F)
+#define ES_SCANCODE_3				(0x20)
+#define ES_SCANCODE_4				(0x21)
+#define ES_SCANCODE_5				(0x22)
+#define ES_SCANCODE_6				(0x23)
+#define ES_SCANCODE_7				(0x24)
+#define ES_SCANCODE_8				(0x25)
+#define ES_SCANCODE_9				(0x26)
+#define ES_SCANCODE_0				(0x27)
+
+#define ES_SCANCODE_ENTER 			(0x28)
+#define ES_SCANCODE_ESCAPE			(0x29)
+#define ES_SCANCODE_BACKSPACE			(0x2A)
+#define ES_SCANCODE_TAB				(0x2B)
+#define ES_SCANCODE_SPACE			(0x2C)
+
+#define ES_SCANCODE_HYPHEN			(0x2D)
+#define ES_SCANCODE_EQUALS			(0x2E)
+#define ES_SCANCODE_LEFT_BRACE			(0x2F)
+#define ES_SCANCODE_RIGHT_BRACE			(0x30)
+#define ES_SCANCODE_COMMA			(0x36)
+#define ES_SCANCODE_PERIOD			(0x37)
+#define ES_SCANCODE_SLASH			(0x38)
+#define ES_SCANCODE_PUNCTUATION_1		(0x31) // On US keyboard, \|
+#define ES_SCANCODE_PUNCTUATION_2		(0x32) // Not on US keyboard
+#define ES_SCANCODE_PUNCTUATION_3		(0x33) // On US keyboard, ;:
+#define ES_SCANCODE_PUNCTUATION_4		(0x34) // On US keyboard, '"
+#define ES_SCANCODE_PUNCTUATION_5		(0x35) // On US keyboard, `~
+#define ES_SCANCODE_PUNCTUATION_6		(0x64) // Not on US keyboard
+
+#define ES_SCANCODE_F1				(0x3A)
+#define ES_SCANCODE_F2				(0x3B)
+#define ES_SCANCODE_F3				(0x3C)
+#define ES_SCANCODE_F4				(0x3D)
+#define ES_SCANCODE_F5				(0x3E)
+#define ES_SCANCODE_F6				(0x3F)
+#define ES_SCANCODE_F7				(0x40)
+#define ES_SCANCODE_F8				(0x41)
+#define ES_SCANCODE_F9				(0x42)
+#define ES_SCANCODE_F10				(0x43)
+#define ES_SCANCODE_F11				(0x44)
+#define ES_SCANCODE_F12				(0x45)
+#define ES_SCANCODE_F13				(0x68)
+#define ES_SCANCODE_F14				(0x69)
+#define ES_SCANCODE_F15				(0x6A)
+#define ES_SCANCODE_F16				(0x6B)
+#define ES_SCANCODE_F17				(0x6C)
+#define ES_SCANCODE_F18				(0x6D)
+#define ES_SCANCODE_F19				(0x6E)
+#define ES_SCANCODE_F20				(0x6F)
+#define ES_SCANCODE_F21				(0x70)
+#define ES_SCANCODE_F22				(0x71)
+#define ES_SCANCODE_F23				(0x72)
+#define ES_SCANCODE_F24				(0x73)
+
+#define ES_SCANCODE_CAPS_LOCK			(0x39)
+#define ES_SCANCODE_PRINT_SCREEN			(0x46)
+#define ES_SCANCODE_SCROLL_LOCK			(0x47)
+#define ES_SCANCODE_PAUSE			(0x48)
+#define ES_SCANCODE_INSERT			(0x49)
+#define ES_SCANCODE_HOME				(0x4A)
+#define ES_SCANCODE_PAGE_UP			(0x4B)
+#define ES_SCANCODE_DELETE			(0x4C)
+#define ES_SCANCODE_END				(0x4D)
+#define ES_SCANCODE_PAGE_DOWN			(0x4E)
+#define ES_SCANCODE_RIGHT_ARROW			(0x4F)
+#define ES_SCANCODE_LEFT_ARROW			(0x50)
+#define ES_SCANCODE_DOWN_ARROW			(0x51)
+#define ES_SCANCODE_UP_ARROW			(0x52)
+#define ES_SCANCODE_NUM_LOCK			(0x53)
+#define ES_SCANCODE_CONTEXT_MENU 		(0x65)
+#define ES_SCANCODE_SYSTEM_REQUEST		(0x9A)
+
+#define ES_SCANCODE_ACTION_EXECUTE		(0x74)
+#define ES_SCANCODE_ACTION_HELP			(0x75)
+#define ES_SCANCODE_ACTION_MENU			(0x76)
+#define ES_SCANCODE_ACTION_SELECT		(0x77)
+#define ES_SCANCODE_ACTION_STOP			(0x78)
+#define ES_SCANCODE_ACTION_AGAIN			(0x79)
+#define ES_SCANCODE_ACTION_UNDO			(0x7A)
+#define ES_SCANCODE_ACTION_CUT			(0x7B)
+#define ES_SCANCODE_ACTION_COPY			(0x7C)
+#define ES_SCANCODE_ACTION_PASTE			(0x7D)
+#define ES_SCANCODE_ACTION_FIND			(0x7E)
+#define ES_SCANCODE_ACTION_CANCEL		(0x9B)
+#define ES_SCANCODE_ACTION_CLEAR			(0x9C)
+#define ES_SCANCODE_ACTION_PRIOR			(0x9D)
+#define ES_SCANCODE_ACTION_RETURN		(0x9E)
+#define ES_SCANCODE_ACTION_SEPARATOR		(0x9F)
+
+#define ES_SCANCODE_MM_MUTE			(0x7F)
+#define ES_SCANCODE_MM_LOUDER			(0x80)
+#define ES_SCANCODE_MM_QUIETER			(0x81)
+#define ES_SCANCODE_MM_NEXT			(0x103)
+#define ES_SCANCODE_MM_PREVIOUS			(0x104)
+#define ES_SCANCODE_MM_STOP			(0x105)
+#define ES_SCANCODE_MM_PAUSE			(0x106)
+#define ES_SCANCODE_MM_SELECT			(0x107)
+#define ES_SCANCODE_MM_EMAIL			(0x108)
+#define ES_SCANCODE_MM_CALC			(0x109)
+#define ES_SCANCODE_MM_FILES			(0x10A)
+
+#define ES_SCANCODE_INTERNATIONAL_1		(0x87)
+#define ES_SCANCODE_INTERNATIONAL_2		(0x88)
+#define ES_SCANCODE_INTERNATIONAL_3		(0x89)
+#define ES_SCANCODE_INTERNATIONAL_4		(0x8A)
+#define ES_SCANCODE_INTERNATIONAL_5		(0x8B)
+#define ES_SCANCODE_INTERNATIONAL_6		(0x8C)
+#define ES_SCANCODE_INTERNATIONAL_7		(0x8D)
+#define ES_SCANCODE_INTERNATIONAL_8		(0x8E)
+#define ES_SCANCODE_INTERNATIONAL_9		(0x8F)
+
+#define ES_SCANCODE_HANGUL_ENGLISH_TOGGLE	(0x90)
+#define ES_SCANCODE_HANJA_CONVERSION		(0x91)
+#define ES_SCANCODE_KATAKANA			(0x92)
+#define ES_SCANCODE_HIRAGANA			(0x93)
+#define ES_SCANCODE_HANKAKU_ZENKAKU_TOGGLE	(0x94)
+#define ES_SCANCODE_ALTERNATE_ERASE		(0x99)
+
+#define ES_SCANCODE_THOUSANDS_SEPARATOR		(0xB2)
+#define ES_SCANCODE_DECIMAL_SEPARATOR		(0xB3)
+#define ES_SCANCODE_CURRENCY_UNIT		(0xB4)
+#define ES_SCANCODE_CURRENCY_SUBUNIT		(0xB5)
+
+#define ES_SCANCODE_NUM_DIVIDE			(0x54)
+#define ES_SCANCODE_NUM_MULTIPLY			(0x55)
+#define ES_SCANCODE_NUM_SUBTRACT			(0x56)
+#define ES_SCANCODE_NUM_ADD			(0x57)
+#define ES_SCANCODE_NUM_ENTER			(0x58)
+#define ES_SCANCODE_NUM_1			(0x59)
+#define ES_SCANCODE_NUM_2			(0x5A)
+#define ES_SCANCODE_NUM_3			(0x5B)
+#define ES_SCANCODE_NUM_4			(0x5C)
+#define ES_SCANCODE_NUM_5			(0x5D)
+#define ES_SCANCODE_NUM_6			(0x5E)
+#define ES_SCANCODE_NUM_7			(0x5F)
+#define ES_SCANCODE_NUM_8			(0x60)
+#define ES_SCANCODE_NUM_9			(0x61)
+#define ES_SCANCODE_NUM_0			(0x62)
+#define ES_SCANCODE_NUM_POINT			(0x63)
+#define ES_SCANCODE_NUM_EQUALS			(0x67)
+#define ES_SCANCODE_NUM_COMMA			(0x82)
+#define ES_SCANCODE_NUM_00			(0xB0)
+#define ES_SCANCODE_NUM_000			(0xB1)
+#define ES_SCANCODE_NUM_LEFT_PAREN		(0xB6)
+#define ES_SCANCODE_NUM_RIGHT_PAREN		(0xB7)
+#define ES_SCANCODE_NUM_LEFT_BRACE		(0xB8)
+#define ES_SCANCODE_NUM_RIGHT_BRACE		(0xB9)
+#define ES_SCANCODE_NUM_TAB			(0xBA)
+#define ES_SCANCODE_NUM_BACKSPACE		(0xBB)
+#define ES_SCANCODE_NUM_A			(0xBC)
+#define ES_SCANCODE_NUM_B			(0xBD)
+#define ES_SCANCODE_NUM_C			(0xBE)
+#define ES_SCANCODE_NUM_D			(0xBF)
+#define ES_SCANCODE_NUM_E			(0xC0)
+#define ES_SCANCODE_NUM_F			(0xC1)
+#define ES_SCANCODE_NUM_XOR			(0xC2)
+#define ES_SCANCODE_NUM_CARET			(0xC3)
+#define ES_SCANCODE_NUM_PERCENT			(0xC4)
+#define ES_SCANCODE_NUM_LESS_THAN		(0xC5)
+#define ES_SCANCODE_NUM_GREATER_THAN		(0xC6)
+#define ES_SCANCODE_NUM_AMPERSAND		(0xC7)
+#define ES_SCANCODE_NUM_DOUBLE_AMPERSAND		(0xC8)
+#define ES_SCANCODE_NUM_BAR			(0xC9)
+#define ES_SCANCODE_NUM_DOUBLE_BAR		(0xCA)
+#define ES_SCANCODE_NUM_COLON			(0xCB)
+#define ES_SCANCODE_NUM_HASH			(0xCC)
+#define ES_SCANCODE_NUM_SPACE			(0xCD)
+#define ES_SCANCODE_NUM_AT			(0xCE)
+#define ES_SCANCODE_NUM_EXCLAMATION_MARK		(0xCF)
+#define ES_SCANCODE_NUM_MEMORY_STORE		(0xD0)
+#define ES_SCANCODE_NUM_MEMORY_RECALL		(0xD1)
+#define ES_SCANCODE_NUM_MEMORY_CLEAR		(0xD2)
+#define ES_SCANCODE_NUM_MEMORY_ADD		(0xD3)
+#define ES_SCANCODE_NUM_MEMORY_SUBTRACT		(0xD4)
+#define ES_SCANCODE_NUM_MEMORY_MULTIPLY		(0xD5)
+#define ES_SCANCODE_NUM_MEMORY_DIVIDE		(0xD6)
+#define ES_SCANCODE_NUM_NEGATE			(0xD7)
+#define ES_SCANCODE_NUM_CLEAR_ALL		(0xD8)
+#define ES_SCANCODE_NUM_CLEAR			(0xD9)
+#define ES_SCANCODE_NUM_BINARY			(0xDA)
+#define ES_SCANCODE_NUM_OCTAL			(0xDB)
+#define ES_SCANCODE_NUM_DECIMAL			(0xDC)
+#define ES_SCANCODE_NUM_HEXADECIMAL		(0xDD)
+
+#define ES_SCANCODE_LEFT_CTRL			(0xE0)
+#define ES_SCANCODE_LEFT_SHIFT			(0xE1)
+#define ES_SCANCODE_LEFT_ALT			(0xE2)
+#define ES_SCANCODE_LEFT_FLAG			(0xE3)
+#define ES_SCANCODE_RIGHT_CTRL			(0xE4)
+#define ES_SCANCODE_RIGHT_SHIFT			(0xE5)
+#define ES_SCANCODE_RIGHT_ALT			(0xE6)
+#define ES_SCANCODE_RIGHT_FLAG			(0xE7)
+
+#define ES_SCANCODE_ACPI_POWER 			(0x100)
+#define ES_SCANCODE_ACPI_SLEEP 			(0x101)
+#define ES_SCANCODE_ACPI_WAKE  			(0x102)
+
+#define ES_SCANCODE_WWW_SEARCH			(0x10B)
+#define ES_SCANCODE_WWW_HOME			(0x10C)
+#define ES_SCANCODE_WWW_BACK			(0x10D)
+#define ES_SCANCODE_WWW_FORWARD			(0x10E)
+#define ES_SCANCODE_WWW_STOP			(0x10F)
+#define ES_SCANCODE_WWW_REFRESH			(0x110)
+#define ES_SCANCODE_WWW_STARRED			(0x111)
+
+uint32_t remap[] = {
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, ES_SCANCODE_ESCAPE, ES_SCANCODE_1, ES_SCANCODE_2, ES_SCANCODE_3, ES_SCANCODE_4, ES_SCANCODE_5, ES_SCANCODE_6,
+	ES_SCANCODE_7, ES_SCANCODE_8, ES_SCANCODE_9, ES_SCANCODE_0, ES_SCANCODE_HYPHEN, ES_SCANCODE_EQUALS, ES_SCANCODE_BACKSPACE, ES_SCANCODE_TAB,
+	ES_SCANCODE_Q, ES_SCANCODE_W, ES_SCANCODE_E, ES_SCANCODE_R, ES_SCANCODE_T, ES_SCANCODE_Y, ES_SCANCODE_U, ES_SCANCODE_I,
+	ES_SCANCODE_O, ES_SCANCODE_P, ES_SCANCODE_LEFT_BRACE, ES_SCANCODE_RIGHT_BRACE, ES_SCANCODE_ENTER, ES_SCANCODE_LEFT_CTRL, ES_SCANCODE_A, ES_SCANCODE_S,
+	ES_SCANCODE_D, ES_SCANCODE_F, ES_SCANCODE_G, ES_SCANCODE_H, ES_SCANCODE_J, ES_SCANCODE_K, ES_SCANCODE_L, ES_SCANCODE_PUNCTUATION_3, 
+	ES_SCANCODE_PUNCTUATION_4, ES_SCANCODE_PUNCTUATION_5, ES_SCANCODE_LEFT_SHIFT, ES_SCANCODE_PUNCTUATION_1, ES_SCANCODE_Z, ES_SCANCODE_X, ES_SCANCODE_C, ES_SCANCODE_V,
+	ES_SCANCODE_B, ES_SCANCODE_N, ES_SCANCODE_M, ES_SCANCODE_COMMA, ES_SCANCODE_PERIOD, ES_SCANCODE_SLASH, ES_SCANCODE_RIGHT_SHIFT, ES_SCANCODE_NUM_MULTIPLY,
+	ES_SCANCODE_LEFT_ALT, ES_SCANCODE_SPACE, ES_SCANCODE_CAPS_LOCK, ES_SCANCODE_F1, ES_SCANCODE_F2, ES_SCANCODE_F3, ES_SCANCODE_F4, ES_SCANCODE_F5,
+	ES_SCANCODE_F6, ES_SCANCODE_F7, ES_SCANCODE_F8, ES_SCANCODE_F9, ES_SCANCODE_F10, ES_SCANCODE_NUM_LOCK, ES_SCANCODE_SCROLL_LOCK, ES_SCANCODE_NUM_7,
+	ES_SCANCODE_NUM_8, ES_SCANCODE_NUM_9, ES_SCANCODE_NUM_SUBTRACT, ES_SCANCODE_NUM_4, ES_SCANCODE_NUM_5, ES_SCANCODE_NUM_6, ES_SCANCODE_NUM_ADD, ES_SCANCODE_NUM_1, 
+	ES_SCANCODE_NUM_2, ES_SCANCODE_NUM_3, ES_SCANCODE_NUM_0, ES_SCANCODE_NUM_POINT, 0, 0, ES_SCANCODE_PUNCTUATION_6, ES_SCANCODE_F11,
+	ES_SCANCODE_F12, 0, ES_SCANCODE_KATAKANA, ES_SCANCODE_HIRAGANA, 0, 0, 0, 0,
+	ES_SCANCODE_NUM_ENTER, ES_SCANCODE_RIGHT_CTRL, ES_SCANCODE_NUM_DIVIDE, ES_SCANCODE_PRINT_SCREEN, ES_SCANCODE_RIGHT_ALT, 0, ES_SCANCODE_HOME, ES_SCANCODE_UP_ARROW,
+	ES_SCANCODE_PAGE_UP, ES_SCANCODE_LEFT_ARROW, ES_SCANCODE_RIGHT_ARROW, ES_SCANCODE_END, ES_SCANCODE_DOWN_ARROW, ES_SCANCODE_PAGE_DOWN, ES_SCANCODE_INSERT, ES_SCANCODE_DELETE,
+	0, ES_SCANCODE_MM_MUTE, ES_SCANCODE_MM_QUIETER, ES_SCANCODE_MM_LOUDER, ES_SCANCODE_ACPI_POWER, ES_SCANCODE_NUM_EQUALS, 0, ES_SCANCODE_PAUSE,
+};
+
+int main(int argc, char **argv) {
+	if (argc != 2) {
+		fprintf(stderr, "Usage: %s <layout>\n", argv[0]);
+		return 1;
+	}
+
+	FILE *f = popen("setxkbmap -query | grep layout", "r");
+	char oldLayout[64] = {};
+	fread(oldLayout, 1, sizeof(oldLayout) - 1, f);
+	pclose(f);
+
+	char setLayout[128];
+	snprintf(setLayout, sizeof(setLayout), "setxkbmap %s", argv[1]);
+	system(setLayout);
+
+	Display *display = XOpenDisplay(NULL);
+	XIM xim = XOpenIM(display, 0, 0, 0);
+	XSetLocaleModifiers("");
+	XSetWindowAttributes attributes = {};
+	Window window = XCreateWindow(display, DefaultRootWindow(display), 0, 0, 800, 600, 0, 0, 
+			InputOutput, CopyFromParent, CWOverrideRedirect, &attributes);
+	XIC xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, XNClientWindow, window, XNFocusWindow, window, NULL);
+
+	uint16_t table[512 * 4] = {};
+	char stringBuffer[65536] = {};
+	size_t stringBufferPosition = 0;
+
+	for (uintptr_t state = 0; state < 4; state++) {
+		for (uintptr_t i = 0; i < 0x80; i++) {
+			XEvent event = {};
+			event.xkey.type = KeyPress;
+			event.xkey.display = display;
+			event.xkey.window = window;
+			event.xkey.state = state == 0 ? 0x00 : state == 1 ? 0x01 /* shift */ : state == 2 ? 0x80 /* alt gr */ : state == 3 ? 0x81 : 0;
+			event.xkey.keycode = i;
+			char text[32];
+			KeySym symbol = NoSymbol;
+			Status status;
+			size_t textBytes = Xutf8LookupString(xic, &event.xkey, text, sizeof(text) - 1, &symbol, &status); 
+			uint16_t offset = 0;
+
+			if (textBytes) {
+				offset = stringBufferPosition;
+				assert(stringBufferPosition + textBytes + 1 < sizeof(stringBuffer));
+				memcpy(stringBuffer + stringBufferPosition, text, textBytes);
+				stringBuffer[stringBufferPosition + textBytes] = 0;
+				stringBufferPosition += textBytes + 1;
+			}
+
+			table[remap[i] + state * 512] = offset;
+
+			if (remap[i] == ES_SCANCODE_PUNCTUATION_1) {
+				table[ES_SCANCODE_PUNCTUATION_2 + state * 512] = offset;
+			}
+		}
+	}
+
+	snprintf(setLayout, sizeof(setLayout), "setxkbmap %s", oldLayout + 7);
+	system(setLayout);
+
+	fwrite(table, 1, sizeof(table), stdout);
+	fwrite(stringBuffer, 1, stringBufferPosition, stdout);
+
+	return 0;
+}
diff --git a/res/Keyboard Layouts/fi.dat b/res/Keyboard Layouts/fi.dat
new file mode 100644
index 0000000000000000000000000000000000000000..ce811d22324f0d96abd618106144419956cf68ac
GIT binary patch
literal 4604
zcmeI0`)k&96vtn05iwB_5fL|HX=;|XdA~MqS(arvGiz#PI!#SY%WLyiEyfI$&2$c(
znRAJawjsJw*6{oB8Qu`nydWa=AR$AHq6;E|$M2r!;qgnx{($d?=RBWt&gXp2`J6X=
ze>m?|G_C<;^EyLFV;Ijcf+rcp7{>Az)9A(1q|${!JkArm!K1uJcd}?kb6U`nR<x!q
z?PyO2`dPY8bml!enwDYms>$=b$jiLLyUa4HDQj6EXbH2K$NPK`@W;)CzOo{2hI@!W
zh(Hq%_$L-q%|*^}kR8<U14k&QmO74dh0E+?KgE=CfUhXyXG%EB*PLN3>-m&C@+sg8
zHnN#QDp}1|%XytG_FrLg+Qd=M39fRDU(9OC`ZEx8izvTwgPQ?=+-&fbzv5=NhX{lS
zGy#E?Y7FY5$(pD^O4U#eSEhPuq(<9Wwx+0;?VXgS{_3J0nxxK}pl%v(-aFg{HB$?<
zQfswUJEiM39n?{C)IOH^e*Uo<XV!F+8A;y%d*0GO++yWuuI6h|z#q@C!1phI$Z0$(
z+(QIH1d<WB9s6Pq=z@OIVY6ygr=zNn^G~kmlD;!-m-gt8_G-V*Yq!p5pH69w)+<l>
z+MrDqQKT=mP1VZPPP4A7#J}HIE286OT}$#Lzu~|1zXP#<D5@K3(C-0%{O(QP|L;Ri
z<5A%rA`l{wj6e!~=xbAZe+DqnCj7z10c7x$P4$nknC0ZKgpXLsQs%PArf;{GHq78d
z8{}s*$Hx45%(t=J9m192eM1jcv4WW_vsr&33w-XNx3LLn^tP<S?Q**D1#69C@Ty7S
zF{2f_;+4_O7=?6W7kc{aLrW$y#n^`|V;bIMGB5Co@dz%@u8(38&+?p63ge7a7|%<%
zt+>zdYOPAPu@hsA#~957;~R!Cl(!SLGlR89;_Wd;Bf752q=b)|%5<AvrX_lheo|rG
zyC41bk5v;XvJ@w_<96Yy673)R9%sLDP8Q;}#afSSz&mJZx0@6to{$@Sg16hwcj6tv
z`_{A_CZz^aCSDa@ojv3}3|Y8RAB9{Zg_fay6TcoV#cfWY;EHjdQ(uEu6Kg+GV5zp4
R6kGA=x=J5?ul&LK_W+@7>CXTF

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/fo.dat b/res/Keyboard Layouts/fo.dat
new file mode 100644
index 0000000000000000000000000000000000000000..3d74e191b6274766dc990cab2b13ad638797f195
GIT binary patch
literal 4651
zcmeI0`)^fM5QV>WLK;DeiYQ`9Q?Wd>3ZkN*QmcUSP!t7Gv_VBtRK!|EE1*zqeGmer
zDl}3nVB1uRg_=sS7IdF`H6%n5HAD>|dPCF@HH2tFd<5s*hnAxa`~l}C`^=u%vu9S;
z&HiE55>mg>6mthxkw+m#T+8{4=Q<{G53{*|;S6LDSCG#z?j)C)3}FTyJ;>rDdeNIc
zoJwE%aha7ni?ex{Gi`SfmvF1u$=t}z%;A0>NVPlew=9(LB=eZh0!l;ij9Zf2EXuf%
zjTnd+H~|L!Oy_K4A79Zy9i8mtW18@Z^C{o5pG|D$4c4=rjWqHNwd|#yFDd5*DtU?J
ztY9ToRP!2bETzV39%PMuTWIBTv%A>M9ugej`*gqKnIoZuU-^-r_=Urvc*Z@H-29$#
zBO5UgF>nG5R4J7-LGv|NQ#4dlHBHks#^N(IOQkB&SQTlI3N%r}HA?f8uQ?j2yCwBd
zmU`-B_0efMU1zAj#_1@z%G0wNpn>VysSd^FEmYYtvF-t`2<5%3#agE4^<pTVsZf!O
zuk7YDlNH&Bfrx>w3=H#9-hO3yM|D8He$YYvtS{^(9nxX-_Ii1H^|d<niN4b=?UCnw
zq`$OVf9Q49Xr1b`LG@}<vs%=ueR@?LcDJ9`ruO7(Jd%Esza{M{>3&@?{NFx5l$YoA
z_4<1QyxdScb2ld$AJWZfCM&WL0}%sV8OUKI7u%G6DWhz5znsyGv8lblruv?g@RUvL
zkMjg&1oQU-9>cH4-$J(O0;Sx?T$|?~<RP2(AHi?HZ^v~qlxKL_hW&-y%cC~52lBy%
zCMe|Dx4<NZY(|)5@El`tTgl-ZQx?v}z0F_~6-JoAaGsr9Z2+d3%rJplm~O(v3?^}t
zNeF%g{wk|*jmZjuKykfE6qA|44fvJ#YjKU%Xco6Kj@wMdm}<Jim8M(F{-=FmxV>9X
z5pJVN8wTCgv&aOFVwMEh7AILKB3@3Syczc{{tgnAt87)<T1~t<h-Bm5!LJK=iB%C_
zPOOnwdvMF`z-_{H;F?G*U1zJ-7;$a5ZMe;b$-R~2<gWjK+Ky|*y@&e{w}C`OExuhz
z)!KsFiEA)$pEVI*79<4F-VD$uDyxWXCB8cF4cG?(BgU8^jK4yx!6*)HypO-e{)xgA
Uu(bxP#<&WyTmD7mnvaF`H~Ntbr2qf`

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/fr.dat b/res/Keyboard Layouts/fr.dat
new file mode 100644
index 0000000000000000000000000000000000000000..6f2ec91a2a05b0171c25199b4490fbeb4f418457
GIT binary patch
literal 4644
zcmeI0|4&wR6vtohtEFUQnT;7)n3QIjSy^eOL`IpGU&^vH%hD_=Dl$z)4Go>K3Std4
zBqHRCF+(;&v|@ek^Q>B5++1IrtLC0s&ADo>Hs@-s!-dD_mXkl=KHK@6FZX=TIrshS
z{&3!_==_ai9``VT3&|pzNnAz_H**UQa6gxGCFe7o@r>Y7=90;5F5yl*dees#`jJY1
z1~8B`uCa3GlEGt~%{gXY#T|A|<u+!pfQNXvv)u{L<)Mrv<dVmeEDpt!Zhl}CB;80y
z2t)|<0D(Wca$4EXSL~*m_h{z>8u5wqA>Z*0+i9Yb8rrC38~do@3+ma+T8dcD28wx+
zmno%;S81V;3afdLayFZ8W{;g8^9i4EfCN8u^*fO|5=!`upE$(N91g{k?yrGyH0ee<
zLLfq*2M83aGij3Yv`CXRR8uugGd0HIvozbze2vw34c0K_XoN;9R~cHMk(w{mODCz1
zQq)hW>aR0&rn2=HgOsjiI!kGGdty+3j-B&N76)Dr#$tUabFG$Yg;uIC6i?P#9mF>r
z=V>x4(h&j?0^Jc9;&pmo3-74D)w?>N@AacTwJ+(Q4%yk;+oQc|RlD}f=_CEAT{@z;
zepiXgRIbgcP?c&_uSUJCFZGgI?AB>sbGL8t7qbuRWG|(wTlWe6-yR&w9ORwqo$d|r
z(n9g%?SVo3yyHAgW<@$eAVQ!!0_nE#`wh0<53>b-Bz`^j;n(3;aS_+i*S7olEN3D4
zws|k(86M#Y+rl$#<9~{$gN=TX?ew`kY8(IK_-(jmV+oe>EDy58*n>P{3a(`wLoAwM
z4K6koA(c^_!fLDUc970!BN(nQieZeA1y>t^FxJQi*JPP}x!yR58<}Yw!rjbbGSirj
zd(#Tc;C3S^a=0lVDW({~a4Q$E3fID2#!lQ|>_oP44ik;97=^1l)_g*^xofjqLs`Kb
z3XJNQYcxm}_p&m0b-xz(7Kt^DxOa%xkyuw^QfBfB{!aY&aWz&j3;%WeCSs+;i;2|{
z+ev&)$1JWfFm~grNjz6!vc(W_t;gmm_|H6VkSKbs<0UiAup32NOe#q{U)_P0;o{nD
zHh-PrXhq$2;x^<~8>y7o4*ZSyl~(ifhK{%POK{tWzd)?k{^ocgZdWi;p%Fc<!KT@0
SvdM7r%klpi%GLgRs=opAG6P5e

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/gb.dat b/res/Keyboard Layouts/gb.dat
new file mode 100644
index 0000000000000000000000000000000000000000..bafd43835453dfe8b6deb284e073c8f03ea8b20d
GIT binary patch
literal 4637
zcmeI0`)^fM5QV>WB1(}eq9Rfsh$x6!1r-6I76g$hih@{0QAAKctAM;)wO|`k#k5GE
z3KT7RE47kR1#5*$_PJLL2|h#A5H(z1A%u`<)P#`W+}j?lN74QP=OmNaGka$5*(*6e
zthJbyZxDAek)iY=hg?Q*2_w0l8<@=9WOF&^(3>G#NI&xF$prdx8y?4TJRRvoXHKFE
zT{(?`c3cn6;vu@xodI0QILqX56E|}o_wzvOegEg?hYIE}otZq$W1)Ny7Ni#ogD~<D
z0uci3K;ZY*nz#6Z&uOHJCbrYeYwW}kXD?q-OC2xr65FUI#va!3DX;J`Pg2Y>N?A@B
z&+;7QtfYY=D(%c4SjB2KQ_pUT-seMh@ipJFuN^a`N`48|9pXEFVm}8%`5-)yUi=z_
zk&h6F5NHPiC2A?k(KJogNcGZa<!P)2Sbm(wYnEncpa$z~_119pQMRV&Tuo9x<?9GX
z@zg;X>a3G>icZz(8mhybsVvRa8LcM=Lrk=|Ae0OC{^^TDl|`DZd0L<)p?uJ}D4kz+
zjNPCr@(}_N0&NlK;k87c={FtHmul2reWQK)!2YD~^`nmHuy$#;8q}mc+96**YpV`w
zrw*u0D^#IXTBEhvppB|gtv=Cm)m!fg-W#ERalekrYrU=Q1pmJ77OL#(b?`F06TL2>
ze9)bl&UZh?Zcr8Z2!RNJwg_a=-&pz;#?!Ad?tV3c7;J3+Qid6?&tNtSn8q9)XA$$5
z!K22%Cvgv%Oku8Z`RP1pOn)Y`jG13UA7l9EvzUcUWxjF!0v<6PA)CugHRx$)UTj)I
zrbV5MISj*XA&c`&aBv$<Te!fKhLpO{my5X9Dm!v3cQDFSh6&us?Tq0TQxcXKyU1iX
z<J0QIXwxV1xY4wQA>`ufc)~=Ce6BMgV}!{KV@=M;;o3hhFAQJq-oZ8C-XyuS4z~l>
zY!{@SS7d{xo}Wu%slDHABT+-LwA}1@vz7Rb_|0~lAH&~(Ur)S(#52Teh&QHs3UROF
z-o;gud}^K9dIQ64#l8I>)4WWwWNiu!x7}9ORkGf!isaMPDX?5U?mZjpqfI1=4H>tY
zL=5+;4OBsV3w|YjRcfYETn&CXu9id@@tEOi4TWhm+$I~Q((DBT$Ti`w!T)O}7yCOz
Fe*lPL{;2=}

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ge.dat b/res/Keyboard Layouts/ge.dat
new file mode 100644
index 0000000000000000000000000000000000000000..8e3bac35c249914a80c946f4192aba351477b840
GIT binary patch
literal 4691
zcmeI0?N3i(9LBHf_LMvf^IV?tSX4+zLU{^FHZ_KL;f0wOW?q<wv@$QeXjBrCkRAv{
zh??1NX4cG_nR(%be$33w%*@QpT<82csk62G0q3`U&iB5r^F81DzOUcTi}S5R;Fp5q
z$iW6o!A5Msb}YaS?8I*5BM*y^gt3S~8lo^4#}I}r%*Fv2^h9q2AsGEJ5Q8uTL$O-r
zMk5rZ7><!xfn@BLvIl#y4@D@(*|zn%3)fu<)hIz3E}_z;JJWJ|aMPK3(R09a;6EHl
zU?Ax$LOGm2@CrZi3%~Ime_+^?<2jZe@DVL|jc<4ZKSuKfhVm^2@h%$h08My^NATe>
zp5Q6IpdQavGJ?%`hEMp6fm)$AgBZ*(PU4id^}5?yoGUMu(>Q}sjB)8sotd^C-^E=g
z%Zr`^o&y~n_|x{r6!RsYvyA&#&MMaM7;9P22EO5I9%mkRb3aRXfH`d89yT+JPng7I
zOlAtxxPckm#4XHZ5tnc$ckwf~a|iQT$j4fti4XaRZ~2ZN{__p}<;wfPPyE8K{O;17
zvwXAl-(B2wvb^Xy;5pFIfi&aH=4mv!eP*dsO}L4ZGQx~9{S+sd!Dg7^06Qzjz6PG|
zVUK&6K4zSu>8n|St%R5{W|l_NO{9so6=${XVu~v}*~FX0Cef^L=}w)cww~I>T_?+n
zo&%l(9UTb4EPczzU=CvSZ9fn55r>(GM1sES`=T}Xil`BVqD)*8mEy7}7UxANHe)LW
zXmmnc6a}JO<cnHyQ=AcJ5s#_xXP2tS(3)E$ZiuVmlsG9$#5v4Rry*J$hw<9Uboj2R
zc(mFKN3<<p9YQbxOE3|WFd3QZSVUkN!m&-6L0GTnuVcBc72-5DAswr*PQ8nRIIJ>>
zQme2`or#s|O|<4-z#62e+YzQ+mEe$+YwCcs=2jy^U5`|(#X|Kz7XRBzqkAub^H@*&
zj~2n7QzIXJmGITtPWrP8Rk^_BW*w|^TV6H@%gbA$vzHH~I9}e>_`bL!?upJ`W=XNU
ztVgx3w}s_olQ?I2=WEocvHb*x+y}_C?Q^WNOiS-zSimmFq%5_5EQ^w4O#9zc(YfMZ
D$8I4I

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/gh.dat b/res/Keyboard Layouts/gh.dat
new file mode 100644
index 0000000000000000000000000000000000000000..b3d9f389cec8546117ff5acd2f63feb311a480e6
GIT binary patch
literal 4596
zcmeI0XKasQ6vcl>M5<8{kwy?HiYjVTRYmQpT@<w`s#fhCGxpwl@4fe^z4zWLA|fIp
z5)pCz+rRK8qMv+v-!J#Q_c^)uxhHu(oHLk|FO(KEC7irOP?<=IP>mYYqBU`ZP@LQZ
z5=H@ni6wv-f@nlK(vtxne91&+vXGT*l(lv_$VC_Y$xca1)4(cGL{pEpw5Mb0ynluM
z4nPv|B#=liN8OwD@caz)rfzf@a2ZGg17A`xd$`L@4zP?v9N`!nIKfFy^N{;&Vhf8{
z!9G^8j@vBZI%~Mf2u3oRu}okRQ<%mKX0eN5EU=!hnZrD`v4hK&o#i|idCXIur{PXN
zA)g$$54_|JZ+Y*id((HGpU>XZjV=Q&18HEOuTnrI6{7|!t6U0In8H;+5vr_6#j2@-
z6s+vZt<nlmpc*NM>M5_H^^NbKbV{!b@{zAHDYJ^}E7|0)_R6BHDxwfY*@SAUp;~I8
zIJHil_pht<a^MoxRvi_u1V`Q5r;Dea^p{gF%8f1qE(5<a@G<qpY}GYg(oW6SZtc~6
zt<*ss)=}Nk4XxH%&DKI~*J3T#70uNJE!8;<(hv>P2#wMhjnjBd)MRbe0L`?XPc&82
zwO$)_#<Jr|)+yc5Jv~U{3w`gvz11T<(+j<E)V;gB^3*^4<<yIEqsxHH!0!y?q=c#T
zQl`_(n07BmDCJG<7p0=<`i%5u0G&vpFN5euS9+TMZb>WrXh$E@^6_*wrJq1IQ|1*Y
zXbL}$!3?AW{Y~rlpu719Arv#$Ai#PSHh;m-GG9{;6-nMfPV$)9kdGIm_K@GKhM)FA
z5QS)CP#+r7jOu1H#L%23)TX{!2}4X?_)&$%9($su85B{}F>@izjEmt6H4`J2s%B(F
mn%z*>#zj!+*YF7E@RZF1|I6k>ox@W$PhR;S7EfOL=kOo#AHhxl

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/gr.dat b/res/Keyboard Layouts/gr.dat
new file mode 100644
index 0000000000000000000000000000000000000000..b9cecbdadce8a904cf7a63608360fb67a7387dfd
GIT binary patch
literal 4669
zcmeI0|7(?X6vtoZNo>k8Ga2GCW@~<JxwO<)R#FrdVkiaD$`AxWkfJCmmtU4Qjj(-b
zE;r{kmeZl>zS!n=_az>XqPXWH6&0csH;SStq%RajbnbKS9k(Zk{Q=K~`<&0`eBPgP
z&V5~;AI_;I{aMKtHgO-tJisa*VliuZgmpZ_Q{2LGu4NAQFrP(irihK)zy>@fFp)ea
zlg|{UGL7lnY2jva4cjPS2Dh<-CxQeOJkE1G&x`4FmwfIGDPE<L9aOP9<j-z*1&iwJ
zHnI_ch`|3KP$Fs3Cy4yXS^7B7mwd%(zTrE5;BuKD@ADzu4DcC4`20;Tzcb3OG_ap0
znrWepb`EivPClZZ6Bcrs9OZ44GyEJR_=yWlmVB9#$#<#JW`}gMWU5S;0x1mnvvFnw
z{^D^?v#Q8O1R?^t1pLe!^Q1IOgFGt_%L`H|+hwCvNlf-gyR^zC*(|GNojffSvOyYU
zjnv6{skWO7q*Tgei7b<HSs^RsZrLL9<Uv^_U2?D7AH?39$?%$VNT(dj>~d?k*m@+S
z8<gYHBPZol$e+F27x>>D=QOK|Y(yX;kV~N4OYeRQ-kiVE?~iwx_q|N?CVBbZEN`aw
zqg*im7xITB<y%{wlLGH+x!QYAK9Gc*3GRGs&rj|9i=39TX6IVm&x4bzG8wKkTjUjI
zcDXfNY`rw3TkMs1^Sy;$S;(KgTN?P6k8_$;MK&T35y&M_$W7MkFX3kE@|UvAI{jNI
zqtyELJSJKH?slT@;CA3%#_d8+p#$hBZaa_i7+0X(xGMA{E{67^{pbifh{l;~y?+JT
zhkFIL8@C7TL5I;H8z0<gql5(%S*nHjM=j7In<H$qynZ)@%;qi|MO;sbjSc3QZk~-E
z)|)bqa<m<-N88Z1&_n2(=zg>XZMEq_WvZl_K=TILf!3i7=s~m*ZQ?p!Vk^22J&Ybf
zJJDLS89l)5++ov;v6AB9lKf%(cKjidJCEVIa1FLPVYvLRRLyB%em|}$Q256KWVN^&
z67c|8+Ze87tPWR?v&8)*hHx#oo`6<jm}IOLzZ16)S53me##4a&cn+|w|0!+&zX!h;
ze+2is;Yy)$jkxX<C1+Jw93yXeTE_?_V>P$~DL&3_9mEX;blj+wV43Z2AH;r84wR06
G=lut#qbWiF

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/hr.dat b/res/Keyboard Layouts/hr.dat
new file mode 100644
index 0000000000000000000000000000000000000000..f64a0bbf77fe4397c3531fe8905faa7ae92c9e54
GIT binary patch
literal 4624
zcmeI0`)?Fg6vsc`ilm5D@j+CGqJTw<JQPI~YgMcuZ>^vRs0d<35di_A6m7_&h@=Gq
ztwO=3Y@w2d8k7dK(b*XyE|G+2L=90()DS|58ln*t&g^!mj6wSc%*~#;_dMp_@BL2p
zhx1)Tdfd+AJVq|plE*y^q9^$b<^i7KNqW(TtLVl+uHyzK(1l0o!B{eALt8RAkMp^J
zi@2Cexy`n_lFmF&M=s|kZlS;;!x+hfOkpa8&FB5!v>;S4mubAfi@X$y2kxxYVqxG$
zbHqTzKr0wH*<7=O@A#HRs`wZOmo4n#Q$FJ$KTyY3Dyil};?#104SdZezG5*kUSlcC
zSWYP`SjB1@C}FMbd4zJ_;yvEy3-k7{mwo)m&m3w6Ccor(sP1<TbCh2=7K#V%Z>hy!
zfg8;c0}%tQU?8S+(Ev@=B<1Nc4N|@aE8F5jHA2%=s2ufD2VJ3o>a4DsqDwSUS8JTw
zSWR2AOtbc8{^+j^W$8lAPWgS+Ph(T7(JIh%&1kMl*Z$YDBve_fnVO?{DhkDeJ?5w4
zi_ek`s-ih!AY$O33}j`by<Ix2pR`A{+N*u~QakORv|r!osE(*npQu`O+O2wR*CEyD
zptk9It9Zj~xmlUnDy>n4T)nO;^ZwLYt+%;l9MG>ic1ENn_wQA^W?Vt$+>AeTLVxR=
zP&~+6Gh(Ct*|Mk0qD90&#6SxJo#<;_`pxvSPW@K;TmL@5y8Uc&tgmlp{q|hz+GjGG
z`PO+CS_eJ@?;YGSvP>74#blngp8gr0weI{m+&6KT@C05XFEh`igE>rMx=8^&O+vWQ
zq=PQ@%rO}ui{2(0EaFa_dOC59sSaIDU+8Z7LT^(RuD8TpR-VadQyK0v<)DCZJj@VN
z5k}!{z%8{c?&cxWDe}2LrBe(wjlo@p8>1NSBNHed;a<j=lre(g+<`A|1n1|5&o5>o
z&Q=5NUwJ%5G?i?@`2eqmrdX-jO0yLt8b~yf*iK@N?U0Dm^h%}KI@3)i;MU-k_`k$@
z9DBRkGUa9!I924afQ2|UcJ<uTFp9!3l1oUIlYE<Gg?)hJI-E^74F>A-&3Lb-LDk{K
zaW)#BGTeF+<s>S7Ffp8+IPc=r;w{CE8<X~m4<sGlY`4qyG3@Zs+Z_TjocNhAP5}!;
B`nv!C

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/hu.dat b/res/Keyboard Layouts/hu.dat
new file mode 100644
index 0000000000000000000000000000000000000000..a95f048c4317246c730e004107883d6a88abce60
GIT binary patch
literal 4642
zcmeI0|8G=P5XC>|1xXbvB9cZM#3~{RS``(=ei5{ah*r@mB4`x>5djeav0^P45EQal
zQ(L4(ky0vD+f=?-iN<&PqGp3%LPA19LZ}*|MhziEjm9{;-9`4rM*e{JlDl(f-pt%{
z&*uFwXBpj3A&>G9qq&HiDB)J}xsBVogXuiRm5d;diz((3E~A_ananUI;n9oUWN{j&
za|UN}7H4yVwHwGFo+5{HxrXbw-y)?<pp3_Pf+thw{hz4}B~&nnr+J3Op?KO|nA}vQ
z-N;4^L=2n+16k@$`jo?bOF%Q9@da_(*~3?S!%zIcc6QRpRvay~@jXo(;(ZSCGOKu%
zHN<$0*QueFb$r5d-m#X)sOK#{WH$%Q+si)o^E1D4<Rma9QhKFu9Z%O$e&Y}RJ|4*2
z{F!unhpRG^A}?YfVjzQoS5jY0v1Vz8N|dXy8mI9Zu2M}<ndWM?@-;#^I!|Mir=gmu
zb2LqZHC5SG+c#C;FJ%kWNBuQGi<ACHjZ(SoCTfzVXrAV4K`Ji;#D6#|LV3%yNEKS5
zs!%*#TA7Tm?BQ)XE3y#-5d$YOFv#on_UJDi(_Xb}pZ4p3d>vGmzLV$S1^Qeq+ODs)
zOCRfZwd$xo(h>XCVz#PPqdK$ewLu#d*BWg#FWYO>7PH;YVg0CIbc&aiIxQXV+2)2a
zbG$xYU$37xAQVq`=%0)a?BQ)XE3y#-5d$YOkZaTZRW{#WZL|8djI??EdfX1&Zd|*K
z_NOwBMNCVM-p{dsnas7(K3I$EAe%>+Z}Px&W+X@ZSvK6eX58CcLC|KC`m;=Bq3H^9
zn9Xo5H|^k3&bQxTxE8C<H{qa?Li{#zO<lOa;(4Y&<XdQ{DGja$w;oq*DDE~9p~NJF
zdrfpGGhw2Xy9i>qb=GAx_i!_}m}D`QaVA-e$F0Ow;WrVq@&FS}(72B=+-YJ)F{60+
zUl6OqAYL#Dq&#`+$vlsH34aGc6J0M>)3tOPZnbS2Y}Mm-;@+@ww~5ZRbjEm)DRed^
zE*2~$sA4c~1O7JrO%$16GK3qcU<m~#kQ5n$G!X@12=NufYw=r&ze&6f{{!On_*?LI
z8Llsz6Rk_|-y_(J-$>VT`zKm(wYY`^8bfRtV)*Y8tfF&s0`ibVjlYpY9SsRU1$MsQ
XY?r9DRcEyL9f_;hh0>UcGBN!FjF$lf

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/id.dat b/res/Keyboard Layouts/id.dat
new file mode 100644
index 0000000000000000000000000000000000000000..18f4c163caba2890294a8a27fccab8cdb74d238a
GIT binary patch
literal 4593
zcmeI0eP~Z{7{xzFYt7o$T9R0r8D<z}W@eiihMD(a80Kwem>HYBvDR9WBuQFpX$dV!
zOG}a#YptavNs_eWEw3dhN%Ht@Kh3SR{pGKF|9S57+|zTu-&6OGbIR#?;@QYL5(y`n
z6jGVY0@7H_7P5(E8l#CIf$>C<MHrbxvYH|I;ENyr1Q0|pAq*qV){P{TJccuZ7-Csz
zlXNmzP7d4I*~>RjDRBUb$R(eB6guYKw!rgJ>TTWXD&Q(G2nD|NVs7x5huoxrTioUj
zS7_xfZ9L@(O<bjp3$)P4B_2`F11{1<71h*G%W+O{l2e@K49y(nyzP9+S<Z2d>)f}l
zoenyA#&fy{ai%|zFAm%%UhtZ?d~nRY?K{uQS8wZ9R{>XnK`2n99?&$c)^f#aq~a8>
z1Vt!O$x6{WWoo=4HC&;J(P)KhrA8=2VM^Bze)0=6L_YGBpZpb|XniL{!<3^S1uIIE
zwb&R^wLodg(ne+X@(pyf0tYT%TeMv}mFJjy_vCu!h5dZ>qTK2#;408pfzQ2v%vE)%
zQ`dD)&AOo$UC>S4(rrD|12yWR&gi_ZsZI^Lue0h<z1np|Wvb9oRjFDvs?~9wP?L&v
z+IBwENuAOqT~V8Lchsu8dZfpCGRQyly#x0~PxV~gdgYjV@AASk|Jcu0FUqa10<Hpm
z6&S^IbLlh8r_VI+K8tu}o7<m4lKJ|f9OMYQDB>_>6tjl|=D#<wnLxI2$h>?myUpq6
zv)7#Y9445<&!(JGc2HtozkvOgBSbURQiCwtImz;cK<oU?IV5qfnNf_fuwkr43*#(k
z_!BNfGLfwY^kWt4S!f|cCL37G5>{A{P+{gGka?`}gcFM_o=9h@MGFZQTO6a(B8)8N
iTa1xvVZ$;bOJ?q0>SQPN|Gamlll=eP``+b$xqkyTTfLD0

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ie.dat b/res/Keyboard Layouts/ie.dat
new file mode 100644
index 0000000000000000000000000000000000000000..36443bc9c72f59fad17e0311a4ab523bc0296793
GIT binary patch
literal 4657
zcmeI0|4&wR6vtoZRt{NDW96KaaztvRMp>3dNk(O+X<3wJSy`q<MQNs{m0+e}*$m9+
znbIQ~DG?zW3K6-_73XTrRddx`HJ{eEx#m`Lx@xocbAdMQmhcDMXV3Y3&N-iR&*$9t
zc7J%km(cMW!wl}?8nVe}90iQv2F5di`?!}}E@cpd$zv$Pm`)aj<ZwG4r_+Zt(m9i}
z$lz@Hai!V~<Xj%1KLfaoQQW4?L~daU5AYzfJMZghTNo;s&m4+)oTozhuCO?87I%fw
z9w87R&<g~Pch>CWYrbMPRkYAb8(Z0fV=ssJmRjnFlc0%eYB<OSzF-RnSVk!?vXYls
z&8xh|TFPnUc`DWOC)Tl^dK&m#(LVO`Dc|t}hkG$os^rg5-BEtz7k=aSP`)cX5;(`Y
z!f1~Wh!E%n0&iGH(FB_(Z;B1Esa7a&lugq*!xm^AZF!b$IX20L+epPwY`Ios|8SDi
ztdFHD7n5b!IX2$@VvuFo3hQqJE#C@ku1;p!ESqhMY^f~^p6_|E*F$w{Y`LwnGJ7SI
z@7}56l&9TmqbNckLLk@cz~EPXIWh03?eF}8zOg^-n4JisLt5MIGdp4j>|l`T>wRfw
zcyZfk3EONnR%`XvXie5^KU<~wsyWYVwLSK|CC$?ff7?mrGQ57?fX@4RLVj4NZm5^(
zWqH}&;84DMpAn}#?Oq#25dskcnT!-mzg#^13UT+*jNvM={fikZUf-8_EaGA2vw&xL
zhDUi){QDke5@Qxmi_6bpu9$uikBOOI&4pt47qEoIJj6nA{bHVwj*!bGQVp`ybGWpG
zn4)wshq1WrWOBX)2e(<;!VoD9DRm)-i@0BvX-s7rH%etF<ZkZdW^R>|uvF|K#&z5g
zs1r9ypP0xbX$yIb!`1PEM2zWNFCn8qa>HcF8TnlM-{sGRFL#?ruBgUsBe}c|_b#pp
zSBq;QSyDl=ED>PPUV*<2SC8L@dk4P-|9$)&s)@@s$ST#?--Q1*egpf;Qw{fS$L-Wn
z4So$y|MwI$<G+d9iu*v#x5(6Om&S960Gtpst{K;e+kvarvk6%P$<o!@HS#W;qLOtf
z6w_!g$1e*C{3_gs_;LI-_<Dzujk32=^ObVAr3!y7t`+w&u1yD;c_r>6d3xotmvFn~
NR>|VHPyT1He*xCt5~~0J

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/il.dat b/res/Keyboard Layouts/il.dat
new file mode 100644
index 0000000000000000000000000000000000000000..b962e397ac98c429a75474c504f3cab634423039
GIT binary patch
literal 4549
zcmeI0duWbv6vsbjNh2h;+#6%=_xlVp_xt@a_e3O0DJ6585MpL#Hs(4rbDa%yoAr_;
zNz!v9NlTI>Ns=VTYtP&3$wK~p-a60uJ>T>Fo!@!C_5AVsrt|X`&vKS9l;(_JG~?*P
zM5ZvEm8_sUy=Y2H2GN?1EF+3Vv||AgRH8DGRHYg<s7WpA(BIlMq%j+*M}1<6W4<9X
znZrC*k;J<4^Zt}lJ%k->U=v%|?!n#Ht-(c_`|4+30bhZ?P@ty#Bt76gZ+S#9k8yZH
zfTuj;IUo7JZSGLSRUUGkQr>ZiH<a+2EDmsx!yF}tT=K~0H22xZ1#9_@vz+HH_jqM*
zFDT<BpZLs|znJL<rCRx1E<IAdf<#DV5AN101@RgcR9%*zeFc04!WB4D{>3C(PO?a_
zm@D(`xzJ*<tg|PKl{gt9vur)eVt}lY;XxegN&{&kQ4%dN(ndPSG^s7UC00_Ti*%O>
zGFes{bEzzs6_PBQWn1~a@ELx$&i3#!Wrw6nnq+uzcW-(SKU6{0W%=1xz*it#fk5bs
z$q%i<>;JmWlN`ylPUrr!TZw1?RXHOCQYgh9+@0@Y5HGEu>azUoE8r^-u0SKZ>35}@
z-SK<S)9(4b=|g8a(9iDmRp>-3^aPrR?n3vW>F6Oe8_i+1-Ri5OC($%?H@Y7^ie{o2
z=m9hfJw|)_G7H^{9zj#lJ?LTdAexKjqsProXiJnG*UpTB>ULaJGYI+-D4-F|h$osB
z<~z(G#%OKKeVA*+NG33iA?8m^Ceb{K5$0BmXAP^Z!9XT4*j$WZ3}+;x%*lu~M`Nw|
z4l~Tl7{pW(7|R%QDdHFqI=a92=(6O~lqKgAIFEA*=LWYjC|keNA_b?!Qd&?QO-481
z6yp@4M!kY_8Rr7dO>5{Fa2+i`4Jfib*%tQCi_k)xYdDv13UDqOnrV^6t;?Z-lDq>&
N8lam)^+4{ggzwP`*`5FZ

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/in.dat b/res/Keyboard Layouts/in.dat
new file mode 100644
index 0000000000000000000000000000000000000000..19d4f10dc7ee35915642c13748367397d92a0e5c
GIT binary patch
literal 4717
zcmeI0{ZCF|7{|ZYJ*-#^!(v`Srjn4?kuofXVKJ<zVKFu~Ha40lh2AKXlvK`nRC*yv
zEU{+I{9w%(8zXPSFow;`FyC|Psh&gQ4>-^EIoEw(_sex%-}9VbuG?t-MWY0T*o0}=
zf^FD=Mc9QnB%%`KSc2skj}UCYEX;=klaYrxI1Ys_=!)*>g}&&IK^Te=Sj+3iU>vT&
z7o!k?C}h%;gfwKJ8a24w67OH;mSw|D)S({Nal_(wP8-ZYqjPFoTLD{v|4<-Dnm75$
zW?3hJA~H#)O0e{inG!1VWV>t?PZ=oR&{+b+U3$t!`H3~+A(3(q5AYaI@C+~T60h+F
z@8BbM@r73&koWimFY%UeMp!6evP^bLti-p(`&VjNmVJk1pCn7Fq+9&Xdk&iZ><(6)
zyKHMKU@OpG0XNk)dv1O`jpnnS&pWMOQv*kJt+VD6O_DE#qKQL_q(n-kT+T|R+>$)G
zEVc4ks-#+O^2{T0pFEUT@>V`rZfT3|I_lIeFLOnGl&|t#esysEhw1NPJ>`0-J+l?C
z6>w2t!yjMF1bU{J-XNDXzjm{^=Ga5^P(4*|)lYe<0cxNcth`j9>ZW|Sx>OBQ-YS5j
zP;>7LHJf&UT5Qf-Quym6+Olu83R5doxQep)orhPN{`DQKI(OODR=`%Ey#fQ!q@N~5
zq?nYDGo+N1k#bT&9PsBe9&T`_O(FZyq}9>xCUG3|gm#H!5eLa71*8@p+>uQ7kyLuF
z((a*UEbS~gN;Gnuoa9;(IY1IQH*RJQ8uQaGkV;a+&cbNg3icR=FfTuLEj$pwUPLT{
zP=5|AN@E~B0mCpH-dM%PgfB+IhyHky%rcs^BjgY<!WhLctX4*{$uUA%v=gL|<QYY1
zhsi;bKv;~%BsGeqog<k<CpjdaWRP@{MvP)lkz!Is&Xa0#kvXz({bXw))2)S!WiKU=
z-IocNh)L|cOksD$pGWq#ya`^bQ#YMq^;{!Ko$2aKU(aCgC4!bo>nv5L(z;HSeDQR5
zim6(RHJBGdsMyoEOD>v4@?gH9m|j3mm`WIbfILF2^mMk0VrUI5uOQeAkZJ~~ceqCQ
E4Wh7DcmMzZ

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/index.ini b/res/Keyboard Layouts/index.ini
new file mode 100644
index 0000000..792ef43
--- /dev/null
+++ b/res/Keyboard Layouts/index.ini	
@@ -0,0 +1,89 @@
+af=Afghani
+al=Albanian
+et=Amharic
+sy=Arabic (Syria)
+am=Armenian
+az=Azerbaijani
+ml=Bambara
+bd=Bangla
+by=Belarusian
+be=Belgian
+dz=Berber (Algeria, Latin)
+bg=Bulgarian
+mm=Burmese
+cn=Chinese
+hr=Croatian
+cz=Czech
+dk=Danish
+mv=Dhivehi
+nl=Dutch
+bt=Dzongkha
+au=English (Australian)
+cm=English (Cameroon)
+gh=English (Ghana)
+ng=English (Nigeria)
+za=English (South Africa)
+gb=English (UK)
+us=English (US)
+ee=Estonian
+fo=Faroese
+ph=Filipino
+fi=Finnish
+ca=French (Canada)
+cd=French (Democratic Republic of the Congo)
+tg=French (Togo)
+fr=French
+ge=Georgian
+at=German (Austria)
+ch=German (Switzerland)
+de=German
+gr=Greek
+il=Hebrew
+hu=Hungarian
+is=Icelandic
+in=Indian
+jv=Indonesian (Javanese)
+id=Indonesian (Latin)
+iq=Iraqi
+ie=Irish
+it=Italian
+jp=Japanese
+kz=Kazakh
+kh=Khmer (Cambodia)
+kr=Korean
+kg=Kyrgyz
+la=Lao
+lv=Latvian
+lt=Lithuanian
+mk=Macedonian
+my=Malay (Jawi, Arabic Keyboard)
+mt=Maltese
+md=Moldavian
+mn=Mongolian
+me=Montenegrin
+np=Nepali
+no=Norwegian
+ir=Persian
+pl=Polish
+br=Portuguese (Brazil)
+pt=Portuguese
+ro=Romanian
+ru=Russian
+rs=Serbian
+lk=Sinhala (phonetic)
+sk=Slovak
+si=Slovenian
+es=Spanish
+ke=Swahili (Kenya)
+tz=Swahili (Tanzania)
+se=Swedish
+tw=Taiwanese
+tj=Tajik
+th=Thai
+bw=Tswana
+tr=Turkish
+ua=Ukrainian
+pk=Urdu (Pakistan)
+uz=Uzbek
+vn=Vietnamese
+sn=Wolof
diff --git a/res/Keyboard Layouts/iq.dat b/res/Keyboard Layouts/iq.dat
new file mode 100644
index 0000000000000000000000000000000000000000..a84fd573725db75bf37f52b74a407b13aa424f87
GIT binary patch
literal 4620
zcmeI0`HPKF7{@=)WE)#Zl6~Kou`k&|L_|c%F0w>Kl>IUcml<Q<HH+)c&Wvr$jHo+_
zq9n>Wm!wOGB2kjW<GM4=eXW1M`_}V5=RD_ozRz>Mb$&R{DSmz<S;Gp((uVO&WHP;&
z$~0!Mk#+QC0L^I6XgU$cDq6CPt}G#jN>rg5)u~Bs>QImR3|G2FG+{RlXviRjvPdJd
zna2V=#FG%o_b+$M0XT%0B$7Gch?h<Gg$F0frmlAta25Cu1$xR)&{Jwjth^w=D_--K
zd%Wi(pQtZ&<pB@5$_<`zi@Vg2>r|0DRFZUj_{k)jT+Wiuc`ovVREm|dxm@N7K^}u<
z_{<l+(m)zYqe#AgmDbIH>m*I3rL>j~j(8bQ+i*PY536M;*SiY13RG0U_sfl0tdXVR
z=<@JCp#oxVWE`*FBmHEc43=RsLPp6L87C8Dk}Q-yGE-*DL75`cWWM4ysI8RMvR1s3
zD9I6qiZ%Rhoa(@xl>Ks8j>>UIJbG{XUst2C?#xxdRUkGdT7&D68+147Cf%1pDGf(%
z>%T<a$xV4vj>sw>!4t`lOFI87c~T$`<&nG$uRfLMVgI25Hac_ktg@pniTNa7<g0x9
z>;9^aUD2HG%vHcuAX<UO^q{A{_IuMu-}(LMuW$W0eccb%cYQ48GUgH{2fG!!1yhVE
z!tTJF#pGdfG3Tg-xrn)d-G#}-Zo_0?vat!+?bvusAtqlt3C52}!}u@-yelcedNEnp
zotX2OE81FUp=mp_K?%ESOJTE?5GbIrb{mG#TKf`hnMFH=b)<v#6FO^sb`N$pHW{0!
zj769;%%QZ9(j%A?+ItwHRCX^miJ44Sgcfod>%k;yhJm!g?jz*!vkALj8y)KvqK8e_
zPDdBIVN%L#3izEx*)(iAR_T1$Ggv=11FOf^6QwHY0Ycu?u!KP$!Gs@$T*DS%a|oUz
zl%lX~b(sW82&laI*j$1~v3cc59WsPG`O2#Wdv_{tXp3JhLoHJ+OIMW6lcScawnr@)
Xb5hfWJV_X@I?d`SRx46V{C$$|Jpvdq

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ir.dat b/res/Keyboard Layouts/ir.dat
new file mode 100644
index 0000000000000000000000000000000000000000..e7f7166a656f3e8c24b573d283bd9d796deebeaf
GIT binary patch
literal 4608
zcmeI0duWzr7{-5>QOra^lB85JH4n}6DKlG<B1mRPiKv-Iq=bc_6j3_oX-?fiXCBHT
zbvd_hbEoF!(j0z6JRliT@jTxvQbR;SG^vmZp?jbE#(HHa`0x9|&3!-jb04nfg7=?m
zKexXbtmYG5XE?K&%Y2?^A#byY4XoouCNr2(%w#MR$t0bRc!m$?#Dk>Kg>H1G2R(V5
zK1{c90~p9Q`qGc7Ok=ra-sL@(vWYwjTKC<}?F|)t$yT<rlii_w>iAhQC`uh8A2ARy
za1RVj)$O8dJfX+*C+E4zKiuM1&;xo%1Jz%bxXf98;s%b3^wv2ZRlp;PQBEZ_)X~6E
z8aYlAS1I9)jU25LoZ<?<(cLz5Ru^^C5T$Ea>%O}|dnr_xp^+M|37Qnjr{+vd=BIRU
zo2rU@#6ZMAdj?Lo{V_!r<+PqQYnes)DpX7d^r1f1(zd!iZPCkmMXze6Uehei)*Q{(
zTguinEz$d`(>q$MOs&xuR=-2L^tmcjrJA<x_9*U*PlW1@t5yv<qQ+1@)%jgAf3kzy
zR8{071|kO9GjQuZ{+RFegU;(m{Vb=1F6g3u(IuT#v(3D6A9Gvq{T=H6OP6(3*Yrmy
zpL)yh$^5?^+@`7`A2ARy(4K)_1l0sJ1m6(U5*#9^Bd8}hOwd43#V}I>(&&t<!yUqv
z;n(0-<G#f;;5XnZa0hYaB(mv>tHs%%TwDo$9qs@whR?>YCs9hGlIE;D-oPEk)#GY#
z)wn8LCH@#b$Ha#bJWXF)n$9E}H-d**WdP#U^x{c;IlheR^+)kBns(xHt$K(_6F$ot
z((r}&TznpWGrj=71)q=KYHG$jR+_qD_`b#!<2T{<<BD+maHYhL5HB-f!|kT2o)!4D
z_-!P1;j0X<4g3_hmkdMXzOscasTP14VSo!wDCuwF$5Xs%0!VY#KC^tY0v6DmQ<$VN
z-ZJu_S%q1-S<I}=Ci#u{YOdEFGi&5I(@rw&#$K?)oV{qfxnhPgh!+e)d`}X>iZFyx
ejAo3fG~*a=3e5zbWu&d`nnYchY>5~Dzvn-dvlbWt

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/is.dat b/res/Keyboard Layouts/is.dat
new file mode 100644
index 0000000000000000000000000000000000000000..dcc8447f1aa723c5f2ac0affb27efb33fee42cbf
GIT binary patch
literal 4647
zcmeI0|C7~Y6vtohk7lQBwxn;UOkYJMgp#sbQYev1B-Rp<Bw5N@Nv(EEF|{&Ts*9Cd
zt+mriZL6~5`P@4UCZ;LVG?-jWgJ}$=@nx8C?q~OAeQ4T0;B#lrJ<oHV^PF>@_nrI0
z`&~@qXE?Vol|1?|iqVW=5La;x<H_e%E?_V{IGf8khk@KoFQ(9+NqDp(i`KLuhjz55
z1DzOV<+^bev*^N^T+C1=T4X}dq<}lQtFhflzZZlu3b}{b%wb+Ap4rX~7DbtD<Rb(k
z1X_T=v8J5u?B`SJiLr}4G_aZX@JVuz&#0oBmw1IbDv7g?_3ULMAM+$jc#2Y%@iZ%W
zmQ|FqjVGwEnqRYqwbW3{hqik^=yHh9`Le0s$=pw&grj`Lw;bVzP&~8!E?E4M*+xD>
zAVQ!82t1?4q>-AVnHsAe8m9@GsKFMWtf?y0JPpw>byXjYRzD5WEOplm^;d!Z;4jcA
z%2Kv+)K2ZyLAm;kE;>WS>J(HSp?vex%%+>o4`MACi{+urr7F@wEmBD+o~gAsh_5)o
zX(lW35dskc%@OG9HSP`x?{^(mgTB!beXmdKpLA3|D$8r-?b89(%jpXx^^yM6ZvCnc
zbWG)XUKLuWm?{-lm1<P0gIc9JyL+1VcIdzOv$DOMrf$tA`2Tg!P-b`URIj7g+3OmL
zXKtS!#CxCMG?Nwi2!RNJ<_L5%Zhw*S^h+3GT>Vnx@0W2Q{tgoWT9eH~JjzT8d4$K9
z&wV^-1l-?hIzU_F@(**jvGRM3>(AzX<K}+c<bh&}jN~t126K6U^Ee;>T?Ww83Jx>{
zp{=P2ZHzhO;%ZGO=tXan9QvBL(9aIeHCZ7Se=P;pe3B^*W0}m2fif}9bc7r5S2NN|
zTwwyl7!xS24kU_eO<wTJtjBbwaV0mIesMk5F@oXvvE!}t!mV9B?k(Il+-}?+Ts4oI
z){$@g<+kAIqezyJDyhcpAi0TD*=n;jX3yd8Oh0OoRkSDjFOymvBT-IrC5cTWcBU`h
zo-TL??hV{7T&1O~H``#Kxb3*Q<6|xS&seXLDqV+r4Y$!&cB^!QS&Y=u$~0zfE3Ux?
z+`EP3l5}NPLo$wg-6kt1QHx)ZezuKPhO@D)ud5=tf<)XfPG5P`eug~U7CWmjd(qHx
Q@8G|H|Ib)1{_nZ|27Z$UKmY&$

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/it.dat b/res/Keyboard Layouts/it.dat
new file mode 100644
index 0000000000000000000000000000000000000000..4b36e8ee21c9240e3c6f0d3df6ef232a6c2a1252
GIT binary patch
literal 4657
zcmeI0`)^cL5XV2?8+_2XrV-Pi6`@!wQUpa&QCo{5h=`&fih?MLSVd6~5wU_58UiYm
z#+0VEJQ}*zR-rUPDKB&Gt|4kL8jTv_Yt;}nL=Ewg5FfL*T~lu)^bfe3oI7Xce9z46
z_vZdE-z9YZu3!dtQOr4%a1EomfH7Rp4cy1Q4C5mDb1qkL9)(ONkExu`?RfO!L{27)
zQ#h4uPUCbgw{*Gm;}LS`%f(#EWQ*L$&D_c?W>eZ#?|5c$2(XZcnakrW2*oq*{9sd-
zaU&Zs5HZjL2LA5Cbnqny*-Ha&;Yjd0Z?m6w_=d09LM!Xp%x>Z|^En&&j3z!|85OKx
z6)&=yN~(C7YT7BM&T<~6hFaR#&PV3G$NPN9cO2sT9`uxk91Y=q=SP0x7k&-JGwzXK
z^Jm75Y{WpsKo1zGRVQeI7HOU)sZdiiRnt^t@fn(_r7F`XjaGq%X`+T}q!wt9=4yoI
zsFzMsmSW0QALXd8&eT~NFHZxNuN69512k6Sg8Z{ITcx&pzN^~t8><c>t5l(tdO?+;
zcqY?JLA>S|rx{daBL*S{x-&4;>-4@=Z_o37P*R8WvySLv`;vasAIkP(-lsaKecG=>
zdRHIl1kVZYfd0~k;A?A8T+P~|HtjG!rF!i#o9lJh^9y|yVA3^?s*lym>8jVghyU9T
z4&e&CGrWFYe=k22&)m%m;zN#cnn6W2VjyCmI|I2k+Yh%n{SrpltbUoz?<2X;=6t`!
z2K(MNa4)p6eI8G+$VTr{8^IsLf7MignCSxZxt|AYrhkx!Y&xHVzYTu_)9`olG*6jy
z@FX*N)TDqR3^hSvFazvaXfi^~B!w)NP=sqWwIGjyxCZh~VkoeaK_)H~aW!{a2e+8a
zaGgm9lTC8Cjd3O;OvG=pR53;|$#jY_j16>(@uo5Oaokp(!Ns|gJGho9CS}~j1g<14
zZ)EBhhwHnYxNW#L+-}?+Tnmd$3z<$C_wZ~$LkY=pQsphU?Ih!*D%RMlvb7e!9e-~C
zkKs4sugBj?qLSn)5^)mk>6;}ct5{aojN66VL~7|Pw(9U(ac|;w{M(u#Lfp8Gq?Xs(
zvK!0mY}J!mwkge<+h?sEXd?MsI;DGqWFu~~^;Ais6@MLmz5S0eOXydmDe>3fUL(1Z
iM5EE1zSU^2q8Qg?y{xlUgI|g3z^}&d*3z#3w)78Z{tR0H

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/jp.dat b/res/Keyboard Layouts/jp.dat
new file mode 100644
index 0000000000000000000000000000000000000000..02b807f339e9460079addd43ba8ee74a5e81cd33
GIT binary patch
literal 4593
zcmeI0TS!(>5QV=b5hf)fA(A3?FD<*7nVFg0%*<|PR%T{*Gc!xOm`OxPh(w5lgosE*
zgoH#$L_|qML_|c0h)8sUZV(YfL^S;Vf5;)xr+PW(VP?<l*|YXua2{qIr}v8|n@kcJ
zLlViPFone|C6ydD5yNyM7)JsVh$4$f)-s9J_%Vc`_!Gcz0tq6Rk;GZMQG~OL5JH(r
zEE$$bBi(E+dF1!P4QR_86(#Io4+RuE^1iUpvpDJtUGFmBGB5}RzIkhI@SLZ#(ZDTk
zbB8P3<sR*H@Peycqn<`?(!?d6agir9^O#Cbahfw!ah7UoILCQfso;Y3d`T^Jv~ZnA
z7Cqph*-pCX_TmlXzBmd#(Zeg=@WGMyh3`CzufEXrE(0zDgJ7UUy+zZtTIq__D8(sW
z2^yzFB`H~%TB`|~q!5K`rXn;(846XJB9*Ei{NxwNPeU|R{tD1=#ppZ18mU|bDo9b9
zqNRqAqQz#jl&wu(yn(J(<fto9j`EbRJ&wGu&kj$%xSw5LmFrywTn73w@Y(yvT+?Gc
z)OFRVRX21~jcU^^-PTh*QInc=UKiA&dNt^gYV|-D)vhBtrgBxNQm1rUXH=!Lx~fv0
zv!0!*R*f#{itbr-M|aIW({sJ>;`P15-`4LPb#K+7E_Lg*Bkw!g<H>*QXV+KddY1v0
zfxZlcF~g?xSvIH7w%L6S@yxYpf2z&u{tV+FN7zXThdD+mdpTh9cQTt9!8Q)rM81pN
zo~e8vh0HU3U<=1N%67_Z&M#uWsR%JlGtD5<I!2qikYgvOnO;!IeD1dr#%L29#+tM+
z-lT<zCMrzkq-~uv@HK2;i3tsvY-BylS!IGl9_7|xA?rNi#4?j7(pX{ALbO3tm{5_;
iB9kXlOmbLhU`Z_a1D(WHC-lF2_lf`a?)#UW5C09iN4oU@

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/jv.dat b/res/Keyboard Layouts/jv.dat
new file mode 100644
index 0000000000000000000000000000000000000000..3d4efc732b1d37c50230cd1d3258444be88b8e9b
GIT binary patch
literal 4958
zcmeI0eQ4EH9LAsLIjE^jP|#j9v$9t+t;}9+k)ffY)Syv=1__y1RFssM_`0^~R<mYq
zIdkbcTefnmX=<}fOe`!6EQ}Ho6>?-?U|?YQ+<SN9a&y?f!SBN7eqYY_obUHMm;28-
zh|K3nw4w>m;vT$!m+&$k!Xhj~1v=1%hw&)J<32ovNtlin+=)g^K?8)|=!XFqgdw;D
z!*K<!#uGm7W{krgT#p;^7#>HRGgYWTEw-W)J2UOh`+Xp<Vn23cFTTdNdHHO(FYWx0
z4HKIvkSOpU6li6psE~^}kCQo=Q#pf0ypF{zVJRzF#?icq1-zIOc`2{r0uJO{Ue4!u
z2#0YD$8iEDaSEq#2IK_(g#JFWp1s(IxAG1??Pw-vaW<>DlB>G=oo}?3yt*c?<{GZ$
z`n-JhoOS8^#vWF)Rf$a$NEFCbpj?^gLY1gUm+1tr)HNC<YK(5tZJMc4^-^CQ<4F$H
zDV|}mj&p`ibE?|8ncKL7U+_zQ#c%i>zvp0W;$a@)T>Z#HEYLtrc89xEsEL}TIeMnM
zU+xU&@|Wh-E!6XRQS-DQFQ45zKb<e@VKrNo*hGOufm{VjLMHlMW5c!KPwm!U`dbPI
z)jRYH1H$cLT=-ePs8f6OhxX}!ZU{RyGVIrgP^B8xs!k1RRFhiNsy6+m<=XCl;RB&V
zTXa;vYM46=3PZw0;qGv6xWBt!?hNPhi}UJ=!lW=IObZX@<+FRIr}K~Wu$rw(Y@$G-
zK&}Eq(bc@tyl&nwwPuxh)2udirry+`E52$faRK_;rs5Axr+MErnvG_w*<!YvcfD`9
zsX~FHPffd7Z`K-jj2{_yiLaRtTv=|r+4gO-$iAnEZy8S%*O+G0WZv_7g{ic^#4ima
zFdC!$YEghOevw#+3E0(+)YV=wKD>FUS!T+-;d8UYeC&9!S%OkWD}1r8*k-Ctm1#Ba
zn9s~M^NHy&(R)^y>h!gIYTRTt7>^w-Vsy7?(V~To79dvmX{4)poxN0l_l%Y`TH@GX
eT1;v!bz#pN%Tf5xm3GB{-zoXIEYknu=Q<1Io)1O<

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ke.dat b/res/Keyboard Layouts/ke.dat
new file mode 100644
index 0000000000000000000000000000000000000000..805cb06fea78a0d8e124fd27c4f6824ba9f93235
GIT binary patch
literal 4600
zcmeI0XKYVl6vls#h?N!*yY}7`wOg}BZHl657e!H2)vT%#D<UEyB2pvLh%_Q1B4R~w
z?Y;Mk_#o0mM8xS||I`g>`F!t}^PY2`d(L~F<bHUbWPUvD7{zcpQHwCT(2XYapeMbF
zA)02ipc-}PKs_1}MGYcpzz_;im?9LT1Ob$!G-W7D8*5jYDomw36=_Lp23aM7ehgq7
z6PT1cFTarJ0wfSi95a~hs{7M;-yzALdeLLRW1s*GWanZIaf@plVFyP!#&Py>f|H!)
z9(UMJCfnG_VRo^H8*Jwa8C+r+DWsA{I%`<VdN#6&ES9j<dcI&YTR6Z$E?Rb$bDZY^
zk9bmmJLNz=x^N$O#w*_N-c|Rf?|g?({?v;e10DkfU?5pPKp`5X;cBny>Znk4Rzr1F
zcZDlP(Q2%w3Q|qARc+N*l&UIHbu~m^_{uj>Ar)3p6<2^tsg*ucL6tOBWmHbh6|6xv
zp_d}mU*j}ElXB<fceO+pE<v%1(+tga)%|_qef6Zjy!E5J=rQ0ike7k%+&|`^ZtAKI
zX`2q~h>j{l$8=mLbXT{vNBguz+m)pq+NJB-s>|9bN6VC=RHZ51daTh}U#A0FqRn=C
zt_|9x{mRq@%TDTy&gs4$>ah=%_XdAHe{|tK=&4@nwcfkx{;%Kq>Yx7d){pX{$AHH`
zUIu~)HkIDWbb5$s_qMd7y{Y}Cgqp4|&KwpnnFQvskoinwmg(=&j3JQm%rz|^%M?@k
zaZER5-jVvI@S{m4iHRhd){keV`3TKuZmvNM>)F`+g+R+nm~sf^R2D(hG_#?$SqpW|
zXvi@a8qkoj1}w&4Mi6c$LnI>^Mjr;6k+8_bMIc=n>N6*LnLQCfU$YiEm~F9?#b#kd
z(cNr}Ze}+0w_#y){y93#J^I()&I()HNyk}*vkqtFe=P6p#!10hp3nY^-Iw^ae?6QG
WoUDJ|J!kT2oYZ{QKehMw(cb}+naoQ7

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/kg.dat b/res/Keyboard Layouts/kg.dat
new file mode 100644
index 0000000000000000000000000000000000000000..36faec0739394b45a05af2783fd2d3b069b8b097
GIT binary patch
literal 4741
zcmeI0eP~x@6vsc`Q;C{diM_65W?4&ZsV%LcVhk&>5-TwbD@l^XO6*mv=6q?XEoW=i
zQd5`H<;$A3)HFpA1gSXBZy^OzVTcq+g;YpUJ#4$MZVmm@KkkLgdCvEI?>Xmw;rZj7
zRkS{%d68L+r62b)o(CvmB9oZRE6iaS#pF}KT?}9_&(W8sDP#u5xpbm4UFk*-E~F>D
zD2eH=q&G{rgv%MhD4vMOqddmrl(B&FwtA;CH7P<hi>P2JRVh4im$e*LByMIi1u_NB
zK!K5JB^~Dq_0kCr@-rv-jl-PcPyQxfSLthxu#ZFh$mcY3sSa?FoF1xW9qZZ1W*TT@
z8%=EI7;D%YQx4QlcJnPqIX_k~ou|&~t9~kIt9QEAic`Fy>aRi#Qc(&|@(gLghj$Q7
zSeeZf$P{R=z;|sord+$!qzX+_rK+@C&#Oi&wOaeMN3->krf9kr>q$MM9h$1GnyChr
zXteIs7>(6E8mIBPUlX)Yw`;N<(HEMiNh;MmZHg6YRi}C#&_NwK!y9@e#rsO1$(7UL
z6rTLcmo4}=9YhmWW-|pc1==f6X02X<J!BKC(7M=QE3#pBnHAdz8)Z}MVav1Lc8+zk
z0d|31Y!6x|yU%*sI6J1}`avi3lYY@j{i@$}O4r%<Qq1|3{h`0q$F8xvqgP^g*ch8?
z(`<TMz4kr)-}&VfZ??^_nKsK_Na4x1&$i&D9YhmWW-|pc1==f+$DlaV58>uG@!!JG
zIP2faO*Ge&tBsR=7knpSAz>c=3EqT%if<#76JEo&6BZB_(VZ}#uo&Npe~9lTl;V5v
zUHC`%$As4jmE;--ZxCK3%*A)(I|yZjC3qvDf*ZMkd<N1#ZWg-7w`<%y3}=5MdGz6G
zj?S-+ONeW^jggUfeOyK~Zy>iew&?HRb$BgagTIBZ#NWg>;Pv=&d>#HlOz7|98}ViM
zQv5x9HNFae7q7yr@y+;La$E2Qd_BGfUxB}kuf;dvmH3vp`bZj_lWy>AQ}90xo^1;5
Julu)z{{S<-SiArL

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/kh.dat b/res/Keyboard Layouts/kh.dat
new file mode 100644
index 0000000000000000000000000000000000000000..7c10e7d6482b6e3f361102a7cebaec582c75e47a
GIT binary patch
literal 4849
zcmeI0?Q2y>5XPSwilkzTh={02Dk|}<DXl128;b=61qB5~X@v?Fg$flaC^eX<sfkI9
zF{ZbA^{yJtSYwSQw$a8m<@(m5t%{0@w)KV}MS}Rj4<bc;_T-+B9t`>ioD07@yL0C3
z%s#W{%ic!UZ#f!Jhc8foFR=#eFb_r8gi<u45eu*wlQ12hV+Q8HFa-{?kc6TS`r=It
zz#t64aE!oce8%P8#YCLLSiFrTSc(Ka71)LyXhAF5viV+SZbSmE;tYPrMO=>f!|5Nv
z;AS|DZLC17z$++FCtX34WUZ`{0_i8yWroa>T$v;DWPub*p^TI~c}@Du6d5SPWVPhT
zN*OFG<Zs+V2kzqmI`IgP@dQsXQSL&yX0`kW$ar~2mT|UNmdH{mkus^w=6hLbE)tiN
zDyflL*%|SN>m&mIzFwY&QL&8`h!yCmz*r4u{esc0>=)EQ`!qZLS32d2+~w?E;JKdl
zACe<-RGQ?3oRrh@tEA<uJdt|2B!9|aJukn>BY7-+x$ZMj?W6s5fDY`=7v_Dj9UX}q
zp@VdY4%6I-KYV+5;Lq#jX&4pTSb<o9o(eq7elg{GLEE%OKh=aL)#+-jQ_}{$tQU2y
z7V08hrd7H^SLqr3L|b*GwrIY-r<3)4ou(h@Or5QBb-tGA1YOwu6&7nrFmBXl+G~2V
z`$^9lUNn9XiM+3O^e_EKJ0kw@-Av%`?B!_~728;WSb?4j3`NH6Bl}4mIY17QdSc`d
z`Ht*GCPja$2|0M3_G@yA{$ko)q>Ah$t)zwiO|-SNMYM<U2LFE~j%*>@h>zf^Zab}y
zN|IkVFGsq8!=t2}_yi?nH`zgI$hQnTO*nU3c+t>aRE`N4hp9}I&nt=b_yFnS7>c(T
zkl?*U#w9U||CNNfT@~^$hPHx%Ib5)m{KWYN+9RZz{7jf6b&`HxK!UUp^Sf~zxs9Av
z5WfSj-)7n};#cvS`rVWv?Iro1FnP+q!Z7C-|AuVkm{K~%xLQo(UUGw-6hwE@UQ~e(
z8B~ptXy3pZ9o2Tb_`+8x<c&?nZSCreqfl-Smu@6pNOmyAZl;ctV}#vIH3uDGlw%RD
zlmb@bWBOAV&s&>(uDUlUV_me2jN>w{i8PZF<OjmmI^T3Jl|K~6yr{<J8f7p_V?0{M
zqh&lo#$t>|%UGDP7&}ZFd_l%-8I>~j-dMh|Tw^|CK4U&(K4U&(K4U&(K4U&(>x>E-
U+htVND7>|C6aGx3>;J!p=h+>?kN^Mx

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/kr.dat b/res/Keyboard Layouts/kr.dat
new file mode 100644
index 0000000000000000000000000000000000000000..18f4c163caba2890294a8a27fccab8cdb74d238a
GIT binary patch
literal 4593
zcmeI0eP~Z{7{xzFYt7o$T9R0r8D<z}W@eiihMD(a80Kwem>HYBvDR9WBuQFpX$dV!
zOG}a#YptavNs_eWEw3dhN%Ht@Kh3SR{pGKF|9S57+|zTu-&6OGbIR#?;@QYL5(y`n
z6jGVY0@7H_7P5(E8l#CIf$>C<MHrbxvYH|I;ENyr1Q0|pAq*qV){P{TJccuZ7-Csz
zlXNmzP7d4I*~>RjDRBUb$R(eB6guYKw!rgJ>TTWXD&Q(G2nD|NVs7x5huoxrTioUj
zS7_xfZ9L@(O<bjp3$)P4B_2`F11{1<71h*G%W+O{l2e@K49y(nyzP9+S<Z2d>)f}l
zoenyA#&fy{ai%|zFAm%%UhtZ?d~nRY?K{uQS8wZ9R{>XnK`2n99?&$c)^f#aq~a8>
z1Vt!O$x6{WWoo=4HC&;J(P)KhrA8=2VM^Bze)0=6L_YGBpZpb|XniL{!<3^S1uIIE
zwb&R^wLodg(ne+X@(pyf0tYT%TeMv}mFJjy_vCu!h5dZ>qTK2#;408pfzQ2v%vE)%
zQ`dD)&AOo$UC>S4(rrD|12yWR&gi_ZsZI^Lue0h<z1np|Wvb9oRjFDvs?~9wP?L&v
z+IBwENuAOqT~V8Lchsu8dZfpCGRQyly#x0~PxV~gdgYjV@AASk|Jcu0FUqa10<Hpm
z6&S^IbLlh8r_VI+K8tu}o7<m4lKJ|f9OMYQDB>_>6tjl|=D#<wnLxI2$h>?myUpq6
zv)7#Y9445<&!(JGc2HtozkvOgBSbURQiCwtImz;cK<oU?IV5qfnNf_fuwkr43*#(k
z_!BNfGLfwY^kWt4S!f|cCL37G5>{A{P+{gGka?`}gcFM_o=9h@MGFZQTO6a(B8)8N
iTa1xvVZ$;bOJ?q0>SQPN|Gamlll=eP``+b$xqkyTTfLD0

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/kz.dat b/res/Keyboard Layouts/kz.dat
new file mode 100644
index 0000000000000000000000000000000000000000..4385c2583750a7781251bd724c7e00adf4e3306b
GIT binary patch
literal 4741
zcmeI0YiO2b7{`DAtJ6x9jFI6mW>%)D8CIgU?0}VI=kxh|6w4CBN<6H2NYk3j*_>u>
z&E}!anWjz6SQJG?*Yms~6;d!N3PF&fD2lpy_df9U<gzb*d!8@XeP72vzlZzF)kN2K
zIWw5XwG8D3Zss=5<xcM5eyW(wST1BB!?}tPjN%yvGnI3A0^@Lw;uv~zEXPqwANq1x
zXg7dUsG%R_jN?)!2hT%H<Wc6afJKFQ2Q#Zv2`i~)Da)u&`IBp1{?M3QGn)~}2>cHM
z<JFb)6DR9L{YH*I_zP1fN2o+SG*|=m9Y63XyZMDL`G)>-%Cv_Qw2lq5vWYEhqn#b>
zqJ#Z3^Koc7Qt$I2d)deFVL~tUR;h++xJDG_9ZcG|RNe(TTcb2aV^jX5PetB;NjK3X
zE3+Aaj6gAg?+Y)cM(=5->NG_wv`P)CRFj&uULWZL&Cz^K(vzyyQ<|xFHCgSNuC1Z+
z3SF)1bYs59ExKKIsag~CuqNtr-Kz(*P>b`i7PV=!KGA1|X~hZ-eC|wTeyv!$^@aAN
z{7Lm!dH=WFM3bz{W&|<<#RMv?>o&~pu$$~G>t!Qtv{hI?JKrv{i|szU+sbW#l~`{(
z(@L$c-D*ATdh27?gv!0zr~Udl|LT6#@A^|i>_;6LB99q%n4M~a^8Lr#1iR86v_}fl
ziWMCAJR_C)v`w<dZHi4x`IG9YdH<|#qDfX}GXfcbVghBHM6Qmgmbj6)h9L|iZY6Fb
zt|zyacsnH=jlWGam*`o%9p8fQ#NQ;EPxKtVm1qvpg0KdNs)!cioA8bJE}~iZJNR~d
zGyWFQB2EjNh3EyMc|^1E9r!k)N}}iSHloFJR@H{(LU~w1oE{bsJvk#R7iLmHM;m4I
zC-*Wwm$-p=31b*d+(NvOcsaRd;`X4^>+m&rBfcD8im$|L@Me51z6@`|*M+YB8onN1
zg1?Bb!e7N-!Rzst@LK#028F@iiocGp##i8BZUepnuf|)#Iwa9}URq-@$wNmms{SvC
biMZ+i5?6%pP@(hiTe~NhNb6YhPi=n#v72j%

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/la.dat b/res/Keyboard Layouts/la.dat
new file mode 100644
index 0000000000000000000000000000000000000000..f4b6651cbb202844bd2e8ae4580605c871cafad1
GIT binary patch
literal 4905
zcmeI0d#sOj9LL}9_fszEpd^aiI-!t;T*@V+(YmW9%O$lKHd-}V&Ya^C2WL4PLXJYw
z$mKY4dsKF6ZehAn89R<)+O%m?E46z6e!uhM*N-#(%bsU@J)h6_^Zk6jpUbo7pYIPy
zJj3uYKEP;n#cOy2<M0%+F$q(#9&7O|`lCI1U?d*GWB3U7;e9-eg%B#?I#kDvxEZ&i
z0h*vGUiNWq&<@*i7w*PD48c5GW?&`?unAkSEs^fB@9)w)_Tx+J#BS_MvnQ8(;>v;K
zGLq2*q6z$u3FI^3)QKbbBD=8;yR#>Iu^IdDQ9jOBIf^aVnl)IDU3eRB=TO$-3v9>%
zJdC3_j#D^|GdPPs@HfZ~JcJCNIiA<DD%<j2KIhew?8|33hGY3=dA`e)mY3$2%Pi(_
zBB!L;ljls1+uyEWH|Z70Xadm$QYSD{iPc|xKpl0BzF`$zubMi+n^afz)msnhXa2(7
zJV59tma((;v7L_a9?j(fF5(g{;|i|kI&R<={>cJv=T7$5XDs2b{EaQ0p^-AxT#x7p
zJzbtJwT4US!_xd-Qa?Sfff|x#PsR?8+lN=MoAiogG=XRWsS{`#BvyO%kABy;TB+}K
zP(LcvVI9>mRStsSbA6$uTBEO3q>VbK<vOckozW|LU1OD{98FfP@|3SR`bwj;*neTI
zV7>~qL%Vd^tK&MUQ>qqZ1U1U@rPgpMy-Av1gW!gsc2Fm%pJq?S-V(QGR<N7&iexl_
zXacDdsE5)mOU!#H4JTO6HJi+4Gs(;`Q%!7dntk$61y!ww)?@p{W|3KI)|*evQZwJ=
znFZ!UWcXcVR+=1B;OK0VYhtIbGb_w;GX-VYjtm!CkMXYcSj;N3!E7||n8mhFv@G;Z
zLnE|83v_m#*1nM#k1i-Ff?Eso%`7w9#FEZ%z*bAQ6}r{X2Zi&D%Z;~|Xl$mviZRGX
zUTA8y^;lD%I#pJAL-+fNqouDyO2gP_rlT>s;SMKHG*F1L39HcDF>6dp`Qcj_j7;2l
ZzVNOW6@JxxlW`Zdc7=SCl4bv`{9il|<KqAT

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/lk.dat b/res/Keyboard Layouts/lk.dat
new file mode 100644
index 0000000000000000000000000000000000000000..2b778d6c1d8af1f388a110ac6d7ce35cc6922ec6
GIT binary patch
literal 4716
zcmeHL`)f~O9Dbgc7$Jn_KKHqA?$^yF(pp;5T8vqUh1_qs&1J5e>#Sinx4B<td=J)I
zCP|VcNm>m_evp(q;rX6@Pko&Xf57?H^FE*V^FHtUe$I3H{%}6$QT2<(R-|GgIwJvz
zn1&&kf!Uag-AG3iMxhP5Ar8GT0GrSrtI-E5U{Dja5Q4g>hX!bf#%O{V9oGV_kb`Cj
z#aN8PGG!KE5tbkmS;!9D_b)o_5)|Sf@=$<duDmlnVh3lPsmGoJo&*2kKmw~o-w?^3
ztiea9%{r{l*J#A1Y|g>#&o_97dw7DMsK86fAD}Crp%aU71s1NM1f?j$4cx>nd_fWJ
zN;8JHaR(pp2_1ApYqn)O4req+2JZV;X%k(#IF9Bx#&EnV@0=5B=i{qcbyOaE4tNd(
zJMb>>kIA?B1lRKnFR++<Xt9K4%HHLEjVqbPquj;}#cOOWFoj7>=5)^FET(V{=W#xB
zIhjkjoE2Qi#XP`6yd(8Z-r{ZE=R-aY><zBrPw^X<?lqtC8DH>~EAQ-mY3JWov+Afk
z_8jmW2zDUFRL%O>JivsSA&R0*M~$P*Sd9}*xW<M8(8`2~o7ge%k)QdM-}!?u#?&;m
zOo)jv@7cg!uWRa=9;TOx(=5isn(={M!M9f*&vdDiO}t4klT4B;@0^fm=Vw*3>Zm;S
z9Pk_ncAzC9^)25Q{m@_E_5(2pgAswA7_RU7I;iwz2wQ|bLWyurxGwAvwh5WSWlY8t
z)K`>-N^7I|f_SqyN4!aVL^vpvVko+(yO5~(m{2SfNRuk|2}QzH^iZFnxB3lXs-ruG
z>Ezz(F|1Qf<wa<Tb{K&U=!j03s&+*;grh5xBn;8!ox)aOuMXWVJ|Ez8#s2wz;R;q^
zja{xvwAL$gQH_d9U#{RU{-|(BD`{$iw8vUCJ1Tw0g|ot8!4l30*Hl^*qE$h8fn8~o
zyVAc}Yh~+>-NFH#<+t{PV%cf=YtL~k^*@ERL93_4s>+uy&J!03yA<aKSt^~azl`Up
z8LI1fYPwz6YIk9OvCz7tL-e*S|NA;A&Jy+sxsGj?uJxT3l=W%V=YNReAhYsxwg1hP
I7yf?lFA82lPyhe`

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/lt.dat b/res/Keyboard Layouts/lt.dat
new file mode 100644
index 0000000000000000000000000000000000000000..d8c0257b63148d8b7cac1f9628bbf769ce250ac7
GIT binary patch
literal 4649
zcmeI0{cDzG6vsc`8?4pPuq;bu*jm%le9JVosjF65nVPLEQ?o3~GOeZNTRF>#spVR=
zt(q;XXF7*E-)&6mexX7#Dx^ZBnq)|ZNQH>>a`tSuJ-cb-A8<c#aoyLs&N<JQFI+#I
z&oY{Rc}(RYM$ntv7|AFGF@~|^^Ei(&gdBR%mz%kofjrDrOy(LU;n0RO(rHI~I?$0$
zWN?GE>&6w#B9knJk;?>&+{3+$XF4-@s`>x^Z(9;cD5QWn%;ot=JUq@%ek=`-@g6%6
zJ8%XLoTsLwz5L1%zF-?)@-_R}!#8}#0giKwkMXEw2cNTxdVXOGKU2p~yi75#QOcWC
zP|15FSj%UuV57A>MKv`9e8M3+9prm{<Tw7{#2IL6Oi6Fn6{er9ll;lww28#SdnMy-
zTe%Ih;yrdCb|BS(isl!SuZ5be@fxU!nye`rVezS&rWaJGks7Uj8lrI;syxkAe-$WK
zGu1&C>0)(K7iFlcGL@xljn(<;r9N7&?&{g%HBPrvQHw~bj_7xJB=dDG(@MRfl1MzP
zD^AAWYUMV}iuc%o*nw0BvYn>WK{?JT9g?TRI-;Zc%3jhj9aoxjma|{qs$PM9(5Kp`
zzx0t#YOhXcjow#6YgMfpZO|rd)>a)*rRuEq0%yB+wRnxcE8S_={BNlW{`)&Kl9}PO
zcP?}~I$a|1u=<i@Jgb%4Fe~0;2Vw_O9q5d|1b-!dIesbrMuK+<wh*kRVbN+^Z`-sV
z?6xug92?!|*zo@}&)66~%do%<X4+6cfwqPN3Yfwph7cZQnjwQH3>kFe0q$oW&l*;k
z&4WB?<9|<j8DO}QuGX}NH7~K+-kfVgeGYCdrsYNa75HWNZ{Tkrs3h1-P)&Cu3X=%x
zO~)9633=SfU4|6$4Oom~H1k<#opKFW+{jIaDQ@9b!x*<S*dWAnEZ{!I8JM`6>$$_=
z#&rxeFmYPN;+m+6zVtKF(cc)y0OK9k8Vl)@6q}Q@VK~8J8m!9QPEbWd(JEUdwqC{C
ziMQLjc?rCC@HXKW6D-HC!r$3g<!;4Yk6VYkCTVTMq6+iH-G;m4w4Mb~HJ37+%Z#O5
z&P1{;t<ej2kNKCzzI6nJ=7wulC2&755ykkmcx8C28+8=nR^hF}ttNO0KVc25z^zGo
Z;I1<fWwy%A7WYHEQoMh4xQUiR{s9?e2_*mk

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/lv.dat b/res/Keyboard Layouts/lv.dat
new file mode 100644
index 0000000000000000000000000000000000000000..2e4de2d05877dac49654fb644201e902852d1a40
GIT binary patch
literal 4660
zcmeI0`EOKZ6o#Mox_}Ku5yhp5Wf7=Y7E!DqwSpp65z#83pojumu?lFdwcvo%wGF|d
zg_Ks?MvSdn1)Y#u8gB0mA&na17By}|+(Qge<B||Pb34=2Q9}QKJIT%Woik_7IrmBC
zhxaX|>yyKc+`vT)BbPj;aSoR<gPGjS0>(0)A&g)$BRQLSWKzIruEpVKj-@YY^rJr~
za3Uu$$=aRHVD4ZLr*bamagAm2xr(b<#A0qw%sbLioKmoor4+K9dsFhsuqe2cB*X9w
z34{cCLEyJU&2~OyA5m)ANh@u<NISdf;1fRPC7Rj7bG%7CFYrD!yhkJN@Gxt6gmNC^
z37(>o4Q!-^)l^&0{Z#P`ukae37WwR9FQ4%_U-n|Bc*(((x&wU8H+;uWDfwjhLvZ;e
z8HQ&_ASBQW0u|~i%F}W!(+myQOyz5q#%s3bs6Z=Jq=}lOGc{7vm8EPIYN(cIj27!J
z4uOtRAEhZ>$7_HFDp!Ayp)*vflXZ%6G)0SS!d%VQLOWNfI5F=?t394lw_YVG(;BTy
z$tU|ng8Y+*`8HV<o*{vdKu-b_oUZ6A^>g|--)gtM*N-}&clEOl>Q@bL`aApdf!gG0
zzxJq8X->P2arVk_HfobLt44Kd&^9&cRki2~ZBVQI3x_y66xB!iRDWCayZ+Q64Ri)M
zrzPg~+~NQ3*(r5d&R{3g8Rm>i$tQn1BFK+B%(uy^@C*rr1bPz4V1lXiiKf%fH|>4_
zIb3LJKbxth>yKjv53q!l+{c65&z;<3`uipplFqHHGA+N9Wv28CxyzLK6h@iCUqC4(
z+(xl!{UYu*A7L!x%r(fgo@2~kNVh1>l*3fq7BU!09>dLAILnNNxVbQzEN-#FzRY1R
zmzl{>z<jRf3TB&;@Q{g%bS~k#z?`_;?1_A?G;3k9*%oUkGYexL)6K@1W@f`I8<xw(
z-J^3;N4q<5-@x5YY~9PaZMeIvfBfZE+e^eERowu*D*WmIf!~bRj9+OK+-BTXYw4}U
zuMbFgjR6WTiubm`h()&I?l2<$E(79K21NWv4T&4=L8R<IYt<7gufc7^ZLr%`dur{e
zBeuRF&dhxsx81sLN-*-C#(y@T<Tv3p;a3=_`0!YyHojj3|M>uy*AVdX-ok4&VzEe_
gG3(rn-)7XjiU6BmZrnPm>4?&~r5l~Q?cYoO14}Ib)Bpeg

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/md.dat b/res/Keyboard Layouts/md.dat
new file mode 100644
index 0000000000000000000000000000000000000000..d50029394f30513cb8c72e1821fb043009d0a645
GIT binary patch
literal 4571
zcmeI0`EQMR7{xyak!qB&L}X0tOHm!$&?#lCrS`o{84Mjur}o_#t%%q)jaVABZ>c4X
zh|q|*w@oWz3kDGpors8tA4DV~;<@j=#eLm`Kj6K|d*APKp5=SbliVN9Sx)eizy!w9
zou>5QH+mCCU-~nENu&`^dm7T5L|W2@R2nmySVmHbDpVzkXsT0#AE-@Ty4biM`H30S
zqdpz!%y2_e7|c*6GnHwf`@Z#B>?)W~I<v@Nt_!aSGo8cIiqLy|8}K&p9UFKXsyV}5
zZgGx1oTrG39OV+1@$-Ot9H)R??By)`Im~VHxWPfL@h@4dVJ+)e&qg-0l^hEBhaEQa
ze{$K*NltUsq7q8E!b2YM_&a`6pyaiy?iEjX$}?WN@L>3y7tY~L#H<H;8}K#|c>{A5
z#9L^vlGRpK6|eT{s5<JbE=tgF4OKnW7m8M_s;ib#R9XF0Q+-06;d7hm9q;)-nv-py
zM(Sm!Zc0*5jno*WM(hfo5r{Hebu%<UlQdcBE<D&dRnr_iGh+7Z=^o;3z}rAz1NTG!
znC&`mr#yS|wND4MMTc}m$8=Fe$}x16)@rBLX_L+=OJ}t~XF{Ffd(71Wt+b3^i?qzC
zD75baoz!V3y5xL^_e6^Bxaw}|vPx8{>n=Rldqr0r{J)6VNb^0++km$LXg~*3>77ic
z|6<y`D+&B+YQG&xrt7OQk0nfJJ_}jKB4#qj^!M*fB!($0FfE_XU#9eDG24`RH(Hs(
zPh&Yt`IE(_^)va~e1v#@HrJrB&1`Gg7>lA!IV9mLw9A{A+0e|ag%)Ns1k8n4TJwh$
zMlphM^fQxTG~*e=K!%x-u)@Se480iTm=nonPoyx&tc66gEmpD8ER0n8n2pif%!VOm
zX7r%vr>o;F@47s|(0>5`Udppi7|XIeho=9O@$?;~e09D(d#tN?4Q0D1&iR6GNp=`v
z-|<h3eFgZ6zTh19^~L3@a|86F@MrVnLcXyq+wIWwZ!w;BUp8esDc)udOa;l3tT2`p
N96$4m!*?W{;73G0#)$v`

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/me.dat b/res/Keyboard Layouts/me.dat
new file mode 100644
index 0000000000000000000000000000000000000000..b3c38ff4a68a4f41c0232ab034d0fa34ca8515e5
GIT binary patch
literal 4630
zcmeI0|7(?X6vtoh%NWzNEJG?Qw5*k1TA5a6u9da2EGsR`)GRYIGqYu@=9~?=mYFym
zwmDlW<LYe4EV8+B$n!;{8%80BeL=b*6(S-PLeZD=-0hLwhot=h&*eV%^EvNx&gY!Z
z`||v7-c@vdZsrLdr<ltq;dbs|IHlapJ<R4wuHjlPWeB%$B}19PARgl?rjj6!d<y7I
zAI_#9=W#wa*>M+fF$);L1&m}gQw*8NBpzZ8bD7sw@BfyHNI*IBS;!(5NAS=r%Wf(|
zGhSl`Vg`D^z&~9v?Hu7-I@rQq96Vas$9_KNM}A-jtu)faXQbH9_iW-Y+c?B>lDx@E
zR<W8jtfiLqv{B7QJM%boY~Vva=Ac<$@Fib!l%M#e2R#KLe@5a?af}n3<o5_3n!jc@
ze}!he#tg&^^nigXbp{n_x~6Kh`e=;CYMd@HyhP(QOEWcCLsX!C8ma!eP}9^~lQlq-
zx-xT%j8H;(%GZLdw@^bhF}o|(1kKhQ&Hc};+%p2JA`(}w`C6z&S{%W{%(5(Ac?NG7
z6|XS^F$3Kh=%47c_UpKQ)&aHXD;?A!?XfrM8-1sfI-$LCl~SwH`bfKVOwBr~UCL;=
zl6p&TYqe@rtM#f^gZ8OfO~G53Xw>GMxABO6(<%LtgLUsDcYjV-Um<!{;%_Aqd5K;T
zJoM*h@pI4M4Wr^UW*}yuI|Bo`&ZhM18D*3D4cut+`xu+{3mIl}eJ`80%WZ0ZiI;iZ
zChvJRfxn2q8Lx)ErVEtuG|$*f|18hhbpAZvJ9sOYh2OzzylT?HD?G&uCIt*P31Ngu
z2ZQW)n8^rzDKgQZig7qQ8OUH$9WFP0;R@3iicDF!+8no9cmWTZ%5bMC2UD2F!%Q$0
z;Q{<jcx&v4+n8)RMJab>b&7jUWAIktC0UBU#{`N;8P6joW!%qwj3tma!urM0`oT@7
zvxH1_3(hY5t@!O^lI!eQi`$0Vf%^&WyO!ss@Egc1+h}6R3_Odh4!-XDIF{RFo;rK#
zakfxG1(i5k?Y_l^)t;`uBwBwd=@rZ*U5C?3y1^Js*V|u^eh+6GPMh&?pc(&-&i;1b
zTMxUfw;H^ixOKRVL1Rh$4LBd*Y{y@TmohFbCFttYEZl6z76uKq2RE_%WR|Tv-I9~a
G?df0g!TiDi

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/mk.dat b/res/Keyboard Layouts/mk.dat
new file mode 100644
index 0000000000000000000000000000000000000000..df755b0bdc1673a855495dac2f4469e3927ff2cc
GIT binary patch
literal 4721
zcmeI0eP~cs7{-6kn^+E4VkX0tHBy(Z*=&A)tdfy2QbwjS(uR^D83REO#P7MBS((kX
zT63BoQ$tGUXWF!sim33tQV|6rDxx73f*=UeaodG;ap<4^aWCBSp7WgNp7*&AoIl>T
zj<%<m`BYFsKPFPjWD1!|8Pi$F0){h+zT`52K@>2L9OjbG9E>h><vud#&i(YDC%qUS
zj_bq2RMDF(#_|la15(bcFfL{(%iGf3cC1M-)>6qTR`YHGkC$s&C$;f1jj02v19#xS
zFtw4+&{N%Yfv>s5W&YtLSGdYGvh<Kn@hgWp!8yL;Cmv7>-Sh)p)j%VgX<`STv5U{y
zO*5yd=TJEEaqZ&(zw;;egbdfYft0OB^k{p&+esUe;N>ev{gtb{1RkF=uoW-tWH)A|
zF?AqyprZpP+i%Pw?NXCgXu7IYtu>mf_q0yy)vPa6p?R9BaxK*?&CyPkX^UoSlSXT-
ziuA0;t60zL1(oPUE!0T8q?gsANh;NREzpLLp-%N-+^>WB@(yq4j|txQI-+CxM&Bmz
z_+L)6;y-t?8?(}wI*>Zh(SZtUTV+{^6<c4srX1^MxpuD&vV1GBQk!TQmT6aXUD<X+
zU2K9~)pI5*vS0L@{?KWi(OI3>1zpr%>TRd=Z@7i8*k%2#9`>M(2^k7)xQ(*OHpQm3
z=j*89R`WL!yw|PFW>~qsmcZk0XSU*RcCs6@(wI7sI?&O9Y=-c3sP>04EY$fU7#V8)
zf>7O$3w3=rqK}E{@%=>0h*l8Q5>?`d@T2%KqH3ZVGV$F+%kh0gEAhQVRYV`*hw&ps
ztB4x#1NcFrjYMzZ&G;U?1^<dC8O&3msqk1xm=~G_nPHU?ngruGzK874XE?j8F}w|-
zE76}<84##XFfeoz@`5^FjlYf8;+yczcon_{4~ZM`jrb0{@}{=;@lWyf_*T3I--cJ?
z;h#Rix8v`y1pg4P!`I?X_y_npd;{LV7)FQoMXatUsqU`vZBbI$UFF;HrvJ<P570nA
A>;M1&

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ml.dat b/res/Keyboard Layouts/ml.dat
new file mode 100644
index 0000000000000000000000000000000000000000..f6bb06cabf45539d259a689e05d7706643764938
GIT binary patch
literal 4646
zcmeI0|4&wR6vtohTTYCTWtKDgf?<|rX=P<vgqo&V7G+tcWoed{mS&oY8W}ia6-W&;
zV2Jbpjv2BMl0)m>=hB`vtCe%EnyY7Su5WYITHjXdc;PX+<>U{z&vriN%RQfS&hx&z
zKb-d(I)9^ifEna4gj~jP6C;?&ByQnhW^*MYxqyqgo=do#nGEJ$hH(!LC)1lgq?18k
z`q7^OjIwg)k;N07%{gXY!!$c@Wh!~hWgd@pwmaduGL*551uWtzmWJXfcS&I6r`$+K
z2t)|<0D(Wca$5O}{p_NKcJ}Zdjd=LH&q2OmJ55wkOB*q^ae!*}QO_r=qmcD%pqQ6<
zg;L6RjTQ>1u$o^}&Sulid}L>W57^6>BstX8??mdCP{L0f=3Bn!hfqA_9tn)!Qf{Op
z1R?}_fIzW2lg4YI=4q0$HAPdEr;!$)rs;Mr)+mk9xf-Gg8mbYRuPn{cFwGV^Nxjrt
zeUz>Y_0{P*Lu2(91C^;2I#UDec1}=#hMluamIhuA#$tUabDfrJl~$`D6i?M!8^kvp
z=V>Y{(h&j?0^JeFb~?QSlJmO`s$E~{kPd6FeM#TwJ3D(hAL~=K>Ro*<PYM00cl4_|
z^s`D-rgCjog{oDndNt}T?bpj{v0JA(&E3AmBWC}oG$*~QTlWe6-#$N-ndzMB^mF<<
z14HrD?X!aTpyNDEWkotdAVQ!!0-3h)dkwbUUt|mZWq9>Gh*yVK%}{P2&9?i8Sji(S
zvCVr0&oG}SZ3`c48~<XS4mSEnZKq$r<F@fH#B0NCHkM#H&oYN)#vUv(reF-C8D!Bc
zYjCNt2pJ6L6xLdOcL$kVVFbffMloD%WWlvYAY5nUgWF`8X^b^aVgh#>hj1TvGnw1D
z19z(x$m1>}DJF7rKvGOGg5fqUWDRZ$(~X@NZ|uZ4;~Z`@zG66T-Ld95;pT3e-O6Sa
z_mgi_$4sL^a+$^I;IDfz{M{tpz<nFPj$~1ZNtww;yq$Qvaciw!F8&t0CgP<eUL{^f
zd?)_%_{F%5M-6uuZVk!jDoiR#G~>1&n<xK2^K2nmXbra-#>qmvQdntHMe>E3qi7i}
z?jD=XE5dK5qXc(5ehl|b8>*D}4!lixRaW%F2K;I~OV~z75%HM4XTJdd#bBrcV|v^M
Wn`e{B>vUA&mE-+0mK*!`Tz><>{RP?p

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/mm.dat b/res/Keyboard Layouts/mm.dat
new file mode 100644
index 0000000000000000000000000000000000000000..a0a7410cf40e6d73efc445022d9eec84e675f60b
GIT binary patch
literal 4755
zcmeI0{ZCeP7{;&bo;q~d(pk-%B`O+`l9G{<kfNfIkr5gy8Yvnn85tTWdLB_kK{QP*
zGBPtXGE(Lck;pOEoO8akYSpTRt7a{GPpwt!dLB3p&&K2rIM4QZ?(=;)_kDk_v+pn0
zNwoatq7oHYh*5Y7&)``+faP$o8r7)6Lzs%;h{xj?i~Fz(ccB~;unmST=!R?26F1-{
z+>HJhgvXR_DDFT#Zo}=Ej#=2OnPQZp3^h22+SYnk3&%Yhj-d_>Xhf4|-W?tdJ)Cfd
ze)JXa73hEh+u5=yiaE?;49Qr=F@e`Jkx5Ku9&_27efcLkGn!r5gW3ECne5ICp2bJ_
z6knhj-{3o3z)$!Ekvxq{O1Xx=;SYo}g6XP|!c?X)p9KuG*1KA3TRi(VvXE=JjvGAl
zZl03R{ML3>-Cch474Q{kt3WSn8GXRt`7=Le13%$s{G9LeOMb<3yv&O{&J(O-BR}L(
z9^<d9=Z|dS58S~D?&L1+W+nHsiu+j2Gc4yp*3xW0Yj~2U_`UAr*Zh{}`4|7@za6}x
z*R}TL_Ii!MI$0O%=9zcb!$R{t+gWvY`O#OvSD>u|n_6$oWLsnlY>LHNs-@X98)NA<
z!!m5K<yxYRw-_5~DHdl5mSZC<+eX`b>ur6kuiawdHozimuti#wCEJZQOgRf|h(%kH
zO|mSFW?QDsu{>L9`5nBWrJjAow#-&qz=}Nc?pX>$^JVR<y1V@7E8r{8R)Icf4g|z1
zQ7Bf6HKItY6~$tma4-a;5r(d4cC_Yf5-*6C#A{-!aD?7>Dui-4uZlO(UH=Ef5%IRD
z7jKC}qCvbP_KP|URvqOHY}9C*cwVSCXNP!EtQY&_Dhx%m+=YJXC<^x|f3#ePmFlkP
z0CXH@gHmi(EK%Gd)Mg;q-phLFRzza9UJKJ$M{`~guWP+bakpZr;v0&};k+k;t?Ut1
zp<`^<Q=_OBhsC?1R@8`KMOAZF$p&e5lrIo$UlKaOoRZerDawW9bSky3;{-~O@c&Wb
zy+;`)*ChsbVuT!*Slo?~@>Sfgkc*|r!qf6<@{xyZERt_C0~tz@iN%<Ud6+N1<_Rp2
zrxPb-AH_^OCtqg{mdK-d5;-0nmwStc<6aEFKt#yG8FYnmQ!owVWePovbfjStQt%*_
xp+E`7AQj_e4JBcsjG|=RFFUC}R>(@4jz^Fv8)>YJrOEne@omoCRC#6X{{ZcpLg4@a

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/mn.dat b/res/Keyboard Layouts/mn.dat
new file mode 100644
index 0000000000000000000000000000000000000000..4f7b00a3d57cd922c6e150e61d6e4d5eb6f90fe2
GIT binary patch
literal 4625
zcmeI0e`uCf6vsc`B}2`LSO}t+S*FfxnVO}U6jCHgAtYjECQ?}-2!>IM-gIeeEnRc2
z<<vFX+}wPdKj!?kl4lf>6z5JsDx`R&A5=(DQ4~`5eYQv59$4D{&jXk9+;h)8=X*bJ
z|F~y6J>Pw-Wi|7-i3eH0!%SllkFb;%d7e9%$!I3<05@|RYq)_`6!8ps^dq1C3}g_4
z8NyJmWsXlbl2Mc~jN#nPJ*@Pe$63LXq*%{}-g=iaHL-vyN-1X(l`(%btq6a%MbpG4
z1QG&QKw!3dg1%$8uF(Zf@-x5kJ7@Wmi=gW?QlE2<fK&Xyr<`G!K4gd-1*)f!Ciak~
zjr|<t5Qq7OI!^eMlXR3$zT!Mr`wCYnUjsBoV>Q0F-sPmtjKxjYL=|bWrp5eGo++V!
zRv)WTRALhX34vS!-}c^^a&@Uwm3mrLs!^?qwNv$K&`EuyluGo3R%x?V>p7j!Q#zt&
z)vh_ZUvo8I4{3oGYLOOeiOO`ZmTQI1XsMQIqe^waS7=tN+VrtLkzL^pJs*qvQr$YM
z&vY*4kIwQ%=>NKp)hH^l34w$_E`h;$(d>`^xH~`Pto@er-?R6}9M3QMUKeuaQTG39
z2VT<Evok;MFJ08%>KF4zc@_Ex^|2a7B{m_D5XdDkg310(KZU9O#eX}~{agP|ZpGSh
zrT%3<09S(BfLo6p!j)s4*a6(DbiapnU`KJUQGgx6m0|lh-Hf&2UcsfX_pxKxLF@x&
zaXoGmZX>P&_cC@IJB(Y0dmY=4dxJtoGl_|e_vwm!OW`HIC)mdbG9_F6!Wc5^(#+r%
z9`jv@vCPJ*ux78(-o+ZRUD#G^FSZ@4#G2?%W7XK(*q*Gy8mtAY;B*tV8Ee4mupQVo
zYzwy2S1!i<p>|_l-aA+=_7+x;wPJ5#=}QVH#1(c`)76m`8?<_gnbJDnMJe>%lSh3I
zWnM^e9Lv1^R)VxYPCY>bnbZzHYW?tfJ9xo2S_%l-33hQ~=*;qL36bv&5d^!vyOE&H
w>&&FK_)$sF+{^MV-)RY22#&GDR}ShzlErbIGqSX*voONr6^2nk<G;iH0dV;l2LJ#7

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/mt.dat b/res/Keyboard Layouts/mt.dat
new file mode 100644
index 0000000000000000000000000000000000000000..724ecbb63fa39e199bab08118b9322dcbecb1164
GIT binary patch
literal 4645
zcmeI0{cBcr7{))>$;zyW$rxkGSj*IWNh`}*Y0H*nnU=M(e95vbE3;*-e3?3Jy||=l
zhz(!n9Qw4j%vr70W~1+U9x5b55D}@6r;rMfirzrN?&oZe+KJ)*fOFuS@AtmX^}Wx<
z1?PwBT1v-NzzptZEcp~Njv|IJo?E$%hj@_77)dSzxSoLwVH$bd$6$)_=)pPkq!$;^
zn?Cd<lWS~T4*hwOEV8+RtGL@b6Pd)F%;r%Z>-^rCmPH{zDRY^}e4Y#S(`8ApS&}ZJ
zHBul_pc@LD=)|=09fxSAj?eH(@GhV8C3{G6nD=O+hHdO7Mg!ka%R%Znz)C83g-TZQ
z25Weeb*!g_ayHq_qg1nj_i1LoRbTNn`}lz){MZdnDai2<?k|4k7{BmGsGlx>3pW3x
z%V>=hh!p6C0;|;l8n1bpqlp@%$(o{Kjkf+&P16FEs6b<suOXVC;Tom68lc%4safiw
zbJa^3y3nwh%2Kv+R3uNi%F|-?w{D@vb<T&GwkthZor&6OA!LOXs!YqYGSpAcDG&OU
zUA#@BqBT+=Qs8t2^1Y7gkWT1t9afvZ*Ae}sJ@zLZ)iIszo#pM-J~gXd-^%F=9aoF~
zR6@UNt=6ep8&zZ2I>pqW9XhBgePDGTugRYKb-<n-*RSg7o!|Mjbg%0*H-yabdV77n
zOfNgsPfy4S`gvWvO{1bUQXo>`bOrixxw-T!8D&oWYDSxXzt-ITaK@OgKaUb#Fwg$1
zx$cELZw`Du&k(OA9wWn&fdxFm9CP%K^Mv{Rr?`$m#4EX&MZ9Qczm$i0+D!W}3lK(F
zaFAzXhmvTsvm-1sSZ3dFP4wd;3muXx8ZBVBgqcCaFqlg%b{J|D?y{)iW~OkDg%ib0
zV6w#s@h!x++mIVAS}3xZ;+7z&xZOgA0t$(*Vkr+Wm7BQNl8i~*VY$UvZa77tHB7*@
z;CA8a0v2vJi!I}rK^fBn4GKxDz<(RpOd>||<tqFZ{6_p;_@4&I4E!zlHTXM;uOU&H
z(kK3L>ewt?1FjXfmE`h`c5gC8+=sZ2PSTnFKQ^@_D>kI)xHj9_sfx`cU)q`y%k9Lq
z8>_wbB+Bt$#qA)m9k&g?8vk|twfLKjf0+&Sm*ZmiRk(LZtV&5XFm=c^270)9WAm2X
S)h3bq1b;pLDN;-ROX^?ch6IHG

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/mv.dat b/res/Keyboard Layouts/mv.dat
new file mode 100644
index 0000000000000000000000000000000000000000..69a416b0dd42181dedc5877a13f6aa894b50c52a
GIT binary patch
literal 4704
zcmeI0duUg67{))(i^|d*Y8k`H@P1piwbYiEF)d}73?)NSmxdIHAt{BCd0AfOZR%Rn
zd1>C(wB@~Im<Z)4Dnvy@hQ&*YQW$EHh>2ide%mj`!J+<t4u|ue@B4ku`@H9Y?;r0|
zLE|-wIn1JfUc5{p6L^k^Oky(gc#k2xKn8so%>c5QO?TdAAa7!{q75mu<#AH!KqsCg
zKa}f2SC;S;X$&Wi86i`|G~VDt7O<$1?t#y;2%?l?mQlj$NItn-nRqErF5?(05G(Ky
z3Jg>usDTujoNu_u75?BS{^UA;ld5()$!WgkIKS{MKhRor+@qemY-TG}Y-cCc)UbzI
z_Hv#|4u_Imw4Z~V<s5gy>L$0iO-DVU&P{v|YOQ|+*IQ}ostomv<db!}CGwdq>?Toh
zj1`C#Xs*EbO($lqc4&(}&_vDGLKSO<ma0Unv|H7BOEXodNqS$CHC<Jjph^{~LOB|w
zA<ETI4OgD>HA*k(U1e*m#_21KQGwpkY?TLwQms>&YPC-X9`b~K7r`CZAstbjjz#jx
ze>s}S*SD~nM8z>yAXcEc0!7xiO0itau~fUNj@H@I>|do@hIO|*8)kQPPnUH~?d&hz
z(qQ{tS@w^fwx4xUr*uYVbx!BipbPp{ZR|%~3a4<axqg#bD;p3PdRZUqXCv)J8{Nd$
zyodX}zZSv0Y6UjV3hk9hKKbqVM1D#OyGc|WV+CRbnk$gbv*d(ne-MMioc}zzVb;$M
z)BT7r*FT0I#7pqK_!4{#{wZFI@4@%u6-)_peS5qHUyrZGSK({%#rOt%IbO=JU>Zzk
zD*g%e8}V?jz?b45<11-c!!u+BOQBn!%jBa_Dl1qCivsnDL!<|nA)lVXkLb<o^a-$j
z^bamVX6VbS@tycSd@Ej#Z^ysHzrYVrU&s95GK8*n<HdLxH|h@KyYNl;7JM_ljG^>k
kVIcG!cqRTB{yAQSufw+`EQ^M1|F?CbCfZl5*Q4n5AD=fdI{*Lx

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/my.dat b/res/Keyboard Layouts/my.dat
new file mode 100644
index 0000000000000000000000000000000000000000..f2a42a2545a03047e6e0571673e0b4e7553373ce
GIT binary patch
literal 4673
zcmeI0|7(|36vtohTjI<bO2)7u+8RqY*IIt7vBs#743QME$kd`Jio~KQs%2X&S3^lE
ztW0p5b90+IR?9i3R-YA85fw__`%#KSDvC0MqC&9aXZyrw&s_5lc%C2bd7g9L&pG$L
z;QsP%X5d-G^E}N`uH{bdW(7BKFZc5xwbW3_Elj7B#muIRXDQ-I=J7a=F=R2GY$h^^
z9Ij*v3$0x~1-!;I@|e#8)>!6Y9<{ZOdNvG<8+C1nD7LVXH`v7HNIw1fR_diG{TauY
zKuq8Q2+Y%f=qD!VQvJqf{LX3qB=9$9I7^Nu={Vo<F<<ZtUvZRd9b%l0Fjj4Ju!~N*
z=w=Ul*~fl<pp}HR%-2Ca<OC-fV-uu{Y@MtrnmRadw5`pG=t`8Q0!>$OB%kh6n99!?
zp_*33F(wcb$Ru!h@W!mwF14ywD^;g@ZP03M)a%-$ZguG~J)ygFpKA1g9#OlNt62}J
zQRS*orEb=(ny=e*yB2DZs#K<>TBeV5hnDCmJ)^BQ;cacPwMV_$e}Omj%ZToCeV~4Q
zqE93F^jQw2@?VcoO{?M<6Nm|95~y$kUuTr-a-4G~?FL=!vfL?+ciC>D%X3rRY5k#Z
z^`p*O?N?29-&_27gq!w{zR_{36*;e@#lLh#YQp8IHQyBs&dc1x`QFPSy18zKD|RJr
zb|jzvw=|V6AEBC7#W5xj6UZcxOK2oC5w;PU3EK%RgjT{1LK~rhVsiqr7>D13e;?mL
zc#%+p--qud)ZurNY{T!wcXAoN8~+}m9&i8G;#=|Ugmr|MQmP*A!METW@y+-yPWAN>
zUcuX>m+|l7_fp6-n^{Dabt~Z#Ua<LzE^@hwO0G6*A+)p7{Dnehm?yEylvyO#k!&Ej
zlTd9fd-2=Nyy)+t|4sZmlv827j=f59hxr=IP0@q5(^lix+lVr=DXLgY@_;!Y&so(@
z*~B%Rs9tYoh~N6(juI`=EtPUTv&<8j!(8)2Zs10)J1?)K9d;-$+wo9d;ovY{o%nOS
e5`82(hVhy?8m{4FhEmC75+QPq#}E|%i{W1yyfMrG

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ng.dat b/res/Keyboard Layouts/ng.dat
new file mode 100644
index 0000000000000000000000000000000000000000..e4f1057e52d7caf9b5a4ce45993dfa890b0fe9f9
GIT binary patch
literal 4596
zcmeI0XKasQ6vcl>M5<8{5fMa+qNv(bQPi&5MNylgc5PZ>#@>6++Iw$m@4femh=_=Y
zL_}Qw_Ak7N=qI1v_sf0neNOIu?n#~x=L{p|3!xRwsYE`)s7g3N)Swo1XiE&ilpqfQ
zgi??qMB`5sfixi<>B)c(zGNaZS;$H@%2~Ud<fa?h$w4W~(8wwgMACrvbfk0Yynls3
z4nRDy#L<(!j=DGP?fDtvP2K1+;4+W~2EL?X_HdV*9AG(zIKnYDaDtPZ<{|gl#1<B_
zl6|aZ9k*G^b=Go~k&I#t<Cw@~rZSzG%w`vfEVQ1lnag~(v4hK&o#i|idCXIur{PXN
zA)g$$54_|JZ+Y*id((HGpU>XZjV=Q&18HDjfKouE6s1Ngr`!rrs4A(T!c<k^idJ(4
zs)%wZkIKkj0cxV0YM^|I)Hl9^(kZ<%$Va})q|7RzuVhnpbyOB*Rgi)eVH0Yomg=aL
zV$?Qu-oLKa*MaM)_Uf!y#X0KUKHWU^_`jTbQEqe@a2fcWfsd&#W~;90l6Go=c5AQp
zYn2Y_u#W1MZfK2?G)IfHT}!k=S2Rx-v`ptTRKu01ks7VB8m|eOq$%30!J1_~pJ<w9
zXuUS-jAh4_tW&z9dwP(@7y90Td#gu!rWbnSsC##L<*9%8%c&RTMwbDXf!`U(MM+cX
zrA?=oHSJ!W5Gt73FGgk4^%?2MV7d^`0ERM<?({MJ-I_M|(SiP^<zwk;N<WSsrpzl+
z$P|7I!x%y*2AS6HO)v8if+=pUfxq=EYW{+sWxl2yDwDi}T;w&gAwMrhCsDwxhM)FA
zAcbjXP#+r8f|_PCMA4FF)TN<W3ByfZ_)(3f9($s;859xJGjk!-jEfN@n28Zhbu%);
m&2Fe~<HD%&Yj~J*c*^Dh|7G(8=kS!xlUMzR#gmi%9R35_yum*J

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/nl.dat b/res/Keyboard Layouts/nl.dat
new file mode 100644
index 0000000000000000000000000000000000000000..471eb779149ffb46b40c12535ce319fe8ba715f6
GIT binary patch
literal 4643
zcmeI0jc;FL6vsc`8<VR2%#2x#St+G6#!T4@wK2x1*`{oYVT`hwy_%V7x@FnC)UvSA
zmX@_T+jK?MR$cboUy+4oSr%kLmLFNfTfBt`$(;LZZ`0iv{R8ezp65BwdCob{x!>d_
z_xoK$$CF1PlNrV7jNvjaXDH*ilB<}`Eu6>soXQzoLJmWiN*0qin*uzJ;7Bsaq&LTK
zEXQ#?Bdpv&PGKhf8DREsuCsZ9jcY05c4nB>lV@HeXbyLAFZc0a#2;>p)5d~u8?P|}
zF#<h6;K$CGO|-L%2G-HYTQpHaGuvok54(AlTGsLcTd3e=KH@n(q>A@h$}&nQrHmD<
zWED^HG#gpM8msv^<>|_=k+ikd#!mL~37@6C|37^j2|2(%zGOdNNBrS7l{UT)xA7Vy
z5F^k71XijeC{HsqO=EPD@-<H5m23V9ny6Wtsi7LC6EsL8m8BdN=|mMOTT}Eazw;-5
za}ZCxl%Y)Z)(HJfU-i>M^|1=WJF7#1CaGAnHMh(2-_4ap;z~4Mi?u|{BL1+-(zJiY
zVNS!Sc#RQ=5$KM<V6S7hSAXd@?NhV9(0+ZT59~`ipl{@P2enHdt5MtasaloPA9`EA
zXs3SCQ!3Y5J+JkuRJAs!PW9TO)oQTZgtyt|-Cf_~cltrSyo}D<x_9vJ_Q{dR0p8JG
zAFr?1KjIIw`=$MZ4s#kt#cPZ}j6in;1{$}&z*zc)#@sI=kBg1v4>QK^8jRQ<#atE{
zm4BG|Ji-E_-*b3~ToOj(=W#dp7$u*@{S@<n2?P0zwx9pSM${K_C$o*JpToH(B;+#K
z<{?J^6IM8r$4z2zTTLa%;xyA6vQ1ey)0Ba;OjF1)?IFX|g+kLFZe)sS4^vG$DBuR;
z8VOS+CUXVjO_jKsYfMj=7?g2!T*@?VHof8|#&W&s4Wk%oSA^G2k6!EE#WmvI#I@kw
z!?ogG;ZYt7-uc$_Tj$eON~&}dt_i;te+PaG{u}s~)?}n7fnSaP5`F`2BW<fm){$%u
zl5%jC^*U}lu7*@eg^f!5t+d-+&A4}Po4Yy--suoPTs5iXF9z*on_;=jD{WMn2vbC=
ztOmEk+H0?;?TMhe+k#((+kjtz{|x?`V0&B8oE_KUm#3RsMY7iLwUj%8-bNc*uHL#@
UXJbA7v$$=Y4Tpfa+C%&L2b!+~^Z)<=

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/no.dat b/res/Keyboard Layouts/no.dat
new file mode 100644
index 0000000000000000000000000000000000000000..3813b8cafc4823a78824158c7a34f24bea7e33f4
GIT binary patch
literal 4654
zcmeI0|7%ut6vtohTh@|UGE9bA%~qODbCso)`7O(`Ov}_PMY1d_OViAjnQOR**^u0x
zhO=5u*Pbyo+sxcry5w`8hoZ<)At4pgQy>LWA@l_)I?uOQ503T++zaP^KIh!?Ip^H>
z<^J$~uOoGh;{oP#BbRa$lbFINZsr!IvzSF(Nii358P_w6ku0Eqxm>{<JkI7Ea_CDg
z=hL4&25_yF8^jPEV<7olZQk8xw{s`6c#wx!nripI_qACWt9g_sc#@~H;u&{Ea#NCV
zgEc@PK%f^0{FTnx$5(vG0qSU{gM&2D$zdE{bBtzovyJWSX9tZO<#j%%fi6lZV<RCp
zQORarp^7jqyvSCod4d|dzisxJS(K0Xgl{>{cjoox`ZFu(6yNhBC;2rio^gLpZcb<1
zU=0um5a<O0HA*E-({e4<3=Pvv&DI=^xA;6Q&?>Fe1WnRVjns6F)>ti5p_Zsvi{+`0
z&Q)LK>H_6yfCegGQ-v<lCEB1t>B^ZQ7Mj0CC0WtT)9ke>D{r&bt4twPX2mn-Dw6SV
z4^J~$!5SbCAkZCwA}{6rpj@wy_me)>N&TWzI%a>;Z~8-dUVrZ!9hcLmI-xEdRgM?a
zS>6|t_nPWduLec5OMBI-{c2NOwK{BPhj<-2l>8h2PXCjqZN1RTPxtFS!<qKOd&n#7
zAzqM-kLcm)nK}fq0D%C3!CYl5{Tjv^bH9#pj5n5FOc4u>*Pmx>d#y3{RXjrpYmC#c
zU?qMd{fx@5=3yQ&QofAGjhHXTZ^w`D0>gQp=Zxq-%MzY4!amC6gV81%6xh9p33hgj
z2?iTXW^k<xW~eC+g}Ar4+{A@3CM%3c3J^Ia8_YKW;vVib!C|fm2(y@tUv9^znDQ`<
zTTPp|jTziw%7R~uAHp?Rm;1TTgo}Ah<t}ELoN<E*81c$->mIMDw*C{XK)j-+`vh(W
zlW`5EZ@5FaM%I}UvWWGG@e&YBCRRqgY!7ZPekbwJ7PGKfHL);VrB=}G!rzYHLbQrl
zCDA6L?TJ$^g4>Pz0M|^s^bNB*gT%dOn}}K1D3_~G4`#jl@%w+~dLOqB_b%?BCASbS
zufuQ4RBXY0h}&Z$9%&}_5^g8)jXUw*OuRxoR7JFvST#rL6Z3T>!11>v293Q;G-6OE
ijvT<>YF}hxYQ9?Qvdv&iWVhM=RkL?+omSxA@AVHulo7=M

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/np.dat b/res/Keyboard Layouts/np.dat
new file mode 100644
index 0000000000000000000000000000000000000000..7b7be29394bf339b980d37cb996a400ba9e94aa2
GIT binary patch
literal 4909
zcmeI0f2@vm7{;&bdRi1>QRGmkL+He!X`{$#)25bGQ<GuUu&L41)KnatapIhlUpXB@
zemw69aYE$SjvqTUtc;e$u=2)aYP4$DuyMWbIj_AvbEbc7&%1rz`~KeF`}yAYeLZ{r
z`TmHy-)K}~DaN4>-p0FlAJ1blreOxEum*!M1U*rJH_#u?Vg-6(5eA?f!mYR+ci>Lk
zjkdTKdFX_ZKCU|+!FJ@MD~91!%yVQGO7Sr^ViT(C>)pugjU?<r4R)dyyCU(-^1HON
zFSCqotU#>5|4?8)>yjSi7{10Hyn;vBn|;}mPx2`~&G8(|*397r1nkB}Y|c@<gyC$$
zSNJmy;V_Qk7aYTHIDwNmjm|uPb3Sq^&){#|#}0hS6$Ww;U*H5z<fQs~H)?HmB(H>p
zEaG&|jKnkN6sO~J8`#Zc#Wq$TRv=q}(W+ZrW*_y`E&7R#)l@C?J6oxZ+Nr+^^as!K
zdmbcogvZ%S``BH-va2e%n9CS)71we-H?f*EyvTCy;vNpxPS)}to@W<V$W@*?YJi^6
zbM^JId$^wedL(azUewDPqG6GE=Gmd?_{au!Gg+~X6^IqcRv<s9TkX&lUC?eV&=1<L
z16r*^I;vx86a>LKZBUsO>RT;QLYFjG|7yAZ(wiEqw=`bwXoB9;M17z_ZPOT)_$zE3
z6scI7wN-z5bwVd~N=<_1LCgAj**#p(?-a?)3+@W;337tmNIdgw`*gfZ1G|~5*v1OP
z3S=vggJj|hv&yVCYs{BstyyQP%vYuo-Ee$L85-j@B*V`gDK*9R*PGC!vZmVZur0Cm
zNnvV#Hk$c=yQwynW~TYnY&DC`0<#g1qqFTcKRw5Gi&<_yGn<Y33Eg8@<y(bh!u1km
zzG299R}cBlq8T3cO++F3qILsva6byr0UhxGM)*o1-^r=w+-PE+hbZ+B$#9wZ#F39o
zk^O{OYJZxUVt>A|5TW<OIq4B**!#v<u5gyAFw@NvQ*OS-W4;1OhBYR2VoHP+W|2t=
lV>!c>#udVau985%Ya=`n9pUDGD<4Kjy7}HpZRLMwxC$07+qM7z

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ph.dat b/res/Keyboard Layouts/ph.dat
new file mode 100644
index 0000000000000000000000000000000000000000..314272f6727da04aa41a571eb94c37e2a9fc89a8
GIT binary patch
literal 4618
zcmeI0_iv416vscuCMqH#g4lcS-J<qhwfEk8?^Y?&7}bb2Rjah9b*)-8o~uS&L=Zs`
zR|F9eGa?breS2@i)kgn-_f5`wo^zh_oaf}5JU@KDi%I{QGMN6fq&z{iCYYMEqXV57
z&QNMom(o<EIhCo-K*|zARr-*FT;w4i1t>@%3R8rlG}d+{D8)pIQJnfTq?cy8(2X99
zWHe*F_x;b!_bZsqcqTKInSOa+INe$-^o6#!5wH=+1_EEbHOG0tT~dhW4ChECiHlsu
z$s-=JpJZa$!AW+pmwUu<hXii1f-u5a%^KDb$$B;tg@a{m)t)bjW($Wn!cC3RxW)~h
z@RaA-n8{P}(XZ}3FL=dk-udNy;ah9**%#X0M!-fO8wi9;dQmGGA|bl2?2Q|E{b(5>
zjis4J)g)MIsvn@%Tk1*=`N2<+oRUZKOF=0tMWwg|%6H03MVTd~q>R<0tMzX$on)L$
zl&Mzq|G`%H)h&@3GDqggBEP(^(*i3Wmc_2G%Jwz_HUfVlkT*wqWaODV)Yo%D(yTXh
z*87rPiCa>wb&5ChSp9vqyRudyWrIY?7KxEK*&zv%B$p&Yj_K|fNtVObiQCryy4;jE
z@=iWj(Vr7!zRu~L%eVVWKFK%vE<dw4|HI1X_B-V}ZF?I58-dIaC`mnK=?#>pH&X82
zgr+o8wqJ`t<@NcQ#RA4Lo4G7v9+Q}%{Cfz)2w)U*l*^B2f-?QdOi^auf-1`Jhq9Q3
zjA6cV{pn0o9icXLR5d88J!`1G5TH>3We$ND2PG+|VnYR$7AmRG;1L(9QjHN>n2+8J
zpuLI=Aq=7)o$0AU!V)DH0kom7B~Elyd7=wlRa$7Svc+<is)R9+wkl%;tJu(8FAJho
z#??XoSDQ1KW0>QZ^O#i31>CFS)V8U`t8K>|^bG02AuSqn8275(n7v$a;5?0cr9(S9
z6ER7+!f=IhBNmg4b1P;)?oe$L8jsU~If*MtgG8Ju8PhENXPRA@J(vXTtG6D-wGwy4
zCbi9KQEJiL+KGE@w9b>Z8FPv&M{&k@Mu@;1z!ixroU0o#=P)Ul-Fjn;S}e{e%voIf
QaBoV$T+A53B>p|aZ|7$F)c^nh

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/pk.dat b/res/Keyboard Layouts/pk.dat
new file mode 100644
index 0000000000000000000000000000000000000000..fc87e24f7af62e66ce87dfb9f5f5c7f4c6fd370e
GIT binary patch
literal 4688
zcmeI0eQ1|e6vsc`%Sap3#AIl*%y-j#S!?-{)0K>pp%MmyX-QFG6dIBgnmJo*=$x}=
zEQSoToI2;6)20JoQYxfCDzbZjzYrT@Ath22QXw6G+b_mLYr_709yrgr=iKi-=R9Ay
z@SIaa$MZ0&c!@_DMKSYvj65D^5sP_^)jYs-?qV!OjAsff8O{q#<arz!+(KV6$)Z04
z7|0+BE!-UprHpI_Gm}|7Yo4Vn<7w9N1{*rk_4uxiAgU;(oQ+gQ{AsfywRkUW#yVyo
zX5c0mn4}I+l1ydj2aa)(AGyqz{K8d!<2GgKEML>gNzQYcGxSj#(q~*}J9X?}Cm&JI
z9vWz*i9jufEo6?GY2jPG<8QP6;2M82P=l1+nXjkP#z$~tG(>l5m_|kX={Unv{(HOG
zO`~ERGY~V-m4R<MZ_F!d&`zz<BCS)2O7)!H)<$hsi<-1tFKU4n>s2k)Gpg4@)oGb(
zm8X17)pR|m0?pP#nxi7EQm%?MPoL-!&D9FMtoJQLmEP4hwW>|WZt{knjo`k}37yub
zIur4yzvc6k|Eq3x)2LX-48#m{WniA`um+@bw)<5>+)y{n$&GNM-MExD!}T%!yKZ;a
zbiMP2{bkxKq3?BG7u2qcx}=|US^eEPUA4U#?q^+5rpt1Z?d$|M(cZZ(&*i5gcCFyQ
z*K;GdA~(&=bhF%?h(CS0Fy$}qW;czBb<9A_KvxEG$mKrk_U|X(`uwR(vtECSb@v6<
z*WXImKq$u_#W&;kl6(ihgJcEC62fuo>Ytz=z8>F#w_pDf5>5C<{5}$U2&MR1n;L{o
zEWsbdA0knPZ^iE>lo8&-TcBzt+f?Ch%Q(U21O3d(v?)OWr<%#JK|>)UZ6q<8CmCa~
zdl<)42JB0)N<JhUAhDHjlu(J^MW`bACSeP&v*t!&AK(v@C?{;iw~;uG{}{iYP|XZR
zu+H*%3s8e^z#m}}i8ew_YG&c<{w?a%u4q;NM_Bv%&9twt=p|)0A}p~ul_q;l8cp_@
T>^EsJ+0rZOdPCaUp6K}pwV^4;

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/pl.dat b/res/Keyboard Layouts/pl.dat
new file mode 100644
index 0000000000000000000000000000000000000000..f946107b359727f7fe7f9cb91d4ae0733df6cf98
GIT binary patch
literal 4668
zcmeI0|4&zS6vkiAofT=Ya?VQ2kw%dkMn#GRkzdNREQ^ZLvMkNCsHjMd3Kdae4iO!G
zQc+MO(oAK>2$Xd%w{k9>Ypz<g>f`!0SDUL=tIc)zz^CYzi$CDr?d-hId7pFMXU}$j
zc%DUcePg(fySa{`WRt@<MlyjLnZyIkAdM>+!o`f`5{8pUGP$I32M&EWodo)F7D=2<
ze+F=kjT^)T%w-_waV1xCyJaSG3sZTJSv=DH-v7D6KtTa>n8)Kh70AcK{McbZJPdt^
zK!`vu5cs9Lrir5*p_z@e(8@j<Xy+X~KH(!8*-nH_?4_1^K4d+I*}@0B%wm?ZjOCP3
z&Ppn%WH&ETZ8MKi#aiCrO%7V*^BxEIl+XF17dv&9oCwtYz*l_Dw;T`T<Kg$Q!%y)r
z^dSNv0=+;WqOPKeD$smQQL3hDnsSw?JWbb3EmWbhl%t^<p-D<phVqr7xk}e;{mx0G
zJ~~7Fl%#VsK<8?_eq)G|RjNVVljBRwQjv-Sx%l0`{n|ifrAkz$a#aNK@y?a8eDx`A
z<5i&#5eO0Ji9n{)6@91vPCw^I9n=Z^tY7t+{;+@Pq|SE+I$!FTd>ztp9nr^1a^6>h
zb5y4}HLBHCHRyHi)E>R17PaXcZIEZ3DNcLfUzBs9lidAU&kg?joDrx@cZNBs&TwZ`
zARq4@8Ox78#cjMQ^dSNv0zDBJOuDi3tBj{-7<V7d7&49RUrv_s`ZIZ&=b23b&$5u`
zc#J2Fe^2Lr5_yPcjLXmAQDge^m~YJdS}rw)KZ8Xq;9&}l>*w=?=?H0zGSwj2W{xm@
zA<?3~#vHP6cQcra$YGdC3n?Zvbcze9T*gc*Okf)KFwsPYT<+yAZss-<5?(NJk;o0)
z851XNGI?S$Q%qVIYqG^l6q$sP$9R)5#+le~t38&@^?yB`9eg@kwi$O1ZWC@D(Iq=@
z_u)3+Hsfx`Z6#V<6~o|gF@6;t5!^<+O+-sqnN^vs#%sdcZ*x1A;jhQrg|`jA+&Uv1
zh?uiz3GNR3HvG5gSZ=8rvyJ#AxO<6~Z8fX672VA-c#48My0y6NxLa`BtZx_56%E$0
z0(XBWe6A&m*VvMW8u3@tu?}}9(ULmcdRwp3Yz<x&UQOqUCHSx6t->qCf5rOhc(($7
jv5kBUzZJiQj#5jnGuwc_)bcfW)p*T+ujg+2=YD?z$6FNp

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/pt.dat b/res/Keyboard Layouts/pt.dat
new file mode 100644
index 0000000000000000000000000000000000000000..983416477fa7a9179435c0a35ca935ddf88568e6
GIT binary patch
literal 4634
zcmeI0`EONK5XV2?hoTh=A|e_zfFKIUB8wmjRuQlYvWc>4K-olA**8l=i>ZXPU{Xje
z4K%bVRG?8TOA31Kdm1oE)DSfU4UecH#DLKlq9Jka>$`?r(%3)X-sHSFGiPS*obSv1
z;rm@l{nMX`jOPhDGKi;mn(ho?D8re`WP0)_?Rb#Kd5CVjLI=jtg)zjqiKg7jZQM?C
z?%+=DqMx;E%l*vaZtkH^x_dSw7{zN$<Mnjp|IE@*!Xjochq){W#RGR<YO_3WBO4(Q
zA<zf}{z&K4@GYk~NGY`(<|viaah%Wijx$uTm+h4C5j)w<*OYLIa=v68Ipnf|eBPyi
zO>Cx+{j8zbdY)$s@AF~0yT|98;0Mlft`Rf&DVIZem-vYb{LIBrJaB(aZGI2j$VLc6
z2s8qLT-7HH)O1Z&mhRIK4O6yySbT&=X|`snxB97#+G~(Hs;gery_%rT8n3JT!!=M7
zHC2Y1DN`*pK!4Fnt+h}s)18AM#+pAj6bsI7wCh5dt2AGWwL~jI@t|^9DxTB8X^<7!
z2!RNJ>k()ZtM^XpPyMDd`dHuVtbSD7zNGWIpucrhU+ARvsaD_Uh(6U7)##GybWs~s
zpv@}MRu!v6Whz&NPAN~-R(o@-D)cS>qH8kB(8#A%D6>VZN$i$bMl3TF585?L#alOU
z8e~N_LLfrmdIZ`Ux9@E{y{|F%$LP-hWBI*|=exZ|>@!%zawFc0S;9(|8UbIxLX!Y8
zjmW>v8_YDCKbtp=mcNBpi95m+R<XiJ{xYUBpLsk&50etQ(%yc%@uXGuG`Zj%6B%5M
z=>#2kz!Zm0rY&@~gNIF3@YM%*)ZRVDgodGv<)xG`k!|w9XzP<{(!@BPWtd45&+$Aj
zn6Th&#O*QKF^LH#TD;6NyvRtCG6tI95WIPC_|5JxS-5hXja`SUX0-_&Q(0>_@b8^P
zB9~-tHSQA<l_c{EZEdx+1@92vF>B{l;FaMWAYMe`J>r$b5BXKr%fPccxLqW3KCo44
zP`HD*+W*Fxa>F<~N#>RK19h^E73G!M+Cg%|E*~j(0C(I5`>Kk>dcU#TN1_6^+a@X^
vUW2y{Z-+lrzJDXH&_^UuK)k|$^((3k`@y&>n`WD>?FNzkTV63<gG2obFOU8~

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ro.dat b/res/Keyboard Layouts/ro.dat
new file mode 100644
index 0000000000000000000000000000000000000000..d50029394f30513cb8c72e1821fb043009d0a645
GIT binary patch
literal 4571
zcmeI0`EQMR7{xyak!qB&L}X0tOHm!$&?#lCrS`o{84Mjur}o_#t%%q)jaVABZ>c4X
zh|q|*w@oWz3kDGpors8tA4DV~;<@j=#eLm`Kj6K|d*APKp5=SbliVN9Sx)eizy!w9
zou>5QH+mCCU-~nENu&`^dm7T5L|W2@R2nmySVmHbDpVzkXsT0#AE-@Ty4biM`H30S
zqdpz!%y2_e7|c*6GnHwf`@Z#B>?)W~I<v@Nt_!aSGo8cIiqLy|8}K&p9UFKXsyV}5
zZgGx1oTrG39OV+1@$-Ot9H)R??By)`Im~VHxWPfL@h@4dVJ+)e&qg-0l^hEBhaEQa
ze{$K*NltUsq7q8E!b2YM_&a`6pyaiy?iEjX$}?WN@L>3y7tY~L#H<H;8}K#|c>{A5
z#9L^vlGRpK6|eT{s5<JbE=tgF4OKnW7m8M_s;ib#R9XF0Q+-06;d7hm9q;)-nv-py
zM(Sm!Zc0*5jno*WM(hfo5r{Hebu%<UlQdcBE<D&dRnr_iGh+7Z=^o;3z}rAz1NTG!
znC&`mr#yS|wND4MMTc}m$8=Fe$}x16)@rBLX_L+=OJ}t~XF{Ffd(71Wt+b3^i?qzC
zD75baoz!V3y5xL^_e6^Bxaw}|vPx8{>n=Rldqr0r{J)6VNb^0++km$LXg~*3>77ic
z|6<y`D+&B+YQG&xrt7OQk0nfJJ_}jKB4#qj^!M*fB!($0FfE_XU#9eDG24`RH(Hs(
zPh&Yt`IE(_^)va~e1v#@HrJrB&1`Gg7>lA!IV9mLw9A{A+0e|ag%)Ns1k8n4TJwh$
zMlphM^fQxTG~*e=K!%x-u)@Se480iTm=nonPoyx&tc66gEmpD8ER0n8n2pif%!VOm
zX7r%vr>o;F@47s|(0>5`Udppi7|XIeho=9O@$?;~e09D(d#tN?4Q0D1&iR6GNp=`v
z-|<h3eFgZ6zTh19^~L3@a|86F@MrVnLcXyq+wIWwZ!w;BUp8esDc)udOa;l3tT2`p
N96$4m!*?W{;73G0#)$v`

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/rs.dat b/res/Keyboard Layouts/rs.dat
new file mode 100644
index 0000000000000000000000000000000000000000..941ba1c35a34ef82a4bd1bbfc26becd3cfa43d4c
GIT binary patch
literal 4649
zcmeI0|7%xe6vtoh4<l`~uq?}FmfzD=YMPnZ6p;!k5QHMEjH03_DvBstI=7rIi|OXt
zrfXaKrl#5awpmL@cZDDo=T=BXMXf-PqA-f0sLtmr>$YKkz`fl2oacF;_jAs<Z+L!q
zP6O#@DNpej%b3h9EN2CCxRu+vgA$%$9@jFSY23&RX7L0Qc!Vo>hy;0@!ASBsi?bQU
zxtzxm4|fscSkD+PWFd=qz>!tl!+oq_E#;Yfr!%z?!e-V{$wsOocy{?xYEqY7#x_<U
zR^WdqFh^<9SBz4=zT*fdILQxuz)$?luZ+=X86R_qcld^PIYxnc8KI-(sfiX^X{VDN
zyvA<!(8U)t((NH9XdeeS&S%Io{LY{J%~%!c;!M8Nl{PcNE7B#Jq$!#n!LxCurSRFq
zc(bh7#tOs=3|8Q1=EOX%4z=iM-K-L=R;gC0TotO+PHoq{x?eYGxt`PttyG(qsZqD7
zUh}oUcP~`27U$00qnf9sx<LmWS)vE^uxfqwqN-G_U3y(_<d}o2`0u<w!t2w1_2^9<
zj^Npyy(#>?VZ2#ZY-0st1qLfHHIZI@?<XfeaY~=3PS7tt{-!_lSLQsOaQmfx^zqva
z^0nLd^`VcZkMv0fg_Am_PklAo;~vkUO5`O*q%sv`@(r$GsQJVQZ+zmM#QBK}65}Fx
zcJJ5}K6w~#mKEDrfmngT3KTM%tNgY<m#h7re+~2fu0PA~`bB=PKa;S5a4U9@u#~V2
z>me-14q->IKEe%z)f8Y|gln+_gwJF93D*(UV{c)-gzE{naW~eTe8XnK3Tz*?7dwo-
z&E;I_t%Mm|>SK|&3ksO&?SwU4Pq3Fl?=(zglJ_L0Fx4HGG2I=DoIVn(#9qK^u@<Zq
ztHatbPuqkwV>__2WM!MMSFtTvJ63~rU>h+1qixuBY$L0&ms4*Q)`?YPo3U50My_Ll
zw=J@j6-O&es+QI)tyHp8GElagpqqixP6jGA`B&p#HGya9qrZp#y0lmWrA<z1WF>bF
zAy&{u(C+?v{~8EdS<JIM$6c;Yu|r#OHI+nbN~)FCDydM=MzDvV!)x$=YEG*W^b+hE
TLWjUB-|5k7a?yj%e~14EBdr-{

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ru.dat b/res/Keyboard Layouts/ru.dat
new file mode 100644
index 0000000000000000000000000000000000000000..d67fd45df7e1651b1c94406b5e6234f8817a3ca5
GIT binary patch
literal 4729
zcmeI0eQ1|e6vsc`qo`Smm1wDnnzGzlo0%`Gl`%%fNEjI-V=yvCmL<K2Q5foSsV%jo
zxqNM@t);e{Enk+)SV)Cb=RzSxg$xR*kP4|N3NPD!F`pXxpZ`41Kj+@>J@=gReBl0Z
z&Stv4VixfTC5&elrOakBWz3<R#XQMW3K&fmGsz~O#~I7R<nka!U-~hCfn361hHx1}
zDT?7nFp5<S;|dCy!MvzcFqcY}P(^ijzH^zngu^;kP{V3!6MAO5wsWyDvrTPEASG}f
z1PavU)WJ{<)=Ap=kyHFa;55JUCnGdmpL3kU9OXMc;!`fw5iZs-2B@Cx?4*%h?4gOh
z?4yMfY@;=X%+h`i@)h6EFJ|}~)JIoojIQp^cdpW=B>X06f+i|Qc?mreC%03d*2`(e
zE43+slt51cUv|HkDz&IdD>YX&TBBM$s`aYVCbjB-7U~I=t5VgPrv++Og?4Mc8g+|q
zRgsEyn{HQ$?og@j)KV4dZr!5~b(hNYl%7^Y%&=AU+MzbRuMf`ig?^Fn3p%QgbxfZn
z^vu6}(y1Ts<uv1!+LS;_peKPv*0mdLrB-6&?H^@Xw&mI&%eTok)yizP4YAAZ56Q+_
zUmIw%>@Ur<{#I<?>V!J<y-w-}{S;r`DgCTb_O*VC>-+3ioz^hB(u!h+0xPr`Hpj}X
zqB~#D8vbwnSi*0C-D{P0zde-DGj|{8)ED-0n(<0)N+2cBlfXzOaeeIeZ(vI7^QSRA
z_WJp;yT3X1^%voX2+tCp!CUcn@HYHy!b-v_`~abv@En5(%Lz63K722Jgs>EU4}TYL
z!S@qZ6KdlmA*>~=AS}ZV;|B><gy->Q!WyoNgM~3MX%2ZYTwWX~EQtlQH#0KM8phGF
zd;>Qzfg9sAA)9NM80QH&u|D63H{d()P54XrR(u`ah`)i?;jiJlVmRN4@5W!mU%+3%
z>+x;)W_&%q0e=%;7E}6L`0Mzq_!j(Sd^^4euf?0V_TTCjC#yS~T}M^hg{AkO`jYf6
LAiMU4v*DcqF78S%

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/se.dat b/res/Keyboard Layouts/se.dat
new file mode 100644
index 0000000000000000000000000000000000000000..28ea8ac8be9722cb15bfe270c34af7d438835893
GIT binary patch
literal 4654
zcmeI0`)^f65XV2?gP39pX&OYOh&&W552*@@R%@|}q9|HL5fDWYv<eE!!z!r-TNO~-
zLTWMPVQq`WMkrWXtOecEOF}}>s3B?y(Ho+Ms4+y1hJ-lxTrR2CVD2AqHksX>*_qin
z-_7}9zQx4HIHq$S*D#1&uIC0uFo6PYW)?FU#bpd&2v>74moklk+{-Wu@i>dKN#h*S
z=|cvY^yNxRcRu}joPM^;F}cg+7H;DX9_A6|n3l>|lH|0AxfJmf&m`Fs>VjaiETM*L
zh(L%y3JCmp%BO`xd_gO<w6U8G8tG&&pYknV^B!BNVIw=)Og&%mHlI_+K}slPC1t$I
zD%S7@6;!c}<y2eFqpY*J+2nwU&p!5Zm?L~=S}NmslGCq5`GKGKImw<-j|H3G6Kc4I
z2!sfvfIy|<PWf7>B2Cl~P10md(O9z=YO0oMvBoP`7iyRal&u`i*F~DAQJSL@oCNhy
zPxVr|`Y1!0%G2Lmpe&WBulfbKXWKkYGc?QA;=qzZS-hU)`I?riR4esLl0A{DEU>?M
zhSP*sxP}OX2y{naq!-tYDBbJn9hI*ibxgnLOZ$_4({W{b8Qvj%qfYJ9_u8+|l;(Y+
z9^L`TtJZqeYLn{Jpe8kIn|A21)~Ul{&+}T<9{i0bZT>@l=|rG)zx)68!%x+f@EPiz
z>-F~rc!QJdiSvPhJ^Ku&39oPs5eO0JjzAWdbA@&7V;RR)*5Qvg4j_k-*46i7Axn9T
zMLfszEanNGw(i?+pf|I5)*AV_%(FJXh$pQr_jlpf<F+uIVwUkJORU#l!2Eza7;S9A
zAVyo(>nwPT@dYKuF}N187;Ln{P+UEi7^5)8*oEwXeMsYO?l<<K(3pk?n93xk7?0qW
zS@;C*;U*>;rEsf}3b!*EzZ(B#T&LYK-Pnl&<1udJPU9PLxt51c-<_9yw|j?t+`C3<
zL{~K98hC*jJZSyP%vfzP0P=~fh#!7{zlUgfg~?izDk5uRmfpCn_?z&z(^W}iHC<ci
zYL7+v?f8wjUAPZ%@8ddfO+;U+HQ8XmxK>=->C#^OPiebxJ8(O3ALHtXmTkaqOXS&(
z+ly<q3J*3BDUCTet8ZiM6QbpnbhQwvis@F}N3l2YD`I6vR?*dHC|iVIgI|u@ga4L2
ZNnX6P8Y^wR;bt)-aGQhoa*hA4>>qUe3?~2p

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/si.dat b/res/Keyboard Layouts/si.dat
new file mode 100644
index 0000000000000000000000000000000000000000..4b8d34b621bd3cf0c5626c361fb5df865f37afee
GIT binary patch
literal 4634
zcmeI0`)^cL6otPvX_~R2Xb_YLF;&qb$U_trlmd#ND2gJYf`}DCL`4Jyq(Xt%D%wD)
zgjOsSv@Hcu8Vw+%815rP$5%8O4e?c?hNvNg5H-ffzB9c|=SE`xfIFEp=j_MXckMN~
zKkQXX<};ibOrwbN8O61X;S$Dj1LK)VF#{RQx%A;0E}|dPDc~OZau*45$R$Z0UFgag
zbfY_0S-ErQ&10NJPlhm*$>zD4Te+QCJjBCo&-=fvB$BX%M|hkkcrxM-&4ua1^3aU;
zn1PsqPB0*4lJ@gGU-K@nau64vogCslQvARX-lUm2>S>{o9em3c4%5U}JVQCp@jMl*
zrIIQ(u#tCIO|6wYMh%;Ii`{%-)`xt;XZ*xbe(nUOAmy(}-XHwRaZd1C#2=a`(}#aT
zGu~qcVg@?F!0NX5e~4yis)nhnMrfo)tHAtYG)^;BtUfAKp1NtMdZ@RitBa<nrzW-C
z%znsV<tSH4%}+=BX@DlCPvbQ~vo%L^|MOOMjlfzF$y=s*TA)Q*8u5oW7pMIzPZ15X
z;yq>{W}qVjXD2e&2Rg1_^r?2~bA749I%sdwH~LN|bwZvFX}jLm$J(P79n(%7)js{G
zXSGHZTC4TiplZFOTGi=&m1&#Z%}H!keb(D}M8E4#{hj6Oh$Q=bW*e^1dwL>~$W0^@
z`4N8@&rADzoFW=##e2*^%s@v5dU2^u>6dZ2P3l*0rOofdY}zlRzs>chF`vaeXjAt>
zo?;Pmm}fJ%zXh+7eC}s~sROf^ou2CF+I;R+;FaU-#XrDOmhga0>&2!7JZfsfKn9q0
zP+-6PO-IOQkf{bM7=hDFFU~XB;Q|vFE;NB*kVy*{TVSN6C%KI&TyN6B9VR(U=0=kd
zCgQ(>x6Vq8W|9dNV;PqgDsD27!FvI(3}+jD3wN79aUFM>m~jgexSHYI*AAd43Lxlp
z8YQ%@dL3ssej}}A>ugooT93OI_W<r5+>Lh8ZJ@Puv#pnz%Ds4v_^X1iTNkwMyk?PV
zTQxXa8O1W5#%Z*ci_G_8JA#rZg5{*jO<GA+<Ln}}$<&xsjr|R&+Mpe)o8+S={FNDm
zZ{RoJ)El@;yk^{L+|2<p>wQ1Y4xH`yYw#M3PP-Bm$he!VY+(RsU(kv*)LL5A4#{cA
G#`G`gD*w>{

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/sk.dat b/res/Keyboard Layouts/sk.dat
new file mode 100644
index 0000000000000000000000000000000000000000..9c3033feaf0e0e6bb9be4fe1e21a3d74cbd4ee93
GIT binary patch
literal 4616
zcmeI0{cBfs6vtohX|=>cN~BUu%QR;>(=sjdDb4aZ&4+BQsi~=%nVPlMvJu0K;g-c5
zW^3v;zWLNFTPa(0Ki`{(Xo!eNi8*^fEJS*s5TWzE+ZDS^+#hf++|T)(&*z-;KHvA3
z`@?w`()bKxF0&X(Pe$<=W9Y{?Ch#~5c#iwHpF8Nq!`#h1JWCI9$RwLIT5}C;xQ=$*
zNC$4F6GN<AS8it+x7uzXgLum9WTx^Y&+`H=Ho{$TEr>+q^Aa!f3VD(9(9I1tZ-s7b
zV+LXdTEM`CrkFa8bBu4O#^JM<8uqcD1DxappR$WhB>0Lg?BIJUIm$MU@D4?+p@g-(
zPbp=rX9Ih9n+mIWhH_hL`I5tCzvGatr}&v)&9>zEHxl$0r}>?;{1G`1-E+a_eCWnD
zW*}yu1q`fKW6*HT*Bp&f7me0fjaOey)Fe&OA}v&Z4OAy}(+KrYZ_QI@%~pnTl&03Y
zTIp(|wz^*Jbc5P!sL)NiMJv?7Di6|NWt*L@8OqXPEz!~@yeqX<7>O&;a^)&dD<kJ&
zo&4Z@)n#tOsMy8~#0*@@z*T9DUafxAG1aM5U(4xRRoR!cPy6+Yeo{hPRiZNO)(6_C
zAM~D%s$55!{nmD=NNeooTyVQXJ9RkN9n>M6)^E+`T-r~#S5sf1e?e#Ur~cOY%T)L$
zIByln3bSJyGY~V-90MI~u20tESCA~iuf(s%)!`~|+i(dUBAshl!V2ct0KSY|mNTEl
zHpaW%xXm{D&t$1d0&|&XLcszS+K}%)!>i^&{8hYa6Z>qN+h^J2zlgi&Z3;pLU2N?|
zmL+GJdhmvUcr|o1X`!#l4)>be(BA}y0VW>wG1(#AM2Kl7OibblW-!IXi3v=!#5*m0
zm<bCbc*G=&M;UFR#aM1L@u8<l4bx4mn96X*n~X7p2YBWpY+e+$D??4M=w?vabhohA
zc-?wS{p>7L8yX6>;(d-^O+#U^y=(1#7xx9O-jt1}tyn(E5|YJ%mt)$9Ux5Fn)k~=)
zS$LmV@$LqZDw}O`$Y6uW!22lRAT!!bItLS}^pSYm@vHDE4bRHg;MU<j#MR<TEy)$8
tICjN&ALFkkS!EcO=E|*|ya2^Z(6Dlyy=6v%XMa{{D)}O^SM`7B{{XXV@J0Xt

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/sn.dat b/res/Keyboard Layouts/sn.dat
new file mode 100644
index 0000000000000000000000000000000000000000..5e3ccc8a41a38fdd2446df8092952196c8bba474
GIT binary patch
literal 4669
zcmeI0|4-Ic6vtohPcDff8*|o>8BwI>H=-iLBrUbfOwH0X)3P+nG|QqQBBF&6b4tu9
zGmS|3CL?epWJT`Y=W(tt&ef{bsyS-T^<~vuHCLOR=YfaOvrPYh=d<0<x#!$-&pG#f
zcYiqVQhL6LEM+m1xs)52%8g_*of*tzIro#pm1Hu4>$r@u+`}a-Vl)d07{EZz;%rhF
zL@I+hp9vOj7#XY~jdXIkhWTch#T;&D1rPCXZ@yEB;y8ywR`VE-^HiKYrWQmeB{4N2
z69^;_I1L2OP>)j=-F%Cqju87fKr0{c5eGTK_w1&fS{m3#6D=HO2Vc|7SFEF)3f8lM
zN~+kzW~zCY7pbw3zp<6=?BQ*`FzpbZ@EJ$>fuDNPo$`Mo&f_nB;TXSjJkB0d|BO!5
zdzzRvArlBB5cod?w)MW487kCT&DIFb)jTawp4k^^iAq$gd`(uSMr)?VDOUx`(i-Jx
zm6DXKb9AoGQ>u9n)(~Bw={i%xl%WcxDP2=EO)G6}sg`Ml$rn^+|I_)Z<NP+MT<f(#
zRdM!Mtjef;>q%B)UJ02%Ab~)C1oDC&?Pm=M1_j6TvHs9;{jG28C7qCh^dK!btnYL{
zhxDsH)t5>QK2%EZxsrog?NozysYPvSSBLiMJ^iQ}?YF(dgMIQkqNC9lIl!_E3@!{Z
zd$aYg;J@d&ah^FrRxmOc6=cWRW4p&h?c-0f8uLoX1Of>J`XeyZI)2}1?fr0T@W<dA
zSc0#|*D#WaBw2TVFNG|N_TEqP1P}6v_4eTkBLPx)l(j|=Ea!n}YroQ(`&IZh+-}@k
zJZZi9eH0k4u-e#y3FL8+@dp`}WE9uh=5ZwRoaJzB4CQho8Llvz;VPpHu4cT^2HCh)
z^Gq^MVxch-w;6x1fIEzpn8j?uFXP^@7;~7*6s8$paT7NiUvY~u7QT|K$m)FVG%jNv
z*K?~e7h^4-tM4lyKfZt>in*9)xQilVHx@IAyLmQxeqV>%MR#d4ZV%yly301&sIu`2
zz7yYNd)y9-Hwph5zLijA1fNhnp-#f35hz?cuGxr_i1rSymhO^QZEQ1S-21o=-0OXn
z6~$L(YrY)U8I96_tHZy9dlSD7UxK&&T~?<rGf*wEYawg}@3itN3AN$3;J4dZe3QjJ
v*cidUZ^Si4APm*n<%gfg?TwUYlYCsG)wRV&wV`HqzZu`rSDWSj*S-A%@1_y#

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/sy.dat b/res/Keyboard Layouts/sy.dat
new file mode 100644
index 0000000000000000000000000000000000000000..a84fd573725db75bf37f52b74a407b13aa424f87
GIT binary patch
literal 4620
zcmeI0`HPKF7{@=)WE)#Zl6~Kou`k&|L_|c%F0w>Kl>IUcml<Q<HH+)c&Wvr$jHo+_
zq9n>Wm!wOGB2kjW<GM4=eXW1M`_}V5=RD_ozRz>Mb$&R{DSmz<S;Gp((uVO&WHP;&
z$~0!Mk#+QC0L^I6XgU$cDq6CPt}G#jN>rg5)u~Bs>QImR3|G2FG+{RlXviRjvPdJd
zna2V=#FG%o_b+$M0XT%0B$7Gch?h<Gg$F0frmlAta25Cu1$xR)&{Jwjth^w=D_--K
zd%Wi(pQtZ&<pB@5$_<`zi@Vg2>r|0DRFZUj_{k)jT+Wiuc`ovVREm|dxm@N7K^}u<
z_{<l+(m)zYqe#AgmDbIH>m*I3rL>j~j(8bQ+i*PY536M;*SiY13RG0U_sfl0tdXVR
z=<@JCp#oxVWE`*FBmHEc43=RsLPp6L87C8Dk}Q-yGE-*DL75`cWWM4ysI8RMvR1s3
zD9I6qiZ%Rhoa(@xl>Ks8j>>UIJbG{XUst2C?#xxdRUkGdT7&D68+147Cf%1pDGf(%
z>%T<a$xV4vj>sw>!4t`lOFI87c~T$`<&nG$uRfLMVgI25Hac_ktg@pniTNa7<g0x9
z>;9^aUD2HG%vHcuAX<UO^q{A{_IuMu-}(LMuW$W0eccb%cYQ48GUgH{2fG!!1yhVE
z!tTJF#pGdfG3Tg-xrn)d-G#}-Zo_0?vat!+?bvusAtqlt3C52}!}u@-yelcedNEnp
zotX2OE81FUp=mp_K?%ESOJTE?5GbIrb{mG#TKf`hnMFH=b)<v#6FO^sb`N$pHW{0!
zj769;%%QZ9(j%A?+ItwHRCX^miJ44Sgcfod>%k;yhJm!g?jz*!vkALj8y)KvqK8e_
zPDdBIVN%L#3izEx*)(iAR_T1$Ggv=11FOf^6QwHY0Ycu?u!KP$!Gs@$T*DS%a|oUz
zl%lX~b(sW82&laI*j$1~v3cc59WsPG`O2#Wdv_{tXp3JhLoHJ+OIMW6lcScawnr@)
Xb5hfWJV_X@I?d`SRx46V{C$$|Jpvdq

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/tg.dat b/res/Keyboard Layouts/tg.dat
new file mode 100644
index 0000000000000000000000000000000000000000..16423f3e041b74ccd5a466ab02cfb464fedc3b03
GIT binary patch
literal 4593
zcmeI0>2Fq55XOIxNB~JgTnN#!3sn}aAP5xMDw`m(i?WIc3POPj6>CAkrD+>L%2Fds
zSejB6O(`O2P=WWg2XED2G=vaB2r9-9LWuDLAtW%peXnUR68Z<+`{B%)IdkVZ^CaiP
zJS(XA(wNR<`jf&y(izNC3}rYYc#T)-P7m7iIM33VCz(nIUZyKAaS!*>h$b{8iDo>&
zL$si`m1|8~=JN<GZT}1tY<+<j8O!U;;msPjyRO-xj4bAn!6KG~;(?p#Z*l@RvJnFj
z1NC6wMk41hXF1IgcJeJpInI9KRC0pzoa0N%*hVoGl(3gGZ08iE{KkiTOfGp8u$r~3
zV?7%=#7eeU%}W&Vx!H1lvDM>8e&zyya4~^*H*+nN@GpOJnJfGgiU;mhe{(%>BO5Ug
zF;EW%K2lB60L{@%4OV*%(+G`Hca70_P1JnNRZsO+E2Su1os_CsYNHwIs%erMsG%CE
ziJB@&&2+yWR6pJ1VI?b5&DFwcr}_0K**aMn39Nctiw{D%Ia;J8%2IYH9@JXq$5-9q
zG{}l<#6ZMAZ3eC+UQDS@s!Cs&SEhsdTH92iZ}go`=~wMgu~w^4`?OJ;^^?}>2Yn`|
zy#IM^CCXKS#n09`J7!*7r|ZOO-{SWDrBLo)I-_$suRlZa;Li(w{PG=6gRIC#3`7jn
zW+2%n{`ejn?;o=P{|Vxy%pks-_;xzckH$9L&m^1KWZLBYE=!rqLYu-n*u=k>xBZF!
z4V&rb@s>^e3y4<`D>s$k9hNbREK?6MOeyF~8tp9F)&RPgijYJq_wl~fj~yVHZYD51
zZ4yII6AOBofY8Uphgg|qHfE4%5<?hg8p10~<atIjhS)AEFqZKqQVeC7FH(#&fngLK
ztFdE;m}K(Ab0$xuo9HmW1dCK+yZ=M)A4X4M1&{I`Q^+x?W2(s@1DVG1MC(<B{Jv^G
z-e$Za+*efP<L$xQU>wAXt<;IF#)7vASBSR@uLQ5ur^2(FlqYDYD!^M$Wr5E`z(P*=
z9^L$Q-C^9PxP06}+yR_b{=|At!mY86T^?>7ZUf&J<BF(m+ik4|s%hDk<5p6c?{^&l
J#Y*ZT-2&Du;PU_g

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/th.dat b/res/Keyboard Layouts/th.dat
new file mode 100644
index 0000000000000000000000000000000000000000..bc037cf82a1a7988338fe0835a0f537d2d057fd9
GIT binary patch
literal 4925
zcmeI0dx%w46vn^rJE*0oq-dxpDU3N|qm!1X_^2qU(6C6U@R4F>U}2<WD2z7Rs53UB
zQ;y@<Xg<dAk?+U38Yz>QRH(hM(C|iyMMa5)MM-}5&fK^i9PHoXT=<=}_S$Rjwbyqz
zf86~s8h%qyiyBPFV9dZw%*I2Qi+Nap?bw1xFc$qV4AXEA9>h8fz$%Qu3JA?{16raD
z+My#lqZ@i)vbXDl0vth4<lzZSz;Z_xp%mrVjr};-Snqn~L?q#Tyn}ii#qmfyGdz}d
zPGyF%jTML$_!kOPvmxnDKF?=3l&yI;@8bjP&QW}rWB3whF^9Qq!J9aU9oUu6vK60Z
zCqBi~_yS+zE1bu7_z@TJD}G0Reuie=b1|=g%;)W#<k90C&xxGFLKZdFyWY_%BY71p
zW(k*aStOp>rz{<>YGO8%728;WSb=N>W~gB#-K!yLsn6L)?bJ~}u(P_Uheqmt{mfr@
zif7qeNq)<_^eG4G8{VO{+`wAaaT|AXFGIe~BZO-BAy06Ej`BEv<DV>Wg`Ub&AC1<d
zdaSWt_8G3_PmknH(>Oh;$(kC8XVy+h$DeCrHj@?GSb<o9Yy}1f4Wm!gHfRx?(N>+)
z*Ses?`d&Zjl5P&#2k+`VZPX5()*c;Ft6;O51qT!av-G0os8B^JR*A|~p-O$E7qs4A
z;jKZn*60JB)L$N5)*rf}PC?h8dt<%qGhE9b5XtKo<OI1v@1P(O&#cW)#|Jhso5_l8
ztU#<lwgO#{Oe{oS<RclbH7iVL_L~Lfb+gF4Y?k=n{*BIm#iZu;m>RRw>@xezdQ)ZA
znN?;ZTKl=iY&G-EYhFFiEH<f~cbhF{lPShTKa0$2Q|*k@inq*ObHG%ZHyuyqyx|*$
zTYU1~7~(2@eG^fLp{U=5E)FFV%gl09VO%s!n8WtnQo?N}yj5bQsd8J%M7b|7lHsey
z>%vrgsaay*>%$$!<FFjJr5oB{-!g<{&PhpAYFlhd>~A)8ro<N^IkpSY3%Ry#INWXy
kI<FMN?fG=!HdFg|Bg3MN{2$)V+-Ot()wfe$`_E3U0!Mf8$N&HU

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/tj.dat b/res/Keyboard Layouts/tj.dat
new file mode 100644
index 0000000000000000000000000000000000000000..e8858bf74137de1b5612673018402e56a8d05d74
GIT binary patch
literal 4727
zcmeI0e`uCf6vsc`gOx2c6Z<(awJdF^Ej3eFnV48fKg3GRG_jIoV2lL8Fjp(HvbD{b
zHZ@(##j<TqovYO<i$W?q&+{S_Qq+*BkP4|Nit76AePg{f^gsW39(bN}@44T5&Urp?
z|F~x}UC(ruQ^HIx;TC3bJL8$dUCd`CE4Z4;3}GZUa5-19jEh*x7>Y4^aVovZqYwS)
z&j1E8Erc7yV4mh2&gUAgV@dEV<X#q2N*Sv&`Hp8c<_M};!&=Iz%JFBX73o1ucAD6P
zKtkXI2o$MH^fl*cfR6A1KX8<vImoa4&YuiczCPs;@35b5`Iwlq^&V&H0DV+T9ouPO
z2aPn-!fskQ%vL%=$O5&|&KG<|UdSNz(rFs1i*;!x-|<SDn4=r7ks75j8k^(K#wkqu
zC-<<LRV6kdkPzrj;PcFhc|vV!(KEVV<*HP*mT7}(v_&0i*K)1UJ$gWERIC#1(IPcz
zsdi|prfIrn=tj-dt(v9Tx<h4}qIsIHk2FVfwNj;O2pP7iPW5_M@9V=8JfWZE=niVX
zKG6ZCa{SqUiPHW<J*;L`iA@M31iBM=$hu~O>}H!`!|V?Yw-HugXV_>fv~f1uZnJ)N
zmi?l?bfKB`wwvrXU2mt@)UdNthxLuVOP{(U`aakT>`VO=>_YodM>WvSwJAY2!6sRe
z-Dz{}?o7V!HT>WB!5m$&EwDv)pDoGpXZJ2n`%8LQ&8iZc5J(7gCy-BJxYLhiT)6RH
z#e{IzpU4%&Riv82&Hi-!b>bSL$M84sJ@{MrE}|!icj0@99w&N=zC>ljd+`>$8GoB-
z72bij<Gb-zqP0X7%p)o%T1`}nzlpaIJxb~&d?(SfjOH?iFp7fESm+zxJRYHleLKl#
zD8uM1TOWE5!<odjK{z7xBH~I?jiEx{Nc;jG;)HKCz8SB=Um*^)JdeMOH-vy*N8E~6
z;?LnP;#=`8cn!V|Uyr|rmxiR?gxBNS@J;vzyp~igUV%4;#z(fkhjZ(z=hY0q&Q(>R
ie{zgqbNH2_lf&;n^|k*)?-;oS0r5$owr~5tvHcDAqfmAL

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/tr.dat b/res/Keyboard Layouts/tr.dat
new file mode 100644
index 0000000000000000000000000000000000000000..c2b28df3a4a6c90afa2163c8b65bfcd7a3f29789
GIT binary patch
literal 4591
zcmeI0`)`kT6vtmjT$fG+5kaJGRg^C?Y*lw-?i8gM8^by^W}TH)Nv%XgM_fu;ZR(n@
zd#j38**>3dBht(zgpC>bMr0O|Wm%SGKP)@nZ@&-SvzYz?&yzgQIp_U3&-t9sJNf)@
z-s`A&1~Qjf451^#7{NQlF`6-qV?OWWqYv%r%phXu&K#ndNi0d!qdpC3%xgr^lx8%i
zC2woFHnigtTG5)m^k<qP6PQdQAF`N_Bm2F|WVjO2No6@JSn0x@FfHt4I-zGh20RAp
zz(75zNvhx>KXQrve2b-u<6Pzn)jT4|Ns1}tAe9{EC_hoeUHp7cHXGT*X14G(+t|)d
zayid>_G-yr*+U+uDdV<A-*KIrJmv{c>(Emu<!@KsUp(VCe&<gY?u38TIFZvhsAoL}
zJO=)cfen!xGg21F9Q9*mY#51;;3=|L2B{w-aWYzbGC<~Olq`KENg7ELiIS$$Oj<}Q
zX)SG}oeY--(os4~nzWZ_%^WJz^gBT&OQNL8GWF~BWVtdkWreJibjfhxPPNrx{HvF&
zI$56e81NXV&A`*hjVYIE3DmkhB@zFIT$3~E9}<5UIVqRb8aXE4$Y#lrZL&jhBe{7}
zAm?P09MJd&DT<)ZZj~C}a$(Nef9=n%%tvxZ?#X=#x^U;u2Vwk|m#jKjp7j{;7^uxa
zTb=FS&^i50`su7bfVXsl@2yjQPo3+V@F`!gP^a!RR`EH3VwUL;9w@|K;B`LWGacy{
z=}`ZXj`d4)K(8t!MHPfNR+G*Goz>^74zLtkhCNI#ts1R$dyt?%`&2bptBQgtrY#-l
zs`5h*x~Rb5Q)!`_E(~FwwlIYmDn=x#h>*;56(lC9kPs-q=4**zOl2gaRH%5Du_{%J
zr>cO!DXgD?s%6Yn9V3b1OjPy3?!s;){&@$3-5m_Z?5C4z9HtU;kuRCed#q8dBO}bi
zP=Z;<FlB1W32xYmt-zkZmXfKJ>^^KE<_M-#50apYi8+d?!0aQqE??ihN`pCr&BdI3
z-b04F2UCP8!JNiiAefyWqQ;!UT+$A%`Y|Uk2eEnB9PEzJu34ew1hjR(?y+0nJ$hJE
Nj(xF-IrQ&c{sDj`<>&wa

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/tw.dat b/res/Keyboard Layouts/tw.dat
new file mode 100644
index 0000000000000000000000000000000000000000..44526a6346c1168201280a1b1f71360a75f48a89
GIT binary patch
literal 4621
zcmeI0d2Cc=6vcn1nx-}u#1JB)1QfJ@mWqgFD?4HZ1grvrY+|K|6$_M#6-6Xa8bG3^
z;6hUt3!%zVfhmPFyq7{sX;@T@8bSueC2EWk0%%CMeVv(%lcN3K_mVH)ckexOzx&SQ
z{c+AB8lN<t<|+Dd7wHUSF!wQ(;f!DklSv_!_H?2T_t2FIbRd&t#u3Mj#FIcGH`9V!
zxRuuQvUay~2eW9yZS<fgV=R-wNJcY_8O#jb_g`CH3?P>*W;2JmG5K(q;~nzDp}+eK
z_zX0Ifr}wb1z&QKeSAbERUD*@Y7XJ@HD9rf?X0JSJ(RMA&-sAkY@(jmS;A75v7ADR
zSj8IFvWwR!ww~Yd4)5^^JE*g$h9lJSEoV5}jF}oBf5hN^BglDv<d>LyIQ-c=TnLB$
z?la&s&<qCNP$Q_9rfHJ;s*MI{kcKK*!!<$~%F+yVQ;J%tt<rR-I%|qrYoa=8y#C@U
z=my1ydNg$Esmmm(rE)Bns8sb(rkzG>YzUJbh5fhj3Sw~inxnbORbEU!++)6%UwoZv
z80GIi13m-M3?#-iMu+r+f;ys7)u~=5RH0M)LZ|hse$rl5>O*aotF79p?^U9+D%Tk;
z(+U-7wbn*`b=6v`_btApcU7z^9n?3G>hJn9a*m#%sdId2u5c|b?xL>fZ<*+5^114D
zPPk6B$)EU1pMn291MPUgRQiLa(;qVJ{xE6uHno30{Y}^3#LFz?IdYlLD=Z+JmrQ?8
z;u(^d&OFodSv+q_e>N|eGVja1rtl}Th<u(U&$NCHFPe{#LU(fwI#|zc<}V~!lxWJK
zKh7@N(UF1NZPr3(Ga4Gqg=D%g)qn|%Wjw>oWXNP9Px2^_o00IUiHjr#@q}kiJYx1l
z29KGw(8p|x#T1x@F@YgwV+=O4VU%5#&Vb0(>9JQITSfgkoHCp(oO`nzx7d4SXRp1p
zyNzIFiLD*BDmYq5?N;1C)Z4pO4XiN&YKlS(1Orvnz0J`BIOQG*Zkflzxh2&&dvK~F
zqZGuB;*{d-#;L&BgtM`M8F!xz<LopJ+(H{+gRM_(?WXoE4j1FDi((_V-^zj2X4llL
h3{esc?8o`o<HKF<5fc2&GB(9_oT|tm2KmSTaSh1L^ydHo

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/tz.dat b/res/Keyboard Layouts/tz.dat
new file mode 100644
index 0000000000000000000000000000000000000000..74d240a968156ce358c5af2c15c1b1e16feb44ec
GIT binary patch
literal 4661
zcmeI0eQ1tR7{-6sBaDTFRztqEw#-MXl~^KDO0ASyl!%DbN-0gom@ymk8IrNhY%}|?
znJr9HL?Ti<=haFnwbG<ktJTW!yzjf_U90^ie>_h;=iK*oU-x~T=c@D1bBpk^ks};p
zGpS^<g{`b6i|y<nm!qs<9Z4)_6KSmEFezk{&OtoJ5=T6fnaXq$NMtq}+_;4-rjWVJ
z_eURa>n`@Nk390jVxw5E$8fH2h9b^$DF%<GC4O)-ng)B|K;XbA97s@@^qD?>5u%MQ
zzVeMX4*pKJUwp?0ns`PhFL*^SEe?H2Pq@*ocOy{+ReYk9MwgFOE%iSBBT|Ka1|Xt0
z2#yd;i{VYt7>(BiO^U&z?eRW7V}xpy73_fnfdfMwXo=jIow}@I?bSx@*Fj}#s}AX~
zj_8K2DNEb6R-3e2o3%wHTCYN7sz9?eNAtBvNlH<wmMcx^+Mz^cXpJhgQmg#g`EEU`
zT;=JON=JP^AH^{1RHjN*sWt|WeoKvyH;+(_vVuKuAaG!)11r36)}yIjyw|JG>Qlc4
z^zF}0^2Yep@9Nfjb?TQw`l`v^M_21oT%;48Ms8iZUh0S1^v>mTyw`f`<KqT-)4c>Q
zaWETtis5l;3@_Q6?alKRcu6sMv~!V<FB_p6Wd(cSK;Xbo2WDdLVDDnfu;tha>^*EH
z_CB@>TgnpmCm@aq*b~?S>{UzyrW$(|dmeiMdlCDbN!Vh{BTOCkIH6MPY0Lv`9`+>W
zCdO&hvklXTc}OUq(0z=P$j6?-oa4)7l9}toQds4NEoCCdoNz}2?tIn!Y<lkAc5JRA
z#1X2)lw(@4t(X?<8SFWXJNGqAm1{SZm}bmlY$2u%Q;RLamXL#af@#9kVCpdym@>@m
XLFJ5L%Kw)$Im6EPubk<)_qX(KA`(DE

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/ua.dat b/res/Keyboard Layouts/ua.dat
new file mode 100644
index 0000000000000000000000000000000000000000..c3c4fe02d97b4accfc79945a9d7de1e826542c1c
GIT binary patch
literal 4732
zcmeI0`)k)#7{_1FNi0Q6ti+sH%1WEJrM1+w!ALAo?1Gh~bhX5;(nT!IIp^kFZp}^S
zoX$0E-oDLkEiZFsd?*ULJ;xHMi0T`KP(*=LL{ZPa`+mpzjN$%(&j$|A=e*CubKalV
z_j`UgPc<FSExf=p%qE?=+|FH0=57|Skd>?;i>ZuYG_%MclV=&plZ<C6jz09|BKk9c
ziy6dVE+fav4P!V(3}GnK$>uRr?&l#Evzk2CCHFgDs0<~PQ%ErzDGTYTX=&o6Dm9H_
zL?9y23j))mBPq`1a*3QJ;3t0JH$3O~gTF|Vq4GIrXyZM8-~&Eku$*9kd`Lg3rH<X~
zWj`?*Xr!4IzNLm%D>+6EafC1Vn!dKfKOh&#2pK8q$^Fh}Ei05aNv@F$87G+`JymBy
zLZ8yZYAP#=5rK$6R|4NBPfW2Km%~yfk4uGA$~JjXc1W%4l6U1DStYr$Se}v+StiS+
zRhCGLJSR<(Ejcn%Zk5?GSLVqbGGFeIBAFo%%ERJifh>}>QXmIyhkDs3F?nB3%E!Gt
zq2Gk^zLHPnGdV3^g!I(6oJr{4^{|@Cief|{BG8q<3fD19cX!%bhP%*>cbRUoyVPa5
zscyQPZ|V?tg%gXTU4J*o&2xR+95>M2X3AOlS$^$2bLZrD8RdSIe@%JR{V9LTaCfDf
zWqH{y$IW#2x`plmoAu^-K9sl2J>r(QrS9pFo~rdkLSNp)YAP#=5rK$6R|08V$0WP$
zU(XG8&%co=cGu6e+x-l?*Y`t@;tTL=(N^>=^f>w^em%YjJ&a$6uVf%TAHM}{MjO!+
z_+0dD^cdQL9>P~x>)=!wz7$`GUxT)xNAP+0SI{PW2@|ZbaFuO3mWftwqBRs&n}MK-
zH0w2tBA&m6o4A^3)=kJ@4A)veVXXPnDzqNmg>FMPqdU-YbT7IOtwdi(3$2{)MhnnQ
z=&R^Xv=*&FtI-P7T<3GLjZ?OC5Z!~mhHgi<qIGBtEkhd^*J*EM*j{jypqXHg^-Y3C
zYj@mCJhzVfSY)w+cu{Qvqu+|(iLW7Oz#9p(8^X9DiLp40(O2Qkx?$YNM{BGh(~hy4
zz&<g7F`i%7&M`PZaLmZ1ICe7{&#fY!*J2~aORO?`<?VnC;(D|cEkW&<+0c#P{v^Qz
m-3Z!WATL4i4PLf3Q9D0#-vKXX^=oWww^83|DyaWIzW)Hugj5Rv

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/us.dat b/res/Keyboard Layouts/us.dat
new file mode 100644
index 0000000000000000000000000000000000000000..18f4c163caba2890294a8a27fccab8cdb74d238a
GIT binary patch
literal 4593
zcmeI0eP~Z{7{xzFYt7o$T9R0r8D<z}W@eiihMD(a80Kwem>HYBvDR9WBuQFpX$dV!
zOG}a#YptavNs_eWEw3dhN%Ht@Kh3SR{pGKF|9S57+|zTu-&6OGbIR#?;@QYL5(y`n
z6jGVY0@7H_7P5(E8l#CIf$>C<MHrbxvYH|I;ENyr1Q0|pAq*qV){P{TJccuZ7-Csz
zlXNmzP7d4I*~>RjDRBUb$R(eB6guYKw!rgJ>TTWXD&Q(G2nD|NVs7x5huoxrTioUj
zS7_xfZ9L@(O<bjp3$)P4B_2`F11{1<71h*G%W+O{l2e@K49y(nyzP9+S<Z2d>)f}l
zoenyA#&fy{ai%|zFAm%%UhtZ?d~nRY?K{uQS8wZ9R{>XnK`2n99?&$c)^f#aq~a8>
z1Vt!O$x6{WWoo=4HC&;J(P)KhrA8=2VM^Bze)0=6L_YGBpZpb|XniL{!<3^S1uIIE
zwb&R^wLodg(ne+X@(pyf0tYT%TeMv}mFJjy_vCu!h5dZ>qTK2#;408pfzQ2v%vE)%
zQ`dD)&AOo$UC>S4(rrD|12yWR&gi_ZsZI^Lue0h<z1np|Wvb9oRjFDvs?~9wP?L&v
z+IBwENuAOqT~V8Lchsu8dZfpCGRQyly#x0~PxV~gdgYjV@AASk|Jcu0FUqa10<Hpm
z6&S^IbLlh8r_VI+K8tu}o7<m4lKJ|f9OMYQDB>_>6tjl|=D#<wnLxI2$h>?myUpq6
zv)7#Y9445<&!(JGc2HtozkvOgBSbURQiCwtImz;cK<oU?IV5qfnNf_fuwkr43*#(k
z_!BNfGLfwY^kWt4S!f|cCL37G5>{A{P+{gGka?`}gcFM_o=9h@MGFZQTO6a(B8)8N
iTa1xvVZ$;bOJ?q0>SQPN|Gamlll=eP``+b$xqkyTTfLD0

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/uz.dat b/res/Keyboard Layouts/uz.dat
new file mode 100644
index 0000000000000000000000000000000000000000..5599cc853f38f14a42a0dc218787c9e0d172277f
GIT binary patch
literal 4737
zcmeI0e`r@_6vjW#NleGo7#hZ6I5TVhXsNBVp=As!87U*fP)3p@mNAkH$+23^U!|^X
z&9tSd%^73<nm<~tR#_BM;kn-s3MooND5OFv1VMV)c46Hb`lo-~3zzf0&->hSp8LT2
z$2r^Rd1kSa<&-j(Ig~MvBIdJza;jLxREilz0S_{P$*kZeDkx+b#sCH~h%B-h%5~&0
zoRX04M)G)->$!m$%;d>{EMhTBsHTRsz4a~^wk8OTtY;&&G$inNTi3m4innP@9Y`Ix
z0tcq6hjf;a%F#K#;CIgR7bm&EMJ|!2Tz$tWKH)gO@HH7m=re}t1lig}GcB~z#y$?v
z&S8#nh8=W;l;hPwCqMEtS)qb7K-Vf?V{}Vzy~|0Pmf#hsKoeD{DG5BzGpQRd?&maS
zr7?9Nb)c^UKlI+1HR@2iHs}e}s$Pv+p)G3Cc6F&!E450GX{pw0nU?E_9@l<Vs7?2&
zM6>jOW~)>WX|BrjuxfO#7OGrd=@C7uDpjjBRM@Fz?a`<DTwh+{4gEgBJE`OPMkn-b
z0+0VC>c&s?a~iYKm^zR;(AR+~>)DO9`Br8VY@ij|WGk`}Hr0x4hLzg_8)><Q4YmTy
zwj7&h*Vr5zW~FvoXLMG->YRSlA3Co;^|!{@Pr4Lt;Zt@&7nNuEHak?9X(e{QEwaV7
zq_<vQ4ga@(KEZp=mfF)+Vb3P;_}gc?@ydQqV^$hd2T}+6I*`kx(9=)hj?nSn$z7q>
zpT_NE8ps?9o&8|^eWEo)FXJEJNAQpELqzL{w&U*+ttNVfAw)G~n(%h~0RA!2i+C5_
zi66#~5^W@^V<Ay3(ORNv{6oBh=p~{J_(7sg+{QRYF_H0MurMUNS-ik>jvXYId`5G+
zW^<T9+|1qF6NtBlSwyCuOnXr1Tk#hB9sEta5#NS4;P2v_@Hg<?cxy=L&1AxPJ^mX0
zHogN7`h()v@y+;NyqZdUKfVXwiNA$!!FS<pcpbhk3_fCgl}UY9nScM$ca`~ftmWSZ
F{sS|fQ;Prq

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/vn.dat b/res/Keyboard Layouts/vn.dat
new file mode 100644
index 0000000000000000000000000000000000000000..f0c501665de7d7c683b0ea2c42100becbcee5358
GIT binary patch
literal 4620
zcmeI0ZD@{R6vu!66=oU{kwr_)@-j=(nwh-K%=`Oj4Z|=qZ^LK}qh&;vMUog=8qH`)
zlJKmjr6(;((pqatOG{d7NeicEyY+Zj^Mz0M-Q9hzbFOn;*SY_7eK^09bUsOJV>2nl
zu#m+pC648+WHs4j5l;f+h$WfHOeK>EWH5ydgwTsn`q7_(3}z_98NnReE{bRl5XmSK
znMt}uQdvhDIqYU{*Lgje6F~__$t91&6a>W`H{U-fa$MKC3b+dVg#uyfOseH0AMjDd
zOX_&VBVO}{w|t_7$2{Q<_jy4z4{4^7_dKA9Go0f*7r4Y_u5gtyZs6rK6}IIU%DKf;
zJT#j3j(QsSOe<}j$MyK_-Bp*97@~H*(g8tnXa1Xi5ZcYGljT}h0at-Q1&X?E%p7GZ
zL&=(;6fM+ZP1RB@*Ggq+o8lC&XvHW=v6`aI8mA4KtaJ^~APv#5fIAnVSqj%^MJZP!
z6{!TxP@2uJR;t!1TRGYtkR4b@@VGE2uRwcsKzYg!iaYBL`{O6NnRT*U>nh+X5U4=k
zkWSC5X1&)7Rm!KAs?$Tg(rdj@i$3a+9;-rCs?~ix&<EX7ld9FI(>kjXmFl7{>9Vfq
zs>)QOV%@S^*shx@*AqQcgL!ZDPWAev&uab48``U@E~i$7wCRh!>U%fqJN)rJL93kA
zu5}e~75I|^5!4*Va~)3wo@#tY@fG7cj_(-08`P9Ak*31i*5&tQ4+q&|{d+El*w1!$
zSvT*k!dpf-8`)>{Ad{^|5wh4})L<H8jS!?+$DYR~qX8M#{qHn#5W^&636Zw%c%us8
z=7n*D={&!Ol~Rbu-cxu=8Droe%2K1LImdd-4rLi@nCs^fYgxs7mKdk--o<;(_L<2F
zV-HEpGfI)d0;3r5#vcmEH}a6mY$F-7jB6~iGZUHdvx3CmDhLqcAOC&+Z)gASzkgo-
HYY9I9eu?Rz

literal 0
HcmV?d00001

diff --git a/res/Keyboard Layouts/za.dat b/res/Keyboard Layouts/za.dat
new file mode 100644
index 0000000000000000000000000000000000000000..2b6d2d3b1078f4fad1545fcad1b87e77a71739e4
GIT binary patch
literal 4636
zcmeI0|4&tQ7{_1lt2rde%*;$zYGqocWtm1nXqH7;T9jsHWkp3sMn*<xq1;+9#}t(u
zl7XQDI$@SV$gK0>)||`cnycpe0@a*zwN<M%w_4A=+{@^si$CC;?X%D4dCv1ZpZ9rh
z=ZE*ZfUajM^SPfJ8BIDFOlLeZxRu*j$O0yC6&G>|sf^)r<}s2i#&QoK`qGaik{Q5R
zoXt6$%XK#H0!Hu@=W#xhxR%+L$>dJ%;t>|{c>KQq+wy${d1RBrVwU*wi7+>ISe6Kb
zJzyYUpcf4M9<SNW5e~DLDq3izjcx4bBOG7x1$8vAk<GkMHMM+BC7-c{PkEIhRuSe6
z-lUY(l(B{;mQ!Ifzo(q_>|_@QEsF372RO>teA^35(UM<$bwAO;j~wHKFP{jH#}2<G
z!e9>=2pH%E11r>3G(`(FS7{odX_}##8gKbb%~G}&X`&`+s4h~fMr)krYnZY$MsswM
zzd(I-hSm1hnM%<>P1c_b)(|b$p!noofH*}-fv-DXIm*=%E%oISt$DG0;c4C`s)9XW
zAYh;;1H(dH(Lw#H6FRI$9nqIMst@f?`bOXBr2df8$Ew$E9nv1P>1XZKaebg;TBX-j
zqSY!>xhhnt&8pD>6=}Qm_6ybe{>2~kw-mpvCxTO-hxjT7h5Ck)Ldl_lzI>v4KrBD>
zG;b4C!5%OWFwm2M;aqJh{TkEhlTEu%VJg>~+P{)C)Ajv%o|kxnJeKk@FY+|cnf`u|
zhe+X3UN9}6&6B3|b9ly-`3+oV3V#6wEaNfqP3!0KtoaBNm}suSNSk?u`3or)C7W_c
z!)szVqsZW5vlcEjqakW8jAa}TTVWD&n9D6@GGy@p_i;OSo00H}iHj7bac|6=m}&Mz
zCU=;%kZQKY3JT4_n8(d#V@x-*VU}H%&Q0A{r~9w=TJUP|w%F~RD|guJ=!Y%04~Twv
z29cGx23$QIEls#q+&<hc+#cL}Hp#t9q?(TAa@yArDW!cI?adaq;Wgm3;?>ak+9q37
z)?aEX+zq7gKR~MK3|GdHgsmxDW$SG^i)*4Jd5w7c4b-7JB1O1TT#3zV#8u)p;mU9u
zaO<L&iix~q7}ny|6Dgs6t5Mp~ybo_jj0>;M@VsSfqxDB;6yqvzd%KZ&TmKF1AMdIC
AbN~PV

literal 0
HcmV?d00001

diff --git a/res/Theme Source.dat b/res/Theme Source.dat
index 16cbbd836b3a7cc2ac416f7a6a6178579a41a785..753b84b6f2611a7f87209c3a42f3e9db1dc588a2 100644
GIT binary patch
delta 652
zcmZXRK}Zx)7=Yh<^ZuFH*4SM`Xv3H_goX||mbiOqn?r|^r9%)%tq>7}hYlUPltGIj
zg33dG$aQs%GTbfqV7x3C3=B4k=(x#(dkDG~R0KO>vxSbX@A!TE@B4YLRxs99i~uEs
zoKXnb#K?6me&5d6G-I=jtz>Ne(uQ**Sp7y*_<02WpjiiNAvOv@QCtd%X%<Br)DVWk
z$^|)x(9VRlvWt%y%Aia?f*va7oMvui8$7($#4$Y$x@^gTtL#KdZC+&dgwlsI4|o^8
znung9&_6deMF-{RV`%Y1K2JPp@a>S#zdmj7q4)n6@cH;NC{ms{Oo$j~o#>0|qBp>^
z`^CdzLy&0m1g0))2W0XEFv@T2v$D1X*MhvfN8GdMZA{;yy8QkIs*Kk0$5Hh-dT*`|
zyADX#Q5SwPx{mqh+SRFL?GAIdaHFIR$jY*&cZgLUo`@L=sdJGmoDznqV|JFt(3*#S
zQ4XHRj}8RH<Ryb{;@fo^kGS0X|6QjQ^M_a`_m(2q@s3@=LWLfazxtFdiq;J1xS9u3
z^lw<+1>Hx~)2tlDT!r2hLl;B%p`b=Edy}<_WS4;lIqMcq%@UtZnwa~-dPVqbKn(nj
Oi&DzO+G|MY+x5SDbKVsI

delta 395
zcmX@IQ~tqfc}_+K1_mo;28LhLb7wM|H#)RBFt$1{wK_1jI<RbYV0G!5K4CAb&-4pj
ztUspT5N1}GwvNqW`k8&K9NT(We{fCLS-`F_UBH`-f4ly4)>NkH1y@-i{OSGj%$d^<
z>|^8DZZnHjhmp}`dZ8kdIz;XK*{pLJr^~!TR=fSqTviqqh=F(ZvPMi#Sj3tFF%QiB
zz|N>J{mwjAj_o;%Sy|xbf#kM-SOT;GVjf)W_C3p3c^IcZxCyibA(*j(bq(Y6no1PG
zEvrB(6RMzs+a1<`jGJ?V5m_hCI*_7<n<#=i*0UyXPnOr<n0A;I=(@eEk<)#X7}d8Q
z*v<NciE;b%kHReK?ZD95er6xr`Y)5`YjIA0agse``i;%(m6J8K^tU%`VYg5O0M^5m
ACIA2c

diff --git a/res/Theme.dat b/res/Theme.dat
index f0d371b81c1b4dcfd1ac6dd4c15a678f48ece565..0c27b20f75b491927d1d7dc428367cc9e4a79448 100644
GIT binary patch
delta 16
YcmbR9h;hy%#tpH8jDI%A3GRyr06|O#SpWb4

delta 16
YcmbR9h;hy%#tpH8jK4O=3GRyr06{<pR{#J2

diff --git a/shared/strings.cpp b/shared/strings.cpp
index 12da177..cf96aa3 100644
--- a/shared/strings.cpp
+++ b/shared/strings.cpp
@@ -132,6 +132,7 @@ DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatRate, "Key repeat rate:"
 DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardCaretBlinkRate, "Caret blink rate:");
 DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardTestTextboxIntroduction, "Try your settings in the textbox below:");
 DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardUseSmartQuotes, "Use smart quotes when typing");
+DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardLayout, "Keyboard layout:");
 
 DEFINE_INTERFACE_STRING(DesktopSettingsMouseDoubleClickSpeed, "Double click time:");
 DEFINE_INTERFACE_STRING(DesktopSettingsMouseSpeed, "Cursor movement speed:");
diff --git a/util/build_core.c b/util/build_core.c
index 951b132..ca68504 100644
--- a/util/build_core.c
+++ b/util/build_core.c
@@ -575,6 +575,23 @@ void BuildDesktop(Application *application) {
 		}
 	}
 
+	EsINIState s = {};
+	s.buffer = (char *) LoadFile("res/Keyboard Layouts/index.ini", &s.bytes);
+
+	while (EsINIParse(&s)) {
+		EsINIZeroTerminate(&s);
+
+		if (s.key[0] != ';') {
+			char in[128];
+			char name[128];
+			snprintf(in, sizeof(in), "res/Keyboard Layouts/%s.dat", s.key);
+			snprintf(name, sizeof(name), "Keyboard Layouts/%s.dat", s.key);
+			ADD_BUNDLE_INPUT(strdup(in), strdup(name), 16);
+		}
+	}
+
+	ADD_BUNDLE_INPUT("res/Keyboard Layouts/index.ini", "Keyboard Layouts.ini", 16);
+	ADD_BUNDLE_INPUT("res/Keyboard Layouts/License.txt", "Keyboard Layouts License.txt", 16);
 	ADD_BUNDLE_INPUT("res/Theme.dat", "Theme.dat", 16);
 	ADD_BUNDLE_INPUT("res/elementary Icons.dat", "Icons.dat", 16);
 	ADD_BUNDLE_INPUT("res/elementary Icons License.txt", "Icons License.txt", 16);
diff --git a/util/designer2.cpp b/util/designer2.cpp
index 673d741..3241961 100644
--- a/util/designer2.cpp
+++ b/util/designer2.cpp
@@ -3691,6 +3691,7 @@ int main(int argc, char **argv) {
 	UIWindowRegisterShortcut(window, UI_SHORTCUT(UI_KEYCODE_LETTER('Y'), 1 /* ctrl */, 0, 0, DocumentRedoStep, 0));
 	UIWindowRegisterShortcut(window, UI_SHORTCUT(UI_KEYCODE_LETTER('D'), 1 /* ctrl */, 0, 0, ObjectDuplicateCommand, 0));
 	UIWindowRegisterShortcut(window, UI_SHORTCUT(UI_KEYCODE_FKEY(2), 0, 0, 0, CanvasSwitchView, 0));
+	UIWindowRegisterShortcut(window, UI_SHORTCUT(UI_KEYCODE_FKEY(3), 0, 0, 0, CanvasSwitchSelectorIndex, 0));
 	UIWindowRegisterShortcut(window, UI_SHORTCUT(UI_KEYCODE_DIGIT('1'), 1 /* ctrl */, 0, 0, CanvasZoom100, 0));
 	UIWindowRegisterShortcut(window, UI_SHORTCUT(UI_KEYCODE_DELETE, 0, 0, 0, ObjectDeleteCommand, 0));