summaryrefslogtreecommitdiff
path: root/users/gourdo1/autocorrect
diff options
context:
space:
mode:
authorgourdo1 <gourdo1@users.noreply.github.com>2022-08-13 09:24:07 -0700
committerGitHub <noreply@github.com>2022-08-13 17:24:07 +0100
commit4c6ce12d2a671b4e4270648989b7c74ac2876882 (patch)
tree9b87d8c88c8e7ca48b2133a17ef20e9586227827 /users/gourdo1/autocorrect
parent0c0d01966f4ef4af6c945422426894bfc114fdf1 (diff)
Updated gourdo1 GMMK Pro keymaps (#17873)
* Fixed Left Shift tapdance in general and for gaming mode. (#12) * update ISO readme * left shift fixed in general, including for gaming mode * fixed toggle menu rendering on ISO layouts * updated readme's and cosmetics * update readme's * update readme's again * readme cosmetics * consolidate readme's * more readme cosmetics * clarification for bootloader mode on ISO * Autocorrect added with 400 word English dictionary (#13) * autocorrect added with 400 word dictionary * update readme's for autocorrect * Add FN-B as shortcut to bootloader * Update .gitignore Co-authored-by: Joel Challis <git@zvecr.com> * RGB changes to system numlock and ISO extended alphas - hide system numlock off indicator (primarily for Mac users) by moving it to numpad and FN layers instead - give users with extended alpha ISO languages a config option to add RGB highlights for extras alphas on capslock * readme updates * Fixed [FN]B and [FN]N shortcuts not working on numpad layer Co-authored-by: Joel Challis <git@zvecr.com>
Diffstat (limited to 'users/gourdo1/autocorrect')
-rw-r--r--users/gourdo1/autocorrect/autocorrection.c182
-rw-r--r--users/gourdo1/autocorrect/autocorrection.h40
-rw-r--r--users/gourdo1/autocorrect/autocorrection_data.h722
-rw-r--r--users/gourdo1/autocorrect/autocorrection_data.h (large)722
-rw-r--r--users/gourdo1/autocorrect/autocorrection_data.h (small)152
-rw-r--r--users/gourdo1/autocorrect/autocorrection_dict.txt473
-rw-r--r--users/gourdo1/autocorrect/make_autocorrection_data.py303
7 files changed, 2594 insertions, 0 deletions
diff --git a/users/gourdo1/autocorrect/autocorrection.c b/users/gourdo1/autocorrect/autocorrection.c
new file mode 100644
index 0000000000..bc711016d9
--- /dev/null
+++ b/users/gourdo1/autocorrect/autocorrection.c
@@ -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;
+}
diff --git a/users/gourdo1/autocorrect/autocorrection.h b/users/gourdo1/autocorrect/autocorrection.h
new file mode 100644
index 0000000000..d344a815f7
--- /dev/null
+++ b/users/gourdo1/autocorrect/autocorrection.h
@@ -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
+
diff --git a/users/gourdo1/autocorrect/autocorrection_data.h b/users/gourdo1/autocorrect/autocorrection_data.h
new file mode 100644
index 0000000000..66518201e2
--- /dev/null
+++ b/users/gourdo1/autocorrect/autocorrection_data.h
@@ -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};
+
diff --git a/users/gourdo1/autocorrect/autocorrection_data.h (large) b/users/gourdo1/autocorrect/autocorrection_data.h (large)
new file mode 100644
index 0000000000..66518201e2
--- /dev/null
+++ b/users/gourdo1/autocorrect/autocorrection_data.h (large)
@@ -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};
+
diff --git a/users/gourdo1/autocorrect/autocorrection_data.h (small) b/users/gourdo1/autocorrect/autocorrection_data.h (small)
new file mode 100644
index 0000000000..f98471bb08
--- /dev/null
+++ b/users/gourdo1/autocorrect/autocorrection_data.h (small)
@@ -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};
+
diff --git a/users/gourdo1/autocorrect/autocorrection_dict.txt b/users/gourdo1/autocorrect/autocorrection_dict.txt
new file mode 100644
index 0000000000..b5f293d96c
--- /dev/null
+++ b/users/gourdo1/autocorrect/autocorrection_dict.txt
@@ -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
+
diff --git a/users/gourdo1/autocorrect/make_autocorrection_data.py b/users/gourdo1/autocorrect/make_autocorrection_data.py
new file mode 100644
index 0000000000..8e0bcf9e8e
--- /dev/null
+++ b/users/gourdo1/autocorrect/make_autocorrection_data.py
@@ -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)