MatthewMi11er/mi11er-library

View on GitHub
src/mi11er-library/Security/PasswordGenerator.php

Summary

Maintainability
D
1 day
Test Coverage
<?php
/**
 * The Mi11er Library
 *
 * @package    Mi11er\Library
 * @copyright 2016 Matthew Miller
 * @license MIT
 *
 * The MIT License (MIT)
 * Copyright (c) 2016 Matthew Miller
 *
 * 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.
 */

namespace Mi11er\Library\Security;

use Mi11er\Library\Exception\Security\InvalidSymbolListException;

class PasswordGenerator
{
    const BYTE_LENGTH = 4;
    const MAX_LIST    = 0x7FFFFFFF; //32 bit - safe and more than long enough.
    const MIN_LIST    = 0x2; // if we wanted to generate coin flips?

    private $symbolList = null;
    private $length;
    private $seperator;
    private $bitMask;
    //ref: http://world.std.com/~reinhold/diceware8k.txt
    private $defaultSymbolList                        = [
        "a",      "a&p",    "a's",    "a2",     "a3",     "a4",     "a5",     "a6",     "a7",     "a8",     "a9",
        "aa",     "aaa",    "aaaa",   "aaron",  "ab",     "aba",    "ababa",  "aback",  "abase",  "abash",  "abate",
        "abbas",  "abbe",   "abbey",  "abbot",  "abbott", "abc",    "abe",    "abed",   "abel",   "abet",   "abide",
        "abject", "ablaze", "able",   "abner",  "abo",    "abode",  "abort",  "about",  "above",  "abrade", "abram",
        "absorb", "abuse",  "abut",   "abyss",  "ac",     "acadia", "accra",  "accrue", "ace",    "acetic", "ache",
        "acid",   "acidic", "acm",    "acme",   "acorn",  "acre",   "acrid",  "act",    "acton",  "actor",  "acts",
        "acuity", "acute",  "ad",     "ada",    "adage",  "adagio", "adair",  "adam",   "adams",  "adapt",  "add",
        "added",  "addict", "addis",  "addle",  "adele",  "aden",   "adept",  "adieu",  "adjust", "adler",  "admit",
        "admix",  "ado",    "adobe",  "adonis", "adopt",  "adore",  "adorn",  "adult",  "advent", "advert", "advise",
        "ae",     "aegis",  "aeneid", "af",     "afar",   "affair", "affine", "affix",  "afire",  "afoot",  "afraid",
        "africa", "afro",   "aft",    "ag",     "again",  "agate",  "agave",  "age",    "agee",   "agenda", "agent",
        "agile",  "aging",  "agnes",  "agnew",  "ago",    "agone",  "agony",  "agree",  "ague",   "agway",  "ah",
        "ahead",  "ahem",   "ahoy",   "ai",     "aid",    "aida",   "aide",   "aides",  "aiken",  "ail",    "aile",
        "aim",    "ain't",  "ainu",   "air",    "aires",  "airman", "airway", "airy",   "aisle",  "aj",     "ajar",
        "ajax",   "ak",     "akers",  "akin",   "akron",  "al",     "ala",    "alai",   "alamo",  "alan",   "alarm",
        "alaska", "alb",    "alba",   "album",  "alcoa",  "alden",  "alder",  "ale",    "alec",   "aleck",  "aleph",
        "alert",  "alex",   "alexei", "alga",   "algae",  "algal",  "alger",  "algol",  "ali",    "alia",   "alias",
        "alibi",  "alice",  "alien",  "alight", "align",  "alike",  "alive",  "all",    "allah",  "allan",  "allay",
        "allen",  "alley",  "allied", "allis",  "allot",  "allow",  "alloy",  "allure", "ally",   "allyl",  "allyn",
        "alma",   "almost", "aloe",   "aloft",  "aloha",  "alone",  "along",  "aloof",  "aloud",  "alp",    "alpha",
        "alps",   "also",   "alsop",  "altair", "altar",  "alter",  "alto",   "alton",  "alum",   "alumni", "alva",
        "alvin",  "alway",  "am",     "ama",    "amass",  "amaze",  "amber",  "amble",  "ambush", "amen",   "amend",
        "ames",   "ami",    "amid",   "amide",  "amigo",  "amino",  "amiss",  "amity",  "amman",  "ammo",   "amoco",
        "amok",   "among",  "amort",  "amos",   "amp",    "ampere", "ampex",  "ample",  "amply",  "amra",   "amulet",
        "amuse",  "amy",    "an",     "ana",    "and",    "andes",  "andre",  "andrew", "andy",   "anent",  "anew",
        "angel",  "angelo", "anger",  "angie",  "angle",  "anglo",  "angola", "angry",  "angst",  "angus",  "ani",
        "anion",  "anise",  "anita",  "ankle",  "ann",    "anna",   "annal",  "anne",   "annex",  "annie",  "annoy",
        "annul",  "annuli", "annum",  "anode",  "ansi",   "answer", "ant",    "ante",   "anti",   "antic",  "anton",
        "anus",   "anvil",  "any",    "anyhow", "anyway", "ao",     "aok",    "aorta",  "ap",     "apart",  "apathy",
        "ape",    "apex",   "aphid",  "aplomb", "appeal", "append", "apple",  "apply",  "april",  "apron",  "apse",
        "apt",    "aq",     "aqua",   "ar",     "arab",   "araby",  "arc",    "arcana", "arch",   "archer", "arden",
        "ardent", "are",    "area",   "arena",  "ares",   "argive", "argo",   "argon",  "argot",  "argue",  "argus",
        "arhat",  "arid",   "aries",  "arise",  "ark",    "arlen",  "arlene", "arm",    "armco",  "army",   "arnold",
        "aroma",  "arose",  "arpa",   "array",  "arrear", "arrow",  "arson",  "art",    "artery", "arthur", "artie",
        "arty",   "aruba",  "arum",   "aryl",   "as",     "ascend", "ash",    "ashen",  "asher",  "ashley", "ashy",
        "asia",   "aside",  "ask",    "askew",  "asleep", "aspen",  "aspire", "ass",    "assai",  "assam",  "assay",
        "asset",  "assort", "assure", "aster",  "astm",   "astor",  "astral", "at",     "at&t",   "ate",    "athens",
        "atlas",  "atom",   "atomic", "atone",  "atop",   "attic",  "attire", "au",     "aubrey", "audio",  "audit",
        "aug",    "auger",  "augur",  "august", "auk",    "aunt",   "aura",   "aural",  "auric",  "austin", "auto",
        "autumn", "av",     "avail",  "ave",    "aver",   "avert",  "avery",  "aviate", "avid",   "avis",   "aviv",
        "avoid",  "avon",   "avow",   "aw",     "await",  "awake",  "award",  "aware",  "awash",  "away",   "awe",
        "awful",  "awl",    "awn",    "awoke",  "awry",   "ax",     "axe",    "axes",   "axial",  "axiom",  "axis",
        "axle",   "axon",   "ay",     "aye",    "ayers",  "az",     "aztec",  "azure",  "b",      "b's",    "b2",
        "b3",     "b4",     "b5",     "b6",     "b7",     "b8",     "b9",     "ba",     "babe",   "babel",  "baby",
        "bach",   "back",   "backup", "bacon",  "bad",    "bade",   "baden",  "badge",  "baffle", "bag",    "baggy",
        "bah",    "bahama", "bail",   "baird",  "bait",   "bake",   "baku",   "bald",   "baldy",  "bale",   "bali",
        "balk",   "balkan", "balky",  "ball",   "balled", "ballot", "balm",   "balmy",  "balsa",  "bam",    "bambi",
        "ban",    "banal",  "band",   "bandit", "bandy",  "bane",   "bang",   "banish", "banjo",  "bank",   "banks",
        "bantu",  "bar",    "barb",   "bard",   "bare",   "barfly", "barge",  "bark",   "barley", "barn",   "barnes",
        "baron",  "barony", "barr",   "barre",  "barry",  "barter", "barth",  "barton", "basal",  "base",   "basel",
        "bash",   "basic",  "basil",  "basin",  "basis",  "bask",   "bass",   "bassi",  "basso",  "baste",  "bat",
        "batch",  "bate",   "bater",  "bates",  "bath",   "bathe",  "batik",  "baton",  "bator",  "batt",   "bauble",
        "baud",   "bauer",  "bawd",   "bawdy",  "bawl",   "baxter", "bay",    "bayda",  "bayed",  "bayou",  "bazaar",
        "bb",     "bbb",    "bbbb",   "bc",     "bcd",    "bd",     "be",     "beach",  "bead",   "beady",  "beak",
        "beam",   "bean",   "bear",   "beard",  "beast",  "beat",   "beau",   "beauty", "beaux",  "bebop",  "becalm",
        "beck",   "becker", "becky",  "bed",    "bedim",  "bee",    "beebe",  "beech",  "beef",   "beefy",  "been",
        "beep",   "beer",   "beet",   "befall", "befit",  "befog",  "beg",    "began",  "beget",  "beggar", "begin",
        "begun",  "behind", "beige",  "being",  "beirut", "bel",    "bela",   "belch",  "belfry", "belie",  "bell",
        "bella",  "belle",  "belly",  "below",  "belt",   "bema",   "beman",  "bemoan", "ben",    "bench",  "bend",
        "bender", "benny",  "bent",   "benz",   "berea",  "bereft", "beret",  "berg",   "berlin", "bern",   "berne",
        "bernet", "berra",  "berry",  "bert",   "berth",  "beryl",  "beset",  "bess",   "bessel", "best",   "bestir",
        "bet",    "beta",   "betel",  "beth",   "bethel", "betsy",  "bette",  "betty",  "bevel",  "bevy",   "beware",
        "bey",    "bezel",  "bf",     "bg",     "bh",     "bhoy",   "bi",     "bias",   "bib",    "bibb",   "bible",
        "bicep",  "biceps", "bid",    "biddy",  "bide",   "bien",   "big",    "biggs",  "bigot",  "bile",   "bilge",
        "bilk",   "bill",   "billow", "billy",  "bin",    "binary", "bind",   "bing",   "binge",  "bingle", "bini",
        "biota",  "birch",  "bird",   "birdie", "birth",  "bison",  "bisque", "bit",    "bitch",  "bite",   "bitt",
        "bitten", "biz",    "bizet",  "bj",     "bk",     "bl",     "blab",   "black",  "blade",  "blair",  "blake",
        "blame",  "blanc",  "bland",  "blank",  "blare",  "blast",  "blat",   "blatz",  "blaze",  "bleak",  "bleat",
        "bled",   "bleed",  "blend",  "bless",  "blest",  "blew",   "blimp",  "blind",  "blink",  "blinn",  "blip",
        "bliss",  "blithe", "blitz",  "bloat",  "blob",   "bloc",   "bloch",  "block",  "bloke",  "blond",  "blonde",
        "blood",  "bloom",  "bloop",  "blot",   "blotch", "blow",   "blown",  "blue",   "bluet",  "bluff",  "blum",
        "blunt",  "blur",   "blurt",  "blush",  "blvd",   "blythe", "bm",     "bmw",    "bn",     "bo",     "boa",
        "boar",   "board",  "boast",  "boat",   "bob",    "bobbin", "bobby",  "bobcat", "boca",   "bock",   "bode",
        "body",   "bog",    "bogey",  "boggy",  "bogus",  "bogy",   "bohr",   "boil",   "bois",   "boise",  "bold",
        "bole",   "bolo",   "bolt",   "bomb",   "bombay", "bon",    "bona",   "bond",   "bone",   "bong",   "bongo",
        "bonn",   "bonus",  "bony",   "bonze",  "boo",    "booby",  "boogie", "book",   "booky",  "boom",   "boon",
        "boone",  "boor",   "boost",  "boot",   "booth",  "booty",  "booze",  "bop",    "borax",  "border", "bore",
        "borg",   "boric",  "boris",  "born",   "borne",  "borneo", "boron",  "bosch",  "bose",   "bosom",  "boson",
        "boss",   "boston", "botch",  "both",   "bottle", "bough",  "bouncy", "bound",  "bourn",  "bout",   "bovine",
        "bow",    "bowel",  "bowen",  "bowie",  "bowl",   "box",    "boxy",   "boy",    "boyar",  "boyce",  "boyd",
        "boyle",  "bp",     "bq",     "br",     "brace",  "bract",  "brad",   "brady",  "brae",   "brag",   "bragg",
        "braid",  "brain",  "brainy", "brake",  "bran",   "brand",  "brandt", "brant",  "brash",  "brass",  "brassy",
        "braun",  "brave",  "bravo",  "brawl",  "bray",   "bread",  "break",  "bream",  "breath", "bred",   "breed",
        "breeze", "bremen", "brent",  "brest",  "brett",  "breve",  "brew",   "brian",  "briar",  "bribe",  "brice",
        "brick",  "bride",  "brief",  "brig",   "briggs", "brim",   "brine",  "bring",  "brink",  "briny",  "brisk",
        "broad",  "brock",  "broil",  "broke",  "broken", "bronx",  "brood",  "brook",  "brooke", "broom",  "broth",
        "brow",   "brown",  "browse", "bruce",  "bruit",  "brunch", "bruno",  "brunt",  "brush",  "brute",  "bryan",
        "bryant", "bryce",  "bryn",   "bs",     "bstj",   "bt",     "btl",    "bu",     "bub",    "buck",   "bud",
        "budd",   "buddy",  "budge",  "buena",  "buenos", "buff",   "bug",    "buggy",  "bugle",  "buick",  "build",
        "built",  "bulb",   "bulge",  "bulk",   "bulky",  "bull",   "bully",  "bum",    "bump",   "bun",    "bunch",
        "bundy",  "bunk",   "bunny",  "bunt",   "bunyan", "buoy",   "burch",  "bureau", "buret",  "burg",   "buried",
        "burke",  "burl",   "burly",  "burma",  "burn",   "burnt",  "burp",   "burr",   "burro",  "burst",  "burt",
        "burton", "burtt",  "bury",   "bus",    "busch",  "bush",   "bushel", "bushy",  "buss",   "bust",   "busy",
        "but",    "butane", "butch",  "buteo",  "butt",   "butte",  "butyl",  "buxom",  "buy",    "buyer",  "buzz",
        "buzzy",  "bv",     "bw",     "bx",     "by",     "bye",    "byers",  "bylaw",  "byline", "byrd",   "byrne",
        "byron",  "byte",   "byway",  "byword", "bz",     "c",      "c's",    "c2",     "c3",     "c4",     "c5",
        "c6",     "c7",     "c8",     "c9",     "ca",     "cab",    "cabal",  "cabin",  "cable",  "cabot",  "cacao",
        "cache",  "cacm",   "cacti",  "caddy",  "cadent", "cadet",  "cadre",  "cady",   "cafe",   "cage",   "cagey",
        "cahill", "caiman", "cain",   "caine",  "cairn",  "cairo",  "cake",   "cal",    "calder", "caleb",  "calf",
        "call",   "calla",  "callus", "calm",   "calve",  "cam",    "camber", "came",   "camel",  "cameo",  "camp",
        "can",    "can't",  "canal",  "canary", "cancer", "candle", "candy",  "cane",   "canis",  "canna",  "cannot",
        "canny",  "canoe",  "canon",  "canopy", "cant",   "canto",  "canton", "cap",    "cape",   "caper",  "capo",
        "car",    "carbon", "card",   "care",   "caress", "caret",  "carey",  "cargo",  "carib",  "carl",   "carla",
        "carlo",  "carne",  "carob",  "carol",  "carp",   "carpet", "carr",   "carrie", "carry",  "carson", "cart",
        "carte",  "caruso", "carve",  "case",   "casey",  "cash",   "cashew", "cask",   "casket", "cast",   "caste",
        "cat",    "catch",  "cater",  "cathy",  "catkin", "catsup", "cauchy", "caulk",  "cause",  "cave",   "cavern",
        "cavil",  "cavort", "caw",    "cayuga", "cb",     "cbs",    "cc",     "ccc",    "cccc",   "cd",     "cdc",
        "ce",     "cease",  "cecil",  "cedar",  "cede",   "ceil",   "celia",  "cell",   "census", "cent",   "ceres",
        "cern",   "cetera", "cetus",  "cf",     "cg",     "ch",     "chad",   "chafe",  "chaff",  "chai",   "chain",
        "chair",  "chalk",  "champ",  "chance", "chang",  "chant",  "chao",   "chaos",  "chap",   "chapel", "char",
        "chard",  "charm",  "chart",  "chase",  "chasm",  "chaste", "chat",   "chaw",   "cheap",  "cheat",  "check",
        "cheek",  "cheeky", "cheer",  "chef",   "chen",   "chert",  "cherub", "chess",  "chest",  "chevy",  "chew",
        "chi",    "chic",   "chick",  "chide",  "chief",  "child",  "chile",  "chili",  "chill",  "chilly", "chime",
        "chin",   "china",  "chine",  "chink",  "chip",   "chirp",  "chisel", "chit",   "chive",  "chock",  "choir",
        "choke",  "chomp",  "chop",   "chopin", "choral", "chord",  "chore",  "chose",  "chosen", "chou",   "chow",
        "chris",  "chub",   "chuck",  "chuff",  "chug",   "chum",   "chump",  "chunk",  "churn",  "chute",  "ci",
        "cia",    "cicada", "cider",  "cigar",  "cilia",  "cinch",  "cindy",  "cipher", "circa",  "circe",  "cite",
        "citrus", "city",   "civet",  "civic",  "civil",  "cj",     "ck",     "cl",     "clad",   "claim",  "clam",
        "clammy", "clamp",  "clan",   "clang",  "clank",  "clap",   "clara",  "clare",  "clark",  "clarke", "clash",
        "clasp",  "class",  "claus",  "clause", "claw",   "clay",   "clean",  "clear",  "cleat",  "cleft",  "clerk",
        "cliche", "click",  "cliff",  "climb",  "clime",  "cling",  "clink",  "clint",  "clio",   "clip",   "clive",
        "cloak",  "clock",  "clod",   "clog",   "clomp",  "clone",  "close",  "closet", "clot",   "cloth",  "cloud",
        "clout",  "clove",  "clown",  "cloy",   "club",   "cluck",  "clue",   "cluj",   "clump",  "clumsy", "clung",
        "clyde",  "cm",     "cn",     "co",     "coach",  "coal",   "coast",  "coat",   "coax",   "cobb",   "cobble",
        "cobol",  "cobra",  "coca",   "cock",   "cockle", "cocky",  "coco",   "cocoa",  "cod",    "coda",   "coddle",
        "code",   "codon",  "cody",   "coed",   "cog",    "cogent", "cohen",  "cohn",   "coil",   "coin",   "coke",
        "col",    "cola",   "colby",  "cold",   "cole",   "colon",  "colony", "colt",   "colza",  "coma",   "comb",
        "combat", "come",   "comet",  "cometh", "comic",  "comma",  "con",    "conch",  "cone",   "coney",  "congo",
        "conic",  "conn",   "conner", "conway", "cony",   "coo",    "cook",   "cooke",  "cooky",  "cool",   "cooley",
        "coon",   "coop",   "coors",  "coot",   "cop",    "cope",   "copra",  "copy",   "coral",  "corbel", "cord",
        "core",   "corey",  "cork",   "corn",   "corny",  "corp",   "corps",  "corvus", "cos",    "cosec",  "coset",
        "cosh",   "cost",   "costa",  "cosy",   "cot",    "cotta",  "cotty",  "couch",  "cough",  "could",  "count",
        "coup",   "coupe",  "court",  "cousin", "cove",   "coven",  "cover",  "covet",  "cow",    "cowan",  "cowl",
        "cowman", "cowry",  "cox",    "coy",    "coyote", "coypu",  "cozen",  "cozy",   "cp",     "cpa",    "cq",
        "cr",     "crab",   "crack",  "craft",  "crag",   "craig",  "cram",   "cramp",  "crane",  "crank",  "crap",
        "crash",  "crass",  "crate",  "crater", "crave",  "craw",   "crawl",  "craze",  "crazy",  "creak",  "cream",
        "credit", "credo",  "creed",  "creek",  "creep",  "creole", "creon",  "crepe",  "crept",  "cress",  "crest",
        "crete",  "crew",   "crib",   "cried",  "crime",  "crimp",  "crisp",  "criss",  "croak",  "crock",  "crocus",
        "croft",  "croix",  "crone",  "crony",  "crook",  "croon",  "crop",   "cross",  "crow",   "crowd",  "crown",
        "crt",    "crud",   "crude",  "cruel",  "crumb",  "crump",  "crush",  "crust",  "crux",   "cruz",   "cry",
        "crypt",  "cs",     "ct",     "cu",     "cub",    "cuba",   "cube",   "cubic",  "cud",    "cuddle", "cue",
        "cuff",   "cull",   "culpa",  "cult",   "cumin",  "cuny",   "cup",    "cupful", "cupid",  "cur",    "curb",
        "curd",   "cure",   "curfew", "curia",  "curie",  "curio",  "curl",   "curry",  "curse",  "curt",   "curve",
        "cusp",   "cut",    "cute",   "cutlet", "cv",     "cw",     "cx",     "cy",     "cycad",  "cycle",  "cynic",
        "cyril",  "cyrus",  "cyst",   "cz",     "czar",   "czech",  "d",      "d'art",  "d's",    "d2",     "d3",
        "d4",     "d5",     "d6",     "d7",     "d8",     "d9",     "da",     "dab",    "dacca",  "dactyl", "dad",
        "dada",   "daddy",  "dade",   "daffy",  "dahl",   "dahlia", "dairy",  "dais",   "daisy",  "dakar",  "dale",
        "daley",  "dally",  "daly",   "dam",    "dame",   "damn",   "damon",  "damp",   "damsel", "dan",    "dana",
        "dance",  "dandy",  "dane",   "dang",   "dank",   "danny",  "dante",  "dar",    "dare",   "dark",   "darken",
        "darn",   "darry",  "dart",   "dash",   "data",   "date",   "dater",  "datum",  "daub",   "daunt",  "dave",
        "david",  "davis",  "davit",  "davy",   "dawn",   "dawson", "day",    "daze",   "db",     "dc",     "dd",
        "ddd",    "dddd",   "de",     "deacon", "dead",   "deaf",   "deal",   "dealt",  "dean",   "deane",  "dear",
        "death",  "debar",  "debby",  "debit",  "debra",  "debris", "debt",   "debug",  "debut",  "dec",    "decal",
        "decay",  "decca",  "deck",   "decker", "decor",  "decree", "decry",  "dee",    "deed",   "deem",   "deep",
        "deer",   "deere",  "def",    "defer",  "deform", "deft",   "defy",   "degas",  "degum",  "deify",  "deign",
        "deity",  "deja",   "del",    "delay",  "delft",  "delhi",  "delia",  "dell",   "della",  "delta",  "delve",
        "demark", "demit",  "demon",  "demur",  "den",    "deneb",  "denial", "denny",  "dense",  "dent",   "denton",
        "deny",   "depot",  "depth",  "depute", "derby",  "derek",  "des",    "desist", "desk",   "detach", "deter",
        "deuce",  "deus",   "devil",  "devoid", "devon",  "dew",    "dewar",  "dewey",  "dewy",   "dey",    "df",
        "dg",     "dh",     "dhabi",  "di",     "dial",   "diana",  "diane",  "diary",  "dibble", "dice",   "dick",
        "dicta",  "did",    "dido",   "die",    "died",   "diego",  "diem",   "diesel", "diet",   "diety",  "dietz",
        "dig",    "digit",  "dilate", "dill",   "dim",    "dime",   "din",    "dinah",  "dine",   "ding",   "dingo",
        "dingy",  "dint",   "diode",  "dip",    "dirac",  "dire",   "dirge",  "dirt",   "dirty",  "dis",    "disc",
        "dish",   "disk",   "disney", "ditch",  "ditto",  "ditty",  "diva",   "divan",  "dive",   "dixie",  "dixon",
        "dizzy",  "dj",     "dk",     "dl",     "dm",     "dn",     "dna",    "do",     "dobbs",  "dobson", "dock",
        "docket", "dod",    "dodd",   "dodge",  "dodo",   "doe",    "doff",   "dog",    "doge",   "dogma",  "dolan",
        "dolce",  "dole",   "doll",   "dolly",  "dolt",   "dome",   "don",    "don't",  "done",   "doneck", "donna",
        "donor",  "doom",   "door",   "dope",   "dora",   "doria",  "doric",  "doris",  "dose",   "dot",    "dote",
        "double", "doubt",  "douce",  "doug",   "dough",  "dour",   "douse",  "dove",   "dow",    "dowel",  "down",
        "downs",  "dowry",  "doyle",  "doze",   "dozen",  "dp",     "dq",     "dr",     "drab",   "draco",  "draft",
        "drag",   "drain",  "drake",  "dram",   "drama",  "drank",  "drape",  "draw",   "drawl",  "drawn",  "dread",
        "dream",  "dreamy", "dreg",   "dress",  "dressy", "drew",   "drib",   "dried",  "drier",  "drift",  "drill",
        "drink",  "drip",   "drive",  "droll",  "drone",  "drool",  "droop",  "drop",   "dross",  "drove",  "drown",
        "drub",   "drug",   "druid",  "drum",   "drunk",  "drury",  "dry",    "dryad",  "ds",     "dt",     "du",
        "dual",   "duane",  "dub",    "dubhe",  "dublin", "ducat",  "duck",   "duct",   "dud",    "due",    "duel",
        "duet",   "duff",   "duffy",  "dug",    "dugan",  "duke",   "dull",   "dully",  "dulse",  "duly",   "duma",
        "dumb",   "dummy",  "dump",   "dumpy",  "dun",    "dunce",  "dune",   "dung",   "dunham", "dunk",   "dunlop",
        "dunn",   "dupe",   "durer",  "dusk",   "dusky",  "dust",   "dusty",  "dutch",  "duty",   "dv",     "dw",
        "dwarf",  "dwell",  "dwelt",  "dwight", "dwyer",  "dx",     "dy",     "dyad",   "dye",    "dyer",   "dying",
        "dyke",   "dylan",  "dyne",   "dz",     "e",      "e'er",   "e's",    "e2",     "e3",     "e4",     "e5",
        "e6",     "e7",     "e8",     "e9",     "ea",     "each",   "eagan",  "eager",  "eagle",  "ear",    "earl",
        "earn",   "earth",  "ease",   "easel",  "east",   "easy",   "eat",    "eaten",  "eater",  "eaton",  "eave",
        "eb",     "ebb",    "eben",   "ebony",  "ec",     "echo",   "eclat",  "ecole",  "ed",     "eddie",  "eddy",
        "eden",   "edgar",  "edge",   "edgy",   "edict",  "edify",  "edit",   "edith",  "editor", "edna",   "edt",
        "edwin",  "ee",     "eee",    "eeee",   "eel",    "eeoc",   "eerie",  "ef",     "efface", "effie",  "efg",
        "eft",    "eg",     "egan",   "egg",    "ego",    "egress", "egret",  "egypt",  "eh",     "ei",     "eider",
        "eight",  "eire",   "ej",     "eject",  "ek",     "eke",    "el",     "elan",   "elate",  "elba",   "elbow",
        "elder",  "eldon",  "elect",  "elegy",  "elena",  "eleven", "elfin",  "elgin",  "eli",    "elide",  "eliot",
        "elite",  "elk",    "ell",    "ella",   "ellen",  "ellis",  "elm",    "elmer",  "elope",  "else",   "elsie",
        "elton",  "elude",  "elute",  "elves",  "ely",    "em",     "embalm", "embark", "embed",  "ember",  "emcee",
        "emery",  "emil",   "emile",  "emily",  "emit",   "emma",   "emory",  "empty",  "en",     "enact",  "enamel",
        "end",    "endow",  "enemy",  "eng",    "engel",  "engle",  "engulf", "enid",   "enjoy",  "enmity", "enoch",
        "enol",   "enos",   "enrico", "ensue",  "enter",  "entrap", "entry",  "envoy",  "envy",   "eo",     "ep",
        "epa",    "epic",   "epoch",  "epoxy",  "epsom",  "eq",     "equal",  "equip",  "er",     "era",    "erase",
        "erato",  "erda",   "ere",    "erect",  "erg",    "eric",   "erich",  "erie",   "erik",   "ernest", "ernie",
        "ernst",  "erode",  "eros",   "err",    "errand", "errol",  "error",  "erupt",  "ervin",  "erwin",  "es",
        "essay",  "essen",  "essex",  "est",    "ester",  "estes",  "estop",  "et",     "eta",    "etc",    "etch",
        "ethan",  "ethel",  "ether",  "ethic",  "ethos",  "ethyl",  "etude",  "eu",     "eucre",  "euler",  "eureka",
        "ev",     "eva",    "evade",  "evans",  "eve",    "even",   "event",  "every",  "evict",  "evil",   "evoke",
        "evolve", "ew",     "ewe",    "ewing",  "ex",     "exact",  "exalt",  "exam",   "excel",  "excess", "exert",
        "exile",  "exist",  "exit",   "exodus", "expel",  "extant", "extent", "extol",  "extra",  "exude",  "exult",
        "exxon",  "ey",     "eye",    "eyed",   "ez",     "ezra",   "f",      "f's",    "f2",     "f3",     "f4",
        "f5",     "f6",     "f7",     "f8",     "f9",     "fa",     "faa",    "faber",  "fable",  "face",   "facet",
        "facile", "fact",   "facto",  "fad",    "fade",   "faery",  "fag",    "fahey",  "fail",   "fain",   "faint",
        "fair",   "fairy",  "faith",  "fake",   "fall",   "false",  "fame",   "fan",    "fancy",  "fang",   "fanny",
        "fanout", "far",    "farad",  "farce",  "fare",   "fargo",  "farley", "farm",   "faro",   "fast",   "fat",
        "fatal",  "fate",   "fatty",  "fault",  "faun",   "fauna",  "faust",  "fawn",   "fay",    "faze",   "fb",
        "fbi",    "fc",     "fcc",    "fd",     "fda",    "fe",     "fear",   "feast",  "feat",   "feb",    "fed",
        "fee",    "feed",   "feel",   "feet",   "feign",  "feint",  "felice", "felix",  "fell",   "felon",  "felt",
        "femur",  "fence",  "fend",   "fermi",  "fern",   "ferric", "ferry",  "fest",   "fetal",  "fetch",  "fete",
        "fetid",  "fetus",  "feud",   "fever",  "few",    "ff",     "fff",    "ffff",   "fg",     "fgh",    "fh",
        "fi",     "fiat",   "fib",    "fibrin", "fiche",  "fide",   "fief",   "field",  "fiend",  "fiery",  "fife",
        "fifo",   "fifth",  "fifty",  "fig",    "fight",  "filch",  "file",   "filet",  "fill",   "filler", "filly",
        "film",   "filmy",  "filth",  "fin",    "final",  "finale", "finch",  "find",   "fine",   "finite", "fink",
        "finn",   "finny",  "fir",    "fire",   "firm",   "first",  "fish",   "fishy",  "fisk",   "fiske",  "fist",
        "fit",    "fitch",  "five",   "fix",    "fj",     "fjord",  "fk",     "fl",     "flack",  "flag",   "flail",
        "flair",  "flak",   "flake",  "flaky",  "flam",   "flame",  "flank",  "flap",   "flare",  "flash",  "flask",
        "flat",   "flatus", "flaw",   "flax",   "flea",   "fleck",  "fled",   "flee",   "fleet",  "flesh",  "flew",
        "flex",   "flick",  "flier",  "flinch", "fling",  "flint",  "flip",   "flirt",  "flit",   "flo",    "float",
        "floc",   "flock",  "floe",   "flog",   "flood",  "floor",  "flop",   "floppy", "flora",  "flour",  "flout",
        "flow",   "flown",  "floyd",  "flu",    "flub",   "flue",   "fluff",  "fluid",  "fluke",  "flung",  "flush",
        "flute",  "flux",   "fly",    "flyer",  "flynn",  "fm",     "fmc",    "fn",     "fo",     "foal",   "foam",
        "foamy",  "fob",    "focal",  "foci",   "focus",  "fodder", "foe",    "fog",    "foggy",  "fogy",   "foil",
        "foist",  "fold",   "foley",  "folio",  "folk",   "folly",  "fond",   "font",   "food",   "fool",   "foot",
        "foote",  "fop",    "for",    "foray",  "force",  "ford",   "fore",   "forge",  "forgot", "fork",   "form",
        "fort",   "forte",  "forth",  "forty",  "forum",  "foss",   "fossil", "foul",   "found",  "fount",  "four",
        "fovea",  "fowl",   "fox",    "foxy",   "foyer",  "fp",     "fpc",    "fq",     "fr",     "frail",  "frame",
        "fran",   "franc",  "franca", "frank",  "franz",  "frau",   "fraud",  "fray",   "freak",  "fred",   "free",
        "freed",  "freer",  "frenzy", "freon",  "fresh",  "fret",   "freud",  "frey",   "freya",  "friar",  "frick",
        "fried",  "frill",  "frilly", "frisky", "fritz",  "fro",    "frock",  "frog",   "from",   "front",  "frost",
        "froth",  "frown",  "froze",  "fruit",  "fry",    "frye",   "fs",     "ft",     "ftc",    "fu",     "fuchs",
        "fudge",  "fuel",   "fugal",  "fugue",  "fuji",   "full",   "fully",  "fum",    "fume",   "fun",    "fund",
        "fungal", "fungi",  "funk",   "funny",  "fur",    "furl",   "furry",  "fury",   "furze",  "fuse",   "fuss",
        "fussy",  "fusty",  "fuzz",   "fuzzy",  "fv",     "fw",     "fx",     "fy",     "fz",     "g",      "g's",
        "g2",     "g3",     "g4",     "g5",     "g6",     "g7",     "g8",     "g9",     "ga",     "gab",    "gable",
        "gabon",  "gad",    "gadget", "gaff",   "gaffe",  "gag",    "gage",   "gail",   "gain",   "gait",   "gal",
        "gala",   "galaxy", "gale",   "galen",  "gall",   "gallop", "galt",   "gam",    "game",   "gamin",  "gamma",
        "gamut",  "gander", "gang",   "gao",    "gap",    "gape",   "gar",    "garb",   "garish", "garner", "garry",
        "garth",  "gary",   "gas",    "gash",   "gasp",   "gassy",  "gate",   "gates",  "gator",  "gauche", "gaudy",
        "gauge",  "gaul",   "gaunt",  "gaur",   "gauss",  "gauze",  "gave",   "gavel",  "gavin",  "gawk",   "gawky",
        "gay",    "gaze",   "gb",     "gc",     "gd",     "ge",     "gear",   "gecko",  "gee",    "geese",  "geigy",
        "gel",    "geld",   "gem",    "gemma",  "gene",   "genie",  "genii",  "genoa",  "genre",  "gent",   "gentry",
        "genus",  "gerbil", "germ",   "gerry",  "get",    "getty",  "gf",     "gg",     "ggg",    "gggg",   "gh",
        "ghana",  "ghent",  "ghetto", "ghi",    "ghost",  "ghoul",  "gi",     "giant",  "gibbs",  "gibby",  "gibe",
        "giddy",  "gift",   "gig",    "gil",    "gila",   "gild",   "giles",  "gill",   "gilt",   "gimbal", "gimpy",
        "gin",    "gina",   "ginn",   "gino",   "gird",   "girl",   "girth",  "gist",   "give",   "given",  "gj",
        "gk",     "gl",     "glad",   "gladdy", "glade",  "glamor", "gland",  "glans",  "glare",  "glass",  "glaze",
        "gleam",  "glean",  "glee",   "glen",   "glenn",  "glib",   "glide",  "glint",  "gloat",  "glob",   "globe",
        "glom",   "gloom",  "glory",  "gloss",  "glove",  "glow",   "glue",   "glued",  "gluey",  "gluing", "glum",
        "glut",   "glyph",  "gm",     "gmt",    "gn",     "gnarl",  "gnash",  "gnat",   "gnaw",   "gnome",  "gnp",
        "gnu",    "go",     "goa",    "goad",   "goal",   "goat",   "gob",    "goer",   "goes",   "goff",   "gog",
        "goggle", "gogh",   "gogo",   "gold",   "golf",   "golly",  "gone",   "gong",   "goo",    "good",   "goode",
        "goody",  "goof",   "goofy",  "goose",  "gop",    "gordon", "gore",   "goren",  "gorge",  "gorky",  "gorse",
        "gory",   "gosh",   "gospel", "got",    "gouda",  "gouge",  "gould",  "gourd",  "gout",   "gown",   "gp",
        "gpo",    "gq",     "gr",     "grab",   "grace",  "grad",   "grade",  "grady",  "graff",  "graft",  "grail",
        "grain",  "grand",  "grant",  "grape",  "graph",  "grasp",  "grass",  "grata",  "grate",  "grater", "grave",
        "gravy",  "gray",   "graze",  "great",  "grebe",  "greed",  "greedy", "greek",  "green",  "greer",  "greet",
        "greg",   "gregg",  "greta",  "grew",   "grey",   "grid",   "grief",  "grieve", "grill",  "grim",   "grime",
        "grimm",  "grin",   "grind",  "grip",   "gripe",  "grist",  "grit",   "groan",  "groat",  "groin",  "groom",
        "grope",  "gross",  "groton", "group",  "grout",  "grove",  "grow",   "growl",  "grown",  "grub",   "gruff",
        "grunt",  "gs",     "gsa",    "gt",     "gu",     "guam",   "guano",  "guard",  "guess",  "guest",  "guide",
        "guild",  "guile",  "guilt",  "guise",  "guitar", "gules",  "gulf",   "gull",   "gully",  "gulp",   "gum",
        "gumbo",  "gummy",  "gun",    "gunk",   "gunky",  "gunny",  "gurgle", "guru",   "gus",    "gush",   "gust",
        "gusto",  "gusty",  "gut",    "gutsy",  "guy",    "guyana", "gv",     "gw",     "gwen",   "gwyn",   "gx",
        "gy",     "gym",    "gyp",    "gypsy",  "gyro",   "gz",     "h",      "h's",    "h2",     "h3",     "h4",
        "h5",     "h6",     "h7",     "h8",     "h9",     "ha",     "haag",   "haas",   "habib",  "habit",  "hack",
        "had",    "hades",  "hadron", "hagen",  "hager",  "hague",  "hahn",   "haifa",  "haiku",  "hail",   "hair",
        "hairy",  "haiti",  "hal",    "hale",   "haley",  "half",   "hall",   "halma",  "halo",   "halt",   "halvah",
        "halve",  "ham",    "hamal",  "hamlin", "han",    "hand",   "handy",  "haney",  "hang",   "hank",   "hanna",
        "hanoi",  "hans",   "hansel", "hap",    "happy",  "hard",   "hardy",  "hare",   "harem",  "hark",   "harley",
        "harm",   "harp",   "harpy",  "harry",  "harsh",  "hart",   "harvey", "hash",   "hasp",   "hast",   "haste",
        "hasty",  "hat",    "hatch",  "hate",   "hater",  "hath",   "hatred", "haul",   "haunt",  "have",   "haven",
        "havoc",  "haw",    "hawk",   "hay",    "haydn",  "hayes",  "hays",   "hazard", "haze",   "hazel",  "hazy",
        "hb",     "hc",     "hd",     "he",     "he'd",   "he'll",  "head",   "heady",  "heal",   "healy",  "heap",
        "hear",   "heard",  "heart",  "heat",   "heath",  "heave",  "heavy",  "hebe",   "hebrew", "heck",   "heckle",
        "hedge",  "heed",   "heel",   "heft",   "hefty",  "heigh",  "heine",  "heinz",  "heir",   "held",   "helen",
        "helga",  "helix",  "hell",   "hello",  "helm",   "helmut", "help",   "hem",    "hemp",   "hen",    "hence",
        "henri",  "henry",  "her",    "hera",   "herb",   "herd",   "here",   "hero",   "heroic", "heron",  "herr",
        "hertz",  "hess",   "hesse",  "hettie", "hetty",  "hew",    "hewitt", "hewn",   "hex",    "hey",    "hf",
        "hg",     "hh",     "hhh",    "hhhh",   "hi",     "hiatt",  "hick",   "hicks",  "hid",    "hide",   "high",
        "hij",    "hike",   "hill",   "hilly",  "hilt",   "hilum",  "him",    "hind",   "hindu",  "hines",  "hinge",
        "hint",   "hip",    "hippo",  "hippy",  "hiram",  "hire",   "hirsch", "his",    "hiss",   "hit",    "hitch",
        "hive",   "hj",     "hk",     "hl",     "hm",     "hn",     "ho",     "hoagy",  "hoar",   "hoard",  "hob",
        "hobbs",  "hobby",  "hobo",   "hoc",    "hock",   "hodge",  "hodges", "hoe",    "hoff",   "hog",    "hogan",
        "hoi",    "hokan",  "hold",   "holdup", "hole",   "holly",  "holm",   "holst",  "holt",   "home",   "homo",
        "honda",  "hondo",  "hone",   "honey",  "hong",   "honk",   "hooch",  "hood",   "hoof",   "hook",   "hookup",
        "hoop",   "hoot",   "hop",    "hope",   "horde",  "horn",   "horny",  "horse",  "horus",  "hose",   "host",
        "hot",    "hotbox", "hotel",  "hough",  "hound",  "hour",   "house",  "hove",   "hovel",  "hover",  "how",
        "howdy",  "howe",   "howl",   "hoy",    "hoyt",   "hp",     "hq",     "hr",     "hs",     "ht",     "hu",
        "hub",    "hubbub", "hubby",  "huber",  "huck",   "hue",    "hued",   "huff",   "hug",    "huge",   "hugh",
        "hughes", "hugo",   "huh",    "hulk",   "hull",   "hum",    "human",  "humid",  "hump",   "humus",  "hun",
        "hunch",  "hung",   "hunk",   "hunt",   "hurd",   "hurl",   "huron",  "hurrah", "hurry",  "hurst",  "hurt",
        "hurty",  "hush",   "husky",  "hut",    "hutch",  "hv",     "hw",     "hx",     "hy",     "hyde",   "hydra",
        "hydro",  "hyena",  "hying",  "hyman",  "hymen",  "hymn",   "hymnal", "hz",     "i",      "i'd",    "i'll",
        "i'm",    "i's",    "i've",   "i2",     "i3",     "i4",     "i5",     "i6",     "i7",     "i8",     "i9",
        "ia",     "iambic", "ian",    "ib",     "ibex",   "ibid",   "ibis",   "ibm",    "ibn",    "ic",     "icc",
        "ice",    "icing",  "icky",   "icon",   "icy",    "id",     "ida",    "idaho",  "idea",   "ideal",  "idiom",
        "idiot",  "idle",   "idol",   "idyll",  "ie",     "ieee",   "if",     "iffy",   "ifni",   "ig",     "igloo",
        "igor",   "ih",     "ii",     "iii",    "iiii",   "ij",     "ijk",    "ik",     "ike",    "il",     "ileum",
        "iliac",  "iliad",  "ill",    "illume", "ilona",  "im",     "image",  "imbue",  "imp",    "impel",  "import",
        "impute", "in",     "inane",  "inapt",  "inc",    "inca",   "incest", "inch",   "incur",  "index",  "india",
        "indies", "indy",   "inept",  "inert",  "infect", "infer",  "infima", "infix",  "infra",  "ingot",  "inhere",
        "injun",  "ink",    "inlay",  "inlet",  "inman",  "inn",    "inner",  "input",  "insect", "inset",  "insult",
        "intend", "inter",  "into",   "inure",  "invoke", "io",     "ion",    "ionic",  "iota",   "iowa",   "ip",
        "ipso",   "iq",     "ir",     "ira",    "iran",   "iraq",   "irate",  "ire",    "irene",  "iris",   "irish",
        "irk",    "irma",   "iron",   "irony",  "irs",    "irvin",  "irwin",  "is",     "isaac",  "isabel", "ising",
        "isis",   "islam",  "island", "isle",   "isn't",  "israel", "issue",  "it",     "it&t",   "it'd",   "it'll",
        "italy",  "itch",   "item",   "ito",    "itt",    "iu",     "iv",     "ivan",   "ive",    "ivory",  "ivy",
        "iw",     "ix",     "iy",     "iz",     "j",      "j's",    "j2",     "j3",     "j4",     "j5",     "j6",
        "j7",     "j8",     "j9",     "ja",     "jab",    "jack",   "jacky",  "jacm",   "jacob",  "jacobi", "jade",
        "jag",    "jail",   "jaime",  "jake",   "jam",    "james",  "jan",    "jane",   "janet",  "janos",  "janus",
        "japan",  "jar",    "jason",  "java",   "jaw",    "jay",    "jazz",   "jazzy",  "jb",     "jc",     "jd",
        "je",     "jean",   "jed",    "jeep",   "jeff",   "jejune", "jelly",  "jenny",  "jeres",  "jerk",   "jerky",
        "jerry",  "jersey", "jess",   "jesse",  "jest",   "jesus",  "jet",    "jew",    "jewel",  "jewett", "jewish",
        "jf",     "jg",     "jh",     "ji",     "jibe",   "jiffy",  "jig",    "jill",   "jilt",   "jim",    "jimmy",
        "jinx",   "jive",   "jj",     "jjj",    "jjjj",   "jk",     "jkl",    "jl",     "jm",     "jn",     "jo",
        "joan",   "job",    "jock",   "jockey", "joe",    "joel",   "joey",   "jog",    "john",   "johns",  "join",
        "joint",  "joke",   "jolla",  "jolly",  "jolt",   "jon",    "jonas",  "jones",  "jorge",  "jose",   "josef",
        "joshua", "joss",   "jostle", "jot",    "joule",  "joust",  "jove",   "jowl",   "jowly",  "joy",    "joyce",
        "jp",     "jq",     "jr",     "js",     "jt",     "ju",     "juan",   "judas",  "judd",   "jude",   "judge",
        "judo",   "judy",   "jug",    "juggle", "juice",  "juicy",  "juju",   "juke",   "jukes",  "julep",  "jules",
        "julia",  "julie",  "julio",  "july",   "jumbo",  "jump",   "jumpy",  "junco",  "june",   "junk",   "junky",
        "juno",   "junta",  "jura",   "jure",   "juror",  "jury",   "just",   "jut",    "jute",   "jv",     "jw",
        "jx",     "jy",     "jz",     "k",      "k's",    "k2",     "k3",     "k4",     "k5",     "k6",     "k7",
        "k8",     "k9",     "ka",     "kabul",  "kafka",  "kahn",   "kajar",  "kale",   "kalmia", "kane",   "kant",
        "kapok",  "kappa",  "karate", "karen",  "karl",   "karma",  "karol",  "karp",   "kate",   "kathy",  "katie",
        "katz",   "kava",   "kay",    "kayo",   "kazoo",  "kb",     "kc",     "kd",     "ke",     "keats",  "keel",
        "keen",   "keep",   "keg",    "keith",  "keller", "kelly",  "kelp",   "kemp",   "ken",    "keno",   "kent",
        "kenya",  "kepler", "kept",   "kern",   "kerr",   "kerry",  "ketch",  "kevin",  "key",    "keyed",  "keyes",
        "keys",   "kf",     "kg",     "kh",     "khaki",  "khan",   "khmer",  "ki",     "kick",   "kid",    "kidde",
        "kidney", "kiev",   "kigali", "kill",   "kim",    "kin",    "kind",   "king",   "kink",   "kinky",  "kiosk",
        "kiowa",  "kirby",  "kirk",   "kirov",  "kiss",   "kit",    "kite",   "kitty",  "kiva",   "kivu",   "kiwi",
        "kj",     "kk",     "kkk",    "kkkk",   "kl",     "klan",   "klaus",  "klein",  "kline",  "klm",    "klux",
        "km",     "kn",     "knack",  "knapp",  "knauer", "knead",  "knee",   "kneel",  "knelt",  "knew",   "knick",
        "knife",  "knit",   "knob",   "knock",  "knoll",  "knot",   "knott",  "know",   "known",  "knox",   "knurl",
        "ko",     "koala",  "koch",   "kodak",  "kola",   "kombu",  "kong",   "koran",  "korea",  "kp",     "kq",
        "kr",     "kraft",  "krause", "kraut",  "krebs",  "kruse",  "ks",     "kt",     "ku",     "kudo",   "kudzu",
        "kuhn",   "kulak",  "kurd",   "kurt",   "kv",     "kw",     "kx",     "ky",     "kyle",   "kyoto",  "kz",
        "l",      "l's",    "l2",     "l3",     "l4",     "l5",     "l6",     "l7",     "l8",     "l9",     "la",
        "lab",    "laban",  "label",  "labia",  "labile", "lac",    "lace",   "lack",   "lacy",   "lad",    "laden",
        "ladle",  "lady",   "lag",    "lager",  "lagoon", "lagos",  "laid",   "lain",   "lair",   "laity",  "lake",
        "lam",    "lamar",  "lamb",   "lame",   "lamp",   "lana",   "lance",  "land",   "lane",   "lang",   "lange",
        "lanka",  "lanky",  "lao",    "laos",   "lap",    "lapel",  "lapse",  "larch",  "lard",   "lares",  "large",
        "lark",   "larkin", "larry",  "lars",   "larva",  "lase",   "lash",   "lass",   "lasso",  "last",   "latch",
        "late",   "later",  "latest", "latex",  "lath",   "lathe",  "latin",  "latus",  "laud",   "laue",   "laugh",
        "launch", "laura",  "lava",   "law",    "lawn",   "lawson", "lax",    "lay",    "layup",  "laze",   "lazy",
        "lb",     "lc",     "ld",     "le",     "lea",    "leach",  "lead",   "leaf",   "leafy",  "leak",   "leaky",
        "lean",   "leap",   "leapt",  "lear",   "learn",  "lease",  "leash",  "least",  "leave",  "led",    "ledge",
        "lee",    "leech",  "leeds",  "leek",   "leer",   "leery",  "leeway", "left",   "lefty",  "leg",    "legal",
        "leggy",  "legion", "leigh",  "leila",  "leland", "lemma",  "lemon",  "len",    "lena",   "lend",   "lenin",
        "lenny",  "lens",   "lent",   "leo",    "leon",   "leona",  "leone",  "leper",  "leroy",  "less",   "lessee",
        "lest",   "let",    "lethe",  "lev",    "levee",  "level",  "lever",  "levi",   "levin",  "levis",  "levy",
        "lew",    "lewd",   "lewis",  "leyden", "lf",     "lg",     "lh",     "li",     "liar",   "libel",  "libido",
        "libya",  "lice",   "lick",   "lid",    "lie",    "lied",   "lien",   "lieu",   "life",   "lifo",   "lift",
        "light",  "like",   "liken",  "lila",   "lilac",  "lilly",  "lilt",   "lily",   "lima",   "limb",   "limbo",
        "lime",   "limit",  "limp",   "lin",    "lind",   "linda",  "linden", "line",   "linen",  "lingo",  "link",
        "lint",   "linus",  "lion",   "lip",    "lipid",  "lisa",   "lise",   "lisle",  "lisp",   "list",   "listen",
        "lit",    "lithe",  "litton", "live",   "liven",  "livid",  "livre",  "liz",    "lizzie", "lj",     "lk",
        "ll",     "lll",    "llll",   "lloyd",  "lm",     "lmn",    "ln",     "lo",     "load",   "loaf",   "loam",
        "loamy",  "loan",   "loath",  "lob",    "lobar",  "lobby",  "lobe",   "lobo",   "local",  "loci",   "lock",
        "locke",  "locus",  "lodge",  "loeb",   "loess",  "loft",   "lofty",  "log",    "logan",  "loge",   "logic",
        "loin",   "loire",  "lois",   "loiter", "loki",   "lola",   "loll",   "lolly",  "lomb",   "lome",   "lone",
        "long",   "look",   "loom",   "loon",   "loop",   "loose",  "loot",   "lop",    "lope",   "lopez",  "lord",
        "lore",   "loren",  "los",    "lose",   "loss",   "lossy",  "lost",   "lot",    "lotte",  "lotus",  "lou",
        "loud",   "louis",  "louise", "louse",  "lousy",  "louver", "love",   "low",    "lowe",   "lower",  "lowry",
        "loy",    "loyal",  "lp",     "lq",     "lr",     "ls",     "lsi",    "lt",     "ltv",    "lu",     "lucas",
        "lucia",  "lucid",  "luck",   "lucky",  "lucre",  "lucy",   "lug",    "luge",   "luger",  "luis",   "luke",
        "lull",   "lulu",   "lumbar", "lumen",  "lump",   "lumpy",  "lunar",  "lunch",  "lund",   "lung",   "lunge",
        "lura",   "lurch",  "lure",   "lurid",  "lurk",   "lush",   "lust",   "lusty",  "lute",   "lutz",   "lux",
        "luxe",   "luzon",  "lv",     "lw",     "lx",     "ly",     "lydia",  "lye",    "lying",  "lykes",  "lyle",
        "lyman",  "lymph",  "lynch",  "lynn",   "lynx",   "lyon",   "lyons",  "lyra",   "lyric",  "lz",     "m",
        "m&m",    "m's",    "m2",     "m3",     "m4",     "m5",     "m6",     "m7",     "m8",     "m9",     "ma",
        "mabel",  "mac",    "mace",   "mach",   "macho",  "mack",   "mackey", "macon",  "macro",  "mad",    "madam",
        "made",   "madman", "madsen", "mae",    "magi",   "magic",  "magma",  "magna",  "magog",  "maid",   "maier",
        "mail",   "maim",   "main",   "maine",  "major",  "make",   "malady", "malay",  "male",   "mali",   "mall",
        "malt",   "malta",  "mambo",  "mamma",  "mammal", "man",    "mana",   "manama", "mane",   "mange",  "mania",
        "manic",  "mann",   "manna",  "manor",  "mans",   "manse",  "mantle", "many",   "mao",    "maori",  "map",
        "maple",  "mar",    "marc",   "march",  "marco",  "marcy",  "mardi",  "mare",   "margo",  "maria",  "marie",
        "marin",  "marine", "mario",  "mark",   "marks",  "marlin", "marrow", "marry",  "mars",   "marsh",  "mart",
        "marty",  "marx",   "mary",   "maser",  "mash",   "mask",   "mason",  "masque", "mass",   "mast",   "mat",
        "match",  "mate",   "mateo",  "mater",  "math",   "matte",  "maul",   "mauve",  "mavis",  "maw",    "mawr",
        "max",    "maxim",  "maxima", "may",    "maya",   "maybe",  "mayer",  "mayhem", "mayo",   "mayor",  "mayst",
        "mazda",  "maze",   "mb",     "mba",    "mc",     "mccoy",  "mcgee",  "mckay",  "mckee",  "mcleod", "md",
        "me",     "mead",   "meal",   "mealy",  "mean",   "meant",  "meat",   "meaty",  "mecca",  "mecum",  "medal",
        "medea",  "media",  "medic",  "medley", "meek",   "meet",   "meg",    "mega",   "meier",  "meir",   "mel",
        "meld",   "melee",  "mellow", "melon",  "melt",   "memo",   "memoir", "men",    "mend",   "menlo",  "menu",
        "merck",  "mercy",  "mere",   "merge",  "merit",  "merle",  "merry",  "mesa",   "mescal", "mesh",   "meson",
        "mess",   "messy",  "met",    "metal",  "mete",   "meter",  "metro",  "mew",    "meyer",  "meyers", "mezzo",
        "mf",     "mg",     "mh",     "mi",     "miami",  "mica",   "mice",   "mickey", "micky",  "micro",  "mid",
        "midas",  "midge",  "midst",  "mien",   "miff",   "mig",    "might",  "mike",   "mila",   "milan",  "milch",
        "mild",   "mildew", "mile",   "miles",  "milk",   "milky",  "mill",   "mills",  "milt",   "mimi",   "mimic",
        "mince",  "mind",   "mine",   "mini",   "minim",  "mink",   "minnow", "minor",  "minos",  "minot",  "minsk",
        "mint",   "minus",  "mira",   "mirage", "mire",   "mirth",  "miser",  "misery", "miss",   "missy",  "mist",
        "misty",  "mit",    "mite",   "mitre",  "mitt",   "mix",    "mixup",  "mizar",  "mj",     "mk",     "ml",
        "mm",     "mmm",    "mmmm",   "mn",     "mno",    "mo",     "moan",   "moat",   "mob",    "mobil",  "mock",
        "modal",  "mode",   "model",  "modem",  "modish", "moe",    "moen",   "mohr",   "moire",  "moist",  "molal",
        "molar",  "mold",   "mole",   "moll",   "mollie", "molly",  "molt",   "molten", "mommy",  "mona",   "monad",
        "mondo",  "monel",  "money",  "monic",  "monk",   "mont",   "monte",  "month",  "monty",  "moo",    "mood",
        "moody",  "moon",   "moor",   "moore",  "moose",  "moot",   "mop",    "moral",  "morale", "moran",  "more",
        "morel",  "morn",   "moron",  "morse",  "morsel", "mort",   "mosaic", "moser",  "moses",  "moss",   "mossy",
        "most",   "mot",    "motel",  "motet",  "moth",   "mother", "motif",  "motor",  "motto",  "mould",  "mound",
        "mount",  "mourn",  "mouse",  "mousy",  "mouth",  "move",   "movie",  "mow",    "moyer",  "mp",     "mph",
        "mq",     "mr",     "mrs",    "ms",     "mt",     "mu",     "much",   "muck",   "mucus",  "mud",    "mudd",
        "muddy",  "muff",   "muffin", "mug",    "muggy",  "mugho",  "muir",   "mulch",  "mulct",  "mule",   "mull",
        "multi",  "mum",    "mummy",  "munch",  "mung",   "munson", "muon",   "muong",  "mural",  "muriel", "murk",
        "murky",  "murre",  "muse",   "mush",   "mushy",  "music",  "musk",   "muslim", "must",   "musty",  "mute",
        "mutt",   "muzak",  "muzo",   "mv",     "mw",     "mx",     "my",     "myel",   "myers",  "mylar",  "mynah",
        "myopia", "myra",   "myron",  "myrrh",  "myself", "myth",   "mz",     "n",      "n's",    "n2",     "n3",
        "n4",     "n5",     "n6",     "n7",     "n8",     "n9",     "na",     "naacp",  "nab",    "nadir",  "nag",
        "nagoya", "nagy",   "naiad",  "nail",   "nair",   "naive",  "naked",  "name",   "nan",    "nancy",  "naomi",
        "nap",    "nary",   "nasa",   "nasal",  "nash",   "nasty",  "nat",    "natal",  "nate",   "nato",   "natty",
        "nature", "naval",  "nave",   "navel",  "navy",   "nay",    "nazi",   "nb",     "nbc",    "nbs",    "nc",
        "ncaa",   "ncr",    "nd",     "ne",     "neal",   "near",   "neat",   "neath",  "neck",   "ned",    "nee",
        "need",   "needy",  "neff",   "negate", "negro",  "nehru",  "neil",   "nell",   "nelsen", "neon",   "nepal",
        "nero",   "nerve",  "ness",   "nest",   "net",    "neuron", "neva",   "neve",   "new",    "newel",  "newt",
        "next",   "nf",     "ng",     "nh",     "ni",     "nib",    "nibs",   "nice",   "nicety", "niche",  "nick",
        "niece",  "niger",  "nigh",   "night",  "nih",    "nikko",  "nil",    "nile",   "nimbus", "nimh",   "nina",
        "nine",   "ninth",  "niobe",  "nip",    "nit",    "nitric", "nitty",  "nixon",  "nj",     "nk",     "nl",
        "nm",     "nn",     "nnn",    "nnnn",   "no",     "noaa",   "noah",   "nob",    "nobel",  "noble",  "nod",
        "nodal",  "node",   "noel",   "noise",  "noisy",  "nolan",  "noll",   "nolo",   "nomad",  "non",    "nonce",
        "none",   "nook",   "noon",   "noose",  "nop",    "nor",    "nora",   "norm",   "norma",  "north",  "norway",
        "nose",   "not",    "notch",  "note",   "notre",  "noun",   "nov",    "nova",   "novak",  "novel",  "novo",
        "now",    "np",     "nq",     "nr",     "nrc",    "ns",     "nsf",    "nt",     "ntis",   "nu",     "nuance",
        "nubia",  "nuclei", "nude",   "nudge",  "null",   "numb",   "nun",    "nurse",  "nut",    "nv",     "nw",
        "nx",     "ny",     "nyc",    "nylon",  "nymph",  "nyu",    "nz",     "o",      "o'er",   "o's",    "o2",
        "o3",     "o4",     "o5",     "o6",     "o7",     "o8",     "o9",     "oa",     "oaf",    "oak",    "oaken",
        "oakley", "oar",    "oases",  "oasis",  "oat",    "oath",   "ob",     "obese",  "obey",   "objet",  "oboe",
        "oc",     "occur",  "ocean",  "oct",    "octal",  "octave", "octet",  "od",     "odd",    "ode",    "odin",
        "odium",  "oe",     "of",     "off",    "offal",  "offend", "offer",  "oft",    "often",  "og",     "ogden",
        "ogle",   "ogre",   "oh",     "ohio",   "ohm",    "ohmic",  "oi",     "oil",    "oily",   "oint",   "oj",
        "ok",     "okay",   "ol",     "olaf",   "olav",   "old",    "olden",  "oldy",   "olga",   "olin",   "olive",
        "olsen",  "olson",  "om",     "omaha",  "oman",   "omega",  "omen",   "omit",   "on",     "once",   "one",
        "onion",  "only",   "onset",  "onto",   "onus",   "onward", "onyx",   "oo",     "ooo",    "oooo",   "ooze",
        "op",     "opal",   "opec",   "opel",   "open",   "opera",  "opium",  "opt",    "optic",  "opus",   "oq",
        "or",     "oral",   "orate",  "orb",    "orbit",  "orchid", "ordain", "order",  "ore",    "organ",  "orgy",
        "orin",   "orion",  "ornery", "orono",  "orr",    "os",     "osaka",  "oscar",  "osier",  "oslo",   "ot",
        "other",  "otis",   "ott",    "otter",  "otto",   "ou",     "ouch",   "ought",  "ounce",  "our",    "oust",
        "out",    "ouvre",  "ouzel",  "ouzo",   "ov",     "ova",    "oval",   "ovary",  "ovate",  "oven",   "over",
        "overt",  "ovid",   "ow",     "owe",    "owens",  "owing",  "owl",    "owly",   "own",    "ox",     "oxen",
        "oxeye",  "oxide",  "oxnard", "oy",     "oz",     "ozark",  "ozone",  "p",      "p's",    "p2",     "p3",
        "p4",     "p5",     "p6",     "p7",     "p8",     "p9",     "pa",     "pablo",  "pabst",  "pace",   "pack",
        "packet", "pact",   "pad",    "paddy",  "padre",  "paean",  "pagan",  "page",   "paid",   "pail",   "pain",
        "paine",  "paint",  "pair",   "pal",    "pale",   "pall",   "palm",   "palo",   "palsy",  "pam",    "pampa",
        "pan",    "panama", "panda",  "pane",   "panel",  "pang",   "panic",  "pansy",  "pant",   "panty",  "paoli",
        "pap",    "papa",   "papal",  "papaw",  "paper",  "pappy",  "papua",  "par",    "parch",  "pardon", "pare",
        "pareto", "paris",  "park",   "parke",  "parks",  "parr",   "parry",  "parse",  "part",   "party",  "pascal",
        "pasha",  "paso",   "pass",   "passe",  "past",   "paste",  "pasty",  "pat",    "patch",  "pate",   "pater",
        "path",   "patio",  "patsy",  "patti",  "patton", "patty",  "paul",   "paula",  "pauli",  "paulo",  "pause",
        "pave",   "paw",    "pawn",   "pax",    "pay",    "payday", "payne",  "paz",    "pb",     "pbs",    "pc",
        "pd",     "pe",     "pea",    "peace",  "peach",  "peak",   "peaky",  "peal",   "peale",  "pear",   "pearl",
        "pease",  "peat",   "pebble", "pecan",  "peck",   "pecos",  "pedal",  "pedro",  "pee",    "peed",   "peek",
        "peel",   "peep",   "peepy",  "peer",   "peg",    "peggy",  "pelt",   "pen",    "penal",  "pence",  "pencil",
        "pend",   "penh",   "penn",   "penna",  "penny",  "pent",   "peony",  "pep",    "peppy",  "pepsi",  "per",
        "perch",  "percy",  "perez",  "peril",  "perk",   "perky",  "perle",  "perry",  "persia", "pert",   "perth",
        "peru",   "peruse", "pest",   "peste",  "pet",    "petal",  "pete",   "peter",  "petit",  "petri",  "petty",
        "pew",    "pewee",  "pf",     "pg",     "ph",     "ph.d",   "phage",  "phase",  "phd",    "phenol", "phi",
        "phil",   "phlox",  "phon",   "phone",  "phony",  "photo",  "phyla",  "physic", "pi",     "piano",  "pica",
        "pick",   "pickup", "picky",  "pie",    "piece",  "pier",   "pierce", "piety",  "pig",    "piggy",  "pike",
        "pile",   "pill",   "pilot",  "pimp",   "pin",    "pinch",  "pine",   "ping",   "pinion", "pink",   "pint",
        "pinto",  "pion",   "piotr",  "pious",  "pip",    "pipe",   "piper",  "pique",  "pit",    "pitch",  "pith",
        "pithy",  "pitney", "pitt",   "pity",   "pius",   "pivot",  "pixel",  "pixy",   "pizza",  "pj",     "pk",
        "pl",     "place",  "plague", "plaid",  "plain",  "plan",   "plane",  "plank",  "plant",  "plasm",  "plat",
        "plate",  "plato",  "play",   "playa",  "plaza",  "plea",   "plead",  "pleat",  "pledge", "pliny",  "plod",
        "plop",   "plot",   "plow",   "pluck",  "plug",   "plum",   "plumb",  "plume",  "plump",  "plunk",  "plus",
        "plush",  "plushy", "pluto",  "ply",    "pm",     "pn",     "po",     "poach",  "pobox",  "pod",    "podge",
        "podia",  "poe",    "poem",   "poesy",  "poet",   "poetry", "pogo",   "poi",    "point",  "poise",  "poke",
        "pol",    "polar",  "pole",   "police", "polio",  "polis",  "polk",   "polka",  "poll",   "polo",   "pomona",
        "pomp",   "ponce",  "pond",   "pong",   "pont",   "pony",   "pooch",  "pooh",   "pool",   "poole",  "poop",
        "poor",   "pop",    "pope",   "poppy",  "porch",  "pore",   "pork",   "porous", "port",   "porte",  "portia",
        "porto",  "pose",   "posey",  "posh",   "posit",  "posse",  "post",   "posy",   "pot",    "potts",  "pouch",
        "pound",  "pour",   "pout",   "pow",    "powder", "power",  "pp",     "ppm",    "ppp",    "pppp",   "pq",
        "pqr",    "pr",     "prado",  "pram",   "prank",  "pratt",  "pray",   "preen",  "prefix", "prep",   "press",
        "prexy",  "prey",   "priam",  "price",  "prick",  "pride",  "prig",   "prim",   "prima",  "prime",  "primp",
        "prince", "print",  "prior",  "prism",  "prissy", "privy",  "prize",  "pro",    "probe",  "prod",   "prof",
        "prom",   "prone",  "prong",  "proof",  "prop",   "propyl", "prose",  "proud",  "prove",  "prow",   "prowl",
        "proxy",  "prune",  "pry",    "ps",     "psalm",  "psi",    "psych",  "pt",     "pta",    "pu",     "pub",
        "puck",   "puddly", "puerto", "puff",   "puffy",  "pug",    "pugh",   "puke",   "pull",   "pulp",   "pulse",
        "puma",   "pump",   "pun",    "punch",  "punic",  "punish", "punk",   "punky",  "punt",   "puny",   "pup",
        "pupal",  "pupil",  "puppy",  "pure",   "purge",  "purl",   "purr",   "purse",  "pus",    "pusan",  "pusey",
        "push",   "pussy",  "put",    "putt",   "putty",  "pv",     "pvc",    "pw",     "px",     "py",     "pygmy",
        "pyle",   "pyre",   "pyrex",  "pyrite", "pz",     "q",      "q's",    "q2",     "q3",     "q4",     "q5",
        "q6",     "q7",     "q8",     "q9",     "qa",     "qatar",  "qb",     "qc",     "qd",     "qe",     "qed",
        "qf",     "qg",     "qh",     "qi",     "qj",     "qk",     "ql",     "qm",     "qn",     "qo",     "qp",
        "qq",     "qqq",    "qqqq",   "qr",     "qrs",    "qs",     "qt",     "qu",     "qua",    "quack",  "quad",
        "quaff",  "quail",  "quake",  "qualm",  "quark",  "quarry", "quart",  "quash",  "quasi",  "quay",   "queasy",
        "queen",  "queer",  "quell",  "query",  "quest",  "queue",  "quick",  "quid",   "quiet",  "quill",  "quilt",
        "quinn",  "quint",  "quip",   "quirk",  "quirt",  "quit",   "quite",  "quito",  "quiz",   "quo",    "quod",
        "quota",  "quote",  "qv",     "qw",     "qx",     "qy",     "qz",     "r",      "r&d",    "r's",    "r2",
        "r3",     "r4",     "r5",     "r6",     "r7",     "r8",     "r9",     "ra",     "rabat",  "rabbi",  "rabbit",
        "rabid",  "rabin",  "race",   "rack",   "racy",   "radar",  "radii",  "radio",  "radium", "radix",  "radon",
        "rae",    "rafael", "raft",   "rag",    "rage",   "raid",   "rail",   "rain",   "rainy",  "raise",  "raj",
        "rajah",  "rake",   "rally",  "ralph",  "ram",    "raman",  "ramo",   "ramp",   "ramsey", "ran",    "ranch",
        "rand",   "randy",  "rang",   "range",  "rangy",  "rank",   "rant",   "raoul",  "rap",    "rape",   "rapid",
        "rapt",   "rare",   "rasa",   "rascal", "rash",   "rasp",   "rat",    "rata",   "rate",   "rater",  "ratio",
        "rattle", "raul",   "rave",   "ravel",  "raven",  "raw",    "ray",    "raze",   "razor",  "rb",     "rc",
        "rca",    "rd",     "re",     "reach",  "read",   "ready",  "reagan", "real",   "realm",  "ream",   "reap",
        "rear",   "reave",  "reb",    "rebel",  "rebut",  "recipe", "reck",   "recur",  "red",    "redeem", "reduce",
        "reed",   "reedy",  "reef",   "reek",   "reel",   "reese",  "reeve",  "refer",  "regal",  "regina", "regis",
        "reich",  "reid",   "reign",  "rein",   "relax",  "relay",  "relic",  "reman",  "remedy", "remit",  "remus",
        "rena",   "renal",  "rend",   "rene",   "renown", "rent",   "rep",    "repel",  "repent", "resin",  "resort",
        "rest",   "ret",    "retch",  "return", "reub",   "rev",    "reveal", "revel",  "rever",  "revet",  "revved",
        "rex",    "rf",     "rg",     "rh",     "rhea",   "rheum",  "rhine",  "rhino",  "rho",    "rhoda",  "rhode",
        "rhyme",  "ri",     "rib",    "rica",   "rice",   "rich",   "rick",   "rico",   "rid",    "ride",   "ridge",
        "rifle",  "rift",   "rig",    "riga",   "rigel",  "riggs",  "right",  "rigid",  "riley",  "rill",   "rilly",
        "rim",    "rime",   "rimy",   "ring",   "rink",   "rinse",  "rio",    "riot",   "rip",    "ripe",   "ripen",
        "ripley", "rise",   "risen",  "risk",   "risky",  "rite",   "ritz",   "rival",  "riven",  "river",  "rivet",
        "riyadh", "rj",     "rk",     "rl",     "rm",     "rn",     "ro",     "roach",  "road",   "roam",   "roar",
        "roast",  "rob",    "robe",   "robin",  "robot",  "rock",   "rocket", "rocky",  "rod",    "rode",   "rodeo",
        "roe",    "roger",  "rogue",  "roil",   "role",   "roll",   "roman",  "rome",   "romeo",  "romp",   "ron",
        "rondo",  "rood",   "roof",   "rook",   "rookie", "rooky",  "room",   "roomy",  "roost",  "root",   "rope",
        "rosa",   "rose",   "rosen",  "ross",   "rosy",   "rot",    "rotc",   "roth",   "rotor",  "rouge",  "rough",
        "round",  "rouse",  "rout",   "route",  "rove",   "row",    "rowdy",  "rowe",   "roy",    "royal",  "royce",
        "rp",     "rpm",    "rq",     "rr",     "rrr",    "rrrr",   "rs",     "rst",    "rsvp",   "rt",     "ru",
        "ruanda", "rub",    "rube",   "ruben",  "rubin",  "rubric", "ruby",   "ruddy",  "rude",   "rudy",   "rue",
        "rufus",  "rug",    "ruin",   "rule",   "rum",    "rumen",  "rummy",  "rump",   "rumpus", "run",    "rune",
        "rung",   "runge",  "runic",  "runt",   "runty",  "rupee",  "rural",  "ruse",   "rush",   "rusk",   "russ",
        "russo",  "rust",   "rusty",  "rut",    "ruth",   "rutty",  "rv",     "rw",     "rx",     "ry",     "ryan",
        "ryder",  "rye",    "rz",     "s",      "s's",    "s2",     "s3",     "s4",     "s5",     "s6",     "s7",
        "s8",     "s9",     "sa",     "sabine", "sable",  "sabra",  "sac",    "sachs",  "sack",   "sad",    "saddle",
        "sadie",  "safari", "safe",   "sag",    "saga",   "sage",   "sago",   "said",   "sail",   "saint",  "sake",
        "sal",    "salad",  "sale",   "salem",  "saline", "salk",   "salle",  "sally",  "salon",  "salt",   "salty",
        "salve",  "salvo",  "sam",    "samba",  "same",   "sammy",  "samoa",  "samuel", "san",    "sana",   "sand",
        "sandal", "sandy",  "sane",   "sang",   "sank",   "sans",   "santa",  "santo",  "sao",    "sap",    "sappy",
        "sara",   "sarah",  "saran",  "sari",   "sash",   "sat",    "satan",  "satin",  "satyr",  "sauce",  "saucy",
        "saud",   "saudi",  "saul",   "sault",  "saute",  "save",   "savoy",  "savvy",  "saw",    "sawyer", "sax",
        "saxon",  "say",    "sb",     "sc",     "scab",   "scala",  "scald",  "scale",  "scalp",  "scam",   "scamp",
        "scan",   "scant",  "scar",   "scare",  "scarf",  "scary",  "scat",   "scaup",  "scene",  "scent",  "school",
        "scion",  "scm",    "scoff",  "scold",  "scoop",  "scoot",  "scope",  "scops",  "score",  "scoria", "scorn",
        "scot",   "scott",  "scour",  "scout",  "scowl",  "scram",  "scrap",  "scrape", "screw",  "scrim",  "scrub",
        "scuba",  "scud",   "scuff",  "scull",  "scum",   "scurry", "sd",     "se",     "sea",    "seal",   "seam",
        "seamy",  "sean",   "sear",   "sears",  "season", "seat",   "sec",    "secant", "sect",   "sedan",  "seder",
        "sedge",  "see",    "seed",   "seedy",  "seek",   "seem",   "seen",   "seep",   "seethe", "seize",  "self",
        "sell",   "selma",  "semi",   "sen",    "send",   "seneca", "senor",  "sense",  "sent",   "sentry", "seoul",
        "sepal",  "sepia",  "sepoy",  "sept",   "septa",  "sequin", "sera",   "serf",   "serge",  "serif",  "serum",
        "serve",  "servo",  "set",    "seth",   "seton",  "setup",  "seven",  "sever",  "severe", "sew",    "sewn",
        "sex",    "sexy",   "sf",     "sg",     "sh",     "shack",  "shad",   "shade",  "shady",  "shafer", "shaft",
        "shag",   "shah",   "shake",  "shaken", "shako",  "shaky",  "shale",  "shall",  "sham",   "shame",  "shank",
        "shape",  "shard",  "share",  "shari",  "shark",  "sharp",  "shave",  "shaw",   "shawl",  "shay",   "she",
        "she'd",  "shea",   "sheaf",  "shear",  "sheath", "shed",   "sheen",  "sheep",  "sheer",  "sheet",  "sheik",
        "shelf",  "shell",  "shied",  "shift",  "shill",  "shim",   "shin",   "shine",  "shinto", "shiny",  "ship",
        "shire",  "shirk",  "shirt",  "shish",  "shiv",   "shoal",  "shock",  "shod",   "shoe",   "shoji",  "shone",
        "shoo",   "shook",  "shoot",  "shop",   "shore",  "short",  "shot",   "shout",  "shove",  "show",   "shown",
        "showy",  "shrank", "shred",  "shrew",  "shrike", "shrub",  "shrug",  "shu",    "shuck",  "shun",   "shunt",
        "shut",   "shy",    "si",     "sial",   "siam",   "sian",   "sib",    "sibley", "sibyl",  "sic",    "sick",
        "side",   "sidle",  "siege",  "siena",  "sieve",  "sift",   "sigh",   "sight",  "sigma",  "sign",   "signal",
        "signor", "silas",  "silk",   "silky",  "sill",   "silly",  "silo",   "silt",   "silty",  "sima",   "simon",
        "simons", "sims",   "sin",    "sinai",  "since",  "sine",   "sinew",  "sing",   "singe",  "sinh",   "sink",
        "sinus",  "sioux",  "sip",    "sir",    "sire",   "siren",  "sis",    "sisal",  "sit",    "site",   "situ",
        "situs",  "siva",   "six",    "sixgun", "sixth",  "sixty",  "size",   "sj",     "sk",     "skat",   "skate",
        "skeet",  "skew",   "ski",    "skid",   "skied",  "skiff",  "skill",  "skim",   "skimp",  "skimpy", "skin",
        "skip",   "skirt",  "skit",   "skulk",  "skull",  "skunk",  "sky",    "skye",   "sl",     "slab",   "slack",
        "slag",   "slain",  "slake",  "slam",   "slang",  "slant",  "slap",   "slash",  "slat",   "slate",  "slater",
        "slav",   "slave",  "slay",   "sled",   "sleek",  "sleep",  "sleet",  "slept",  "slew",   "slice",  "slick",
        "slid",   "slide",  "slim",   "slime",  "slimy",  "sling",  "slip",   "slit",   "sliver", "sloan",  "slob",
        "sloe",   "slog",   "sloop",  "slop",   "slope",  "slosh",  "slot",   "sloth",  "slow",   "slug",   "sluice",
        "slum",   "slump",  "slung",  "slur",   "slurp",  "sly",    "sm",     "smack",  "small",  "smart",  "smash",
        "smear",  "smell",  "smelt",  "smile",  "smirk",  "smith",  "smithy", "smog",   "smoke",  "smoky",  "smug",
        "smut",   "sn",     "snack",  "snafu",  "snag",   "snail",  "snake",  "snap",   "snare",  "snark",  "snarl",
        "snatch", "sneak",  "sneer",  "snell",  "snick",  "sniff",  "snip",   "snipe",  "snob",   "snook",  "snoop",
        "snore",  "snort",  "snout",  "snow",   "snowy",  "snub",   "snuff",  "snug",   "so",     "soak",   "soap",
        "soapy",  "soar",   "sob",    "sober",  "social", "sock",   "sod",    "soda",   "sofa",   "sofia",  "soft",
        "soften", "soggy",  "soil",   "sol",    "solar",  "sold",   "sole",   "solemn", "solid",  "solo",   "solon",
        "solve",  "soma",   "somal",  "some",   "son",    "sonar",  "song",   "sonic",  "sonny",  "sonora", "sony",
        "soon",   "soot",   "sooth",  "sop",    "sora",   "sorb",   "sore",   "sorry",  "sort",   "sos",    "sou",
        "sough",  "soul",   "sound",  "soup",   "sour",   "source", "sousa",  "south",  "sow",    "sown",   "soy",
        "soya",   "sp",     "spa",    "space",  "spade",  "spain",  "span",   "spar",   "spare",  "sparge", "spark",
        "spasm",  "spat",   "spate",  "spawn",  "spay",   "speak",  "spear",  "spec",   "speck",  "sped",   "speed",
        "spell",  "spend",  "spent",  "sperm",  "sperry", "spew",   "spica",  "spice",  "spicy",  "spike",  "spiky",
        "spill",  "spilt",  "spin",   "spine",  "spiny",  "spire",  "spiro",  "spit",   "spite",  "spitz",  "splat",
        "splay",  "spline", "split",  "spoil",  "spoke",  "spoof",  "spook",  "spooky", "spool",  "spoon",  "spore",
        "sport",  "spot",   "spout",  "sprain", "spray",  "spree",  "sprig",  "spruce", "sprue",  "spud",   "spume",
        "spun",   "spunk",  "spur",   "spurn",  "spurt",  "spy",    "sq",     "squad",  "squat",  "squaw",  "squibb",
        "squid",  "squint", "sr",     "sri",    "ss",     "sss",    "ssss",   "sst",    "st",     "st.",    "stab",
        "stack",  "stacy",  "staff",  "stag",   "stage",  "stagy",  "stahl",  "staid",  "stain",  "stair",  "stake",
        "stale",  "stalk",  "stall",  "stamp",  "stan",   "stance", "stand",  "stank",  "staph",  "star",   "stare",
        "stark",  "starr",  "start",  "stash",  "state",  "statue", "stave",  "stay",   "stead",  "steak",  "steal",
        "steam",  "steed",  "steel",  "steele", "steen",  "steep",  "steer",  "stein",  "stella", "stem",   "step",
        "stern",  "steve",  "stew",   "stick",  "stiff",  "stile",  "still",  "stilt",  "sting",  "stingy", "stink",
        "stint",  "stir",   "stock",  "stoic",  "stoke",  "stole",  "stomp",  "stone",  "stony",  "stood",  "stool",
        "stoop",  "stop",   "store",  "storey", "stork",  "storm",  "story",  "stout",  "stove",  "stow",   "strafe",
        "strap",  "straw",  "stray",  "strewn", "strip",  "stroll", "strom",  "strop",  "strum",  "strut",  "stu",
        "stuart", "stub",   "stuck",  "stud",   "study",  "stuff",  "stuffy", "stump",  "stun",   "stung",  "stunk",
        "stunt",  "sturm",  "style",  "styli",  "styx",   "su",     "suave",  "sub",    "subtly", "such",   "suck",
        "sud",    "sudan",  "suds",   "sue",    "suey",   "suez",   "sugar",  "suit",   "suite",  "sulfa",  "sulk",
        "sulky",  "sully",  "sultry", "sum",    "sumac",  "summon", "sun",    "sung",   "sunk",   "sunny",  "sunset",
        "suny",   "sup",    "super",  "supra",  "sure",   "surf",   "surge",  "sus",    "susan",  "sushi",  "susie",
        "sutton", "sv",     "sw",     "swab",   "swag",   "swain",  "swam",   "swami",  "swamp",  "swampy", "swan",
        "swank",  "swap",   "swarm",  "swart",  "swat",   "swath",  "sway",   "swear",  "sweat",  "sweaty", "swede",
        "sweep",  "sweet",  "swell",  "swelt",  "swept",  "swift",  "swig",   "swim",   "swine",  "swing",  "swipe",
        "swirl",  "swish",  "swiss",  "swoop",  "sword",  "swore",  "sworn",  "swum",   "swung",  "sx",     "sy",
        "sybil",  "sykes",  "sylow",  "sylvan", "synge",  "synod",  "syria",  "syrup",  "sz",     "t",      "t's",
        "t2",     "t3",     "t4",     "t5",     "t6",     "t7",     "t8",     "t9",     "ta",     "tab",    "table",
        "taboo",  "tabu",   "tabula", "tacit",  "tack",   "tacky",  "tacoma", "tact",   "tad",    "taffy",  "taft",
        "tag",    "tahoe",  "tail",   "taint",  "take",   "taken",  "talc",   "tale",   "talk",   "talky",  "tall",
        "tallow", "tally",  "talon",  "talus",  "tam",    "tame",   "tamp",   "tampa",  "tan",    "tang",   "tango",
        "tangy",  "tanh",   "tank",   "tansy",  "tanya",  "tao",    "taos",   "tap",    "tapa",   "tape",   "taper",
        "tapir",  "tapis",  "tappa",  "tar",    "tara",   "tardy",  "tariff", "tarry",  "tart",   "task",   "tass",
        "taste",  "tasty",  "tat",    "tate",   "tater",  "tattle", "tatty",  "tau",    "taunt",  "taut",   "tavern",
        "tawny",  "tax",    "taxi",   "tb",     "tc",     "td",     "te",     "tea",    "teach",  "teal",   "team",
        "tear",   "tease",  "teat",   "tech",   "tecum",  "ted",    "teddy",  "tee",    "teem",   "teen",   "teensy",
        "teet",   "teeth",  "telex",  "tell",   "tempo",  "tempt",  "ten",    "tend",   "tenet",  "tenney", "tenon",
        "tenor",  "tense",  "tensor", "tent",   "tenth",  "tepee",  "tepid",  "term",   "tern",   "terra",  "terre",
        "terry",  "terse",  "tess",   "test",   "testy",  "tete",   "texan",  "texas",  "text",   "tf",     "tg",
        "th",     "thai",   "than",   "thank",  "that",   "thaw",   "the",    "thea",   "thee",   "theft",  "their",
        "them",   "theme",  "then",   "there",  "these",  "theta",  "they",   "thick",  "thief",  "thigh",  "thin",
        "thine",  "thing",  "think",  "third",  "this",   "thong",  "thor",   "thorn",  "thorny", "those",  "thou",
        "thread", "three",  "threw",  "throb",  "throes", "throw",  "thrum",  "thud",   "thug",   "thule",  "thumb",
        "thump",  "thus",   "thy",    "thyme",  "ti",     "tiber",  "tibet",  "tibia",  "tic",    "tick",   "ticket",
        "tid",    "tidal",  "tidbit", "tide",   "tidy",   "tie",    "tied",   "tier",   "tift",   "tiger",  "tight",
        "til",    "tilde",  "tile",   "till",   "tilt",   "tilth",  "tim",    "time",   "timex",  "timid",  "timon",
        "tin",    "tina",   "tine",   "tinge",  "tint",   "tiny",   "tioga",  "tip",    "tipoff", "tippy",  "tipsy",
        "tire",   "tit",    "titan",  "tithe",  "title",  "titus",  "tj",     "tk",     "tl",     "tm",     "tn",
        "tnt",    "to",     "toad",   "toady",  "toast",  "toby",   "today",  "todd",   "toe",    "tofu",   "tog",
        "togo",   "togs",   "toil",   "toilet", "token",  "tokyo",  "told",   "toll",   "tom",    "tomb",   "tome",
        "tommy",  "ton",    "tonal",  "tone",   "tong",   "toni",   "tonic",  "tonk",   "tonsil", "tony",   "too",
        "took",   "tool",   "toot",   "tooth",  "top",    "topaz",  "topic",  "topple", "topsy",  "tor",    "torah",
        "torch",  "tore",   "tori",   "torn",   "torr",   "torso",  "tort",   "torus",  "tory",   "toss",   "tot",
        "total",  "tote",   "totem",  "touch",  "tough",  "tour",   "tout",   "tow",    "towel",  "tower",  "town",
        "toxic",  "toxin",  "toy",    "tp",     "tq",     "tr",     "trace",  "track",  "tract",  "tracy",  "trade",
        "trag",   "trail",  "train",  "trait",  "tram",   "tramp",  "trap",   "trash",  "trawl",  "tray",   "tread",
        "treat",  "treble", "tree",   "trek",   "trench", "trend",  "tress",  "triad",  "trial",  "tribe",  "trick",
        "tried",  "trig",   "trill",  "trim",   "trio",   "trip",   "tripe",  "trite",  "triton", "trod",   "troll",
        "troop",  "trot",   "trout",  "troy",   "truce",  "truck",  "trudge", "trudy",  "true",   "truly",  "trump",
        "trunk",  "truss",  "trust",  "truth",  "trw",    "try",    "ts",     "tsar",   "tt",     "ttl",    "ttt",
        "tttt",   "tty",    "tu",     "tub",    "tuba",   "tube",   "tuck",   "tudor",  "tuff",   "tuft",   "tug",
        "tulane", "tulip",  "tulle",  "tulsa",  "tum",    "tun",    "tuna",   "tune",   "tung",   "tunic",  "tunis",
        "tunnel", "tuple",  "turf",   "turin",  "turk",   "turn",   "turvy",  "tusk",   "tussle", "tutor",  "tutu",
        "tuv",    "tv",     "tva",    "tw",     "twa",    "twain",  "tweak",  "tweed",  "twice",  "twig",   "twill",
        "twin",   "twine",  "twirl",  "twist",  "twisty", "twit",   "two",    "twx",    "tx",     "ty",     "tyburn",
        "tying",  "tyler",  "type",   "typic",  "typo",   "tyson",  "tz",     "u",      "u's",    "u2",     "u3",
        "u4",     "u5",     "u6",     "u7",     "u8",     "u9",     "ua",     "ub",     "uc",     "ucla",   "ud",
        "ue",     "uf",     "ug",     "ugh",    "ugly",   "uh",     "ui",     "uj",     "uk",     "ul",     "ulan",
        "ulcer",  "ultra",  "um",     "umber",  "umbra",  "umpire", "un",     "unary",  "uncle",  "under",  "unify",
        "union",  "unit",   "unite",  "unity",  "unix",   "until",  "uo",     "up",     "upend",  "uphold", "upon",
        "upper",  "uproar", "upset",  "uptake", "upton",  "uq",     "ur",     "urban",  "urbane", "urea",   "urge",
        "uri",    "urine",  "uris",   "urn",    "ursa",   "us",     "usa",    "usaf",   "usage",  "usc",    "usda",
        "use",    "useful", "usgs",   "usher",  "usia",   "usn",    "usps",   "ussr",   "usual",  "usurp",  "usury",
        "ut",     "utah",   "utica",  "utile",  "utmost", "utter",  "uu",     "uuu",    "uuuu",   "uv",     "uvw",
        "uw",     "ux",     "uy",     "uz",     "v",      "v's",    "v2",     "v3",     "v4",     "v5",     "v6",
        "v7",     "v8",     "v9",     "va",     "vacua",  "vacuo",  "vade",   "vaduz",  "vague",  "vail",   "vain",
        "vale",   "valet",  "valeur", "valid",  "value",  "valve",  "vamp",   "van",    "vance",  "vane",   "vary",
        "vase",   "vast",   "vat",    "vault",  "vb",     "vc",     "vd",     "ve",     "veal",   "veda",   "vee",
        "veer",   "veery",  "vega",   "veil",   "vein",   "velar",  "veldt",  "vella",  "vellum", "venal",  "vend",
        "venial", "venom",  "vent",   "venus",  "vera",   "verb",   "verde",  "verdi",  "verge",  "verity", "verna",
        "verne",  "versa",  "verse",  "verve",  "very",   "vessel", "vest",   "vet",    "vetch",  "veto",   "vex",
        "vf",     "vg",     "vh",     "vi",     "via",    "vial",   "vicar",  "vice",   "vichy",  "vicky",  "vida",
        "video",  "vie",    "viet",   "view",   "vigil",  "vii",    "viii",   "vile",   "villa",  "vine",   "vinyl",
        "viola",  "violet", "virgil", "virgo",  "virus",  "vis",    "visa",   "vise",   "visit",  "visor",  "vista",
        "vita",   "vitae",  "vital",  "vito",   "vitro",  "viva",   "vivian", "vivid",  "vivo",   "vixen",  "viz",
        "vj",     "vk",     "vl",     "vm",     "vn",     "vo",     "vocal",  "vogel",  "vogue",  "voice",  "void",
        "volt",   "volta",  "volvo",  "vomit",  "von",    "voss",   "vote",   "vouch",  "vow",    "vowel",  "vp",
        "vq",     "vr",     "vs",     "vt",     "vu",     "vulcan", "vv",     "vvv",    "vvvv",   "vw",     "vx",
        "vy",     "vying",  "vz",     "w",      "w's",    "w2",     "w3",     "w4",     "w5",     "w6",     "w7",
        "w8",     "w9",     "wa",     "waals",  "wac",    "wack",   "wacke",  "wacky",  "waco",   "wad",    "wade",
        "wadi",   "wafer",  "wag",    "wage",   "waggle", "wah",    "wahl",   "wail",   "waist",  "wait",   "waite",
        "waive",  "wake",   "waken",  "waldo",  "wale",   "walk",   "walkie", "wall",   "walls",  "wally",  "walsh",
        "walt",   "walton", "waltz",  "wan",    "wand",   "wane",   "wang",   "want",   "war",    "ward",   "ware",
        "warm",   "warmth", "warn",   "warp",   "warren", "wart",   "warty",  "wary",   "was",    "wash",   "washy",
        "wasp",   "wast",   "waste",  "watch",  "water",  "watt",   "watts",  "wave",   "wavy",   "wax",    "waxen",
        "waxy",   "way",    "wayne",  "wb",     "wc",     "wd",     "we",     "we'd",   "we'll",  "we're",  "we've",
        "weak",   "weal",   "wealth", "wean",   "wear",   "weary",  "weave",  "web",    "webb",   "weber",  "weco",
        "wed",    "wedge",  "wee",    "weed",   "weedy",  "week",   "weeks",  "weep",   "wehr",   "wei",    "weigh",
        "weir",   "weird",  "weiss",  "welch",  "weld",   "well",   "wells",  "welsh",  "welt",   "wendy",  "went",
        "wept",   "were",   "wert",   "west",   "wet",    "wf",     "wg",     "wh",     "whack",  "whale",  "wham",
        "wharf",  "what",   "wheat",  "whee",   "wheel",  "whelk",  "whelm",  "whelp",  "when",   "where",  "whet",
        "which",  "whiff",  "whig",   "while",  "whim",   "whine",  "whinny", "whip",   "whir",   "whirl",  "whisk",
        "whit",   "white",  "whiz",   "who",    "who'd",  "whoa",   "whole",  "whom",   "whoop",  "whoosh", "whop",
        "whose",  "whup",   "why",    "wi",     "wick",   "wide",   "widen",  "widow",  "width",  "wield",  "wier",
        "wife",   "wig",    "wild",   "wile",   "wiley",  "wilkes", "will",   "willa",  "wills",  "wilma",  "wilt",
        "wily",   "win",    "wince",  "winch",  "wind",   "windy",  "wine",   "wing",   "wink",   "winnie", "wino",
        "winter", "winy",   "wipe",   "wire",   "wiry",   "wise",   "wish",   "wishy",  "wisp",   "wispy",  "wit",
        "witch",  "with",   "withe",  "withy",  "witt",   "witty",  "wive",   "wj",     "wk",     "wl",     "wm",
        "wn",     "wo",     "woe",    "wok",    "woke",   "wold",   "wolf",   "wolfe",  "wolff",  "wolve",  "woman",
        "womb",   "women",  "won",    "won't",  "wonder", "wong",   "wont",   "woo",    "wood",   "woods",  "woody",
        "wool",   "woozy",  "word",   "wordy",  "wore",   "work",   "world",  "worm",   "wormy",  "worn",   "worry",
        "worse",  "worst",  "worth",  "wotan",  "would",  "wound",  "wove",   "woven",  "wow",    "wp",     "wq",
        "wr",     "wrack",  "wrap",   "wrath",  "wreak",  "wreck",  "wrest",  "wring",  "wrist",  "writ",   "write",
        "writhe", "wrong",  "wrote",  "wry",    "ws",     "wt",     "wu",     "wuhan",  "wv",     "ww",     "www",
        "wwww",   "wx",     "wxy",    "wy",     "wyatt",  "wyeth",  "wylie",  "wyman",  "wyner",  "wynn",   "wz",
        "x",      "x's",    "x2",     "x3",     "x4",     "x5",     "x6",     "x7",     "x8",     "x9",     "xa",
        "xb",     "xc",     "xd",     "xe",     "xenon",  "xerox",  "xf",     "xg",     "xh",     "xi",     "xj",
        "xk",     "xl",     "xm",     "xn",     "xo",     "xp",     "xq",     "xr",     "xs",     "xt",     "xu",
        "xv",     "xw",     "xx",     "xxx",    "xxxx",   "xy",     "xylem",  "xyz",    "xz",     "y",      "y's",
        "y2",     "y3",     "y4",     "y5",     "y6",     "y7",     "y8",     "y9",     "ya",     "yacht",  "yah",
        "yak",    "yale",   "yalta",  "yam",    "yamaha", "yang",   "yank",   "yap",    "yaqui",  "yard",   "yarn",
        "yates",  "yaw",    "yawl",   "yawn",   "yb",     "yc",     "yd",     "ye",     "yea",    "yeah",   "year",
        "yearn",  "yeast",  "yeasty", "yeats",  "yell",   "yelp",   "yemen",  "yen",    "yet",    "yf",     "yg",
        "yh",     "yi",     "yield",  "yin",    "yip",    "yj",     "yk",     "yl",     "ym",     "ymca",   "yn",
        "yo",     "yodel",  "yoder",  "yoga",   "yogi",   "yoke",   "yokel",  "yolk",   "yon",    "yond",   "yore",
        "york",   "yost",   "you",    "you'd",  "young",  "your",   "youth",  "yow",    "yp",     "yq",     "yr",
        "ys",     "yt",     "yu",     "yucca",  "yuck",   "yuh",    "yuki",   "yukon",  "yule",   "yv",     "yves",
        "yw",     "ywca",   "yx",     "yy",     "yyy",    "yyyy",   "yz",     "z",      "z's",    "z2",     "z3",
        "z4",     "z5",     "z6",     "z7",     "z8",     "z9",     "za",     "zag",    "zaire",  "zan",    "zap",
        "zazen",  "zb",     "zc",     "zd",     "ze",     "zeal",   "zealot", "zebra",  "zeiss",  "zen",    "zero",
        "zest",   "zesty",  "zeta",   "zeus",   "zf",     "zg",     "zh",     "zi",     "zig",    "zilch",  "zinc",
        "zing",   "zion",   "zip",    "zj",     "zk",     "zl",     "zloty",  "zm",     "zn",     "zo",     "zoe",
        "zomba",  "zone",   "zoo",    "zoom",   "zorn",   "zp",     "zq",     "zr",     "zs",     "zt",     "zu",
        "zurich", "zv",     "zw",     "zx",     "zy",     "zz",     "zzz",    "zzzz",   "!",      "!!",     '""""',
        "#",      "##",     "$",      "$$",     "%",      "%%",     "&",      "(",      "()",     ")",      "*",
        "**",     "+",      "-",      "0",      "1",      "10",     "100",    "1000",   "100th",  "101",    "101st",
        "10th",   "11",     "111",    "1111",   "11th",   "12",     "123",    "1234",   "12th",   "13",     "13th",
        "14",     "1492",   "14th",   "15",     "1500",   "15th",   "16",     "1600",   "16th",   "17",     "1700",
        "1776",   "17th",   "18",     "1800",   "1812",   "18th",   "19",     "1900",   "1910",   "1920",   "1925",
        "1930",   "1935",   "1940",   "1945",   "1950",   "1955",   "1960",   "1965",   "1970",   "1975",   "1980",
        "1985",   "1990",   "1991",   "1992",   "1993",   "1994",   "1995",   "1996",   "1997",   "19th",   "1st",
        "2",      "20",     "200",    "2000",   "2001",   "2020",   "20th",   "21",     "21st",   "22",     "222",
        "2222",   "22nd",   "23",     "234",    "2345",   "23rd",   "24",     "2468",   "24th",   "25",     "25th",
        "26",     "26th",   "27",     "27th",   "28",     "28th",   "29",     "29th",   "2a",     "2b",     "2c",
        "2d",     "2e",     "2f",     "2g",     "2h",     "2i",     "2j",     "2k",     "2l",     "2m",     "2n",
        "2nd",    "2o",     "2p",     "2q",     "2r",     "2s",     "2t",     "2u",     "2v",     "2w",     "2x",
        "2y",     "2z",     "3",      "30",     "300",    "3000",   "30th",   "31",     "31st",   "32",     "32nd",
        "33",     "333",    "3333",   "33rd",   "34",     "345",    "3456",   "34th",   "35",     "35th",   "36",
        "36th",   "37",     "37th",   "38",     "38th",   "39",     "39th",   "3a",     "3b",     "3c",     "3d",
        "3e",     "3f",     "3g",     "3h",     "3i",     "3j",     "3k",     "3l",     "3m",     "3n",     "3o",
        "3p",     "3q",     "3r",     "3rd",    "3s",     "3t",     "3u",     "3v",     "3w",     "3x",     "3y",
        "3z",     "4",      "40",     "400",    "4000",   "40th",   "41",     "41st",   "42",     "42nd",   "43",
        "4321",   "43rd",   "44",     "444",    "4444",   "44th",   "45",     "456",    "4567",   "45th",   "46",
        "46th",   "47",     "47th",   "48",     "48th",   "49",     "49th",   "4a",     "4b",     "4c",     "4d",
        "4e",     "4f",     "4g",     "4h",     "4i",     "4j",     "4k",     "4l",     "4m",     "4n",     "4o",
        "4p",     "4q",     "4r",     "4s",     "4t",     "4th",    "4u",     "4v",     "4w",     "4x",     "4y",
        "4z",     "5",      "50",     "500",    "5000",   "50th",   "51",     "51st",   "52",     "52nd",   "53",
        "53rd",   "54",     "54th",   "55",     "555",    "5555",   "55th",   "56",     "567",    "5678",   "56th",
        "57",     "57th",   "58",     "58th",   "59",     "59th",   "5a",     "5b",     "5c",     "5d",     "5e",
        "5f",     "5g",     "5h",     "5i",     "5j",     "5k",     "5l",     "5m",     "5n",     "5o",     "5p",
        "5q",     "5r",     "5s",     "5t",     "5th",    "5u",     "5v",     "5w",     "5x",     "5y",     "5z",
        "6",      "60",     "600",    "6000",   "60th",   "61",     "61st",   "62",     "62nd",   "63",     "63rd",
        "64",     "65",     "65th",   "66",     "666",    "6666",   "66th",   "67",     "678",    "6789",   "67th",
        "68",     "68th",   "69",     "69th",   "6a",     "6b",     "6c",     "6d",     "6e",     "6f",     "6g",
        "6h",     "6i",     "6j",     "6k",     "6l",     "6m",     "6n",     "6o",     "6p",     "6q",     "6r",
        "6s",     "6t",     "6th",    "6u",     "6v",     "6w",     "6x",     "6y",     "6z",     "7",      "70",
        "700",    "7000",   "70th",   "71",     "71st",   "72",     "72nd",   "73",     "73rd",   "74",     "74th",
        "75",     "75th",   "76",     "76th",   "77",     "777",    "7777",   "77th",   "78",     "789",    "78th",
        "79",     "79th",   "7a",     "7b",     "7c",     "7d",     "7e",     "7f",     "7g",     "7h",     "7i",
        "7j",     "7k",     "7l",     "7m",     "7n",     "7o",     "7p",     "7q",     "7r",     "7s",     "7t",
        "7th",    "7u",     "7v",     "7w",     "7x",     "7y",     "7z",     "8",      "80",     "800",    "8000",
        "80th",   "81",     "81st",   "82",     "82nd",   "83",     "83rd",   "84",     "84th",   "85",     "85th",
        "86",     "86th",   "87",     "87th",   "88",     "888",    "8888",   "88th",   "89",     "89th",   "8a",
        "8b",     "8c",     "8d",     "8e",     "8f",     "8g",     "8h",     "8i",     "8j",     "8k",     "8l",
        "8m",     "8n",     "8o",     "8p",     "8q",     "8r",     "8s",     "8t",     "8th",    "8u",     "8v",
        "8w",     "8x",     "8y",     "8z",     "9",      "90",     "900",    "9000",   "90th",   "91",     "91st",
        "92",     "92nd",   "93",     "93rd",   "94",     "94th",   "95",     "95th",   "96",     "96th",   "97",
        "97th",   "98",     "9876",   "98th",   "99",     "999",    "9999",   "99th",   "9a",     "9b",     "9c",
        "9d",     "9e",     "9f",     "9g",     "9h",     "9i",     "9j",     "9k",     "9l",     "9m",     "9n",
        "9o",     "9p",     "9q",     "9r",     "9s",     "9t",     "9th",    "9u",     "9v",     "9w",     "9x",
        "9y",     "9z",     ":",      ";",      " = ",    "?",      "??",     "@",
    ];

