diff --git a/movement/make/Makefile b/movement/make/Makefile index da5486b0..f2b20eba 100644 --- a/movement/make/Makefile +++ b/movement/make/Makefile @@ -129,6 +129,7 @@ SRCS += \ ../watch_faces/clock/minute_repeater_decimal_face.c \ ../watch_faces/complication/tuning_tones_face.c \ ../watch_faces/complication/kitchen_conversions_face.c \ + ../watch_faces/complication/wordle_face.c \ # New watch faces go above this line. # Leave this line at the bottom of the file; it has all the targets for making your project. diff --git a/movement/movement_faces.h b/movement/movement_faces.h index 35571109..f697e724 100644 --- a/movement/movement_faces.h +++ b/movement/movement_faces.h @@ -104,6 +104,7 @@ #include "minute_repeater_decimal_face.h" #include "tuning_tones_face.h" #include "kitchen_conversions_face.h" +#include "wordle_face.h" // New includes go above this line. #endif // MOVEMENT_FACES_H_ diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c new file mode 100644 index 00000000..8381cec4 --- /dev/null +++ b/movement/watch_faces/complication/wordle_face.c @@ -0,0 +1,602 @@ +/* + * MIT License + * + * Copyright (c) 2024 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include +#include "wordle_face.h" +#include "watch_utility.h" + +static uint32_t get_random(uint32_t max) { + #if __EMSCRIPTEN__ + return rand() % max; + #else + return arc4random_uniform(max); + #endif +} + +static uint8_t get_first_pos(WordleLetterResult *word_elements_result) { + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (word_elements_result[i] != WORDLE_LETTER_CORRECT) + return i; + } + return 0; +} + +static uint8_t get_next_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { + for (size_t pos = curr_pos; pos < WORDLE_LENGTH;) { + if (word_elements_result[++pos] != WORDLE_LETTER_CORRECT) + return pos; + } + return WORDLE_LENGTH; +} + +static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { + if (curr_pos == 0) return 0; + for (int8_t pos = curr_pos; pos >= 0;) { + if (word_elements_result[--pos] != WORDLE_LETTER_CORRECT) + return pos; + } + return curr_pos; +} + +static void get_next_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters, const bool skip_wrong_letter) { + do { + if (word_elements[curr_pos] >= WORDLE_NUM_VALID_LETTERS) word_elements[curr_pos] = 0; + else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % WORDLE_NUM_VALID_LETTERS; + } while (skip_wrong_letter && known_wrong_letters[word_elements[curr_pos]]); +} + +static void get_prev_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters, const bool skip_wrong_letter) { + do { + if (word_elements[curr_pos] >= WORDLE_NUM_VALID_LETTERS) word_elements[curr_pos] = WORDLE_NUM_VALID_LETTERS - 1; + else word_elements[curr_pos] = (word_elements[curr_pos] + WORDLE_NUM_VALID_LETTERS - 1) % WORDLE_NUM_VALID_LETTERS; + } while (skip_wrong_letter && known_wrong_letters[word_elements[curr_pos]]); +} + +static void display_letter(wordle_state_t *state, bool display_dash) { + char buf[1 + 1]; + if (state->word_elements[state->position] >= WORDLE_NUM_VALID_LETTERS) { + if (display_dash) + watch_display_string("-", state->position + 5); + else + watch_display_string(" ", state->position + 5); + return; + } + sprintf(buf, "%c", _valid_letters[state->word_elements[state->position]]); + watch_display_string(buf, state->position + 5); +} + +static void display_all_letters(wordle_state_t *state) { + uint8_t prev_pos = state->position; + watch_display_string(" ", 4); + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + state->position = i; + display_letter(state, false); + } + state->position = prev_pos; +} + +#if !WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES +static void display_not_in_dict(wordle_state_t *state) { + state->curr_screen = SCREEN_NO_DICT; + watch_display_string("nodict", 4); +} + +static void display_already_guessed(wordle_state_t *state) { + state->curr_screen = SCREEN_ALREADY_GUESSED; + watch_display_string("GUESSD", 4); +} + +static uint32_t check_word_in_dict(uint8_t *word_elements) { + bool is_exact_match; + for (uint16_t i = 0; i < WORDLE_NUM_WORDS; i++) { + is_exact_match = true; + for (size_t j = 0; j < WORDLE_LENGTH; j++) { + if (_valid_letters[word_elements[j]] != _valid_words[i][j]) { + is_exact_match = false; + break; + } + } + if (is_exact_match) return i; + } + for (uint16_t i = 0; i < WORDLE_NUM_POSSIBLE_WORDS; i++) { + is_exact_match = true; + for (size_t j = 0; j < WORDLE_LENGTH; j++) { + if (_valid_letters[word_elements[j]] != _possible_words[i][j]) { + is_exact_match = false; + break; + } + } + if (is_exact_match) return WORDLE_NUM_WORDS + i; + } + return WORDLE_NUM_WORDS + WORDLE_NUM_POSSIBLE_WORDS; +} +#endif + +static bool check_word(wordle_state_t *state) { + // Exact + bool is_exact_match = true; + bool answer_already_accounted[WORDLE_LENGTH] = { false }; + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (_valid_letters[state->word_elements[i]] == _valid_words[state->curr_answer][i]) { + state->word_elements_result[i] = WORDLE_LETTER_CORRECT; + answer_already_accounted[i] = true; + } + else { + state->word_elements_result[i] = WORDLE_LETTER_WRONG; + is_exact_match = false; + } + } + if (is_exact_match) return true; + // Wrong Location + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements_result[i] != WORDLE_LETTER_WRONG) continue; + for (size_t j = 0; j < WORDLE_LENGTH; j++) { + if (answer_already_accounted[j]) continue; + if (_valid_letters[state->word_elements[i]] == _valid_words[state->curr_answer][j]) { + state->word_elements_result[i] = WORDLE_LETTER_WRONG_LOC; + answer_already_accounted[j] = true; + break; + } + } + } + return false; +} + +static void show_skip_wrong_letter_indicator(bool skipping, WordleScreen curr_screen) { + if (curr_screen >= SCREEN_PLAYING) return; + if (skipping) + watch_display_string("H", 3); + else + watch_display_string(" ", 3); +} + +static void update_known_wrong_letters(wordle_state_t *state) { + bool wrong_loc[WORDLE_NUM_VALID_LETTERS] = {false}; + // To ignore letters that appear, but are in the wrong location, as letters that are guessed + // more often than they appear in the word will display as WORDLE_LETTER_WRONG + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements_result[i] == WORDLE_LETTER_WRONG_LOC) { + for (size_t j = 0; j < WORDLE_NUM_VALID_LETTERS; j++) { + if (state->word_elements[i] == j) + wrong_loc[j] = true; + } + } + } + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements_result[i] == WORDLE_LETTER_WRONG) { + for (size_t j = 0; j < WORDLE_NUM_VALID_LETTERS; j++) { + if (state->word_elements[i] == j && !wrong_loc[j]) + state->known_wrong_letters[j] = true; + } + } + } +} + +static void display_attempt(uint8_t attempt) { + char buf[3]; + sprintf(buf, "%d", attempt+1); + watch_display_string(buf, 3); +} + +static void display_playing(wordle_state_t *state) { + state->curr_screen = SCREEN_PLAYING; + display_attempt(state->attempt); + display_all_letters(state); +} + +static void reset_all_elements(wordle_state_t *state) { + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + state->word_elements[i] = WORDLE_NUM_VALID_LETTERS; + state->word_elements_result[i] = WORDLE_LETTER_WRONG; + } + for (size_t i = 0; i < WORDLE_NUM_VALID_LETTERS; i++){ + state->known_wrong_letters[i] = false; + } +#if !WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES + for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) { + state->guessed_words[i] = WORDLE_NUM_WORDS + WORDLE_NUM_POSSIBLE_WORDS; + } +#endif + state->using_random_guess = false; + state->attempt = 0; +} + +static void reset_incorrect_elements(wordle_state_t *state) { + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements_result[i] != WORDLE_LETTER_CORRECT) + state->word_elements[i] = WORDLE_NUM_VALID_LETTERS; + } +} + +static void reset_board(wordle_state_t *state) { + reset_all_elements(state); + state->curr_answer = get_random(WORDLE_NUM_WORDS); + watch_clear_colon(); + state->position = get_first_pos(state->word_elements_result); + display_playing(state); + watch_display_string(" -", 4); +#if __EMSCRIPTEN__ + printf("ANSWER: %s\r\n", _valid_words[state->curr_answer]); +#endif +} + +static void display_title(wordle_state_t *state) { + state->curr_screen = SCREEN_TITLE; + watch_display_string("WO WordLE", 0); + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); +} + +#if WORDLE_USE_DAILY_STREAK != 2 +static void display_continue_result(bool continuing) { + watch_display_string(continuing ? "y" : "n", 9); +} + +static void display_continue(wordle_state_t *state) { + state->curr_screen = SCREEN_CONTINUE; + watch_display_string("Cont ", 4); + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); + display_continue_result(state->continuing); +} +#endif + +static void display_streak(wordle_state_t *state) { + char buf[12]; + state->curr_screen = SCREEN_STREAK; +#if WORDLE_USE_DAILY_STREAK == 2 + if (state->streak > 99) + sprintf(buf, "WO St--dy"); + else + sprintf(buf, "WO St%2ddy", state->streak); +#else + sprintf(buf, "WO St%4d", state->streak); +#endif + watch_display_string(buf, 0); + watch_set_colon(); + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); +} + +#if WORDLE_USE_DAILY_STREAK == 2 +static void display_wait(wordle_state_t *state) { + state->curr_screen = SCREEN_WAIT; + if (state->streak < 40) { + char buf[13]; + sprintf(buf,"WO%2d WaIt ", state->streak); + watch_display_string(buf, 0); + } + else { // Streak too long to display in top-right + watch_display_string("WO WaIt ", 0); + } + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); +} +#endif + +static uint32_t get_day_unix_time(void) { + watch_date_time now = watch_rtc_get_date_time(); +#if WORDLE_USE_DAILY_STREAK == 2 + now.unit.hour = now.unit.minute = now.unit.second = 0; +#endif + return watch_utility_date_time_to_unix_time(now, 0); +} + +static void display_lose(wordle_state_t *state, uint8_t subsecond) { + char buf[WORDLE_LENGTH + 6]; + sprintf(buf," L %s", subsecond % 2 ? _valid_words[state->curr_answer] : " "); + watch_display_string(buf, 0); +} + +static void display_win(wordle_state_t *state, uint8_t subsecond) { + (void) state; + char buf[13]; + sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOb "); + watch_display_string(buf, 0); +} + +static bool is_playing(const wordle_state_t *state) { + if (state->attempt > 0) return true; + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements[i] != WORDLE_NUM_VALID_LETTERS) + return true; + } + return false; +} + +static void display_result(wordle_state_t *state, uint8_t subsecond) { + char buf[WORDLE_LENGTH + 1]; + for (size_t i = 0; i < WORDLE_LENGTH; i++) + { + switch (state->word_elements_result[i]) + { + case WORDLE_LETTER_WRONG: + buf[i] = '-'; + break; + case WORDLE_LETTER_CORRECT: + buf[i] = _valid_letters[state->word_elements[i]]; + break; + case WORDLE_LETTER_WRONG_LOC: + if (subsecond % 2) + buf[i] = ' '; + else + buf[i] = _valid_letters[state->word_elements[i]]; + default: + break; + } + } + watch_display_string(buf, 5); +} + +static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { + switch (state->curr_screen) + { + case SCREEN_RESULT: + reset_incorrect_elements(state); + state->position = get_first_pos(state->word_elements_result); + display_playing(state); + return true; + case SCREEN_TITLE: +#if WORDLE_USE_DAILY_STREAK == 2 + if (state->day_last_game_started == get_day_unix_time()) { + display_wait(state); + } + else if (is_playing(state)) + display_playing(state); + else + display_streak(state); +#else + if (is_playing(state)) { + state->continuing = true; + display_continue(state); + } + else + display_streak(state); +#endif + return true; + case SCREEN_STREAK: + state->day_last_game_started = get_day_unix_time(); + reset_board(state); + return true; + case SCREEN_WIN: + case SCREEN_LOSE: + display_title(state); + return true; + case SCREEN_NO_DICT: + case SCREEN_ALREADY_GUESSED: + state->position = get_first_pos(state->word_elements_result); + display_playing(state); + return true; +#if WORDLE_USE_DAILY_STREAK == 2 + case SCREEN_WAIT: + (void) pin; + display_title(state); + return true; +#else + case SCREEN_CONTINUE: + switch (pin) + { + case BTN_ALARM: + if (state->continuing) + display_playing(state); + else { + reset_board(state); + state->streak = 0; + display_streak(state); + } + break; + case BTN_LIGHT: + state->continuing = !state->continuing; + display_continue_result(state->continuing); + break; + } + return true; +#endif + default: + return false; + } + return false; +} + +static void get_result(wordle_state_t *state) { +#if !WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES + // Check if it's in the dict + uint16_t in_dict = check_word_in_dict(state->word_elements); + if (in_dict == WORDLE_NUM_WORDS + WORDLE_NUM_POSSIBLE_WORDS) { + display_not_in_dict(state); + return; + } + + // Check if already guessed + for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) { + if(in_dict == state->guessed_words[i]) { + display_already_guessed(state); + return; + } + } + + state->guessed_words[state->attempt] = in_dict; +#endif + bool exact_match = check_word(state); + if (exact_match) { + reset_all_elements(state); + state->curr_screen = SCREEN_WIN; + if (state->streak < 0x7F) + state->streak++; +#if WORDLE_USE_DAILY_STREAK == 2 + state->day_last_game_started = get_day_unix_time(); // On the edge-case where we solve the puzzle at midnight +#endif + return; + } + if (++state->attempt >= WORDLE_MAX_ATTEMPTS) { + reset_all_elements(state); + state->curr_screen = SCREEN_LOSE; + state->streak = 0; + return; + } + update_known_wrong_letters(state); + state->curr_screen = SCREEN_RESULT; + return; +} + +#if (WORDLE_USE_RANDOM_GUESS != 0) +static void insert_random_guess(wordle_state_t *state) { + uint16_t random_guess; + do { // Don't allow the guess to be the same as the answer + random_guess = get_random(_num_random_guess_words); + } while (random_guess == state->curr_answer); + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + for (size_t j = 0; j < WORDLE_NUM_VALID_LETTERS; j++) + { + if (_valid_words[random_guess][i] == _valid_letters[j]) + state->word_elements[i] = j; + } + } + state->position = WORDLE_LENGTH - 1; + display_all_letters(state); + state->using_random_guess = true; +} +#endif + +void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr) { + (void) settings; + (void) watch_face_index; + if (*context_ptr == NULL) { + *context_ptr = malloc(sizeof(wordle_state_t)); + memset(*context_ptr, 0, sizeof(wordle_state_t)); + wordle_state_t *state = (wordle_state_t *)*context_ptr; + state->curr_screen = SCREEN_TITLE; + state->skip_wrong_letter = false; + reset_all_elements(state); + } + // Do any pin or peripheral setup here; this will be called whenever the watch wakes from deep sleep. +} + +void wordle_face_activate(movement_settings_t *settings, void *context) { + (void) settings; + wordle_state_t *state = (wordle_state_t *)context; +#if WORDLE_USE_DAILY_STREAK != 0 + uint32_t now = get_day_unix_time(); + uint32_t one_day = 60 *60 * 24; + if ((WORDLE_USE_DAILY_STREAK == 2 && now >= (state->day_last_game_started + (2*one_day))) + || (now >= (state->day_last_game_started + one_day) && is_playing(state))) { + state->streak = 0; + reset_board(state); + } +#endif + state->using_random_guess = false; + if (is_playing(state) && state->curr_screen >= SCREEN_RESULT) { + reset_incorrect_elements(state); + state->position = get_first_pos(state->word_elements_result); + } + movement_request_tick_frequency(2); + display_title(state); +} + +bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, void *context) { + wordle_state_t *state = (wordle_state_t *)context; + + switch (event.event_type) { + case EVENT_TICK: + switch (state->curr_screen) + { + case SCREEN_PLAYING: + if (event.subsecond % 2) { + display_letter(state, true); + } else { + watch_display_string(" ", state->position + 5); + } + break; + case SCREEN_RESULT: + display_result(state, event.subsecond); + break; + case SCREEN_LOSE: + display_lose(state, event.subsecond); + break; + case SCREEN_WIN: + display_win(state, event.subsecond); + break; + default: + break; + } + break; + case EVENT_LIGHT_BUTTON_UP: + if (act_on_btn(state, BTN_LIGHT)) break; + get_next_letter(state->position, state->word_elements, state->known_wrong_letters, state->skip_wrong_letter); + display_letter(state, true); + break; + case EVENT_LIGHT_LONG_PRESS: + if (state->curr_screen < SCREEN_PLAYING) { + state->skip_wrong_letter = !state->skip_wrong_letter; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); + break; + } + if (state->curr_screen != SCREEN_PLAYING) break; + get_prev_letter(state->position, state->word_elements, state->known_wrong_letters, state->skip_wrong_letter); + display_letter(state, true); + break; + case EVENT_ALARM_BUTTON_UP: + if (act_on_btn(state, BTN_ALARM)) break; + display_letter(state, true); + if (state->word_elements[state->position] == WORDLE_NUM_VALID_LETTERS) break; +#if (WORDLE_USE_RANDOM_GUESS != 0) + if (watch_get_pin_level(BTN_LIGHT) && + (state->using_random_guess || (state->attempt == 0 && state->position == 0))) { + insert_random_guess(state); + break; + } +#endif + state->position = get_next_pos(state->position, state->word_elements_result); + if (state->position >= WORDLE_LENGTH) { + get_result(state); + state->using_random_guess = false; + } + break; + case EVENT_ALARM_LONG_PRESS: + if (state->curr_screen != SCREEN_PLAYING) break; + display_letter(state, true); + state->position = get_prev_pos(state->position, state->word_elements_result); + break; + case EVENT_LIGHT_BUTTON_DOWN: + case EVENT_ACTIVATE: + break; + case EVENT_TIMEOUT: + if (state->curr_screen >= SCREEN_RESULT) { + reset_incorrect_elements(state); + state->position = get_first_pos(state->word_elements_result); + display_title(state); + } + break; + case EVENT_LOW_ENERGY_UPDATE: + if (state->curr_screen != SCREEN_TITLE) + display_title(state); + break; + default: + return movement_default_loop_handler(event, settings); + } + return true; +} + +void wordle_face_resign(movement_settings_t *settings, void *context) { + (void) settings; + (void) context; +} + diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h new file mode 100644 index 00000000..f390e736 --- /dev/null +++ b/movement/watch_faces/complication/wordle_face.h @@ -0,0 +1,149 @@ +/* + * MIT License + * + * Copyright (c) 2024 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef WORDLE_FACE_H_ +#define WORDLE_FACE_H_ + +#include "movement.h" + +/* + * Wordle Face + * A port of NY Times' Wordle game (https://www.nytimes.com/games/wordle/index.html) + * A random 5 letter word is chosen and you have WORDLE_MAX_ATTEMPTS attempts to guess it. + * Each guess must be a valid 5-letter word found in _legal_words in the C file. + * The only letters used are _valid_letters, also found in the C file. + * After a guess, the letters in the correct spot will remain, + * and the letters found in the word, but in the incorrect spot will blink. + * The screen after the title screen if a new game is started shows the streak of games won in a row. + * + * If WORDLE_USE_DAILY_STREAK is set to True, then the game can only be played once per day, + * and the streak resets to 0 if a day goes by without playing the game. + * + * Controls: + * Light Press + * If Playing: Next letter + * Else: Next screen + * Light Hold + * If Playing: Previous letter + * Else: Toggle Hard-Mode. This is skipping over letters that have been confirmed + * to not be in the word (indicated via 'H' in the top-right) + * + * Alarm Press + * If Playing: If WORDLE_USE_RANDOM_GUESS is set and Light btn held and + * (on first letter or already used a random guess) + * and first attempt: Use a random 5 letter word with all letters that are different. + * Else: Next position + * Else: Next screen + * Alarm Hold + * If Playing: Previous position + * Else: None + * + * Note: Actual Hard Mode in Wordle game is "Any revealed hints must be used in subsequent guesses" + * But that came off as clunky UX on the Casio. So instead it only removes unused letters from the keyboard + * as that also simplifies the keyboard. + */ + +#define WORDLE_LENGTH 5 +#define WORDLE_MAX_ATTEMPTS 6 +/* WORDLE_USE_DAILY_STREAK + * 0 = Don't ever reset the streak or the puzzle. + * 1 = Reset the streak and puzzle 24hrs after starting a puzzle and not finishing it. + * If the last puzzle was started at 8AM, it'll be considered failed at 8AM the next day. + * 2 = Reset the streak and puzzle if a puzzle goes unsolved or not started a day after the previous one. + * If the last puzzle was started at 8AM, it'll be considered failed at midnight the next day. + * This will not be the case if the puzzle is started at 8AM, continued at 11:59PM and solved at 12:01AM, the game will let that slide. + * Starting a new game instead of continuing is not allowed in this state. +*/ +#define WORDLE_USE_DAILY_STREAK 1 +#define WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES false // This allows non-words to be entered and repeat guesses to be made. It saves ~11.5KB of ROM. +/* WORDLE_USE_RANDOM_GUESS + * 0 = Don't allow quickly choosing a random quess + * 1 = Allow using a random guess of any value that can be an answer + * 2 = Allow using a random guess of any value that can be an answer where all of its letters are unique + * 3 = Allow using a random guess of any value that can be an answer, and it's considered one of the best initial choices. +*/ +#define WORDLE_USE_RANDOM_GUESS 2 +#include "wordle_face_dict.h" + +#define WORDLE_NUM_WORDS (sizeof(_valid_words) / sizeof(_valid_words[0])) +#define WORDLE_NUM_POSSIBLE_WORDS (sizeof(_possible_words) / sizeof(_possible_words[0])) +#define WORDLE_NUM_VALID_LETTERS (sizeof(_valid_letters) / sizeof(_valid_letters[0])) + +typedef enum { + WORDLE_LETTER_WRONG = 0, + WORDLE_LETTER_WRONG_LOC, + WORDLE_LETTER_CORRECT, + WORDLE_LETTER_COUNT +} WordleLetterResult; + +typedef enum { + SCREEN_TITLE = 0, + SCREEN_STREAK, + SCREEN_CONTINUE, +#if WORDLE_USE_DAILY_STREAK + SCREEN_WAIT, +#endif + SCREEN_PLAYING, + SCREEN_RESULT, + SCREEN_WIN, + SCREEN_LOSE, + SCREEN_NO_DICT, + SCREEN_ALREADY_GUESSED, + SCREEN_COUNT +} WordleScreen; + +typedef struct { + // Anything you need to keep track of, put it here! + uint8_t word_elements[WORDLE_LENGTH]; + WordleLetterResult word_elements_result[WORDLE_LENGTH]; +#if !WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES + uint16_t guessed_words[WORDLE_MAX_ATTEMPTS]; +#endif + uint8_t attempt : 4; + uint8_t position : 3; + bool using_random_guess : 1; + uint16_t curr_answer : 14; + bool continuing : 1; + bool skip_wrong_letter : 1; + uint8_t streak; + WordleScreen curr_screen; + bool known_wrong_letters[WORDLE_NUM_VALID_LETTERS]; + uint32_t day_last_game_started; +} wordle_state_t; + +void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr); +void wordle_face_activate(movement_settings_t *settings, void *context); +bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, void *context); +void wordle_face_resign(movement_settings_t *settings, void *context); + +#define wordle_face ((const watch_face_t){ \ + wordle_face_setup, \ + wordle_face_activate, \ + wordle_face_loop, \ + wordle_face_resign, \ + NULL, \ +}) + +#endif // WORDLE_FACE_H_ + diff --git a/movement/watch_faces/complication/wordle_face_dict.h b/movement/watch_faces/complication/wordle_face_dict.h new file mode 100644 index 00000000..6b82976c --- /dev/null +++ b/movement/watch_faces/complication/wordle_face_dict.h @@ -0,0 +1,293 @@ +#ifndef WORDLE_FACE_DICT_H_ +#define WORDLE_FACE_DICT_H_ + +#ifndef WORDLE_LENGTH +#define WORDLE_LENGTH 5 +#endif + +#ifndef WORDLE_USE_RANDOM_GUESS +#define WORDLE_USE_RANDOM_GUESS 2 +#endif + +static const char _valid_letters[] = {'A', 'C', 'E', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'S', 'T'}; + +// From: https://matthewminer.name/projects/calculators/wordle-words-left/ +// Number of words found: 432 +static const char _valid_words[][WORDLE_LENGTH + 1] = { + "SLATE", "STARE", "SNARE", "SANER", "CRANE", "STALE", "CRATE", "RAISE", "TRACE", + "SHARE", "ARISE", "SCARE", "SPARE", "CHAOS", "TAPIR", "CAIRN", "TENOR", "CLEAN", + "HEART", "SCOPE", "SNARL", "SLEPT", "SINCE", "EPOCH", "SPACE", "RELIC", "SPOIL", + "LITER", "LEAPT", "LANCE", "RANCH", "HORSE", "LEACH", "LATER", "STEAL", "CHEAP", + "SHORT", "ETHIC", "CHANT", "ACTOR", "REACH", "SEPIA", "ONSET", "SPLAT", "LEANT", + "REACT", "OCTAL", "SPORE", "IRATE", "CORAL", "NICER", "SPILT", "SCENT", "PANIC", + "SHIRT", "PECAN", "SLAIN", "SPLIT", "ROACH", "ASCOT", "PHONE", "LITHE", "STOIC", + "STRIP", "RENAL", "POISE", "ENACT", "CHEAT", "PITCH", "NOISE", "INLET", "PEARL", + "POLAR", "PEACH", "STOLE", "CASTE", "CREST", "CRONE", "ETHOS", "THEIR", "STONE", + "SHIRE", "LATCH", "HASTE", "CLOSE", "SPINE", "SLANT", "SPEAR", "SCALE", "CAPER", + "RETCH", "PESTO", "CHIRP", "SPORT", "OPTIC", "SNAIL", "PRICE", "PLANE", "TORCH", + "PASTE", "RECAP", "SOLAR", "CRASH", "LINER", "OPINE", "ASHEN", "PALER", "ECLAT", + "SPELT", "TRIAL", "PERIL", "SLICE", "SCANT", "SAINT", "POSIT", "ATONE", "SPIRE", + "COAST", "INEPT", "SHOAL", "CLASH", "THORN", "PHASE", "SCORE", "TRICE", "PERCH", + "PORCH", "SHEAR", "CHOIR", "RHINO", "PLANT", "SHONE", "CHORE", "LEARN", "ALTER", + "CHAIN", "PANEL", "PLIER", "STEIN", "COPSE", "SONIC", "ALIEN", "CHOSE", "ACORN", + "ANTIC", "CHEST", "OTHER", "CHINA", "TALON", "SCORN", "PLAIN", "PILOT", "RIPEN", + "PATCH", "SPICE", "CLONE", "SCION", "SCONE", "STRAP", "PARSE", "SHALE", "RISEN", + "CANOE", "INTER", "LEASH", "ISLET", "PRINT", "SHINE", "NORTH", "CLEAT", "PLAIT", + "SCRAP", "CLEAR", "SLOTH", "LAPSE", "CHAIR", "SNORT", "SHARP", "OPERA", "STAIN", + "TEACH", "TRAIL", "TRAIN", "LATHE", "PIANO", "PINCH", "PETAL", "STERN", "PRONE", + "PROSE", "PLEAT", "TROPE", "PLACE", "POSER", "INERT", "CHASE", "CAROL", "STAIR", + "SATIN", "SPITE", "LOATH", "ROAST", "ARSON", "SHAPE", "CLASP", "LOSER", "SALON", + "CATER", "SHALT", "INTRO", "ALERT", "PENAL", "SHORE", "RINSE", "CREPT", "APRON", + "SONAR", "AISLE", "AROSE", "HATER", "NICHE", "POINT", "EARTH", "PINTO", "THOSE", + "CLOTH", "NOTCH", "TOPIC", "RESIN", "SCALP", "HEIST", "HERON", "TRIPE", "TONAL", + "TAPER", "SHORN", "TONIC", "HOIST", "SNORE", "STORE", "SLOPE", "OCEAN", "CHART", + "PAINT", "SPENT", "SNIPE", "CRISP", "TRASH", "PATIO", "PLATE", "HOTEL", "LEAST", + "ALONE", "RALPH", "SPIEL", "SIREN", "RATIO", "STOOP", "TROLL", "ATOLL", "SLASH", + "RETRO", "CREEP", "STILT", "SPREE", "TASTE", "CACHE", "CANON", "EATEN", "TEPEE", + "SHEET", "SNEER", "ERROR", "NATAL", "SLEEP", "STINT", "TROOP", "SHALL", "STALL", + "PIPER", "TOAST", "NASAL", "CORER", "THERE", "POOCH", "SCREE", "ELITE", "ALTAR", + "PENCE", "EATER", "ALPHA", "TENTH", "LINEN", "SHEER", "TAINT", "HEATH", "CRIER", + "TENSE", "CARAT", "CANAL", "APNEA", "THESE", "HATCH", "SHELL", "CIRCA", "APART", + "SPILL", "STEEL", "LOCAL", "STOOL", "SHEEN", "RESET", "STEEP", "ELATE", "PRESS", + "SLEET", "CROSS", "TOTAL", "TREAT", "ONION", "STATE", "CINCH", "ASSET", "THREE", + "TORSO", "SNOOP", "PENNE", "SPOON", "SHEEP", "PAPAL", "STILL", "CHILL", "THETA", + "LEECH", "INNER", "HONOR", "LOOSE", "CONIC", "SCENE", "COACH", "CONCH", "LATTE", + "ERASE", "ESTER", "PEACE", "PASTA", "INANE", "SPOOL", "TEASE", "HARSH", "PIECE", + "STEER", "SCOOP", "NINTH", "OTTER", "OCTET", "EERIE", "RISER", "LAPEL", "HIPPO", + "PREEN", "ETHER", "AORTA", "SENSE", "TRACT", "SHOOT", "SLOOP", "REPEL", "TITHE", + "IONIC", "CELLO", "CHESS", "SOOTH", "COCOA", "TITAN", "TOOTH", "TIARA", "CRESS", + "SLOSH", "RARER", "TERSE", "ERECT", "HELLO", "PARER", "RIPER", "NOOSE", "CREPE", + "CACAO", "ILIAC", "POSSE", "CACTI", "EASEL", "LASSO", "ROOST", "ALLOT", "COLON", + "LEPER", "TEETH", "TITLE", "HENCE", "NIECE", "PAPER", "TRITE", "SPELL", "RACER", + "ATTIC", "CRASS", "HITCH", "LEASE", "CEASE", "ROTOR", "ELOPE", "APPLE", "CHILI", + "START", "PHOTO", "SALSA", "STASH", "PRIOR", "TAROT", "COLOR", "CHEER", "CLASS", + "ARENA", "ELECT", "ENTER", "CATCH", "TENET", "TACIT", "TRAIT", "TERRA", "LILAC", +}; + +// These are words that'll never be used, but still need to be in the dictionary for guesses. +// Number of words found: 1898 +static const char _possible_words[][WORDLE_LENGTH + 1] = { +#if !WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES + "AALII", "AARTI", "ACAIS", "ACARI", "ACCAS", "ACERS", "ACETA", "ACHAR", "ACHES", + "ACHOO", "ACINI", "ACNES", "ACRES", "ACROS", "ACTIN", "ACTON", "AECIA", "AEONS", + "AERIE", "AEROS", "AESIR", "AHEAP", "AHENT", "AHINT", "AINEE", "AIOLI", "AIRER", + "AIRNS", "AIRTH", "AIRTS", "AITCH", "ALAAP", "ALANE", "ALANS", "ALANT", "ALAPA", + "ALAPS", "ALATE", "ALCOS", "ALECS", "ALEPH", "ALIAS", "ALINE", "ALIST", "ALLEE", + "ALLEL", "ALLIS", "ALOES", "ALOHA", "ALOIN", "ALOOS", "ALTHO", "ALTOS", "ANANA", + "ANATA", "ANCHO", "ANCLE", "ANCON", "ANEAR", "ANELE", "ANENT", "ANILE", "ANILS", + "ANION", "ANISE", "ANLAS", "ANNAL", "ANNAS", "ANNAT", "ANOAS", "ANOLE", "ANSAE", + "ANTAE", "ANTAR", "ANTAS", "ANTES", "ANTIS", "ANTRA", "ANTRE", "APACE", "APERS", + "APERT", "APHIS", "APIAN", "APIOL", "APISH", "APOOP", "APORT", "APPAL", "APPEL", + "APPRO", "APRES", "APSES", "APSIS", "APSOS", "APTER", "ARARS", "ARCHI", "ARCOS", + "AREAE", "AREAL", "AREAR", "AREAS", "ARECA", "AREIC", "ARENE", "AREPA", "ARERE", + "ARETE", "ARETS", "ARETT", "ARHAT", "ARIAS", "ARIEL", "ARILS", "ARIOT", "ARISH", + "ARLES", "ARNAS", "AROHA", "ARPAS", "ARPEN", "ARRAH", "ARRAS", "ARRET", "ARRIS", + "ARSES", "ARSIS", "ARTAL", "ARTEL", "ARTIC", "ARTIS", "ASANA", "ASCON", "ASHES", + "ASHET", "ASPEN", "ASPER", "ASPIC", "ASPIE", "ASPIS", "ASPRO", "ASSAI", "ASSES", + "ASSOT", "ASTER", "ASTIR", "ATAPS", "ATILT", "ATLAS", "ATOCS", "ATRIA", "ATRIP", + "ATTAP", "ATTAR", "CACAS", "CAECA", "CAESE", "CAINS", "CALLA", "CALLS", "CALOS", + "CALPA", "CALPS", "CANEH", "CANER", "CANES", "CANNA", "CANNS", "CANSO", "CANST", + "CANTO", "CANTS", "CAPAS", "CAPES", "CAPHS", "CAPLE", "CAPON", "CAPOS", "CAPOT", + "CAPRI", "CARAP", "CARER", "CARES", "CARET", "CARLE", "CARLS", "CARNS", "CARON", + "CARPI", "CARPS", "CARRS", "CARSE", "CARTA", "CARTE", "CARTS", "CASAS", "CASCO", + "CASES", "CASTS", "CATES", "CECAL", "CEILI", "CEILS", "CELLA", "CELLI", "CELLS", + "CELTS", "CENSE", "CENTO", "CENTS", "CEORL", "CEPES", "CERCI", "CERES", "CERIA", + "CERIC", "CERNE", "CEROC", "CEROS", "CERTS", "CESSE", "CESTA", "CESTI", "CETES", + "CHACE", "CHACO", "CHAIS", "CHALS", "CHANA", "CHAPE", "CHAPS", "CHAPT", "CHARA", + "CHARE", "CHARR", "CHARS", "CHATS", "CHEEP", "CHELA", "CHELP", "CHERE", "CHERT", + "CHETH", "CHIAO", "CHIAS", "CHICA", "CHICH", "CHICO", "CHICS", "CHIEL", "CHILE", + "CHINE", "CHINO", "CHINS", "CHIPS", "CHIRL", "CHIRO", "CHIRR", "CHIRT", "CHITS", + "CHOCO", "CHOCS", "CHOIL", "CHOLA", "CHOLI", "CHOLO", "CHONS", "CHOON", "CHOPS", + "CHOTA", "CHOTT", "CIELS", "CILIA", "CILLS", "CINCT", "CINES", "CIONS", "CIPPI", + "CIRCS", "CIRES", "CIRLS", "CIRRI", "CISCO", "CISTS", "CITAL", "CITER", "CITES", + "CLACH", "CLAES", "CLANS", "CLAPS", "CLAPT", "CLARO", "CLART", "CLAST", "CLATS", + "CLEEP", "CLEPE", "CLEPT", "CLIES", "CLINE", "CLINT", "CLIPE", "CLIPS", "CLIPT", + "CLITS", "CLONS", "CLOOP", "CLOOT", "CLOPS", "CLOTE", "CLOTS", "COACT", "COALA", + "COALS", "COAPT", "COATE", "COATI", "COATS", "COCAS", "COCCI", "COCCO", "COCOS", + "COHEN", "COHOE", "COHOS", "COILS", "COINS", "COIRS", "COITS", "COLAS", "COLES", + "COLIC", "COLIN", "COLLS", "COLTS", "CONES", "CONIA", "CONIN", "CONNE", "CONNS", + "CONTE", "CONTO", "COOCH", "COOEE", "COOER", "COOLS", "COONS", "COOPS", "COOPT", + "COOST", "COOTS", "COPAL", "COPEN", "COPER", "COPES", "COPRA", "CORES", "CORIA", + "CORNI", "CORNO", "CORNS", "CORPS", "CORSE", "CORSO", "COSEC", "COSES", "COSET", + "COSIE", "COSTA", "COSTE", "COSTS", "COTAN", "COTES", "COTHS", "COTTA", "COTTS", + "CRAAL", "CRAIC", "CRANS", "CRAPE", "CRAPS", "CRARE", "CREEL", "CREES", "CRENA", + "CREPS", "CRIAS", "CRIES", "CRINE", "CRIOS", "CRIPE", "CRIPS", "CRISE", "CRITH", + "CRITS", "CROCI", "CROCS", "CRONS", "CROOL", "CROON", "CROPS", "CRORE", "CROST", + "CTENE", "EALES", "EARLS", "EARNS", "EARNT", "EARST", "EASER", "EASES", "EASLE", + "EASTS", "EATHE", "ECHES", "ECHOS", "EISEL", "ELAIN", "ELANS", "ELCHI", "ELINT", + "ELOIN", "ELOPS", "ELPEE", "ELSIN", "ENATE", "ENIAC", "ENLIT", "ENOLS", "ENROL", + "ENTIA", "EORLS", "EOSIN", "EPACT", "EPEES", "EPHAH", "EPHAS", "EPHOR", "EPICS", + "EPOPT", "EPRIS", "ERICA", "ERICS", "ERNES", "EROSE", "ERSES", "ESCAR", "ESCOT", + "ESILE", "ESNES", "ESSES", "ESTOC", "ESTOP", "ESTRO", "ETAPE", "ETATS", "ETENS", + "ETHAL", "ETHNE", "ETICS", "ETNAS", "ETTIN", "ETTLE", "HAARS", "HAETS", "HAHAS", + "HAILS", "HAINS", "HAINT", "HAIRS", "HAITH", "HALAL", "HALER", "HALES", "HALLO", + "HALLS", "HALON", "HALOS", "HALSE", "HALTS", "HANAP", "HANCE", "HANCH", "HANSA", + "HANSE", "HANTS", "HAOLE", "HAPPI", "HARES", "HARLS", "HARNS", "HAROS", "HARPS", + "HARTS", "HASPS", "HASTA", "HATES", "HATHA", "HEALS", "HEAPS", "HEARE", "HEARS", + "HEAST", "HEATS", "HECHT", "HEELS", "HEILS", "HEIRS", "HELES", "HELIO", "HELLS", + "HELOS", "HELOT", "HELPS", "HENCH", "HENNA", "HENTS", "HEPAR", "HERES", "HERLS", + "HERNS", "HEROS", "HERSE", "HESPS", "HESTS", "HETES", "HETHS", "HIANT", "HILAR", + "HILCH", "HILLO", "HILLS", "HILTS", "HINTS", "HIOIS", "HIREE", "HIRER", "HIRES", + "HISTS", "HITHE", "HOARS", "HOAST", "HOERS", "HOISE", "HOLES", "HOLLA", "HOLLO", + "HOLON", "HOLOS", "HOLTS", "HONAN", "HONER", "HONES", "HOOCH", "HOONS", "HOOPS", + "HOORS", "HOOSH", "HOOTS", "HOPER", "HOPES", "HORAH", "HORAL", "HORAS", "HORIS", + "HORNS", "HORST", "HOSEL", "HOSEN", "HOSER", "HOSES", "HOSTA", "HOSTS", "HOTCH", + "HOTEN", "ICERS", "ICHES", "ICHOR", "ICIER", "ICONS", "ICTAL", "ICTIC", "ILEAC", + "ILEAL", "ILIAL", "ILLER", "ILLTH", "INAPT", "INCEL", "INCLE", "INION", "INNIT", + "INSET", "INSPO", "INTEL", "INTIL", "INTIS", "INTRA", "IOTAS", "IPPON", "IRONE", + "IRONS", "ISHES", "ISLES", "ISNAE", "ISSEI", "ISTLE", "ITHER", "LAARI", "LACER", + "LACES", "LACET", "LAERS", "LAHAL", "LAHAR", "LAICH", "LAICS", "LAIRS", "LAITH", + "LALLS", "LANAI", "LANAS", "LANCH", "LANES", "LANTS", "LAPIN", "LAPIS", "LARCH", + "LAREE", "LARES", "LARIS", "LARNS", "LARNT", "LASER", "LASES", "LASSI", "LASTS", + "LATAH", "LATEN", "LATHI", "LATHS", "LEANS", "LEAPS", "LEARE", "LEARS", "LEATS", + "LEEAR", "LEEPS", "LEERS", "LEESE", "LEETS", "LEHRS", "LEIRS", "LEISH", "LENES", + "LENIS", "LENOS", "LENSE", "LENTI", "LENTO", "LEONE", "LEPRA", "LEPTA", "LERES", + "LERPS", "LESES", "LESTS", "LETCH", "LETHE", "LIANA", "LIANE", "LIARS", "LIART", + "LICHI", "LICHT", "LICIT", "LIENS", "LIERS", "LILLS", "LILOS", "LILTS", "LINAC", + "LINCH", "LINES", "LININ", "LINNS", "LINOS", "LINTS", "LIONS", "LIPAS", "LIPES", + "LIPIN", "LIPOS", "LIRAS", "LIROT", "LISLE", "LISPS", "LISTS", "LITAI", "LITAS", + "LITES", "LITHO", "LITHS", "LITRE", "LLANO", "LOACH", "LOANS", "LOAST", "LOCHE", + "LOCHS", "LOCIE", "LOCIS", "LOCOS", "LOESS", "LOHAN", "LOINS", "LOIPE", "LOIRS", + "LOLLS", "LONER", "LOOIE", "LOONS", "LOOPS", "LOOTS", "LOPER", "LOPES", "LORAL", + "LORAN", "LOREL", "LORES", "LORIC", "LORIS", "LOSEL", "LOSEN", "LOSES", "LOTAH", + "LOTAS", "LOTES", "LOTIC", "LOTOS", "LOTSA", "LOTTA", "LOTTE", "LOTTO", "NAANS", + "NACHE", "NACHO", "NACRE", "NAHAL", "NAILS", "NAIRA", "NALAS", "NALLA", "NANAS", + "NANCE", "NANNA", "NANOS", "NAPAS", "NAPES", "NAPOO", "NAPPA", "NAPPE", "NARAS", + "NARCO", "NARCS", "NARES", "NARIC", "NARIS", "NARRE", "NASHI", "NATCH", "NATES", + "NATIS", "NEALS", "NEAPS", "NEARS", "NEATH", "NEATS", "NEELE", "NEEPS", "NEESE", + "NEIST", "NELIS", "NENES", "NEONS", "NEPER", "NEPIT", "NERAL", "NEROL", "NERTS", + "NESTS", "NETES", "NETOP", "NETTS", "NICHT", "NICOL", "NIHIL", "NILLS", "NINER", + "NINES", "NINON", "NIPAS", "NIRLS", "NISEI", "NISSE", "NITER", "NITES", "NITON", + "NITRE", "NITRO", "NOAHS", "NOELS", "NOILS", "NOINT", "NOIRS", "NOLES", "NOLLS", + "NOLOS", "NONAS", "NONCE", "NONES", "NONET", "NONIS", "NOOIT", "NOONS", "NOOPS", + "NOPAL", "NORIA", "NORIS", "NOSER", "NOSES", "NOTAL", "NOTER", "NOTES", "OASES", + "OASIS", "OASTS", "OATEN", "OATER", "OATHS", "OCHER", "OCHES", "OCHRE", "OCREA", + "OCTAN", "OCTAS", "OHIAS", "OHONE", "OILER", "OINTS", "OLEIC", "OLEIN", "OLENT", + "OLEOS", "OLIOS", "OLLAS", "OLLER", "OLLIE", "OLPAE", "OLPES", "ONCER", "ONCES", + "ONCET", "ONERS", "ONTIC", "OONTS", "OORIE", "OOSES", "OPAHS", "OPALS", "OPENS", + "OPEPE", "OPPOS", "OPSIN", "OPTER", "ORACH", "ORALS", "ORANT", "ORATE", "ORCAS", + "ORCIN", "ORIEL", "ORLES", "ORLON", "ORLOP", "ORNIS", "ORPIN", "ORRIS", "ORTHO", + "OSCAR", "OSHAC", "OSIER", "OSSIA", "OSTIA", "OTTAR", "OTTOS", "PAALS", "PAANS", + "PACAS", "PACER", "PACES", "PACHA", "PACOS", "PACTA", "PACTS", "PAEAN", "PAEON", + "PAILS", "PAINS", "PAIRE", "PAIRS", "PAISA", "PAISE", "PALAS", "PALEA", "PALES", + "PALET", "PALIS", "PALLA", "PALLS", "PALPI", "PALPS", "PALSA", "PANCE", "PANES", + "PANNE", "PANNI", "PANTO", "PANTS", "PAOLI", "PAOLO", "PAPAS", "PAPES", "PAPPI", + "PARAE", "PARAS", "PARCH", "PAREN", "PAREO", "PARES", "PARIS", "PARLE", "PAROL", + "PARPS", "PARRA", "PARRS", "PARTI", "PARTS", "PASEO", "PASES", "PASHA", "PASSE", + "PASTS", "PATEN", "PATER", "PATES", "PATHS", "PATIN", "PATTE", "PEALS", "PEANS", + "PEARE", "PEARS", "PEART", "PEASE", "PEATS", "PECHS", "PEECE", "PEELS", "PEENS", + "PEEPE", "PEEPS", "PEERS", "PEINS", "PEISE", "PELAS", "PELES", "PELLS", "PELON", + "PELTA", "PELTS", "PENES", "PENIE", "PENIS", "PENNA", "PENNI", "PENTS", "PEONS", + "PEPLA", "PEPOS", "PEPSI", "PERAI", "PERCE", "PERCS", "PEREA", "PERES", "PERIS", + "PERNS", "PERPS", "PERSE", "PERST", "PERTS", "PESOS", "PESTS", "PETAR", "PETER", + "PETIT", "PETRE", "PETRI", "PETTI", "PETTO", "PHARE", "PHEER", "PHENE", "PHEON", + "PHESE", "PHIAL", "PHISH", "PHOCA", "PHONO", "PHONS", "PHOTS", "PHPHT", "PIANI", + "PIANS", "PICAL", "PICAS", "PICOT", "PICRA", "PIERS", "PIERT", "PIETA", "PIETS", + "PILAE", "PILAO", "PILAR", "PILCH", "PILEA", "PILEI", "PILER", "PILES", "PILIS", + "PILLS", "PINAS", "PINES", "PINNA", "PINON", "PINOT", "PINTA", "PINTS", "PIONS", + "PIPAL", "PIPAS", "PIPES", "PIPET", "PIPIS", "PIPIT", "PIRAI", "PIRLS", "PIRNS", + "PISCO", "PISES", "PISOS", "PISTE", "PITAS", "PITHS", "PITON", "PITOT", "PITTA", + "PLAAS", "PLANS", "PLAPS", "PLASH", "PLAST", "PLATS", "PLATT", "PLEAS", "PLENA", + "PLEON", "PLESH", "PLICA", "PLIES", "PLOAT", "PLOPS", "PLOTS", "POACH", "POEPS", + "POETS", "POLER", "POLES", "POLIO", "POLIS", "POLLS", "POLOS", "POLTS", "PONCE", + "PONES", "PONTS", "POOHS", "POOLS", "POONS", "POOPS", "POORI", "POORT", "POOTS", + "POPES", "POPPA", "PORAE", "PORAL", "PORER", "PORES", "PORIN", "PORNO", "PORNS", + "PORTA", "PORTS", "POSES", "POSHO", "POSTS", "POTAE", "POTCH", "POTES", "POTIN", + "POTOO", "POTTO", "POTTS", "PRANA", "PRAOS", "PRASE", "PRATE", "PRATS", "PRATT", + "PREES", "PRENT", "PREON", "PREOP", "PREPS", "PRESA", "PRESE", "PREST", "PRIAL", + "PRIER", "PRIES", "PRILL", "PRION", "PRISE", "PRISS", "PROAS", "PROIN", "PROLE", + "PROLL", "PROPS", "PRORE", "PROSO", "PROSS", "PROST", "PROTO", "PSION", "PSOAE", + "PSOAI", "PSOAS", "PSORA", "RACES", "RACHE", "RACON", "RAIAS", "RAILE", "RAILS", + "RAINE", "RAINS", "RAITA", "RAITS", "RALES", "RANAS", "RANCE", "RANEE", "RANIS", + "RANTS", "RAPER", "RAPES", "RAPHE", "RAPPE", "RAREE", "RARES", "RASER", "RASES", + "RASPS", "RASSE", "RASTA", "RATAL", "RATAN", "RATAS", "RATCH", "RATEL", "RATER", + "RATES", "RATHA", "RATHE", "RATHS", "RATOO", "RATOS", "REAIS", "REALO", "REALS", + "REANS", "REAPS", "REARS", "REAST", "REATA", "REATE", "RECAL", "RECCE", "RECCO", + "RECIT", "RECON", "RECTA", "RECTI", "RECTO", "REECH", "REELS", "REENS", "REEST", + "REINS", "REIST", "RELET", "RELIE", "RELIT", "RELLO", "RENIN", "RENNE", "RENOS", + "RENTE", "RENTS", "REOIL", "REPIN", "REPLA", "REPOS", "REPOT", "REPPS", "REPRO", + "RERAN", "RESAT", "RESEE", "RESES", "RESIT", "RESTO", "RESTS", "RETIA", "RETIE", + "RHEAS", "RHIES", "RHINE", "RHONE", "RIALS", "RIANT", "RIATA", "RICER", "RICES", + "RICHT", "RICIN", "RIELS", "RILES", "RILLE", "RILLS", "RINES", "RIOTS", "RIPES", + "RIPPS", "RISES", "RISHI", "RISPS", "RITES", "RITTS", "ROANS", "ROARS", "ROATE", + "ROHES", "ROILS", "ROINS", "ROIST", "ROLES", "ROLLS", "RONEO", "RONES", "RONIN", + "RONNE", "RONTE", "RONTS", "ROONS", "ROOPS", "ROOSA", "ROOSE", "ROOTS", "ROPER", + "ROPES", "RORAL", "RORES", "RORIC", "RORIE", "RORTS", "ROSES", "ROSET", "ROSHI", + "ROSIN", "ROSIT", "ROSTI", "ROSTS", "ROTAL", "ROTAN", "ROTAS", "ROTCH", "ROTES", + "ROTIS", "ROTLS", "ROTON", "ROTOS", "ROTTE", "SACRA", "SAICE", "SAICS", "SAILS", + "SAINE", "SAINS", "SAIRS", "SAIST", "SAITH", "SALAL", "SALAT", "SALEP", "SALES", + "SALET", "SALIC", "SALLE", "SALOL", "SALOP", "SALPA", "SALPS", "SALSE", "SALTO", + "SALTS", "SANES", "SANSA", "SANTO", "SANTS", "SAOLA", "SAPAN", "SAPOR", "SARAN", + "SAREE", "SARIN", "SARIS", "SAROS", "SASER", "SASIN", "SASSE", "SATAI", "SATES", + "SATIS", "SCAIL", "SCALA", "SCALL", "SCANS", "SCAPA", "SCAPE", "SCAPI", "SCARP", + "SCARS", "SCART", "SCATH", "SCATS", "SCATT", "SCEAT", "SCENA", "SCOOT", "SCOPA", + "SCOPS", "SCOTS", "SCRAE", "SCRAN", "SCRAT", "SCRIP", "SEALS", "SEANS", "SEARE", + "SEARS", "SEASE", "SEATS", "SECCO", "SECHS", "SECTS", "SEELS", "SEEPS", "SEERS", + "SEHRI", "SEILS", "SEINE", "SEIRS", "SEISE", "SELAH", "SELES", "SELLA", "SELLE", + "SELLS", "SENAS", "SENES", "SENNA", "SENOR", "SENSA", "SENSI", "SENTE", "SENTI", + "SENTS", "SEPAL", "SEPIC", "SEPTA", "SEPTS", "SERAC", "SERAI", "SERAL", "SERER", + "SERES", "SERIC", "SERIN", "SERON", "SERRA", "SERRE", "SERRS", "SESSA", "SETAE", + "SETAL", "SETON", "SETTS", "SHAHS", "SHANS", "SHAPS", "SHARN", "SHASH", "SHCHI", + "SHEAL", "SHEAS", "SHEEL", "SHENT", "SHEOL", "SHERE", "SHERO", "SHETS", "SHIAI", + "SHIEL", "SHIER", "SHIES", "SHILL", "SHINS", "SHIPS", "SHIRR", "SHIRS", "SHISH", + "SHISO", "SHIST", "SHITE", "SHITS", "SHLEP", "SHOAT", "SHOER", "SHOES", "SHOLA", + "SHOOL", "SHOON", "SHOOS", "SHOPE", "SHOPS", "SHORL", "SHOTE", "SHOTS", "SHOTT", + "SHRIS", "SIALS", "SICES", "SICHT", "SIENS", "SIENT", "SIETH", "SILEN", "SILER", + "SILES", "SILLS", "SILOS", "SILTS", "SINES", "SINHS", "SIPES", "SIREE", "SIRES", + "SIRIH", "SIRIS", "SIROC", "SIRRA", "SISAL", "SISES", "SISTA", "SISTS", "SITAR", + "SITES", "SITHE", "SLAES", "SLANE", "SLAPS", "SLART", "SLATS", "SLEER", "SLIER", + "SLIPE", "SLIPS", "SLIPT", "SLISH", "SLITS", "SLOAN", "SLOES", "SLOOT", "SLOPS", + "SLOTS", "SNAPS", "SNARS", "SNASH", "SNATH", "SNEAP", "SNEES", "SNELL", "SNIES", + "SNIPS", "SNIRT", "SNITS", "SNOEP", "SNOOL", "SNOOT", "SNOTS", "SOAPS", "SOARE", + "SOARS", "SOCAS", "SOCES", "SOCLE", "SOILS", "SOLAH", "SOLAN", "SOLAS", "SOLEI", + "SOLER", "SOLES", "SOLON", "SOLOS", "SONCE", "SONES", "SONNE", "SONSE", "SOOLE", + "SOOLS", "SOOPS", "SOOTE", "SOOTS", "SOPHS", "SOPOR", "SOPRA", "SORAL", "SORAS", + "SOREE", "SOREL", "SORER", "SORES", "SORNS", "SORRA", "SORTA", "SORTS", "SOTHS", + "SOTOL", "SPAER", "SPAES", "SPAHI", "SPAIL", "SPAIN", "SPAIT", "SPALE", "SPALL", + "SPALT", "SPANE", "SPANS", "SPARS", "SPART", "SPATE", "SPATS", "SPEAL", "SPEAN", + "SPEAT", "SPECS", "SPECT", "SPEEL", "SPEER", "SPEIL", "SPEIR", "SPEOS", "SPETS", + "SPIAL", "SPICA", "SPICS", "SPIER", "SPIES", "SPILE", "SPINA", "SPINS", "SPIRT", + "SPITS", "SPOOR", "SPOOT", "SPOSH", "SPOTS", "SPRAT", "SPRIT", "STANE", "STAPH", + "STAPS", "STARN", "STARR", "STARS", "STATS", "STEAN", "STEAR", "STEEN", "STEIL", + "STELA", "STELE", "STELL", "STENO", "STENS", "STENT", "STEPS", "STEPT", "STERE", + "STETS", "STICH", "STIES", "STILE", "STIPA", "STIPE", "STIRE", "STIRP", "STIRS", + "STOAE", "STOAI", "STOAS", "STOAT", "STOEP", "STOIT", "STOLN", "STONN", "STOOR", + "STOPE", "STOPS", "STOPT", "STOSS", "STOTS", "STOTT", "STRAE", "STREP", "STRIA", + "STROP", "TAALS", "TAATA", "TACAN", "TACES", "TACET", "TACHE", "TACHO", "TACHS", + "TACOS", "TACTS", "TAELS", "TAHAS", "TAHRS", "TAILS", "TAINS", "TAIRA", "TAISH", + "TAITS", "TALAR", "TALAS", "TALCS", "TALEA", "TALER", "TALES", "TALLS", "TALPA", + "TANAS", "TANHS", "TANNA", "TANTI", "TANTO", "TAPAS", "TAPEN", "TAPES", "TAPET", + "TAPIS", "TAPPA", "TARAS", "TARES", "TARNS", "TAROC", "TAROS", "TARPS", "TARRE", + "TARSI", "TARTS", "TASAR", "TASER", "TASES", "TASSA", "TASSE", "TASSO", "TATAR", + "TATER", "TATES", "TATHS", "TATIE", "TATTS", "TEALS", "TEARS", "TEATS", "TECHS", + "TECTA", "TEELS", "TEENE", "TEENS", "TEERS", "TEHRS", "TEILS", "TEINS", "TELAE", + "TELCO", "TELES", "TELIA", "TELIC", "TELLS", "TELOI", "TELOS", "TENCH", "TENES", + "TENIA", "TENNE", "TENNO", "TENON", "TENTS", "TEPAL", "TEPAS", "TERAI", "TERAS", + "TERCE", "TERES", "TERNE", "TERNS", "TERTS", "TESLA", "TESTA", "TESTE", "TESTS", + "TETES", "TETHS", "TETRA", "TETRI", "THALE", "THALI", "THANA", "THANE", "THANS", + "THARS", "THECA", "THEES", "THEIC", "THEIN", "THENS", "THESP", "THETE", "THILL", + "THINE", "THINS", "THIOL", "THIRL", "THOLE", "THOLI", "THORO", "THORP", "THRAE", + "THRIP", "THROE", "TIANS", "TIARS", "TICAL", "TICCA", "TICES", "TIERS", "TILER", + "TILES", "TILLS", "TILTH", "TILTS", "TINAS", "TINCT", "TINEA", "TINES", "TINTS", + "TIPIS", "TIRES", "TIRLS", "TIROS", "TIRRS", "TITCH", "TITER", "TITIS", "TITRE", + "TOCOS", "TOEAS", "TOHOS", "TOILE", "TOILS", "TOISE", "TOITS", "TOLAN", "TOLAR", + "TOLAS", "TOLES", "TOLLS", "TOLTS", "TONER", "TONES", "TONNE", "TOOLS", "TOONS", + "TOOTS", "TOPEE", "TOPER", "TOPES", "TOPHE", "TOPHI", "TOPHS", "TOPIS", "TOPOI", + "TOPOS", "TORAH", "TORAN", "TORAS", "TORCS", "TORES", "TORIC", "TORII", "TOROS", + "TOROT", "TORRS", "TORSE", "TORSI", "TORTA", "TORTE", "TORTS", "TOSAS", "TOSES", + "TOTER", "TOTES", "TRANS", "TRANT", "TRAPE", "TRAPS", "TRAPT", "TRASS", "TRATS", + "TRATT", "TREEN", "TREES", "TRESS", "TREST", "TRETS", "TRIAC", "TRIER", "TRIES", + "TRILL", "TRINE", "TRINS", "TRIOL", "TRIOR", "TRIOS", "TRIPS", "TRIST", "TROAT", + "TROIS", "TRONA", "TRONC", "TRONE", "TRONS", "TROTH", "TROTS", "TSARS", +#endif +}; + +#if (WORDLE_USE_RANDOM_GUESS == 3) +static const uint16_t _num_random_guess_words = 13; // The valid_words array begins with this many words that are considered the top 3% best options. +#elif (WORDLE_USE_RANDOM_GUESS == 2) +static const uint16_t _num_random_guess_words = 257; // The valid_words array begins with this many words where each letter is different. +#elif (WORDLE_USE_RANDOM_GUESS == 1) +static const uint16_t _num_random_guess_words = _num_words; +#endif + +#endif // WORDLE_FACE_DICT_H_ \ No newline at end of file diff --git a/utils/wordle_face/wordle_list.py b/utils/wordle_face/wordle_list.py new file mode 100644 index 00000000..dac5ad65 --- /dev/null +++ b/utils/wordle_face/wordle_list.py @@ -0,0 +1,1385 @@ +import random, itertools, time, numpy + +source_link = "https://matthewminer.name/projects/calculators/wordle-words-left/" +valid_list = [ + "CIGAR", "REBUT", "SISSY", "HUMPH", "AWAKE", "BLUSH", "FOCAL", "EVADE", "NAVAL", "SERVE", "HEATH", "DWARF", + "MODEL", "KARMA", "STINK", "GRADE", "QUIET", "BENCH", "ABATE", "FEIGN", "MAJOR", "DEATH", "FRESH", "CRUST", + "STOOL", "COLON", "ABASE", "MARRY", "REACT", "BATTY", "PRIDE", "FLOSS", "HELIX", "CROAK", "STAFF", "PAPER", + "UNFED", "WHELP", "TRAWL", "OUTDO", "ADOBE", "CRAZY", "SOWER", "REPAY", "DIGIT", "CRATE", "CLUCK", "SPIKE", + "MIMIC", "POUND", "MAXIM", "LINEN", "UNMET", "FLESH", "BOOBY", "FORTH", "FIRST", "STAND", "BELLY", "IVORY", + "SEEDY", "PRINT", "YEARN", "DRAIN", "BRIBE", "STOUT", "PANEL", "CRASS", "FLUME", "OFFAL", "AGREE", "ERROR", + "SWIRL", "ARGUE", "BLEED", "DELTA", "FLICK", "TOTEM", "WOOER", "FRONT", "SHRUB", "PARRY", "BIOME", "LAPEL", + "START", "GREET", "GONER", "GOLEM", "LUSTY", "LOOPY", "ROUND", "AUDIT", "LYING", "GAMMA", "LABOR", "ISLET", + "CIVIC", "FORGE", "CORNY", "MOULT", "BASIC", "SALAD", "AGATE", "SPICY", "SPRAY", "ESSAY", "FJORD", "SPEND", + "KEBAB", "GUILD", "ABACK", "MOTOR", "ALONE", "HATCH", "HYPER", "THUMB", "DOWRY", "OUGHT", "BELCH", "DUTCH", + "PILOT", "TWEED", "COMET", "JAUNT", "ENEMA", "STEED", "ABYSS", "GROWL", "FLING", "DOZEN", "BOOZY", "ERODE", + "WORLD", "GOUGE", "CLICK", "BRIAR", "GREAT", "ALTAR", "PULPY", "BLURT", "COAST", "DUCHY", "GROIN", "FIXER", + "GROUP", "ROGUE", "BADLY", "SMART", "PITHY", "GAUDY", "CHILL", "HERON", "VODKA", "FINER", "SURER", "RADIO", + "ROUGE", "PERCH", "RETCH", "WROTE", "CLOCK", "TILDE", "STORE", "PROVE", "BRING", "SOLVE", "CHEAT", "GRIME", + "EXULT", "USHER", "EPOCH", "TRIAD", "BREAK", "RHINO", "VIRAL", "CONIC", "MASSE", "SONIC", "VITAL", "TRACE", + "USING", "PEACH", "CHAMP", "BATON", "BRAKE", "PLUCK", "CRAZE", "GRIPE", "WEARY", "PICKY", "ACUTE", "FERRY", + "ASIDE", "TAPIR", "TROLL", "UNIFY", "REBUS", "BOOST", "TRUSS", "SIEGE", "TIGER", "BANAL", "SLUMP", "CRANK", + "GORGE", "QUERY", "DRINK", "FAVOR", "ABBEY", "TANGY", "PANIC", "SOLAR", "SHIRE", "PROXY", "POINT", "ROBOT", + "PRICK", "WINCE", "CRIMP", "KNOLL", "SUGAR", "WHACK", "MOUNT", "PERKY", "COULD", "WRUNG", "LIGHT", "THOSE", + "MOIST", "SHARD", "PLEAT", "ALOFT", "SKILL", "ELDER", "FRAME", "HUMOR", "PAUSE", "ULCER", "ULTRA", "ROBIN", + "CYNIC", "AROMA", "CAULK", "SHAKE", "DODGE", "SWILL", "TACIT", "OTHER", "THORN", "TROVE", "BLOKE", "VIVID", + "SPILL", "CHANT", "CHOKE", "RUPEE", "NASTY", "MOURN", "AHEAD", "BRINE", "CLOTH", "HOARD", "SWEET", "MONTH", + "LAPSE", "WATCH", "TODAY", "FOCUS", "SMELT", "TEASE", "CATER", "MOVIE", "SAUTE", "ALLOW", "RENEW", "THEIR", + "SLOSH", "PURGE", "CHEST", "DEPOT", "EPOXY", "NYMPH", "FOUND", "SHALL", "STOVE", "LOWLY", "SNOUT", "TROPE", + "FEWER", "SHAWL", "NATAL", "COMMA", "FORAY", "SCARE", "STAIR", "BLACK", "SQUAD", "ROYAL", "CHUNK", "MINCE", + "SHAME", "CHEEK", "AMPLE", "FLAIR", "FOYER", "CARGO", "OXIDE", "PLANT", "OLIVE", "INERT", "ASKEW", "HEIST", + "SHOWN", "ZESTY", "TRASH", "LARVA", "FORGO", "STORY", "HAIRY", "TRAIN", "HOMER", "BADGE", "MIDST", "CANNY", + "SHINE", "GECKO", "FARCE", "SLUNG", "TIPSY", "METAL", "YIELD", "DELVE", "BEING", "SCOUR", "GLASS", "GAMER", + "SCRAP", "MONEY", "HINGE", "ALBUM", "VOUCH", "ASSET", "TIARA", "CREPT", "BAYOU", "ATOLL", "MANOR", "CREAK", + "SHOWY", "PHASE", "FROTH", "DEPTH", "GLOOM", "FLOOD", "TRAIT", "GIRTH", "PIETY", "GOOSE", "FLOAT", "DONOR", + "ATONE", "PRIMO", "APRON", "BLOWN", "CACAO", "LOSER", "INPUT", "GLOAT", "AWFUL", "BRINK", "SMITE", "BEADY", + "RUSTY", "RETRO", "DROLL", "GAWKY", "HUTCH", "PINTO", "EGRET", "LILAC", "SEVER", "FIELD", "FLUFF", "AGAPE", + "VOICE", "STEAD", "BERTH", "MADAM", "NIGHT", "BLAND", "LIVER", "WEDGE", "ROOMY", "WACKY", "FLOCK", "ANGRY", + "TRITE", "APHID", "TRYST", "MIDGE", "POWER", "ELOPE", "CINCH", "MOTTO", "STOMP", "UPSET", "BLUFF", "CRAMP", + "QUART", "COYLY", "YOUTH", "RHYME", "BUGGY", "ALIEN", "SMEAR", "UNFIT", "PATTY", "CLING", "GLEAN", "LABEL", + "HUNKY", "KHAKI", "POKER", "GRUEL", "TWICE", "TWANG", "SHRUG", "TREAT", "WASTE", "MERIT", "WOVEN", "NEEDY", + "CLOWN", "IRONY", "RUDER", "GAUZE", "CHIEF", "ONSET", "PRIZE", "FUNGI", "CHARM", "GULLY", "INTER", "WHOOP", + "TAUNT", "LEERY", "CLASS", "THEME", "LOFTY", "TIBIA", "BOOZE", "ALPHA", "THYME", "DOUBT", "PARER", "CHUTE", + "STICK", "TRICE", "ALIKE", "RECAP", "SAINT", "GLORY", "GRATE", "ADMIT", "BRISK", "SOGGY", "USURP", "SCALD", + "SCORN", "LEAVE", "TWINE", "STING", "BOUGH", "MARSH", "SLOTH", "DANDY", "VIGOR", "HOWDY", "ENJOY", "VALID", + "IONIC", "EQUAL", "FLOOR", "CATCH", "SPADE", "STEIN", "EXIST", "QUIRK", "DENIM", "GROVE", "SPIEL", "MUMMY", + "FAULT", "FOGGY", "FLOUT", "CARRY", "SNEAK", "LIBEL", "WALTZ", "APTLY", "PINEY", "INEPT", "ALOUD", "PHOTO", + "DREAM", "STALE", "UNITE", "SNARL", "BAKER", "THERE", "GLYPH", "POOCH", "HIPPY", "SPELL", "FOLLY", "LOUSE", + "GULCH", "VAULT", "GODLY", "THREW", "FLEET", "GRAVE", "INANE", "SHOCK", "CRAVE", "SPITE", "VALVE", "SKIMP", + "CLAIM", "RAINY", "MUSTY", "PIQUE", "DADDY", "QUASI", "ARISE", "AGING", "VALET", "OPIUM", "AVERT", "STUCK", + "RECUT", "MULCH", "GENRE", "PLUME", "RIFLE", "COUNT", "INCUR", "TOTAL", "WREST", "MOCHA", "DETER", "STUDY", + "LOVER", "SAFER", "RIVET", "FUNNY", "SMOKE", "MOUND", "UNDUE", "SEDAN", "PAGAN", "SWINE", "GUILE", "GUSTY", + "EQUIP", "TOUGH", "CANOE", "CHAOS", "COVET", "HUMAN", "UDDER", "LUNCH", "BLAST", "STRAY", "MANGA", "MELEE", + "LEFTY", "QUICK", "PASTE", "GIVEN", "OCTET", "RISEN", "GROAN", "LEAKY", "GRIND", "CARVE", "LOOSE", "SADLY", + "SPILT", "APPLE", "SLACK", "HONEY", "FINAL", "SHEEN", "EERIE", "MINTY", "SLICK", "DERBY", "WHARF", "SPELT", + "COACH", "ERUPT", "SINGE", "PRICE", "SPAWN", "FAIRY", "JIFFY", "FILMY", "STACK", "CHOSE", "SLEEP", "ARDOR", + "NANNY", "NIECE", "WOOZY", "HANDY", "GRACE", "DITTO", "STANK", "CREAM", "USUAL", "DIODE", "VALOR", "ANGLE", + "NINJA", "MUDDY", "CHASE", "REPLY", "PRONE", "SPOIL", "HEART", "SHADE", "DINER", "ARSON", "ONION", "SLEET", + "DOWEL", "COUCH", "PALSY", "BOWEL", "SMILE", "EVOKE", "CREEK", "LANCE", "EAGLE", "IDIOT", "SIREN", "BUILT", + "EMBED", "AWARD", "DROSS", "ANNUL", "GOODY", "FROWN", "PATIO", "LADEN", "HUMID", "ELITE", "LYMPH", "EDIFY", + "MIGHT", "RESET", "VISIT", "GUSTO", "PURSE", "VAPOR", "CROCK", "WRITE", "SUNNY", "LOATH", "CHAFF", "SLIDE", + "QUEER", "VENOM", "STAMP", "SORRY", "STILL", "ACORN", "APING", "PUSHY", "TAMER", "HATER", "MANIA", "AWOKE", + "BRAWN", "SWIFT", "EXILE", "BIRCH", "LUCKY", "FREER", "RISKY", "GHOST", "PLIER", "LUNAR", "WINCH", "SNARE", + "NURSE", "HOUSE", "BORAX", "NICER", "LURCH", "EXALT", "ABOUT", "SAVVY", "TOXIN", "TUNIC", "PRIED", "INLAY", + "CHUMP", "LANKY", "CRESS", "EATER", "ELUDE", "CYCLE", "KITTY", "BOULE", "MORON", "TENET", "PLACE", "LOBBY", + "PLUSH", "VIGIL", "INDEX", "BLINK", "CLUNG", "QUALM", "CROUP", "CLINK", "JUICY", "STAGE", "DECAY", "NERVE", + "FLIER", "SHAFT", "CROOK", "CLEAN", "CHINA", "RIDGE", "VOWEL", "GNOME", "SNUCK", "ICING", "SPINY", "RIGOR", + "SNAIL", "FLOWN", "RABID", "PROSE", "THANK", "POPPY", "BUDGE", "FIBER", "MOLDY", "DOWDY", "KNEEL", "TRACK", + "CADDY", "QUELL", "DUMPY", "PALER", "SWORE", "REBAR", "SCUBA", "SPLAT", "FLYER", "HORNY", "MASON", "DOING", + "OZONE", "AMPLY", "MOLAR", "OVARY", "BESET", "QUEUE", "CLIFF", "MAGIC", "TRUCE", "SPORT", "FRITZ", "EDICT", + "TWIRL", "VERSE", "LLAMA", "EATEN", "RANGE", "WHISK", "HOVEL", "REHAB", "MACAW", "SIGMA", "SPOUT", "VERVE", + "SUSHI", "DYING", "FETID", "BRAIN", "BUDDY", "THUMP", "SCION", "CANDY", "CHORD", "BASIN", "MARCH", "CROWD", + "ARBOR", "GAYLY", "MUSKY", "STAIN", "DALLY", "BLESS", "BRAVO", "STUNG", "TITLE", "RULER", "KIOSK", "BLOND", + "ENNUI", "LAYER", "FLUID", "TATTY", "SCORE", "CUTIE", "ZEBRA", "BARGE", "MATEY", "BLUER", "AIDER", "SHOOK", + "RIVER", "PRIVY", "BETEL", "FRISK", "BONGO", "BEGUN", "AZURE", "WEAVE", "GENIE", "SOUND", "GLOVE", "BRAID", + "SCOPE", "WRYLY", "ROVER", "ASSAY", "OCEAN", "BLOOM", "IRATE", "LATER", "WOKEN", "SILKY", "WRECK", "DWELT", + "SLATE", "SMACK", "SOLID", "AMAZE", "HAZEL", "WRIST", "JOLLY", "GLOBE", "FLINT", "ROUSE", "CIVIL", "VISTA", + "RELAX", "COVER", "ALIVE", "BEECH", "JETTY", "BLISS", "VOCAL", "OFTEN", "DOLLY", "EIGHT", "JOKER", "SINCE", + "EVENT", "ENSUE", "SHUNT", "DIVER", "POSER", "WORST", "SWEEP", "ALLEY", "CREED", "ANIME", "LEAFY", "BOSOM", + "DUNCE", "STARE", "PUDGY", "WAIVE", "CHOIR", "STOOD", "SPOKE", "OUTGO", "DELAY", "BILGE", "IDEAL", "CLASP", + "SEIZE", "HOTLY", "LAUGH", "SIEVE", "BLOCK", "MEANT", "GRAPE", "NOOSE", "HARDY", "SHIED", "DRAWL", "DAISY", + "PUTTY", "STRUT", "BURNT", "TULIP", "CRICK", "IDYLL", "VIXEN", "FUROR", "GEEKY", "COUGH", "NAIVE", "SHOAL", + "STORK", "BATHE", "AUNTY", "CHECK", "PRIME", "BRASS", "OUTER", "FURRY", "RAZOR", "ELECT", "EVICT", "IMPLY", + "DEMUR", "QUOTA", "HAVEN", "CAVIL", "SWEAR", "CRUMP", "DOUGH", "GAVEL", "WAGON", "SALON", "NUDGE", "HAREM", + "PITCH", "SWORN", "PUPIL", "EXCEL", "STONY", "CABIN", "UNZIP", "QUEEN", "TROUT", "POLYP", "EARTH", "STORM", + "UNTIL", "TAPER", "ENTER", "CHILD", "ADOPT", "MINOR", "FATTY", "HUSKY", "BRAVE", "FILET", "SLIME", "GLINT", + "TREAD", "STEAL", "REGAL", "GUEST", "EVERY", "MURKY", "SHARE", "SPORE", "HOIST", "BUXOM", "INNER", "OTTER", + "DIMLY", "LEVEL", "SUMAC", "DONUT", "STILT", "ARENA", "SHEET", "SCRUB", "FANCY", "SLIMY", "PEARL", "SILLY", + "PORCH", "DINGO", "SEPIA", "AMBLE", "SHADY", "BREAD", "FRIAR", "REIGN", "DAIRY", "QUILL", "CROSS", "BROOD", + "TUBER", "SHEAR", "POSIT", "BLANK", "VILLA", "SHANK", "PIGGY", "FREAK", "WHICH", "AMONG", "FECAL", "SHELL", + "WOULD", "ALGAE", "LARGE", "RABBI", "AGONY", "AMUSE", "BUSHY", "COPSE", "SWOON", "KNIFE", "POUCH", "ASCOT", + "PLANE", "CROWN", "URBAN", "SNIDE", "RELAY", "ABIDE", "VIOLA", "RAJAH", "STRAW", "DILLY", "CRASH", "AMASS", + "THIRD", "TRICK", "TUTOR", "WOODY", "BLURB", "GRIEF", "DISCO", "WHERE", "SASSY", "BEACH", "SAUNA", "COMIC", + "CLUED", "CREEP", "CASTE", "GRAZE", "SNUFF", "FROCK", "GONAD", "DRUNK", "PRONG", "LURID", "STEEL", "HALVE", + "BUYER", "VINYL", "UTILE", "SMELL", "ADAGE", "WORRY", "TASTY", "LOCAL", "TRADE", "FINCH", "ASHEN", "MODAL", + "GAUNT", "CLOVE", "ENACT", "ADORN", "ROAST", "SPECK", "SHEIK", "MISSY", "GRUNT", "SNOOP", "PARTY", "TOUCH", + "MAFIA", "EMCEE", "ARRAY", "SOUTH", "VAPID", "JELLY", "SKULK", "ANGST", "TUBAL", "LOWER", "CREST", "SWEAT", + "CYBER", "ADORE", "TARDY", "SWAMI", "NOTCH", "GROOM", "ROACH", "HITCH", "YOUNG", "ALIGN", "READY", "FROND", + "STRAP", "PUREE", "REALM", "VENUE", "SWARM", "OFFER", "SEVEN", "DRYER", "DIARY", "DRYLY", "DRANK", "ACRID", + "HEADY", "THETA", "JUNTO", "PIXIE", "QUOTH", "BONUS", "SHALT", "PENNE", "AMEND", "DATUM", "BUILD", "PIANO", + "SHELF", "LODGE", "SUING", "REARM", "CORAL", "RAMEN", "WORTH", "PSALM", "INFER", "OVERT", "MAYOR", "OVOID", + "GLIDE", "USAGE", "POISE", "RANDY", "CHUCK", "PRANK", "FISHY", "TOOTH", "ETHER", "DROVE", "IDLER", "SWATH", + "STINT", "WHILE", "BEGAT", "APPLY", "SLANG", "TAROT", "RADAR", "CREDO", "AWARE", "CANON", "SHIFT", "TIMER", + "BYLAW", "SERUM", "THREE", "STEAK", "ILIAC", "SHIRK", "BLUNT", "PUPPY", "PENAL", "JOIST", "BUNNY", "SHAPE", + "BEGET", "WHEEL", "ADEPT", "STUNT", "STOLE", "TOPAZ", "CHORE", "FLUKE", "AFOOT", "BLOAT", "BULLY", "DENSE", + "CAPER", "SNEER", "BOXER", "JUMBO", "LUNGE", "SPACE", "AVAIL", "SHORT", "SLURP", "LOYAL", "FLIRT", "PIZZA", + "CONCH", "TEMPO", "DROOP", "PLATE", "BIBLE", "PLUNK", "AFOUL", "SAVOY", "STEEP", "AGILE", "STAKE", "DWELL", + "KNAVE", "BEARD", "AROSE", "MOTIF", "SMASH", "BROIL", "GLARE", "SHOVE", "BAGGY", "MAMMY", "SWAMP", "ALONG", + "RUGBY", "WAGER", "QUACK", "SQUAT", "SNAKY", "DEBIT", "MANGE", "SKATE", "NINTH", "JOUST", "TRAMP", "SPURN", + "MEDAL", "MICRO", "REBEL", "FLANK", "LEARN", "NADIR", "MAPLE", "COMFY", "REMIT", "GRUFF", "ESTER", "LEAST", + "MOGUL", "FETCH", "CAUSE", "OAKEN", "AGLOW", "MEATY", "GAFFE", "SHYLY", "RACER", "PROWL", "THIEF", "STERN", + "POESY", "ROCKY", "TWEET", "WAIST", "SPIRE", "GROPE", "HAVOC", "PATSY", "TRULY", "FORTY", "DEITY", "UNCLE", + "SWISH", "GIVER", "PREEN", "BEVEL", "LEMUR", "DRAFT", "SLOPE", "ANNOY", "LINGO", "BLEAK", "DITTY", "CURLY", + "CEDAR", "DIRGE", "GROWN", "HORDE", "DROOL", "SHUCK", "CRYPT", "CUMIN", "STOCK", "GRAVY", "LOCUS", "WIDER", + "BREED", "QUITE", "CHAFE", "CACHE", "BLIMP", "DEIGN", "FIEND", "LOGIC", "CHEAP", "ELIDE", "RIGID", "FALSE", + "RENAL", "PENCE", "ROWDY", "SHOOT", "BLAZE", "ENVOY", "POSSE", "BRIEF", "NEVER", "ABORT", "MOUSE", "MUCKY", + "SULKY", "FIERY", "MEDIA", "TRUNK", "YEAST", "CLEAR", "SKUNK", "SCALP", "BITTY", "CIDER", "KOALA", "DUVET", + "SEGUE", "CREME", "SUPER", "GRILL", "AFTER", "OWNER", "EMBER", "REACH", "NOBLY", "EMPTY", "SPEED", "GIPSY", + "RECUR", "SMOCK", "DREAD", "MERGE", "BURST", "KAPPA", "AMITY", "SHAKY", "HOVER", "CAROL", "SNORT", "SYNOD", + "FAINT", "HAUNT", "FLOUR", "CHAIR", "DETOX", "SHREW", "TENSE", "PLIED", "QUARK", "BURLY", "NOVEL", "WAXEN", + "STOIC", "JERKY", "BLITZ", "BEEFY", "LYRIC", "HUSSY", "TOWEL", "QUILT", "BELOW", "BINGO", "WISPY", "BRASH", + "SCONE", "TOAST", "EASEL", "SAUCY", "VALUE", "SPICE", "HONOR", "ROUTE", "SHARP", "BAWDY", "RADII", "SKULL", + "PHONY", "ISSUE", "LAGER", "SWELL", "URINE", "GASSY", "TRIAL", "FLORA", "UPPER", "LATCH", "WIGHT", "BRICK", + "RETRY", "HOLLY", "DECAL", "GRASS", "SHACK", "DOGMA", "MOVER", "DEFER", "SOBER", "OPTIC", "CRIER", "VYING", + "NOMAD", "FLUTE", "HIPPO", "SHARK", "DRIER", "OBESE", "BUGLE", "TAWNY", "CHALK", "FEAST", "RUDDY", "PEDAL", + "SCARF", "CRUEL", "BLEAT", "TIDAL", "SLUSH", "SEMEN", "WINDY", "DUSTY", "SALLY", "IGLOO", "NERDY", "JEWEL", + "SHONE", "WHALE", "HYMEN", "ABUSE", "FUGUE", "ELBOW", "CRUMB", "PANSY", "WELSH", "SYRUP", "TERSE", "SUAVE", + "GAMUT", "SWUNG", "DRAKE", "FREED", "AFIRE", "SHIRT", "GROUT", "ODDLY", "TITHE", "PLAID", "DUMMY", "BROOM", + "BLIND", "TORCH", "ENEMY", "AGAIN", "TYING", "PESKY", "ALTER", "GAZER", "NOBLE", "ETHOS", "BRIDE", "EXTOL", + "DECOR", "HOBBY", "BEAST", "IDIOM", "UTTER", "THESE", "SIXTH", "ALARM", "ERASE", "ELEGY", "SPUNK", "PIPER", + "SCALY", "SCOLD", "HEFTY", "CHICK", "SOOTY", "CANAL", "WHINY", "SLASH", "QUAKE", "JOINT", "SWEPT", "PRUDE", + "HEAVY", "WIELD", "FEMME", "LASSO", "MAIZE", "SHALE", "SCREW", "SPREE", "SMOKY", "WHIFF", "SCENT", "GLADE", + "SPENT", "PRISM", "STOKE", "RIPER", "ORBIT", "COCOA", "GUILT", "HUMUS", "SHUSH", "TABLE", "SMIRK", "WRONG", + "NOISY", "ALERT", "SHINY", "ELATE", "RESIN", "WHOLE", "HUNCH", "PIXEL", "POLAR", "HOTEL", "SWORD", "CLEAT", + "MANGO", "RUMBA", "PUFFY", "FILLY", "BILLY", "LEASH", "CLOUT", "DANCE", "OVATE", "FACET", "CHILI", "PAINT", + "LINER", "CURIO", "SALTY", "AUDIO", "SNAKE", "FABLE", "CLOAK", "NAVEL", "SPURT", "PESTO", "BALMY", "FLASH", + "UNWED", "EARLY", "CHURN", "WEEDY", "STUMP", "LEASE", "WITTY", "WIMPY", "SPOOF", "SANER", "BLEND", "SALSA", + "THICK", "WARTY", "MANIC", "BLARE", "SQUIB", "SPOON", "PROBE", "CREPE", "KNACK", "FORCE", "DEBUT", "ORDER", + "HASTE", "TEETH", "AGENT", "WIDEN", "ICILY", "SLICE", "INGOT", "CLASH", "JUROR", "BLOOD", "ABODE", "THROW", + "UNITY", "PIVOT", "SLEPT", "TROOP", "SPARE", "SEWER", "PARSE", "MORPH", "CACTI", "TACKY", "SPOOL", "DEMON", + "MOODY", "ANNEX", "BEGIN", "FUZZY", "PATCH", "WATER", "LUMPY", "ADMIN", "OMEGA", "LIMIT", "TABBY", "MACHO", + "AISLE", "SKIFF", "BASIS", "PLANK", "VERGE", "BOTCH", "CRAWL", "LOUSY", "SLAIN", "CUBIC", "RAISE", "WRACK", + "GUIDE", "FOIST", "CAMEO", "UNDER", "ACTOR", "REVUE", "FRAUD", "HARPY", "SCOOP", "CLIMB", "REFER", "OLDEN", + "CLERK", "DEBAR", "TALLY", "ETHIC", "CAIRN", "TULLE", "GHOUL", "HILLY", "CRUDE", "APART", "SCALE", "OLDER", + "PLAIN", "SPERM", "BRINY", "ABBOT", "RERUN", "QUEST", "CRISP", "BOUND", "BEFIT", "DRAWN", "SUITE", "ITCHY", + "CHEER", "BAGEL", "GUESS", "BROAD", "AXIOM", "CHARD", "CAPUT", "LEANT", "HARSH", "CURSE", "PROUD", "SWING", + "OPINE", "TASTE", "LUPUS", "GUMBO", "MINER", "GREEN", "CHASM", "LIPID", "TOPIC", "ARMOR", "BRUSH", "CRANE", + "MURAL", "ABLED", "HABIT", "BOSSY", "MAKER", "DUSKY", "DIZZY", "LITHE", "BROOK", "JAZZY", "FIFTY", "SENSE", + "GIANT", "SURLY", "LEGAL", "FATAL", "FLUNK", "BEGAN", "PRUNE", "SMALL", "SLANT", "SCOFF", "TORUS", "NINNY", + "COVEY", "VIPER", "TAKEN", "MORAL", "VOGUE", "OWING", "TOKEN", "ENTRY", "BOOTH", "VOTER", "CHIDE", "ELFIN", + "EBONY", "NEIGH", "MINIM", "MELON", "KNEED", "DECOY", "VOILA", "ANKLE", "ARROW", "MUSHY", "TRIBE", "CEASE", + "EAGER", "BIRTH", "GRAPH", "ODDER", "TERRA", "WEIRD", "TRIED", "CLACK", "COLOR", "ROUGH", "WEIGH", "UNCUT", + "LADLE", "STRIP", "CRAFT", "MINUS", "DICEY", "TITAN", "LUCID", "VICAR", "DRESS", "DITCH", "GYPSY", "PASTA", + "TAFFY", "FLAME", "SWOOP", "ALOOF", "SIGHT", "BROKE", "TEARY", "CHART", "SIXTY", "WORDY", "SHEER", "LEPER", + "NOSEY", "BULGE", "SAVOR", "CLAMP", "FUNKY", "FOAMY", "TOXIC", "BRAND", "PLUMB", "DINGY", "BUTTE", "DRILL", + "TRIPE", "BICEP", "TENOR", "KRILL", "WORSE", "DRAMA", "HYENA", "THINK", "RATIO", "COBRA", "BASIL", "SCRUM", + "BUSED", "PHONE", "COURT", "CAMEL", "PROOF", "HEARD", "ANGEL", "PETAL", "POUTY", "THROB", "MAYBE", "FETAL", + "SPRIG", "SPINE", "SHOUT", "CADET", "MACRO", "DODGY", "SATYR", "RARER", "BINGE", "TREND", "NUTTY", "LEAPT", + "AMISS", "SPLIT", "MYRRH", "WIDTH", "SONAR", "TOWER", "BARON", "FEVER", "WAVER", "SPARK", "BELIE", "SLOOP", + "EXPEL", "SMOTE", "BALER", "ABOVE", "NORTH", "WAFER", "SCANT", "FRILL", "AWASH", "SNACK", "SCOWL", "FRAIL", + "DRIFT", "LIMBO", "FENCE", "MOTEL", "OUNCE", "WREAK", "REVEL", "TALON", "PRIOR", "KNELT", "CELLO", "FLAKE", + "DEBUG", "ANODE", "CRIME", "SALVE", "SCOUT", "IMBUE", "PINKY", "STAVE", "VAGUE", "CHOCK", "FIGHT", "VIDEO", + "STONE", "TEACH", "CLEFT", "FROST", "PRAWN", "BOOTY", "TWIST", "APNEA", "STIFF", "PLAZA", "LEDGE", "TWEAK", + "BOARD", "GRANT", "MEDIC", "BACON", "CABLE", "BRAWL", "SLUNK", "RASPY", "FORUM", "DRONE", "WOMEN", "MUCUS", + "BOAST", "TODDY", "COVEN", "TUMOR", "TRUER", "WRATH", "STALL", "STEAM", "AXIAL", "PURER", "DAILY", "TRAIL", + "NICHE", "MEALY", "JUICE", "NYLON", "PLUMP", "MERRY", "FLAIL", "PAPAL", "WHEAT", "BERRY", "COWER", "ERECT", + "BRUTE", "LEGGY", "SNIPE", "SINEW", "SKIER", "PENNY", "JUMPY", "RALLY", "UMBRA", "SCARY", "MODEM", "GROSS", + "AVIAN", "GREED", "SATIN", "TONIC", "PARKA", "SNIFF", "LIVID", "STARK", "TRUMP", "GIDDY", "REUSE", "TABOO", + "AVOID", "QUOTE", "DEVIL", "LIKEN", "GLOSS", "GAYER", "BERET", "NOISE", "GLAND", "DEALT", "SLING", "RUMOR", + "OPERA", "THIGH", "TONGA", "FLARE", "WOUND", "WHITE", "BULKY", "ETUDE", "HORSE", "CIRCA", "PADDY", "INBOX", + "FIZZY", "GRAIN", "EXERT", "SURGE", "GLEAM", "BELLE", "SALVO", "CRUSH", "FRUIT", "SAPPY", "TAKER", "TRACT", + "OVINE", "SPIKY", "FRANK", "REEDY", "FILTH", "SPASM", "HEAVE", "MAMBO", "RIGHT", "CLANK", "TRUST", "LUMEN", + "BORNE", "SPOOK", "SAUCE", "AMBER", "LATHE", "CARAT", "CORER", "DIRTY", "SLYLY", "AFFIX", "ALLOY", "TAINT", + "SHEEP", "KINKY", "WOOLY", "MAUVE", "FLUNG", "YACHT", "FRIED", "QUAIL", "BRUNT", "GRIMY", "CURVY", "CAGEY", + "RINSE", "DEUCE", "STATE", "GRASP", "MILKY", "BISON", "GRAFT", "SANDY", "BASTE", "FLASK", "HEDGE", "GIRLY", + "SWASH", "BONEY", "COUPE", "ENDOW", "ABHOR", "WELCH", "BLADE", "TIGHT", "GEESE", "MISER", "MIRTH", "CLOUD", + "CABAL", "LEECH", "CLOSE", "TENTH", "PECAN", "DROIT", "GRAIL", "CLONE", "GUISE", "RALPH", "TANGO", "BIDDY", + "SMITH", "MOWER", "PAYEE", "SERIF", "DRAPE", "FIFTH", "SPANK", "GLAZE", "ALLOT", "TRUCK", "KAYAK", "VIRUS", + "TESTY", "TEPEE", "FULLY", "ZONAL", "METRO", "CURRY", "GRAND", "BANJO", "AXION", "BEZEL", "OCCUR", "CHAIN", + "NASAL", "GOOEY", "FILER", "BRACE", "ALLAY", "PUBIC", "RAVEN", "PLEAD", "GNASH", "FLAKY", "MUNCH", "DULLY", + "EKING", "THING", "SLINK", "HURRY", "THEFT", "SHORN", "PYGMY", "RANCH", "WRING", "LEMON", "SHORE", "MAMMA", + "FROZE", "NEWER", "STYLE", "MOOSE", "ANTIC", "DROWN", "VEGAN", "CHESS", "GUPPY", "UNION", "LEVER", "LORRY", + "IMAGE", "CABBY", "DRUID", "EXACT", "TRUTH", "DOPEY", "SPEAR", "CRIED", "CHIME", "CRONY", "STUNK", "TIMID", + "BATCH", "GAUGE", "ROTOR", "CRACK", "CURVE", "LATTE", "WITCH", "BUNCH", "REPEL", "ANVIL", "SOAPY", "METER", + "BROTH", "MADLY", "DRIED", "SCENE", "KNOWN", "MAGMA", "ROOST", "WOMAN", "THONG", "PUNCH", "PASTY", "DOWNY", + "KNEAD", "WHIRL", "RAPID", "CLANG", "ANGER", "DRIVE", "GOOFY", "EMAIL", "MUSIC", "STUFF", "BLEEP", "RIDER", + "MECCA", "FOLIO", "SETUP", "VERSO", "QUASH", "FAUNA", "GUMMY", "HAPPY", "NEWLY", "FUSSY", "RELIC", "GUAVA", + "RATTY", "FUDGE", "FEMUR", "CHIRP", "FORTE", "ALIBI", "WHINE", "PETTY", "GOLLY", "PLAIT", "FLECK", "FELON", + "GOURD", "BROWN", "THRUM", "FICUS", "STASH", "DECRY", "WISER", "JUNTA", "VISOR", "DAUNT", "SCREE", "IMPEL", + "AWAIT", "PRESS", "WHOSE", "TURBO", "STOOP", "SPEAK", "MANGY", "EYING", "INLET", "CRONE", "PULSE", "MOSSY", + "STAID", "HENCE", "PINCH", "TEDDY", "SULLY", "SNORE", "RIPEN", "SNOWY", "ATTIC", "GOING", "LEACH", "MOUTH", + "HOUND", "CLUMP", "TONAL", "BIGOT", "PERIL", "PIECE", "BLAME", "HAUTE", "SPIED", "UNDID", "INTRO", "BASAL", + "RODEO", "GUARD", "STEER", "LOAMY", "SCAMP", "SCRAM", "MANLY", "HELLO", "VAUNT", "ORGAN", "FERAL", "KNOCK", + "EXTRA", "CONDO", "ADAPT", "WILLY", "POLKA", "RAYON", "SKIRT", "FAITH", "TORSO", "MATCH", "MERCY", "TEPID", + "SLEEK", "RISER", "TWIXT", "PEACE", "FLUSH", "CATTY", "LOGIN", "EJECT", "ROGER", "RIVAL", "UNTIE", "REFIT", + "AORTA", "ADULT", "JUDGE", "ROWER", "ARTSY", "RURAL", "SHAVE", "BOBBY", "ECLAT", "FELLA", "GAILY", "HARRY", + "HASTY", "HYDRO", "LIEGE", "OCTAL", "OMBRE", "PAYER", "SOOTH", "UNSET", "UNLIT", "VOMIT", "FANNY", "FETUS", + "BUTCH", "STALK", "FLACK", "WIDOW", "AUGUR", "LITER", +] + +possible_list = [ + "AAHED", "AALII", "AARGH", "AARTI", "ABACA", "ABACI", "ABACS", "ABAFT", "ABAKA", "ABAMP", "ABAND", "ABASH", + "ABASK", "ABAYA", "ABBAS", "ABBED", "ABBES", "ABCEE", "ABEAM", "ABEAR", "ABELE", "ABERS", "ABETS", "ABIES", + "ABLER", "ABLES", "ABLET", "ABLOW", "ABMHO", "ABOHM", "ABOIL", "ABOMA", "ABOON", "ABORD", "ABORE", "ABRAM", + "ABRAY", "ABRIM", "ABRIN", "ABRIS", "ABSEY", "ABSIT", "ABUNA", "ABUNE", "ABUTS", "ABUZZ", "ABYES", "ABYSM", + "ACAIS", "ACARI", "ACCAS", "ACCOY", "ACERB", "ACERS", "ACETA", "ACHAR", "ACHED", "ACHES", "ACHOO", "ACIDS", + "ACIDY", "ACING", "ACINI", "ACKEE", "ACKER", "ACMES", "ACMIC", "ACNED", "ACNES", "ACOCK", "ACOLD", "ACRED", + "ACRES", "ACROS", "ACTED", "ACTIN", "ACTON", "ACYLS", "ADAWS", "ADAYS", "ADBOT", "ADDAX", "ADDED", "ADDER", + "ADDIO", "ADDLE", "ADEEM", "ADHAN", "ADIEU", "ADIOS", "ADITS", "ADMAN", "ADMEN", "ADMIX", "ADOBO", "ADOWN", + "ADOZE", "ADRAD", "ADRED", "ADSUM", "ADUKI", "ADUNC", "ADUST", "ADVEW", "ADYTA", "ADZED", "ADZES", "AECIA", + "AEDES", "AEGIS", "AEONS", "AERIE", "AEROS", "AESIR", "AFALD", "AFARA", "AFARS", "AFEAR", "AFLAJ", "AFORE", + "AFRIT", "AFROS", "AGAMA", "AGAMI", "AGARS", "AGAST", "AGAVE", "AGAZE", "AGENE", "AGERS", "AGGER", "AGGIE", + "AGGRI", "AGGRO", "AGGRY", "AGHAS", "AGILA", "AGIOS", "AGISM", "AGIST", "AGITA", "AGLEE", "AGLET", "AGLEY", + "AGLOO", "AGLUS", "AGMAS", "AGOGE", "AGONE", "AGONS", "AGOOD", "AGORA", "AGRIA", "AGRIN", "AGROS", "AGUED", + "AGUES", "AGUNA", "AGUTI", "AHEAP", "AHENT", "AHIGH", "AHIND", "AHING", "AHINT", "AHOLD", "AHULL", "AHURU", + "AIDAS", "AIDED", "AIDES", "AIDOI", "AIDOS", "AIERY", "AIGAS", "AIGHT", "AILED", "AIMED", "AIMER", "AINEE", + "AINGA", "AIOLI", "AIRED", "AIRER", "AIRNS", "AIRTH", "AIRTS", "AITCH", "AITUS", "AIVER", "AIYEE", "AIZLE", + "AJIES", "AJIVA", "AJUGA", "AJWAN", "AKEES", "AKELA", "AKENE", "AKING", "AKITA", "AKKAS", "ALAAP", "ALACK", + "ALAMO", "ALAND", "ALANE", "ALANG", "ALANS", "ALANT", "ALAPA", "ALAPS", "ALARY", "ALATE", "ALAYS", "ALBAS", + "ALBEE", "ALCID", "ALCOS", "ALDEA", "ALDER", "ALDOL", "ALECK", "ALECS", "ALEFS", "ALEFT", "ALEPH", "ALEWS", + "ALEYE", "ALFAS", "ALGAL", "ALGAS", "ALGID", "ALGIN", "ALGOR", "ALGUM", "ALIAS", "ALIFS", "ALINE", "ALIST", + "ALIYA", "ALKIE", "ALKOS", "ALKYD", "ALKYL", "ALLEE", "ALLEL", "ALLIS", "ALLOD", "ALLYL", "ALMAH", "ALMAS", + "ALMEH", "ALMES", "ALMUD", "ALMUG", "ALODS", "ALOED", "ALOES", "ALOHA", "ALOIN", "ALOOS", "ALOWE", "ALTHO", + "ALTOS", "ALULA", "ALUMS", "ALURE", "ALVAR", "ALWAY", "AMAHS", "AMAIN", "AMATE", "AMAUT", "AMBAN", "AMBIT", + "AMBOS", "AMBRY", "AMEBA", "AMEER", "AMENE", "AMENS", "AMENT", "AMIAS", "AMICE", "AMICI", "AMIDE", "AMIDO", + "AMIDS", "AMIES", "AMIGA", "AMIGO", "AMINE", "AMINO", "AMINS", "AMIRS", "AMLAS", "AMMAN", "AMMON", "AMMOS", + "AMNIA", "AMNIC", "AMNIO", "AMOKS", "AMOLE", "AMORT", "AMOUR", "AMOVE", "AMOWT", "AMPED", "AMPUL", "AMRIT", + "AMUCK", "AMYLS", "ANANA", "ANATA", "ANCHO", "ANCLE", "ANCON", "ANDRO", "ANEAR", "ANELE", "ANENT", "ANGAS", + "ANGLO", "ANIGH", "ANILE", "ANILS", "ANIMA", "ANIMI", "ANION", "ANISE", "ANKER", "ANKHS", "ANKUS", "ANLAS", + "ANNAL", "ANNAS", "ANNAT", "ANOAS", "ANOLE", "ANOMY", "ANSAE", "ANTAE", "ANTAR", "ANTAS", "ANTED", "ANTES", + "ANTIS", "ANTRA", "ANTRE", "ANTSY", "ANURA", "ANYON", "APACE", "APAGE", "APAID", "APAYD", "APAYS", "APEAK", + "APEEK", "APERS", "APERT", "APERY", "APGAR", "APHIS", "APIAN", "APIOL", "APISH", "APISM", "APODE", "APODS", + "APOOP", "APORT", "APPAL", "APPAY", "APPEL", "APPRO", "APPUI", "APPUY", "APRES", "APSES", "APSIS", "APSOS", + "APTED", "APTER", "AQUAE", "AQUAS", "ARABA", "ARAKS", "ARAME", "ARARS", "ARBAS", "ARCED", "ARCHI", "ARCOS", + "ARCUS", "ARDEB", "ARDRI", "AREAD", "AREAE", "AREAL", "AREAR", "AREAS", "ARECA", "AREDD", "AREDE", "AREFY", + "AREIC", "ARENE", "AREPA", "ARERE", "ARETE", "ARETS", "ARETT", "ARGAL", "ARGAN", "ARGIL", "ARGLE", "ARGOL", + "ARGON", "ARGOT", "ARGUS", "ARHAT", "ARIAS", "ARIEL", "ARIKI", "ARILS", "ARIOT", "ARISH", "ARKED", "ARLED", + "ARLES", "ARMED", "ARMER", "ARMET", "ARMIL", "ARNAS", "ARNUT", "AROBA", "AROHA", "AROID", "ARPAS", "ARPEN", + "ARRAH", "ARRAS", "ARRET", "ARRIS", "ARROZ", "ARSED", "ARSES", "ARSEY", "ARSIS", "ARTAL", "ARTEL", "ARTIC", + "ARTIS", "ARUHE", "ARUMS", "ARVAL", "ARVEE", "ARVOS", "ARYLS", "ASANA", "ASCON", "ASCUS", "ASDIC", "ASHED", + "ASHES", "ASHET", "ASKED", "ASKER", "ASKOI", "ASKOS", "ASPEN", "ASPER", "ASPIC", "ASPIE", "ASPIS", "ASPRO", + "ASSAI", "ASSAM", "ASSES", "ASSEZ", "ASSOT", "ASTER", "ASTIR", "ASTUN", "ASURA", "ASWAY", "ASWIM", "ASYLA", + "ATAPS", "ATAXY", "ATIGI", "ATILT", "ATIMY", "ATLAS", "ATMAN", "ATMAS", "ATMOS", "ATOCS", "ATOKE", "ATOKS", + "ATOMS", "ATOMY", "ATONY", "ATOPY", "ATRIA", "ATRIP", "ATTAP", "ATTAR", "ATUAS", "AUDAD", "AUGER", "AUGHT", + "AULAS", "AULIC", "AULOI", "AULOS", "AUMIL", "AUNES", "AUNTS", "AURAE", "AURAL", "AURAR", "AURAS", "AUREI", + "AURES", "AURIC", "AURIS", "AURUM", "AUTOS", "AUXIN", "AVALE", "AVANT", "AVAST", "AVELS", "AVENS", "AVERS", + "AVGAS", "AVINE", "AVION", "AVISE", "AVISO", "AVIZE", "AVOWS", "AVYZE", "AWARN", "AWATO", "AWAVE", "AWAYS", + "AWDLS", "AWEEL", "AWETO", "AWING", "AWMRY", "AWNED", "AWNER", "AWOLS", "AWORK", "AXELS", "AXILE", "AXILS", + "AXING", "AXITE", "AXLED", "AXLES", "AXMAN", "AXMEN", "AXOID", "AXONE", "AXONS", "AYAHS", "AYAYA", "AYELP", + "AYGRE", "AYINS", "AYONT", "AYRES", "AYRIE", "AZANS", "AZIDE", "AZIDO", "AZINE", "AZLON", "AZOIC", "AZOLE", + "AZONS", "AZOTE", "AZOTH", "AZUKI", "AZURN", "AZURY", "AZYGY", "AZYME", "AZYMS", "BAAED", "BAALS", "BABAS", + "BABEL", "BABES", "BABKA", "BABOO", "BABUL", "BABUS", "BACCA", "BACCO", "BACCY", "BACHA", "BACHS", "BACKS", + "BADDY", "BAELS", "BAFFS", "BAFFY", "BAFTS", "BAGHS", "BAGIE", "BAHTS", "BAHUS", "BAHUT", "BAILS", "BAIRN", + "BAISA", "BAITH", "BAITS", "BAIZA", "BAIZE", "BAJAN", "BAJRA", "BAJRI", "BAJUS", "BAKED", "BAKEN", "BAKES", + "BAKRA", "BALAS", "BALDS", "BALDY", "BALED", "BALES", "BALKS", "BALKY", "BALLS", "BALLY", "BALMS", "BALOO", + "BALSA", "BALTI", "BALUN", "BALUS", "BAMBI", "BANAK", "BANCO", "BANCS", "BANDA", "BANDH", "BANDS", "BANDY", + "BANED", "BANES", "BANGS", "BANIA", "BANKS", "BANNS", "BANTS", "BANTU", "BANTY", "BANYA", "BAPUS", "BARBE", + "BARBS", "BARBY", "BARCA", "BARDE", "BARDO", "BARDS", "BARDY", "BARED", "BARER", "BARES", "BARFI", "BARFS", + "BARIC", "BARKS", "BARKY", "BARMS", "BARMY", "BARNS", "BARNY", "BARPS", "BARRA", "BARRE", "BARRO", "BARRY", + "BARYE", "BASAN", "BASED", "BASEN", "BASER", "BASES", "BASHO", "BASIJ", "BASKS", "BASON", "BASSE", "BASSI", + "BASSO", "BASSY", "BASTA", "BASTI", "BASTO", "BASTS", "BATED", "BATES", "BATHS", "BATIK", "BATTA", "BATTS", + "BATTU", "BAUDS", "BAUKS", "BAULK", "BAURS", "BAVIN", "BAWDS", "BAWKS", "BAWLS", "BAWNS", "BAWRS", "BAWTY", + "BAYED", "BAYER", "BAYES", "BAYLE", "BAYTS", "BAZAR", "BAZOO", "BEADS", "BEAKS", "BEAKY", "BEALS", "BEAMS", + "BEAMY", "BEANO", "BEANS", "BEANY", "BEARE", "BEARS", "BEATH", "BEATS", "BEATY", "BEAUS", "BEAUT", "BEAUX", + "BEBOP", "BECAP", "BECKE", "BECKS", "BEDAD", "BEDEL", "BEDES", "BEDEW", "BEDIM", "BEDYE", "BEEDI", "BEEFS", + "BEEPS", "BEERS", "BEERY", "BEETS", "BEFOG", "BEGAD", "BEGAR", "BEGEM", "BEGOT", "BEGUM", "BEIGE", "BEIGY", + "BEINS", "BEKAH", "BELAH", "BELAR", "BELAY", "BELEE", "BELGA", "BELLS", "BELON", "BELTS", "BEMAD", "BEMAS", + "BEMIX", "BEMUD", "BENDS", "BENDY", "BENES", "BENET", "BENGA", "BENIS", "BENNE", "BENNI", "BENNY", "BENTO", + "BENTS", "BENTY", "BEPAT", "BERAY", "BERES", "BERGS", "BERKO", "BERKS", "BERME", "BERMS", "BEROB", "BERYL", + "BESAT", "BESAW", "BESEE", "BESES", "BESIT", "BESOM", "BESOT", "BESTI", "BESTS", "BETAS", "BETED", "BETES", + "BETHS", "BETID", "BETON", "BETTA", "BETTY", "BEVER", "BEVOR", "BEVUE", "BEVVY", "BEWET", "BEWIG", "BEZES", + "BEZIL", "BEZZY", "BHAIS", "BHAJI", "BHANG", "BHATS", "BHELS", "BHOOT", "BHUNA", "BHUTS", "BIACH", "BIALI", + "BIALY", "BIBBS", "BIBES", "BICCY", "BICES", "BIDED", "BIDER", "BIDES", "BIDET", "BIDIS", "BIDON", "BIELD", + "BIERS", "BIFFO", "BIFFS", "BIFFY", "BIFID", "BIGAE", "BIGGS", "BIGGY", "BIGHA", "BIGHT", "BIGLY", "BIGOS", + "BIJOU", "BIKED", "BIKER", "BIKES", "BIKIE", "BILBO", "BILBY", "BILED", "BILES", "BILGY", "BILKS", "BILLS", + "BIMAH", "BIMAS", "BIMBO", "BINAL", "BINDI", "BINDS", "BINER", "BINES", "BINGS", "BINGY", "BINIT", "BINKS", + "BINTS", "BIOGS", "BIONT", "BIOTA", "BIPED", "BIPOD", "BIRDS", "BIRKS", "BIRLE", "BIRLS", "BIROS", "BIRRS", + "BIRSE", "BIRSY", "BISES", "BISKS", "BISOM", "BITCH", "BITER", "BITES", "BITOS", "BITOU", "BITSY", "BITTE", + "BITTS", "BIVIA", "BIVVY", "BIZES", "BIZZO", "BIZZY", "BLABS", "BLADS", "BLADY", "BLAER", "BLAES", "BLAFF", + "BLAGS", "BLAHS", "BLAIN", "BLAMS", "BLART", "BLASE", "BLASH", "BLATE", "BLATS", "BLATT", "BLAUD", "BLAWN", + "BLAWS", "BLAYS", "BLEAR", "BLEBS", "BLECH", "BLEES", "BLENT", "BLERT", "BLEST", "BLETS", "BLEYS", "BLIMY", + "BLING", "BLINI", "BLINS", "BLINY", "BLIPS", "BLIST", "BLITE", "BLITS", "BLIVE", "BLOBS", "BLOCS", "BLOGS", + "BLOOK", "BLOOP", "BLORE", "BLOTS", "BLOWS", "BLOWY", "BLUBS", "BLUDE", "BLUDS", "BLUDY", "BLUED", "BLUES", + "BLUET", "BLUEY", "BLUID", "BLUME", "BLUNK", "BLURS", "BLYPE", "BOABS", "BOAKS", "BOARS", "BOART", "BOATS", + "BOBAC", "BOBAK", "BOBAS", "BOBOL", "BOBOS", "BOCCA", "BOCCE", "BOCCI", "BOCHE", "BOCKS", "BODED", "BODES", + "BODGE", "BODHI", "BODLE", "BOEPS", "BOETS", "BOEUF", "BOFFO", "BOFFS", "BOGAN", "BOGEY", "BOGGY", "BOGIE", + "BOGLE", "BOGUE", "BOGUS", "BOHEA", "BOHOS", "BOILS", "BOING", "BOINK", "BOITE", "BOKED", "BOKEH", "BOKES", + "BOKOS", "BOLAR", "BOLAS", "BOLDS", "BOLES", "BOLIX", "BOLLS", "BOLOS", "BOLTS", "BOLUS", "BOMAS", "BOMBE", + "BOMBO", "BOMBS", "BONCE", "BONDS", "BONED", "BONER", "BONES", "BONGS", "BONIE", "BONKS", "BONNE", "BONNY", + "BONZA", "BONZE", "BOOAI", "BOOAY", "BOOBS", "BOODY", "BOOED", "BOOFY", "BOOGY", "BOOHS", "BOOKS", "BOOKY", + "BOOLS", "BOOMS", "BOOMY", "BOONG", "BOONS", "BOORD", "BOORS", "BOOSE", "BOOTS", "BOPPY", "BORAK", "BORAL", + "BORAS", "BORDE", "BORDS", "BORED", "BOREE", "BOREL", "BORER", "BORES", "BORGO", "BORIC", "BORKS", "BORMS", + "BORNA", "BORON", "BORTS", "BORTY", "BORTZ", "BOSIE", "BOSKS", "BOSKY", "BOSON", "BOSUN", "BOTAS", "BOTEL", + "BOTES", "BOTHY", "BOTTE", "BOTTS", "BOTTY", "BOUGE", "BOUKS", "BOULT", "BOUNS", "BOURD", "BOURG", "BOURN", + "BOUSE", "BOUSY", "BOUTS", "BOVID", "BOWAT", "BOWED", "BOWER", "BOWES", "BOWET", "BOWIE", "BOWLS", "BOWNE", + "BOWRS", "BOWSE", "BOXED", "BOXEN", "BOXES", "BOXLA", "BOXTY", "BOYAR", "BOYAU", "BOYED", "BOYFS", "BOYGS", + "BOYLA", "BOYOS", "BOYSY", "BOZOS", "BRAAI", "BRACH", "BRACK", "BRACT", "BRADS", "BRAES", "BRAGS", "BRAIL", + "BRAKS", "BRAKY", "BRAME", "BRANE", "BRANK", "BRANS", "BRANT", "BRAST", "BRATS", "BRAVA", "BRAVI", "BRAWS", + "BRAXY", "BRAYS", "BRAZA", "BRAZE", "BREAM", "BREDE", "BREDS", "BREEM", "BREER", "BREES", "BREID", "BREIS", + "BREME", "BRENS", "BRENT", "BRERE", "BRERS", "BREVE", "BREWS", "BREYS", "BRIER", "BRIES", "BRIGS", "BRIKI", + "BRIKS", "BRILL", "BRIMS", "BRINS", "BRIOS", "BRISE", "BRISS", "BRITH", "BRITS", "BRITT", "BRIZE", "BROCH", + "BROCK", "BRODS", "BROGH", "BROGS", "BROME", "BROMO", "BRONC", "BROND", "BROOL", "BROOS", "BROSE", "BROSY", + "BROWS", "BRUGH", "BRUIN", "BRUIT", "BRULE", "BRUME", "BRUNG", "BRUSK", "BRUST", "BRUTS", "BUATS", "BUAZE", + "BUBAL", "BUBAS", "BUBBA", "BUBBE", "BUBBY", "BUBUS", "BUCHU", "BUCKO", "BUCKS", "BUCKU", "BUDAS", "BUDIS", + "BUDOS", "BUFFA", "BUFFE", "BUFFI", "BUFFO", "BUFFS", "BUFFY", "BUFOS", "BUFTY", "BUHLS", "BUHRS", "BUIKS", + "BUIST", "BUKES", "BULBS", "BULGY", "BULKS", "BULLA", "BULLS", "BULSE", "BUMBO", "BUMFS", "BUMPH", "BUMPS", + "BUMPY", "BUNAS", "BUNCE", "BUNCO", "BUNDE", "BUNDH", "BUNDS", "BUNDT", "BUNDU", "BUNDY", "BUNGS", "BUNGY", + "BUNIA", "BUNJE", "BUNJY", "BUNKO", "BUNKS", "BUNNS", "BUNTS", "BUNTY", "BUNYA", "BUOYS", "BUPPY", "BURAN", + "BURAS", "BURBS", "BURDS", "BURET", "BURFI", "BURGH", "BURGS", "BURIN", "BURKA", "BURKE", "BURKS", "BURLS", + "BURNS", "BUROO", "BURPS", "BURQA", "BURRO", "BURRS", "BURRY", "BURSA", "BURSE", "BUSBY", "BUSES", "BUSKS", + "BUSKY", "BUSSU", "BUSTI", "BUSTS", "BUSTY", "BUTEO", "BUTES", "BUTLE", "BUTOH", "BUTTS", "BUTTY", "BUTUT", + "BUTYL", "BUZZY", "BWANA", "BWAZI", "BYDED", "BYDES", "BYKED", "BYKES", "BYRES", "BYRLS", "BYSSI", "BYTES", + "BYWAY", "CAAED", "CABAS", "CABER", "CABOB", "CABOC", "CABRE", "CACAS", "CACKS", "CACKY", "CADEE", "CADES", + "CADGE", "CADGY", "CADIE", "CADIS", "CADRE", "CAECA", "CAESE", "CAFES", "CAFFS", "CAGED", "CAGER", "CAGES", + "CAGOT", "CAHOW", "CAIDS", "CAINS", "CAIRD", "CAJON", "CAJUN", "CAKED", "CAKES", "CAKEY", "CALFS", "CALID", + "CALIF", "CALIX", "CALKS", "CALLA", "CALLS", "CALMS", "CALMY", "CALOS", "CALPA", "CALPS", "CALVE", "CALYX", + "CAMAN", "CAMAS", "CAMES", "CAMIS", "CAMOS", "CAMPI", "CAMPO", "CAMPS", "CAMPY", "CAMUS", "CANED", "CANEH", + "CANER", "CANES", "CANGS", "CANID", "CANNA", "CANNS", "CANSO", "CANST", "CANTO", "CANTS", "CANTY", "CAPAS", + "CAPED", "CAPES", "CAPEX", "CAPHS", "CAPIZ", "CAPLE", "CAPON", "CAPOS", "CAPOT", "CAPRI", "CAPUL", "CARAP", + "CARBO", "CARBS", "CARBY", "CARDI", "CARDS", "CARDY", "CARED", "CARER", "CARES", "CARET", "CAREX", "CARKS", + "CARLE", "CARLS", "CARNS", "CARNY", "CAROB", "CAROM", "CARON", "CARPI", "CARPS", "CARRS", "CARSE", "CARTA", + "CARTE", "CARTS", "CARVY", "CASAS", "CASCO", "CASED", "CASES", "CASKS", "CASKY", "CASTS", "CASUS", "CATES", + "CAUDA", "CAUKS", "CAULD", "CAULS", "CAUMS", "CAUPS", "CAURI", "CAUSA", "CAVAS", "CAVED", "CAVEL", "CAVER", + "CAVES", "CAVIE", "CAWED", "CAWKS", "CAXON", "CEAZE", "CEBID", "CECAL", "CECUM", "CEDED", "CEDER", "CEDES", + "CEDIS", "CEIBA", "CEILI", "CEILS", "CELEB", "CELLA", "CELLI", "CELLS", "CELOM", "CELTS", "CENSE", "CENTO", + "CENTS", "CENTU", "CEORL", "CEPES", "CERCI", "CERED", "CERES", "CERGE", "CERIA", "CERIC", "CERNE", "CEROC", + "CEROS", "CERTS", "CERTY", "CESSE", "CESTA", "CESTI", "CETES", "CETYL", "CEZVE", "CHACE", "CHACK", "CHACO", + "CHADO", "CHADS", "CHAFT", "CHAIS", "CHALS", "CHAMS", "CHANA", "CHANG", "CHANK", "CHAPE", "CHAPS", "CHAPT", + "CHARA", "CHARE", "CHARK", "CHARR", "CHARS", "CHARY", "CHATS", "CHAVE", "CHAVS", "CHAWK", "CHAWS", "CHAYA", + "CHAYS", "CHEEP", "CHEFS", "CHEKA", "CHELA", "CHELP", "CHEMO", "CHEMS", "CHERE", "CHERT", "CHETH", "CHEVY", + "CHEWS", "CHEWY", "CHIAO", "CHIAS", "CHIBS", "CHICA", "CHICH", "CHICO", "CHICS", "CHIEL", "CHIKS", "CHILE", + "CHIMB", "CHIMO", "CHIMP", "CHINE", "CHING", "CHINK", "CHINO", "CHINS", "CHIPS", "CHIRK", "CHIRL", "CHIRM", + "CHIRO", "CHIRR", "CHIRT", "CHIRU", "CHITS", "CHIVE", "CHIVS", "CHIVY", "CHIZZ", "CHOCO", "CHOCS", "CHODE", + "CHOGS", "CHOIL", "CHOKO", "CHOKY", "CHOLA", "CHOLI", "CHOLO", "CHOMP", "CHONS", "CHOOF", "CHOOK", "CHOOM", + "CHOON", "CHOPS", "CHOTA", "CHOTT", "CHOUT", "CHOUX", "CHOWK", "CHOWS", "CHUBS", "CHUFA", "CHUFF", "CHUGS", + "CHUMS", "CHURL", "CHURR", "CHUSE", "CHUTS", "CHYLE", "CHYME", "CHYND", "CIBOL", "CIDED", "CIDES", "CIELS", + "CIGGY", "CILIA", "CILLS", "CIMAR", "CIMEX", "CINCT", "CINES", "CINQS", "CIONS", "CIPPI", "CIRCS", "CIRES", + "CIRLS", "CIRRI", "CISCO", "CISSY", "CISTS", "CITAL", "CITED", "CITER", "CITES", "CIVES", "CIVET", "CIVIE", + "CIVVY", "CLACH", "CLADE", "CLADS", "CLAES", "CLAGS", "CLAME", "CLAMS", "CLANS", "CLAPS", "CLAPT", "CLARO", + "CLART", "CLARY", "CLAST", "CLATS", "CLAUT", "CLAVE", "CLAVI", "CLAWS", "CLAYS", "CLECK", "CLEEK", "CLEEP", + "CLEFS", "CLEGS", "CLEIK", "CLEMS", "CLEPE", "CLEPT", "CLEVE", "CLEWS", "CLIED", "CLIES", "CLIFT", "CLIME", + "CLINE", "CLINT", "CLIPE", "CLIPS", "CLIPT", "CLITS", "CLOAM", "CLODS", "CLOFF", "CLOGS", "CLOKE", "CLOMB", + "CLOMP", "CLONK", "CLONS", "CLOOP", "CLOOT", "CLOPS", "CLOTE", "CLOTS", "CLOUR", "CLOUS", "CLOWS", "CLOYE", + "CLOYS", "CLOZE", "CLUBS", "CLUES", "CLUEY", "CLUNK", "CLYPE", "CNIDA", "COACT", "COADY", "COALA", "COALS", + "COALY", "COAPT", "COARB", "COATE", "COATI", "COATS", "COBBS", "COBBY", "COBIA", "COBLE", "COBZA", "COCAS", + "COCCI", "COCCO", "COCKS", "COCKY", "COCOS", "CODAS", "CODEC", "CODED", "CODEN", "CODER", "CODES", "CODEX", + "CODON", "COEDS", "COFFS", "COGIE", "COGON", "COGUE", "COHAB", "COHEN", "COHOE", "COHOG", "COHOS", "COIFS", + "COIGN", "COILS", "COINS", "COIRS", "COITS", "COKED", "COKES", "COLAS", "COLBY", "COLDS", "COLED", "COLES", + "COLEY", "COLIC", "COLIN", "COLLS", "COLLY", "COLOG", "COLTS", "COLZA", "COMAE", "COMAL", "COMAS", "COMBE", + "COMBI", "COMBO", "COMBS", "COMBY", "COMER", "COMES", "COMIX", "COMMO", "COMMS", "COMMY", "COMPO", "COMPS", + "COMPT", "COMTE", "COMUS", "CONED", "CONES", "CONEY", "CONFS", "CONGA", "CONGE", "CONGO", "CONIA", "CONIN", + "CONKS", "CONKY", "CONNE", "CONNS", "CONTE", "CONTO", "CONUS", "CONVO", "COOCH", "COOED", "COOEE", "COOER", + "COOEY", "COOFS", "COOKS", "COOKY", "COOLS", "COOLY", "COOMB", "COOMS", "COOMY", "COONS", "COOPS", "COOPT", + "COOST", "COOTS", "COOZE", "COPAL", "COPAY", "COPED", "COPEN", "COPER", "COPES", "COPPY", "COPRA", "COPSY", + "COQUI", "CORAM", "CORBE", "CORBY", "CORDS", "CORED", "CORES", "COREY", "CORGI", "CORIA", "CORKS", "CORKY", + "CORMS", "CORNI", "CORNO", "CORNS", "CORNU", "CORPS", "CORSE", "CORSO", "COSEC", "COSED", "COSES", "COSET", + "COSEY", "COSIE", "COSTA", "COSTE", "COSTS", "COTAN", "COTED", "COTES", "COTHS", "COTTA", "COTTS", "COUDE", + "COUPS", "COURB", "COURD", "COURE", "COURS", "COUTA", "COUTH", "COVED", "COVES", "COVIN", "COWAL", "COWAN", + "COWED", "COWKS", "COWLS", "COWPS", "COWRY", "COXAE", "COXAL", "COXED", "COXES", "COXIB", "COYAU", "COYED", + "COYER", "COYPU", "COZED", "COZEN", "COZES", "COZEY", "COZIE", "CRAAL", "CRABS", "CRAGS", "CRAIC", "CRAIG", + "CRAKE", "CRAME", "CRAMS", "CRANS", "CRAPE", "CRAPS", "CRAPY", "CRARE", "CRAWS", "CRAYS", "CREDS", "CREEL", + "CREES", "CREMS", "CRENA", "CREPS", "CREPY", "CREWE", "CREWS", "CRIAS", "CRIBS", "CRIES", "CRIMS", "CRINE", + "CRIOS", "CRIPE", "CRIPS", "CRISE", "CRITH", "CRITS", "CROCI", "CROCS", "CROFT", "CROGS", "CROMB", "CROME", + "CRONK", "CRONS", "CROOL", "CROON", "CROPS", "CRORE", "CROST", "CROUT", "CROWS", "CROZE", "CRUCK", "CRUDO", + "CRUDS", "CRUDY", "CRUES", "CRUET", "CRUFT", "CRUNK", "CRUOR", "CRURA", "CRUSE", "CRUSY", "CRUVE", "CRWTH", + "CRYER", "CTENE", "CUBBY", "CUBEB", "CUBED", "CUBER", "CUBES", "CUBIT", "CUDDY", "CUFFO", "CUFFS", "CUIFS", + "CUING", "CUISH", "CUITS", "CUKES", "CULCH", "CULET", "CULEX", "CULLS", "CULLY", "CULMS", "CULPA", "CULTI", + "CULTS", "CULTY", "CUMEC", "CUNDY", "CUNEI", "CUNIT", "CUNTS", "CUPEL", "CUPID", "CUPPA", "CUPPY", "CURAT", + "CURBS", "CURCH", "CURDS", "CURDY", "CURED", "CURER", "CURES", "CURET", "CURFS", "CURIA", "CURIE", "CURLI", + "CURLS", "CURNS", "CURNY", "CURRS", "CURSI", "CURST", "CUSEC", "CUSHY", "CUSKS", "CUSPS", "CUSPY", "CUSSO", + "CUSUM", "CUTCH", "CUTER", "CUTES", "CUTEY", "CUTIN", "CUTIS", "CUTTO", "CUTTY", "CUTUP", "CUVEE", "CUZES", + "CWTCH", "CYANO", "CYANS", "CYCAD", "CYCAS", "CYCLO", "CYDER", "CYLIX", "CYMAE", "CYMAR", "CYMAS", "CYMES", + "CYMOL", "CYSTS", "CYTES", "CYTON", "CZARS", "DAALS", "DABBA", "DACES", "DACHA", "DACKS", "DADAH", "DADAS", + "DADOS", "DAFFS", "DAFFY", "DAGGA", "DAGGY", "DAGOS", "DAHLS", "DAIKO", "DAINE", "DAINT", "DAKER", "DALED", + "DALES", "DALIS", "DALLE", "DALTS", "DAMAN", "DAMAR", "DAMES", "DAMME", "DAMNS", "DAMPS", "DAMPY", "DANCY", + "DANGS", "DANIO", "DANKS", "DANNY", "DANTS", "DARAF", "DARBS", "DARCY", "DARED", "DARER", "DARES", "DARGA", + "DARGS", "DARIC", "DARIS", "DARKS", "DARKY", "DARNS", "DARRE", "DARTS", "DARZI", "DASHI", "DASHY", "DATAL", + "DATED", "DATER", "DATES", "DATOS", "DATTO", "DAUBE", "DAUBS", "DAUBY", "DAUDS", "DAULT", "DAURS", "DAUTS", + "DAVEN", "DAVIT", "DAWAH", "DAWDS", "DAWED", "DAWEN", "DAWKS", "DAWNS", "DAWTS", "DAYAN", "DAYCH", "DAYNT", + "DAZED", "DAZER", "DAZES", "DEADS", "DEAIR", "DEALS", "DEANS", "DEARE", "DEARN", "DEARS", "DEARY", "DEASH", + "DEAVE", "DEAWS", "DEAWY", "DEBAG", "DEBBY", "DEBEL", "DEBES", "DEBTS", "DEBUD", "DEBUR", "DEBUS", "DEBYE", + "DECAD", "DECAF", "DECAN", "DECKO", "DECKS", "DECOS", "DEDAL", "DEEDS", "DEEDY", "DEELY", "DEEMS", "DEENS", + "DEEPS", "DEERE", "DEERS", "DEETS", "DEEVE", "DEEVS", "DEFAT", "DEFFO", "DEFIS", "DEFOG", "DEGAS", "DEGUM", + "DEGUS", "DEICE", "DEIDS", "DEIFY", "DEILS", "DEISM", "DEIST", "DEKED", "DEKES", "DEKKO", "DELED", "DELES", + "DELFS", "DELFT", "DELIS", "DELLS", "DELLY", "DELOS", "DELPH", "DELTS", "DEMAN", "DEMES", "DEMIC", "DEMIT", + "DEMOB", "DEMOI", "DEMOS", "DEMPT", "DENAR", "DENAY", "DENCH", "DENES", "DENET", "DENIS", "DENTS", "DEOXY", + "DERAT", "DERAY", "DERED", "DERES", "DERIG", "DERMA", "DERMS", "DERNS", "DERNY", "DEROS", "DERRO", "DERRY", + "DERTH", "DERVS", "DESEX", "DESHI", "DESIS", "DESKS", "DESSE", "DEVAS", "DEVEL", "DEVIS", "DEVON", "DEVOS", + "DEVOT", "DEWAN", "DEWAR", "DEWAX", "DEWED", "DEXES", "DEXIE", "DHABA", "DHAKS", "DHALS", "DHIKR", "DHOBI", + "DHOLE", "DHOLL", "DHOLS", "DHOTI", "DHOWS", "DHUTI", "DIACT", "DIALS", "DIANE", "DIAZO", "DIBBS", "DICED", + "DICER", "DICES", "DICHT", "DICKS", "DICKY", "DICOT", "DICTA", "DICTS", "DICTY", "DIDDY", "DIDIE", "DIDOS", + "DIDST", "DIEBS", "DIELS", "DIENE", "DIETS", "DIFFS", "DIGHT", "DIKAS", "DIKED", "DIKER", "DIKES", "DIKEY", + "DILDO", "DILLI", "DILLS", "DIMBO", "DIMER", "DIMES", "DIMPS", "DINAR", "DINED", "DINES", "DINGE", "DINGS", + "DINIC", "DINKS", "DINKY", "DINNA", "DINOS", "DINTS", "DIOLS", "DIOTA", "DIPPY", "DIPSO", "DIRAM", "DIRER", + "DIRKE", "DIRKS", "DIRLS", "DIRTS", "DISAS", "DISCI", "DISCS", "DISHY", "DISKS", "DISME", "DITAL", "DITAS", + "DITED", "DITES", "DITSY", "DITTS", "DITZY", "DIVAN", "DIVAS", "DIVED", "DIVES", "DIVIS", "DIVNA", "DIVOS", + "DIVOT", "DIVVY", "DIWAN", "DIXIE", "DIXIT", "DIYAS", "DIZEN", "DJINN", "DJINS", "DOABS", "DOATS", "DOBBY", + "DOBES", "DOBIE", "DOBLA", "DOBRA", "DOBRO", "DOCHT", "DOCKS", "DOCOS", "DOCUS", "DODDY", "DODOS", "DOEKS", + "DOERS", "DOEST", "DOETH", "DOFFS", "DOGAN", "DOGES", "DOGEY", "DOGGO", "DOGGY", "DOGIE", "DOHYO", "DOILT", + "DOILY", "DOITS", "DOJOS", "DOLCE", "DOLCI", "DOLED", "DOLES", "DOLIA", "DOLLS", "DOLMA", "DOLOR", "DOLOS", + "DOLTS", "DOMAL", "DOMED", "DOMES", "DOMIC", "DONAH", "DONAS", "DONEE", "DONER", "DONGA", "DONGS", "DONKO", + "DONNA", "DONNE", "DONNY", "DONSY", "DOOBS", "DOOCE", "DOODY", "DOOKS", "DOOLE", "DOOLS", "DOOLY", "DOOMS", + "DOOMY", "DOONA", "DOORN", "DOORS", "DOOZY", "DOPAS", "DOPED", "DOPER", "DOPES", "DORAD", "DORBA", "DORBS", + "DOREE", "DORES", "DORIC", "DORIS", "DORKS", "DORKY", "DORMS", "DORMY", "DORPS", "DORRS", "DORSA", "DORSE", + "DORTS", "DORTY", "DOSAI", "DOSAS", "DOSED", "DOSEH", "DOSER", "DOSES", "DOSHA", "DOTAL", "DOTED", "DOTER", + "DOTES", "DOTTY", "DOUAR", "DOUCE", "DOUCS", "DOUKS", "DOULA", "DOUMA", "DOUMS", "DOUPS", "DOURA", "DOUSE", + "DOUTS", "DOVED", "DOVEN", "DOVER", "DOVES", "DOVIE", "DOWAR", "DOWDS", "DOWED", "DOWER", "DOWIE", "DOWLE", + "DOWLS", "DOWLY", "DOWNA", "DOWNS", "DOWPS", "DOWSE", "DOWTS", "DOXED", "DOXES", "DOXIE", "DOYEN", "DOYLY", + "DOZED", "DOZER", "DOZES", "DRABS", "DRACK", "DRACO", "DRAFF", "DRAGS", "DRAIL", "DRAMS", "DRANT", "DRAPS", + "DRATS", "DRAVE", "DRAWS", "DRAYS", "DREAR", "DRECK", "DREED", "DREER", "DREES", "DREGS", "DREKS", "DRENT", + "DRERE", "DREST", "DREYS", "DRIBS", "DRICE", "DRIES", "DRILY", "DRIPS", "DRIPT", "DROID", "DROIL", "DROKE", + "DROLE", "DROME", "DRONY", "DROOB", "DROOG", "DROOK", "DROPS", "DROPT", "DROUK", "DROWS", "DRUBS", "DRUGS", + "DRUMS", "DRUPE", "DRUSE", "DRUSY", "DRUXY", "DRYAD", "DRYAS", "DSOBO", "DSOMO", "DUADS", "DUALS", "DUANS", + "DUARS", "DUBBO", "DUCAL", "DUCAT", "DUCES", "DUCKS", "DUCKY", "DUCTS", "DUDDY", "DUDED", "DUDES", "DUELS", + "DUETS", "DUETT", "DUFFS", "DUFUS", "DUING", "DUITS", "DUKAS", "DUKED", "DUKES", "DUKKA", "DULCE", "DULES", + "DULIA", "DULLS", "DULSE", "DUMAS", "DUMBO", "DUMBS", "DUMKA", "DUMKY", "DUMPS", "DUNAM", "DUNCH", "DUNES", + "DUNGS", "DUNGY", "DUNKS", "DUNNO", "DUNNY", "DUNSH", "DUNTS", "DUOMI", "DUOMO", "DUPED", "DUPER", "DUPES", + "DUPLE", "DUPLY", "DUPPY", "DURAL", "DURAS", "DURED", "DURES", "DURGY", "DURNS", "DUROC", "DUROS", "DUROY", + "DURRA", "DURRS", "DURRY", "DURST", "DURUM", "DURZI", "DUSKS", "DUSTS", "DUXES", "DWAAL", "DWALE", "DWALM", + "DWAMS", "DWANG", "DWAUM", "DWEEB", "DWILE", "DWINE", "DYADS", "DYERS", "DYKED", "DYKES", "DYKEY", "DYKON", + "DYNEL", "DYNES", "DZHOS", "EAGRE", "EALED", "EALES", "EANED", "EARDS", "EARED", "EARLS", "EARNS", "EARNT", + "EARST", "EASED", "EASER", "EASES", "EASLE", "EASTS", "EATHE", "EAVED", "EAVES", "EBBED", "EBBET", "EBONS", + "EBOOK", "ECADS", "ECHED", "ECHES", "ECHOS", "ECRUS", "EDEMA", "EDGED", "EDGER", "EDGES", "EDILE", "EDITS", + "EDUCE", "EDUCT", "EEJIT", "EENSY", "EEVEN", "EEVNS", "EFFED", "EGADS", "EGERS", "EGEST", "EGGAR", "EGGED", + "EGGER", "EGMAS", "EHING", "EIDER", "EIDOS", "EIGNE", "EIKED", "EIKON", "EILDS", "EISEL", "EJIDO", "EKKAS", + "ELAIN", "ELAND", "ELANS", "ELCHI", "ELDIN", "ELEMI", "ELFED", "ELIAD", "ELINT", "ELMEN", "ELOGE", "ELOGY", + "ELOIN", "ELOPS", "ELPEE", "ELSIN", "ELUTE", "ELVAN", "ELVEN", "ELVER", "ELVES", "EMACS", "EMBAR", "EMBAY", + "EMBOG", "EMBOW", "EMBOX", "EMBUS", "EMEER", "EMEND", "EMERG", "EMERY", "EMEUS", "EMICS", "EMIRS", "EMITS", + "EMMAS", "EMMER", "EMMET", "EMMEW", "EMMYS", "EMOJI", "EMONG", "EMOTE", "EMOVE", "EMPTS", "EMULE", "EMURE", + "EMYDE", "EMYDS", "ENARM", "ENATE", "ENDED", "ENDER", "ENDEW", "ENDUE", "ENEWS", "ENFIX", "ENIAC", "ENLIT", + "ENMEW", "ENNOG", "ENOKI", "ENOLS", "ENORM", "ENOWS", "ENROL", "ENSEW", "ENSKY", "ENTIA", "ENURE", "ENURN", + "ENVOI", "ENZYM", "EORLS", "EOSIN", "EPACT", "EPEES", "EPHAH", "EPHAS", "EPHOD", "EPHOR", "EPICS", "EPODE", + "EPOPT", "EPRIS", "EQUES", "EQUID", "ERBIA", "EREVS", "ERGON", "ERGOS", "ERGOT", "ERHUS", "ERICA", "ERICK", + "ERICS", "ERING", "ERNED", "ERNES", "EROSE", "ERRED", "ERSES", "ERUCT", "ERUGO", "ERUVS", "ERVEN", "ERVIL", + "ESCAR", "ESCOT", "ESILE", "ESKAR", "ESKER", "ESNES", "ESSES", "ESTOC", "ESTOP", "ESTRO", "ETAGE", "ETAPE", + "ETATS", "ETENS", "ETHAL", "ETHNE", "ETHYL", "ETICS", "ETNAS", "ETTIN", "ETTLE", "ETUIS", "ETWEE", "ETYMA", + "EUGHS", "EUKED", "EUPAD", "EUROS", "EUSOL", "EVENS", "EVERT", "EVETS", "EVHOE", "EVILS", "EVITE", "EVOHE", + "EWERS", "EWEST", "EWHOW", "EWKED", "EXAMS", "EXEAT", "EXECS", "EXEEM", "EXEME", "EXFIL", "EXIES", "EXINE", + "EXING", "EXITS", "EXODE", "EXOME", "EXONS", "EXPAT", "EXPOS", "EXUDE", "EXULS", "EXURB", "EYASS", "EYERS", + "EYOTS", "EYRAS", "EYRES", "EYRIE", "EYRIR", "EZINE", "FABBY", "FACED", "FACER", "FACES", "FACIA", "FACTA", + "FACTS", "FADDY", "FADED", "FADER", "FADES", "FADGE", "FADOS", "FAENA", "FAERY", "FAFFS", "FAFFY", "FAGGY", + "FAGIN", "FAGOT", "FAIKS", "FAILS", "FAINE", "FAINS", "FAIRS", "FAKED", "FAKER", "FAKES", "FAKEY", "FAKIE", + "FAKIR", "FALAJ", "FALLS", "FAMED", "FAMES", "FANAL", "FANDS", "FANES", "FANGA", "FANGO", "FANGS", "FANKS", + "FANON", "FANOS", "FANUM", "FAQIR", "FARAD", "FARCI", "FARCY", "FARDS", "FARED", "FARER", "FARES", "FARLE", + "FARLS", "FARMS", "FAROS", "FARRO", "FARSE", "FARTS", "FASCI", "FASTI", "FASTS", "FATED", "FATES", "FATLY", + "FATSO", "FATWA", "FAUGH", "FAULD", "FAUNS", "FAURD", "FAUTS", "FAUVE", "FAVAS", "FAVEL", "FAVER", "FAVES", + "FAVUS", "FAWNS", "FAWNY", "FAXED", "FAXES", "FAYED", "FAYER", "FAYNE", "FAYRE", "FAZED", "FAZES", "FEALS", + "FEARE", "FEARS", "FEART", "FEASE", "FEATS", "FEAZE", "FECES", "FECHT", "FECIT", "FECKS", "FEDEX", "FEEBS", + "FEEDS", "FEELS", "FEENS", "FEERS", "FEESE", "FEEZE", "FEHME", "FEINT", "FEIST", "FELCH", "FELID", "FELLS", + "FELLY", "FELTS", "FELTY", "FEMAL", "FEMES", "FEMMY", "FENDS", "FENDY", "FENIS", "FENKS", "FENNY", "FENTS", + "FEODS", "FEOFF", "FERER", "FERES", "FERIA", "FERLY", "FERMI", "FERMS", "FERNS", "FERNY", "FESSE", "FESTA", + "FESTS", "FESTY", "FETAS", "FETED", "FETES", "FETOR", "FETTA", "FETTS", "FETWA", "FEUAR", "FEUDS", "FEUED", + "FEYED", "FEYER", "FEYLY", "FEZES", "FEZZY", "FIARS", "FIATS", "FIBRE", "FIBRO", "FICES", "FICHE", "FICHU", + "FICIN", "FICOS", "FIDES", "FIDGE", "FIDOS", "FIEFS", "FIENT", "FIERE", "FIERS", "FIEST", "FIFED", "FIFER", + "FIFES", "FIFIS", "FIGGY", "FIGOS", "FIKED", "FIKES", "FILAR", "FILCH", "FILED", "FILES", "FILII", "FILKS", + "FILLE", "FILLO", "FILLS", "FILMI", "FILMS", "FILOS", "FILUM", "FINCA", "FINDS", "FINED", "FINES", "FINIS", + "FINKS", "FINNY", "FINOS", "FIORD", "FIQHS", "FIQUE", "FIRED", "FIRER", "FIRES", "FIRIE", "FIRKS", "FIRMS", + "FIRNS", "FIRRY", "FIRTH", "FISCS", "FISKS", "FISTS", "FISTY", "FITCH", "FITLY", "FITNA", "FITTE", "FITTS", + "FIVER", "FIVES", "FIXED", "FIXES", "FIXIT", "FJELD", "FLABS", "FLAFF", "FLAGS", "FLAKS", "FLAMM", "FLAMS", + "FLAMY", "FLANE", "FLANS", "FLAPS", "FLARY", "FLATS", "FLAVA", "FLAWN", "FLAWS", "FLAWY", "FLAXY", "FLAYS", + "FLEAM", "FLEAS", "FLEEK", "FLEER", "FLEES", "FLEGS", "FLEME", "FLEUR", "FLEWS", "FLEXI", "FLEXO", "FLEYS", + "FLICS", "FLIED", "FLIES", "FLIMP", "FLIMS", "FLIPS", "FLIRS", "FLISK", "FLITE", "FLITS", "FLITT", "FLOBS", + "FLOCS", "FLOES", "FLOGS", "FLONG", "FLOPS", "FLORS", "FLORY", "FLOSH", "FLOTA", "FLOTE", "FLOWS", "FLUBS", + "FLUED", "FLUES", "FLUEY", "FLUKY", "FLUMP", "FLUOR", "FLURR", "FLUTY", "FLUYT", "FLYBY", "FLYPE", "FLYTE", + "FOALS", "FOAMS", "FOEHN", "FOGEY", "FOGIE", "FOGLE", "FOGOU", "FOHNS", "FOIDS", "FOILS", "FOINS", "FOLDS", + "FOLEY", "FOLIA", "FOLIC", "FOLIE", "FOLKS", "FOLKY", "FOMES", "FONDA", "FONDS", "FONDU", "FONES", "FONLY", + "FONTS", "FOODS", "FOODY", "FOOLS", "FOOTS", "FOOTY", "FORAM", "FORBS", "FORBY", "FORDO", "FORDS", "FOREL", + "FORES", "FOREX", "FORKS", "FORKY", "FORME", "FORMS", "FORTS", "FORZA", "FORZE", "FOSSA", "FOSSE", "FOUAT", + "FOUDS", "FOUER", "FOUET", "FOULE", "FOULS", "FOUNT", "FOURS", "FOUTH", "FOVEA", "FOWLS", "FOWTH", "FOXED", + "FOXES", "FOXIE", "FOYLE", "FOYNE", "FRABS", "FRACK", "FRACT", "FRAGS", "FRAIM", "FRANC", "FRAPE", "FRAPS", + "FRASS", "FRATE", "FRATI", "FRATS", "FRAUS", "FRAYS", "FREES", "FREET", "FREIT", "FREMD", "FRENA", "FREON", + "FRERE", "FRETS", "FRIBS", "FRIER", "FRIES", "FRIGS", "FRISE", "FRIST", "FRITH", "FRITS", "FRITT", "FRIZE", + "FRIZZ", "FROES", "FROGS", "FRONS", "FRORE", "FRORN", "FRORY", "FROSH", "FROWS", "FROWY", "FRUGS", "FRUMP", + "FRUSH", "FRUST", "FRYER", "FUBAR", "FUBBY", "FUBSY", "FUCKS", "FUCUS", "FUDDY", "FUDGY", "FUELS", "FUERO", + "FUFFS", "FUFFY", "FUGAL", "FUGGY", "FUGIE", "FUGIO", "FUGLE", "FUGLY", "FUGUS", "FUJIS", "FULLS", "FUMED", + "FUMER", "FUMES", "FUMET", "FUNDI", "FUNDS", "FUNDY", "FUNGO", "FUNGS", "FUNKS", "FURAL", "FURAN", "FURCA", + "FURLS", "FUROL", "FURRS", "FURTH", "FURZE", "FURZY", "FUSED", "FUSEE", "FUSEL", "FUSES", "FUSIL", "FUSKS", + "FUSTS", "FUSTY", "FUTON", "FUZED", "FUZEE", "FUZES", "FUZIL", "FYCES", "FYKED", "FYKES", "FYLES", "FYRDS", + "FYTTE", "GABBA", "GABBY", "GABLE", "GADDI", "GADES", "GADGE", "GADID", "GADIS", "GADJE", "GADJO", "GADSO", + "GAFFS", "GAGED", "GAGER", "GAGES", "GAIDS", "GAINS", "GAIRS", "GAITA", "GAITS", "GAITT", "GAJOS", "GALAH", + "GALAS", "GALAX", "GALEA", "GALED", "GALES", "GALLS", "GALLY", "GALOP", "GALUT", "GALVO", "GAMAS", "GAMAY", + "GAMBA", "GAMBE", "GAMBO", "GAMBS", "GAMED", "GAMES", "GAMEY", "GAMIC", "GAMIN", "GAMME", "GAMMY", "GAMPS", + "GANCH", "GANDY", "GANEF", "GANEV", "GANGS", "GANJA", "GANOF", "GANTS", "GAOLS", "GAPED", "GAPER", "GAPES", + "GAPOS", "GAPPY", "GARBE", "GARBO", "GARBS", "GARDA", "GARES", "GARIS", "GARMS", "GARNI", "GARRE", "GARTH", + "GARUM", "GASES", "GASPS", "GASPY", "GASTS", "GATCH", "GATED", "GATER", "GATES", "GATHS", "GATOR", "GAUCH", + "GAUCY", "GAUDS", "GAUJE", "GAULT", "GAUMS", "GAUMY", "GAUPS", "GAURS", "GAUSS", "GAUZY", "GAVOT", "GAWCY", + "GAWDS", "GAWKS", "GAWPS", "GAWSY", "GAYAL", "GAZAL", "GAZAR", "GAZED", "GAZES", "GAZON", "GAZOO", "GEALS", + "GEANS", "GEARE", "GEARS", "GEATS", "GEBUR", "GECKS", "GEEKS", "GEEPS", "GEEST", "GEIST", "GEITS", "GELDS", + "GELEE", "GELID", "GELLY", "GELTS", "GEMEL", "GEMMA", "GEMMY", "GEMOT", "GENAL", "GENAS", "GENES", "GENET", + "GENIC", "GENII", "GENIP", "GENNY", "GENOA", "GENOM", "GENRO", "GENTS", "GENTY", "GENUA", "GENUS", "GEODE", + "GEOID", "GERAH", "GERBE", "GERES", "GERLE", "GERMS", "GERMY", "GERNE", "GESSE", "GESSO", "GESTE", "GESTS", + "GETAS", "GETUP", "GEUMS", "GEYAN", "GEYER", "GHAST", "GHATS", "GHAUT", "GHAZI", "GHEES", "GHEST", "GHYLL", + "GIBED", "GIBEL", "GIBER", "GIBES", "GIBLI", "GIBUS", "GIFTS", "GIGAS", "GIGHE", "GIGOT", "GIGUE", "GILAS", + "GILDS", "GILET", "GILLS", "GILLY", "GILPY", "GILTS", "GIMEL", "GIMME", "GIMPS", "GIMPY", "GINCH", "GINGE", + "GINGS", "GINKS", "GINNY", "GINZO", "GIPON", "GIPPO", "GIPPY", "GIRDS", "GIRLS", "GIRNS", "GIRON", "GIROS", + "GIRRS", "GIRSH", "GIRTS", "GISMO", "GISMS", "GISTS", "GITCH", "GITES", "GIUST", "GIVED", "GIVES", "GIZMO", + "GLACE", "GLADS", "GLADY", "GLAIK", "GLAIR", "GLAMS", "GLANS", "GLARY", "GLAUM", "GLAUR", "GLAZY", "GLEBA", + "GLEBE", "GLEBY", "GLEDE", "GLEDS", "GLEED", "GLEEK", "GLEES", "GLEET", "GLEIS", "GLENS", "GLENT", "GLEYS", + "GLIAL", "GLIAS", "GLIBS", "GLIFF", "GLIFT", "GLIKE", "GLIME", "GLIMS", "GLISK", "GLITS", "GLITZ", "GLOAM", + "GLOBI", "GLOBS", "GLOBY", "GLODE", "GLOGG", "GLOMS", "GLOOP", "GLOPS", "GLOST", "GLOUT", "GLOWS", "GLOZE", + "GLUED", "GLUER", "GLUES", "GLUEY", "GLUGS", "GLUME", "GLUMS", "GLUON", "GLUTE", "GLUTS", "GNARL", "GNARR", + "GNARS", "GNATS", "GNAWN", "GNAWS", "GNOWS", "GOADS", "GOAFS", "GOALS", "GOARY", "GOATS", "GOATY", "GOBAN", + "GOBAR", "GOBBI", "GOBBO", "GOBBY", "GOBIS", "GOBOS", "GODET", "GODSO", "GOELS", "GOERS", "GOEST", "GOETH", + "GOETY", "GOFER", "GOFFS", "GOGGA", "GOGOS", "GOIER", "GOJIS", "GOLDS", "GOLDY", "GOLES", "GOLFS", "GOLPE", + "GOLPS", "GOMBO", "GOMER", "GOMPA", "GONCH", "GONEF", "GONGS", "GONIA", "GONIF", "GONKS", "GONNA", "GONOF", + "GONYS", "GONZO", "GOOBY", "GOODS", "GOOFS", "GOOGS", "GOOKS", "GOOKY", "GOOLD", "GOOLS", "GOOLY", "GOONS", + "GOONY", "GOOPS", "GOOPY", "GOORS", "GOORY", "GOOSY", "GOPAK", "GOPIK", "GORAL", "GORAS", "GORED", "GORES", + "GORIS", "GORMS", "GORMY", "GORPS", "GORSE", "GORSY", "GOSHT", "GOSSE", "GOTCH", "GOTHS", "GOTHY", "GOTTA", + "GOUCH", "GOUKS", "GOURA", "GOUTS", "GOUTY", "GOWAN", "GOWDS", "GOWFS", "GOWKS", "GOWLS", "GOWNS", "GOXES", + "GOYIM", "GOYLE", "GRAAL", "GRABS", "GRADS", "GRAFF", "GRAIP", "GRAMA", "GRAME", "GRAMP", "GRAMS", "GRANA", + "GRANS", "GRAPY", "GRAVS", "GRAYS", "GREBE", "GREBO", "GRECE", "GREEK", "GREES", "GREGE", "GREGO", "GREIN", + "GRENS", "GRESE", "GREVE", "GREWS", "GREYS", "GRICE", "GRIDE", "GRIDS", "GRIFF", "GRIFT", "GRIGS", "GRIKE", + "GRINS", "GRIOT", "GRIPS", "GRIPT", "GRIPY", "GRISE", "GRIST", "GRISY", "GRITH", "GRITS", "GRIZE", "GROAT", + "GRODY", "GROGS", "GROKS", "GROMA", "GRONE", "GROOF", "GROSZ", "GROTS", "GROUF", "GROVY", "GROWS", "GRRLS", + "GRRRL", "GRUBS", "GRUED", "GRUES", "GRUFE", "GRUME", "GRUMP", "GRUND", "GRYCE", "GRYDE", "GRYKE", "GRYPE", + "GRYPT", "GUACO", "GUANA", "GUANO", "GUANS", "GUARS", "GUCKS", "GUCKY", "GUDES", "GUFFS", "GUGAS", "GUIDS", + "GUIMP", "GUIRO", "GULAG", "GULAR", "GULAS", "GULES", "GULET", "GULFS", "GULFY", "GULLS", "GULPH", "GULPS", + "GULPY", "GUMMA", "GUMMI", "GUMPS", "GUNDY", "GUNGE", "GUNGY", "GUNKS", "GUNKY", "GUNNY", "GUQIN", "GURDY", + "GURGE", "GURLS", "GURLY", "GURNS", "GURRY", "GURSH", "GURUS", "GUSHY", "GUSLA", "GUSLE", "GUSLI", "GUSSY", + "GUSTS", "GUTSY", "GUTTA", "GUTTY", "GUYED", "GUYLE", "GUYOT", "GUYSE", "GWINE", "GYALS", "GYANS", "GYBED", + "GYBES", "GYELD", "GYMPS", "GYNAE", "GYNIE", "GYNNY", "GYNOS", "GYOZA", "GYPOS", "GYPPO", "GYPPY", "GYRAL", + "GYRED", "GYRES", "GYRON", "GYROS", "GYRUS", "GYTES", "GYVED", "GYVES", "HAAFS", "HAARS", "HABLE", "HABUS", + "HACEK", "HACKS", "HADAL", "HADED", "HADES", "HADJI", "HADST", "HAEMS", "HAETS", "HAFFS", "HAFIZ", "HAFTS", + "HAGGS", "HAHAS", "HAICK", "HAIKA", "HAIKS", "HAIKU", "HAILS", "HAILY", "HAINS", "HAINT", "HAIRS", "HAITH", + "HAJES", "HAJIS", "HAJJI", "HAKAM", "HAKAS", "HAKEA", "HAKES", "HAKIM", "HAKUS", "HALAL", "HALED", "HALER", + "HALES", "HALFA", "HALFS", "HALID", "HALLO", "HALLS", "HALMA", "HALMS", "HALON", "HALOS", "HALSE", "HALTS", + "HALVA", "HALWA", "HAMAL", "HAMBA", "HAMED", "HAMES", "HAMMY", "HAMZA", "HANAP", "HANCE", "HANCH", "HANDS", + "HANGI", "HANGS", "HANKS", "HANKY", "HANSA", "HANSE", "HANTS", "HAOLE", "HAOMA", "HAPAX", "HAPLY", "HAPPI", + "HAPUS", "HARAM", "HARDS", "HARED", "HARES", "HARIM", "HARKS", "HARLS", "HARMS", "HARNS", "HAROS", "HARPS", + "HARTS", "HASHY", "HASKS", "HASPS", "HASTA", "HATED", "HATES", "HATHA", "HAUDS", "HAUFS", "HAUGH", "HAULD", + "HAULM", "HAULS", "HAULT", "HAUNS", "HAUSE", "HAVER", "HAVES", "HAWED", "HAWKS", "HAWMS", "HAWSE", "HAYED", + "HAYER", "HAYEY", "HAYLE", "HAZAN", "HAZED", "HAZER", "HAZES", "HEADS", "HEALD", "HEALS", "HEAME", "HEAPS", + "HEAPY", "HEARE", "HEARS", "HEAST", "HEATS", "HEBEN", "HEBES", "HECHT", "HECKS", "HEDER", "HEDGY", "HEEDS", + "HEEDY", "HEELS", "HEEZE", "HEFTE", "HEFTS", "HEIDS", "HEIGH", "HEILS", "HEIRS", "HEJAB", "HEJRA", "HELED", + "HELES", "HELIO", "HELLS", "HELMS", "HELOS", "HELOT", "HELPS", "HELVE", "HEMAL", "HEMES", "HEMIC", "HEMIN", + "HEMPS", "HEMPY", "HENCH", "HENDS", "HENGE", "HENNA", "HENNY", "HENRY", "HENTS", "HEPAR", "HERBS", "HERBY", + "HERDS", "HERES", "HERLS", "HERMA", "HERMS", "HERNS", "HEROS", "HERRY", "HERSE", "HERTZ", "HERYE", "HESPS", + "HESTS", "HETES", "HETHS", "HEUCH", "HEUGH", "HEVEA", "HEWED", "HEWER", "HEWGH", "HEXAD", "HEXED", "HEXER", + "HEXES", "HEXYL", "HEYED", "HIANT", "HICKS", "HIDED", "HIDER", "HIDES", "HIEMS", "HIGHS", "HIGHT", "HIJAB", + "HIJRA", "HIKED", "HIKER", "HIKES", "HIKOI", "HILAR", "HILCH", "HILLO", "HILLS", "HILTS", "HILUM", "HILUS", + "HIMBO", "HINAU", "HINDS", "HINGS", "HINKY", "HINNY", "HINTS", "HIOIS", "HIPLY", "HIRED", "HIREE", "HIRER", + "HIRES", "HISSY", "HISTS", "HITHE", "HIVED", "HIVER", "HIVES", "HIZEN", "HOAED", "HOAGY", "HOARS", "HOARY", + "HOAST", "HOBOS", "HOCKS", "HOCUS", "HODAD", "HODJA", "HOERS", "HOGAN", "HOGEN", "HOGGS", "HOGHS", "HOHED", + "HOICK", "HOIED", "HOIKS", "HOING", "HOISE", "HOKAS", "HOKED", "HOKES", "HOKEY", "HOKIS", "HOKKU", "HOKUM", + "HOLDS", "HOLED", "HOLES", "HOLEY", "HOLKS", "HOLLA", "HOLLO", "HOLME", "HOLMS", "HOLON", "HOLOS", "HOLTS", + "HOMAS", "HOMED", "HOMES", "HOMEY", "HOMIE", "HOMME", "HOMOS", "HONAN", "HONDA", "HONDS", "HONED", "HONER", + "HONES", "HONGI", "HONGS", "HONKS", "HONKY", "HOOCH", "HOODS", "HOODY", "HOOEY", "HOOFS", "HOOKA", "HOOKS", + "HOOKY", "HOOLY", "HOONS", "HOOPS", "HOORD", "HOORS", "HOOSH", "HOOTS", "HOOTY", "HOOVE", "HOPAK", "HOPED", + "HOPER", "HOPES", "HOPPY", "HORAH", "HORAL", "HORAS", "HORIS", "HORKS", "HORME", "HORNS", "HORST", "HORSY", + "HOSED", "HOSEL", "HOSEN", "HOSER", "HOSES", "HOSEY", "HOSTA", "HOSTS", "HOTCH", "HOTEN", "HOTTY", "HOUFF", + "HOUFS", "HOUGH", "HOURI", "HOURS", "HOUTS", "HOVEA", "HOVED", "HOVEN", "HOVES", "HOWBE", "HOWES", "HOWFF", + "HOWFS", "HOWKS", "HOWLS", "HOWRE", "HOWSO", "HOXED", "HOXES", "HOYAS", "HOYED", "HOYLE", "HUBBY", "HUCKS", + "HUDNA", "HUDUD", "HUERS", "HUFFS", "HUFFY", "HUGER", "HUGGY", "HUHUS", "HUIAS", "HULAS", "HULES", "HULKS", + "HULKY", "HULLO", "HULLS", "HULLY", "HUMAS", "HUMFS", "HUMIC", "HUMPS", "HUMPY", "HUNKS", "HUNTS", "HURDS", + "HURLS", "HURLY", "HURRA", "HURST", "HURTS", "HUSHY", "HUSKS", "HUSOS", "HUTIA", "HUZZA", "HUZZY", "HWYLS", + "HYDRA", "HYENS", "HYGGE", "HYING", "HYKES", "HYLAS", "HYLEG", "HYLES", "HYLIC", "HYMNS", "HYNDE", "HYOID", + "HYPED", "HYPES", "HYPHA", "HYPHY", "HYPOS", "HYRAX", "HYSON", "HYTHE", "IAMBI", "IAMBS", "IBRIK", "ICERS", + "ICHED", "ICHES", "ICHOR", "ICIER", "ICKER", "ICKLE", "ICONS", "ICTAL", "ICTIC", "ICTUS", "IDANT", "IDEAS", + "IDEES", "IDENT", "IDLED", "IDLES", "IDOLA", "IDOLS", "IDYLS", "IFTAR", "IGAPO", "IGGED", "IGLUS", "IHRAM", + "IKANS", "IKATS", "IKONS", "ILEAC", "ILEAL", "ILEUM", "ILEUS", "ILIAD", "ILIAL", "ILIUM", "ILLER", "ILLTH", + "IMAGO", "IMAMS", "IMARI", "IMAUM", "IMBAR", "IMBED", "IMIDE", "IMIDO", "IMIDS", "IMINE", "IMINO", "IMMEW", + "IMMIT", "IMMIX", "IMPED", "IMPIS", "IMPOT", "IMPRO", "IMSHI", "IMSHY", "INAPT", "INARM", "INBYE", "INCEL", + "INCLE", "INCOG", "INCUS", "INCUT", "INDEW", "INDIA", "INDIE", "INDOL", "INDOW", "INDRI", "INDUE", "INERM", + "INFIX", "INFOS", "INFRA", "INGAN", "INGLE", "INION", "INKED", "INKER", "INKLE", "INNED", "INNIT", "INORB", + "INRUN", "INSET", "INSPO", "INTEL", "INTIL", "INTIS", "INTRA", "INULA", "INURE", "INURN", "INUST", "INVAR", + "INWIT", "IODIC", "IODID", "IODIN", "IOTAS", "IPPON", "IRADE", "IRIDS", "IRING", "IRKED", "IROKO", "IRONE", + "IRONS", "ISBAS", "ISHES", "ISLED", "ISLES", "ISNAE", "ISSEI", "ISTLE", "ITEMS", "ITHER", "IVIED", "IVIES", + "IXIAS", "IXNAY", "IXORA", "IXTLE", "IZARD", "IZARS", "IZZAT", "JAAPS", "JABOT", "JACAL", "JACKS", "JACKY", + "JADED", "JADES", "JAFAS", "JAFFA", "JAGAS", "JAGER", "JAGGS", "JAGGY", "JAGIR", "JAGRA", "JAILS", "JAKER", + "JAKES", "JAKEY", "JALAP", "JALOP", "JAMBE", "JAMBO", "JAMBS", "JAMBU", "JAMES", "JAMMY", "JAMON", "JANES", + "JANNS", "JANNY", "JANTY", "JAPAN", "JAPED", "JAPER", "JAPES", "JARKS", "JARLS", "JARPS", "JARTA", "JARUL", + "JASEY", "JASPE", "JASPS", "JATOS", "JAUKS", "JAUPS", "JAVAS", "JAVEL", "JAWAN", "JAWED", "JAXIE", "JEANS", + "JEATS", "JEBEL", "JEDIS", "JEELS", "JEELY", "JEEPS", "JEERS", "JEEZE", "JEFES", "JEFFS", "JEHAD", "JEHUS", + "JELAB", "JELLO", "JELLS", "JEMBE", "JEMMY", "JENNY", "JEONS", "JERID", "JERKS", "JERRY", "JESSE", "JESTS", + "JESUS", "JETES", "JETON", "JEUNE", "JEWED", "JEWIE", "JHALA", "JIAOS", "JIBBA", "JIBBS", "JIBED", "JIBER", + "JIBES", "JIFFS", "JIGGY", "JIGOT", "JIHAD", "JILLS", "JILTS", "JIMMY", "JIMPY", "JINGO", "JINKS", "JINNE", + "JINNI", "JINNS", "JIRDS", "JIRGA", "JIRRE", "JISMS", "JIVED", "JIVER", "JIVES", "JIVEY", "JNANA", "JOBED", + "JOBES", "JOCKO", "JOCKS", "JOCKY", "JOCOS", "JODEL", "JOEYS", "JOHNS", "JOINS", "JOKED", "JOKES", "JOKEY", + "JOKOL", "JOLED", "JOLES", "JOLLS", "JOLTS", "JOLTY", "JOMON", "JOMOS", "JONES", "JONGS", "JONTY", "JOOKS", + "JORAM", "JORUM", "JOTAS", "JOTTY", "JOTUN", "JOUAL", "JOUGS", "JOUKS", "JOULE", "JOURS", "JOWAR", "JOWED", + "JOWLS", "JOWLY", "JOYED", "JUBAS", "JUBES", "JUCOS", "JUDAS", "JUDGY", "JUDOS", "JUGAL", "JUGUM", "JUJUS", + "JUKED", "JUKES", "JUKUS", "JULEP", "JUMAR", "JUMBY", "JUMPS", "JUNCO", "JUNKS", "JUNKY", "JUPES", "JUPON", + "JURAL", "JURAT", "JUREL", "JURES", "JUSTS", "JUTES", "JUTTY", "JUVES", "JUVIE", "KAAMA", "KABAB", "KABAR", + "KABOB", "KACHA", "KACKS", "KADAI", "KADES", "KADIS", "KAFIR", "KAGOS", "KAGUS", "KAHAL", "KAIAK", "KAIDS", + "KAIES", "KAIFS", "KAIKA", "KAIKS", "KAILS", "KAIMS", "KAING", "KAINS", "KAKAS", "KAKIS", "KALAM", "KALES", + "KALIF", "KALIS", "KALPA", "KAMAS", "KAMES", "KAMIK", "KAMIS", "KAMME", "KANAE", "KANAS", "KANDY", "KANEH", + "KANES", "KANGA", "KANGS", "KANJI", "KANTS", "KANZU", "KAONS", "KAPAS", "KAPHS", "KAPOK", "KAPOW", "KAPUS", + "KAPUT", "KARAS", "KARAT", "KARKS", "KARNS", "KAROO", "KAROS", "KARRI", "KARST", "KARSY", "KARTS", "KARZY", + "KASHA", "KASME", "KATAL", "KATAS", "KATIS", "KATTI", "KAUGH", "KAURI", "KAURU", "KAURY", "KAVAL", "KAVAS", + "KAWAS", "KAWAU", "KAWED", "KAYLE", "KAYOS", "KAZIS", "KAZOO", "KBARS", "KEBAR", "KEBOB", "KECKS", "KEDGE", + "KEDGY", "KEECH", "KEEFS", "KEEKS", "KEELS", "KEEMA", "KEENO", "KEENS", "KEEPS", "KEETS", "KEEVE", "KEFIR", + "KEHUA", "KEIRS", "KELEP", "KELIM", "KELLS", "KELLY", "KELPS", "KELPY", "KELTS", "KELTY", "KEMBO", "KEMBS", + "KEMPS", "KEMPT", "KEMPY", "KENAF", "KENCH", "KENDO", "KENOS", "KENTE", "KENTS", "KEPIS", "KERBS", "KEREL", + "KERFS", "KERKY", "KERMA", "KERNE", "KERNS", "KEROS", "KERRY", "KERVE", "KESAR", "KESTS", "KETAS", "KETCH", + "KETES", "KETOL", "KEVEL", "KEVIL", "KEXES", "KEYED", "KEYER", "KHADI", "KHAFS", "KHANS", "KHAPH", "KHATS", + "KHAYA", "KHAZI", "KHEDA", "KHETH", "KHETS", "KHOJA", "KHORS", "KHOUM", "KHUDS", "KIAAT", "KIACK", "KIANG", + "KIBBE", "KIBBI", "KIBEI", "KIBES", "KIBLA", "KICKS", "KICKY", "KIDDO", "KIDDY", "KIDEL", "KIDGE", "KIEFS", + "KIERS", "KIEVE", "KIEVS", "KIGHT", "KIKES", "KIKOI", "KILEY", "KILIM", "KILLS", "KILNS", "KILOS", "KILPS", + "KILTS", "KILTY", "KIMBO", "KINAS", "KINDA", "KINDS", "KINDY", "KINES", "KINGS", "KININ", "KINKS", "KINOS", + "KIORE", "KIPES", "KIPPA", "KIPPS", "KIRBY", "KIRKS", "KIRNS", "KIRRI", "KISAN", "KISSY", "KISTS", "KITED", + "KITER", "KITES", "KITHE", "KITHS", "KITUL", "KIVAS", "KIWIS", "KLANG", "KLAPS", "KLETT", "KLICK", "KLIEG", + "KLIKS", "KLONG", "KLOOF", "KLUGE", "KLUTZ", "KNAGS", "KNAPS", "KNARL", "KNARS", "KNAUR", "KNAWE", "KNEES", + "KNELL", "KNISH", "KNITS", "KNIVE", "KNOBS", "KNOPS", "KNOSP", "KNOTS", "KNOUT", "KNOWE", "KNOWS", "KNUBS", + "KNURL", "KNURR", "KNURS", "KNUTS", "KOANS", "KOAPS", "KOBAN", "KOBOS", "KOELS", "KOFFS", "KOFTA", "KOGAL", + "KOHAS", "KOHEN", "KOHLS", "KOINE", "KOJIS", "KOKAM", "KOKAS", "KOKER", "KOKRA", "KOKUM", "KOLAS", "KOLOS", + "KOMBU", "KONBU", "KONDO", "KONKS", "KOOKS", "KOOKY", "KOORI", "KOPEK", "KOPHS", "KOPJE", "KOPPA", "KORAI", + "KORAN", "KORAS", "KORAT", "KORES", "KORMA", "KOROS", "KORUN", "KORUS", "KOSES", "KOTCH", "KOTOS", "KOTOW", + "KOURA", "KRAAL", "KRABS", "KRAFT", "KRAIS", "KRAIT", "KRANG", "KRANS", "KRANZ", "KRAUT", "KRAYS", "KREEP", + "KRENG", "KREWE", "KRONA", "KRONE", "KROON", "KRUBI", "KRUNK", "KSARS", "KUBIE", "KUDOS", "KUDUS", "KUDZU", + "KUFIS", "KUGEL", "KUIAS", "KUKRI", "KUKUS", "KULAK", "KULAN", "KULAS", "KULFI", "KUMIS", "KUMYS", "KURIS", + "KURRE", "KURTA", "KURUS", "KUSSO", "KUTAS", "KUTCH", "KUTIS", "KUTUS", "KUZUS", "KVASS", "KVELL", "KWELA", + "KYACK", "KYAKS", "KYANG", "KYARS", "KYATS", "KYBOS", "KYDST", "KYLES", "KYLIE", "KYLIN", "KYLIX", "KYLOE", + "KYNDE", "KYNDS", "KYPES", "KYRIE", "KYTES", "KYTHE", "LAARI", "LABDA", "LABIA", "LABIS", "LABRA", "LACED", + "LACER", "LACES", "LACET", "LACEY", "LACKS", "LADDY", "LADED", "LADER", "LADES", "LAERS", "LAEVO", "LAGAN", + "LAHAL", "LAHAR", "LAICH", "LAICS", "LAIDS", "LAIGH", "LAIKA", "LAIKS", "LAIRD", "LAIRS", "LAIRY", "LAITH", + "LAITY", "LAKED", "LAKER", "LAKES", "LAKHS", "LAKIN", "LAKSA", "LALDY", "LALLS", "LAMAS", "LAMBS", "LAMBY", + "LAMED", "LAMER", "LAMES", "LAMIA", "LAMMY", "LAMPS", "LANAI", "LANAS", "LANCH", "LANDE", "LANDS", "LANES", + "LANKS", "LANTS", "LAPIN", "LAPIS", "LAPJE", "LARCH", "LARDS", "LARDY", "LAREE", "LARES", "LARGO", "LARIS", + "LARKS", "LARKY", "LARNS", "LARNT", "LARUM", "LASED", "LASER", "LASES", "LASSI", "LASSU", "LASSY", "LASTS", + "LATAH", "LATED", "LATEN", "LATEX", "LATHI", "LATHS", "LATHY", "LATKE", "LATUS", "LAUAN", "LAUCH", "LAUDS", + "LAUFS", "LAUND", "LAURA", "LAVAL", "LAVAS", "LAVED", "LAVER", "LAVES", "LAVRA", "LAVVY", "LAWED", "LAWER", + "LAWIN", "LAWKS", "LAWNS", "LAWNY", "LAXED", "LAXER", "LAXES", "LAXLY", "LAYED", "LAYIN", "LAYUP", "LAZAR", + "LAZED", "LAZES", "LAZOS", "LAZZI", "LAZZO", "LEADS", "LEADY", "LEAFS", "LEAKS", "LEAMS", "LEANS", "LEANY", + "LEAPS", "LEARE", "LEARS", "LEARY", "LEATS", "LEAVY", "LEAZE", "LEBEN", "LECCY", "LEDES", "LEDGY", "LEDUM", + "LEEAR", "LEEKS", "LEEPS", "LEERS", "LEESE", "LEETS", "LEEZE", "LEFTE", "LEFTS", "LEGER", "LEGES", "LEGGE", + "LEGGO", "LEGIT", "LEHRS", "LEHUA", "LEIRS", "LEISH", "LEMAN", "LEMED", "LEMEL", "LEMES", "LEMMA", "LEMME", + "LENDS", "LENES", "LENGS", "LENIS", "LENOS", "LENSE", "LENTI", "LENTO", "LEONE", "LEPID", "LEPRA", "LEPTA", + "LERED", "LERES", "LERPS", "LESBO", "LESES", "LESTS", "LETCH", "LETHE", "LETUP", "LEUCH", "LEUCO", "LEUDS", + "LEUGH", "LEVAS", "LEVEE", "LEVES", "LEVIN", "LEVIS", "LEWIS", "LEXES", "LEXIS", "LEZES", "LEZZA", "LEZZY", + "LIANA", "LIANE", "LIANG", "LIARD", "LIARS", "LIART", "LIBER", "LIBRA", "LIBRI", "LICHI", "LICHT", "LICIT", + "LICKS", "LIDAR", "LIDOS", "LIEFS", "LIENS", "LIERS", "LIEUS", "LIEVE", "LIFER", "LIFES", "LIFTS", "LIGAN", + "LIGER", "LIGGE", "LIGNE", "LIKED", "LIKER", "LIKES", "LIKIN", "LILLS", "LILOS", "LILTS", "LIMAN", "LIMAS", + "LIMAX", "LIMBA", "LIMBI", "LIMBS", "LIMBY", "LIMED", "LIMEN", "LIMES", "LIMEY", "LIMMA", "LIMNS", "LIMOS", + "LIMPA", "LIMPS", "LINAC", "LINCH", "LINDS", "LINDY", "LINED", "LINES", "LINEY", "LINGA", "LINGS", "LINGY", + "LININ", "LINKS", "LINKY", "LINNS", "LINNY", "LINOS", "LINTS", "LINTY", "LINUM", "LINUX", "LIONS", "LIPAS", + "LIPES", "LIPIN", "LIPOS", "LIPPY", "LIRAS", "LIRKS", "LIROT", "LISKS", "LISLE", "LISPS", "LISTS", "LITAI", + "LITAS", "LITED", "LITER", "LITES", "LITHO", "LITHS", "LITRE", "LIVED", "LIVEN", "LIVES", "LIVOR", "LIVRE", + "LLANO", "LOACH", "LOADS", "LOAFS", "LOAMS", "LOANS", "LOAST", "LOAVE", "LOBAR", "LOBED", "LOBES", "LOBOS", + "LOBUS", "LOCHE", "LOCHS", "LOCIE", "LOCIS", "LOCKS", "LOCOS", "LOCUM", "LODEN", "LODES", "LOESS", "LOFTS", + "LOGAN", "LOGES", "LOGGY", "LOGIA", "LOGIE", "LOGOI", "LOGON", "LOGOS", "LOHAN", "LOIDS", "LOINS", "LOIPE", + "LOIRS", "LOKES", "LOLLS", "LOLLY", "LOLOG", "LOMAS", "LOMED", "LOMES", "LONER", "LONGA", "LONGE", "LONGS", + "LOOBY", "LOOED", "LOOEY", "LOOFA", "LOOFS", "LOOIE", "LOOKS", "LOOKY", "LOOMS", "LOONS", "LOONY", "LOOPS", + "LOORD", "LOOTS", "LOPED", "LOPER", "LOPES", "LOPPY", "LORAL", "LORAN", "LORDS", "LORDY", "LOREL", "LORES", + "LORIC", "LORIS", "LOSED", "LOSEL", "LOSEN", "LOSES", "LOSSY", "LOTAH", "LOTAS", "LOTES", "LOTIC", "LOTOS", + "LOTSA", "LOTTA", "LOTTE", "LOTTO", "LOTUS", "LOUED", "LOUGH", "LOUIE", "LOUIS", "LOUMA", "LOUND", "LOUNS", + "LOUPE", "LOUPS", "LOURE", "LOURS", "LOURY", "LOUTS", "LOVAT", "LOVED", "LOVES", "LOVEY", "LOVIE", "LOWAN", + "LOWED", "LOWES", "LOWND", "LOWNE", "LOWNS", "LOWPS", "LOWRY", "LOWSE", "LOWTS", "LOXED", "LOXES", "LOZEN", + "LUACH", "LUAUS", "LUBED", "LUBES", "LUBRA", "LUCES", "LUCKS", "LUCRE", "LUDES", "LUDIC", "LUDOS", "LUFFA", + "LUFFS", "LUGED", "LUGER", "LUGES", "LULLS", "LULUS", "LUMAS", "LUMBI", "LUMME", "LUMMY", "LUMPS", "LUNAS", + "LUNES", "LUNET", "LUNGI", "LUNGS", "LUNKS", "LUNTS", "LUPIN", "LURED", "LURER", "LURES", "LUREX", "LURGI", + "LURGY", "LURKS", "LURRY", "LURVE", "LUSER", "LUSHY", "LUSKS", "LUSTS", "LUSUS", "LUTEA", "LUTED", "LUTER", + "LUTES", "LUVVY", "LUXED", "LUXER", "LUXES", "LWEIS", "LYAMS", "LYARD", "LYART", "LYASE", "LYCEA", "LYCEE", + "LYCRA", "LYMES", "LYNCH", "LYNES", "LYRES", "LYSED", "LYSES", "LYSIN", "LYSIS", "LYSOL", "LYSSA", "LYTED", + "LYTES", "LYTHE", "LYTIC", "LYTTA", "MAAED", "MAARE", "MAARS", "MABES", "MACAS", "MACED", "MACER", "MACES", + "MACHE", "MACHI", "MACHS", "MACKS", "MACLE", "MACON", "MADGE", "MADID", "MADRE", "MAERL", "MAFIC", "MAGES", + "MAGGS", "MAGOT", "MAGUS", "MAHOE", "MAHUA", "MAHWA", "MAIDS", "MAIKO", "MAIKS", "MAILE", "MAILL", "MAILS", + "MAIMS", "MAINS", "MAIRE", "MAIRS", "MAISE", "MAIST", "MAKAR", "MAKES", "MAKIS", "MAKOS", "MALAM", "MALAR", + "MALAS", "MALAX", "MALES", "MALIC", "MALIK", "MALIS", "MALLS", "MALMS", "MALMY", "MALTS", "MALTY", "MALUS", + "MALVA", "MALWA", "MAMAS", "MAMBA", "MAMEE", "MAMEY", "MAMIE", "MANAS", "MANAT", "MANDI", "MANEB", "MANED", + "MANEH", "MANES", "MANET", "MANGS", "MANIS", "MANKY", "MANNA", "MANOS", "MANSE", "MANTA", "MANTO", "MANTY", + "MANUL", "MANUS", "MAPAU", "MAQUI", "MARAE", "MARAH", "MARAS", "MARCS", "MARDY", "MARES", "MARGE", "MARGS", + "MARIA", "MARID", "MARKA", "MARKS", "MARLE", "MARLS", "MARLY", "MARMS", "MARON", "MAROR", "MARRA", "MARRI", + "MARSE", "MARTS", "MARVY", "MASAS", "MASED", "MASER", "MASES", "MASHY", "MASKS", "MASSA", "MASSY", "MASTS", + "MASTY", "MASUS", "MATAI", "MATED", "MATER", "MATES", "MATHS", "MATIN", "MATLO", "MATTE", "MATTS", "MATZA", + "MATZO", "MAUBY", "MAUDS", "MAULS", "MAUND", "MAURI", "MAUSY", "MAUTS", "MAUZY", "MAVEN", "MAVIE", "MAVIN", + "MAVIS", "MAWED", "MAWKS", "MAWKY", "MAWNS", "MAWRS", "MAXED", "MAXES", "MAXIS", "MAYAN", "MAYAS", "MAYED", + "MAYOS", "MAYST", "MAZED", "MAZER", "MAZES", "MAZEY", "MAZUT", "MBIRA", "MEADS", "MEALS", "MEANE", "MEANS", + "MEANY", "MEARE", "MEASE", "MEATH", "MEATS", "MEBOS", "MECHS", "MECKS", "MEDII", "MEDLE", "MEEDS", "MEERS", + "MEETS", "MEFFS", "MEINS", "MEINT", "MEINY", "MEITH", "MEKKA", "MELAS", "MELBA", "MELDS", "MELIC", "MELIK", + "MELLS", "MELTS", "MELTY", "MEMES", "MEMOS", "MENAD", "MENDS", "MENED", "MENES", "MENGE", "MENGS", "MENSA", + "MENSE", "MENSH", "MENTA", "MENTO", "MENUS", "MEOUS", "MEOWS", "MERCH", "MERCS", "MERDE", "MERED", "MEREL", + "MERER", "MERES", "MERIL", "MERIS", "MERKS", "MERLE", "MERLS", "MERSE", "MESAL", "MESAS", "MESEL", "MESES", + "MESHY", "MESIC", "MESNE", "MESON", "MESSY", "MESTO", "METED", "METES", "METHO", "METHS", "METIC", "METIF", + "METIS", "METOL", "METRE", "MEUSE", "MEVED", "MEVES", "MEWED", "MEWLS", "MEYNT", "MEZES", "MEZZE", "MEZZO", + "MHORR", "MIAOU", "MIAOW", "MIASM", "MIAUL", "MICAS", "MICHE", "MICHT", "MICKS", "MICKY", "MICOS", "MICRA", + "MIDDY", "MIDGY", "MIDIS", "MIENS", "MIEVE", "MIFFS", "MIFFY", "MIFTY", "MIGGS", "MIHAS", "MIHIS", "MIKED", + "MIKES", "MIKRA", "MIKVA", "MILCH", "MILDS", "MILER", "MILES", "MILFS", "MILIA", "MILKO", "MILKS", "MILLE", + "MILLS", "MILOR", "MILOS", "MILPA", "MILTS", "MILTY", "MILTZ", "MIMED", "MIMEO", "MIMER", "MIMES", "MIMSY", + "MINAE", "MINAR", "MINAS", "MINCY", "MINDS", "MINED", "MINES", "MINGE", "MINGS", "MINGY", "MINIS", "MINKE", + "MINKS", "MINNY", "MINOS", "MINTS", "MIRED", "MIRES", "MIREX", "MIRID", "MIRIN", "MIRKS", "MIRKY", "MIRLY", + "MIROS", "MIRVS", "MIRZA", "MISCH", "MISDO", "MISES", "MISGO", "MISOS", "MISSA", "MISTS", "MISTY", "MITCH", + "MITER", "MITES", "MITIS", "MITRE", "MITTS", "MIXED", "MIXEN", "MIXER", "MIXES", "MIXTE", "MIXUP", "MIZEN", + "MIZZY", "MNEME", "MOANS", "MOATS", "MOBBY", "MOBES", "MOBEY", "MOBIE", "MOBLE", "MOCHI", "MOCHS", "MOCHY", + "MOCKS", "MODER", "MODES", "MODGE", "MODII", "MODUS", "MOERS", "MOFOS", "MOGGY", "MOHEL", "MOHOS", "MOHRS", + "MOHUA", "MOHUR", "MOILE", "MOILS", "MOIRA", "MOIRE", "MOITS", "MOJOS", "MOKES", "MOKIS", "MOKOS", "MOLAL", + "MOLAS", "MOLDS", "MOLED", "MOLES", "MOLLA", "MOLLS", "MOLLY", "MOLTO", "MOLTS", "MOLYS", "MOMES", "MOMMA", + "MOMMY", "MOMUS", "MONAD", "MONAL", "MONAS", "MONDE", "MONDO", "MONER", "MONGO", "MONGS", "MONIC", "MONIE", + "MONKS", "MONOS", "MONTE", "MONTY", "MOOBS", "MOOCH", "MOODS", "MOOED", "MOOKS", "MOOLA", "MOOLI", "MOOLS", + "MOOLY", "MOONG", "MOONS", "MOONY", "MOOPS", "MOORS", "MOORY", "MOOTS", "MOOVE", "MOPED", "MOPER", "MOPES", + "MOPEY", "MOPPY", "MOPSY", "MOPUS", "MORAE", "MORAS", "MORAT", "MORAY", "MOREL", "MORES", "MORIA", "MORNE", + "MORNS", "MORRA", "MORRO", "MORSE", "MORTS", "MOSED", "MOSES", "MOSEY", "MOSKS", "MOSSO", "MOSTE", "MOSTS", + "MOTED", "MOTEN", "MOTES", "MOTET", "MOTEY", "MOTHS", "MOTHY", "MOTIS", "MOTTE", "MOTTS", "MOTTY", "MOTUS", + "MOTZA", "MOUCH", "MOUES", "MOULD", "MOULS", "MOUPS", "MOUST", "MOUSY", "MOVED", "MOVES", "MOWAS", "MOWED", + "MOWRA", "MOXAS", "MOXIE", "MOYAS", "MOYLE", "MOYLS", "MOZED", "MOZES", "MOZOS", "MPRET", "MUCHO", "MUCIC", + "MUCID", "MUCIN", "MUCKS", "MUCOR", "MUCRO", "MUDGE", "MUDIR", "MUDRA", "MUFFS", "MUFTI", "MUGGA", "MUGGS", + "MUGGY", "MUHLY", "MUIDS", "MUILS", "MUIRS", "MUIST", "MUJIK", "MULCT", "MULED", "MULES", "MULEY", "MULGA", + "MULIE", "MULLA", "MULLS", "MULSE", "MULSH", "MUMMS", "MUMPS", "MUMSY", "MUMUS", "MUNGA", "MUNGE", "MUNGO", + "MUNGS", "MUNIS", "MUNTS", "MUNTU", "MUONS", "MURAS", "MURED", "MURES", "MUREX", "MURID", "MURKS", "MURLS", + "MURLY", "MURRA", "MURRE", "MURRI", "MURRS", "MURRY", "MURTI", "MURVA", "MUSAR", "MUSCA", "MUSED", "MUSER", + "MUSES", "MUSET", "MUSHA", "MUSIT", "MUSKS", "MUSOS", "MUSSE", "MUSSY", "MUSTH", "MUSTS", "MUTCH", "MUTED", + "MUTER", "MUTES", "MUTHA", "MUTIS", "MUTON", "MUTTS", "MUXED", "MUXES", "MUZAK", "MUZZY", "MVULE", "MYALL", + "MYLAR", "MYNAH", "MYNAS", "MYOID", "MYOMA", "MYOPE", "MYOPS", "MYOPY", "MYSID", "MYTHI", "MYTHS", "MYTHY", + "MYXOS", "MZEES", "NAAMS", "NAANS", "NABES", "NABIS", "NABKS", "NABLA", "NABOB", "NACHE", "NACHO", "NACRE", + "NADAS", "NAEVE", "NAEVI", "NAFFS", "NAGAS", "NAGGY", "NAGOR", "NAHAL", "NAIAD", "NAIFS", "NAIKS", "NAILS", + "NAIRA", "NAIRU", "NAKED", "NAKER", "NAKFA", "NALAS", "NALED", "NALLA", "NAMED", "NAMER", "NAMES", "NAMMA", + "NAMUS", "NANAS", "NANCE", "NANCY", "NANDU", "NANNA", "NANOS", "NANUA", "NAPAS", "NAPED", "NAPES", "NAPOO", + "NAPPA", "NAPPE", "NAPPY", "NARAS", "NARCO", "NARCS", "NARDS", "NARES", "NARIC", "NARIS", "NARKS", "NARKY", + "NARRE", "NASHI", "NATCH", "NATES", "NATIS", "NATTY", "NAUCH", "NAUNT", "NAVAR", "NAVES", "NAVEW", "NAVVY", + "NAWAB", "NAZES", "NAZIR", "NAZIS", "NDUJA", "NEAFE", "NEALS", "NEAPS", "NEARS", "NEATH", "NEATS", "NEBEK", + "NEBEL", "NECKS", "NEDDY", "NEEDS", "NEELD", "NEELE", "NEEMB", "NEEMS", "NEEPS", "NEESE", "NEEZE", "NEGRO", + "NEGUS", "NEIFS", "NEIST", "NEIVE", "NELIS", "NELLY", "NEMAS", "NEMNS", "NEMPT", "NENES", "NEONS", "NEPER", + "NEPIT", "NERAL", "NERDS", "NERKA", "NERKS", "NEROL", "NERTS", "NERTZ", "NERVY", "NESTS", "NETES", "NETOP", + "NETTS", "NETTY", "NEUKS", "NEUME", "NEUMS", "NEVEL", "NEVES", "NEVUS", "NEWBS", "NEWED", "NEWEL", "NEWIE", + "NEWSY", "NEWTS", "NEXTS", "NEXUS", "NGAIO", "NGANA", "NGATI", "NGOMA", "NGWEE", "NICAD", "NICHT", "NICKS", + "NICOL", "NIDAL", "NIDED", "NIDES", "NIDOR", "NIDUS", "NIEFS", "NIEVE", "NIFES", "NIFFS", "NIFFY", "NIFTY", + "NIGER", "NIGHS", "NIHIL", "NIKAB", "NIKAH", "NIKAU", "NILLS", "NIMBI", "NIMBS", "NIMPS", "NINER", "NINES", + "NINON", "NIPAS", "NIPPY", "NIQAB", "NIRLS", "NIRLY", "NISEI", "NISSE", "NISUS", "NITER", "NITES", "NITID", + "NITON", "NITRE", "NITRO", "NITRY", "NITTY", "NIVAL", "NIXED", "NIXER", "NIXES", "NIXIE", "NIZAM", "NKOSI", + "NOAHS", "NOBBY", "NOCKS", "NODAL", "NODDY", "NODES", "NODUS", "NOELS", "NOGGS", "NOHOW", "NOILS", "NOILY", + "NOINT", "NOIRS", "NOLES", "NOLLS", "NOLOS", "NOMAS", "NOMEN", "NOMES", "NOMIC", "NOMOI", "NOMOS", "NONAS", + "NONCE", "NONES", "NONET", "NONGS", "NONIS", "NONNY", "NONYL", "NOOBS", "NOOIT", "NOOKS", "NOOKY", "NOONS", + "NOOPS", "NOPAL", "NORIA", "NORIS", "NORKS", "NORMA", "NORMS", "NOSED", "NOSER", "NOSES", "NOTAL", "NOTED", + "NOTER", "NOTES", "NOTUM", "NOULD", "NOULE", "NOULS", "NOUNS", "NOUNY", "NOUPS", "NOVAE", "NOVAS", "NOVUM", + "NOWAY", "NOWED", "NOWLS", "NOWTS", "NOWTY", "NOXAL", "NOXES", "NOYAU", "NOYED", "NOYES", "NUBBY", "NUBIA", + "NUCHA", "NUDDY", "NUDER", "NUDES", "NUDIE", "NUDZH", "NUFFS", "NUGAE", "NUKED", "NUKES", "NULLA", "NULLS", + "NUMBS", "NUMEN", "NUMMY", "NUNNY", "NURDS", "NURDY", "NURLS", "NURRS", "NUTSO", "NUTSY", "NYAFF", "NYALA", + "NYING", "NYSSA", "OAKED", "OAKER", "OAKUM", "OARED", "OASES", "OASIS", "OASTS", "OATEN", "OATER", "OATHS", + "OAVES", "OBANG", "OBEAH", "OBELI", "OBEYS", "OBIAS", "OBIED", "OBIIT", "OBITS", "OBJET", "OBOES", "OBOLE", + "OBOLI", "OBOLS", "OCCAM", "OCHER", "OCHES", "OCHRE", "OCHRY", "OCKER", "OCREA", "OCTAD", "OCTAN", "OCTAS", + "OCTYL", "OCULI", "ODAHS", "ODALS", "ODEON", "ODEUM", "ODISM", "ODIST", "ODIUM", "ODORS", "ODOUR", "ODYLE", + "ODYLS", "OFAYS", "OFFED", "OFFIE", "OFLAG", "OFTER", "OGAMS", "OGEED", "OGEES", "OGGIN", "OGHAM", "OGIVE", + "OGLED", "OGLER", "OGLES", "OGMIC", "OGRES", "OHIAS", "OHING", "OHMIC", "OHONE", "OIDIA", "OILED", "OILER", + "OINKS", "OINTS", "OJIME", "OKAPI", "OKAYS", "OKEHS", "OKRAS", "OKTAS", "OLDIE", "OLEIC", "OLEIN", "OLENT", + "OLEOS", "OLEUM", "OLIOS", "OLLAS", "OLLAV", "OLLER", "OLLIE", "OLOGY", "OLPAE", "OLPES", "OMASA", "OMBER", + "OMBUS", "OMENS", "OMERS", "OMITS", "OMLAH", "OMOVS", "OMRAH", "ONCER", "ONCES", "ONCET", "ONCUS", "ONELY", + "ONERS", "ONERY", "ONIUM", "ONKUS", "ONLAY", "ONNED", "ONTIC", "OOBIT", "OOHED", "OOMPH", "OONTS", "OOPED", + "OORIE", "OOSES", "OOTID", "OOZED", "OOZES", "OPAHS", "OPALS", "OPENS", "OPEPE", "OPING", "OPPOS", "OPSIN", + "OPTED", "OPTER", "ORACH", "ORACY", "ORALS", "ORANG", "ORANT", "ORATE", "ORBED", "ORCAS", "ORCIN", "ORDOS", + "OREAD", "ORFES", "ORGIA", "ORGIC", "ORGUE", "ORIBI", "ORIEL", "ORIXA", "ORLES", "ORLON", "ORLOP", "ORMER", + "ORNIS", "ORPIN", "ORRIS", "ORTHO", "ORVAL", "ORZOS", "OSCAR", "OSHAC", "OSIER", "OSMIC", "OSMOL", "OSSIA", + "OSTIA", "OTAKU", "OTARY", "OTTAR", "OTTOS", "OUBIT", "OUCHT", "OUENS", "OUIJA", "OULKS", "OUMAS", "OUNDY", + "OUPAS", "OUPED", "OUPHE", "OUPHS", "OURIE", "OUSEL", "OUSTS", "OUTBY", "OUTED", "OUTRE", "OUTRO", "OUTTA", + "OUZEL", "OUZOS", "OVALS", "OVELS", "OVENS", "OVERS", "OVIST", "OVOLI", "OVOLO", "OVULE", "OWCHE", "OWIES", + "OWLED", "OWLER", "OWLET", "OWNED", "OWRES", "OWRIE", "OWSEN", "OXBOW", "OXERS", "OXEYE", "OXIDS", "OXIES", + "OXIME", "OXIMS", "OXLIP", "OXTER", "OYERS", "OZEKI", "OZZIE", "PAALS", "PAANS", "PACAS", "PACED", "PACER", + "PACES", "PACEY", "PACHA", "PACKS", "PACOS", "PACTA", "PACTS", "PADIS", "PADLE", "PADMA", "PADRE", "PADRI", + "PAEAN", "PAEDO", "PAEON", "PAGED", "PAGER", "PAGES", "PAGLE", "PAGOD", "PAGRI", "PAIKS", "PAILS", "PAINS", + "PAIRE", "PAIRS", "PAISA", "PAISE", "PAKKA", "PALAS", "PALAY", "PALEA", "PALED", "PALES", "PALET", "PALIS", + "PALKI", "PALLA", "PALLS", "PALLY", "PALMS", "PALMY", "PALPI", "PALPS", "PALSA", "PAMPA", "PANAX", "PANCE", + "PANDA", "PANDS", "PANDY", "PANED", "PANES", "PANGA", "PANGS", "PANIM", "PANKO", "PANNE", "PANNI", "PANTO", + "PANTS", "PANTY", "PAOLI", "PAOLO", "PAPAS", "PAPAW", "PAPES", "PAPPI", "PAPPY", "PARAE", "PARAS", "PARCH", + "PARDI", "PARDS", "PARDY", "PARED", "PAREN", "PAREO", "PARES", "PAREU", "PAREV", "PARGE", "PARGO", "PARIS", + "PARKI", "PARKS", "PARKY", "PARLE", "PARLY", "PARMA", "PAROL", "PARPS", "PARRA", "PARRS", "PARTI", "PARTS", + "PARVE", "PARVO", "PASEO", "PASES", "PASHA", "PASHM", "PASKA", "PASPY", "PASSE", "PASTS", "PATED", "PATEN", + "PATER", "PATES", "PATHS", "PATIN", "PATKA", "PATLY", "PATTE", "PATUS", "PAUAS", "PAULS", "PAVAN", "PAVED", + "PAVEN", "PAVER", "PAVES", "PAVID", "PAVIN", "PAVIS", "PAWAS", "PAWAW", "PAWED", "PAWER", "PAWKS", "PAWKY", + "PAWLS", "PAWNS", "PAXES", "PAYED", "PAYOR", "PAYSD", "PEAGE", "PEAGS", "PEAKS", "PEAKY", "PEALS", "PEANS", + "PEARE", "PEARS", "PEART", "PEASE", "PEATS", "PEATY", "PEAVY", "PEAZE", "PEBAS", "PECHS", "PECKE", "PECKS", + "PECKY", "PEDES", "PEDIS", "PEDRO", "PEECE", "PEEKS", "PEELS", "PEENS", "PEEOY", "PEEPE", "PEEPS", "PEERS", + "PEERY", "PEEVE", "PEGGY", "PEGHS", "PEINS", "PEISE", "PEIZE", "PEKAN", "PEKES", "PEKIN", "PEKOE", "PELAS", + "PELAU", "PELES", "PELFS", "PELLS", "PELMA", "PELON", "PELTA", "PELTS", "PENDS", "PENDU", "PENED", "PENES", + "PENGO", "PENIE", "PENIS", "PENKS", "PENNA", "PENNI", "PENTS", "PEONS", "PEONY", "PEPLA", "PEPOS", "PEPPY", + "PEPSI", "PERAI", "PERCE", "PERCS", "PERDU", "PERDY", "PEREA", "PERES", "PERIS", "PERKS", "PERMS", "PERNS", + "PEROG", "PERPS", "PERRY", "PERSE", "PERST", "PERTS", "PERVE", "PERVO", "PERVS", "PERVY", "PESOS", "PESTS", + "PESTY", "PETAR", "PETER", "PETIT", "PETRE", "PETRI", "PETTI", "PETTO", "PEWEE", "PEWIT", "PEYSE", "PHAGE", + "PHANG", "PHARE", "PHARM", "PHEER", "PHENE", "PHEON", "PHESE", "PHIAL", "PHISH", "PHIZZ", "PHLOX", "PHOCA", + "PHONO", "PHONS", "PHOTS", "PHPHT", "PHUTS", "PHYLA", "PHYLE", "PIANI", "PIANS", "PIBAL", "PICAL", "PICAS", + "PICCY", "PICKS", "PICOT", "PICRA", "PICUL", "PIEND", "PIERS", "PIERT", "PIETA", "PIETS", "PIEZO", "PIGHT", + "PIGMY", "PIING", "PIKAS", "PIKAU", "PIKED", "PIKER", "PIKES", "PIKEY", "PIKIS", "PIKUL", "PILAE", "PILAF", + "PILAO", "PILAR", "PILAU", "PILAW", "PILCH", "PILEA", "PILED", "PILEI", "PILER", "PILES", "PILIS", "PILLS", + "PILOW", "PILUM", "PILUS", "PIMAS", "PIMPS", "PINAS", "PINED", "PINES", "PINGO", "PINGS", "PINKO", "PINKS", + "PINNA", "PINNY", "PINON", "PINOT", "PINTA", "PINTS", "PINUP", "PIONS", "PIONY", "PIOUS", "PIOYE", "PIOYS", + "PIPAL", "PIPAS", "PIPED", "PIPES", "PIPET", "PIPIS", "PIPIT", "PIPPY", "PIPUL", "PIRAI", "PIRLS", "PIRNS", + "PIROG", "PISCO", "PISES", "PISKY", "PISOS", "PISSY", "PISTE", "PITAS", "PITHS", "PITON", "PITOT", "PITTA", + "PIUMS", "PIXES", "PIZED", "PIZES", "PLAAS", "PLACK", "PLAGE", "PLANS", "PLAPS", "PLASH", "PLASM", "PLAST", + "PLATS", "PLATT", "PLATY", "PLAYA", "PLAYS", "PLEAS", "PLEBE", "PLEBS", "PLENA", "PLEON", "PLESH", "PLEWS", + "PLICA", "PLIES", "PLIMS", "PLING", "PLINK", "PLOAT", "PLODS", "PLONG", "PLONK", "PLOOK", "PLOPS", "PLOTS", + "PLOTZ", "PLOUK", "PLOWS", "PLOYE", "PLOYS", "PLUES", "PLUFF", "PLUGS", "PLUMS", "PLUMY", "PLUOT", "PLUTO", + "PLYER", "POACH", "POAKA", "POAKE", "POBOY", "POCKS", "POCKY", "PODAL", "PODDY", "PODEX", "PODGE", "PODGY", + "PODIA", "POEMS", "POEPS", "POETS", "POGEY", "POGGE", "POGOS", "POHED", "POILU", "POIND", "POKAL", "POKED", + "POKES", "POKEY", "POKIE", "POLED", "POLER", "POLES", "POLEY", "POLIO", "POLIS", "POLJE", "POLKS", "POLLS", + "POLLY", "POLOS", "POLTS", "POLYS", "POMBE", "POMES", "POMMY", "POMOS", "POMPS", "PONCE", "PONCY", "PONDS", + "PONES", "PONEY", "PONGA", "PONGO", "PONGS", "PONGY", "PONKS", "PONTS", "PONTY", "PONZU", "POODS", "POOED", + "POOFS", "POOFY", "POOHS", "POOJA", "POOKA", "POOKS", "POOLS", "POONS", "POOPS", "POOPY", "POORI", "POORT", + "POOTS", "POOVE", "POOVY", "POPES", "POPPA", "POPSY", "PORAE", "PORAL", "PORED", "PORER", "PORES", "PORGE", + "PORGY", "PORIN", "PORKS", "PORKY", "PORNO", "PORNS", "PORNY", "PORTA", "PORTS", "PORTY", "POSED", "POSES", + "POSEY", "POSHO", "POSTS", "POTAE", "POTCH", "POTED", "POTES", "POTIN", "POTOO", "POTSY", "POTTO", "POTTS", + "POTTY", "POUFF", "POUFS", "POUKE", "POUKS", "POULE", "POULP", "POULT", "POUPE", "POUPT", "POURS", "POUTS", + "POWAN", "POWIN", "POWND", "POWNS", "POWNY", "POWRE", "POXED", "POXES", "POYNT", "POYOU", "POYSE", "POZZY", + "PRAAM", "PRADS", "PRAHU", "PRAMS", "PRANA", "PRANG", "PRAOS", "PRASE", "PRATE", "PRATS", "PRATT", "PRATY", + "PRAUS", "PRAYS", "PREDY", "PREED", "PREES", "PREIF", "PREMS", "PREMY", "PRENT", "PREON", "PREOP", "PREPS", + "PRESA", "PRESE", "PREST", "PREVE", "PREXY", "PREYS", "PRIAL", "PRICY", "PRIEF", "PRIER", "PRIES", "PRIGS", + "PRILL", "PRIMA", "PRIMI", "PRIMP", "PRIMS", "PRIMY", "PRINK", "PRION", "PRISE", "PRISS", "PROAS", "PROBS", + "PRODS", "PROEM", "PROFS", "PROGS", "PROIN", "PROKE", "PROLE", "PROLL", "PROMO", "PROMS", "PRONK", "PROPS", + "PRORE", "PROSO", "PROSS", "PROST", "PROSY", "PROTO", "PROUL", "PROWS", "PROYN", "PRUNT", "PRUTA", "PRYER", + "PRYSE", "PSEUD", "PSHAW", "PSION", "PSOAE", "PSOAI", "PSOAS", "PSORA", "PSYCH", "PSYOP", "PUBCO", "PUBES", + "PUBIS", "PUCAN", "PUCER", "PUCES", "PUCKA", "PUCKS", "PUDDY", "PUDGE", "PUDIC", "PUDOR", "PUDSY", "PUDUS", + "PUERS", "PUFFA", "PUFFS", "PUGGY", "PUGIL", "PUHAS", "PUJAH", "PUJAS", "PUKAS", "PUKED", "PUKER", "PUKES", + "PUKEY", "PUKKA", "PUKUS", "PULAO", "PULAS", "PULED", "PULER", "PULES", "PULIK", "PULIS", "PULKA", "PULKS", + "PULLI", "PULLS", "PULLY", "PULMO", "PULPS", "PULUS", "PUMAS", "PUMIE", "PUMPS", "PUNAS", "PUNCE", "PUNGA", + "PUNGS", "PUNJI", "PUNKA", "PUNKS", "PUNKY", "PUNNY", "PUNTO", "PUNTS", "PUNTY", "PUPAE", "PUPAL", "PUPAS", + "PUPUS", "PURDA", "PURED", "PURES", "PURIN", "PURIS", "PURLS", "PURPY", "PURRS", "PURSY", "PURTY", "PUSES", + "PUSLE", "PUSSY", "PUTID", "PUTON", "PUTTI", "PUTTO", "PUTTS", "PUZEL", "PWNED", "PYATS", "PYETS", "PYGAL", + "PYINS", "PYLON", "PYNED", "PYNES", "PYOID", "PYOTS", "PYRAL", "PYRAN", "PYRES", "PYREX", "PYRIC", "PYROS", + "PYXED", "PYXES", "PYXIE", "PYXIS", "PZAZZ", "QADIS", "QAIDS", "QAJAQ", "QANAT", "QAPIK", "QIBLA", "QOPHS", + "QORMA", "QUADS", "QUAFF", "QUAGS", "QUAIR", "QUAIS", "QUAKY", "QUALE", "QUANT", "QUARE", "QUASS", "QUATE", + "QUATS", "QUAYD", "QUAYS", "QUBIT", "QUEAN", "QUEME", "QUENA", "QUERN", "QUEYN", "QUEYS", "QUICH", "QUIDS", + "QUIFF", "QUIMS", "QUINA", "QUINE", "QUINO", "QUINS", "QUINT", "QUIPO", "QUIPS", "QUIPU", "QUIRE", "QUIRT", + "QUIST", "QUITS", "QUOAD", "QUODS", "QUOIF", "QUOIN", "QUOIT", "QUOLL", "QUONK", "QUOPS", "QURAN", "QURSH", + "QUYTE", "RABAT", "RABIC", "RABIS", "RACED", "RACES", "RACHE", "RACKS", "RACON", "RADGE", "RADIX", "RADON", + "RAFFS", "RAFTS", "RAGAS", "RAGDE", "RAGED", "RAGEE", "RAGER", "RAGES", "RAGGA", "RAGGS", "RAGGY", "RAGIS", + "RAGUS", "RAHED", "RAHUI", "RAIAS", "RAIDS", "RAIKS", "RAILE", "RAILS", "RAINE", "RAINS", "RAIRD", "RAITA", + "RAITS", "RAJAS", "RAJES", "RAKED", "RAKEE", "RAKER", "RAKES", "RAKIA", "RAKIS", "RAKUS", "RALES", "RAMAL", + "RAMEE", "RAMET", "RAMIE", "RAMIN", "RAMIS", "RAMMY", "RAMPS", "RAMUS", "RANAS", "RANCE", "RANDS", "RANEE", + "RANGA", "RANGI", "RANGS", "RANGY", "RANID", "RANIS", "RANKE", "RANKS", "RANTS", "RAPED", "RAPER", "RAPES", + "RAPHE", "RAPPE", "RARED", "RAREE", "RARES", "RARKS", "RASED", "RASER", "RASES", "RASPS", "RASSE", "RASTA", + "RATAL", "RATAN", "RATAS", "RATCH", "RATED", "RATEL", "RATER", "RATES", "RATHA", "RATHE", "RATHS", "RATOO", + "RATOS", "RATUS", "RAUNS", "RAUPO", "RAVED", "RAVEL", "RAVER", "RAVES", "RAVEY", "RAVIN", "RAWER", "RAWIN", + "RAWLY", "RAWNS", "RAXED", "RAXES", "RAYAH", "RAYAS", "RAYED", "RAYLE", "RAYNE", "RAZED", "RAZEE", "RAZER", + "RAZES", "RAZOO", "READD", "READS", "REAIS", "REAKS", "REALO", "REALS", "REAME", "REAMS", "REAMY", "REANS", + "REAPS", "REARS", "REAST", "REATA", "REATE", "REAVE", "REBBE", "REBEC", "REBID", "REBIT", "REBOP", "REBUY", + "RECAL", "RECCE", "RECCO", "RECCY", "RECIT", "RECKS", "RECON", "RECTA", "RECTI", "RECTO", "REDAN", "REDDS", + "REDDY", "REDED", "REDES", "REDIA", "REDID", "REDIP", "REDLY", "REDON", "REDOS", "REDOX", "REDRY", "REDUB", + "REDUX", "REDYE", "REECH", "REEDE", "REEDS", "REEFS", "REEFY", "REEKS", "REEKY", "REELS", "REENS", "REEST", + "REEVE", "REFED", "REFEL", "REFFO", "REFIS", "REFIX", "REFLY", "REFRY", "REGAR", "REGES", "REGGO", "REGIE", + "REGMA", "REGNA", "REGOS", "REGUR", "REHEM", "REIFS", "REIFY", "REIKI", "REIKS", "REINK", "REINS", "REIRD", + "REIST", "REIVE", "REJIG", "REJON", "REKED", "REKES", "REKEY", "RELET", "RELIE", "RELIT", "RELLO", "REMAN", + "REMAP", "REMEN", "REMET", "REMEX", "REMIX", "RENAY", "RENDS", "RENEY", "RENGA", "RENIG", "RENIN", "RENNE", + "RENOS", "RENTE", "RENTS", "REOIL", "REORG", "REPEG", "REPIN", "REPLA", "REPOS", "REPOT", "REPPS", "REPRO", + "RERAN", "RERIG", "RESAT", "RESAW", "RESAY", "RESEE", "RESES", "RESEW", "RESID", "RESIT", "RESOD", "RESOW", + "RESTO", "RESTS", "RESTY", "RESUS", "RETAG", "RETAX", "RETEM", "RETIA", "RETIE", "RETOX", "REVET", "REVIE", + "REWAN", "REWAX", "REWED", "REWET", "REWIN", "REWON", "REWTH", "REXES", "REZES", "RHEAS", "RHEME", "RHEUM", + "RHIES", "RHIME", "RHINE", "RHODY", "RHOMB", "RHONE", "RHUMB", "RHYNE", "RHYTA", "RIADS", "RIALS", "RIANT", + "RIATA", "RIBAS", "RIBBY", "RIBES", "RICED", "RICER", "RICES", "RICEY", "RICHT", "RICIN", "RICKS", "RIDES", + "RIDGY", "RIDIC", "RIELS", "RIEMS", "RIEVE", "RIFER", "RIFFS", "RIFTE", "RIFTS", "RIFTY", "RIGGS", "RIGOL", + "RILED", "RILES", "RILEY", "RILLE", "RILLS", "RIMAE", "RIMED", "RIMER", "RIMES", "RIMUS", "RINDS", "RINDY", + "RINES", "RINGS", "RINKS", "RIOJA", "RIOTS", "RIPED", "RIPES", "RIPPS", "RISES", "RISHI", "RISKS", "RISPS", + "RISUS", "RITES", "RITTS", "RITZY", "RIVAS", "RIVED", "RIVEL", "RIVEN", "RIVES", "RIYAL", "RIZAS", "ROADS", + "ROAMS", "ROANS", "ROARS", "ROARY", "ROATE", "ROBED", "ROBES", "ROBLE", "ROCKS", "RODED", "RODES", "ROGUY", + "ROHES", "ROIDS", "ROILS", "ROILY", "ROINS", "ROIST", "ROJAK", "ROJIS", "ROKED", "ROKER", "ROKES", "ROLAG", + "ROLES", "ROLFS", "ROLLS", "ROMAL", "ROMAN", "ROMEO", "ROMPS", "RONDE", "RONDO", "RONEO", "RONES", "RONIN", + "RONNE", "RONTE", "RONTS", "ROODS", "ROOFS", "ROOFY", "ROOKS", "ROOKY", "ROOMS", "ROONS", "ROOPS", "ROOPY", + "ROOSA", "ROOSE", "ROOTS", "ROOTY", "ROPED", "ROPER", "ROPES", "ROPEY", "ROQUE", "RORAL", "RORES", "RORIC", + "RORID", "RORIE", "RORTS", "RORTY", "ROSED", "ROSES", "ROSET", "ROSHI", "ROSIN", "ROSIT", "ROSTI", "ROSTS", + "ROTAL", "ROTAN", "ROTAS", "ROTCH", "ROTED", "ROTES", "ROTIS", "ROTLS", "ROTON", "ROTOS", "ROTTE", "ROUEN", + "ROUES", "ROULE", "ROULS", "ROUMS", "ROUPS", "ROUPY", "ROUST", "ROUTH", "ROUTS", "ROVED", "ROVEN", "ROVES", + "ROWAN", "ROWED", "ROWEL", "ROWEN", "ROWIE", "ROWME", "ROWND", "ROWTH", "ROWTS", "ROYNE", "ROYST", "ROZET", + "ROZIT", "RUANA", "RUBAI", "RUBBY", "RUBEL", "RUBES", "RUBIN", "RUBLE", "RUBLI", "RUBUS", "RUCHE", "RUCKS", + "RUDAS", "RUDDS", "RUDES", "RUDIE", "RUDIS", "RUEDA", "RUERS", "RUFFE", "RUFFS", "RUGAE", "RUGAL", "RUGGY", + "RUING", "RUINS", "RUKHS", "RULED", "RULES", "RUMAL", "RUMBO", "RUMEN", "RUMES", "RUMLY", "RUMMY", "RUMPO", + "RUMPS", "RUMPY", "RUNCH", "RUNDS", "RUNED", "RUNES", "RUNGS", "RUNIC", "RUNNY", "RUNTS", "RUNTY", "RUPIA", + "RURPS", "RURUS", "RUSAS", "RUSES", "RUSHY", "RUSKS", "RUSMA", "RUSSE", "RUSTS", "RUTHS", "RUTIN", "RUTTY", + "RYALS", "RYBAT", "RYKED", "RYKES", "RYMME", "RYNDS", "RYOTS", "RYPER", "SAAGS", "SABAL", "SABED", "SABER", + "SABES", "SABHA", "SABIN", "SABIR", "SABLE", "SABOT", "SABRA", "SABRE", "SACKS", "SACRA", "SADDO", "SADES", + "SADHE", "SADHU", "SADIS", "SADOS", "SADZA", "SAFED", "SAFES", "SAGAS", "SAGER", "SAGES", "SAGGY", "SAGOS", + "SAGUM", "SAHEB", "SAHIB", "SAICE", "SAICK", "SAICS", "SAIDS", "SAIGA", "SAILS", "SAIMS", "SAINE", "SAINS", + "SAIRS", "SAIST", "SAITH", "SAJOU", "SAKAI", "SAKER", "SAKES", "SAKIA", "SAKIS", "SAKTI", "SALAL", "SALAT", + "SALEP", "SALES", "SALET", "SALIC", "SALIX", "SALLE", "SALMI", "SALOL", "SALOP", "SALPA", "SALPS", "SALSE", + "SALTO", "SALTS", "SALUE", "SALUT", "SAMAN", "SAMAS", "SAMBA", "SAMBO", "SAMEK", "SAMEL", "SAMEN", "SAMES", + "SAMEY", "SAMFU", "SAMMY", "SAMPI", "SAMPS", "SANDS", "SANED", "SANES", "SANGA", "SANGH", "SANGO", "SANGS", + "SANKO", "SANSA", "SANTO", "SANTS", "SAOLA", "SAPAN", "SAPID", "SAPOR", "SARAN", "SARDS", "SARED", "SAREE", + "SARGE", "SARGO", "SARIN", "SARIS", "SARKS", "SARKY", "SAROD", "SAROS", "SARUS", "SASER", "SASIN", "SASSE", + "SATAI", "SATAY", "SATED", "SATEM", "SATES", "SATIS", "SAUBA", "SAUCH", "SAUGH", "SAULS", "SAULT", "SAUNT", + "SAURY", "SAUTS", "SAVED", "SAVER", "SAVES", "SAVEY", "SAVIN", "SAWAH", "SAWED", "SAWER", "SAXES", "SAYED", + "SAYER", "SAYID", "SAYNE", "SAYON", "SAYST", "SAZES", "SCABS", "SCADS", "SCAFF", "SCAGS", "SCAIL", "SCALA", + "SCALL", "SCAMS", "SCAND", "SCANS", "SCAPA", "SCAPE", "SCAPI", "SCARP", "SCARS", "SCART", "SCATH", "SCATS", + "SCATT", "SCAUD", "SCAUP", "SCAUR", "SCAWS", "SCEAT", "SCENA", "SCEND", "SCHAV", "SCHMO", "SCHUL", "SCHWA", + "SCLIM", "SCODY", "SCOGS", "SCOOG", "SCOOT", "SCOPA", "SCOPS", "SCOTS", "SCOUG", "SCOUP", "SCOWP", "SCOWS", + "SCRAB", "SCRAE", "SCRAG", "SCRAN", "SCRAT", "SCRAW", "SCRAY", "SCRIM", "SCRIP", "SCROB", "SCROD", "SCROG", + "SCROW", "SCUDI", "SCUDO", "SCUDS", "SCUFF", "SCUFT", "SCUGS", "SCULK", "SCULL", "SCULP", "SCULS", "SCUMS", + "SCUPS", "SCURF", "SCURS", "SCUSE", "SCUTA", "SCUTE", "SCUTS", "SCUZZ", "SCYES", "SDAYN", "SDEIN", "SEALS", + "SEAME", "SEAMS", "SEAMY", "SEANS", "SEARE", "SEARS", "SEASE", "SEATS", "SEAZE", "SEBUM", "SECCO", "SECHS", + "SECTS", "SEDER", "SEDES", "SEDGE", "SEDGY", "SEDUM", "SEEDS", "SEEKS", "SEELD", "SEELS", "SEELY", "SEEMS", + "SEEPS", "SEEPY", "SEERS", "SEFER", "SEGAR", "SEGNI", "SEGNO", "SEGOL", "SEGOS", "SEHRI", "SEIFS", "SEILS", + "SEINE", "SEIRS", "SEISE", "SEISM", "SEITY", "SEIZA", "SEKOS", "SEKTS", "SELAH", "SELES", "SELFS", "SELLA", + "SELLE", "SELLS", "SELVA", "SEMEE", "SEMES", "SEMIE", "SEMIS", "SENAS", "SENDS", "SENES", "SENGI", "SENNA", + "SENOR", "SENSA", "SENSI", "SENTE", "SENTI", "SENTS", "SENVY", "SENZA", "SEPAD", "SEPAL", "SEPIC", "SEPOY", + "SEPTA", "SEPTS", "SERAC", "SERAI", "SERAL", "SERED", "SERER", "SERES", "SERFS", "SERGE", "SERIC", "SERIN", + "SERKS", "SERON", "SEROW", "SERRA", "SERRE", "SERRS", "SERRY", "SERVO", "SESEY", "SESSA", "SETAE", "SETAL", + "SETON", "SETTS", "SEWAN", "SEWAR", "SEWED", "SEWEL", "SEWEN", "SEWIN", "SEXED", "SEXER", "SEXES", "SEXTO", + "SEXTS", "SEYEN", "SHADS", "SHAGS", "SHAHS", "SHAKO", "SHAKT", "SHALM", "SHALY", "SHAMA", "SHAMS", "SHAND", + "SHANS", "SHAPS", "SHARN", "SHASH", "SHAUL", "SHAWM", "SHAWN", "SHAWS", "SHAYA", "SHAYS", "SHCHI", "SHEAF", + "SHEAL", "SHEAS", "SHEDS", "SHEEL", "SHEND", "SHENT", "SHEOL", "SHERD", "SHERE", "SHERO", "SHETS", "SHEVA", + "SHEWN", "SHEWS", "SHIAI", "SHIEL", "SHIER", "SHIES", "SHILL", "SHILY", "SHIMS", "SHINS", "SHIPS", "SHIRR", + "SHIRS", "SHISH", "SHISO", "SHIST", "SHITE", "SHITS", "SHIUR", "SHIVA", "SHIVE", "SHIVS", "SHLEP", "SHLUB", + "SHMEK", "SHMOE", "SHOAT", "SHOED", "SHOER", "SHOES", "SHOGI", "SHOGS", "SHOJI", "SHOJO", "SHOLA", "SHOOL", + "SHOON", "SHOOS", "SHOPE", "SHOPS", "SHORL", "SHOTE", "SHOTS", "SHOTT", "SHOWD", "SHOWS", "SHOYU", "SHRED", + "SHRIS", "SHROW", "SHTIK", "SHTUM", "SHTUP", "SHULE", "SHULN", "SHULS", "SHUNS", "SHURA", "SHUTE", "SHUTS", + "SHWAS", "SHYER", "SIALS", "SIBBS", "SIBYL", "SICES", "SICHT", "SICKO", "SICKS", "SICKY", "SIDAS", "SIDED", + "SIDER", "SIDES", "SIDHA", "SIDHE", "SIDLE", "SIELD", "SIENS", "SIENT", "SIETH", "SIEUR", "SIFTS", "SIGHS", + "SIGIL", "SIGLA", "SIGNA", "SIGNS", "SIJOS", "SIKAS", "SIKER", "SIKES", "SILDS", "SILED", "SILEN", "SILER", + "SILES", "SILEX", "SILKS", "SILLS", "SILOS", "SILTS", "SILTY", "SILVA", "SIMAR", "SIMAS", "SIMBA", "SIMIS", + "SIMPS", "SIMUL", "SINDS", "SINED", "SINES", "SINGS", "SINHS", "SINKS", "SINKY", "SINUS", "SIPED", "SIPES", + "SIPPY", "SIRED", "SIREE", "SIRES", "SIRIH", "SIRIS", "SIROC", "SIRRA", "SIRUP", "SISAL", "SISES", "SISTA", + "SISTS", "SITAR", "SITED", "SITES", "SITHE", "SITKA", "SITUP", "SITUS", "SIVER", "SIXER", "SIXES", "SIXMO", + "SIXTE", "SIZAR", "SIZED", "SIZEL", "SIZER", "SIZES", "SKAGS", "SKAIL", "SKALD", "SKANK", "SKART", "SKATS", + "SKATT", "SKAWS", "SKEAN", "SKEAR", "SKEDS", "SKEED", "SKEEF", "SKEEN", "SKEER", "SKEES", "SKEET", "SKEGG", + "SKEGS", "SKEIN", "SKELF", "SKELL", "SKELM", "SKELP", "SKENE", "SKENS", "SKEOS", "SKEPS", "SKERS", "SKETS", + "SKEWS", "SKIDS", "SKIED", "SKIES", "SKIEY", "SKIMO", "SKIMS", "SKINK", "SKINS", "SKINT", "SKIOS", "SKIPS", + "SKIRL", "SKIRR", "SKITE", "SKITS", "SKIVE", "SKIVY", "SKLIM", "SKOAL", "SKODY", "SKOFF", "SKOGS", "SKOLS", + "SKOOL", "SKORT", "SKOSH", "SKRAN", "SKRIK", "SKUAS", "SKUGS", "SKYED", "SKYER", "SKYEY", "SKYFS", "SKYRE", + "SKYRS", "SKYTE", "SLABS", "SLADE", "SLAES", "SLAGS", "SLAID", "SLAKE", "SLAMS", "SLANE", "SLANK", "SLAPS", + "SLART", "SLATS", "SLATY", "SLAVE", "SLAWS", "SLAYS", "SLEBS", "SLEDS", "SLEER", "SLEWS", "SLEYS", "SLIER", + "SLILY", "SLIMS", "SLIPE", "SLIPS", "SLIPT", "SLISH", "SLITS", "SLIVE", "SLOAN", "SLOBS", "SLOES", "SLOGS", + "SLOID", "SLOJD", "SLOMO", "SLOOM", "SLOOT", "SLOPS", "SLOPY", "SLORM", "SLOTS", "SLOVE", "SLOWS", "SLOYD", + "SLUBB", "SLUBS", "SLUED", "SLUES", "SLUFF", "SLUGS", "SLUIT", "SLUMS", "SLURB", "SLURS", "SLUSE", "SLUTS", + "SLYER", "SLYPE", "SMAAK", "SMAIK", "SMALM", "SMALT", "SMARM", "SMAZE", "SMEEK", "SMEES", "SMEIK", "SMEKE", + "SMERK", "SMEWS", "SMIRR", "SMIRS", "SMITS", "SMOGS", "SMOKO", "SMOLT", "SMOOR", "SMOOT", "SMORE", "SMORG", + "SMOUT", "SMOWT", "SMUGS", "SMURS", "SMUSH", "SMUTS", "SNABS", "SNAFU", "SNAGS", "SNAPS", "SNARF", "SNARK", + "SNARS", "SNARY", "SNASH", "SNATH", "SNAWS", "SNEAD", "SNEAP", "SNEBS", "SNECK", "SNEDS", "SNEED", "SNEES", + "SNELL", "SNIBS", "SNICK", "SNIES", "SNIFT", "SNIGS", "SNIPS", "SNIPY", "SNIRT", "SNITS", "SNOBS", "SNODS", + "SNOEK", "SNOEP", "SNOGS", "SNOKE", "SNOOD", "SNOOK", "SNOOL", "SNOOT", "SNOTS", "SNOWK", "SNOWS", "SNUBS", + "SNUGS", "SNUSH", "SNYES", "SOAKS", "SOAPS", "SOARE", "SOARS", "SOAVE", "SOBAS", "SOCAS", "SOCES", "SOCKO", + "SOCKS", "SOCLE", "SODAS", "SODDY", "SODIC", "SODOM", "SOFAR", "SOFAS", "SOFTA", "SOFTS", "SOFTY", "SOGER", + "SOHUR", "SOILS", "SOILY", "SOJAS", "SOJUS", "SOKAH", "SOKEN", "SOKES", "SOKOL", "SOLAH", "SOLAN", "SOLAS", + "SOLDE", "SOLDI", "SOLDO", "SOLDS", "SOLED", "SOLEI", "SOLER", "SOLES", "SOLON", "SOLOS", "SOLUM", "SOLUS", + "SOMAN", "SOMAS", "SONCE", "SONDE", "SONES", "SONGS", "SONLY", "SONNE", "SONNY", "SONSE", "SONSY", "SOOEY", + "SOOKS", "SOOKY", "SOOLE", "SOOLS", "SOOMS", "SOOPS", "SOOTE", "SOOTS", "SOPHS", "SOPHY", "SOPOR", "SOPPY", + "SOPRA", "SORAL", "SORAS", "SORBO", "SORBS", "SORDA", "SORDO", "SORDS", "SORED", "SOREE", "SOREL", "SORER", + "SORES", "SOREX", "SORGO", "SORNS", "SORRA", "SORTA", "SORTS", "SORUS", "SOTHS", "SOTOL", "SOUCE", "SOUCT", + "SOUGH", "SOUKS", "SOULS", "SOUMS", "SOUPS", "SOUPY", "SOURS", "SOUSE", "SOUTS", "SOWAR", "SOWCE", "SOWED", + "SOWFF", "SOWFS", "SOWLE", "SOWLS", "SOWMS", "SOWND", "SOWNE", "SOWPS", "SOWSE", "SOWTH", "SOYAS", "SOYLE", + "SOYUZ", "SOZIN", "SPACY", "SPADO", "SPAED", "SPAER", "SPAES", "SPAGS", "SPAHI", "SPAIL", "SPAIN", "SPAIT", + "SPAKE", "SPALD", "SPALE", "SPALL", "SPALT", "SPAMS", "SPANE", "SPANG", "SPANS", "SPARD", "SPARS", "SPART", + "SPATE", "SPATS", "SPAUL", "SPAWL", "SPAWS", "SPAYD", "SPAYS", "SPAZA", "SPAZZ", "SPEAL", "SPEAN", "SPEAT", + "SPECS", "SPECT", "SPEEL", "SPEER", "SPEIL", "SPEIR", "SPEKS", "SPELD", "SPELK", "SPEOS", "SPETS", "SPEUG", + "SPEWS", "SPEWY", "SPIAL", "SPICA", "SPICK", "SPICS", "SPIDE", "SPIER", "SPIES", "SPIFF", "SPIFS", "SPIKS", + "SPILE", "SPIMS", "SPINA", "SPINK", "SPINS", "SPIRT", "SPIRY", "SPITS", "SPITZ", "SPIVS", "SPLAY", "SPLOG", + "SPODE", "SPODS", "SPOOM", "SPOOR", "SPOOT", "SPORK", "SPOSH", "SPOTS", "SPRAD", "SPRAG", "SPRAT", "SPRED", + "SPREW", "SPRIT", "SPROD", "SPROG", "SPRUE", "SPRUG", "SPUDS", "SPUED", "SPUER", "SPUES", "SPUGS", "SPULE", + "SPUME", "SPUMY", "SPURS", "SPUTA", "SPYAL", "SPYRE", "SQUAB", "SQUAW", "SQUEG", "SQUID", "SQUIT", "SQUIZ", + "STABS", "STADE", "STAGS", "STAGY", "STAIG", "STANE", "STANG", "STAPH", "STAPS", "STARN", "STARR", "STARS", + "STATS", "STAUN", "STAWS", "STAYS", "STEAN", "STEAR", "STEDD", "STEDE", "STEDS", "STEEK", "STEEM", "STEEN", + "STEIL", "STELA", "STELE", "STELL", "STEME", "STEMS", "STEND", "STENO", "STENS", "STENT", "STEPS", "STEPT", + "STERE", "STETS", "STEWS", "STEWY", "STEYS", "STICH", "STIED", "STIES", "STILB", "STILE", "STIME", "STIMS", + "STIMY", "STIPA", "STIPE", "STIRE", "STIRK", "STIRP", "STIRS", "STIVE", "STIVY", "STOAE", "STOAI", "STOAS", + "STOAT", "STOBS", "STOEP", "STOGY", "STOIT", "STOLN", "STOMA", "STOND", "STONG", "STONK", "STONN", "STOOK", + "STOOR", "STOPE", "STOPS", "STOPT", "STOSS", "STOTS", "STOTT", "STOUN", "STOUP", "STOUR", "STOWN", "STOWP", + "STOWS", "STRAD", "STRAE", "STRAG", "STRAK", "STREP", "STREW", "STRIA", "STRIG", "STRIM", "STROP", "STROW", + "STROY", "STRUM", "STUBS", "STUDE", "STUDS", "STULL", "STULM", "STUMM", "STUMS", "STUNS", "STUPA", "STUPE", + "STURE", "STURT", "STYED", "STYES", "STYLI", "STYLO", "STYME", "STYMY", "STYRE", "STYTE", "SUBAH", "SUBAS", + "SUBBY", "SUBER", "SUBHA", "SUCCI", "SUCKS", "SUCKY", "SUCRE", "SUDDS", "SUDOR", "SUDSY", "SUEDE", "SUENT", + "SUERS", "SUETE", "SUETS", "SUETY", "SUGAN", "SUGHS", "SUGOS", "SUHUR", "SUIDS", "SUINT", "SUITS", "SUJEE", + "SUKHS", "SUKUK", "SULCI", "SULFA", "SULFO", "SULKS", "SULPH", "SULUS", "SUMIS", "SUMMA", "SUMOS", "SUMPH", + "SUMPS", "SUNIS", "SUNKS", "SUNNA", "SUNNS", "SUNUP", "SUPES", "SUPRA", "SURAH", "SURAL", "SURAS", "SURAT", + "SURDS", "SURED", "SURES", "SURFS", "SURFY", "SURGY", "SURRA", "SUSED", "SUSES", "SUSUS", "SUTOR", "SUTRA", + "SUTTA", "SWABS", "SWACK", "SWADS", "SWAGE", "SWAGS", "SWAIL", "SWAIN", "SWALE", "SWALY", "SWAMY", "SWANG", + "SWANK", "SWANS", "SWAPS", "SWAPT", "SWARD", "SWARE", "SWARF", "SWART", "SWATS", "SWAYL", "SWAYS", "SWEAL", + "SWEDE", "SWEED", "SWEEL", "SWEER", "SWEES", "SWEIR", "SWELT", "SWERF", "SWEYS", "SWIES", "SWIGS", "SWILE", + "SWIMS", "SWINK", "SWIPE", "SWIRE", "SWISS", "SWITH", "SWITS", "SWIVE", "SWIZZ", "SWOBS", "SWOLE", "SWOLN", + "SWOPS", "SWOPT", "SWOTS", "SWOUN", "SYBBE", "SYBIL", "SYBOE", "SYBOW", "SYCEE", "SYCES", "SYCON", "SYENS", + "SYKER", "SYKES", "SYLIS", "SYLPH", "SYLVA", "SYMAR", "SYNCH", "SYNCS", "SYNDS", "SYNED", "SYNES", "SYNTH", + "SYPED", "SYPES", "SYPHS", "SYRAH", "SYREN", "SYSOP", "SYTHE", "SYVER", "TAALS", "TAATA", "TABER", "TABES", + "TABID", "TABIS", "TABLA", "TABOR", "TABUN", "TABUS", "TACAN", "TACES", "TACET", "TACHE", "TACHO", "TACHS", + "TACKS", "TACOS", "TACTS", "TAELS", "TAFIA", "TAGGY", "TAGMA", "TAHAS", "TAHRS", "TAIGA", "TAIGS", "TAIKO", + "TAILS", "TAINS", "TAIRA", "TAISH", "TAITS", "TAJES", "TAKAS", "TAKES", "TAKHI", "TAKIN", "TAKIS", "TAKKY", + "TALAK", "TALAQ", "TALAR", "TALAS", "TALCS", "TALCY", "TALEA", "TALER", "TALES", "TALKS", "TALKY", "TALLS", + "TALMA", "TALPA", "TALUK", "TALUS", "TAMAL", "TAMED", "TAMES", "TAMIN", "TAMIS", "TAMMY", "TAMPS", "TANAS", + "TANGA", "TANGI", "TANGS", "TANHS", "TANKA", "TANKS", "TANKY", "TANNA", "TANSY", "TANTI", "TANTO", "TANTY", + "TAPAS", "TAPED", "TAPEN", "TAPES", "TAPET", "TAPIS", "TAPPA", "TAPUS", "TARAS", "TARDO", "TARED", "TARES", + "TARGA", "TARGE", "TARNS", "TAROC", "TAROK", "TAROS", "TARPS", "TARRE", "TARRY", "TARSI", "TARTS", "TARTY", + "TASAR", "TASED", "TASER", "TASES", "TASKS", "TASSA", "TASSE", "TASSO", "TATAR", "TATER", "TATES", "TATHS", + "TATIE", "TATOU", "TATTS", "TATUS", "TAUBE", "TAULD", "TAUON", "TAUPE", "TAUTS", "TAVAH", "TAVAS", "TAVER", + "TAWAI", "TAWAS", "TAWED", "TAWER", "TAWIE", "TAWSE", "TAWTS", "TAXED", "TAXER", "TAXES", "TAXIS", "TAXOL", + "TAXON", "TAXOR", "TAXUS", "TAYRA", "TAZZA", "TAZZE", "TEADE", "TEADS", "TEAED", "TEAKS", "TEALS", "TEAMS", + "TEARS", "TEATS", "TEAZE", "TECHS", "TECHY", "TECTA", "TEELS", "TEEMS", "TEEND", "TEENE", "TEENS", "TEENY", + "TEERS", "TEFFS", "TEGGS", "TEGUA", "TEGUS", "TEHRS", "TEIID", "TEILS", "TEIND", "TEINS", "TELAE", "TELCO", + "TELES", "TELEX", "TELIA", "TELIC", "TELLS", "TELLY", "TELOI", "TELOS", "TEMED", "TEMES", "TEMPI", "TEMPS", + "TEMPT", "TEMSE", "TENCH", "TENDS", "TENDU", "TENES", "TENGE", "TENIA", "TENNE", "TENNO", "TENNY", "TENON", + "TENTS", "TENTY", "TENUE", "TEPAL", "TEPAS", "TEPOY", "TERAI", "TERAS", "TERCE", "TEREK", "TERES", "TERFE", + "TERFS", "TERGA", "TERMS", "TERNE", "TERNS", "TERRY", "TERTS", "TESLA", "TESTA", "TESTE", "TESTS", "TETES", + "TETHS", "TETRA", "TETRI", "TEUCH", "TEUGH", "TEWED", "TEWEL", "TEWIT", "TEXAS", "TEXES", "TEXTS", "THACK", + "THAGI", "THAIM", "THALE", "THALI", "THANA", "THANE", "THANG", "THANS", "THANX", "THARM", "THARS", "THAWS", + "THAWY", "THEBE", "THECA", "THEED", "THEEK", "THEES", "THEGN", "THEIC", "THEIN", "THELF", "THEMA", "THENS", + "THEOW", "THERM", "THESP", "THETE", "THEWS", "THEWY", "THIGS", "THILK", "THILL", "THINE", "THINS", "THIOL", + "THIRL", "THOFT", "THOLE", "THOLI", "THORO", "THORP", "THOUS", "THOWL", "THRAE", "THRAW", "THRID", "THRIP", + "THROE", "THUDS", "THUGS", "THUJA", "THUNK", "THURL", "THUYA", "THYMI", "THYMY", "TIANS", "TIARS", "TICAL", + "TICCA", "TICED", "TICES", "TICHY", "TICKS", "TICKY", "TIDDY", "TIDED", "TIDES", "TIERS", "TIFFS", "TIFOS", + "TIFTS", "TIGES", "TIGON", "TIKAS", "TIKES", "TIKIS", "TIKKA", "TILAK", "TILED", "TILER", "TILES", "TILLS", + "TILLY", "TILTH", "TILTS", "TIMBO", "TIMED", "TIMES", "TIMON", "TIMPS", "TINAS", "TINCT", "TINDS", "TINEA", + "TINED", "TINES", "TINGE", "TINGS", "TINKS", "TINNY", "TINTS", "TINTY", "TIPIS", "TIPPY", "TIRED", "TIRES", + "TIRLS", "TIROS", "TIRRS", "TITCH", "TITER", "TITIS", "TITRE", "TITTY", "TITUP", "TIYIN", "TIYNS", "TIZES", + "TIZZY", "TOADS", "TOADY", "TOAZE", "TOCKS", "TOCKY", "TOCOS", "TODDE", "TOEAS", "TOFFS", "TOFFY", "TOFTS", + "TOFUS", "TOGAE", "TOGAS", "TOGED", "TOGES", "TOGUE", "TOHOS", "TOILE", "TOILS", "TOING", "TOISE", "TOITS", + "TOKAY", "TOKED", "TOKER", "TOKES", "TOKOS", "TOLAN", "TOLAR", "TOLAS", "TOLED", "TOLES", "TOLLS", "TOLLY", + "TOLTS", "TOLUS", "TOLYL", "TOMAN", "TOMBS", "TOMES", "TOMIA", "TOMMY", "TOMOS", "TONDI", "TONDO", "TONED", + "TONER", "TONES", "TONEY", "TONGS", "TONKA", "TONKS", "TONNE", "TONUS", "TOOLS", "TOOMS", "TOONS", "TOOTS", + "TOPED", "TOPEE", "TOPEK", "TOPER", "TOPES", "TOPHE", "TOPHI", "TOPHS", "TOPIS", "TOPOI", "TOPOS", "TOPPY", + "TOQUE", "TORAH", "TORAN", "TORAS", "TORCS", "TORES", "TORIC", "TORII", "TOROS", "TOROT", "TORRS", "TORSE", + "TORSI", "TORSK", "TORTA", "TORTE", "TORTS", "TOSAS", "TOSED", "TOSES", "TOSHY", "TOSSY", "TOTED", "TOTER", + "TOTES", "TOTTY", "TOUKS", "TOUNS", "TOURS", "TOUSE", "TOUSY", "TOUTS", "TOUZE", "TOUZY", "TOWED", "TOWIE", + "TOWNS", "TOWNY", "TOWSE", "TOWSY", "TOWTS", "TOWZE", "TOWZY", "TOYED", "TOYER", "TOYON", "TOYOS", "TOZED", + "TOZES", "TOZIE", "TRABS", "TRADS", "TRAGI", "TRAIK", "TRAMS", "TRANK", "TRANQ", "TRANS", "TRANT", "TRAPE", + "TRAPS", "TRAPT", "TRASS", "TRATS", "TRATT", "TRAVE", "TRAYF", "TRAYS", "TRECK", "TREED", "TREEN", "TREES", + "TREFA", "TREIF", "TREKS", "TREMA", "TREMS", "TRESS", "TREST", "TRETS", "TREWS", "TREYF", "TREYS", "TRIAC", + "TRIDE", "TRIER", "TRIES", "TRIFF", "TRIGO", "TRIGS", "TRIKE", "TRILD", "TRILL", "TRIMS", "TRINE", "TRINS", + "TRIOL", "TRIOR", "TRIOS", "TRIPS", "TRIPY", "TRIST", "TROAD", "TROAK", "TROAT", "TROCK", "TRODE", "TRODS", + "TROGS", "TROIS", "TROKE", "TROMP", "TRONA", "TRONC", "TRONE", "TRONK", "TRONS", "TROOZ", "TROTH", "TROTS", + "TROWS", "TROYS", "TRUED", "TRUES", "TRUGO", "TRUGS", "TRULL", "TRYER", "TRYKE", "TRYMA", "TRYPS", "TSADE", + "TSADI", "TSARS", "TSKED", "TSUBA", "TSUBO", "TUANS", "TUART", "TUATH", "TUBAE", "TUBAR", "TUBAS", "TUBBY", + "TUBED", "TUBES", "TUCKS", "TUFAS", "TUFFE", "TUFFS", "TUFTS", "TUFTY", "TUGRA", "TUILE", "TUINA", "TUISM", + "TUKTU", "TULES", "TULPA", "TULSI", "TUMID", "TUMMY", "TUMPS", "TUMPY", "TUNAS", "TUNDS", "TUNED", "TUNER", + "TUNES", "TUNGS", "TUNNY", "TUPEK", "TUPIK", "TUPLE", "TUQUE", "TURDS", "TURFS", "TURFY", "TURKS", "TURME", + "TURMS", "TURNS", "TURNT", "TURPS", "TURRS", "TUSHY", "TUSKS", "TUSKY", "TUTEE", "TUTTI", "TUTTY", "TUTUS", + "TUXES", "TUYER", "TWAES", "TWAIN", "TWALS", "TWANK", "TWATS", "TWAYS", "TWEEL", "TWEEN", "TWEEP", "TWEER", + "TWERK", "TWERP", "TWIER", "TWIGS", "TWILL", "TWILT", "TWINK", "TWINS", "TWINY", "TWIRE", "TWIRP", "TWITE", + "TWITS", "TWOER", "TWYER", "TYEES", "TYERS", "TYIYN", "TYKES", "TYLER", "TYMPS", "TYNDE", "TYNED", "TYNES", + "TYPAL", "TYPED", "TYPES", "TYPEY", "TYPIC", "TYPOS", "TYPPS", "TYPTO", "TYRAN", "TYRED", "TYRES", "TYROS", + "TYTHE", "TZARS", "UDALS", "UDONS", "UGALI", "UGGED", "UHLAN", "UHURU", "UKASE", "ULAMA", "ULANS", "ULEMA", + "ULMIN", "ULNAD", "ULNAE", "ULNAR", "ULNAS", "ULPAN", "ULVAS", "ULYIE", "ULZIE", "UMAMI", "UMBEL", "UMBER", + "UMBLE", "UMBOS", "UMBRE", "UMIAC", "UMIAK", "UMIAQ", "UMMAH", "UMMAS", "UMMED", "UMPED", "UMPHS", "UMPIE", + "UMPTY", "UMRAH", "UMRAS", "UNAIS", "UNAPT", "UNARM", "UNARY", "UNAUS", "UNBAG", "UNBAN", "UNBAR", "UNBED", + "UNBID", "UNBOX", "UNCAP", "UNCES", "UNCIA", "UNCOS", "UNCOY", "UNCUS", "UNDAM", "UNDEE", "UNDOS", "UNDUG", + "UNETH", "UNFIX", "UNGAG", "UNGET", "UNGOD", "UNGOT", "UNGUM", "UNHAT", "UNHIP", "UNICA", "UNITS", "UNJAM", + "UNKED", "UNKET", "UNKID", "UNLAW", "UNLAY", "UNLED", "UNLET", "UNLID", "UNMAN", "UNMEW", "UNMIX", "UNPAY", + "UNPEG", "UNPEN", "UNPIN", "UNRED", "UNRID", "UNRIG", "UNRIP", "UNSAW", "UNSAY", "UNSEE", "UNSEW", "UNSEX", + "UNSOD", "UNTAX", "UNTIN", "UNWET", "UNWIT", "UNWON", "UPBOW", "UPBYE", "UPDOS", "UPDRY", "UPEND", "UPJET", + "UPLAY", "UPLED", "UPLIT", "UPPED", "UPRAN", "UPRUN", "UPSEE", "UPSEY", "UPTAK", "UPTER", "UPTIE", "URAEI", + "URALI", "URAOS", "URARE", "URARI", "URASE", "URATE", "URBEX", "URBIA", "URDEE", "UREAL", "UREAS", "UREDO", + "UREIC", "URENA", "URENT", "URGED", "URGER", "URGES", "URIAL", "URITE", "URMAN", "URNAL", "URNED", "URPED", + "URSAE", "URSID", "URSON", "URUBU", "URVAS", "USERS", "USNEA", "USQUE", "USURE", "USURY", "UTERI", "UVEAL", + "UVEAS", "UVULA", "VACUA", "VADED", "VADES", "VAGAL", "VAGUS", "VAILS", "VAIRE", "VAIRS", "VAIRY", "VAKAS", + "VAKIL", "VALES", "VALIS", "VALSE", "VAMPS", "VAMPY", "VANDA", "VANED", "VANES", "VANGS", "VANTS", "VAPED", + "VAPER", "VAPES", "VARAN", "VARAS", "VARDY", "VAREC", "VARES", "VARIA", "VARIX", "VARNA", "VARUS", "VARVE", + "VASAL", "VASES", "VASTS", "VASTY", "VATIC", "VATUS", "VAUCH", "VAUTE", "VAUTS", "VAWTE", "VAXES", "VEALE", + "VEALS", "VEALY", "VEENA", "VEEPS", "VEERS", "VEERY", "VEGAS", "VEGES", "VEGIE", "VEGOS", "VEHME", "VEILS", + "VEILY", "VEINS", "VEINY", "VELAR", "VELDS", "VELDT", "VELES", "VELLS", "VELUM", "VENAE", "VENAL", "VENDS", + "VENDU", "VENEY", "VENGE", "VENIN", "VENTS", "VENUS", "VERBS", "VERRA", "VERRY", "VERST", "VERTS", "VERTU", + "VESPA", "VESTA", "VESTS", "VETCH", "VEXED", "VEXER", "VEXES", "VEXIL", "VEZIR", "VIALS", "VIAND", "VIBES", + "VIBEX", "VIBEY", "VICED", "VICES", "VICHY", "VIERS", "VIEWS", "VIEWY", "VIFDA", "VIFFS", "VIGAS", "VIGIA", + "VILDE", "VILER", "VILLI", "VILLS", "VIMEN", "VINAL", "VINAS", "VINCA", "VINED", "VINER", "VINES", "VINEW", + "VINIC", "VINOS", "VINTS", "VIOLD", "VIOLS", "VIRED", "VIREO", "VIRES", "VIRGA", "VIRGE", "VIRID", "VIRLS", + "VIRTU", "VISAS", "VISED", "VISES", "VISIE", "VISNE", "VISON", "VISTO", "VITAE", "VITAS", "VITEX", "VITRO", + "VITTA", "VIVAS", "VIVAT", "VIVDA", "VIVER", "VIVES", "VIZIR", "VIZOR", "VLEIS", "VLIES", "VLOGS", "VOARS", + "VOCAB", "VOCES", "VODDY", "VODOU", "VODUN", "VOEMA", "VOGIE", "VOIDS", "VOILE", "VOIPS", "VOLAE", "VOLAR", + "VOLED", "VOLES", "VOLET", "VOLKS", "VOLTA", "VOLTE", "VOLTI", "VOLTS", "VOLVA", "VOLVE", "VOMER", "VOTED", + "VOTES", "VOUGE", "VOULU", "VOWED", "VOWER", "VOXEL", "VOZHD", "VRAIC", "VRILS", "VROOM", "VROUS", "VROUW", + "VROWS", "VUGGS", "VUGGY", "VUGHS", "VUGHY", "VULGO", "VULNS", "VULVA", "VUTTY", "WAACS", "WACKE", "WACKO", + "WACKS", "WADDS", "WADDY", "WADED", "WADER", "WADES", "WADGE", "WADIS", "WADTS", "WAFFS", "WAFTS", "WAGED", + "WAGES", "WAGGA", "WAGYU", "WAHOO", "WAIDE", "WAIFS", "WAIFT", "WAILS", "WAINS", "WAIRS", "WAITE", "WAITS", + "WAKAS", "WAKED", "WAKEN", "WAKER", "WAKES", "WAKFS", "WALDO", "WALDS", "WALED", "WALER", "WALES", "WALIE", + "WALIS", "WALKS", "WALLA", "WALLS", "WALLY", "WALTY", "WAMED", "WAMES", "WAMUS", "WANDS", "WANED", "WANES", + "WANEY", "WANGS", "WANKS", "WANKY", "WANLE", "WANLY", "WANNA", "WANTS", "WANTY", "WANZE", "WAQFS", "WARBS", + "WARBY", "WARDS", "WARED", "WARES", "WAREZ", "WARKS", "WARMS", "WARNS", "WARPS", "WARRE", "WARST", "WARTS", + "WASES", "WASHY", "WASMS", "WASPS", "WASPY", "WASTS", "WATAP", "WATTS", "WAUFF", "WAUGH", "WAUKS", "WAULK", + "WAULS", "WAURS", "WAVED", "WAVES", "WAVEY", "WAWAS", "WAWES", "WAWLS", "WAXED", "WAXER", "WAXES", "WAYED", + "WAZIR", "WAZOO", "WEALD", "WEALS", "WEAMB", "WEANS", "WEARS", "WEBBY", "WEBER", "WECHT", "WEDEL", "WEDGY", + "WEEDS", "WEEKE", "WEEKS", "WEELS", "WEEMS", "WEENS", "WEENY", "WEEPS", "WEEPY", "WEEST", "WEETE", "WEETS", + "WEFTE", "WEFTS", "WEIDS", "WEILS", "WEIRS", "WEISE", "WEIZE", "WEKAS", "WELDS", "WELKE", "WELKS", "WELKT", + "WELLS", "WELLY", "WELTS", "WEMBS", "WENCH", "WENDS", "WENGE", "WENNY", "WENTS", "WEROS", "WERSH", "WESTS", + "WETAS", "WETLY", "WEXED", "WEXES", "WHAMO", "WHAMS", "WHANG", "WHAPS", "WHARE", "WHATA", "WHATS", "WHAUP", + "WHAUR", "WHEAL", "WHEAR", "WHEEN", "WHEEP", "WHEFT", "WHELK", "WHELM", "WHENS", "WHETS", "WHEWS", "WHEYS", + "WHIDS", "WHIFT", "WHIGS", "WHILK", "WHIMS", "WHINS", "WHIOS", "WHIPS", "WHIPT", "WHIRR", "WHIRS", "WHISH", + "WHISS", "WHIST", "WHITS", "WHITY", "WHIZZ", "WHOMP", "WHOOF", "WHOOT", "WHOPS", "WHORE", "WHORL", "WHORT", + "WHOSO", "WHOWS", "WHUMP", "WHUPS", "WHYDA", "WICCA", "WICKS", "WICKY", "WIDDY", "WIDES", "WIELS", "WIFED", + "WIFES", "WIFEY", "WIFIE", "WIFTY", "WIGAN", "WIGGA", "WIGGY", "WIKIS", "WILCO", "WILDS", "WILED", "WILES", + "WILGA", "WILIS", "WILJA", "WILLS", "WILTS", "WIMPS", "WINDS", "WINED", "WINES", "WINEY", "WINGE", "WINGS", + "WINGY", "WINKS", "WINNA", "WINNS", "WINOS", "WINZE", "WIPED", "WIPER", "WIPES", "WIRED", "WIRER", "WIRES", + "WIRRA", "WISED", "WISES", "WISHA", "WISHT", "WISPS", "WISTS", "WITAN", "WITED", "WITES", "WITHE", "WITHS", + "WITHY", "WIVED", "WIVER", "WIVES", "WIZEN", "WIZES", "WOADS", "WOALD", "WOCKS", "WODGE", "WOFUL", "WOJUS", + "WOKER", "WOKKA", "WOLDS", "WOLFS", "WOLLY", "WOLVE", "WOMBS", "WOMBY", "WOMYN", "WONGA", "WONGI", "WONKS", + "WONKY", "WONTS", "WOODS", "WOOED", "WOOFS", "WOOFY", "WOOLD", "WOOLS", "WOONS", "WOOPS", "WOOPY", "WOOSE", + "WOOSH", "WOOTZ", "WORDS", "WORKS", "WORMS", "WORMY", "WORTS", "WOWED", "WOWEE", "WOXEN", "WRANG", "WRAPS", + "WRAPT", "WRAST", "WRATE", "WRAWL", "WRENS", "WRICK", "WRIED", "WRIER", "WRIES", "WRITS", "WROKE", "WROOT", + "WROTH", "WRYER", "WUDDY", "WUDUS", "WULLS", "WURST", "WUSES", "WUSHU", "WUSSY", "WUXIA", "WYLED", "WYLES", + "WYNDS", "WYNNS", "WYTED", "WYTES", "XEBEC", "XENIA", "XENIC", "XENON", "XERIC", "XEROX", "XERUS", "XOANA", + "XRAYS", "XYLAN", "XYLEM", "XYLIC", "XYLOL", "XYLYL", "XYSTI", "XYSTS", "YAARS", "YABAS", "YABBA", "YABBY", + "YACCA", "YACKA", "YACKS", "YAFFS", "YAGER", "YAGES", "YAGIS", "YAHOO", "YAIRD", "YAKKA", "YAKOW", "YALES", + "YAMEN", "YAMPY", "YAMUN", "YANGS", "YANKS", "YAPOK", "YAPON", "YAPPS", "YAPPY", "YARAK", "YARCO", "YARDS", + "YARER", "YARFA", "YARKS", "YARNS", "YARRS", "YARTA", "YARTO", "YATES", "YAUDS", "YAULD", "YAUPS", "YAWED", + "YAWEY", "YAWLS", "YAWNS", "YAWNY", "YAWPS", "YBORE", "YCLAD", "YCLED", "YCOND", "YDRAD", "YDRED", "YEADS", + "YEAHS", "YEALM", "YEANS", "YEARD", "YEARS", "YECCH", "YECHS", "YECHY", "YEDES", "YEEDS", "YEESH", "YEGGS", + "YELKS", "YELLS", "YELMS", "YELPS", "YELTS", "YENTA", "YENTE", "YERBA", "YERDS", "YERKS", "YESES", "YESKS", + "YESTS", "YESTY", "YETIS", "YETTS", "YEUKS", "YEUKY", "YEVEN", "YEVES", "YEWEN", "YEXED", "YEXES", "YFERE", + "YIKED", "YIKES", "YILLS", "YINCE", "YIPES", "YIPPY", "YIRDS", "YIRKS", "YIRRS", "YIRTH", "YITES", "YITIE", + "YLEMS", "YLIKE", "YLKES", "YMOLT", "YMPES", "YOBBO", "YOBBY", "YOCKS", "YODEL", "YODHS", "YODLE", "YOGAS", + "YOGEE", "YOGHS", "YOGIC", "YOGIN", "YOGIS", "YOICK", "YOJAN", "YOKED", "YOKEL", "YOKER", "YOKES", "YOKUL", + "YOLKS", "YOLKY", "YOMIM", "YOMPS", "YONIC", "YONIS", "YONKS", "YOOFS", "YOOPS", "YORES", "YORKS", "YORPS", + "YOUKS", "YOURN", "YOURS", "YOURT", "YOUSE", "YOWED", "YOWES", "YOWIE", "YOWLS", "YOWZA", "YRAPT", "YRENT", + "YRIVD", "YRNEH", "YSAME", "YTOST", "YUANS", "YUCAS", "YUCCA", "YUCCH", "YUCKO", "YUCKS", "YUCKY", "YUFTS", + "YUGAS", "YUKED", "YUKES", "YUKKY", "YUKOS", "YULAN", "YULES", "YUMMO", "YUMMY", "YUMPS", "YUPON", "YUPPY", + "YURTA", "YURTS", "YUZUS", "ZABRA", "ZACKS", "ZAIDA", "ZAIDY", "ZAIRE", "ZAKAT", "ZAMAN", "ZAMBO", "ZAMIA", + "ZANJA", "ZANTE", "ZANZA", "ZANZE", "ZAPPY", "ZARFS", "ZARIS", "ZATIS", "ZAXES", "ZAYIN", "ZAZEN", "ZEALS", + "ZEBEC", "ZEBUB", "ZEBUS", "ZEDAS", "ZEINS", "ZENDO", "ZERDA", "ZERKS", "ZEROS", "ZESTS", "ZETAS", "ZEXES", + "ZEZES", "ZHOMO", "ZIBET", "ZIFFS", "ZIGAN", "ZILAS", "ZILCH", "ZILLA", "ZILLS", "ZIMBI", "ZIMBS", "ZINCO", + "ZINCS", "ZINCY", "ZINEB", "ZINES", "ZINGS", "ZINGY", "ZINKE", "ZINKY", "ZIPPO", "ZIPPY", "ZIRAM", "ZITIS", + "ZIZEL", "ZIZIT", "ZLOTE", "ZLOTY", "ZOAEA", "ZOBOS", "ZOBUS", "ZOCCO", "ZOEAE", "ZOEAL", "ZOEAS", "ZOISM", + "ZOIST", "ZOMBI", "ZONAE", "ZONDA", "ZONED", "ZONER", "ZONES", "ZONKS", "ZOOEA", "ZOOEY", "ZOOID", "ZOOKS", + "ZOOMS", "ZOONS", "ZOOTY", "ZOPPA", "ZOPPO", "ZORIL", "ZORIS", "ZORRO", "ZOUKS", "ZOWEE", "ZOWIE", "ZULUS", + "ZUPAN", "ZUPAS", "ZUPPA", "ZURFS", "ZUZIM", "ZYGAL", "ZYGON", "ZYMES", "ZYMIC", +] + +alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] + +def most_used_letters(words=valid_list, letters=alphabet, print_result=True): + ''' + Outputs how many times each letter is used in the words array. + ''' + use_each_letter = {} + for i in letters: + count = 0 + for word in words: + for letter in word: + if i.upper() == letter.upper(): + count+=1 + break + use_each_letter[i] = count + use_each_letter = dict(sorted(use_each_letter.items(), key=lambda item: item[1], reverse=True)) + if print_result: + print("Letter | Usage | Percent") + print("----------------------------") + for k in use_each_letter: + print(f"{k.upper()} | {use_each_letter[k]:5} | {round((100 * use_each_letter[k]) / len(words)):2}%") + return use_each_letter + + +def list_of_valid_words(letters, words=valid_list): + ''' + Outputs the array of valid words that can be made with the combination of letters. + ''' + letters = sorted(letters) + for i, letter in enumerate(letters): # Force all letters to be capitalized + letters[i] = letter.upper() + valid_words = [] + for word in words: + valid_word = True + for letter in word: + if letter.upper() not in letters: + valid_word = False + break + if valid_word and word not in valid_words: + valid_words.append(word) + return valid_words + + +def rearrange_words_by_uniqueness(words): + unique = [word for word in words if len(word) == len(set(word))] + duplicates = [word for word in words if len(word) != len(set(word))] + return unique + duplicates, len(unique) + +def capitalize_all_and_remove_duplicates(arr): + for i,word in enumerate(arr): + arr[i] = word.upper() + result = [] + for word in arr: + if word not in result: + result.append(word) + return arr + + +def clean_chars(string): + # D looks bad on the watch when d does not. + string = string.replace('D', 'd') + return string + + +def print_valid_words(letters=alphabet): + ''' + Prints the array of valid words that the wordle_face.c can use + ''' + print("#ifndef WORDLE_FACE_DICT_H_") + print("#define WORDLE_FACE_DICT_H_") + + print("\n#ifndef WORDLE_LENGTH") + print("#define WORDLE_LENGTH 5") + print("#endif") + + print("\n#ifndef WORDLE_USE_RANDOM_GUESS") + print("#define WORDLE_USE_RANDOM_GUESS 2") + print("#endif\n") + + items_per_row = 9 + top_words_percent = 3 + valid_words = list_of_valid_words(letters, valid_list) + valid_words = capitalize_all_and_remove_duplicates(valid_words) + random.shuffle(valid_words) + # Just in case the watch's random function is too pseudo, better to shuffle th elist so it's less likely to always have the same starting letter + valid_words, num_uniq = rearrange_words_by_uniqueness(valid_words) + best_words = list(best_first_word(letters=letters, print_result=False).keys()) + num_best_words = round(len(valid_words) * top_words_percent / 100) + for i in range(num_best_words, 0, -1): + valid_words.insert(0, valid_words.pop(valid_words.index(best_words[i-1]))) + + print("static const char _valid_letters[] = {", end='') + letters = sorted(letters) + for letter in letters[:-1]: + print(f"'{clean_chars(letter)}', ", end='') + print(f"'{letters[-1]}'" + "};") + print("") + print(f"// From: {source_link}") + print(f"// Number of words found: {len(valid_words)}") + print("static const char _valid_words[][WORDLE_LENGTH + 1] = {") + i = 0 + while i < len(valid_words): + print(" ", end='') + for _ in range(min(items_per_row, len(valid_words)-i)): + print(f'"{clean_chars(valid_words[i])}", ', end='') + i+=1 + print('') + possible_words = list_of_valid_words(letters, possible_list) + possible_words = [word for word in possible_words if word not in valid_list] + possible_words = capitalize_all_and_remove_duplicates(possible_words) + print("};") + print("\n// These are words that'll never be used, but still need to be in the dictionary for guesses.") + print(f"// Number of words found: {len(possible_words)}") + print("static const char _possible_words[][WORDLE_LENGTH + 1] = {") + print("#if !WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES") + i = 0 + while i < len(possible_words): + print(" ", end='') + for j in range(min(items_per_row, len(possible_words)-i)): + print(f'"{clean_chars(possible_words[i])}", ', end='') + i+=1 + print('') + print("#endif") + print("};\n") + + print("#if (WORDLE_USE_RANDOM_GUESS == 3)") + print(f"static const uint16_t _num_random_guess_words = {num_best_words}; // The valid_words array begins with this many words that are considered the top {top_words_percent}% best options.") + print("#elif (WORDLE_USE_RANDOM_GUESS == 2)") + print(f"static const uint16_t _num_random_guess_words = {num_uniq}; // The valid_words array begins with this many words where each letter is different.") + print("#elif (WORDLE_USE_RANDOM_GUESS == 1)") + print("static const uint16_t _num_random_guess_words = _num_words;") + print("#endif") + print("\n#endif // WORDLE_FACE_DICT_H_") + + +def get_sec_val_and_units(seconds): + if seconds < 1: + return f"{round(seconds * 1000)} ms" + hours = int(seconds // 3600) + minutes = int((seconds % 3600) // 60) + secs = int(seconds % 60) + if hours > 0: + return f"{hours} hr {minutes} min {secs} sec" + elif minutes > 0: + return f"{minutes} min {secs} sec" + else: + return f"{secs} sec" + + +def txt_of_all_letter_combos(num_letters_in_set, words=valid_list, min_letter_occ_percent_to_consider=10, txt_out=True): + ''' + Creates a txt file that shows every combination of letters and how many words + their combo can make. + num_letters_in_set - How many letters should be in each combination + ''' + num_status_prints = 100 + dict_combos_counts = {} + print_iter = 0 + prev = time.time() + start = prev + letters_to_ignore = ['D','M'] # Don't diplay well on the watch + letter_usage = most_used_letters(words=words, print_result=False) + for letter in letter_usage: + if (100 * letter_usage[letter])/len(words) < min_letter_occ_percent_to_consider: + letters_to_ignore.append(letter) + valid_letters = [item for item in alphabet if item not in letters_to_ignore] + num_letters_in_set = min(num_letters_in_set, len(valid_letters)) + print(f"Finding all {num_letters_in_set} letter combinations with the following letters: {valid_letters}") + all_combos = list(itertools.combinations(valid_letters, num_letters_in_set)) + len_all_combos = len(all_combos) + to_print = max(1, int(len_all_combos/ num_status_prints)) + print(f"Amount of Combos: {len_all_combos}") + estimated_prints = round(len_all_combos / to_print) + for i, letters in enumerate(all_combos): + letters = sorted(letters) + dict_combos_counts[repr(letters)] = len(list_of_valid_words(letters, words=words)) + print_iter+=1 + if print_iter >= to_print: + curr = time.time() + delta = curr - prev + time_passed = curr - start + total_time_estimate = delta * estimated_prints + time_left_estimate = (delta * estimated_prints) - time_passed + output = f"Time Passed: {get_sec_val_and_units(time_passed)} | " + output+= f"Amount of time for {to_print} items: {get_sec_val_and_units(delta)} | " + output+= f"Estimate for total: {get_sec_val_and_units(total_time_estimate)} | " + output+= f"items Left {len_all_combos - i} | " + output+= f"Percent Complete {round((100 * i) / len_all_combos)}% | " + output+= f"Estimated Time Left : {get_sec_val_and_units(time_left_estimate)}" + print(output) + prev = curr + print_iter = 0 + dict_combos_counts = dict(sorted(dict_combos_counts.items(), key=lambda item: item[1], reverse=True)) + + most_common_key = next(iter(dict_combos_counts)) + print(f"The Most Common Combo for {num_letters_in_set} letters is: {most_common_key} with {dict_combos_counts[most_common_key]} words.") + # print_valid_words(ast.literal_eval(most_common_key)) # Uncomment to display the text it creates + + if txt_out: + with open('output.txt', 'w') as file: + for key, value in dict_combos_counts.items(): + file.write(f'{key}: {value}\n') + return dict_combos_counts + + +def txt_of_all_letter_combos_differing_sizes(min=9, max=15, num_combos_print=20, words=valid_list): + max_each_count = {} + with open('output.txt', 'w') as file: + for x in range(max, min-1, -1): + dict_combos_counts = txt_of_all_letter_combos(x, words=words, min_letter_occ_percent_to_consider=10, txt_out=False) + file.write(f'{x} Letter Options\n') + for i, key in enumerate(dict_combos_counts): + file.write(f'{key}: {dict_combos_counts[key]}\n') + if i == 0: + max_each_count[x] = dict_combos_counts[key] + if i >= num_combos_print-1: + break + file.write('\n') + print("num_letters, count of words") + for key, item in max_each_count.items(): + print(f"{key}, {item}") + + +def location_of_letters(letters=alphabet, list=valid_list, print_result=True): + letter_location_percentages = {} + if print_result: + print(" 1 2 3 4 5 ") + print("-----------------------------------------") + letters = sorted(letters) + for letter in letters: + location = [0, 0, 0, 0, 0] + for word in list: + for i, char in enumerate(word): + if char.upper() == letter.upper(): + location[i]+=1 + location = [((100 * x) / sum(location)) for x in location] + letter_location_percentages[letter] = location + location_txt = [f"{round(x):2}%" for x in location] + if print_result: + print(f"{letter} : {location_txt}") + return letter_location_percentages + + +def best_first_word(letters=alphabet, list=valid_list, print_result=True, words_to_print=None): + ''' + Word_good has every word with only unique letters as keys and that values are: + 1. Take the usage of every letter, normalize the max to 100 and the min to 0. + 2. Go through each letter in the word and see how often that letter appears in that exact location. + 3. Multiply that occurrance in location with the normalized total usage. + 4. Do this for each letter and add it all together. + + Ex: SLATE + Normalized usage: S=38, L=42, A=79, T=46, E=100 + S in position 1: 55% + L in position 2: 27% + A in position 3: 31% + T in position 4: 19% + E in position 5: 34% + Total = (38*55) + (42*27) + (79*31) + (46*19) + (100*35) = 10047 + ''' + valid_words = list_of_valid_words(letters, list) + letter_usage = most_used_letters(words=list, letters=letters, print_result=False) + a=[[max(letter_usage.values()),1],[min(letter_usage.values()),1]] + b=[100,0] + m,b = numpy.linalg.solve(a,b).tolist() + letter_usage_normalized = {key: ((m * value) + b) for key, value in letter_usage.items()} + loc_letters = location_of_letters(letters=letters, list=list, print_result=False) + word_good = {} + valid_words_unique = [word for word in valid_words if len(word) == len(set(word))] + for word in valid_words_unique: + usage = 0 + for i, char in enumerate(word): + usage += loc_letters[char][i] * letter_usage_normalized[char] + word_good[word] = round(usage) + word_good = {k: v for k, v in sorted(word_good.items(), key=lambda item: item[1], reverse=True)} + if print_result: + print("Word, Usage Value") + print("------------------") + for i,[k,v] in enumerate(word_good.items()): + if words_to_print is not None and i+1 > words_to_print: + break + print(f"{k}, {v}") + return word_good + + +if __name__ == "__main__": + my_letters = ['A', 'C', 'E', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'S', 'T'] + #print(f"{len(list_of_valid_words(my_letters, valid_list))} Words can be made with {my_letters}") + #most_used_letters(letters=my_letters) + #location_of_letters(letters=my_letters) + print_valid_words(my_letters) + #txt_of_all_letter_combos_differing_sizes(max = 16, min=10) + #txt_of_all_letter_combos(14) + #best_first_word(letters=my_letters, print_result=True, words_to_print=10) \ No newline at end of file