Merge remote-tracking branch 'origin/master' into develop

This commit is contained in:
QMK Bot 2022-08-13 16:24:37 +00:00
commit a03849c92c
18 changed files with 2941 additions and 237 deletions

View File

@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
// Note: Several advanced functions referenced in this file (like Tap Dance functions) are defined in /users/gourdo1/gourdo1.c // Note: Many advanced functions referenced in this file are defined in /users/gourdo1/gourdo1.c
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
@ -52,7 +52,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, BELOWENC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, BELOWENC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
CAPSNUM, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, CAPSNUM, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
LSFTCAPSWIN, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
), ),
@ -76,10 +76,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
#ifdef GAME_ENABLE #ifdef GAME_ENABLE
[_FN1] = LAYOUT( [_FN1] = LAYOUT(
EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, KC_SLEP, EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, KC_SLEP,
PRNCONF, TG_CAPS, TG_PAD, TG_ESC, TG_DEL, TG_TDCAP,TG_ENC, TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______, RGB_TOG, PRNCONF, TG_CAPS, TG_PAD, TG_ESC, TG_DEL, TG_TDCAP,TG_ENC, TG_INS,TG_SPCMOD,TG_AUTOCR, _______, RGB_TOD, RGB_TOI, _______, RGB_TOG,
_______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, TG(_GAME),SWAP_L, SWAP_R, QK_BOOT, KC_HOME, _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, TG(_GAME),SWAP_L, SWAP_R, QK_BOOT, KC_HOME,
KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, LOCKPC, _______, _______, _______, KC_END, KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, LOCKPC, _______, _______, _______, KC_END,
_______, RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______, _______, RGB_NITE,_______, _______, _______, QK_BOOT, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______,
_______, WINLOCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI _______, WINLOCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
), ),
@ -95,11 +95,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
#else #else
[_FN1] = LAYOUT( [_FN1] = LAYOUT(
EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, KC_SLEP, EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, KC_SLEP,
PRNCONF, TG_CAPS, TG_PAD, TG_ESC, TG_DEL, TG_TDCAP,TG_ENC, TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______, RGB_TOG, PRNCONF, TG_CAPS, TG_PAD, TG_ESC, TG_DEL, TG_TDCAP,TG_ENC, TG_INS,TG_SPCMOD,TG_AUTOCR, _______, RGB_TOD, RGB_TOI, _______, RGB_TOG,
_______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, KC_PAUS, SWAP_L, SWAP_R, QK_BOOT, KC_HOME, _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, KC_PAUS, SWAP_L, SWAP_R, QK_BOOT, KC_HOME,
KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, LOCKPC, _______, _______, _______, KC_END, KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, LOCKPC, _______, _______, _______, KC_END,
_______, RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______, _______, RGB_NITE,_______, _______, _______, QK_BOOT, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______,
_______, KC_WINLCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI _______, WINLOCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
), ),
#endif //GAME_ENABLE #endif //GAME_ENABLE
@ -125,7 +125,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, _______, _______,
_______, KC_PGUP, KC_UP, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, _______, KC_WH_U, _______, KC_PGUP, KC_UP, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, _______, KC_WH_U,
_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_P1, KC_P2, KC_P3, KC_PAST, _______, KC_PENT, KC_WH_D, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_P1, KC_P2, KC_P3, KC_PAST, _______, KC_PENT, KC_WH_D,
_______, KC_NO, _______, _______, _______, KC_NO, KC_NO, KC_P0, KC_00, KC_PDOT, KC_PSLS, KC_BTN1, KC_MS_U, KC_BTN2, _______, KC_NO, _______, _______, _______, _______, _______, KC_P0, KC_00, KC_PDOT, KC_PSLS, KC_BTN1, KC_MS_U, KC_BTN2,
_______, _______, _______, KC_PENT, _______, _______, KC_BTN3, KC_MS_L, KC_MS_D, KC_MS_R _______, _______, _______, KC_PENT, _______, _______, KC_BTN3, KC_MS_L, KC_MS_D, KC_MS_R
), ),
@ -253,6 +253,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
rgb_matrix_set_color(LED_F12, RGB_RED); rgb_matrix_set_color(LED_F12, RGB_RED);
} }
/*
// System NumLock warning indicator RGB setup // System NumLock warning indicator RGB setup
#ifdef INVERT_NUMLOCK_INDICATOR #ifdef INVERT_NUMLOCK_INDICATOR
if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
@ -271,6 +272,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
rgb_matrix_set_color(LED_FN, RGB_ORANGE2); rgb_matrix_set_color(LED_FN, RGB_ORANGE2);
} }
#endif // INVERT_NUMLOCK_INDICATOR #endif // INVERT_NUMLOCK_INDICATOR
*/
// CapsLock RGB setup // CapsLock RGB setup
if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) { if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) {
@ -348,12 +350,25 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
rgb_matrix_set_color(LED_R8, RGB_RED); rgb_matrix_set_color(LED_R8, RGB_RED);
rgb_matrix_set_color(LED_MINS, RGB_OFFBLUE); rgb_matrix_set_color(LED_MINS, RGB_OFFBLUE);
rgb_matrix_set_color(LED_EQL, RGB_OFFBLUE); rgb_matrix_set_color(LED_EQL, RGB_OFFBLUE);
// Indicator for paddle game enabled in build
#ifdef GAME_ENABLE #ifdef GAME_ENABLE
rgb_matrix_set_color(LED_P, RGB_CHARTREUSE); rgb_matrix_set_color(LED_P, RGB_CHARTREUSE);
#else #else
rgb_matrix_set_color(LED_P, RGB_RED); rgb_matrix_set_color(LED_P, RGB_RED);
#endif // GAME_ENABLE #endif // GAME_ENABLE
// System NumLock warning indicator RGB setup
#ifdef INVERT_NUMLOCK_INDICATOR
if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
rgb_matrix_set_color(LED_N, RGB_ORANGE2);
}
#else
if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON
rgb_matrix_set_color(LED_N, RGB_ORANGE2);
}
#endif // INVERT_NUMLOCK_INDICATOR
//Add RGB statuses for user.config toggles //Add RGB statuses for user.config toggles
if (user_config.rgb_hilite_caps) { if (user_config.rgb_hilite_caps) {
rgb_matrix_set_color(LED_1, RGB_GREEN); rgb_matrix_set_color(LED_1, RGB_GREEN);
@ -395,6 +410,11 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
} else { } else {
rgb_matrix_set_color(LED_8, RGB_PURPLE); rgb_matrix_set_color(LED_8, RGB_PURPLE);
} }
if (user_config.autocorrect) {
rgb_matrix_set_color(LED_9, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_9, RGB_PURPLE);
}
// Add RGB Timeout Indicator -- shows 0 to 139 using F row and num row; larger numbers using 16bit code // Add RGB Timeout Indicator -- shows 0 to 139 using F row and num row; larger numbers using 16bit code
uint16_t timeout_threshold = get_timeout_threshold(); uint16_t timeout_threshold = get_timeout_threshold();
@ -411,6 +431,15 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
// Numpad & Mouse Keys overlay RGB // Numpad & Mouse Keys overlay RGB
case _NUMPADMOUSE: case _NUMPADMOUSE:
#ifdef INVERT_NUMLOCK_INDICATOR
if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
rgb_matrix_set_color(LED_N, RGB_ORANGE2);
}
#else
if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON
rgb_matrix_set_color(LED_N, RGB_ORANGE2);
}
#endif // INVERT_NUMLOCK_INDICATOR
if (user_config.rgb_hilite_numpad) { if (user_config.rgb_hilite_numpad) {
for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_NUMPAD); i++) { for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_NUMPAD); i++) {
rgb_matrix_set_color(LED_LIST_NUMPAD[i], RGB_OFFBLUE); rgb_matrix_set_color(LED_LIST_NUMPAD[i], RGB_OFFBLUE);

View File

@ -1,69 +1,76 @@
# [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro ANSI layout # [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro Keyboard Layouts
This Windows-centric ANSI layout is based on [Jonavin's](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/jonavin) GMMK Pro layout with many additions, fixes, a revamped keymap, persistent user customizations, updated layers, [Tomas Guinan's paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB effects and controls. These Windows-centric layouts are based on Jonavin's GMMK Pro [layout](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/jonavin) with many additions, fixes, a revamped keymap, persistent user customizations, updated layers, Pascal Getreuer's [autocorrect](https://getreuer.info/posts/keyboards/autocorrection/), Tomas Guinan's [paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB controls and effects.
![image](https://raw.githubusercontent.com/gourdo1/media/main/susuwatari.jpg) ![image](https://raw.githubusercontent.com/gourdo1/media/main/susuwatari.jpg)
## Features: * Up-to-date [Changelog](https://github.com/gourdo1/gmmkpro-media/blob/main/changelog.md)
* Latest [ANSI firmware](https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin) download. (Flash with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases))
* Latest [ISO firmware](https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_iso_gourdo1.bin) download. (Flash with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases))
* Printable Keyboard [Cheatsheet](https://github.com/gourdo1/gmmkpro-media/raw/main/GMMK_Pro_Cheatsheet.pdf)
## Features
### Core Functionality ### Core Functionality
* Quick & Easy Customization: Open a text editor and hit [FN]` (tilde key) to view toggle-able features. (added Jun 29, 2022) * Support for both [ANSI](https://keebnews.com/ansi-vs-iso/) and [ISO](https://keebnews.com/ansi-vs-iso/) keyboard layouts.
* [VIA](https://www.caniusevia.com/) support enabled (added Mar 16, 2022) * Quick & Easy Customization: Open a text editor and hit [FN]` (tilde on ANSI; the key left of '1' on ISO layouts) to view toggle-able settings.
* [VIA](https://www.caniusevia.com/) support enabled.
* AutoCorrection: Pascal Getreuer's AutoCorrect code incorporated with 400 word dictionary on words > 4 characters.
* Most [default Glorious shortcuts](https://cdn.shopify.com/s/files/1/0549/2681/files/GMMK_Pro_User_Guide.pdf) enabled * Most [default Glorious shortcuts](https://cdn.shopify.com/s/files/1/0549/2681/files/GMMK_Pro_User_Guide.pdf) enabled
* [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with [FN]R * [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with [FN]R
* 1000Hz polling rate with 5ms debounce time for quick response in games * 1000Hz polling rate with 5ms debounce time for quick response in games.
* Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you? Use cursor keys to move the mouse * Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you? Use cursor keys to move the mouse.
* Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry * Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry.
* Gaming mode ([FN]Win-key) locks out Win-key and double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming keys * Gaming mode ([FN]Win-key) locks out Win-key and double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming keys.
* Caps Word enabled: To capitalize the next word only, press and release left and right shift at the same time. (added Feb 25, 2022) * Caps Word enabled: To capitalize the next word only, press and release left and right shift at the same time.
* Multi-monitor app moving shortcuts: [FN] ],[ (square brackets) to move current app window to next monitor (added Apr 11, 2022) * Multi-monitor app moving shortcuts: [FN] ],[ (square brackets) to move current app window to next monitor.
* Capslock toggled by double tap of Left Shift key or FN + Capslock (RGB green highlighted) * Capslock toggled by double tap of Left Shift key or FN + Capslock (RGB green highlighted).
* Paddle game accessible via [FN]P. Hit [FN]P again or double tap [ESC] to exit (added May 5, 2022) * Paddle game accessible via [FN]P. Hit [FN]P again or double tap [ESC] to exit.
* Single-handed shortcut for Ctrl-Alt-Delete: [FN]/ (added May 14, 2022) * Single-handed shortcut for Ctrl-Alt-Delete: [FN]/
* Single-handed shortcut for WinKey-L (lock Windows): [FN]L (added May 17, 2022) * Single-handed shortcut for WinKey-L (lock Windows): [FN]L
* Domain shortcuts: [FN]. for .com, [FN]O for outlook.com, [FN]Y for yahoo.com, [FN]H for hotmail.com, [FN]G for gmail.com. (added Apr 7, 2022) * Domain shortcuts: [FN]. for .com, [FN]O for outlook.com, [FN]Y for yahoo.com, [FN]H for hotmail.com, [FN]G for gmail.com.
* FN-Backslash for [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md) * [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md) accessible via [FN]Backslash for ANSI and FN(key next to Left Shift) for ISO
* Home key on F13, Del key right of Backspace
* Insert accessible via Shift-Backspace (so shift delete still works in Windows Explorer)
* PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: [FN]F11, [FN]F12, [FN]F13 * PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: [FN]F11, [FN]F12, [FN]F13
* [Colemak](https://colemak.com/) key layout support (Accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple) * [Colemak](https://colemak.com/) key layout support (Accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple)
* Double tap ESC any time to revert to base layer (added Feb 26, 2022) * Double tap ESC any time to revert to base layer.
* RGB backlight effects expanded to include framebuffer effects and reactive keypress modes (updated May 24, 2022) * RGB backlight effects expanded to include framebuffer effects and reactive keypress modes.
* RGB backlight now remembers last color & effect settings after power down (updated May 24, 2022) * RGB backlight now remembers last color & effect settings after power down.
### Quick & Easy Customization ### Quick & Easy Customization
* Below features can be toggled by holding [FN] and pressing the number corresponding to that feature. Changes are saved to EEPROM for persistence. * Below features can be toggled by holding [FN] and pressing the number corresponding to that feature. Changes are saved to EEPROM for persistence.
* Print current settings by opening a text editor and pressing [FN]~ (CAUTION: verbose!) * Print current settings by opening a text editor and pressing [FN]~ (the key left of '1' on ISO layout keyboards)
* Quick view current settings by holding [FN] and viewing RGB under number keys (green means ON, violet means OFF) * Quick view current settings by holding [FN] and viewing RGB under number keys (green means ON, violet means OFF)
#### Toggle-able Settings: #### Toggle-able Settings:
1. CapsLock RGB - highlight under alpha keys 1. CapsLock RGB - Highlight under alpha keys
2. Numpad RGB - highlight under numpad layer keys 2. Numpad RGB - Highlight under numpad layer keys
3. ESC key - Double tap ESC key to go to base layer 3. ESC key - Double tap ESC key to go to base layer
4. Swap DEL and HOME - Default is DEL to the right of BKSPC & HOME is above BKSPC 4. Swap DEL and HOME - Default is DEL to the right of BKSPC & HOME is above BKSPC
5. Capslock function - Toggle between double tap LShift for CapsLock with Numpad on CapsLock key (default) and standard CapsLock 5. Capslock function - Toggle between double tap LShift for CapsLock with Numpad on CapsLock key (default) and standard CapsLock
6. Encoder button - default mutes volume; alternate plays/pauses media 6. Encoder button - Default mutes volume; alternate plays/pauses media
7. Insert function - Toggle between SHIFT-BKSPC and SHIFT-DEL 7. Insert function - Toggle between SHIFT-BKSPC and SHIFT-DEL
8. Modded-Space override - Use standard Space in place of modded-Space functions 8. Modded-Space override - Use standard Space in place of modded-Space functions
9. AutoCorrect - Internal (English) AutoCorrect; default is enabled
0. (ISO layouts only) CapsLock highlights extended alpha keys
### Numpad + Mouse Keys (Capslock key) ### Numpad + Mouse Keys (Capslock key)
* Overlay numpad + [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) are accessed through Capslock key hold (temp) or double press (locked) with RGB highlighting * Overlay numpad + [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) are accessed through Capslock key hold (temp) or double press (locked) with RGB highlighting
* Numpad uses Space-bar as Enter for rapid number entry (added May 17, 2022) * Numpad uses Space-bar as Enter for rapid number entry.
* This layer disables much of the keyboard, except X/C/V for cut/copy/paste, WASD for cursor, Q/E for PgUp/PgDn, cursor keys become mouse keys, surrounding keys become mouse buttons and all number keys become numpad versions (so Alt char codes work regardless of which set you use) * This layer disables much of the keyboard, except X/C/V for cut/copy/paste, WASD for cursor, Q/E for PgUp/PgDn, cursor keys become mouse keys, surrounding keys become mouse buttons and all number keys become numpad versions (so Alt char codes work regardless of which set you use)
* FN and N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output ([FN]N to toggle) * FN and N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output ([FN]N to toggle)
* Double zero on comma key. * Double zero on comma key.
* [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard. (added Mar 15, 2022) * [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard.
* Mouse controls are: Cursor keys = move mouse; RShift = button1, End = button2, RCtrl = button3, PgUp/PgDn = Scroll wheel * Mouse controls are: Cursor keys = move mouse; RShift = button1, End = button2, RCtrl = button3, PgUp/PgDn = Scroll wheel
* Mouse Keys can also be accessed as a standalone layer by Left Shift-turning the Encoder until the cursor keys light up green * Mouse Keys can also be accessed as a standalone layer by Left Shift-turning the Encoder until the cursor keys light up green
### Encoder Functionality ### Encoder Functionality
* Default knob turn changes volume; button press toggles mute * Default knob turn changes volume; button press toggles mute
* Exponential encoder - quick repeated volume up doubles increase; quick repeated volume down triples decrease (added Feb 17, 2022) * Exponential encoder: quick repeated volume up doubles increase; quick repeated volume down triples decrease.
* FN + knob turn changes RGB idle timeout * FN + knob turn changes RGB idle timeout
* FN + knob push puts PC to Sleep (Added May 14, 2022) * FN + knob push puts PC to Sleep
* holding Left Shift changes layers * holding Left Shift changes layers
* holding Right Shift navigates page up/down * holding Right Shift navigates page up/down
* holding Left Ctrl navigates prev/next word * holding Left Ctrl navigates prev/next word
@ -86,44 +93,24 @@ This Windows-centric ANSI layout is based on [Jonavin's](https://github.com/qmk/
* RGB backlight effect speed: [FN]left/right * RGB backlight effect speed: [FN]left/right
* RGB backlight hue cycle: [FN]A/D * RGB backlight hue cycle: [FN]A/D
* RGB backlight brightness: [FN]W/S * RGB backlight brightness: [FN]W/S
* RGB backlight saturation: [FN]Q/E (added Feb 4, 2022) * RGB backlight saturation: [FN]Q/E
* RGB backlight night mode toggle: [FN]Z (indicators still work) * RGB backlight night mode toggle: [FN]Z (indicators still work)
* RGB backlight timeout: [FN]Encoder or "-" and "=" (default 15 minutes) (updated June 28, 2022) * RGB backlight timeout: [FN]Encoder or "-" and "=" (default 15 minutes)
* F-key row indicator lights (cyan and blue) in FN layer display the current backlight timeout in minutes * F-key row indicator lights (cyan and blue) in FN layer display the current backlight timeout in minutes
* [FN]Z to turn off RGB backlighting (indicator lights still work); press again to toggle * [FN]Z to turn off RGB backlighting (indicator lights still work); press again to toggle
* Left side RGB indicators in order from top: System NumLock off (orange), Scroll Lock (red), Numpad (blue), Capslock (green). * Left side RGB indicators in order from top: Scroll Lock (red), Numpad (blue), Capslock (green).
### Advanced Controls ### Advanced Controls
* [FN]\ to get to bootloader mode * [FN]\ or [FN]B to get to bootloader mode (use key next to Left Shift on ISO)
* [FN][ESC] to clear EEPROM (added Apr 11, 2022) * [FN][ESC] to clear EEPROM
* [FN]R to toggle N-key Rollover (added Apr 11, 2022) * [FN]R to toggle N-key Rollover
* [FN]/ is single-handed shortcut to Ctrl-Alt-Delete (added May 14, 2022) * [FN]N to toggle system numlock
* [FN]L is single-handed shortcut to Win-L (lock Windows) (added May 17, 2022) * [FN]/ is single-handed shortcut to Ctrl-Alt-Delete
* [FN][Encoder press] to sleep Windows PC (added May 14, 2022) * [FN]L is single-handed shortcut to Win-L (lock Windows)
* [FN][Encoder press] to sleep Windows PC
Link to latest firmware binary: https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin ## Layer Diagrams (ANSI)
Link to cheatsheet: https://github.com/gourdo1/gmmkpro-media/raw/main/GMMK_Pro_Cheatsheet.pdf
## rules.mk Options
STARTUP_NUMLOCK_ON = yes - Turns on NUMLOCK by default
ENCODER_DEFAULTACTIONS_ENABLE = yes - Enabled default encoder functions
TD_LSFT_CAPSLOCK_ENABLE = yes - This will enable double tap on Left Shift to toggle CAPSLOCK when using KC_LSFTCAPS
IDLE_TIMEOUT_ENABLE = yes - Enables Timer functionality; for RGB idle timeouts that can be changed dynamically
INVERT_NUMLOCK_INDICATOR - Inverts the Numlock indicator, LED is on when numlock is off -- numlock interferes with overlay numpad, so should be off when numpad layer is active unless you have an external numpad.
COLEMAK_LAYER_ENABLE = yes - Enables optional 5th layer for COLEMAK layout. Use Shift + encoder to enter 5th layer.
GAME_ENABLE ?= yes - Enables Paddle Game
## Layer Diagrams
### Base layer ### Base layer
![image](https://raw.githubusercontent.com/gourdo1/gmmkpro-media/main/base.png) ![image](https://raw.githubusercontent.com/gourdo1/gmmkpro-media/main/base.png)

View File

@ -5,7 +5,7 @@ BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
VIA_ENABLE = yes VIA_ENABLE = yes
MOUSEKEY_ENABLE = yes MOUSEKEY_ENABLE = yes
TAP_DANCE_ENABLE = yes TAP_DANCE_ENABLE = no
CAPS_WORD_ENABLE = yes # Enable built-in Caps Word functionality CAPS_WORD_ENABLE = yes # Enable built-in Caps Word functionality
IDLE_TIMEOUT_ENABLE = yes IDLE_TIMEOUT_ENABLE = yes
STARTUP_NUMLOCK_ON = yes STARTUP_NUMLOCK_ON = yes

View File

@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
// Note: Several advanced functions referenced in this file (like Tap Dance functions) are defined in /users/gourdo1/gourdo1.c // Note: Many advanced functions referenced in this file are defined in /users/gourdo1/gourdo1.c
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
@ -53,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, BELOWENC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, BELOWENC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP,
CAPSNUM, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN, CAPSNUM, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
LSFTCAPSWIN,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
), ),
@ -68,7 +68,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |---------+------+------+------+------+------+------+------+------+------+------+------+------+ ++------| * |---------+------+------+------+------+------+------+------+------+------+------+------+------+ ++------|
* | Capslock |RGBHUD|RGBVAD|RGBHUI| ____|GMAIL |HTMAIL| ____ | ____ | ____ | ____ | ____ | ___ | ____ || End | * | Capslock |RGBHUD|RGBVAD|RGBHUI| ____|GMAIL |HTMAIL| ____ | ____ | ____ | ____ | ____ | ___ | ____ || End |
* |------------+------+------+------+-----+------+------+------+------+------+------+------|----+========+------| * |------------+------+------+------+-----+------+------+------+------+------+------+------|----+========+------|
* | ____ |RESET |RGBNIT| ____ | ____ | ____ | ____ |NumLk | ____ | ____ |DOTCOM| CAD | ______ ||RGBMOD|| ____ | * | ____ |QK_BOOT|RGBNIT| ____ | ____ | ____ | ____ |NumLk | ____ | ____ |DOTCOM| CAD | ______ ||RGBMOD|| ____ |
* |--------------+------+------+------+------+------+------+------+------+------+------+--+=====++------++======| * |--------------+------+------+------+------+------+------+------+------+------+------+--+=====++------++======|
* | ____ | WinKyLk | ____ | _____ | ____ | ____ | ____ ||RGBSPD|RGBRMD|RGBSPI| * | ____ | WinKyLk | ____ | _____ | ____ | ____ | ____ ||RGBSPD|RGBRMD|RGBSPI|
* `------------------------------------------------------------------------------------------------------------' * `------------------------------------------------------------------------------------------------------------'
@ -77,10 +77,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
#ifdef GAME_ENABLE #ifdef GAME_ENABLE
[_FN1] = LAYOUT( [_FN1] = LAYOUT(
EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, KC_SLEP, EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, KC_SLEP,
PRNCONF, TG_CAPS, TG_PAD, TG_ESC, TG_DEL, TG_TDCAP,TG_ENC, TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______, RGB_TOG, PRNCONF, TG_CAPS, TG_PAD, TG_ESC, TG_DEL, TG_TDCAP,TG_ENC, TG_INS,TG_SPCMOD,TG_AUTOCR,TG_ENGCAP,RGB_TOD,RGB_TOI, _______, RGB_TOG,
_______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, TG(_GAME),SWAP_L, SWAP_R, KC_HOME, _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, TG(_GAME),SWAP_L, SWAP_R, KC_HOME,
KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, LOCKPC, _______, _______, _______, _______, KC_END, KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, LOCKPC, _______, _______, _______, _______, KC_END,
_______, RESET, RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______, _______, QK_BOOT, RGB_NITE,_______, _______, _______, QK_BOOT, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______,
_______, WINLOCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI _______, WINLOCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
), ),
@ -96,11 +96,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
#else #else
[_FN1] = LAYOUT( [_FN1] = LAYOUT(
EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, KC_SLEP, EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, KC_SLEP,
PRNCONF, TG_CAPS, TG_PAD, TG_ESC, TG_DEL, TG_TDCAP,TG_ENC, TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______, RGB_TOG, PRNCONF, TG_CAPS, TG_PAD, TG_ESC, TG_DEL, TG_TDCAP,TG_ENC, TG_INS,TG_SPCMOD,TG_AUTOCR,TG_ENGCAP,RGB_TOD,RGB_TOI, _______, RGB_TOG,
_______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, KC_PAUS, SWAP_L, SWAP_R, KC_HOME, _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, KC_PAUS, SWAP_L, SWAP_R, KC_HOME,
KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, LOCKPC, _______, _______, _______, _______, KC_END, KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, LOCKPC, _______, _______, _______, _______, KC_END,
_______, RESET, RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______, _______, QK_BOOT, RGB_NITE,_______, _______, _______, QK_BOOT, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______,
_______, KC_WINLCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI _______, WINLOCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
), ),
#endif //GAME_ENABLE #endif //GAME_ENABLE
@ -126,7 +126,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, _______, _______,
_______, KC_PGUP, KC_UP, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, KC_WH_U, _______, KC_PGUP, KC_UP, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, KC_WH_U,
_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_P1, KC_P2, KC_P3, KC_PAST, _______, _______, KC_PENT, KC_WH_D, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_P1, KC_P2, KC_P3, KC_PAST, _______, _______, KC_PENT, KC_WH_D,
_______, _______, KC_NO, _______, _______, _______, KC_NO, KC_NO, KC_P0, KC_00, KC_PDOT, KC_PSLS, KC_BTN1, KC_MS_U, KC_BTN2, _______, _______, KC_NO, _______, _______, _______, _______, _______, KC_P0, KC_00, KC_PDOT, KC_PSLS, KC_BTN1, KC_MS_U, KC_BTN2,
_______, _______, _______, KC_PENT, _______, _______, KC_BTN3, KC_MS_L, KC_MS_D, KC_MS_R _______, _______, _______, KC_PENT, _______, _______, KC_BTN3, KC_MS_L, KC_MS_D, KC_MS_R
), ),
@ -254,6 +254,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
rgb_matrix_set_color(LED_F12, RGB_RED); rgb_matrix_set_color(LED_F12, RGB_RED);
} }
/*
// System NumLock warning indicator RGB setup // System NumLock warning indicator RGB setup
#ifdef INVERT_NUMLOCK_INDICATOR #ifdef INVERT_NUMLOCK_INDICATOR
if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
@ -272,12 +273,20 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
rgb_matrix_set_color(LED_FN, RGB_ORANGE2); rgb_matrix_set_color(LED_FN, RGB_ORANGE2);
} }
#endif // INVERT_NUMLOCK_INDICATOR #endif // INVERT_NUMLOCK_INDICATOR
*/
// CapsLock RGB setup // CapsLock RGB setup
if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) { if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) {
if (user_config.rgb_hilite_caps) { if (user_config.rgb_hilite_caps) {
for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS); i++) { if (user_config.rgb_english_caps) {
rgb_matrix_set_color(LED_LIST_LETTERS[i], RGB_CHARTREUSE); for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS); i++) {
rgb_matrix_set_color(LED_LIST_LETTERS[i], RGB_CHARTREUSE);
}
}
else {
for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS_DE); i++) {
rgb_matrix_set_color(LED_LIST_LETTERS_DE[i], RGB_CHARTREUSE);
}
} }
rgb_matrix_set_color(LED_L7, RGB_CHARTREUSE); rgb_matrix_set_color(LED_L7, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_L8, RGB_CHARTREUSE); rgb_matrix_set_color(LED_L8, RGB_CHARTREUSE);
@ -349,12 +358,25 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
rgb_matrix_set_color(LED_R8, RGB_RED); rgb_matrix_set_color(LED_R8, RGB_RED);
rgb_matrix_set_color(LED_MINS, RGB_OFFBLUE); rgb_matrix_set_color(LED_MINS, RGB_OFFBLUE);
rgb_matrix_set_color(LED_EQL, RGB_OFFBLUE); rgb_matrix_set_color(LED_EQL, RGB_OFFBLUE);
// Indicator for paddle game enabled in build
#ifdef GAME_ENABLE #ifdef GAME_ENABLE
rgb_matrix_set_color(LED_P, RGB_CHARTREUSE); rgb_matrix_set_color(LED_P, RGB_CHARTREUSE);
#else #else
rgb_matrix_set_color(LED_P, RGB_RED); rgb_matrix_set_color(LED_P, RGB_RED);
#endif // GAME_ENABLE #endif // GAME_ENABLE
// System NumLock warning indicator RGB setup
#ifdef INVERT_NUMLOCK_INDICATOR
if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
rgb_matrix_set_color(LED_N, RGB_ORANGE2);
}
#else
if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON
rgb_matrix_set_color(LED_N, RGB_ORANGE2);
}
#endif // INVERT_NUMLOCK_INDICATOR
//Add RGB statuses for user.config toggles //Add RGB statuses for user.config toggles
if (user_config.rgb_hilite_caps) { if (user_config.rgb_hilite_caps) {
rgb_matrix_set_color(LED_1, RGB_GREEN); rgb_matrix_set_color(LED_1, RGB_GREEN);
@ -396,6 +418,16 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
} else { } else {
rgb_matrix_set_color(LED_8, RGB_PURPLE); rgb_matrix_set_color(LED_8, RGB_PURPLE);
} }
if (user_config.autocorrect) {
rgb_matrix_set_color(LED_9, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_9, RGB_PURPLE);
}
if (user_config.rgb_english_caps) {
rgb_matrix_set_color(LED_0, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_0, RGB_PURPLE);
}
// Add RGB Timeout Indicator -- shows 0 to 139 using F row and num row; larger numbers using 16bit code // Add RGB Timeout Indicator -- shows 0 to 139 using F row and num row; larger numbers using 16bit code
uint16_t timeout_threshold = get_timeout_threshold(); uint16_t timeout_threshold = get_timeout_threshold();
@ -412,6 +444,15 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
// Numpad & Mouse Keys overlay RGB // Numpad & Mouse Keys overlay RGB
case _NUMPADMOUSE: case _NUMPADMOUSE:
#ifdef INVERT_NUMLOCK_INDICATOR
if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
rgb_matrix_set_color(LED_N, RGB_ORANGE2);
}
#else
if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON
rgb_matrix_set_color(LED_N, RGB_ORANGE2);
}
#endif // INVERT_NUMLOCK_INDICATOR
if (user_config.rgb_hilite_numpad) { if (user_config.rgb_hilite_numpad) {
for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_NUMPAD); i++) { for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_NUMPAD); i++) {
rgb_matrix_set_color(LED_LIST_NUMPAD[i], RGB_OFFBLUE); rgb_matrix_set_color(LED_LIST_NUMPAD[i], RGB_OFFBLUE);

View File

@ -1,54 +1,76 @@
# [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro ISO layout # [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro Keyboard Layouts
This Windows-centric ISO layout is based on [Jonavin's](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/iso/keymaps/jonavin) GMMK Pro layout with several additions, fixes, a tweaked keymap, updated layers, [Tomas Guinan's paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB controls. These Windows-centric layouts are based on Jonavin's GMMK Pro [layout](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/jonavin) with many additions, fixes, a revamped keymap, persistent user customizations, updated layers, Pascal Getreuer's [autocorrect](https://getreuer.info/posts/keyboards/autocorrection/), Tomas Guinan's [paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB controls and effects.
![image](https://raw.githubusercontent.com/gourdo1/media/main/susuwatari.jpg) ![image](https://raw.githubusercontent.com/gourdo1/media/main/susuwatari.jpg)
## Features: * Up-to-date [Changelog](https://github.com/gourdo1/gmmkpro-media/blob/main/changelog.md)
* Latest [ANSI firmware](https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin) download. (Flash with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases))
* Latest [ISO firmware](https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_iso_gourdo1.bin) download. (Flash with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases))
* Printable Keyboard [Cheatsheet](https://github.com/gourdo1/gmmkpro-media/raw/main/GMMK_Pro_Cheatsheet.pdf)
## Features
### Core Functionality ### Core Functionality
* ISO layout (added July xx, 2022) * Support for both [ANSI](https://keebnews.com/ansi-vs-iso/) and [ISO](https://keebnews.com/ansi-vs-iso/) keyboard layouts.
* [VIA](https://www.caniusevia.com/) support enabled (added Mar 16, 2022) * Quick & Easy Customization: Open a text editor and hit [FN]` (tilde on ANSI; the key left of '1' on ISO layouts) to view toggle-able settings.
* [VIA](https://www.caniusevia.com/) support enabled.
* AutoCorrection: Pascal Getreuer's AutoCorrect code incorporated with 400 word dictionary on words > 4 characters.
* Most [default Glorious shortcuts](https://cdn.shopify.com/s/files/1/0549/2681/files/GMMK_Pro_User_Guide.pdf) enabled * Most [default Glorious shortcuts](https://cdn.shopify.com/s/files/1/0549/2681/files/GMMK_Pro_User_Guide.pdf) enabled
* [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with Fn+R * [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with [FN]R
* 1000Hz polling rate with 5ms debounce time for quick response in games * 1000Hz polling rate with 5ms debounce time for quick response in games.
* Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you on the road? Use cursor keys to move the mouse. * Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you? Use cursor keys to move the mouse.
* Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry * Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry.
* Gaming mode (Fn+Win-key) locks out Win-key as well as double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming related keys * Gaming mode ([FN]Win-key) locks out Win-key and double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming keys.
* [Caps Word](https://getreuer.info/posts/keyboards/caps-word/index.html) enabled: To capitalize the next word only, press and release both left and right shift keys at the same time. (added Feb 25, 2022) * Caps Word enabled: To capitalize the next word only, press and release left and right shift at the same time.
* Multi-monitor app moving shortcuts: Fn+[,] (square brackets) to move current app window to next monitor (added Apr 11, 2022) * Multi-monitor app moving shortcuts: [FN] ],[ (square brackets) to move current app window to next monitor.
* Capslock toggled by double tap of Left Shift key or Fn + Capslock (RGB green highlighted) * Capslock toggled by double tap of Left Shift key or FN + Capslock (RGB green highlighted).
* Paddle game accessible via Fn+P; Hit Fn+P again or double tap ESC to exit (added May 5, 2022) * Paddle game accessible via [FN]P. Hit [FN]P again or double tap [ESC] to exit.
* Single-handed shortcut for Ctrl-Alt-Delete: Fn+/ (added May 14, 2022) * Single-handed shortcut for Ctrl-Alt-Delete: [FN]/
* Single-handed shortcut for Win-L (lock Windows): Fn+L (added May 17, 2022) * Single-handed shortcut for WinKey-L (lock Windows): [FN]L
* Domain shortcuts: Fn+.=".com", Fn+O="outlook.com", Fn+Y="yahoo.com", Fn+H="hotmail.com", Fn+G="gmail.com". (added Apr 7, 2022) * Domain shortcuts: [FN]. for .com, [FN]O for outlook.com, [FN]Y for yahoo.com, [FN]H for hotmail.com, [FN]G for gmail.com.
* Fn-Backslash for [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md) * [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md) accessible via [FN]Backslash for ANSI and FN(key next to Left Shift) for ISO
* Home key on F13, Del key right of Backspace * PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: [FN]F11, [FN]F12, [FN]F13
* Insert accessible via Shift-Backspace (so shift delete still works in Windows Explorer) * [Colemak](https://colemak.com/) key layout support (Accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple)
* PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: Fn+F11, Fn+F12, Fn+F13 * Double tap ESC any time to revert to base layer.
* [Colemak](https://colemak.com/) key layout support (Layer accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple) * RGB backlight effects expanded to include framebuffer effects and reactive keypress modes.
* Double tap ESC any time to revert to base layer (added Feb 26, 2022) * RGB backlight now remembers last color & effect settings after power down.
* RGB backlight effects expanded to include framebuffer effects and reactive keypress modes (updated May 24, 2022)
* RGB backlight now remembers last color & effect settings after power down (updated May 24, 2022) ### Quick & Easy Customization
* Below features can be toggled by holding [FN] and pressing the number corresponding to that feature. Changes are saved to EEPROM for persistence.
* Print current settings by opening a text editor and pressing [FN]~ (the key left of '1' on ISO layout keyboards)
* Quick view current settings by holding [FN] and viewing RGB under number keys (green means ON, violet means OFF)
#### Toggle-able Settings:
1. CapsLock RGB - Highlight under alpha keys
2. Numpad RGB - Highlight under numpad layer keys
3. ESC key - Double tap ESC key to go to base layer
4. Swap DEL and HOME - Default is DEL to the right of BKSPC & HOME is above BKSPC
5. Capslock function - Toggle between double tap LShift for CapsLock with Numpad on CapsLock key (default) and standard CapsLock
6. Encoder button - Default mutes volume; alternate plays/pauses media
7. Insert function - Toggle between SHIFT-BKSPC and SHIFT-DEL
8. Modded-Space override - Use standard Space in place of modded-Space functions
9. AutoCorrect - Internal (English) AutoCorrect; default is enabled
0. (ISO layouts only) CapsLock highlights extended alpha keys
### Numpad + Mouse Keys (Capslock key) ### Numpad + Mouse Keys (Capslock key)
* Overlay numpad + [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) are accessed through Capslock key hold (temp) or double press (locked) with RGB highlighting * Overlay numpad + [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) are accessed through Capslock key hold (temp) or double press (locked) with RGB highlighting
* Numpad uses Space-bar as Enter for rapid number entry (added May 17, 2022) * Numpad uses Space-bar as Enter for rapid number entry.
* This layer disables much of the keyboard, except X/C/V for cut/copy/paste, WASD for cursor, Q/E for PgUp/PgDn, cursor keys become mouse keys, surrounding keys become mouse buttons and all number keys become numpad versions (so Alt char codes work regardless of which set you use) * This layer disables much of the keyboard, except X/C/V for cut/copy/paste, WASD for cursor, Q/E for PgUp/PgDn, cursor keys become mouse keys, surrounding keys become mouse buttons and all number keys become numpad versions (so Alt char codes work regardless of which set you use)
* Fn and N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output (Fn+N to toggle) * FN and N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output ([FN]N to toggle)
* Double zero on comma key. * Double zero on comma key.
* [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard. (added Mar 15, 2022) * [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard.
* Mouse controls are: Cursor keys = move mouse; RShift = button1, End = button2, RCtrl = button3, PgUp/PgDn = Scroll wheel * Mouse controls are: Cursor keys = move mouse; RShift = button1, End = button2, RCtrl = button3, PgUp/PgDn = Scroll wheel
* Mouse Keys can also be accessed as a standalone layer by Left Shift-turning the Encoder until the cursor keys light up green * Mouse Keys can also be accessed as a standalone layer by Left Shift-turning the Encoder until the cursor keys light up green
### Encoder Functionality ### Encoder Functionality
* Default knob turn changes volume; button press toggles mute * Default knob turn changes volume; button press toggles mute
* Exponential encoder - quick repeated volume up doubles increase; quick repeated volume down triples decrease (added Feb 17, 2022) * Exponential encoder: quick repeated volume up doubles increase; quick repeated volume down triples decrease.
* Fn + knob turn changes RGB idle timeout * FN + knob turn changes RGB idle timeout
* Fn + knob push puts PC to Sleep (Added May 14, 2022) * FN + knob push puts PC to Sleep
* holding Left Shift changes layers * holding Left Shift changes layers
* holding Right Shift navigates page up/down * holding Right Shift navigates page up/down
* holding Left Ctrl navigates prev/next word * holding Left Ctrl navigates prev/next word
@ -58,65 +80,45 @@ This Windows-centric ISO layout is based on [Jonavin's](https://github.com/qmk/q
### Paddle Game ### Paddle Game
* Based on [Tomas Guinan's excellent GMMK Pro paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) * Based on [Tomas Guinan's excellent GMMK Pro paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame)
* Paddle Game playable by pressing Fn+P (P lights up green in Fn layer if game is enabled in firmware, otherwise it lights up red) * Paddle Game playable by pressing [FN]P (P lights up green in FN layer if game is enabled in firmware, otherwise it lights up red)
* Use rotary encoder to control paddle * Use rotary encoder to control paddle
* Contains 12 levels, indicated by blue LED on F-key row * Contains 12 levels, indicated by blue LED on F-key row
* Player has 4 lives, indicated by nav cluster * Player has 4 lives, indicated by nav cluster
* Deflect white balls while avoiding red ones * Deflect white balls while avoiding red ones
* Use Fn+P, double tap ESC or otherwise change layer to quit game * Use [FN]P, double tap ESC or otherwise change layer to quit game
### Global RGB Controls ### Global RGB Controls
* RGB backlight lighting effect: Fn+up/down * RGB backlight lighting effect: [FN]up/down
* RGB backlight effect speed: Fn+left/right * RGB backlight effect speed: [FN]left/right
* RGB backlight hue cycle: Fn+A/D * RGB backlight hue cycle: [FN]A/D
* RGB backlight brightness: Fn+W/S * RGB backlight brightness: [FN]W/S
* RGB backlight saturation: Fn+Q/E (added Feb 4, 2022) * RGB backlight saturation: [FN]Q/E
* RGB backlight night mode toggle: Fn+Z (indicators still work) * RGB backlight night mode toggle: [FN]Z (indicators still work)
* RGB backlight timeout: Fn+Encoder or "-" and "=" (default 15 minutes) (updated Apr 7, 2022) * RGB backlight timeout: [FN]Encoder or "-" and "=" (default 15 minutes)
* indicators in Fn layer using RGB in F-key and number rows to show the current timeout in minutes * F-key row indicator lights (cyan and blue) in FN layer display the current backlight timeout in minutes
* Fn+Z to turn off RGB backlighting (indicator lights still work); press again to toggle * [FN]Z to turn off RGB backlighting (indicator lights still work); press again to toggle
* RGB indicators on left side LEDs in order from top: System NumLock off (orange), Scroll Lock (red), Numpad (blue), Capslock (green). * Left side RGB indicators in order from top: Scroll Lock (red), Numpad (blue), Capslock (green).
### Advanced Controls ### Advanced Controls
* Fn+\ to get to bootloader mode * [FN]\ or [FN]B to get to bootloader mode (use key next to Left Shift on ISO)
* Fn+[ESC] to clear EEPROM (then unplug and re-plug) (added Apr 11, 2022) * [FN][ESC] to clear EEPROM
* Fn+R to toggle N-key Rollover (added Apr 11, 2022) * [FN]R to toggle N-key Rollover
* Fn+/ is single-handed shortcut to Ctrl-Alt-Delete (added May 14, 2022) * [FN]N to toggle system numlock
* Fn+L is single-handed shortcut to Win-L (lock Windows) (added May 17, 2022) * [FN]/ is single-handed shortcut to Ctrl-Alt-Delete
* Fn+[Encoder press] to sleep Windows PC (added May 14, 2022) * [FN]L is single-handed shortcut to Win-L (lock Windows)
* [FN][Encoder press] to sleep Windows PC
Link to latest firmware binary: https://github.com/gourdo1/media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin ## Layer Diagrams (ANSI)
Link to cheatsheet: https://github.com/gourdo1/media/raw/main/GMMK_Pro_Cheatsheet.pdf
## rules.mk Options
STARTUP_NUMLOCK_ON = yes - Turns on NUMLOCK by default
ENCODER_DEFAULTACTIONS_ENABLE = yes - Enabled default encoder functions
TD_LSFT_CAPSLOCK_ENABLE = yes - This will enable double tap on Left Shift to toggle CAPSLOCK when using KC_LSFTCAPS
IDLE_TIMEOUT_ENABLE = yes - Enables Timer functionality; for RGB idle timeouts that can be changed dynamically
INVERT_NUMLOCK_INDICATOR - Inverts the Numlock indicator, LED is on when numlock is off -- numlock interferes with overlay numpad, so should be off when numpad layer is active unless you have an external numpad.
COLEMAK_LAYER_ENABLE = yes - Enables optional 5th layer for COLEMAK layout. Use Shift + encoder to enter 5th layer.
GAME_ENABLE ?= yes - Enables Paddle Game
## Layer Diagrams
### Base layer ### Base layer
![image](https://raw.githubusercontent.com/gourdo1/media/main/base.png) ![image](https://raw.githubusercontent.com/gourdo1/gmmkpro-media/main/base.png)
### Fn Layer ### FN Layer
![image](https://raw.githubusercontent.com/gourdo1/media/main/fn1.png) ![image](https://raw.githubusercontent.com/gourdo1/gmmkpro-media/main/fn1.png)
### Layer 2 (Numpad) ### Layer 2 (Numpad)
![image](https://raw.githubusercontent.com/gourdo1/media/main/numpad.png) ![image](https://raw.githubusercontent.com/gourdo1/gmmkpro-media/main/numpad.png)
### COLEMAK layer ### COLEMAK layer
![image](https://user-images.githubusercontent.com/71780717/131235050-980d2f54-2d23-4ae8-a83f-9fcdbe60d6cb.png) ![image](https://user-images.githubusercontent.com/71780717/131235050-980d2f54-2d23-4ae8-a83f-9fcdbe60d6cb.png)

View File

@ -200,16 +200,6 @@ const uint8_t LED_LIST_NUMROW[] = {
}; };
const uint8_t LED_LIST_LETTERS[] = { const uint8_t LED_LIST_LETTERS[] = {
/* LED_1,
LED_2,
LED_3,
LED_4,
LED_5,
LED_6,
LED_7,
LED_8,
LED_9,
LED_0, */
LED_Q, LED_Q,
LED_W, LED_W,
LED_E, LED_E,
@ -238,6 +228,38 @@ const uint8_t LED_LIST_LETTERS[] = {
LED_M LED_M
}; };
const uint8_t LED_LIST_LETTERS_DE[] = {
LED_Q,
LED_W,
LED_E,
LED_R,
LED_T,
LED_Y,
LED_U,
LED_I,
LED_O,
LED_P,
LED_A,
LED_S,
LED_D,
LED_F,
LED_G,
LED_H,
LED_J,
LED_K,
LED_L,
LED_Z,
LED_X,
LED_C,
LED_V,
LED_B,
LED_N,
LED_M,
LED_SCLN,
LED_LBRC,
LED_QUOT
};
const uint8_t LED_LIST_NUMPAD[] = { const uint8_t LED_LIST_NUMPAD[] = {
LED_1, LED_1,
LED_2, LED_2,

View File

@ -4,7 +4,7 @@ COMMAND_ENABLE = no
MOUSEKEY_ENABLE = yes MOUSEKEY_ENABLE = yes
VIA_ENABLE = yes VIA_ENABLE = yes
TAP_DANCE_ENABLE = yes TAP_DANCE_ENABLE = no
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
CAPS_WORD_ENABLE = yes # Enable built-in Caps Word functionality CAPS_WORD_ENABLE = yes # Enable built-in Caps Word functionality

View File

@ -0,0 +1,182 @@
// Copyright 2021-2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
// For full documentation, see
// https://getreuer.info/posts/keyboards/autocorrection
#include "autocorrection.h"
#include <string.h>
#include "autocorrection_data.h"
#if AUTOCORRECTION_MIN_LENGTH < 4
// Odd output or hard locks on the board have been observed when the min typo
// length is 3 or lower (https://github.com/getreuer/qmk-keymap/issues/2).
// Additionally, autocorrection entries for short typos are more likely to false
// trigger, so it is suggested that typos be at least 5 characters.
#error "Min typo length is less than 4. Autocorrection may behave poorly."
#endif
bool process_autocorrection(uint16_t keycode, keyrecord_t* record) {
if (user_config.autocorrect) {
static uint8_t typo_buffer[AUTOCORRECTION_MAX_LENGTH] = {0};
static uint8_t typo_buffer_size = 0;
// Ignore key release; we only process key presses.
if (!record->event.pressed) { return true; }
#ifndef NO_ACTION_ONESHOT
const uint8_t mods = get_mods() | get_oneshot_mods();
#else
const uint8_t mods = get_mods();
#endif // NO_ACTION_ONESHOT
// Disable autocorrection while a mod other than shift is active.
if ((mods & ~MOD_MASK_SHIFT) != 0) {
typo_buffer_size = 0;
return true;
}
// The following switch cases address various kinds of keycodes. This logic is
// split over two switches rather than merged into one. The first switch may
// extract a basic keycode which is then further handled by the second switch,
// e.g. a layer-tap key with Caps Lock `LT(layer, KC_CAPS)`.
switch (keycode) {
#ifndef NO_ACTION_TAPPING
case QK_MOD_TAP ... QK_MOD_TAP_MAX: // Tap-hold keys.
#ifndef NO_ACTION_LAYER
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
#endif // NO_ACTION_LAYER
// Ignore when tap-hold keys are held.
if (record->tap.count == 0) { return true; }
// Otherwise when tapped, get the basic keycode.
// Fallthrough intended.
#endif // NO_ACTION_TAPPING
// Handle shifted keys, e.g. symbols like KC_EXLM = S(KC_1).
case QK_LSFT ... QK_LSFT + 255:
case QK_RSFT ... QK_RSFT + 255:
keycode &= 0xff; // Get the basic keycode.
break;
// NOTE: Space Cadet keys expose no info to check whether they are being
// tapped vs. held. This makes autocorrection ambiguous, e.g. KC_LCPO might
// be '(', which we would treat as a word break, or it might be shift, which
// we would treat as having no effect. To behave cautiously, we allow Space
// Cadet keycodes to fall to the logic below and clear autocorrection state.
}
switch (keycode) {
// Ignore shifts, Caps Lock, one-shot mods, and layer switch keys.
case KC_NO:
case KC_LSFT:
case KC_RSFT:
case KC_CAPS:
case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX:
case QK_TO ... QK_TO_MAX:
case QK_MOMENTARY ... QK_MOMENTARY_MAX:
case QK_DEF_LAYER ... QK_DEF_LAYER_MAX:
case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX:
case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:
case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX:
case QK_LAYER_MOD ... QK_LAYER_MOD_MAX:
return true; // Ignore these keys.
}
if (keycode == KC_QUOT) {
// Treat " (shifted ') as a word boundary.
if ((mods & MOD_MASK_SHIFT) != 0) { keycode = KC_SPC; }
} else if (!(KC_A <= keycode && keycode <= KC_Z)) {
if (keycode == KC_BSPC) {
// Remove last character from the buffer.
if (typo_buffer_size > 0) { --typo_buffer_size; }
return true;
} else if (KC_1 <= keycode && keycode <= KC_SLSH && keycode != KC_ESC) {
// Set a word boundary if space, period, digit, etc. is pressed.
// Behave more conservatively for the enter key. Reset, so that enter
// can't be used on a word ending.
if (keycode == KC_ENT) { typo_buffer_size = 0; }
keycode = KC_SPC;
} else {
// Clear state if some other non-alpha key is pressed.
typo_buffer_size = 0;
return true;
}
}
// If the buffer is full, rotate it to discard the oldest character.
if (typo_buffer_size >= AUTOCORRECTION_MAX_LENGTH) {
memmove(typo_buffer, typo_buffer + 1, AUTOCORRECTION_MAX_LENGTH - 1);
typo_buffer_size = AUTOCORRECTION_MAX_LENGTH - 1;
}
// Append `keycode` to the buffer.
// NOTE: `keycode` must be a basic keycode (0-255) by this point.
typo_buffer[typo_buffer_size++] = (uint8_t) keycode;
// Early return if not many characters have been buffered so far.
if (typo_buffer_size < AUTOCORRECTION_MIN_LENGTH) { return true; }
// Check whether the buffer ends in a typo. This is done using a trie
// stored in `autocorrection_data`.
uint16_t state = 0;
uint8_t code = pgm_read_byte(autocorrection_data + state);
for (int i = typo_buffer_size - 1; i >= 0; --i) {
const uint8_t key_i = typo_buffer[i];
if (code & 64) { // Check for match in node with multiple children.
code &= 63;
for (; code != key_i;
code = pgm_read_byte(autocorrection_data + (state += 3))) {
if (!code) { return true; }
}
// Follow link to child node.
state = (uint16_t)(
(uint_fast16_t)pgm_read_byte(autocorrection_data + state + 1)
| (uint_fast16_t)pgm_read_byte(autocorrection_data + state + 2) << 8);
// Otherwise check for match in node with a single child.
} else if (code != key_i) {
return true;
} else if (!(code = pgm_read_byte(autocorrection_data + (++state)))) {
++state;
}
// Stop if `state` becomes an invalid index. This should not normally
// happen, it is a safeguard in case of a bug, data corruption, etc.
if (state >= sizeof(autocorrection_data)) {
return true;
}
// Read first byte of the next node.
code = pgm_read_byte(autocorrection_data + state);
if (code & 128) { // A typo was found! Apply autocorrection.
const int backspaces = code & 63;
for (int i = 0; i < backspaces; ++i) { tap_code(KC_BSPC); }
send_string_P((char const*)(autocorrection_data + state + 1));
if (keycode == KC_SPC) {
typo_buffer[0] = KC_SPC;
typo_buffer_size = 1;
return true;
} else {
typo_buffer_size = 0;
return false;
}
}
}
return true;
}
return true;
}

View File

@ -0,0 +1,40 @@
// Copyright 2021-2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
// Autocorrection on your keyboard.
//
// This library implements rudimentary autocorrection, automatically detecting
// and fixing some misspellings. Beware that the autocorrection logic is
// unaware of hotkey or mouse-based cursor movement.
//
// For full documentation, see
// https://getreuer.info/posts/keyboards/autocorrection
#pragma once
#include "quantum.h"
#include "gourdo1.h"
#ifdef __cplusplus
extern "C" {
#endif
bool process_autocorrection(uint16_t keycode, keyrecord_t* record);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,722 @@
// Generated code.
// Autocorrection dictionary (400 entries):
// :acheiv -> achiev
// :agian -> again
// :agred -> agreed
// :ajust -> adjust
// :alot: -> a lot
// :andteh -> and the
// :andthe -> and the
// :anual -> annual
// :asign -> assign
// :aslo: -> also
// :asthe -> as the
// :atthe -> at the
// :casue -> cause
// :choses -> chooses
// :eveyr -> every
// :foudn -> found
// :gaurd -> guard
// :goign -> going
// :gonig -> going
// :graet -> great
// :grammer -> grammar
// :guage -> gauge
// :haev -> have
// :hapen -> happen
// :htere -> there
// :htikn -> think
// :htink -> think
// :hwihc -> which
// :hwile -> while
// :idaes -> ideas
// :jstu: -> just
// :jsut: -> just
// :knwo -> know
// :konw -> know
// :kwno -> know
// :moeny -> money
// :ocuntry -> country
// :ocur -> occur
// :olther -> other
// :otehr -> other
// :owudl -> would
// :rference -> reference
// :sicne -> since
// :socre -> score
// :szie -> size
// :the:the: -> the
// :theri -> their
// :thier -> their
// :thsoe -> those
// :tothe -> to the
// :ture -> true
// :turth -> truth
// :uesd: -> used
// :usally -> usually
// :yaers -> years
// :yeasr -> years
// abbout -> about
// aberation -> aberration
// abilties -> abilities
// abilty -> ability
// abotu -> about
// abouta -> about a
// aboutit -> about it
// aboutthe -> about the
// abvove -> above
// accesories -> accessories
// accomodate -> accommodate
// accross -> across
// acommodate -> accommodate
// acomplish -> accomplish
// actualy -> actually
// acurate -> accurate
// acutally -> actually
// addtion -> addition
// adviced -> advised
// againnst -> against
// aganist -> against
// aggreed -> agreed
// agianst -> against
// ahppn -> happen
// aledge -> allege
// alledge -> allege
// allign -> align
// almsot -> almost
// alomst -> almost
// alwasy -> always
// alwyas -> always
// amature -> amateur
// anohter -> another
// anomolous -> anomalous
// anomoly -> anomaly
// anytying -> anything
// aparent -> apparent
// aparrent -> apparent
// apparant -> apparent
// apparrent -> apparent
// aquire -> acquire
// aroud -> around
// arround -> around
// arund -> around
// asthetic -> aesthetic
// auxilary -> auxiliary
// auxillary -> auxiliary
// auxilliary -> auxiliary
// availabe -> available
// availaible -> available
// availalbe -> available
// availble -> available
// availiable -> available
// avalable -> available
// avaliable -> available
// avilable -> available
// baceause -> because
// bandwith -> bandwidth
// bankrupcy -> bankruptcy
// baout -> about
// beacuse -> because
// becasue -> because
// beccause -> because
// becouse -> because
// becuase -> because
// bedore -> before
// beeing -> being
// befoer -> before
// begginer -> beginner
// beleif -> belief
// beleive -> believe
// belive -> believe
// beteen -> between
// beween -> between
// bewteen -> between
// breif -> brief
// burried -> buried
// busness -> business
// bussiness -> business
// cacheing -> caching
// calander -> calendar
// caluclate -> calculate
// caluculate -> calculate
// calulate -> calculate
// catagory -> category
// cauhgt -> caught
// ceratin -> certain
// certian -> certain
// cheif -> chief
// chekc -> check
// childen -> children
// chnage -> change
// choosen -> chosen
// cieling -> ceiling
// circut -> circuit
// claer -> clear
// clasic -> classic
// cmoputer -> computer
// coform -> conform
// cognizent -> cognizant
// collegue -> colleague
// comapny -> company
// comittee -> committee
// comming: -> coming
// commitee -> committee
// competance -> competence
// competant -> competent
// complier -> compiler
// concensus -> consensus
// considerd -> considered
// contian -> contain
// copywrite: -> copyright
// cosnt -> const
// coudl -> could
// dervied -> derived
// desicion -> decision
// didnot -> did not
// diferent -> different
// diferrent -> different
// differnt -> different
// diffrent -> different
// divison -> division
// doulbe -> double
// dyanmic -> dynamic
// effecient -> efficient
// elasped -> elapsed
// eligable -> eligible
// elpased -> elapsed
// embarass -> embarrass
// embeded -> embedded
// encypt -> encrypt
// excecut -> execut
// excercise -> exercise
// failse -> false
// fales -> false
// fasle -> false
// feild -> field
// finaly -> finally
// firend -> friend
// firts -> first
// fitler -> filter
// flase -> false
// follwo -> follow
// foriegn -> foreign
// foward -> forward
// fraciton -> fraction
// freind -> friend
// frequecy -> frequency
// fromthe -> from the
// fucntion -> function
// fufill -> fulfill
// fullfill -> fulfill
// futher -> further
// ganerate -> generate
// garantee -> guarantee
// gaurantee -> guarantee
// generaly -> generally
// govement -> government
// govenment -> government
// goverment -> government
// governmnet -> government
// govorment -> government
// govornment -> government
// greatful -> grateful
// guaratee -> guarantee
// heigher -> higher
// heigth -> height
// heirarchy -> hierarchy
// higest -> highest
// howver -> however
// hydogen -> hydrogen
// hygeine -> hygiene
// hypocracy -> hypocrisy
// hypocrasy -> hypocrisy
// hypocricy -> hypocrisy
// hypocrit: -> hypocrite
// iamge -> image
// importamt -> important
// inclued -> include
// indeces -> indices
// indecies -> indices
// indicies -> indices
// inital -> initial
// insted -> instead
// interator -> iterator
// intput -> input
// intrest -> interest
// invliad -> invalid
// laguage -> language
// largst -> largest
// learnign -> learning
// lenght -> length
// levle -> level
// liasion -> liaison
// libary -> library
// likly -> likely
// lisense -> license
// listner -> listener
// littel -> little
// looses: -> loses
// looup -> lookup
// macthing -> matching
// maintence -> maintenance
// manefist -> manifest
// mesage -> message
// morgage -> mortgage
// mysefl -> myself
// namesapce -> namespace
// namespcae -> namespace
// naturual -> natural
// neccesary -> necessary
// necesary -> necessary
// nulltpr -> nullptr
// occassion -> occasion
// occured -> occurred
// operaotr -> operator
// ouptut -> output
// ouput -> output
// overide -> override
// ovveride -> override
// pallete -> palette
// paralel -> parallel
// parralel -> parallel
// parrallel -> parallel
// particualr -> particular
// paticular -> particular
// peaple -> people
// peice -> piece
// peolpe -> people
// peopel -> people
// perhasp -> perhaps
// perheaps -> perhaps
// perhpas -> perhaps
// perphas -> perhaps
// persue -> pursue
// poeople -> people
// poeple -> people
// poitner -> pointer
// posess -> possess
// postion -> position
// preiod -> period
// primarly -> primarily
// priviledge -> privilege
// privte -> private
// probablly -> probably
// probaly -> probably
// probelm -> problem
// proccess -> process
// proeprty -> property
// prominant -> prominent
// proove -> prove
// propery -> property
// propogate -> propagate
// psuedo -> pseudo
// raelly -> really
// realtion -> relation
// realy -> really
// reasearch -> research
// receiev -> receiv
// recepient -> recipient
// reciept -> receipt
// reciev -> receiv
// recipiant -> recipient
// recrod -> record
// recuring -> recurring
// referece -> reference
// refered -> referred
// regluar -> regular
// relaly -> really
// releated -> related
// relevent -> relevant
// repitition -> repetition
// reponse -> response
// reprot -> report
// resutl -> result
// retrun -> return
// retun -> return
// reuslt -> result
// reutrn -> return
// reveiw -> review
// saftey -> safety
// safty -> safety
// satisifed -> satisfied
// scheduel -> schedule
// seperat -> separat
// sequnce -> sequence
// shoudl -> should
// similiar -> similar
// simmilar -> similar
// singed -> signed
// singel -> single
// slighly -> slightly
// somehwat -> somewhat
// spectogram -> spectrogram
// statment -> statement
// stirng -> string
// stregth -> strength
// strengh -> strength
// strign -> string
// succsess -> success
// sucess -> success
// sugest -> suggest
// sumary -> summary
// supress -> suppress
// surpress -> suppress
// swithc -> switch
// swtich -> switch
// symetric -> symmetric
// teamplate -> template
// tempalte -> template
// theese -> these
// therfore -> therefore
// thign -> thing
// thigsn -> things
// thikn -> think
// thiunk -> think
// thnigs -> things
// thresold -> threshold
// throught -> thought
// tihkn -> think
// tkaes -> takes
// todya -> today
// toghether -> together
// tolerence -> tolerance
// tongiht -> tonight
// tranpose -> transpose
// typcial -> typical
// udpate -> update
// unkown -> unknown
// unqiue -> unique
// ususally -> usually
// verticies -> vertices
// virutal -> virtual
// vitual -> virtual
// whcih -> which
// whereever -> wherever
// wherre -> where
// whihc -> which
// whlch -> which
// widht -> width
// wierd -> weird
// wihch -> which
// woudl -> would
// yeild -> yield
#define AUTOCORRECTION_MIN_LENGTH 5 // "abotu"
#define AUTOCORRECTION_MAX_LENGTH 10 // "auxilliary"
static const uint8_t autocorrection_data[5967] PROGMEM = {108, 67, 0, 4, 212, 0,
6, 236, 0, 7, 100, 1, 8, 15, 3, 9, 169, 8, 10, 204, 8, 11, 68, 9, 12, 246, 9,
14, 0, 10, 15, 28, 10, 16, 79, 11, 17, 129, 11, 18, 175, 13, 19, 227, 13, 21,
253, 13, 22, 194, 15, 23, 121, 17, 24, 201, 20, 25, 210, 20, 26, 8, 21, 28,
34, 21, 0, 71, 89, 0, 8, 99, 0, 10, 130, 0, 18, 142, 0, 22, 152, 0, 23, 163,
0, 24, 202, 0, 0, 22, 8, 24, 44, 0, 131, 115, 101, 100, 0, 75, 106, 0, 23,
115, 0, 0, 23, 44, 8, 11, 23, 44, 0, 132, 0, 12, 21, 26, 28, 19, 18, 6, 0,
133, 114, 105, 103, 104, 116, 0, 17, 12, 16, 16, 18, 6, 0, 132, 105, 110, 103,
0, 15, 22, 4, 44, 0, 131, 108, 115, 111, 0, 8, 22, 18, 18, 15, 0, 132, 115,
101, 115, 0, 76, 173, 0, 18, 183, 0, 24, 193, 0, 0, 21, 6, 18, 19, 28, 11, 0,
128, 101, 0, 15, 4, 44, 0, 131, 32, 108, 111, 116, 0, 22, 13, 44, 0, 131, 117,
115, 116, 0, 23, 22, 13, 44, 0, 131, 117, 115, 116, 0, 87, 219, 0, 28, 228, 0,
0, 24, 18, 5, 4, 0, 128, 32, 97, 0, 7, 18, 23, 0, 129, 97, 121, 0, 75, 246, 0,
12, 28, 1, 14, 92, 1, 0, 76, 253, 0, 23, 20, 1, 0, 75, 4, 1, 26, 10, 1, 0, 26,
0, 129, 99, 104, 0, 11, 44, 0, 132, 119, 104, 105, 99, 104, 0, 12, 26, 22, 0,
129, 99, 104, 0, 80, 41, 1, 21, 53, 1, 22, 67, 1, 23, 76, 1, 0, 17, 4, 28, 7,
0, 132, 110, 97, 109, 105, 99, 0, 23, 8, 16, 28, 22, 0, 132, 109, 101, 116,
114, 105, 99, 0, 4, 15, 6, 0, 129, 115, 105, 99, 0, 8, 11, 23, 22, 4, 0, 134,
101, 115, 116, 104, 101, 116, 105, 99, 0, 8, 11, 6, 0, 129, 99, 107, 0, 68,
122, 1, 8, 134, 1, 15, 84, 2, 17, 124, 2, 18, 180, 2, 21, 207, 2, 24, 7, 3, 0,
12, 15, 25, 17, 12, 0, 131, 97, 108, 105, 100, 0, 70, 168, 1, 7, 178, 1, 8,
188, 1, 9, 199, 1, 10, 212, 1, 12, 222, 1, 19, 248, 1, 21, 3, 2, 22, 38, 2,
23, 50, 2, 24, 75, 2, 0, 12, 25, 7, 4, 0, 130, 115, 101, 100, 0, 8, 5, 16, 8,
0, 129, 100, 101, 100, 0, 21, 10, 10, 4, 0, 132, 114, 101, 101, 100, 0, 12,
22, 12, 23, 4, 22, 0, 131, 102, 105, 101, 100, 0, 17, 12, 22, 0, 131, 103,
110, 101, 100, 0, 85, 229, 1, 25, 238, 1, 0, 21, 24, 5, 0, 131, 105, 101, 100,
0, 21, 8, 7, 0, 131, 105, 118, 101, 100, 0, 22, 4, 15, 8, 0, 131, 112, 115,
101, 100, 0, 72, 13, 2, 10, 22, 2, 24, 29, 2, 0, 9, 8, 21, 0, 129, 114, 101,
100, 0, 4, 44, 0, 128, 101, 100, 0, 6, 6, 18, 0, 129, 114, 101, 100, 0, 4, 19,
15, 8, 0, 132, 97, 112, 115, 101, 100, 0, 68, 57, 2, 22, 68, 2, 0, 8, 15, 8,
21, 0, 132, 97, 116, 101, 100, 0, 17, 12, 0, 128, 97, 100, 0, 15, 6, 17, 12,
0, 129, 100, 101, 0, 76, 91, 2, 18, 112, 2, 0, 8, 0, 73, 100, 2, 28, 106, 2,
0, 131, 105, 101, 108, 100, 0, 131, 105, 101, 108, 100, 0, 22, 8, 21, 11, 23,
0, 130, 104, 111, 108, 100, 0, 72, 134, 2, 12, 145, 2, 24, 155, 2, 0, 21, 12,
9, 0, 132, 114, 105, 101, 110, 100, 0, 8, 21, 9, 0, 131, 105, 101, 110, 100,
0, 82, 162, 2, 21, 172, 2, 0, 21, 21, 4, 0, 132, 111, 117, 110, 100, 0, 4, 0,
130, 111, 117, 110, 100, 0, 76, 187, 2, 21, 198, 2, 0, 8, 21, 19, 0, 132, 101,
114, 105, 111, 100, 0, 6, 8, 21, 0, 130, 111, 114, 100, 0, 68, 217, 2, 8, 228,
2, 24, 253, 2, 0, 26, 18, 9, 0, 131, 114, 119, 97, 114, 100, 0, 71, 235, 2,
12, 245, 2, 0, 12, 22, 17, 18, 6, 0, 128, 101, 100, 0, 26, 0, 131, 101, 105,
114, 100, 0, 4, 10, 44, 0, 131, 117, 97, 114, 100, 0, 18, 21, 4, 0, 128, 110,
100, 0, 68, 67, 3, 5, 80, 3, 6, 123, 3, 7, 251, 3, 8, 23, 4, 10, 107, 4, 11,
227, 4, 12, 52, 5, 15, 61, 5, 17, 0, 6, 18, 27, 6, 19, 37, 6, 21, 47, 6, 22,
156, 6, 23, 82, 7, 24, 45, 8, 25, 115, 8, 0, 6, 19, 22, 8, 16, 4, 17, 0, 130,
97, 99, 101, 0, 68, 87, 3, 15, 97, 3, 0, 15, 12, 4, 25, 4, 0, 128, 108, 101,
0, 68, 104, 3, 24, 115, 3, 0, 15, 12, 4, 25, 4, 0, 130, 98, 108, 101, 0, 18,
7, 0, 130, 98, 108, 101, 0, 72, 136, 3, 12, 147, 3, 17, 156, 3, 19, 238, 3, 0,
21, 8, 9, 8, 21, 0, 129, 110, 99, 101, 0, 8, 19, 0, 131, 105, 101, 99, 101, 0,
68, 166, 3, 8, 179, 3, 24, 228, 3, 0, 23, 8, 19, 16, 18, 6, 0, 131, 101, 110,
99, 101, 0, 85, 186, 3, 23, 217, 3, 0, 8, 0, 73, 195, 3, 15, 208, 3, 0, 21,
44, 0, 134, 101, 102, 101, 114, 101, 110, 99, 101, 0, 18, 23, 0, 131, 97, 110,
99, 101, 0, 17, 12, 4, 16, 0, 129, 97, 110, 99, 101, 0, 20, 8, 22, 0, 130,
101, 110, 99, 101, 0, 4, 22, 8, 16, 4, 17, 0, 131, 112, 97, 99, 101, 0, 12,
21, 8, 25, 0, 82, 7, 4, 25, 13, 4, 0, 130, 114, 105, 100, 101, 0, 18, 0, 133,
101, 114, 114, 105, 100, 101, 0, 23, 0, 68, 38, 4, 12, 49, 4, 17, 59, 4, 23,
94, 4, 0, 21, 4, 24, 10, 0, 130, 110, 116, 101, 101, 0, 16, 16, 18, 6, 0, 129,
116, 101, 101, 0, 4, 21, 0, 68, 69, 4, 24, 81, 4, 0, 10, 0, 134, 117, 97, 114,
97, 110, 116, 101, 101, 0, 4, 10, 0, 135, 117, 97, 114, 97, 110, 116, 101,
101, 0, 12, 16, 18, 6, 0, 132, 109, 105, 116, 116, 101, 101, 0, 68, 117, 4, 7,
184, 4, 16, 218, 4, 0, 74, 130, 4, 17, 141, 4, 22, 150, 4, 24, 159, 4, 0, 21,
18, 16, 0, 131, 116, 103, 97, 103, 101, 0, 11, 6, 0, 131, 97, 110, 103, 101,
0, 8, 16, 0, 130, 115, 97, 103, 101, 0, 10, 0, 108, 168, 4, 4, 174, 4, 0, 131,
97, 117, 103, 101, 0, 15, 0, 132, 110, 103, 117, 97, 103, 101, 0, 8, 15, 0,
68, 197, 4, 12, 203, 4, 15, 212, 4, 0, 131, 108, 101, 103, 101, 0, 25, 12, 21,
19, 0, 130, 103, 101, 0, 4, 0, 130, 103, 101, 0, 4, 12, 0, 131, 109, 97, 103,
101, 0, 23, 0, 71, 245, 4, 16, 255, 4, 18, 9, 5, 22, 18, 5, 23, 27, 5, 0, 17,
4, 44, 0, 130, 32, 116, 104, 101, 0, 18, 21, 9, 0, 130, 32, 116, 104, 101, 0,
23, 44, 0, 130, 32, 116, 104, 101, 0, 4, 44, 0, 130, 32, 116, 104, 101, 0, 68,
34, 5, 24, 42, 5, 0, 44, 0, 130, 32, 116, 104, 101, 0, 18, 5, 4, 0, 130, 32,
116, 104, 101, 0, 29, 22, 44, 0, 130, 105, 122, 101, 0, 69, 77, 5, 12, 190, 5,
19, 201, 5, 22, 241, 5, 25, 249, 5, 0, 68, 87, 5, 12, 167, 5, 15, 179, 5, 0,
74, 97, 5, 12, 107, 5, 15, 137, 5, 0, 12, 15, 8, 0, 131, 105, 98, 108, 101, 0,
15, 0, 68, 116, 5, 12, 127, 5, 0, 25, 4, 0, 133, 105, 108, 97, 98, 108, 101,
0, 4, 25, 4, 0, 132, 97, 98, 108, 101, 0, 68, 144, 5, 12, 155, 5, 0, 25, 4, 0,
132, 105, 108, 97, 98, 108, 101, 0, 25, 4, 0, 133, 97, 105, 108, 97, 98, 108,
101, 0, 4, 15, 12, 4, 25, 4, 0, 131, 98, 108, 101, 0, 12, 4, 25, 4, 0, 130,
97, 98, 108, 101, 0, 26, 11, 44, 0, 132, 119, 104, 105, 108, 101, 0, 68, 211,
5, 8, 220, 5, 18, 230, 5, 0, 8, 19, 0, 131, 111, 112, 108, 101, 0, 18, 19, 0,
132, 101, 111, 112, 108, 101, 0, 8, 18, 19, 0, 133, 101, 111, 112, 108, 101,
0, 4, 9, 0, 130, 108, 115, 101, 0, 8, 15, 0, 129, 101, 108, 0, 70, 7, 6, 12,
16, 6, 0, 12, 22, 44, 0, 130, 110, 99, 101, 0, 8, 10, 28, 11, 0, 131, 105,
101, 110, 101, 0, 22, 11, 23, 44, 0, 130, 111, 115, 101, 0, 15, 18, 8, 19, 0,
130, 112, 108, 101, 0, 70, 66, 6, 8, 76, 6, 12, 87, 6, 18, 99, 6, 21, 127, 6,
24, 134, 6, 0, 18, 22, 44, 0, 131, 99, 111, 114, 101, 0, 23, 11, 44, 0, 132,
116, 104, 101, 114, 101, 0, 24, 20, 4, 0, 132, 99, 113, 117, 105, 114, 101, 0,
71, 106, 6, 9, 115, 6, 0, 8, 5, 0, 131, 102, 111, 114, 101, 0, 21, 8, 11, 23,
0, 131, 101, 102, 111, 114, 101, 0, 8, 11, 26, 0, 129, 101, 0, 23, 0, 108,
143, 6, 4, 148, 6, 0, 130, 114, 117, 101, 0, 16, 4, 0, 130, 101, 117, 114, 0,
68, 178, 6, 8, 203, 6, 12, 211, 6, 15, 226, 6, 17, 235, 6, 18, 9, 7, 24, 22,
7, 0, 79, 185, 6, 24, 193, 6, 0, 9, 0, 131, 97, 108, 115, 101, 0, 6, 8, 5, 0,
131, 97, 117, 115, 101, 0, 8, 11, 23, 0, 130, 115, 101, 0, 6, 21, 8, 6, 27, 8,
0, 134, 101, 114, 99, 105, 115, 101, 0, 12, 4, 9, 0, 131, 108, 115, 101, 0,
72, 242, 6, 18, 253, 6, 0, 22, 12, 15, 0, 132, 99, 101, 110, 115, 101, 0, 19,
8, 21, 0, 132, 115, 112, 111, 110, 115, 101, 0, 19, 17, 4, 21, 23, 0, 131,
115, 112, 111, 115, 101, 0, 68, 32, 7, 6, 61, 7, 18, 72, 7, 0, 70, 39, 7, 8,
49, 7, 0, 6, 8, 5, 0, 132, 97, 117, 115, 101, 0, 6, 4, 5, 0, 134, 101, 99, 97,
117, 115, 101, 0, 4, 8, 5, 0, 132, 99, 97, 117, 115, 101, 0, 6, 8, 5, 0, 131,
97, 117, 115, 101, 0, 68, 95, 7, 8, 13, 8, 15, 24, 8, 25, 36, 8, 0, 71, 111,
7, 10, 148, 7, 15, 161, 7, 19, 228, 7, 21, 238, 7, 0, 18, 16, 0, 80, 121, 7,
18, 136, 7, 0, 18, 6, 4, 0, 135, 99, 111, 109, 109, 111, 100, 97, 116, 101, 0,
6, 6, 4, 0, 132, 109, 111, 100, 97, 116, 101, 0, 18, 19, 18, 21, 19, 0, 132,
97, 103, 97, 116, 101, 0, 70, 171, 7, 19, 184, 7, 24, 197, 7, 0, 24, 15, 4, 6,
0, 133, 99, 117, 108, 97, 116, 101, 0, 16, 4, 8, 23, 0, 134, 109, 112, 108,
97, 116, 101, 0, 70, 204, 7, 15, 217, 7, 0, 24, 15, 4, 6, 0, 134, 99, 117,
108, 97, 116, 101, 0, 4, 6, 0, 132, 99, 117, 108, 97, 116, 101, 0, 7, 24, 0,
132, 112, 100, 97, 116, 101, 0, 72, 245, 7, 24, 2, 8, 0, 17, 4, 10, 0, 134,
101, 110, 101, 114, 97, 116, 101, 0, 6, 4, 0, 132, 99, 117, 114, 97, 116, 101,
0, 15, 15, 4, 19, 0, 131, 101, 116, 116, 101, 0, 4, 19, 16, 8, 23, 0, 131,
108, 97, 116, 101, 0, 12, 21, 19, 0, 129, 97, 116, 101, 0, 74, 55, 8, 12, 67,
8, 22, 77, 8, 0, 8, 15, 15, 18, 6, 0, 130, 97, 103, 117, 101, 0, 20, 17, 24,
0, 131, 105, 113, 117, 101, 0, 68, 84, 8, 21, 105, 8, 0, 6, 0, 108, 93, 8, 8,
98, 8, 0, 130, 117, 115, 101, 0, 5, 0, 130, 117, 115, 101, 0, 8, 19, 0, 132,
117, 114, 115, 117, 101, 0, 76, 122, 8, 18, 147, 8, 0, 72, 129, 8, 15, 139, 8,
0, 15, 8, 5, 0, 131, 105, 101, 118, 101, 0, 8, 5, 0, 129, 101, 118, 101, 0,
82, 154, 8, 25, 161, 8, 0, 21, 19, 0, 130, 118, 101, 0, 5, 4, 0, 131, 111,
118, 101, 0, 12, 8, 0, 75, 182, 8, 15, 189, 8, 21, 197, 8, 0, 6, 0, 130, 105,
101, 102, 0, 8, 5, 0, 130, 105, 101, 102, 0, 5, 0, 130, 105, 101, 102, 0, 76,
211, 8, 17, 221, 8, 0, 17, 18, 10, 44, 0, 130, 105, 110, 103, 0, 76, 228, 8,
21, 58, 9, 0, 72, 244, 8, 11, 11, 9, 15, 24, 9, 21, 36, 9, 28, 47, 9, 0, 72,
251, 8, 11, 2, 9, 0, 5, 0, 131, 105, 110, 103, 0, 6, 4, 6, 0, 131, 105, 110,
103, 0, 23, 6, 4, 16, 0, 133, 116, 99, 104, 105, 110, 103, 0, 8, 12, 6, 0,
133, 101, 105, 108, 105, 110, 103, 0, 24, 6, 8, 21, 0, 130, 114, 105, 110,
103, 0, 23, 28, 17, 4, 0, 131, 104, 105, 110, 103, 0, 12, 23, 22, 0, 131, 114,
105, 110, 103, 0, 70, 87, 9, 8, 142, 9, 10, 154, 9, 12, 164, 9, 22, 173, 9,
23, 191, 9, 0, 75, 100, 9, 12, 109, 9, 15, 119, 9, 21, 127, 9, 0, 12, 26, 0,
131, 104, 105, 99, 104, 0, 23, 26, 22, 0, 131, 105, 116, 99, 104, 0, 11, 26,
0, 130, 105, 99, 104, 0, 4, 8, 22, 4, 8, 21, 0, 134, 115, 101, 97, 114, 99,
104, 0, 23, 7, 17, 4, 44, 0, 130, 32, 116, 104, 101, 0, 17, 8, 21, 23, 22, 0,
128, 116, 104, 0, 6, 11, 26, 0, 130, 105, 99, 104, 0, 12, 15, 19, 16, 18, 6,
4, 0, 134, 99, 111, 109, 112, 108, 105, 115, 104, 0, 74, 201, 9, 12, 225, 9,
21, 236, 9, 0, 72, 208, 9, 12, 218, 9, 0, 21, 23, 22, 0, 130, 110, 103, 116,
104, 0, 8, 11, 0, 129, 104, 116, 0, 26, 7, 17, 4, 5, 0, 129, 100, 116, 104, 0,
24, 23, 44, 0, 131, 114, 117, 116, 104, 0, 21, 8, 11, 23, 44, 0, 129, 105,
114, 0, 17, 0, 76, 9, 10, 24, 20, 10, 0, 23, 11, 44, 0, 132, 116, 104, 105,
110, 107, 0, 12, 11, 23, 0, 130, 110, 107, 0, 68, 50, 10, 7, 134, 10, 8, 177,
10, 9, 17, 11, 15, 26, 11, 23, 55, 11, 24, 64, 11, 0, 76, 60, 10, 23, 71, 10,
24, 96, 10, 0, 6, 19, 28, 23, 0, 131, 105, 99, 97, 108, 0, 76, 78, 10, 24, 86,
10, 0, 17, 12, 0, 129, 105, 97, 108, 0, 21, 12, 25, 0, 131, 116, 117, 97, 108,
0, 81, 106, 10, 21, 115, 10, 23, 124, 10, 0, 4, 44, 0, 130, 110, 117, 97, 108,
0, 24, 23, 4, 17, 0, 130, 97, 108, 0, 12, 25, 0, 131, 114, 116, 117, 97, 108,
0, 24, 0, 82, 143, 10, 26, 167, 10, 0, 70, 153, 10, 11, 157, 10, 26, 163, 10,
0, 129, 108, 100, 0, 22, 0, 129, 108, 100, 0, 129, 108, 100, 0, 18, 44, 0,
132, 119, 111, 117, 108, 100, 0, 74, 193, 10, 15, 201, 10, 19, 247, 10, 23,
255, 10, 24, 7, 11, 0, 17, 12, 22, 0, 129, 108, 101, 0, 68, 208, 10, 15, 234,
10, 0, 21, 0, 68, 217, 10, 21, 224, 10, 0, 19, 0, 129, 108, 101, 108, 0, 4,
19, 0, 132, 97, 108, 108, 101, 108, 0, 4, 21, 21, 4, 19, 0, 133, 97, 108, 108,
101, 108, 0, 18, 8, 19, 0, 129, 108, 101, 0, 23, 12, 15, 0, 129, 108, 101, 0,
7, 8, 11, 6, 22, 0, 129, 108, 101, 0, 8, 22, 28, 16, 0, 129, 108, 102, 0, 12,
9, 0, 79, 36, 11, 24, 46, 11, 0, 15, 24, 9, 0, 132, 102, 105, 108, 108, 0, 9,
0, 131, 108, 102, 105, 108, 108, 0, 24, 22, 8, 21, 0, 129, 108, 116, 0, 9, 23,
4, 8, 21, 10, 0, 133, 97, 116, 101, 102, 117, 108, 0, 68, 89, 11, 15, 106, 11,
21, 117, 11, 0, 21, 10, 18, 23, 6, 8, 19, 22, 0, 132, 114, 111, 103, 114, 97,
109, 0, 8, 5, 18, 21, 19, 0, 130, 108, 101, 109, 0, 18, 9, 18, 6, 0, 131, 110,
102, 111, 114, 109, 0, 68, 166, 11, 7, 206, 11, 8, 215, 11, 10, 58, 12, 12,
141, 12, 14, 153, 12, 18, 192, 12, 19, 108, 13, 21, 120, 13, 22, 131, 13, 24,
141, 13, 26, 164, 13, 0, 12, 0, 74, 175, 11, 23, 183, 11, 0, 4, 44, 0, 130,
97, 105, 110, 0, 81, 190, 11, 21, 198, 11, 0, 18, 6, 0, 130, 97, 105, 110, 0,
8, 6, 0, 130, 97, 105, 110, 0, 24, 18, 9, 44, 0, 129, 110, 100, 0, 71, 231,
11, 8, 241, 11, 10, 27, 12, 19, 39, 12, 22, 48, 12, 0, 15, 12, 11, 6, 0, 129,
114, 101, 110, 0, 87, 248, 11, 26, 17, 12, 0, 72, 255, 11, 26, 7, 12, 0, 5, 0,
130, 119, 101, 101, 110, 0, 8, 5, 0, 132, 116, 119, 101, 101, 110, 0, 8, 5, 0,
131, 116, 119, 101, 101, 110, 0, 18, 7, 28, 11, 0, 131, 114, 111, 103, 101,
110, 0, 4, 11, 44, 0, 129, 112, 101, 110, 0, 18, 18, 11, 6, 0, 131, 115, 101,
110, 0, 72, 65, 12, 12, 76, 12, 0, 12, 21, 18, 9, 0, 131, 101, 105, 103, 110,
0, 75, 95, 12, 15, 101, 12, 17, 109, 12, 18, 118, 12, 21, 125, 12, 22, 132,
12, 0, 23, 0, 129, 110, 103, 0, 15, 4, 0, 131, 105, 103, 110, 0, 21, 4, 8, 15,
0, 129, 110, 103, 0, 10, 44, 0, 129, 110, 103, 0, 23, 22, 0, 129, 110, 103, 0,
4, 44, 0, 130, 115, 105, 103, 110, 0, 23, 4, 21, 8, 6, 0, 131, 116, 97, 105,
110, 0, 75, 160, 12, 12, 169, 12, 0, 12, 23, 0, 131, 104, 105, 110, 107, 0,
75, 176, 12, 23, 182, 12, 0, 23, 0, 129, 110, 107, 0, 11, 44, 0, 132, 116,
104, 105, 110, 107, 0, 76, 202, 12, 22, 86, 13, 23, 96, 13, 0, 70, 212, 12,
22, 225, 12, 23, 251, 12, 0, 12, 22, 8, 7, 0, 133, 99, 105, 115, 105, 111,
110, 0, 68, 232, 12, 22, 241, 12, 0, 12, 15, 0, 131, 105, 115, 111, 110, 0, 4,
6, 6, 18, 0, 131, 105, 111, 110, 0, 68, 14, 13, 7, 27, 13, 12, 37, 13, 15, 52,
13, 17, 64, 13, 22, 76, 13, 0, 21, 8, 5, 4, 0, 132, 114, 97, 116, 105, 111,
110, 0, 7, 4, 0, 131, 105, 116, 105, 111, 110, 0, 23, 12, 19, 8, 21, 0, 134,
101, 116, 105, 116, 105, 111, 110, 0, 4, 8, 21, 0, 133, 108, 97, 116, 105,
111, 110, 0, 6, 24, 9, 0, 133, 110, 99, 116, 105, 111, 110, 0, 18, 19, 0, 131,
105, 116, 105, 111, 110, 0, 12, 25, 12, 7, 0, 129, 105, 111, 110, 0, 12, 6, 4,
21, 9, 0, 131, 116, 105, 111, 110, 0, 19, 11, 4, 0, 132, 104, 97, 112, 112,
101, 110, 0, 23, 24, 8, 21, 0, 131, 116, 117, 114, 110, 0, 10, 12, 11, 23, 0,
130, 110, 103, 115, 0, 85, 148, 13, 23, 157, 13, 0, 23, 8, 21, 0, 130, 117,
114, 110, 0, 8, 21, 0, 128, 114, 110, 0, 18, 14, 17, 24, 0, 130, 110, 111,
119, 110, 0, 71, 185, 13, 17, 196, 13, 26, 205, 13, 0, 8, 24, 22, 19, 0, 131,
101, 117, 100, 111, 0, 26, 14, 44, 0, 130, 110, 111, 119, 0, 79, 212, 13, 17,
220, 13, 0, 15, 18, 9, 0, 129, 111, 119, 0, 14, 44, 0, 129, 111, 119, 0, 86,
234, 13, 24, 244, 13, 0, 4, 11, 21, 8, 19, 0, 129, 112, 115, 0, 18, 18, 15, 0,
129, 107, 117, 112, 0, 68, 28, 14, 8, 93, 14, 11, 103, 15, 15, 113, 15, 18,
127, 15, 19, 144, 15, 22, 155, 15, 23, 164, 15, 24, 176, 15, 28, 185, 15, 0,
76, 38, 14, 15, 48, 14, 24, 82, 14, 0, 15, 12, 16, 12, 22, 0, 130, 97, 114, 0,
76, 55, 14, 24, 66, 14, 0, 16, 16, 12, 22, 0, 132, 105, 108, 97, 114, 0, 6,
12, 23, 4, 19, 0, 134, 114, 116, 105, 99, 117, 108, 97, 114, 0, 15, 10, 8, 21,
0, 131, 117, 108, 97, 114, 0, 68, 124, 14, 7, 132, 14, 11, 145, 14, 12, 203,
14, 15, 229, 14, 16, 239, 14, 17, 249, 14, 18, 37, 15, 23, 45, 15, 25, 76, 15,
0, 15, 6, 0, 130, 101, 97, 114, 0, 17, 4, 15, 4, 6, 0, 132, 101, 110, 100, 97,
114, 0, 74, 152, 14, 23, 163, 14, 0, 12, 8, 11, 0, 133, 105, 103, 104, 101,
114, 0, 72, 173, 14, 15, 185, 14, 24, 194, 14, 0, 11, 10, 18, 23, 0, 133, 101,
116, 104, 101, 114, 0, 18, 44, 0, 132, 116, 104, 101, 114, 0, 9, 0, 131, 114,
116, 104, 101, 114, 0, 75, 210, 14, 15, 218, 14, 0, 23, 44, 0, 130, 101, 105,
114, 0, 19, 16, 18, 6, 0, 131, 105, 108, 101, 114, 0, 23, 12, 9, 0, 131, 108,
116, 101, 114, 0, 16, 4, 21, 10, 44, 0, 129, 97, 114, 0, 76, 0, 15, 23, 12,
15, 0, 10, 10, 8, 5, 0, 132, 105, 110, 110, 101, 114, 0, 76, 19, 15, 22, 28,
15, 0, 18, 19, 0, 131, 110, 116, 101, 114, 0, 12, 15, 0, 130, 101, 110, 101,
114, 0, 9, 8, 5, 0, 129, 114, 101, 0, 75, 52, 15, 24, 62, 15, 0, 18, 17, 4, 0,
131, 116, 104, 101, 114, 0, 19, 18, 16, 6, 0, 134, 111, 109, 112, 117, 116,
101, 114, 0, 72, 83, 15, 26, 94, 15, 0, 8, 21, 8, 11, 26, 0, 131, 118, 101,
114, 0, 18, 11, 0, 130, 101, 118, 101, 114, 0, 8, 23, 18, 44, 0, 130, 104,
101, 114, 0, 4, 24, 6, 12, 23, 21, 4, 19, 0, 130, 108, 97, 114, 0, 23, 4, 21,
8, 23, 17, 12, 0, 135, 116, 101, 114, 97, 116, 111, 114, 0, 23, 15, 15, 24,
17, 0, 130, 112, 116, 114, 0, 4, 8, 28, 44, 0, 129, 114, 115, 0, 18, 4, 21, 8,
19, 18, 0, 130, 116, 111, 114, 0, 6, 18, 44, 0, 129, 99, 117, 114, 0, 8, 25,
8, 44, 0, 129, 114, 121, 0, 68, 219, 15, 8, 3, 16, 10, 147, 16, 19, 158, 16,
21, 170, 16, 22, 181, 16, 23, 77, 17, 24, 85, 17, 0, 75, 229, 15, 19, 240, 15,
28, 250, 15, 0, 19, 21, 8, 19, 0, 131, 104, 97, 112, 115, 0, 11, 21, 8, 19, 0,
130, 97, 112, 115, 0, 26, 15, 4, 0, 130, 97, 121, 115, 0, 68, 19, 16, 6, 42,
16, 12, 53, 16, 15, 129, 16, 22, 136, 16, 0, 71, 26, 16, 14, 34, 16, 0, 12,
44, 0, 130, 101, 97, 115, 0, 23, 0, 131, 97, 107, 101, 115, 0, 8, 7, 17, 12,
0, 131, 105, 99, 101, 115, 0, 70, 63, 16, 21, 102, 16, 23, 117, 16, 0, 72, 70,
16, 12, 80, 16, 0, 7, 17, 12, 0, 132, 105, 99, 101, 115, 0, 71, 87, 16, 23,
94, 16, 0, 17, 12, 0, 130, 101, 115, 0, 21, 8, 25, 0, 130, 101, 115, 0, 18,
22, 8, 6, 6, 4, 0, 132, 115, 111, 114, 105, 101, 115, 0, 15, 12, 5, 4, 0, 131,
105, 116, 105, 101, 115, 0, 4, 9, 0, 129, 115, 101, 0, 18, 11, 6, 44, 0, 130,
111, 115, 101, 115, 0, 12, 17, 11, 23, 0, 131, 105, 110, 103, 115, 0, 4, 8,
11, 21, 8, 19, 0, 131, 97, 112, 115, 0, 8, 4, 28, 44, 0, 131, 101, 97, 114,
115, 0, 68, 191, 16, 8, 203, 16, 18, 66, 17, 0, 21, 4, 5, 16, 8, 0, 130, 114,
97, 115, 115, 0, 70, 216, 16, 17, 240, 16, 21, 13, 17, 22, 42, 17, 0, 70, 223,
16, 24, 232, 16, 0, 18, 21, 19, 0, 131, 101, 115, 115, 0, 22, 0, 130, 99, 101,
115, 115, 0, 76, 247, 16, 22, 3, 17, 0, 22, 22, 24, 5, 0, 133, 105, 110, 101,
115, 115, 0, 24, 5, 0, 131, 105, 110, 101, 115, 115, 0, 19, 0, 85, 22, 17, 24,
33, 17, 0, 24, 22, 0, 133, 112, 112, 114, 101, 115, 115, 0, 22, 0, 131, 112,
114, 101, 115, 115, 0, 70, 49, 17, 18, 58, 17, 0, 6, 24, 22, 0, 131, 101, 115,
115, 0, 19, 0, 130, 115, 101, 115, 115, 0, 21, 6, 6, 4, 0, 132, 114, 111, 115,
115, 0, 21, 12, 9, 0, 129, 115, 116, 0, 82, 92, 17, 22, 106, 17, 0, 15, 18,
16, 18, 17, 4, 0, 132, 97, 108, 111, 117, 115, 0, 17, 8, 6, 17, 18, 6, 0, 133,
115, 101, 110, 115, 117, 115, 0, 68, 158, 17, 8, 188, 17, 10, 217, 17, 11,
227, 17, 12, 25, 18, 15, 36, 18, 16, 47, 18, 17, 59, 18, 18, 151, 19, 19, 189,
19, 22, 217, 19, 24, 107, 20, 0, 85, 165, 17, 26, 176, 17, 0, 8, 19, 8, 22, 0,
131, 97, 114, 97, 116, 0, 11, 8, 16, 18, 22, 0, 131, 119, 104, 97, 116, 0, 68,
195, 17, 17, 204, 17, 0, 21, 10, 44, 0, 130, 101, 97, 116, 0, 16, 17, 21, 8,
25, 18, 10, 0, 130, 101, 110, 116, 0, 11, 24, 4, 6, 0, 130, 103, 104, 116, 0,
71, 237, 17, 10, 244, 17, 12, 14, 18, 0, 12, 26, 0, 129, 116, 104, 0, 81, 251,
17, 24, 2, 18, 0, 8, 15, 0, 129, 116, 104, 0, 18, 21, 11, 23, 0, 133, 111,
117, 103, 104, 116, 0, 10, 17, 18, 23, 0, 131, 105, 103, 104, 116, 0, 23, 24,
18, 5, 4, 0, 129, 32, 105, 116, 0, 22, 24, 8, 21, 0, 131, 115, 117, 108, 116,
0, 4, 23, 21, 18, 19, 16, 12, 0, 129, 110, 116, 0, 68, 72, 18, 8, 128, 18, 21,
132, 19, 22, 143, 19, 0, 76, 85, 18, 17, 96, 18, 21, 107, 18, 23, 117, 18, 0,
19, 12, 6, 8, 21, 0, 130, 101, 110, 116, 0, 12, 16, 18, 21, 19, 0, 130, 101,
110, 116, 0, 4, 19, 19, 4, 0, 130, 101, 110, 116, 0, 8, 19, 16, 18, 6, 0, 130,
101, 110, 116, 0, 76, 144, 18, 16, 177, 18, 21, 21, 19, 25, 111, 19, 29, 121,
19, 0, 70, 151, 18, 19, 164, 18, 0, 8, 9, 9, 8, 0, 133, 105, 99, 105, 101,
110, 116, 0, 8, 6, 8, 21, 0, 133, 105, 112, 105, 101, 110, 116, 0, 72, 190,
18, 17, 202, 18, 21, 235, 18, 23, 10, 19, 0, 25, 18, 10, 0, 131, 114, 110,
109, 101, 110, 116, 0, 72, 209, 18, 21, 221, 18, 0, 25, 18, 10, 0, 132, 114,
110, 109, 101, 110, 116, 0, 18, 25, 18, 10, 0, 134, 101, 114, 110, 109, 101,
110, 116, 0, 72, 242, 18, 18, 253, 18, 0, 25, 18, 10, 0, 131, 110, 109, 101,
110, 116, 0, 25, 18, 10, 0, 133, 101, 114, 110, 109, 101, 110, 116, 0, 4, 23,
22, 0, 131, 101, 109, 101, 110, 116, 0, 68, 34, 19, 8, 45, 19, 9, 57, 19, 21,
68, 19, 0, 19, 4, 0, 132, 112, 97, 114, 101, 110, 116, 0, 9, 12, 7, 0, 132,
102, 101, 114, 101, 110, 116, 0, 9, 12, 7, 0, 131, 101, 114, 101, 110, 116, 0,
68, 75, 19, 8, 99, 19, 0, 19, 0, 68, 84, 19, 19, 92, 19, 0, 133, 112, 97, 114,
101, 110, 116, 0, 4, 0, 131, 101, 110, 116, 0, 9, 12, 7, 0, 133, 102, 101,
114, 101, 110, 116, 0, 8, 15, 8, 21, 0, 130, 97, 110, 116, 0, 12, 17, 10, 18,
6, 0, 130, 97, 110, 116, 0, 8, 9, 9, 12, 7, 0, 129, 101, 110, 116, 0, 18, 6,
0, 130, 110, 115, 116, 0, 81, 161, 19, 21, 171, 19, 22, 180, 19, 0, 7, 12, 7,
0, 130, 32, 110, 111, 116, 0, 19, 8, 21, 0, 130, 111, 114, 116, 0, 16, 15, 4,
0, 130, 111, 115, 116, 0, 72, 196, 19, 28, 207, 19, 0, 12, 6, 8, 21, 0, 131,
101, 105, 112, 116, 0, 6, 17, 8, 0, 130, 114, 121, 112, 116, 0, 72, 236, 19,
10, 21, 20, 12, 30, 20, 16, 59, 20, 17, 69, 20, 24, 96, 20, 0, 74, 243, 19,
21, 10, 20, 0, 76, 250, 19, 24, 2, 20, 0, 11, 0, 130, 104, 101, 115, 116, 0,
22, 0, 130, 103, 101, 115, 116, 0, 23, 17, 12, 0, 131, 101, 114, 101, 115,
116, 0, 21, 4, 15, 0, 129, 101, 115, 116, 0, 73, 37, 20, 17, 49, 20, 0, 8, 17,
4, 16, 0, 132, 105, 102, 101, 115, 116, 0, 4, 10, 4, 0, 131, 105, 110, 115,
116, 0, 18, 15, 4, 0, 131, 109, 111, 115, 116, 0, 68, 76, 20, 17, 87, 20, 0,
12, 10, 4, 0, 132, 97, 105, 110, 115, 116, 0, 12, 4, 10, 4, 0, 130, 115, 116,
0, 13, 4, 44, 0, 131, 100, 106, 117, 115, 116, 0, 70, 120, 20, 18, 144, 20,
19, 168, 20, 23, 191, 20, 0, 72, 127, 20, 21, 137, 20, 0, 6, 27, 8, 0, 132,
101, 99, 117, 116, 0, 12, 6, 0, 128, 105, 116, 0, 68, 151, 20, 5, 160, 20, 0,
5, 0, 132, 97, 98, 111, 117, 116, 0, 5, 4, 0, 131, 111, 117, 116, 0, 87, 175,
20, 24, 183, 20, 0, 17, 12, 0, 131, 112, 117, 116, 0, 18, 0, 130, 116, 112,
117, 116, 0, 19, 24, 18, 0, 131, 116, 112, 117, 116, 0, 23, 18, 5, 4, 0, 129,
117, 116, 0, 72, 217, 20, 12, 253, 20, 0, 68, 224, 20, 12, 231, 20, 0, 11, 44,
0, 129, 118, 101, 0, 70, 238, 20, 8, 246, 20, 0, 8, 21, 0, 130, 101, 105, 118,
0, 6, 8, 21, 0, 129, 118, 0, 8, 11, 6, 4, 44, 0, 130, 105, 101, 118, 0, 76,
15, 21, 17, 25, 21, 0, 8, 25, 8, 21, 0, 130, 105, 101, 119, 0, 18, 14, 44, 0,
130, 110, 111, 119, 0, 70, 59, 21, 8, 118, 21, 11, 128, 21, 15, 146, 21, 17,
87, 22, 21, 114, 22, 22, 12, 23, 23, 39, 23, 0, 68, 72, 21, 8, 84, 21, 12, 95,
21, 19, 106, 21, 0, 21, 6, 18, 19, 28, 11, 0, 130, 105, 115, 121, 0, 24, 20,
8, 21, 9, 0, 129, 110, 99, 121, 0, 21, 6, 18, 19, 28, 11, 0, 129, 115, 121, 0,
24, 21, 14, 17, 4, 5, 0, 129, 116, 99, 121, 0, 23, 9, 4, 22, 0, 130, 101, 116,
121, 0, 6, 21, 4, 21, 12, 8, 11, 0, 135, 105, 101, 114, 97, 114, 99, 104, 121,
0, 68, 165, 21, 11, 232, 21, 14, 242, 21, 15, 250, 21, 18, 66, 22, 21, 76, 22,
0, 69, 184, 21, 8, 193, 21, 15, 199, 21, 17, 208, 21, 21, 215, 21, 24, 224,
21, 0, 18, 21, 19, 0, 129, 98, 108, 121, 0, 21, 0, 128, 108, 121, 0, 8, 21, 0,
131, 97, 108, 108, 121, 0, 12, 9, 0, 128, 108, 121, 0, 8, 17, 8, 10, 0, 128,
108, 121, 0, 23, 6, 4, 0, 128, 108, 121, 0, 10, 12, 15, 22, 0, 129, 116, 108,
121, 0, 12, 15, 0, 129, 101, 108, 121, 0, 68, 4, 22, 5, 47, 22, 8, 56, 22, 0,
86, 11, 22, 23, 35, 22, 0, 24, 0, 108, 20, 22, 22, 27, 22, 0, 131, 117, 97,
108, 108, 121, 0, 24, 0, 132, 97, 108, 108, 121, 0, 24, 6, 4, 0, 133, 116,
117, 97, 108, 108, 121, 0, 4, 5, 18, 21, 19, 0, 129, 121, 0, 4, 21, 0, 132,
101, 97, 108, 108, 121, 0, 16, 18, 17, 4, 0, 130, 97, 108, 121, 0, 4, 16, 12,
21, 19, 0, 129, 105, 108, 121, 0, 72, 94, 22, 19, 103, 22, 0, 18, 16, 44, 0,
130, 110, 101, 121, 0, 4, 16, 18, 6, 0, 131, 112, 97, 110, 121, 0, 68, 127,
22, 8, 231, 22, 18, 240, 22, 23, 253, 22, 0, 69, 143, 22, 12, 152, 22, 15,
165, 22, 16, 193, 22, 22, 202, 22, 0, 12, 15, 0, 130, 114, 97, 114, 121, 0,
15, 15, 12, 27, 24, 4, 0, 132, 105, 97, 114, 121, 0, 76, 172, 22, 15, 182, 22,
0, 27, 24, 4, 0, 130, 105, 97, 114, 121, 0, 12, 27, 24, 4, 0, 131, 105, 97,
114, 121, 0, 24, 22, 0, 130, 109, 97, 114, 121, 0, 8, 6, 0, 70, 212, 22, 8,
223, 22, 0, 8, 17, 0, 133, 101, 115, 115, 97, 114, 121, 0, 17, 0, 130, 115,
97, 114, 121, 0, 19, 18, 21, 19, 0, 128, 116, 121, 0, 10, 4, 23, 4, 6, 0, 132,
101, 103, 111, 114, 121, 0, 17, 24, 6, 18, 44, 0, 134, 99, 111, 117, 110, 116,
114, 121, 0, 4, 0, 85, 21, 23, 26, 32, 23, 0, 6, 18, 19, 28, 11, 0, 130, 105,
115, 121, 0, 15, 4, 0, 129, 121, 115, 0, 73, 49, 23, 15, 57, 23, 21, 66, 23,
0, 4, 22, 0, 129, 101, 116, 121, 0, 12, 5, 4, 0, 129, 105, 116, 121, 0, 19, 8,
18, 21, 19, 0, 132, 112, 101, 114, 116, 121, 0};

View File

@ -0,0 +1,722 @@
// Generated code.
// Autocorrection dictionary (400 entries):
// :acheiv -> achiev
// :agian -> again
// :agred -> agreed
// :ajust -> adjust
// :alot: -> a lot
// :andteh -> and the
// :andthe -> and the
// :anual -> annual
// :asign -> assign
// :aslo: -> also
// :asthe -> as the
// :atthe -> at the
// :casue -> cause
// :choses -> chooses
// :eveyr -> every
// :foudn -> found
// :gaurd -> guard
// :goign -> going
// :gonig -> going
// :graet -> great
// :grammer -> grammar
// :guage -> gauge
// :haev -> have
// :hapen -> happen
// :htere -> there
// :htikn -> think
// :htink -> think
// :hwihc -> which
// :hwile -> while
// :idaes -> ideas
// :jstu: -> just
// :jsut: -> just
// :knwo -> know
// :konw -> know
// :kwno -> know
// :moeny -> money
// :ocuntry -> country
// :ocur -> occur
// :olther -> other
// :otehr -> other
// :owudl -> would
// :rference -> reference
// :sicne -> since
// :socre -> score
// :szie -> size
// :the:the: -> the
// :theri -> their
// :thier -> their
// :thsoe -> those
// :tothe -> to the
// :ture -> true
// :turth -> truth
// :uesd: -> used
// :usally -> usually
// :yaers -> years
// :yeasr -> years
// abbout -> about
// aberation -> aberration
// abilties -> abilities
// abilty -> ability
// abotu -> about
// abouta -> about a
// aboutit -> about it
// aboutthe -> about the
// abvove -> above
// accesories -> accessories
// accomodate -> accommodate
// accross -> across
// acommodate -> accommodate
// acomplish -> accomplish
// actualy -> actually
// acurate -> accurate
// acutally -> actually
// addtion -> addition
// adviced -> advised
// againnst -> against
// aganist -> against
// aggreed -> agreed
// agianst -> against
// ahppn -> happen
// aledge -> allege
// alledge -> allege
// allign -> align
// almsot -> almost
// alomst -> almost
// alwasy -> always
// alwyas -> always
// amature -> amateur
// anohter -> another
// anomolous -> anomalous
// anomoly -> anomaly
// anytying -> anything
// aparent -> apparent
// aparrent -> apparent
// apparant -> apparent
// apparrent -> apparent
// aquire -> acquire
// aroud -> around
// arround -> around
// arund -> around
// asthetic -> aesthetic
// auxilary -> auxiliary
// auxillary -> auxiliary
// auxilliary -> auxiliary
// availabe -> available
// availaible -> available
// availalbe -> available
// availble -> available
// availiable -> available
// avalable -> available
// avaliable -> available
// avilable -> available
// baceause -> because
// bandwith -> bandwidth
// bankrupcy -> bankruptcy
// baout -> about
// beacuse -> because
// becasue -> because
// beccause -> because
// becouse -> because
// becuase -> because
// bedore -> before
// beeing -> being
// befoer -> before
// begginer -> beginner
// beleif -> belief
// beleive -> believe
// belive -> believe
// beteen -> between
// beween -> between
// bewteen -> between
// breif -> brief
// burried -> buried
// busness -> business
// bussiness -> business
// cacheing -> caching
// calander -> calendar
// caluclate -> calculate
// caluculate -> calculate
// calulate -> calculate
// catagory -> category
// cauhgt -> caught
// ceratin -> certain
// certian -> certain
// cheif -> chief
// chekc -> check
// childen -> children
// chnage -> change
// choosen -> chosen
// cieling -> ceiling
// circut -> circuit
// claer -> clear
// clasic -> classic
// cmoputer -> computer
// coform -> conform
// cognizent -> cognizant
// collegue -> colleague
// comapny -> company
// comittee -> committee
// comming: -> coming
// commitee -> committee
// competance -> competence
// competant -> competent
// complier -> compiler
// concensus -> consensus
// considerd -> considered
// contian -> contain
// copywrite: -> copyright
// cosnt -> const
// coudl -> could
// dervied -> derived
// desicion -> decision
// didnot -> did not
// diferent -> different
// diferrent -> different
// differnt -> different
// diffrent -> different
// divison -> division
// doulbe -> double
// dyanmic -> dynamic
// effecient -> efficient
// elasped -> elapsed
// eligable -> eligible
// elpased -> elapsed
// embarass -> embarrass
// embeded -> embedded
// encypt -> encrypt
// excecut -> execut
// excercise -> exercise
// failse -> false
// fales -> false
// fasle -> false
// feild -> field
// finaly -> finally
// firend -> friend
// firts -> first
// fitler -> filter
// flase -> false
// follwo -> follow
// foriegn -> foreign
// foward -> forward
// fraciton -> fraction
// freind -> friend
// frequecy -> frequency
// fromthe -> from the
// fucntion -> function
// fufill -> fulfill
// fullfill -> fulfill
// futher -> further
// ganerate -> generate
// garantee -> guarantee
// gaurantee -> guarantee
// generaly -> generally
// govement -> government
// govenment -> government
// goverment -> government
// governmnet -> government
// govorment -> government
// govornment -> government
// greatful -> grateful
// guaratee -> guarantee
// heigher -> higher
// heigth -> height
// heirarchy -> hierarchy
// higest -> highest
// howver -> however
// hydogen -> hydrogen
// hygeine -> hygiene
// hypocracy -> hypocrisy
// hypocrasy -> hypocrisy
// hypocricy -> hypocrisy
// hypocrit: -> hypocrite
// iamge -> image
// importamt -> important
// inclued -> include
// indeces -> indices
// indecies -> indices
// indicies -> indices
// inital -> initial
// insted -> instead
// interator -> iterator
// intput -> input
// intrest -> interest
// invliad -> invalid
// laguage -> language
// largst -> largest
// learnign -> learning
// lenght -> length
// levle -> level
// liasion -> liaison
// libary -> library
// likly -> likely
// lisense -> license
// listner -> listener
// littel -> little
// looses: -> loses
// looup -> lookup
// macthing -> matching
// maintence -> maintenance
// manefist -> manifest
// mesage -> message
// morgage -> mortgage
// mysefl -> myself
// namesapce -> namespace
// namespcae -> namespace
// naturual -> natural
// neccesary -> necessary
// necesary -> necessary
// nulltpr -> nullptr
// occassion -> occasion
// occured -> occurred
// operaotr -> operator
// ouptut -> output
// ouput -> output
// overide -> override
// ovveride -> override
// pallete -> palette
// paralel -> parallel
// parralel -> parallel
// parrallel -> parallel
// particualr -> particular
// paticular -> particular
// peaple -> people
// peice -> piece
// peolpe -> people
// peopel -> people
// perhasp -> perhaps
// perheaps -> perhaps
// perhpas -> perhaps
// perphas -> perhaps
// persue -> pursue
// poeople -> people
// poeple -> people
// poitner -> pointer
// posess -> possess
// postion -> position
// preiod -> period
// primarly -> primarily
// priviledge -> privilege
// privte -> private
// probablly -> probably
// probaly -> probably
// probelm -> problem
// proccess -> process
// proeprty -> property
// prominant -> prominent
// proove -> prove
// propery -> property
// propogate -> propagate
// psuedo -> pseudo
// raelly -> really
// realtion -> relation
// realy -> really
// reasearch -> research
// receiev -> receiv
// recepient -> recipient
// reciept -> receipt
// reciev -> receiv
// recipiant -> recipient
// recrod -> record
// recuring -> recurring
// referece -> reference
// refered -> referred
// regluar -> regular
// relaly -> really
// releated -> related
// relevent -> relevant
// repitition -> repetition
// reponse -> response
// reprot -> report
// resutl -> result
// retrun -> return
// retun -> return
// reuslt -> result
// reutrn -> return
// reveiw -> review
// saftey -> safety
// safty -> safety
// satisifed -> satisfied
// scheduel -> schedule
// seperat -> separat
// sequnce -> sequence
// shoudl -> should
// similiar -> similar
// simmilar -> similar
// singed -> signed
// singel -> single
// slighly -> slightly
// somehwat -> somewhat
// spectogram -> spectrogram
// statment -> statement
// stirng -> string
// stregth -> strength
// strengh -> strength
// strign -> string
// succsess -> success
// sucess -> success
// sugest -> suggest
// sumary -> summary
// supress -> suppress
// surpress -> suppress
// swithc -> switch
// swtich -> switch
// symetric -> symmetric
// teamplate -> template
// tempalte -> template
// theese -> these
// therfore -> therefore
// thign -> thing
// thigsn -> things
// thikn -> think
// thiunk -> think
// thnigs -> things
// thresold -> threshold
// throught -> thought
// tihkn -> think
// tkaes -> takes
// todya -> today
// toghether -> together
// tolerence -> tolerance
// tongiht -> tonight
// tranpose -> transpose
// typcial -> typical
// udpate -> update
// unkown -> unknown
// unqiue -> unique
// ususally -> usually
// verticies -> vertices
// virutal -> virtual
// vitual -> virtual
// whcih -> which
// whereever -> wherever
// wherre -> where
// whihc -> which
// whlch -> which
// widht -> width
// wierd -> weird
// wihch -> which
// woudl -> would
// yeild -> yield
#define AUTOCORRECTION_MIN_LENGTH 5 // "abotu"
#define AUTOCORRECTION_MAX_LENGTH 10 // "auxilliary"
static const uint8_t autocorrection_data[5967] PROGMEM = {108, 67, 0, 4, 212, 0,
6, 236, 0, 7, 100, 1, 8, 15, 3, 9, 169, 8, 10, 204, 8, 11, 68, 9, 12, 246, 9,
14, 0, 10, 15, 28, 10, 16, 79, 11, 17, 129, 11, 18, 175, 13, 19, 227, 13, 21,
253, 13, 22, 194, 15, 23, 121, 17, 24, 201, 20, 25, 210, 20, 26, 8, 21, 28,
34, 21, 0, 71, 89, 0, 8, 99, 0, 10, 130, 0, 18, 142, 0, 22, 152, 0, 23, 163,
0, 24, 202, 0, 0, 22, 8, 24, 44, 0, 131, 115, 101, 100, 0, 75, 106, 0, 23,
115, 0, 0, 23, 44, 8, 11, 23, 44, 0, 132, 0, 12, 21, 26, 28, 19, 18, 6, 0,
133, 114, 105, 103, 104, 116, 0, 17, 12, 16, 16, 18, 6, 0, 132, 105, 110, 103,
0, 15, 22, 4, 44, 0, 131, 108, 115, 111, 0, 8, 22, 18, 18, 15, 0, 132, 115,
101, 115, 0, 76, 173, 0, 18, 183, 0, 24, 193, 0, 0, 21, 6, 18, 19, 28, 11, 0,
128, 101, 0, 15, 4, 44, 0, 131, 32, 108, 111, 116, 0, 22, 13, 44, 0, 131, 117,
115, 116, 0, 23, 22, 13, 44, 0, 131, 117, 115, 116, 0, 87, 219, 0, 28, 228, 0,
0, 24, 18, 5, 4, 0, 128, 32, 97, 0, 7, 18, 23, 0, 129, 97, 121, 0, 75, 246, 0,
12, 28, 1, 14, 92, 1, 0, 76, 253, 0, 23, 20, 1, 0, 75, 4, 1, 26, 10, 1, 0, 26,
0, 129, 99, 104, 0, 11, 44, 0, 132, 119, 104, 105, 99, 104, 0, 12, 26, 22, 0,
129, 99, 104, 0, 80, 41, 1, 21, 53, 1, 22, 67, 1, 23, 76, 1, 0, 17, 4, 28, 7,
0, 132, 110, 97, 109, 105, 99, 0, 23, 8, 16, 28, 22, 0, 132, 109, 101, 116,
114, 105, 99, 0, 4, 15, 6, 0, 129, 115, 105, 99, 0, 8, 11, 23, 22, 4, 0, 134,
101, 115, 116, 104, 101, 116, 105, 99, 0, 8, 11, 6, 0, 129, 99, 107, 0, 68,
122, 1, 8, 134, 1, 15, 84, 2, 17, 124, 2, 18, 180, 2, 21, 207, 2, 24, 7, 3, 0,
12, 15, 25, 17, 12, 0, 131, 97, 108, 105, 100, 0, 70, 168, 1, 7, 178, 1, 8,
188, 1, 9, 199, 1, 10, 212, 1, 12, 222, 1, 19, 248, 1, 21, 3, 2, 22, 38, 2,
23, 50, 2, 24, 75, 2, 0, 12, 25, 7, 4, 0, 130, 115, 101, 100, 0, 8, 5, 16, 8,
0, 129, 100, 101, 100, 0, 21, 10, 10, 4, 0, 132, 114, 101, 101, 100, 0, 12,
22, 12, 23, 4, 22, 0, 131, 102, 105, 101, 100, 0, 17, 12, 22, 0, 131, 103,
110, 101, 100, 0, 85, 229, 1, 25, 238, 1, 0, 21, 24, 5, 0, 131, 105, 101, 100,
0, 21, 8, 7, 0, 131, 105, 118, 101, 100, 0, 22, 4, 15, 8, 0, 131, 112, 115,
101, 100, 0, 72, 13, 2, 10, 22, 2, 24, 29, 2, 0, 9, 8, 21, 0, 129, 114, 101,
100, 0, 4, 44, 0, 128, 101, 100, 0, 6, 6, 18, 0, 129, 114, 101, 100, 0, 4, 19,
15, 8, 0, 132, 97, 112, 115, 101, 100, 0, 68, 57, 2, 22, 68, 2, 0, 8, 15, 8,
21, 0, 132, 97, 116, 101, 100, 0, 17, 12, 0, 128, 97, 100, 0, 15, 6, 17, 12,
0, 129, 100, 101, 0, 76, 91, 2, 18, 112, 2, 0, 8, 0, 73, 100, 2, 28, 106, 2,
0, 131, 105, 101, 108, 100, 0, 131, 105, 101, 108, 100, 0, 22, 8, 21, 11, 23,
0, 130, 104, 111, 108, 100, 0, 72, 134, 2, 12, 145, 2, 24, 155, 2, 0, 21, 12,
9, 0, 132, 114, 105, 101, 110, 100, 0, 8, 21, 9, 0, 131, 105, 101, 110, 100,
0, 82, 162, 2, 21, 172, 2, 0, 21, 21, 4, 0, 132, 111, 117, 110, 100, 0, 4, 0,
130, 111, 117, 110, 100, 0, 76, 187, 2, 21, 198, 2, 0, 8, 21, 19, 0, 132, 101,
114, 105, 111, 100, 0, 6, 8, 21, 0, 130, 111, 114, 100, 0, 68, 217, 2, 8, 228,
2, 24, 253, 2, 0, 26, 18, 9, 0, 131, 114, 119, 97, 114, 100, 0, 71, 235, 2,
12, 245, 2, 0, 12, 22, 17, 18, 6, 0, 128, 101, 100, 0, 26, 0, 131, 101, 105,
114, 100, 0, 4, 10, 44, 0, 131, 117, 97, 114, 100, 0, 18, 21, 4, 0, 128, 110,
100, 0, 68, 67, 3, 5, 80, 3, 6, 123, 3, 7, 251, 3, 8, 23, 4, 10, 107, 4, 11,
227, 4, 12, 52, 5, 15, 61, 5, 17, 0, 6, 18, 27, 6, 19, 37, 6, 21, 47, 6, 22,
156, 6, 23, 82, 7, 24, 45, 8, 25, 115, 8, 0, 6, 19, 22, 8, 16, 4, 17, 0, 130,
97, 99, 101, 0, 68, 87, 3, 15, 97, 3, 0, 15, 12, 4, 25, 4, 0, 128, 108, 101,
0, 68, 104, 3, 24, 115, 3, 0, 15, 12, 4, 25, 4, 0, 130, 98, 108, 101, 0, 18,
7, 0, 130, 98, 108, 101, 0, 72, 136, 3, 12, 147, 3, 17, 156, 3, 19, 238, 3, 0,
21, 8, 9, 8, 21, 0, 129, 110, 99, 101, 0, 8, 19, 0, 131, 105, 101, 99, 101, 0,
68, 166, 3, 8, 179, 3, 24, 228, 3, 0, 23, 8, 19, 16, 18, 6, 0, 131, 101, 110,
99, 101, 0, 85, 186, 3, 23, 217, 3, 0, 8, 0, 73, 195, 3, 15, 208, 3, 0, 21,
44, 0, 134, 101, 102, 101, 114, 101, 110, 99, 101, 0, 18, 23, 0, 131, 97, 110,
99, 101, 0, 17, 12, 4, 16, 0, 129, 97, 110, 99, 101, 0, 20, 8, 22, 0, 130,
101, 110, 99, 101, 0, 4, 22, 8, 16, 4, 17, 0, 131, 112, 97, 99, 101, 0, 12,
21, 8, 25, 0, 82, 7, 4, 25, 13, 4, 0, 130, 114, 105, 100, 101, 0, 18, 0, 133,
101, 114, 114, 105, 100, 101, 0, 23, 0, 68, 38, 4, 12, 49, 4, 17, 59, 4, 23,
94, 4, 0, 21, 4, 24, 10, 0, 130, 110, 116, 101, 101, 0, 16, 16, 18, 6, 0, 129,
116, 101, 101, 0, 4, 21, 0, 68, 69, 4, 24, 81, 4, 0, 10, 0, 134, 117, 97, 114,
97, 110, 116, 101, 101, 0, 4, 10, 0, 135, 117, 97, 114, 97, 110, 116, 101,
101, 0, 12, 16, 18, 6, 0, 132, 109, 105, 116, 116, 101, 101, 0, 68, 117, 4, 7,
184, 4, 16, 218, 4, 0, 74, 130, 4, 17, 141, 4, 22, 150, 4, 24, 159, 4, 0, 21,
18, 16, 0, 131, 116, 103, 97, 103, 101, 0, 11, 6, 0, 131, 97, 110, 103, 101,
0, 8, 16, 0, 130, 115, 97, 103, 101, 0, 10, 0, 108, 168, 4, 4, 174, 4, 0, 131,
97, 117, 103, 101, 0, 15, 0, 132, 110, 103, 117, 97, 103, 101, 0, 8, 15, 0,
68, 197, 4, 12, 203, 4, 15, 212, 4, 0, 131, 108, 101, 103, 101, 0, 25, 12, 21,
19, 0, 130, 103, 101, 0, 4, 0, 130, 103, 101, 0, 4, 12, 0, 131, 109, 97, 103,
101, 0, 23, 0, 71, 245, 4, 16, 255, 4, 18, 9, 5, 22, 18, 5, 23, 27, 5, 0, 17,
4, 44, 0, 130, 32, 116, 104, 101, 0, 18, 21, 9, 0, 130, 32, 116, 104, 101, 0,
23, 44, 0, 130, 32, 116, 104, 101, 0, 4, 44, 0, 130, 32, 116, 104, 101, 0, 68,
34, 5, 24, 42, 5, 0, 44, 0, 130, 32, 116, 104, 101, 0, 18, 5, 4, 0, 130, 32,
116, 104, 101, 0, 29, 22, 44, 0, 130, 105, 122, 101, 0, 69, 77, 5, 12, 190, 5,
19, 201, 5, 22, 241, 5, 25, 249, 5, 0, 68, 87, 5, 12, 167, 5, 15, 179, 5, 0,
74, 97, 5, 12, 107, 5, 15, 137, 5, 0, 12, 15, 8, 0, 131, 105, 98, 108, 101, 0,
15, 0, 68, 116, 5, 12, 127, 5, 0, 25, 4, 0, 133, 105, 108, 97, 98, 108, 101,
0, 4, 25, 4, 0, 132, 97, 98, 108, 101, 0, 68, 144, 5, 12, 155, 5, 0, 25, 4, 0,
132, 105, 108, 97, 98, 108, 101, 0, 25, 4, 0, 133, 97, 105, 108, 97, 98, 108,
101, 0, 4, 15, 12, 4, 25, 4, 0, 131, 98, 108, 101, 0, 12, 4, 25, 4, 0, 130,
97, 98, 108, 101, 0, 26, 11, 44, 0, 132, 119, 104, 105, 108, 101, 0, 68, 211,
5, 8, 220, 5, 18, 230, 5, 0, 8, 19, 0, 131, 111, 112, 108, 101, 0, 18, 19, 0,
132, 101, 111, 112, 108, 101, 0, 8, 18, 19, 0, 133, 101, 111, 112, 108, 101,
0, 4, 9, 0, 130, 108, 115, 101, 0, 8, 15, 0, 129, 101, 108, 0, 70, 7, 6, 12,
16, 6, 0, 12, 22, 44, 0, 130, 110, 99, 101, 0, 8, 10, 28, 11, 0, 131, 105,
101, 110, 101, 0, 22, 11, 23, 44, 0, 130, 111, 115, 101, 0, 15, 18, 8, 19, 0,
130, 112, 108, 101, 0, 70, 66, 6, 8, 76, 6, 12, 87, 6, 18, 99, 6, 21, 127, 6,
24, 134, 6, 0, 18, 22, 44, 0, 131, 99, 111, 114, 101, 0, 23, 11, 44, 0, 132,
116, 104, 101, 114, 101, 0, 24, 20, 4, 0, 132, 99, 113, 117, 105, 114, 101, 0,
71, 106, 6, 9, 115, 6, 0, 8, 5, 0, 131, 102, 111, 114, 101, 0, 21, 8, 11, 23,
0, 131, 101, 102, 111, 114, 101, 0, 8, 11, 26, 0, 129, 101, 0, 23, 0, 108,
143, 6, 4, 148, 6, 0, 130, 114, 117, 101, 0, 16, 4, 0, 130, 101, 117, 114, 0,
68, 178, 6, 8, 203, 6, 12, 211, 6, 15, 226, 6, 17, 235, 6, 18, 9, 7, 24, 22,
7, 0, 79, 185, 6, 24, 193, 6, 0, 9, 0, 131, 97, 108, 115, 101, 0, 6, 8, 5, 0,
131, 97, 117, 115, 101, 0, 8, 11, 23, 0, 130, 115, 101, 0, 6, 21, 8, 6, 27, 8,
0, 134, 101, 114, 99, 105, 115, 101, 0, 12, 4, 9, 0, 131, 108, 115, 101, 0,
72, 242, 6, 18, 253, 6, 0, 22, 12, 15, 0, 132, 99, 101, 110, 115, 101, 0, 19,
8, 21, 0, 132, 115, 112, 111, 110, 115, 101, 0, 19, 17, 4, 21, 23, 0, 131,
115, 112, 111, 115, 101, 0, 68, 32, 7, 6, 61, 7, 18, 72, 7, 0, 70, 39, 7, 8,
49, 7, 0, 6, 8, 5, 0, 132, 97, 117, 115, 101, 0, 6, 4, 5, 0, 134, 101, 99, 97,
117, 115, 101, 0, 4, 8, 5, 0, 132, 99, 97, 117, 115, 101, 0, 6, 8, 5, 0, 131,
97, 117, 115, 101, 0, 68, 95, 7, 8, 13, 8, 15, 24, 8, 25, 36, 8, 0, 71, 111,
7, 10, 148, 7, 15, 161, 7, 19, 228, 7, 21, 238, 7, 0, 18, 16, 0, 80, 121, 7,
18, 136, 7, 0, 18, 6, 4, 0, 135, 99, 111, 109, 109, 111, 100, 97, 116, 101, 0,
6, 6, 4, 0, 132, 109, 111, 100, 97, 116, 101, 0, 18, 19, 18, 21, 19, 0, 132,
97, 103, 97, 116, 101, 0, 70, 171, 7, 19, 184, 7, 24, 197, 7, 0, 24, 15, 4, 6,
0, 133, 99, 117, 108, 97, 116, 101, 0, 16, 4, 8, 23, 0, 134, 109, 112, 108,
97, 116, 101, 0, 70, 204, 7, 15, 217, 7, 0, 24, 15, 4, 6, 0, 134, 99, 117,
108, 97, 116, 101, 0, 4, 6, 0, 132, 99, 117, 108, 97, 116, 101, 0, 7, 24, 0,
132, 112, 100, 97, 116, 101, 0, 72, 245, 7, 24, 2, 8, 0, 17, 4, 10, 0, 134,
101, 110, 101, 114, 97, 116, 101, 0, 6, 4, 0, 132, 99, 117, 114, 97, 116, 101,
0, 15, 15, 4, 19, 0, 131, 101, 116, 116, 101, 0, 4, 19, 16, 8, 23, 0, 131,
108, 97, 116, 101, 0, 12, 21, 19, 0, 129, 97, 116, 101, 0, 74, 55, 8, 12, 67,
8, 22, 77, 8, 0, 8, 15, 15, 18, 6, 0, 130, 97, 103, 117, 101, 0, 20, 17, 24,
0, 131, 105, 113, 117, 101, 0, 68, 84, 8, 21, 105, 8, 0, 6, 0, 108, 93, 8, 8,
98, 8, 0, 130, 117, 115, 101, 0, 5, 0, 130, 117, 115, 101, 0, 8, 19, 0, 132,
117, 114, 115, 117, 101, 0, 76, 122, 8, 18, 147, 8, 0, 72, 129, 8, 15, 139, 8,
0, 15, 8, 5, 0, 131, 105, 101, 118, 101, 0, 8, 5, 0, 129, 101, 118, 101, 0,
82, 154, 8, 25, 161, 8, 0, 21, 19, 0, 130, 118, 101, 0, 5, 4, 0, 131, 111,
118, 101, 0, 12, 8, 0, 75, 182, 8, 15, 189, 8, 21, 197, 8, 0, 6, 0, 130, 105,
101, 102, 0, 8, 5, 0, 130, 105, 101, 102, 0, 5, 0, 130, 105, 101, 102, 0, 76,
211, 8, 17, 221, 8, 0, 17, 18, 10, 44, 0, 130, 105, 110, 103, 0, 76, 228, 8,
21, 58, 9, 0, 72, 244, 8, 11, 11, 9, 15, 24, 9, 21, 36, 9, 28, 47, 9, 0, 72,
251, 8, 11, 2, 9, 0, 5, 0, 131, 105, 110, 103, 0, 6, 4, 6, 0, 131, 105, 110,
103, 0, 23, 6, 4, 16, 0, 133, 116, 99, 104, 105, 110, 103, 0, 8, 12, 6, 0,
133, 101, 105, 108, 105, 110, 103, 0, 24, 6, 8, 21, 0, 130, 114, 105, 110,
103, 0, 23, 28, 17, 4, 0, 131, 104, 105, 110, 103, 0, 12, 23, 22, 0, 131, 114,
105, 110, 103, 0, 70, 87, 9, 8, 142, 9, 10, 154, 9, 12, 164, 9, 22, 173, 9,
23, 191, 9, 0, 75, 100, 9, 12, 109, 9, 15, 119, 9, 21, 127, 9, 0, 12, 26, 0,
131, 104, 105, 99, 104, 0, 23, 26, 22, 0, 131, 105, 116, 99, 104, 0, 11, 26,
0, 130, 105, 99, 104, 0, 4, 8, 22, 4, 8, 21, 0, 134, 115, 101, 97, 114, 99,
104, 0, 23, 7, 17, 4, 44, 0, 130, 32, 116, 104, 101, 0, 17, 8, 21, 23, 22, 0,
128, 116, 104, 0, 6, 11, 26, 0, 130, 105, 99, 104, 0, 12, 15, 19, 16, 18, 6,
4, 0, 134, 99, 111, 109, 112, 108, 105, 115, 104, 0, 74, 201, 9, 12, 225, 9,
21, 236, 9, 0, 72, 208, 9, 12, 218, 9, 0, 21, 23, 22, 0, 130, 110, 103, 116,
104, 0, 8, 11, 0, 129, 104, 116, 0, 26, 7, 17, 4, 5, 0, 129, 100, 116, 104, 0,
24, 23, 44, 0, 131, 114, 117, 116, 104, 0, 21, 8, 11, 23, 44, 0, 129, 105,
114, 0, 17, 0, 76, 9, 10, 24, 20, 10, 0, 23, 11, 44, 0, 132, 116, 104, 105,
110, 107, 0, 12, 11, 23, 0, 130, 110, 107, 0, 68, 50, 10, 7, 134, 10, 8, 177,
10, 9, 17, 11, 15, 26, 11, 23, 55, 11, 24, 64, 11, 0, 76, 60, 10, 23, 71, 10,
24, 96, 10, 0, 6, 19, 28, 23, 0, 131, 105, 99, 97, 108, 0, 76, 78, 10, 24, 86,
10, 0, 17, 12, 0, 129, 105, 97, 108, 0, 21, 12, 25, 0, 131, 116, 117, 97, 108,
0, 81, 106, 10, 21, 115, 10, 23, 124, 10, 0, 4, 44, 0, 130, 110, 117, 97, 108,
0, 24, 23, 4, 17, 0, 130, 97, 108, 0, 12, 25, 0, 131, 114, 116, 117, 97, 108,
0, 24, 0, 82, 143, 10, 26, 167, 10, 0, 70, 153, 10, 11, 157, 10, 26, 163, 10,
0, 129, 108, 100, 0, 22, 0, 129, 108, 100, 0, 129, 108, 100, 0, 18, 44, 0,
132, 119, 111, 117, 108, 100, 0, 74, 193, 10, 15, 201, 10, 19, 247, 10, 23,
255, 10, 24, 7, 11, 0, 17, 12, 22, 0, 129, 108, 101, 0, 68, 208, 10, 15, 234,
10, 0, 21, 0, 68, 217, 10, 21, 224, 10, 0, 19, 0, 129, 108, 101, 108, 0, 4,
19, 0, 132, 97, 108, 108, 101, 108, 0, 4, 21, 21, 4, 19, 0, 133, 97, 108, 108,
101, 108, 0, 18, 8, 19, 0, 129, 108, 101, 0, 23, 12, 15, 0, 129, 108, 101, 0,
7, 8, 11, 6, 22, 0, 129, 108, 101, 0, 8, 22, 28, 16, 0, 129, 108, 102, 0, 12,
9, 0, 79, 36, 11, 24, 46, 11, 0, 15, 24, 9, 0, 132, 102, 105, 108, 108, 0, 9,
0, 131, 108, 102, 105, 108, 108, 0, 24, 22, 8, 21, 0, 129, 108, 116, 0, 9, 23,
4, 8, 21, 10, 0, 133, 97, 116, 101, 102, 117, 108, 0, 68, 89, 11, 15, 106, 11,
21, 117, 11, 0, 21, 10, 18, 23, 6, 8, 19, 22, 0, 132, 114, 111, 103, 114, 97,
109, 0, 8, 5, 18, 21, 19, 0, 130, 108, 101, 109, 0, 18, 9, 18, 6, 0, 131, 110,
102, 111, 114, 109, 0, 68, 166, 11, 7, 206, 11, 8, 215, 11, 10, 58, 12, 12,
141, 12, 14, 153, 12, 18, 192, 12, 19, 108, 13, 21, 120, 13, 22, 131, 13, 24,
141, 13, 26, 164, 13, 0, 12, 0, 74, 175, 11, 23, 183, 11, 0, 4, 44, 0, 130,
97, 105, 110, 0, 81, 190, 11, 21, 198, 11, 0, 18, 6, 0, 130, 97, 105, 110, 0,
8, 6, 0, 130, 97, 105, 110, 0, 24, 18, 9, 44, 0, 129, 110, 100, 0, 71, 231,
11, 8, 241, 11, 10, 27, 12, 19, 39, 12, 22, 48, 12, 0, 15, 12, 11, 6, 0, 129,
114, 101, 110, 0, 87, 248, 11, 26, 17, 12, 0, 72, 255, 11, 26, 7, 12, 0, 5, 0,
130, 119, 101, 101, 110, 0, 8, 5, 0, 132, 116, 119, 101, 101, 110, 0, 8, 5, 0,
131, 116, 119, 101, 101, 110, 0, 18, 7, 28, 11, 0, 131, 114, 111, 103, 101,
110, 0, 4, 11, 44, 0, 129, 112, 101, 110, 0, 18, 18, 11, 6, 0, 131, 115, 101,
110, 0, 72, 65, 12, 12, 76, 12, 0, 12, 21, 18, 9, 0, 131, 101, 105, 103, 110,
0, 75, 95, 12, 15, 101, 12, 17, 109, 12, 18, 118, 12, 21, 125, 12, 22, 132,
12, 0, 23, 0, 129, 110, 103, 0, 15, 4, 0, 131, 105, 103, 110, 0, 21, 4, 8, 15,
0, 129, 110, 103, 0, 10, 44, 0, 129, 110, 103, 0, 23, 22, 0, 129, 110, 103, 0,
4, 44, 0, 130, 115, 105, 103, 110, 0, 23, 4, 21, 8, 6, 0, 131, 116, 97, 105,
110, 0, 75, 160, 12, 12, 169, 12, 0, 12, 23, 0, 131, 104, 105, 110, 107, 0,
75, 176, 12, 23, 182, 12, 0, 23, 0, 129, 110, 107, 0, 11, 44, 0, 132, 116,
104, 105, 110, 107, 0, 76, 202, 12, 22, 86, 13, 23, 96, 13, 0, 70, 212, 12,
22, 225, 12, 23, 251, 12, 0, 12, 22, 8, 7, 0, 133, 99, 105, 115, 105, 111,
110, 0, 68, 232, 12, 22, 241, 12, 0, 12, 15, 0, 131, 105, 115, 111, 110, 0, 4,
6, 6, 18, 0, 131, 105, 111, 110, 0, 68, 14, 13, 7, 27, 13, 12, 37, 13, 15, 52,
13, 17, 64, 13, 22, 76, 13, 0, 21, 8, 5, 4, 0, 132, 114, 97, 116, 105, 111,
110, 0, 7, 4, 0, 131, 105, 116, 105, 111, 110, 0, 23, 12, 19, 8, 21, 0, 134,
101, 116, 105, 116, 105, 111, 110, 0, 4, 8, 21, 0, 133, 108, 97, 116, 105,
111, 110, 0, 6, 24, 9, 0, 133, 110, 99, 116, 105, 111, 110, 0, 18, 19, 0, 131,
105, 116, 105, 111, 110, 0, 12, 25, 12, 7, 0, 129, 105, 111, 110, 0, 12, 6, 4,
21, 9, 0, 131, 116, 105, 111, 110, 0, 19, 11, 4, 0, 132, 104, 97, 112, 112,
101, 110, 0, 23, 24, 8, 21, 0, 131, 116, 117, 114, 110, 0, 10, 12, 11, 23, 0,
130, 110, 103, 115, 0, 85, 148, 13, 23, 157, 13, 0, 23, 8, 21, 0, 130, 117,
114, 110, 0, 8, 21, 0, 128, 114, 110, 0, 18, 14, 17, 24, 0, 130, 110, 111,
119, 110, 0, 71, 185, 13, 17, 196, 13, 26, 205, 13, 0, 8, 24, 22, 19, 0, 131,
101, 117, 100, 111, 0, 26, 14, 44, 0, 130, 110, 111, 119, 0, 79, 212, 13, 17,
220, 13, 0, 15, 18, 9, 0, 129, 111, 119, 0, 14, 44, 0, 129, 111, 119, 0, 86,
234, 13, 24, 244, 13, 0, 4, 11, 21, 8, 19, 0, 129, 112, 115, 0, 18, 18, 15, 0,
129, 107, 117, 112, 0, 68, 28, 14, 8, 93, 14, 11, 103, 15, 15, 113, 15, 18,
127, 15, 19, 144, 15, 22, 155, 15, 23, 164, 15, 24, 176, 15, 28, 185, 15, 0,
76, 38, 14, 15, 48, 14, 24, 82, 14, 0, 15, 12, 16, 12, 22, 0, 130, 97, 114, 0,
76, 55, 14, 24, 66, 14, 0, 16, 16, 12, 22, 0, 132, 105, 108, 97, 114, 0, 6,
12, 23, 4, 19, 0, 134, 114, 116, 105, 99, 117, 108, 97, 114, 0, 15, 10, 8, 21,
0, 131, 117, 108, 97, 114, 0, 68, 124, 14, 7, 132, 14, 11, 145, 14, 12, 203,
14, 15, 229, 14, 16, 239, 14, 17, 249, 14, 18, 37, 15, 23, 45, 15, 25, 76, 15,
0, 15, 6, 0, 130, 101, 97, 114, 0, 17, 4, 15, 4, 6, 0, 132, 101, 110, 100, 97,
114, 0, 74, 152, 14, 23, 163, 14, 0, 12, 8, 11, 0, 133, 105, 103, 104, 101,
114, 0, 72, 173, 14, 15, 185, 14, 24, 194, 14, 0, 11, 10, 18, 23, 0, 133, 101,
116, 104, 101, 114, 0, 18, 44, 0, 132, 116, 104, 101, 114, 0, 9, 0, 131, 114,
116, 104, 101, 114, 0, 75, 210, 14, 15, 218, 14, 0, 23, 44, 0, 130, 101, 105,
114, 0, 19, 16, 18, 6, 0, 131, 105, 108, 101, 114, 0, 23, 12, 9, 0, 131, 108,
116, 101, 114, 0, 16, 4, 21, 10, 44, 0, 129, 97, 114, 0, 76, 0, 15, 23, 12,
15, 0, 10, 10, 8, 5, 0, 132, 105, 110, 110, 101, 114, 0, 76, 19, 15, 22, 28,
15, 0, 18, 19, 0, 131, 110, 116, 101, 114, 0, 12, 15, 0, 130, 101, 110, 101,
114, 0, 9, 8, 5, 0, 129, 114, 101, 0, 75, 52, 15, 24, 62, 15, 0, 18, 17, 4, 0,
131, 116, 104, 101, 114, 0, 19, 18, 16, 6, 0, 134, 111, 109, 112, 117, 116,
101, 114, 0, 72, 83, 15, 26, 94, 15, 0, 8, 21, 8, 11, 26, 0, 131, 118, 101,
114, 0, 18, 11, 0, 130, 101, 118, 101, 114, 0, 8, 23, 18, 44, 0, 130, 104,
101, 114, 0, 4, 24, 6, 12, 23, 21, 4, 19, 0, 130, 108, 97, 114, 0, 23, 4, 21,
8, 23, 17, 12, 0, 135, 116, 101, 114, 97, 116, 111, 114, 0, 23, 15, 15, 24,
17, 0, 130, 112, 116, 114, 0, 4, 8, 28, 44, 0, 129, 114, 115, 0, 18, 4, 21, 8,
19, 18, 0, 130, 116, 111, 114, 0, 6, 18, 44, 0, 129, 99, 117, 114, 0, 8, 25,
8, 44, 0, 129, 114, 121, 0, 68, 219, 15, 8, 3, 16, 10, 147, 16, 19, 158, 16,
21, 170, 16, 22, 181, 16, 23, 77, 17, 24, 85, 17, 0, 75, 229, 15, 19, 240, 15,
28, 250, 15, 0, 19, 21, 8, 19, 0, 131, 104, 97, 112, 115, 0, 11, 21, 8, 19, 0,
130, 97, 112, 115, 0, 26, 15, 4, 0, 130, 97, 121, 115, 0, 68, 19, 16, 6, 42,
16, 12, 53, 16, 15, 129, 16, 22, 136, 16, 0, 71, 26, 16, 14, 34, 16, 0, 12,
44, 0, 130, 101, 97, 115, 0, 23, 0, 131, 97, 107, 101, 115, 0, 8, 7, 17, 12,
0, 131, 105, 99, 101, 115, 0, 70, 63, 16, 21, 102, 16, 23, 117, 16, 0, 72, 70,
16, 12, 80, 16, 0, 7, 17, 12, 0, 132, 105, 99, 101, 115, 0, 71, 87, 16, 23,
94, 16, 0, 17, 12, 0, 130, 101, 115, 0, 21, 8, 25, 0, 130, 101, 115, 0, 18,
22, 8, 6, 6, 4, 0, 132, 115, 111, 114, 105, 101, 115, 0, 15, 12, 5, 4, 0, 131,
105, 116, 105, 101, 115, 0, 4, 9, 0, 129, 115, 101, 0, 18, 11, 6, 44, 0, 130,
111, 115, 101, 115, 0, 12, 17, 11, 23, 0, 131, 105, 110, 103, 115, 0, 4, 8,
11, 21, 8, 19, 0, 131, 97, 112, 115, 0, 8, 4, 28, 44, 0, 131, 101, 97, 114,
115, 0, 68, 191, 16, 8, 203, 16, 18, 66, 17, 0, 21, 4, 5, 16, 8, 0, 130, 114,
97, 115, 115, 0, 70, 216, 16, 17, 240, 16, 21, 13, 17, 22, 42, 17, 0, 70, 223,
16, 24, 232, 16, 0, 18, 21, 19, 0, 131, 101, 115, 115, 0, 22, 0, 130, 99, 101,
115, 115, 0, 76, 247, 16, 22, 3, 17, 0, 22, 22, 24, 5, 0, 133, 105, 110, 101,
115, 115, 0, 24, 5, 0, 131, 105, 110, 101, 115, 115, 0, 19, 0, 85, 22, 17, 24,
33, 17, 0, 24, 22, 0, 133, 112, 112, 114, 101, 115, 115, 0, 22, 0, 131, 112,
114, 101, 115, 115, 0, 70, 49, 17, 18, 58, 17, 0, 6, 24, 22, 0, 131, 101, 115,
115, 0, 19, 0, 130, 115, 101, 115, 115, 0, 21, 6, 6, 4, 0, 132, 114, 111, 115,
115, 0, 21, 12, 9, 0, 129, 115, 116, 0, 82, 92, 17, 22, 106, 17, 0, 15, 18,
16, 18, 17, 4, 0, 132, 97, 108, 111, 117, 115, 0, 17, 8, 6, 17, 18, 6, 0, 133,
115, 101, 110, 115, 117, 115, 0, 68, 158, 17, 8, 188, 17, 10, 217, 17, 11,
227, 17, 12, 25, 18, 15, 36, 18, 16, 47, 18, 17, 59, 18, 18, 151, 19, 19, 189,
19, 22, 217, 19, 24, 107, 20, 0, 85, 165, 17, 26, 176, 17, 0, 8, 19, 8, 22, 0,
131, 97, 114, 97, 116, 0, 11, 8, 16, 18, 22, 0, 131, 119, 104, 97, 116, 0, 68,
195, 17, 17, 204, 17, 0, 21, 10, 44, 0, 130, 101, 97, 116, 0, 16, 17, 21, 8,
25, 18, 10, 0, 130, 101, 110, 116, 0, 11, 24, 4, 6, 0, 130, 103, 104, 116, 0,
71, 237, 17, 10, 244, 17, 12, 14, 18, 0, 12, 26, 0, 129, 116, 104, 0, 81, 251,
17, 24, 2, 18, 0, 8, 15, 0, 129, 116, 104, 0, 18, 21, 11, 23, 0, 133, 111,
117, 103, 104, 116, 0, 10, 17, 18, 23, 0, 131, 105, 103, 104, 116, 0, 23, 24,
18, 5, 4, 0, 129, 32, 105, 116, 0, 22, 24, 8, 21, 0, 131, 115, 117, 108, 116,
0, 4, 23, 21, 18, 19, 16, 12, 0, 129, 110, 116, 0, 68, 72, 18, 8, 128, 18, 21,
132, 19, 22, 143, 19, 0, 76, 85, 18, 17, 96, 18, 21, 107, 18, 23, 117, 18, 0,
19, 12, 6, 8, 21, 0, 130, 101, 110, 116, 0, 12, 16, 18, 21, 19, 0, 130, 101,
110, 116, 0, 4, 19, 19, 4, 0, 130, 101, 110, 116, 0, 8, 19, 16, 18, 6, 0, 130,
101, 110, 116, 0, 76, 144, 18, 16, 177, 18, 21, 21, 19, 25, 111, 19, 29, 121,
19, 0, 70, 151, 18, 19, 164, 18, 0, 8, 9, 9, 8, 0, 133, 105, 99, 105, 101,
110, 116, 0, 8, 6, 8, 21, 0, 133, 105, 112, 105, 101, 110, 116, 0, 72, 190,
18, 17, 202, 18, 21, 235, 18, 23, 10, 19, 0, 25, 18, 10, 0, 131, 114, 110,
109, 101, 110, 116, 0, 72, 209, 18, 21, 221, 18, 0, 25, 18, 10, 0, 132, 114,
110, 109, 101, 110, 116, 0, 18, 25, 18, 10, 0, 134, 101, 114, 110, 109, 101,
110, 116, 0, 72, 242, 18, 18, 253, 18, 0, 25, 18, 10, 0, 131, 110, 109, 101,
110, 116, 0, 25, 18, 10, 0, 133, 101, 114, 110, 109, 101, 110, 116, 0, 4, 23,
22, 0, 131, 101, 109, 101, 110, 116, 0, 68, 34, 19, 8, 45, 19, 9, 57, 19, 21,
68, 19, 0, 19, 4, 0, 132, 112, 97, 114, 101, 110, 116, 0, 9, 12, 7, 0, 132,
102, 101, 114, 101, 110, 116, 0, 9, 12, 7, 0, 131, 101, 114, 101, 110, 116, 0,
68, 75, 19, 8, 99, 19, 0, 19, 0, 68, 84, 19, 19, 92, 19, 0, 133, 112, 97, 114,
101, 110, 116, 0, 4, 0, 131, 101, 110, 116, 0, 9, 12, 7, 0, 133, 102, 101,
114, 101, 110, 116, 0, 8, 15, 8, 21, 0, 130, 97, 110, 116, 0, 12, 17, 10, 18,
6, 0, 130, 97, 110, 116, 0, 8, 9, 9, 12, 7, 0, 129, 101, 110, 116, 0, 18, 6,
0, 130, 110, 115, 116, 0, 81, 161, 19, 21, 171, 19, 22, 180, 19, 0, 7, 12, 7,
0, 130, 32, 110, 111, 116, 0, 19, 8, 21, 0, 130, 111, 114, 116, 0, 16, 15, 4,
0, 130, 111, 115, 116, 0, 72, 196, 19, 28, 207, 19, 0, 12, 6, 8, 21, 0, 131,
101, 105, 112, 116, 0, 6, 17, 8, 0, 130, 114, 121, 112, 116, 0, 72, 236, 19,
10, 21, 20, 12, 30, 20, 16, 59, 20, 17, 69, 20, 24, 96, 20, 0, 74, 243, 19,
21, 10, 20, 0, 76, 250, 19, 24, 2, 20, 0, 11, 0, 130, 104, 101, 115, 116, 0,
22, 0, 130, 103, 101, 115, 116, 0, 23, 17, 12, 0, 131, 101, 114, 101, 115,
116, 0, 21, 4, 15, 0, 129, 101, 115, 116, 0, 73, 37, 20, 17, 49, 20, 0, 8, 17,
4, 16, 0, 132, 105, 102, 101, 115, 116, 0, 4, 10, 4, 0, 131, 105, 110, 115,
116, 0, 18, 15, 4, 0, 131, 109, 111, 115, 116, 0, 68, 76, 20, 17, 87, 20, 0,
12, 10, 4, 0, 132, 97, 105, 110, 115, 116, 0, 12, 4, 10, 4, 0, 130, 115, 116,
0, 13, 4, 44, 0, 131, 100, 106, 117, 115, 116, 0, 70, 120, 20, 18, 144, 20,
19, 168, 20, 23, 191, 20, 0, 72, 127, 20, 21, 137, 20, 0, 6, 27, 8, 0, 132,
101, 99, 117, 116, 0, 12, 6, 0, 128, 105, 116, 0, 68, 151, 20, 5, 160, 20, 0,
5, 0, 132, 97, 98, 111, 117, 116, 0, 5, 4, 0, 131, 111, 117, 116, 0, 87, 175,
20, 24, 183, 20, 0, 17, 12, 0, 131, 112, 117, 116, 0, 18, 0, 130, 116, 112,
117, 116, 0, 19, 24, 18, 0, 131, 116, 112, 117, 116, 0, 23, 18, 5, 4, 0, 129,
117, 116, 0, 72, 217, 20, 12, 253, 20, 0, 68, 224, 20, 12, 231, 20, 0, 11, 44,
0, 129, 118, 101, 0, 70, 238, 20, 8, 246, 20, 0, 8, 21, 0, 130, 101, 105, 118,
0, 6, 8, 21, 0, 129, 118, 0, 8, 11, 6, 4, 44, 0, 130, 105, 101, 118, 0, 76,
15, 21, 17, 25, 21, 0, 8, 25, 8, 21, 0, 130, 105, 101, 119, 0, 18, 14, 44, 0,
130, 110, 111, 119, 0, 70, 59, 21, 8, 118, 21, 11, 128, 21, 15, 146, 21, 17,
87, 22, 21, 114, 22, 22, 12, 23, 23, 39, 23, 0, 68, 72, 21, 8, 84, 21, 12, 95,
21, 19, 106, 21, 0, 21, 6, 18, 19, 28, 11, 0, 130, 105, 115, 121, 0, 24, 20,
8, 21, 9, 0, 129, 110, 99, 121, 0, 21, 6, 18, 19, 28, 11, 0, 129, 115, 121, 0,
24, 21, 14, 17, 4, 5, 0, 129, 116, 99, 121, 0, 23, 9, 4, 22, 0, 130, 101, 116,
121, 0, 6, 21, 4, 21, 12, 8, 11, 0, 135, 105, 101, 114, 97, 114, 99, 104, 121,
0, 68, 165, 21, 11, 232, 21, 14, 242, 21, 15, 250, 21, 18, 66, 22, 21, 76, 22,
0, 69, 184, 21, 8, 193, 21, 15, 199, 21, 17, 208, 21, 21, 215, 21, 24, 224,
21, 0, 18, 21, 19, 0, 129, 98, 108, 121, 0, 21, 0, 128, 108, 121, 0, 8, 21, 0,
131, 97, 108, 108, 121, 0, 12, 9, 0, 128, 108, 121, 0, 8, 17, 8, 10, 0, 128,
108, 121, 0, 23, 6, 4, 0, 128, 108, 121, 0, 10, 12, 15, 22, 0, 129, 116, 108,
121, 0, 12, 15, 0, 129, 101, 108, 121, 0, 68, 4, 22, 5, 47, 22, 8, 56, 22, 0,
86, 11, 22, 23, 35, 22, 0, 24, 0, 108, 20, 22, 22, 27, 22, 0, 131, 117, 97,
108, 108, 121, 0, 24, 0, 132, 97, 108, 108, 121, 0, 24, 6, 4, 0, 133, 116,
117, 97, 108, 108, 121, 0, 4, 5, 18, 21, 19, 0, 129, 121, 0, 4, 21, 0, 132,
101, 97, 108, 108, 121, 0, 16, 18, 17, 4, 0, 130, 97, 108, 121, 0, 4, 16, 12,
21, 19, 0, 129, 105, 108, 121, 0, 72, 94, 22, 19, 103, 22, 0, 18, 16, 44, 0,
130, 110, 101, 121, 0, 4, 16, 18, 6, 0, 131, 112, 97, 110, 121, 0, 68, 127,
22, 8, 231, 22, 18, 240, 22, 23, 253, 22, 0, 69, 143, 22, 12, 152, 22, 15,
165, 22, 16, 193, 22, 22, 202, 22, 0, 12, 15, 0, 130, 114, 97, 114, 121, 0,
15, 15, 12, 27, 24, 4, 0, 132, 105, 97, 114, 121, 0, 76, 172, 22, 15, 182, 22,
0, 27, 24, 4, 0, 130, 105, 97, 114, 121, 0, 12, 27, 24, 4, 0, 131, 105, 97,
114, 121, 0, 24, 22, 0, 130, 109, 97, 114, 121, 0, 8, 6, 0, 70, 212, 22, 8,
223, 22, 0, 8, 17, 0, 133, 101, 115, 115, 97, 114, 121, 0, 17, 0, 130, 115,
97, 114, 121, 0, 19, 18, 21, 19, 0, 128, 116, 121, 0, 10, 4, 23, 4, 6, 0, 132,
101, 103, 111, 114, 121, 0, 17, 24, 6, 18, 44, 0, 134, 99, 111, 117, 110, 116,
114, 121, 0, 4, 0, 85, 21, 23, 26, 32, 23, 0, 6, 18, 19, 28, 11, 0, 130, 105,
115, 121, 0, 15, 4, 0, 129, 121, 115, 0, 73, 49, 23, 15, 57, 23, 21, 66, 23,
0, 4, 22, 0, 129, 101, 116, 121, 0, 12, 5, 4, 0, 129, 105, 116, 121, 0, 19, 8,
18, 21, 19, 0, 132, 112, 101, 114, 116, 121, 0};

View File

@ -0,0 +1,152 @@
// Copyright 2021-2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Generated code.
// Autocorrection dictionary (71 entries):
// :guage -> gauge
// :the:the: -> the
// :thier -> their
// :ture -> true
// accomodate -> accommodate
// acommodate -> accommodate
// aparent -> apparent
// aparrent -> apparent
// apparant -> apparent
// apparrent -> apparent
// aquire -> acquire
// becuase -> because
// cauhgt -> caught
// cheif -> chief
// choosen -> chosen
// cieling -> ceiling
// collegue -> colleague
// concensus -> consensus
// contians -> contains
// cosnt -> const
// dervied -> derived
// dosen't -> doesn't
// fales -> false
// fasle -> false
// fitler -> filter
// flase -> false
// foward -> forward
// frequecy -> frequency
// gaurantee -> guarantee
// guaratee -> guarantee
// heigth -> height
// heirarchy -> hierarchy
// inclued -> include
// interator -> iterator
// intput -> input
// invliad -> invalid
// lenght -> length
// liasion -> liaison
// libary -> library
// listner -> listener
// looses: -> loses
// looup -> lookup
// manefist -> manifest
// namesapce -> namespace
// namespcae -> namespace
// occassion -> occasion
// occured -> occurred
// ouptut -> output
// ouput -> output
// overide -> override
// postion -> position
// priviledge -> privilege
// psuedo -> pseudo
// recieve -> receive
// refered -> referred
// relevent -> relevant
// repitition -> repetition
// retrun -> return
// retun -> return
// reuslt -> result
// reutrn -> return
// saftey -> safety
// seperate -> separate
// singed -> signed
// stirng -> string
// strign -> string
// swithc -> switch
// swtich -> switch
// thresold -> threshold
// udpate -> update
// widht -> width
#define AUTOCORRECTION_MIN_LENGTH 5 // ":ture"
#define AUTOCORRECTION_MAX_LENGTH 10 // "accomodate"
static const uint8_t autocorrection_data[1120] PROGMEM = {108, 43, 0, 6, 71, 0,
7, 81, 0, 8, 199, 0, 9, 240, 1, 10, 250, 1, 11, 26, 2, 17, 53, 2, 18, 190, 2,
19, 202, 2, 21, 212, 2, 22, 20, 3, 23, 67, 3, 28, 32, 4, 0, 72, 50, 0, 22, 60,
0, 0, 11, 23, 44, 8, 11, 23, 44, 0, 132, 0, 8, 22, 18, 18, 15, 0, 132, 115,
101, 115, 0, 11, 23, 12, 26, 22, 0, 129, 99, 104, 0, 68, 94, 0, 8, 106, 0, 15,
174, 0, 21, 187, 0, 0, 12, 15, 25, 17, 12, 0, 131, 97, 108, 105, 100, 0, 74,
119, 0, 12, 129, 0, 21, 140, 0, 24, 165, 0, 0, 17, 12, 22, 0, 131, 103, 110,
101, 100, 0, 25, 21, 8, 7, 0, 131, 105, 118, 101, 100, 0, 72, 147, 0, 24, 156,
0, 0, 9, 8, 21, 0, 129, 114, 101, 100, 0, 6, 6, 18, 0, 129, 114, 101, 100, 0,
15, 6, 17, 12, 0, 129, 100, 101, 0, 18, 22, 8, 21, 11, 23, 0, 130, 104, 111,
108, 100, 0, 4, 26, 18, 9, 0, 131, 114, 119, 97, 114, 100, 0, 68, 233, 0, 6,
246, 0, 7, 4, 1, 8, 16, 1, 10, 52, 1, 15, 81, 1, 21, 90, 1, 22, 117, 1, 23,
144, 1, 24, 215, 1, 25, 228, 1, 0, 6, 19, 22, 8, 16, 4, 17, 0, 130, 97, 99,
101, 0, 19, 4, 22, 8, 16, 4, 17, 0, 131, 112, 97, 99, 101, 0, 12, 21, 8, 25,
18, 0, 130, 114, 105, 100, 101, 0, 23, 0, 68, 25, 1, 17, 36, 1, 0, 21, 4, 24,
10, 0, 130, 110, 116, 101, 101, 0, 4, 21, 24, 4, 10, 0, 135, 117, 97, 114, 97,
110, 116, 101, 101, 0, 68, 59, 1, 7, 69, 1, 0, 24, 10, 44, 0, 131, 97, 117,
103, 101, 0, 8, 15, 12, 25, 12, 21, 19, 0, 130, 103, 101, 0, 22, 4, 9, 0, 130,
108, 115, 101, 0, 76, 97, 1, 24, 109, 1, 0, 24, 20, 4, 0, 132, 99, 113, 117,
105, 114, 101, 0, 23, 44, 0, 130, 114, 117, 101, 0, 4, 0, 79, 126, 1, 24, 134,
1, 0, 9, 0, 131, 97, 108, 115, 101, 0, 6, 8, 5, 0, 131, 97, 117, 115, 101, 0,
4, 0, 71, 156, 1, 19, 193, 1, 21, 203, 1, 0, 18, 16, 0, 80, 166, 1, 18, 181,
1, 0, 18, 6, 4, 0, 135, 99, 111, 109, 109, 111, 100, 97, 116, 101, 0, 6, 6, 4,
0, 132, 109, 111, 100, 97, 116, 101, 0, 7, 24, 0, 132, 112, 100, 97, 116, 101,
0, 8, 19, 8, 22, 0, 132, 97, 114, 97, 116, 101, 0, 10, 8, 15, 15, 18, 6, 0,
130, 97, 103, 117, 101, 0, 8, 12, 6, 8, 21, 0, 131, 101, 105, 118, 101, 0, 12,
8, 11, 6, 0, 130, 105, 101, 102, 0, 17, 0, 76, 3, 2, 21, 16, 2, 0, 15, 8, 12,
6, 0, 133, 101, 105, 108, 105, 110, 103, 0, 12, 23, 22, 0, 131, 114, 105, 110,
103, 0, 70, 33, 2, 23, 44, 2, 0, 12, 23, 26, 22, 0, 131, 105, 116, 99, 104, 0,
10, 12, 8, 11, 0, 129, 104, 116, 0, 72, 69, 2, 10, 80, 2, 18, 89, 2, 21, 156,
2, 24, 167, 2, 0, 22, 18, 18, 11, 6, 0, 131, 115, 101, 110, 0, 12, 21, 23, 22,
0, 129, 110, 103, 0, 12, 0, 86, 98, 2, 23, 124, 2, 0, 68, 105, 2, 22, 114, 2,
0, 12, 15, 0, 131, 105, 115, 111, 110, 0, 4, 6, 6, 18, 0, 131, 105, 111, 110,
0, 76, 131, 2, 22, 146, 2, 0, 23, 12, 19, 8, 21, 0, 134, 101, 116, 105, 116,
105, 111, 110, 0, 18, 19, 0, 131, 105, 116, 105, 111, 110, 0, 23, 24, 8, 21,
0, 131, 116, 117, 114, 110, 0, 85, 174, 2, 23, 183, 2, 0, 23, 8, 21, 0, 130,
117, 114, 110, 0, 8, 21, 0, 128, 114, 110, 0, 7, 8, 24, 22, 19, 0, 131, 101,
117, 100, 111, 0, 24, 18, 18, 15, 0, 129, 107, 117, 112, 0, 72, 219, 2, 18, 3,
3, 0, 76, 229, 2, 15, 238, 2, 17, 248, 2, 0, 11, 23, 44, 0, 130, 101, 105,
114, 0, 23, 12, 9, 0, 131, 108, 116, 101, 114, 0, 23, 22, 12, 15, 0, 130, 101,
110, 101, 114, 0, 23, 4, 21, 8, 23, 17, 12, 0, 135, 116, 101, 114, 97, 116,
111, 114, 0, 72, 30, 3, 17, 38, 3, 24, 51, 3, 0, 15, 4, 9, 0, 129, 115, 101,
0, 4, 12, 23, 17, 18, 6, 0, 131, 97, 105, 110, 115, 0, 22, 17, 8, 6, 17, 18,
6, 0, 133, 115, 101, 110, 115, 117, 115, 0, 116, 89, 3, 10, 102, 3, 11, 112,
3, 15, 134, 3, 17, 145, 3, 22, 234, 3, 24, 248, 3, 0, 17, 8, 22, 18, 7, 0,
132, 101, 115, 110, 39, 116, 0, 11, 24, 4, 6, 0, 130, 103, 104, 116, 0, 71,
119, 3, 10, 126, 3, 0, 12, 26, 0, 129, 116, 104, 0, 17, 8, 15, 0, 129, 116,
104, 0, 22, 24, 8, 21, 0, 131, 115, 117, 108, 116, 0, 68, 155, 3, 8, 166, 3,
22, 226, 3, 0, 21, 4, 19, 19, 4, 0, 130, 101, 110, 116, 0, 85, 173, 3, 25,
216, 3, 0, 68, 180, 3, 21, 191, 3, 0, 19, 4, 0, 132, 112, 97, 114, 101, 110,
116, 0, 4, 19, 0, 68, 201, 3, 19, 209, 3, 0, 133, 112, 97, 114, 101, 110, 116,
0, 4, 0, 131, 101, 110, 116, 0, 8, 15, 8, 21, 0, 130, 97, 110, 116, 0, 18, 6,
0, 130, 110, 115, 116, 0, 12, 9, 8, 17, 4, 16, 0, 132, 105, 102, 101, 115,
116, 0, 83, 255, 3, 23, 22, 4, 0, 87, 6, 4, 24, 14, 4, 0, 17, 12, 0, 131, 112,
117, 116, 0, 18, 0, 130, 116, 112, 117, 116, 0, 19, 24, 18, 0, 131, 116, 112,
117, 116, 0, 70, 45, 4, 8, 57, 4, 11, 67, 4, 21, 85, 4, 0, 8, 24, 20, 8, 21,
9, 0, 129, 110, 99, 121, 0, 23, 9, 4, 22, 0, 130, 101, 116, 121, 0, 6, 21, 4,
21, 12, 8, 11, 0, 135, 105, 101, 114, 97, 114, 99, 104, 121, 0, 4, 5, 12, 15,
0, 130, 114, 97, 114, 121, 0};

View File

@ -0,0 +1,473 @@
# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# This is a larger example typo dictionary containing 400 entries. It builds to
# a table of about 6000 bytes, so you'll need a keyboard with a generous
# amount of free firmware space to use the full dictionary. Alternatively, pick
# out a subset of entries to a separate file, then build a table from that.
#
# Dictionary syntax:
# Each line of this file defines one typo correction entry with the syntax
# "typo -> correction". Typos and corrections are case insensitive, and any
# whitespace before or after the typo and correction is ignored. The typo must be
# only the letters a-z, or the special character : representing a word break.
#
# For documentation about how to use this dictionary, see
# https://getreuer.info/posts/keyboards/autocorrection
#
# Further resources:
# * Wikipedia has a large list of common typos at
# https://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines
#
# * EmacsWiki has another list of typos at
# https://www.emacswiki.org/emacs/autocorrection_abbrev_defs
#
# * You can find data on English word frequencies at
# https://www.wordfrequency.info/samples.asp
## 10 most common words.
# The words "there", "about", "their", "would", "people", "which", "could",
# "think", "other", and "because" are among the most common words in English
# that are 5 letters or longer. (We don't include entries for words shorter than
# that to avoid false triggering.)
:htere -> there
abbout -> about
abotu -> about
baout -> about
:theri -> their
:thier -> their
:owudl -> would
woudl -> would
peaple -> people
peolpe -> people
peopel -> people
poeple -> people
poeople -> people
:hwihc -> which
whcih -> which
whihc -> which
whlch -> which
wihch -> which
coudl -> could
:htikn -> think
:htink -> think
thikn -> think
thiunk -> think
tihkn -> think
:olther -> other
:otehr -> other
baceause -> because
beacuse -> because
becasue -> because
beccause -> because
becouse -> because
becuase -> because
## Common words, 11-20.
theese -> these
:goign -> going
:gonig -> going
:yaers -> years
:yeasr -> years
:thsoe -> those
shoudl -> should
raelly -> really
realy -> really
relaly -> really
bedore -> before
befoer -> before
littel -> little
beeing -> being
:hwile -> while
## Common words, 21-30.
aroud -> around
arround -> around
arund -> around
thign -> thing
thigsn -> things
thnigs -> things
anohter -> another
beteen -> between
beween -> between
bewteen -> between
:eveyr -> every
:graet -> great
:agian -> again
:sicne -> since
alwasy -> always
alwyas -> always
throught -> thought
## Words especially susceptible to skipping or transposing a letter.
# These entries are for words that are easy enough to spell, but not necessarily
# easy to press the keys in the right order.
# Catch misspellings of "achieves", "achieving", etc.
:acheiv -> achiev
almsot -> almost
alomst -> almost
chnage -> change
chekc -> check
childen -> children
claer -> clear
comapny -> company
contian -> contain
elasped -> elapsed
feild -> field
fitler -> filter
firts -> first
follwo -> follow
:foudn -> found
frequecy -> frequency
firend -> friend
freind -> friend
heigth -> height
iamge -> image
inital -> initial
intput -> input
laguage -> language
lenght -> length
levle -> level
libary -> library
:moeny -> money
mysefl -> myself
ouptut -> output
ouput -> output
probaly -> probably
probelm -> problem
recrod -> record
reponse -> response
reprot -> report
singel -> single
stregth -> strength
strengh -> strength
tkaes -> takes
therfore -> therefore
todya -> today
toghether -> together
unkown -> unknown
unqiue -> unique
widht -> width
## Words with tricky spelling.
# If you are a good speller, you could drop this section.
aberation -> aberration
accross -> across
adviced -> advised
aledge -> allege
alledge -> allege
amature -> amateur
anomolous -> anomalous
anomoly -> anomaly
aparent -> apparent
aparrent -> apparent
apparant -> apparent
apparrent -> apparent
asthetic -> aesthetic
auxilary -> auxiliary
auxillary -> auxiliary
auxilliary -> auxiliary
bankrupcy -> bankruptcy
busness -> business
bussiness -> business
calander -> calendar
commitee -> committee
comittee -> committee
competance -> competence
competant -> competent
concensus -> consensus
cognizent -> cognizant
copywrite: -> copyright
choosen -> chosen
collegue -> colleague
excercise -> exercise
:grammer -> grammar
:guage -> gauge
govement -> government
govenment -> government
goverment -> government
governmnet -> government
govorment -> government
govornment -> government
guaratee -> guarantee
garantee -> guarantee
gaurantee -> guarantee
heirarchy -> hierarchy
hygeine -> hygiene
hypocracy -> hypocrisy
hypocrasy -> hypocrisy
hypocricy -> hypocrisy
hypocrit: -> hypocrite
looses: -> loses
maintence -> maintenance
morgage -> mortgage
neccesary -> necessary
necesary -> necessary
pallete -> palette
paralel -> parallel
parralel -> parallel
parrallel -> parallel
priviledge -> privilege
probablly -> probably
prominant -> prominent
propogate -> propagate
proove -> prove
psuedo -> pseudo
reciept -> receipt
# Catch misspellings of "receives", "receiving", etc.
receiev -> receiv
reciev -> receiv
recepient -> recipient
recipiant -> recipient
relevent -> relevant
repitition -> repetition
safty -> safety
saftey -> safety
# Catch misspellings of "separate", "separating", etc.
seperat -> separat
spectogram -> spectrogram
symetric -> symmetric
tolerence -> tolerance
## Words particularly for coding.
# Entries for common code keywords ("const") and terminology ("lookup").
cacheing -> caching
complier -> compiler
doulbe -> double
dyanmic -> dynamic
# As in "execute", "executable", "executing", ...
excecut -> execut
failse -> false
fales -> false
fasle -> false
flase -> false
indeces -> indices
indecies -> indices
indicies -> indices
interator -> iterator
looup -> lookup
namesapce -> namespace
namespcae -> namespace
nulltpr -> nullptr
operaotr -> operator
overide -> override
ovveride -> override
poitner -> pointer
:rference -> reference
referece -> reference
singed -> signed
stirng -> string
strign -> string
swithc -> switch
swtich -> switch
teamplate -> template
tempalte -> template
:ture -> true
retrun -> return
retun -> return
reutrn -> return
cosnt -> const
virutal -> virtual
vitual -> virtual
yeild -> yield
## Catch skipped spaces between common words.
:alot: -> a lot
:andteh -> and the
:andthe -> and the
:asthe -> as the
:atthe -> at the
abouta -> about a
aboutit -> about it
aboutthe -> about the
:tothe -> to the
didnot -> did not
fromthe -> from the
## Various additional entries.
:agred -> agreed
:ajust -> adjust
:anual -> annual
:asign -> assign
:aslo: -> also
:casue -> cause
:choses -> chooses
:gaurd -> guard
:haev -> have
:hapen -> happen
:idaes -> ideas
:jsut: -> just
:jstu: -> just
:knwo -> know
:konw -> know
:kwno -> know
:ocuntry -> country
:ocur -> occur
:socre -> score
:szie -> size
:the:the: -> the
:turth -> truth
:uesd: -> used
:usally -> usually
abilties -> abilities
abilty -> ability
abvove -> above
accesories -> accessories
accomodate -> accommodate
acommodate -> accommodate
acomplish -> accomplish
actualy -> actually
acurate -> accurate
acutally -> actually
addtion -> addition
againnst -> against
aganist -> against
aggreed -> agreed
agianst -> against
ahppn -> happen
allign -> align
anytying -> anything
aquire -> acquire
availabe -> available
availaible -> available
availalbe -> available
availble -> available
availiable -> available
avalable -> available
avaliable -> available
avilable -> available
bandwith -> bandwidth
begginer -> beginner
beleif -> belief
beleive -> believe
belive -> believe
breif -> brief
burried -> buried
caluclate -> calculate
caluculate -> calculate
calulate -> calculate
catagory -> category
cauhgt -> caught
ceratin -> certain
certian -> certain
cheif -> chief
cieling -> ceiling
circut -> circuit
clasic -> classic
cmoputer -> computer
coform -> conform
comming: -> coming
considerd -> considered
dervied -> derived
desicion -> decision
diferent -> different
diferrent -> different
differnt -> different
diffrent -> different
divison -> division
effecient -> efficient
eligable -> eligible
elpased -> elapsed
embarass -> embarrass
embeded -> embedded
encypt -> encrypt
finaly -> finally
foriegn -> foreign
foward -> forward
fraciton -> fraction
fucntion -> function
fufill -> fulfill
fullfill -> fulfill
futher -> further
ganerate -> generate
generaly -> generally
greatful -> grateful
heigher -> higher
higest -> highest
howver -> however
hydogen -> hydrogen
importamt -> important
inclued -> include
insted -> instead
intrest -> interest
invliad -> invalid
largst -> largest
learnign -> learning
liasion -> liaison
likly -> likely
lisense -> license
listner -> listener
macthing -> matching
manefist -> manifest
mesage -> message
naturual -> natural
occassion -> occasion
occured -> occurred
particualr -> particular
paticular -> particular
peice -> piece
perhasp -> perhaps
perheaps -> perhaps
perhpas -> perhaps
perphas -> perhaps
persue -> pursue
posess -> possess
postion -> position
preiod -> period
primarly -> primarily
privte -> private
proccess -> process
proeprty -> property
propery -> property
realtion -> relation
reasearch -> research
recuring -> recurring
refered -> referred
regluar -> regular
releated -> related
resutl -> result
reuslt -> result
reveiw -> review
satisifed -> satisfied
scheduel -> schedule
sequnce -> sequence
similiar -> similar
simmilar -> similar
slighly -> slightly
somehwat -> somewhat
statment -> statement
sucess -> success
succsess -> success
sugest -> suggest
sumary -> summary
supress -> suppress
surpress -> suppress
thresold -> threshold
tongiht -> tonight
tranpose -> transpose
typcial -> typical
udpate -> update
ususally -> usually
verticies -> vertices
whereever -> wherever
wherre -> where
wierd -> weird

View File

@ -0,0 +1,303 @@
# Copyright 2021-2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Python program to make autocorrection_data.h.
This program reads "autocorrection_dict.txt" and generates a C source file
"autocorrection_data.h" with a serialized trie embedded as an array. Run this
program without arguments like
$ python3 make_autocorrection_data.py
Or to read from a different typo dict file, pass it as the first argument like
$ python3 make_autocorrection_data.py dict.txt
Each line of the dict file defines one typo and its correction with the syntax
"typo -> correction". Blank lines or lines starting with '#' are ignored.
Example:
:thier -> their
dosen't -> doesn't
fitler -> filter
lenght -> length
ouput -> output
widht -> width
See autocorrection_dict_extra.txt for a larger example.
For full documentation, see
https://getreuer.info/posts/keyboards/autocorrection
"""
import sys
import textwrap
from typing import Any, Dict, Iterator, List, Tuple
try:
from english_words import english_words_lower_alpha_set as CORRECT_WORDS
except ImportError:
print('Autocorrection will falsely trigger when a typo is a substring of a '
'correctly spelled word. To check for this, install the english_words '
'package and rerun this script:\n\n pip install english_words\n')
# Use a minimal word list as a fallback.
CORRECT_WORDS = ('apparent', 'association', 'available', 'classification',
'effect', 'entertainment', 'fantastic', 'information',
'integrate', 'international', 'language', 'loosest',
'manual', 'nothing', 'provides', 'reference', 'statehood',
'technology', 'virtually', 'wealthier', 'wonderful')
KC_A = 4
KC_SPC = 0x2c
KC_QUOT = 0x34
TYPO_CHARS = dict(
[
("'", KC_QUOT),
(':', KC_SPC), # "Word break" character.
] +
# Characters a-z.
[(chr(c), c + KC_A - ord('a')) for c in range(ord('a'), ord('z') + 1)]
)
def parse_file(file_name: str) -> List[Tuple[str, str]]:
"""Parses autocorrections dictionary file.
Each line of the file defines one typo and its correction with the syntax
"typo -> correction". Blank lines or lines starting with '#' are ignored. The
function validates that typos only have characters in TYPO_CHARS, that
typos are not substrings of other typos, and checking that typos don't trigger
on CORRECT_WORDS.
Args:
file_name: String, path of the autocorrections dictionary.
Returns:
List of (typo, correction) tuples.
"""
autocorrections = []
typos = set()
for line_number, typo, correction in parse_file_lines(file_name):
if typo in typos:
print(f'Warning:{line_number}: Ignoring duplicate typo: "{typo}"')
continue
# Check that `typo` is valid.
if not(all([c in TYPO_CHARS for c in typo])):
print(f'Error:{line_number}: Typo "{typo}" has '
'characters other than ' + ''.join(TYPO_CHARS.keys()))
sys.exit(1)
for other_typo in typos:
if typo in other_typo or other_typo in typo:
print(f'Error:{line_number}: Typos may not be substrings of one '
f'another, otherwise the longer typo would never trigger: '
f'"{typo}" vs. "{other_typo}".')
sys.exit(1)
if len(typo) < 5:
print(f'Warning:{line_number}: It is suggested that typos are at '
f'least 5 characters long to avoid false triggers: "{typo}"')
check_typo_against_dictionary(line_number, typo)
autocorrections.append((typo, correction))
typos.add(typo)
return autocorrections
def make_trie(autocorrections: List[Tuple[str, str]]) -> Dict[str, Any]:
"""Makes a trie from the the typos, writing in reverse.
Args:
autocorrections: List of (typo, correction) tuples.
Returns:
Dict of dict, representing the trie.
"""
trie = {}
for typo, correction in autocorrections:
node = trie
for letter in typo[::-1]:
node = node.setdefault(letter, {})
node['LEAF'] = (typo, correction)
return trie
def parse_file_lines(file_name: str) -> Iterator[Tuple[int, str, str]]:
"""Parses lines read from `file_name` into typo-correction pairs."""
line_number = 0
for line in open(file_name, 'rt'):
line_number += 1
line = line.strip()
if line and line[0] != '#':
# Parse syntax "typo -> correction", using strip to ignore indenting.
tokens = [token.strip() for token in line.split('->', 1)]
if len(tokens) != 2 or not tokens[0]:
print(f'Error:{line_number}: Invalid syntax: "{line}"')
sys.exit(1)
typo, correction = tokens
typo = typo.lower() # Force typos to lowercase.
typo = typo.replace(' ', ':')
yield line_number, typo, correction
def check_typo_against_dictionary(line_number: int, typo: str) -> None:
"""Checks `typo` against English dictionary words."""
if typo.startswith(':') and typo.endswith(':'):
if typo[1:-1] in CORRECT_WORDS:
print(f'Warning:{line_number}: Typo "{typo}" is a correctly spelled '
'dictionary word.')
elif typo.startswith(':') and not typo.endswith(':'):
for word in CORRECT_WORDS:
if word.startswith(typo[1:]):
print(f'Warning:{line_number}: Typo "{typo}" would falsely trigger '
f'on correctly spelled word "{word}".')
elif not typo.startswith(':') and typo.endswith(':'):
for word in CORRECT_WORDS:
if word.endswith(typo[:-1]):
print(f'Warning:{line_number}: Typo "{typo}" would falsely trigger '
f'on correctly spelled word "{word}".')
elif not typo.startswith(':') and not typo.endswith(':'):
for word in CORRECT_WORDS:
if typo in word:
print(f'Warning:{line_number}: Typo "{typo}" would falsely trigger '
f'on correctly spelled word "{word}".')
def serialize_trie(autocorrections: List[Tuple[str, str]],
trie: Dict[str, Any]) -> List[int]:
"""Serializes trie and correction data in a form readable by the C code.
Args:
autocorrections: List of (typo, correction) tuples.
trie: Dict of dicts.
Returns:
List of ints in the range 0-255.
"""
table = []
# Traverse trie in depth first order.
def traverse(trie_node: Dict[str, Any]) -> Dict[str, Any]:
if 'LEAF' in trie_node: # Handle a leaf trie node.
typo, correction = trie_node['LEAF']
word_boundary_ending = typo[-1] == ':'
typo = typo.strip(':')
i = 0 # Make the autocorrection data for this entry and serialize it.
while i < min(len(typo), len(correction)) and typo[i] == correction[i]:
i += 1
backspaces = len(typo) - i - 1 + word_boundary_ending
assert 0 <= backspaces <= 63
correction = correction[i:]
data = [backspaces + 128] + list(bytes(correction, 'ascii')) + [0]
entry = {'data': data, 'links': [], 'byte_offset': 0}
table.append(entry)
elif len(trie_node) == 1: # Handle trie node with a single child.
c, trie_node = next(iter(trie_node.items()))
entry = {'chars': c, 'byte_offset': 0}
# It's common for a trie to have long chains of single-child nodes. We
# find the whole chain so that we can serialize it more efficiently.
while len(trie_node) == 1 and 'LEAF' not in trie_node:
c, trie_node = next(iter(trie_node.items()))
entry['chars'] += c
table.append(entry)
entry['links'] = [traverse(trie_node)]
else: # Handle trie node with multiple children.
entry = {'chars': ''.join(sorted(trie_node.keys())), 'byte_offset': 0}
table.append(entry)
entry['links'] = [traverse(trie_node[c]) for c in entry['chars']]
return entry
traverse(trie)
def serialize(e: Dict[str, Any]) -> List[int]:
if not e['links']: # Handle a leaf table entry.
return e['data']
elif len(e['links']) == 1: # Handle a chain table entry.
return [TYPO_CHARS[c] for c in e['chars']] + [0]
else: # Handle a branch table entry.
data = []
for c, link in zip(e['chars'], e['links']):
data += [TYPO_CHARS[c] | (0 if data else 64)] + encode_link(link)
return data + [0]
byte_offset = 0
for e in table: # To encode links, first compute byte offset of each entry.
e['byte_offset'] = byte_offset
byte_offset += len(serialize(e))
return [b for e in table for b in serialize(e)] # Serialize final table.
def encode_link(link: Dict[str, Any]) -> List[int]:
"""Encodes a node link as two bytes."""
byte_offset = link['byte_offset']
if not (0 <= byte_offset <= 0xffff):
print('Error: The autocorrection table is too large, a node link exceeds '
'64KB limit. Try reducing the autocorrection dict to fewer entries.')
sys.exit(1)
return [byte_offset & 255, byte_offset >> 8]
def write_generated_code(autocorrections: List[Tuple[str, str]],
data: List[int],
file_name: str) -> None:
"""Writes autocorrection data as generated C code to `file_name`.
Args:
autocorrections: List of (typo, correction) tuples.
data: List of ints in 0-255, the serialized trie.
file_name: String, path of the output C file.
"""
assert all(0 <= b <= 255 for b in data)
def typo_len(e: Tuple[str, str]) -> int:
return len(e[0])
min_typo = min(autocorrections, key=typo_len)[0]
max_typo = max(autocorrections, key=typo_len)[0]
generated_code = ''.join([
'// Generated code.\n\n',
f'// Autocorrection dictionary ({len(autocorrections)} entries):\n',
''.join(sorted(f'// {typo:<{len(max_typo)}} -> {correction}\n'
for typo, correction in autocorrections)),
f'\n#define AUTOCORRECTION_MIN_LENGTH {len(min_typo)} // "{min_typo}"\n',
f'#define AUTOCORRECTION_MAX_LENGTH {len(max_typo)} // "{max_typo}"\n\n',
textwrap.fill('static const uint8_t autocorrection_data[%d] PROGMEM = {%s};' % (
len(data), ', '.join(map(str, data))), width=80, subsequent_indent=' '),
'\n\n'])
with open(file_name, 'wt') as f:
f.write(generated_code)
def main(argv):
dict_file = argv[1] if len(argv) > 1 else 'autocorrection_dict.txt'
autocorrections = parse_file(dict_file)
trie = make_trie(autocorrections)
data = serialize_trie(autocorrections, trie)
print(f'Processed %d autocorrection entries to table with %d bytes.'
% (len(autocorrections), len(data)))
write_generated_code(autocorrections, data, 'autocorrection_data.h')
if __name__ == '__main__':
main(sys.argv)

View File

@ -71,3 +71,31 @@ static bool process_esc_to_base(uint16_t keycode, keyrecord_t * record) {
} }
return true; return true;
} }
static bool process_lsft_for_caps(uint16_t keycode, keyrecord_t * record) {
static bool tapped = false;
static uint16_t tap_timer = 0;
if (keycode == KC_LSFT) {
if (user_config.double_tap_shift_for_capslock) {
if (!keymap_config.no_gui) {
if (record->event.pressed) {
if (tapped && !timer_expired(record->event.time, tap_timer)) {
// The key was double tapped.
//clear_mods(); // If needed, clear the mods.
// Do something interesting...
register_code(KC_CAPS);
}
tapped = true;
tap_timer = record->event.time + TAPPING_TERM;
} else {
unregister_code(KC_CAPS);
}
}
}
} else {
// On an event with any other key, reset the double tap state.
tapped = false;
}
return true;
}

View File

@ -21,33 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "custom_double_taps.h" #include "custom_double_taps.h"
// Tap once for shift, twice for Caps Lock but only if Win Key is not disabled (also disabled by user.config variable) #include "autocorrect/autocorrection.h"
void dance_LSFT_each_tap(qk_tap_dance_state_t * state, void * user_data) {
if (user_config.double_tap_shift_for_capslock) {
if (state -> count == 1 || keymap_config.no_gui) {
register_code(KC_LSFT);
} else {
register_code(KC_CAPS);
}
} else {
register_code(KC_LSFT);
}
}
void dance_LSFT_reset(qk_tap_dance_state_t * state, void * user_data) {
if (state -> count == 1 || keymap_config.no_gui) {
unregister_code(KC_LSFT);
} else {
unregister_code(KC_CAPS);
unregister_code(KC_LSFT);
}
}
// Tap Dance definitions
qk_tap_dance_action_t tap_dance_actions[] = {
// Tap once for shift, twice for Caps Lock
[TD_LSFT_CAPS_WIN] = ACTION_TAP_DANCE_FN_ADVANCED(dance_LSFT_each_tap, NULL, dance_LSFT_reset)
};
// RGB NIGHT MODE // RGB NIGHT MODE
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
@ -129,6 +103,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {
if (!process_record_keymap(keycode, record)) { return false; } if (!process_record_keymap(keycode, record)) { return false; }
if (!process_capsnum(keycode, record)) { return false; } if (!process_capsnum(keycode, record)) { return false; }
if (!process_esc_to_base(keycode, record)) { return false; } if (!process_esc_to_base(keycode, record)) { return false; }
if (!process_lsft_for_caps(keycode, record)) { return false; }
if (!process_autocorrection(keycode, record)) { return false; }
// Key macros ... // Key macros ...
switch (keycode) { switch (keycode) {
@ -136,66 +112,77 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {
// User configuration toggles // User configuration toggles
case PRNCONF: // Print verbose status of all user_config toggles (open a text editor before engaging!!) case PRNCONF: // Print verbose status of all user_config toggles (open a text editor before engaging!!)
if (record->event.pressed) { if (record->event.pressed) {
//send_string("Left bracket with alt numcodes "SS_LALT(SS_TAP(X_KP_0) SS_TAP(X_KP_0) SS_TAP(X_KP_9) SS_TAP(X_KP_1))"\n"); send_string("\n"SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)"#########");
send_string("\n\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x3C\x3C\x3C\x3C\x3C\x3C\x3C\x3C\x3C"); send_string(" gourdo1" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_3)SS_TAP(X_KP_9))"s GMMK Pro User Settings ");
send_string(" gourdo1\x27s GMMK Pro User Settings "); send_string("#########"SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)"\n");
send_string("\x3E\x3E\x3E\x3E\x3E\x3E\x3E\x3E\x3E\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\n"); send_string("Hold "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"Fn"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))" and the number corresponding to a setting below to toggle.\n");
send_string("Hold \x5B \bFn\x5D and the number corresponding to a setting below to toggle.\n"); send_string("Re"SS_TAP(X_KP_MINUS)"print this screen with "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"Fn" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3)) SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"`" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))" to see your changes reflected.\n");
send_string("Re-print this screen with \x5B \bFn\x5D \x5B`\x5D to see your changes reflected.\n"); send_string("Config also visible as RGB under number keys by holding "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"Fn" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))".\n");
send_string("Config also visible as RGB under number keys by holding \x5B \bFn\x5D.\n"); send_string(SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS));
send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d"); send_string(SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS));
send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d"); send_string(SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS));
send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d"); send_string(SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)"\n");
send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n");
send_string("1. CapsLock RGB highlight alpha keys................ "); send_string("1. CapsLock RGB highlight alpha keys................ ");
if (user_config.rgb_hilite_caps) { if (user_config.rgb_hilite_caps) {
send_string("\x5BON\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} else { } else {
send_string("\x5BOFF\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} }
send_string("2. Numpad RGB highlight layer keys.................. "); send_string("2. Numpad RGB highlight layer keys.................. ");
if (user_config.rgb_hilite_numpad) { if (user_config.rgb_hilite_numpad) {
send_string("\x5BON\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} else { } else {
send_string("\x5BOFF\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} }
send_string("3. Double tap ESC to revert to BASE layer........... "); send_string("3. Double tap ESC to revert to BASE layer........... ");
if (user_config.esc_double_tap_to_baselyr) { if (user_config.esc_double_tap_to_baselyr) {
send_string("\x5BON\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} else { } else {
send_string("\x5BOFF\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} }
send_string("4. DEL \x26 HOME key locations......................... "); send_string("4. DEL "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_3)SS_TAP(X_KP_8))" HOME key locations......................... ");
if (user_config.del_right_home_top) { if (user_config.del_right_home_top) {
send_string("\x5BHOME on F13\x3B DEL right of BKSPC\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"HOME on F13"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_9))" DEL right of BKSPC" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} else { } else {
send_string("\x5B \bDEL on F13\x3B HOME right of BKSPC\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"DEL on F13"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_9))" HOME right of BKSPC" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} }
send_string("5. Numpad on CapsLock\x3B double tap LSHIFT for Caps... "); send_string("5. Numpad on CapsLock"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_9))" double tap LSHIFT for Caps... ");
if (user_config.double_tap_shift_for_capslock) { if (user_config.double_tap_shift_for_capslock) {
send_string("\x5BON\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} else { } else {
send_string("\x5BOFF\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} }
send_string("6. Encoder button function.......................... "); send_string("6. Encoder button function.......................... ");
if (user_config.encoder_press_mute_or_media) { if (user_config.encoder_press_mute_or_media) {
send_string("\x5BMUTE\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"MUTE" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} else { } else {
send_string("\x5BMEDIA PLAY\x2FPAUSE\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"MEDIA PLAY"SS_TAP(X_KP_SLASH) "PAUSE" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} }
send_string("7. Insert function accessed with.................... "); send_string("7. Insert function accessed with.................... ");
if (user_config.ins_on_shft_bkspc_or_del) { if (user_config.ins_on_shft_bkspc_or_del) {
send_string("\x5BSHIFT\x2D \bBKSPC\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"SHIFT"SS_TAP(X_KP_MINUS)"BKSPC"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} else { } else {
send_string("\x5BSHIFT\x2D \bDEL\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"SHIFT"SS_TAP(X_KP_MINUS)"DEL"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} }
send_string("8. Force SHIFT \x26 CTRL\x2DSPACE to function like SPACE.. "); send_string("8. Force SHIFT "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_3)SS_TAP(X_KP_8))" CTRL"SS_TAP(X_KP_MINUS)"SPACE to function like SPACE.. ");
if (user_config.disable_space_mods) { if (user_config.disable_space_mods) {
send_string("\x5BON\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} else { } else {
send_string("\x5BOFF\x5D\n"); send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} }
send_string("\nThe latest firmware updates are always here\x3a https\x3a\x2F\x2Fgithub.com\x2Fgourdo1\x2Fgmmkpro\x2Dmedia\n"); send_string("9. AutoCorrect...................................... ");
if (user_config.autocorrect) {
send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} else {
send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
}
send_string("0. CapsLock highlights extended alphas "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_4)SS_TAP(X_KP_0))"ISO"SS_TAP(X_KP_MINUS)"only"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_4)SS_TAP(X_KP_1))"... ");
if (user_config.rgb_english_caps) {
send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
} else {
send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
}
send_string("\nThe latest firmware updates are always here"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_8))" https" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_8))SS_TAP(X_KP_SLASH)SS_TAP(X_KP_SLASH) "github.com"SS_TAP(X_KP_SLASH) "gourdo1"SS_TAP(X_KP_SLASH)"gmmkpro"SS_TAP(X_KP_MINUS)"media\n");
} }
break; break;
@ -247,6 +234,18 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {
eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
} }
break; break;
case TG_AUTOCR: // Toggle AutoCorrect
if (record->event.pressed) {
user_config.autocorrect ^= 1; // Toggles the status
eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
}
break;
case TG_ENGCAP: // Toggle highlighting Non-English letters during CAPSLOCK
if (record->event.pressed) {
user_config.rgb_english_caps ^= 1; // Toggles the status
eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
}
break;
//return false; //return false;
// Key to the left of encoder function (default HOME) // Key to the left of encoder function (default HOME)
@ -417,7 +416,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {
case KC_00: case KC_00:
if (record -> event.pressed) { if (record -> event.pressed) {
// when keycode KC_00 is pressed // when keycode KC_00 is pressed
send_string("00"); send_string(SS_TAP(X_KP_0)SS_TAP(X_KP_0));
} else unregister_code16(keycode); } else unregister_code16(keycode);
break; break;
@ -572,7 +571,7 @@ bool caps_word_press_user(uint16_t keycode) {
case KC_DQT: case KC_DQT:
case KC_COLN: case KC_COLN:
case KC_RSFT: case KC_RSFT:
case LSFTCAPSWIN: case KC_LSFT:
add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to next key. add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to next key.
return true; return true;
@ -625,6 +624,8 @@ void eeconfig_init_user(void) {
user_config.esc_double_tap_to_baselyr = true; user_config.esc_double_tap_to_baselyr = true;
user_config.ins_on_shft_bkspc_or_del = true; user_config.ins_on_shft_bkspc_or_del = true;
user_config.disable_space_mods = true; user_config.disable_space_mods = true;
user_config.autocorrect = true;
user_config.rgb_english_caps = true;
eeconfig_update_user(user_config.raw); eeconfig_update_user(user_config.raw);
} }

View File

@ -57,12 +57,14 @@ enum custom_user_keycodes {
TG_CAPS, // Toggles RGB highlighting of alphas during capslock TG_CAPS, // Toggles RGB highlighting of alphas during capslock
TG_PAD, // Toggles RGB highlighting of keys on numpad+mousekeys layer TG_PAD, // Toggles RGB highlighting of keys on numpad+mousekeys layer
TG_TDCAP, // Toggles double tap shift (tapdance) for CapsLock TG_TDCAP, // Toggles double tap shift for CapsLock
TG_DEL, // Swaps DEL and HOME key locations TG_DEL, // Swaps DEL and HOME key locations
TG_ENC, // Toggle Encoder functionality TG_ENC, // Toggle Encoder button functionality
TG_ESC, // Toggle ESC tapdance for _BASE layer TG_ESC, // Toggle ESC double tap for _BASE layer
TG_INS, // Toggle location of INS TG_INS, // Toggle location of INS
TG_SPCMOD, // Toggle disabling of modded-SPACE functions TG_SPCMOD, // Toggle disabling of modded-SPACE functions
TG_AUTOCR, // Toggle AutoCorrect
TG_ENGCAP, // Toggle highlighting Non-English letters during CAPSLOCK on ISO boards
YAHOO, // yahoo.com YAHOO, // yahoo.com
OUTLOOK, // outlook.com OUTLOOK, // outlook.com
@ -82,12 +84,6 @@ enum custom_user_keycodes {
NEW_SAFE_RANGE // New safe range for keymap level custom keycodes NEW_SAFE_RANGE // New safe range for keymap level custom keycodes
}; };
// Tap Dance Definitions
enum custom_tapdance {
TD_LSFT_CAPS_WIN,
};
// Set up boolean variables to track user customizable configuration options // Set up boolean variables to track user customizable configuration options
typedef union { typedef union {
uint32_t raw; uint32_t raw;
@ -100,12 +96,14 @@ typedef union {
bool encoder_press_mute_or_media :1; bool encoder_press_mute_or_media :1;
bool ins_on_shft_bkspc_or_del :1; bool ins_on_shft_bkspc_or_del :1;
bool disable_space_mods :1; bool disable_space_mods :1;
bool autocorrect :1;
bool rgb_english_caps :1;
}; };
} user_config_t; } user_config_t;
user_config_t user_config; user_config_t user_config;
#define LSFTCAPSWIN TD(TD_LSFT_CAPS_WIN) //#define LSFTCAPSWIN TD(TD_LSFT_CAPS_WIN)
// ENCODER ACTIONS // ENCODER ACTIONS
#ifdef ENCODER_ENABLE #ifdef ENCODER_ENABLE

View File

@ -1,4 +1,6 @@
SRC += gourdo1.c SRC += gourdo1.c
SRC += autocorrect/autocorrection.c
ifdef ENCODER_ENABLE ifdef ENCODER_ENABLE
# include encoder related code when enabled # include encoder related code when enabled
ifeq ($(strip $(ENCODER_DEFAULTACTIONS_ENABLE)), yes) ifeq ($(strip $(ENCODER_DEFAULTACTIONS_ENABLE)), yes)