    /**
     * The Constructor
     *
     * @param int $length       How many symbols should the generated password have.
     * @param string $seperator    What should go between each symbol.
     * @param array  $symbolList   The list of Symobls to use.
     */
    public function __construct($length = 7, $seperator = ' ', array $symbolList = [])
    {
        if (empty($symbolList)) {
            $symbolList = $this->defaultSymbolList;
        }
        $this->setSymbolList($symbolList);
        $this->length    = $length;
        $this->seperator = $seperator;
    }

    /**
     * Set the Symbol List
     * @param array $symbolList The list of Symobls to use.
     */
    public function setSymbolList(array $symbolList)
    {
        $size = count($symbolList);
        if ($size < self::MIN_LIST || $size > self::MAX_LIST) {
            throw new InvalidSymbolListException('Symbol list is not a valid size.');
        }
        //ref: http://stackoverflow.com/a/4965318/289991
        //ref: http://world.std.com/~reinhold/dicewarefaq.html#computer
        if (($size & ($size - 1)) != 0) {
            throw new InvalidSymbolListException('Symbol list must be a whole power of two long.');
        }
        $this->symbolList = $symbolList;
        $this->bitMask = count($symbolList) - 1;
    }

    /**
     * Get a random symbol
     * @return string
     */
    private function getRandomSymbol()
    {
        return $this->symbolList[$this->getRandomBits()];
    }

    /**
     * Generate a Password
     * @return string
     */
    public function generate()
    {
        $password = $this->getRandomSymbol();
        for ($i=1; $i< $this->length; $i++) {
            $password .= $this->seperator . $this->getRandomSymbol();
        }
        return $password;
    }

    /**
     * Get Our Random Bits
     * @return int
     */
    private function getRandomBits()
    {
        return unpack("Nint", random_bytes(self::BYTE_LENGTH))['int'] & $this->bitMask;
    }

    /**
     * calculate how much entropy our password has
     * return int;
     */
    public function entropy()
    {
        return $this->length*log(count($this->symbolList), 2);
    }
}