{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}

-- | Generate fake US addresses.
module Fake.Provider.Address.EN_US where

------------------------------------------------------------------------------
import           Data.Map (Map)
import qualified Data.Map as M
import           Data.Maybe
import           Data.Text (Text)
import qualified Data.Text as T
import           GHC.Generics
import           Text.Printf
------------------------------------------------------------------------------
import           Fake
import           Fake.Provider.Lang
import           Fake.Provider.Person.EN_US
------------------------------------------------------------------------------


------------------------------------------------------------------------------
-- | Generates a fake address.
fakeAddress :: FGen Text
fakeAddress = do
    street <- fakeStreet
    s <- fakeState
    c <- fakeCityInState s
    z <- fakeZipInState s
    return $ T.pack $ printf "%s\n%s, %s %s" street c (stateAbbreviation s) z


------------------------------------------------------------------------------
-- | Generates a fake street component consisting of building number, street
-- name, and optional secondary suite or apartment number.
fakeStreet :: FGen Text
fakeStreet = do
    buildingNumber <- fakeInt 100 99999
    street <- fakeStreetName
    secondary <- oneof
      [ T.pack . printf "Apt. %d" <$> fakeInt 100 999
      , T.pack . printf "Suite %d" <$> fakeInt 100 999
      ]
    elements $ map T.pack
      [ printf "%d %s" buildingNumber street
      , printf "%d %s\n%s" buildingNumber street secondary
      ]


------------------------------------------------------------------------------
-- | Generates fake street names.
fakeStreetName :: FGen Text
fakeStreetName =
    fmap T.pack $ printf "%s %s"
      <$> fmap unSingleWord (oneof [firstName, lastName])
      <*> fakeStreetSuffix


------------------------------------------------------------------------------
-- | Generates fake US state.
fakeState :: FGen UsState
fakeState = fakeEnum


------------------------------------------------------------------------------
-- | Generates a fake city in a US state.  These are generated from a list of
-- actual US cities in each state.
fakeCityInState :: UsState -> FGen Text
fakeCityInState s = elements $ fromJust $ M.lookup s usCities


------------------------------------------------------------------------------
-- | Generates a fake zip code in a US state.  Generated zip codes should
-- actually be valid for the given state.
fakeZipInState :: UsState -> FGen Text
fakeZipInState s = fakeNumberScheme $ stateZipFormat s


------------------------------------------------------------------------------
-- | Generates a fake street suffix, e.g. road, street, avenue, etc.
fakeStreetSuffix :: FGen Text
fakeStreetSuffix = elements
    [ "Avenue"
    , "Circle"
    , "Court"
    , "Crescent"
    , "Drive"
    , "Lane"
    , "Pike"
    , "Place"
    , "Plaza"
    , "Road"
    , "Street"
    , "Terrace"
    , "Trail"
    , "Way"
    ]


------------------------------------------------------------------------------
-- | Enumeration of the fifty US states.
data UsState
  = Alabama
  | Alaska
  | Arizona
  | Arkansas
  | California
  | Colorado
  | Connecticut
  | Delaware
  | Florida
  | Georgia
  | Hawaii
  | Idaho
  | Illinois
  | Indiana
  | Iowa
  | Kansas
  | Kentucky
  | Louisiana
  | Maine
  | Maryland
  | Massachusetts
  | Michigan
  | Minnesota
  | Mississippi
  | Missouri
  | Montana
  | Nebraska
  | Nevada
  | NewHampshire
  | NewJersey
  | NewMexico
  | NewYork
  | NorthCarolina
  | NorthDakota
  | Ohio
  | Oklahoma
  | Oregon
  | Pennsylvania
  | RhodeIsland
  | SouthCarolina
  | SouthDakota
  | Tennessee
  | Texas
  | Utah
  | Vermont
  | Virginia
  | Washington
  | WestVirginia
  | Wisconsin
  | Wyoming
  deriving (Eq,Ord,Read,Show,Enum,Bounded,Generic)


------------------------------------------------------------------------------
-- | Returns the two-character abbreviation for the given US state.
stateAbbreviation :: UsState -> Text
stateAbbreviation Alabama = "AL"
stateAbbreviation Alaska = "AK"
stateAbbreviation Arizona = "AZ"
stateAbbreviation Arkansas = "AR"
stateAbbreviation California = "CA"
stateAbbreviation Colorado = "CO"
stateAbbreviation Connecticut = "CT"
stateAbbreviation Delaware = "DE"
stateAbbreviation Florida = "FL"
stateAbbreviation Georgia = "GA"
stateAbbreviation Hawaii = "HI"
stateAbbreviation Idaho = "ID"
stateAbbreviation Illinois = "IL"
stateAbbreviation Indiana = "IN"
stateAbbreviation Iowa = "IA"
stateAbbreviation Kansas = "KS"
stateAbbreviation Kentucky = "KY"
stateAbbreviation Louisiana = "LA"
stateAbbreviation Maine = "ME"
stateAbbreviation Maryland = "MD"
stateAbbreviation Massachusetts = "MA"
stateAbbreviation Michigan = "MI"
stateAbbreviation Minnesota = "MN"
stateAbbreviation Mississippi = "MS"
stateAbbreviation Missouri = "MO"
stateAbbreviation Montana = "MT"
stateAbbreviation Nebraska = "NE"
stateAbbreviation Nevada = "NV"
stateAbbreviation NewHampshire = "NH"
stateAbbreviation NewJersey = "NJ"
stateAbbreviation NewMexico = "NM"
stateAbbreviation NewYork = "NY"
stateAbbreviation NorthCarolina = "NC"
stateAbbreviation NorthDakota = "ND"
stateAbbreviation Ohio = "OH"
stateAbbreviation Oklahoma = "OK"
stateAbbreviation Oregon = "OR"
stateAbbreviation Pennsylvania = "PA"
stateAbbreviation RhodeIsland = "RI"
stateAbbreviation SouthCarolina = "SC"
stateAbbreviation SouthDakota = "SD"
stateAbbreviation Tennessee = "TN"
stateAbbreviation Texas = "TX"
stateAbbreviation Utah = "UT"
stateAbbreviation Vermont = "VT"
stateAbbreviation Virginia = "VA"
stateAbbreviation Washington = "WA"
stateAbbreviation WestVirginia = "WV"
stateAbbreviation Wisconsin = "WI"
stateAbbreviation Wyoming = "WY"


------------------------------------------------------------------------------
-- | Returns the two-character abbreviation for the given US state.
stateZipFormat :: UsState -> NumberScheme
stateZipFormat Alabama = NumberScheme "350##"
stateZipFormat Alaska = NumberScheme "995##"
stateZipFormat Arizona = NumberScheme "850##"
stateZipFormat Arkansas = NumberScheme "717##"
stateZipFormat California = NumberScheme "900##"
stateZipFormat Colorado = NumberScheme "800##"
stateZipFormat Connecticut = NumberScheme "061##"
stateZipFormat Delaware = NumberScheme "198##"
stateZipFormat Florida = NumberScheme "322##"
stateZipFormat Georgia = NumberScheme "301##"
stateZipFormat Hawaii = NumberScheme "967##"
stateZipFormat Idaho = NumberScheme "832##"
stateZipFormat Illinois = NumberScheme "600##"
stateZipFormat Indiana = NumberScheme "463##"
stateZipFormat Iowa = NumberScheme "510##"
stateZipFormat Kansas = NumberScheme "666##"
stateZipFormat Kentucky = NumberScheme "404##"
stateZipFormat Louisiana = NumberScheme "701##"
stateZipFormat Maine = NumberScheme "042##"
stateZipFormat Maryland = NumberScheme "210##"
stateZipFormat Massachusetts = NumberScheme "026##"
stateZipFormat Michigan = NumberScheme "480##"
stateZipFormat Minnesota = NumberScheme "555##"
stateZipFormat Mississippi = NumberScheme "387##"
stateZipFormat Missouri = NumberScheme "650##"
stateZipFormat Montana = NumberScheme "590##"
stateZipFormat Nebraska = NumberScheme "688##"
stateZipFormat Nevada = NumberScheme "898##"
stateZipFormat NewHampshire = NumberScheme "036##"
stateZipFormat NewJersey = NumberScheme "076##"
stateZipFormat NewMexico = NumberScheme "880##"
stateZipFormat NewYork = NumberScheme "122##"
stateZipFormat NorthCarolina = NumberScheme "288##"
stateZipFormat NorthDakota = NumberScheme "586##"
stateZipFormat Ohio = NumberScheme "444##"
stateZipFormat Oklahoma = NumberScheme "730##"
stateZipFormat Oregon = NumberScheme "979##"
stateZipFormat Pennsylvania = NumberScheme "186##"
stateZipFormat RhodeIsland = NumberScheme "029##"
stateZipFormat SouthCarolina = NumberScheme "299##"
stateZipFormat SouthDakota = NumberScheme "577##"
stateZipFormat Tennessee = NumberScheme "383##"
stateZipFormat Texas = NumberScheme "798##"
stateZipFormat Utah = NumberScheme "847##"
stateZipFormat Vermont = NumberScheme "050##"
stateZipFormat Virginia = NumberScheme "222##"
stateZipFormat Washington = NumberScheme "990##"
stateZipFormat WestVirginia = NumberScheme "247##"
stateZipFormat Wisconsin = NumberScheme "549##"
stateZipFormat Wyoming = NumberScheme "831##"


------------------------------------------------------------------------------
-- | Map of actual cities in each US state.
usCities :: Map UsState [Text]
usCities = M.fromList
    [ (Alabama, ["Alexander City" , "Andalusia" , "Anniston" , "Athens" , "Atmore" , "Auburn" , "Bessemer" , "Birmingham" , "Chickasaw" , "Clanton" , "Cullman" , "Decatur" , "Demopolis" , "Dothan" , "Enterprise" , "Eufaula" , "Florence" , "Fort Payne" , "Gadsden" , "Greenville" , "Guntersville" , "Huntsville" , "Jasper" , "Marion" , "Mobile" , "Montgomery" , "Opelika" , "Ozark" , "Phenix City" , "Prichard" , "Scottsboro" , "Selma" , "Sheffield" , "Sylacauga" , "Talladega" , "Troy" , "Tuscaloosa" , "Tuscumbia" , "Tuskegee"])
    , (Alaska, ["Anchorage" , "Cordova" , "Fairbanks" , "Haines" , "Homer" , "Juneau" , "Ketchikan" , "Kodiak" , "Kotzebue" , "Nome" , "Palmer" , "Seward" , "Sitka" , "Skagway" , "Valdez"])
    , (Arizona, ["Ajo" , "Avondale" , "Bisbee" , "Casa Grande" , "Chandler" , "Clifton" , "Douglas" , "Flagstaff" , "Florence" , "Gila Bend" , "Glendale" , "Globe" , "Kingman" , "Lake Havasu City" , "Mesa" , "Nogales" , "Oraibi" , "Phoenix" , "Prescott" , "Scottsdale" , "Sierra Vista" , "Tempe" , "Tombstone" , "Tucson" , "Walpi" , "Window Rock" , "Winslow" , "Yuma"])
    , (Arkansas, ["Arkadelphia" , "Arkansas Post" , "Batesville" , "Benton" , "Blytheville" , "Camden" , "Conway" , "Crossett" , "El Dorado" , "Fayetteville" , "Forrest City" , "Fort Smith" , "Harrison" , "Helena" , "Hope" , "Hot Springs" , "Jacksonville" , "Jonesboro" , "Little Rock" , "Magnolia" , "Morrilton" , "Newport" , "North Little Rock" , "Osceola" , "Pine Bluff" , "Rogers" , "Searcy" , "Stuttgart" , "Van Buren" , "West Memphis"])
    , (California, ["Alameda" , "Alhambra" , "Anaheim" , "Antioch" , "Arcadia" , "Bakersfield" , "Barstow" , "Belmont" , "Berkeley" , "Beverly Hills" , "Brea" , "Buena Park" , "Burbank" , "Calexico" , "Calistoga" , "Carlsbad" , "Carmel" , "Chico" , "Chula Vista" , "Claremont" , "Compton" , "Concord" , "Corona" , "Coronado" , "Costa Mesa" , "Culver City" , "Daly City" , "Davis" , "Downey" , "El Centro" , "El Cerrito" , "El Monte" , "Escondido" , "Eureka" , "Fairfield" , "Fontana" , "Fremont" , "Fresno" , "Fullerton" , "Garden Grove" , "Glendale" , "Hayward" , "Hollywood" , "Huntington Beach" , "Indio" , "Inglewood" , "Irvine" , "La Habra" , "Laguna Beach" , "Lancaster" , "Livermore" , "Lodi" , "Lompoc" , "Long Beach" , "Los Angeles" , "Malibu" , "Martinez" , "Marysville" , "Menlo Park" , "Merced" , "Modesto" , "Monterey" , "Mountain View" , "Napa" , "Needles" , "Newport Beach" , "Norwalk" , "Novato" , "Oakland" , "Oceanside" , "Ojai" , "Ontario" , "Orange" , "Oroville" , "Oxnard" , "Pacific Grove" , "Palm Springs" , "Palmdale" , "Palo Alto" , "Pasadena" , "Petaluma" , "Pomona" , "Port Hueneme" , "Rancho Cucamonga" , "Red Bluff" , "Redding" , "Redlands" , "Redondo Beach" , "Redwood City" , "Richmond" , "Riverside" , "Roseville" , "Sacramento" , "Salinas" , "San Bernardino" , "San Clemente" , "San Diego" , "San Fernando" , "San Francisco" , "San Gabriel" , "San Jose" , "San Juan Capistrano" , "San Leandro" , "San Luis Obispo" , "San Marino" , "San Mateo" , "San Pedro" , "San Rafael" , "San Simeon" , "Santa Ana" , "Santa Barbara" , "Santa Clara" , "Santa Clarita" , "Santa Cruz" , "Santa Monica" , "Santa Rosa" , "Sausalito" , "Simi Valley" , "Sonoma" , "South San Francisco" , "Stockton" , "Sunnyvale" , "Susanville" , "Thousand Oaks" , "Torrance" , "Turlock" , "Ukiah" , "Vallejo" , "Ventura" , "Victorville" , "Visalia" , "Walnut Creek" , "Watts" , "West Covina" , "Whittier" , "Woodland" , "Yorba Linda" , "Yuba City"])
    , (Colorado, ["Alamosa" , "Aspen" , "Aurora" , "Boulder" , "Breckenridge" , "Brighton" , "Canon City" , "Central City" , "Climax" , "Colorado Springs" , "Cortez" , "Cripple Creek" , "Denver" , "Durango" , "Englewood" , "Estes Park" , "Fort Collins" , "Fort Morgan" , "Georgetown" , "Glenwood Springs" , "Golden" , "Grand Junction" , "Greeley" , "Gunnison" , "La Junta" , "Leadville" , "Littleton" , "Longmont" , "Loveland" , "Montrose" , "Ouray" , "Pagosa Springs" , "Pueblo" , "Silverton" , "Steamboat Springs" , "Sterling" , "Telluride" , "Trinidad" , "Vail" , "Walsenburg" , "Westminster"])
    , (Connecticut, ["Ansonia" , "Berlin" , "Bloomfield" , "Branford" , "Bridgeport" , "Bristol" , "Coventry" , "Danbury" , "Darien" , "Derby" , "East Hartford" , "East Haven" , "Enfield" , "Fairfield" , "Farmington" , "Greenwich" , "Groton" , "Guilford" , "Hamden" , "Hartford" , "Lebanon" , "Litchfield" , "Manchester" , "Mansfield" , "Meriden" , "Middletown" , "Milford" , "Mystic" , "Naugatuck" , "New Britain" , "New Haven" , "New London" , "North Haven" , "Norwalk" , "Norwich" , "Old Saybrook" , "Orange" , "Seymour" , "Shelton" , "Simsbury" , "Southington" , "Stamford" , "Stonington" , "Stratford" , "Torrington" , "Wallingford" , "Waterbury" , "Waterford" , "Watertown" , "West Hartford" , "West Haven" , "Westport" , "Wethersfield" , "Willimantic" , "Windham" , "Windsor" , "Windsor Locks" , "Winsted"])
    , (Delaware, ["Dover" , "Lewes" , "Milford" , "New Castle" , "Newark" , "Smyrna" , "Wilmington"])
    , (Florida, ["Apalachicola" , "Bartow" , "Belle Glade" , "Boca Raton" , "Bradenton" , "Cape Coral" , "Clearwater" , "Cocoa Beach" , "Cocoa-Rockledge" , "Coral Gables" , "Daytona Beach" , "De Land" , "Deerfield Beach" , "Delray Beach" , "Fernandina Beach" , "Fort Lauderdale" , "Fort Myers" , "Fort Pierce" , "Fort Walton Beach" , "Gainesville" , "Hallandale Beach" , "Hialeah" , "Hollywood" , "Homestead" , "Jacksonville" , "Key West" , "Lake City" , "Lake Wales" , "Lakeland" , "Largo" , "Melbourne" , "Miami" , "Miami Beach" , "Naples" , "New Smyrna Beach" , "Ocala" , "Orlando" , "Ormond Beach" , "Palatka" , "Palm Bay" , "Palm Beach" , "Panama City" , "Pensacola" , "Pompano Beach" , "Saint Augustine" , "Saint Petersburg" , "Sanford" , "Sarasota" , "Sebring" , "Tallahassee" , "Tampa" , "Tarpon Springs" , "Titusville" , "Venice" , "West Palm Beach" , "White Springs" , "Winter Haven" , "Winter Park"])
    , (Georgia, ["Albany" , "Americus" , "Andersonville" , "Athens" , "Atlanta" , "Augusta" , "Bainbridge" , "Blairsville" , "Brunswick" , "Calhoun" , "Carrollton" , "Columbus" , "Dahlonega" , "Dalton" , "Darien" , "Decatur" , "Douglas" , "East Point" , "Fitzgerald" , "Fort Valley" , "Gainesville" , "La Grange" , "Macon" , "Marietta" , "Milledgeville" , "Plains" , "Rome" , "Savannah" , "Toccoa" , "Valdosta" , "Warm Springs" , "Warner Robins" , "Washington" , "Waycross"])
    , (Hawaii, ["Hanalei" , "Hilo" , "Honaunau" , "Honolulu" , "Kahului" , "Kaneohe" , "Kapaa" , "Kawaihae" , "Lahaina" , "Laie" , "Wahiawa" , "Wailuku" , "Waimea"])
    , (Idaho, ["Blackfoot" , "Boise" , "Bonners Ferry" , "Caldwell" , "Coeur d’Alene" , "Idaho City" , "Idaho Falls" , "Kellogg" , "Lewiston" , "Moscow" , "Nampa" , "Pocatello" , "Priest River" , "Rexburg" , "Sun Valley" , "Twin Falls"])
    , (Illinois, ["Alton" , "Arlington Heights" , "Arthur" , "Aurora" , "Belleville" , "Belvidere" , "Bloomington" , "Brookfield" , "Cahokia" , "Cairo" , "Calumet City" , "Canton" , "Carbondale" , "Carlinville" , "Carthage" , "Centralia" , "Champaign" , "Charleston" , "Chester" , "Chicago" , "Chicago Heights" , "Cicero" , "Collinsville" , "Danville" , "Decatur" , "DeKalb" , "Des Plaines" , "Dixon" , "East Moline" , "East Saint Louis" , "Effingham" , "Elgin" , "Elmhurst" , "Evanston" , "Freeport" , "Galena" , "Galesburg" , "Glen Ellyn" , "Glenview" , "Granite City" , "Harrisburg" , "Herrin" , "Highland Park" , "Jacksonville" , "Joliet" , "Kankakee" , "Kaskaskia" , "Kewanee" , "La Salle" , "Lake Forest" , "Libertyville" , "Lincoln" , "Lisle" , "Lombard" , "Macomb" , "Mattoon" , "Moline" , "Monmouth" , "Mount Vernon" , "Mundelein" , "Naperville" , "Nauvoo" , "Normal" , "North Chicago" , "Oak Park" , "Oregon" , "Ottawa" , "Palatine" , "Park Forest" , "Park Ridge" , "Pekin" , "Peoria" , "Petersburg" , "Pontiac" , "Quincy" , "Rantoul" , "River Forest" , "Rock Island" , "Rockford" , "Salem" , "Shawneetown" , "Skokie" , "South Holland" , "Springfield" , "Streator" , "Summit" , "Urbana" , "Vandalia" , "Virden" , "Waukegan" , "Wheaton" , "Wilmette" , "Winnetka" , "Wood River" , "Zion"])
    , (Indiana, ["Anderson" , "Bedford" , "Bloomington" , "Columbus" , "Connersville" , "Corydon" , "Crawfordsville" , "East Chicago" , "Elkhart" , "Elwood" , "Evansville" , "Fort Wayne" , "French Lick" , "Gary" , "Geneva" , "Goshen" , "Greenfield" , "Hammond" , "Hobart" , "Huntington" , "Indianapolis" , "Jeffersonville" , "Kokomo" , "Lafayette" , "Madison" , "Marion" , "Michigan City" , "Mishawaka" , "Muncie" , "Nappanee" , "Nashville" , "New Albany" , "New Castle" , "New Harmony" , "Peru" , "Plymouth" , "Richmond" , "Santa Claus" , "Shelbyville" , "South Bend" , "Terre Haute" , "Valparaiso" , "Vincennes" , "Wabash" , "West Lafayette"])
    , (Iowa, ["Amana Colonies" , "Ames" , "Boone" , "Burlington" , "Cedar Falls" , "Cedar Rapids" , "Charles City" , "Cherokee" , "Clinton" , "Council Bluffs" , "Davenport" , "Des Moines" , "Dubuque" , "Estherville" , "Fairfield" , "Fort Dodge" , "Grinnell" , "Indianola" , "Iowa City" , "Keokuk" , "Mason City" , "Mount Pleasant" , "Muscatine" , "Newton" , "Oskaloosa" , "Ottumwa" , "Sioux City" , "Waterloo" , "Webster City" , "West Des Moines"])
    , (Kansas, ["Abilene" , "Arkansas City" , "Atchison" , "Chanute" , "Coffeyville" , "Council Grove" , "Dodge City" , "Emporia" , "Fort Scott" , "Garden City" , "Great Bend" , "Hays" , "Hutchinson" , "Independence" , "Junction City" , "Kansas City" , "Lawrence" , "Leavenworth" , "Liberal" , "Manhattan" , "McPherson" , "Medicine Lodge" , "Newton" , "Olathe" , "Osawatomie" , "Ottawa" , "Overland Park" , "Pittsburg" , "Salina" , "Shawnee" , "Smith Center" , "Topeka" , "Wichita"])
    , (Kentucky, ["Ashland" , "Barbourville" , "Bardstown" , "Berea" , "Boonesborough" , "Bowling Green" , "Campbellsville" , "Covington" , "Danville" , "Elizabethtown" , "Frankfort" , "Harlan" , "Harrodsburg" , "Hazard" , "Henderson" , "Hodgenville" , "Hopkinsville" , "Lexington" , "Louisville" , "Mayfield" , "Maysville" , "Middlesboro" , "Newport" , "Owensboro" , "Paducah" , "Paris" , "Richmond"])
    , (Louisiana, ["Abbeville" , "Alexandria" , "Bastrop" , "Baton Rouge" , "Bogalusa" , "Bossier City" , "Gretna" , "Houma" , "Lafayette" , "Lake Charles" , "Monroe" , "Morgan City" , "Natchitoches" , "New Iberia" , "New Orleans" , "Opelousas" , "Ruston" , "Saint Martinville" , "Shreveport" , "Thibodaux"])
    , (Maine, ["Auburn" , "Augusta" , "Bangor" , "Bar Harbor" , "Bath" , "Belfast" , "Biddeford" , "Boothbay Harbor" , "Brunswick" , "Calais" , "Caribou" , "Castine" , "Eastport" , "Ellsworth" , "Farmington" , "Fort Kent" , "Gardiner" , "Houlton" , "Kennebunkport" , "Kittery" , "Lewiston" , "Lubec" , "Machias" , "Orono" , "Portland" , "Presque Isle" , "Rockland" , "Rumford" , "Saco" , "Scarborough" , "Waterville" , "York"])
    , (Maryland, ["Aberdeen" , "Annapolis" , "Baltimore" , "Bethesda-Chevy Chase" , "Bowie" , "Cambridge" , "Catonsville" , "College Park" , "Columbia" , "Cumberland" , "Easton" , "Elkton" , "Emmitsburg" , "Frederick" , "Greenbelt" , "Hagerstown" , "Hyattsville" , "Laurel" , "Oakland" , "Ocean City" , "Rockville" , "Saint Marys City" , "Salisbury" , "Silver Spring" , "Takoma Park" , "Towson" , "Westminster"])
    , (Massachusetts, ["Abington" , "Adams" , "Amesbury" , "Amherst" , "Andover" , "Arlington" , "Athol" , "Attleboro" , "Barnstable" , "Bedford" , "Beverly" , "Boston" , "Bourne" , "Braintree" , "Brockton" , "Brookline" , "Cambridge" , "Canton" , "Charlestown" , "Chelmsford" , "Chelsea" , "Chicopee" , "Clinton" , "Cohasset" , "Concord" , "Danvers" , "Dartmouth" , "Dedham" , "Dennis" , "Duxbury" , "Eastham" , "Edgartown" , "Everett" , "Fairhaven" , "Fall River" , "Falmouth" , "Fitchburg" , "Framingham" , "Gloucester" , "Great Barrington" , "Greenfield" , "Groton" , "Harwich" , "Haverhill" , "Hingham" , "Holyoke" , "Hyannis" , "Ipswich" , "Lawrence" , "Lenox" , "Leominster" , "Lexington" , "Lowell" , "Ludlow" , "Lynn" , "Malden" , "Marblehead" , "Marlborough" , "Medford" , "Milton" , "Nahant" , "Natick" , "New Bedford" , "Newburyport" , "Newton" , "North Adams" , "Northampton" , "Norton" , "Norwood" , "Peabody" , "Pittsfield" , "Plymouth" , "Provincetown" , "Quincy" , "Randolph" , "Revere" , "Salem" , "Sandwich" , "Saugus" , "Somerville" , "South Hadley" , "Springfield" , "Stockbridge" , "Stoughton" , "Sturbridge" , "Sudbury" , "Taunton" , "Tewksbury" , "Truro" , "Watertown" , "Webster" , "Wellesley" , "Wellfleet" , "West Bridgewater" , "West Springfield" , "Westfield" , "Weymouth" , "Whitman" , "Williamstown" , "Woburn" , "Woods Hole" , "Worcester"])
    , (Michigan, ["Adrian" , "Alma" , "Ann Arbor" , "Battle Creek" , "Bay City" , "Benton Harbor" , "Bloomfield Hills" , "Cadillac" , "Charlevoix" , "Cheboygan" , "Dearborn" , "Detroit" , "East Lansing" , "Eastpointe" , "Ecorse" , "Escanaba" , "Flint" , "Grand Haven" , "Grand Rapids" , "Grayling" , "Grosse Pointe" , "Hancock" , "Highland Park" , "Holland" , "Houghton" , "Interlochen" , "Iron Mountain" , "Ironwood" , "Ishpeming" , "Jackson" , "Kalamazoo" , "Lansing" , "Livonia" , "Ludington" , "Mackinaw City" , "Manistee" , "Marquette" , "Menominee" , "Midland" , "Monroe" , "Mount Clemens" , "Mount Pleasant" , "Muskegon" , "Niles" , "Petoskey" , "Pontiac" , "Port Huron" , "Royal Oak" , "Saginaw" , "Saint Ignace" , "Saint Joseph" , "Sault Sainte Marie" , "Traverse City" , "Trenton" , "Warren" , "Wyandotte" , "Ypsilanti"])
    , (Minnesota, ["Albert Lea" , "Alexandria" , "Austin" , "Bemidji" , "Bloomington" , "Brainerd" , "Crookston" , "Duluth" , "Ely" , "Eveleth" , "Faribault" , "Fergus Falls" , "Hastings" , "Hibbing" , "International Falls" , "Little Falls" , "Mankato" , "Minneapolis" , "Moorhead" , "New Ulm" , "Northfield" , "Owatonna" , "Pipestone" , "Red Wing" , "Rochester" , "Saint Cloud" , "Saint Paul" , "Sauk Centre" , "South Saint Paul" , "Stillwater" , "Virginia" , "Willmar" , "Winona"])
    , (Mississippi, ["Bay Saint Louis" , "Biloxi" , "Canton" , "Clarksdale" , "Columbia" , "Columbus" , "Corinth" , "Greenville" , "Greenwood" , "Grenada" , "Gulfport" , "Hattiesburg" , "Holly Springs" , "Jackson" , "Laurel" , "Meridian" , "Natchez" , "Ocean Springs" , "Oxford" , "Pascagoula" , "Pass Christian" , "Philadelphia" , "Port Gibson" , "Starkville" , "Tupelo" , "Vicksburg" , "West Point" , "Yazoo City"])
    , (Missouri, ["Boonville" , "Branson" , "Cape Girardeau" , "Carthage" , "Chillicothe" , "Clayton" , "Columbia" , "Excelsior Springs" , "Ferguson" , "Florissant" , "Fulton" , "Hannibal" , "Independence" , "Jefferson City" , "Joplin" , "Kansas City" , "Kirksville" , "Lamar" , "Lebanon" , "Lexington" , "Maryville" , "Mexico" , "Monett" , "Neosho" , "New Madrid" , "Rolla" , "Saint Charles" , "Saint Joseph" , "Saint Louis" , "Sainte Genevieve" , "Salem" , "Sedalia" , "Springfield" , "Warrensburg" , "West Plains"])
    , (Montana, ["Anaconda" , "Billings" , "Bozeman" , "Butte" , "Dillon" , "Fort Benton" , "Glendive" , "Great Falls" , "Havre" , "Helena" , "Kalispell" , "Lewistown" , "Livingston" , "Miles City" , "Missoula" , "Virginia City"])
    , (Nebraska, ["Beatrice" , "Bellevue" , "Boys Town" , "Chadron" , "Columbus" , "Fremont" , "Grand Island" , "Hastings" , "Kearney" , "Lincoln" , "McCook" , "Minden" , "Nebraska City" , "Norfolk" , "North Platte" , "Omaha" , "Plattsmouth" , "Red Cloud" , "Sidney"])
    , (Nevada, ["Boulder City" , "Carson City" , "Elko" , "Ely" , "Fallon" , "Genoa" , "Goldfield" , "Henderson" , "Las Vegas" , "North Las Vegas" , "Reno" , "Sparks" , "Virginia City" , "Winnemucca"])
    , (NewHampshire, ["Berlin" , "Claremont" , "Concord" , "Derry" , "Dover" , "Durham" , "Exeter" , "Franklin" , "Hanover" , "Hillsborough" , "Keene" , "Laconia" , "Lebanon" , "Manchester" , "Nashua" , "Peterborough" , "Plymouth" , "Portsmouth" , "Rochester" , "Salem" , "Somersworth"])
    , (NewJersey, ["Asbury Park" , "Atlantic City" , "Bayonne" , "Bloomfield" , "Bordentown" , "Bound Brook" , "Bridgeton" , "Burlington" , "Caldwell" , "Camden" , "Cape May" , "Clifton" , "Cranford" , "East Orange" , "Edison" , "Elizabeth" , "Englewood" , "Fort Lee" , "Glassboro" , "Hackensack" , "Haddonfield" , "Hoboken" , "Irvington" , "Jersey City" , "Lakehurst" , "Lakewood" , "Long Beach" , "Long Branch" , "Madison" , "Menlo Park" , "Millburn" , "Millville" , "Montclair" , "Morristown" , "Mount Holly" , "New Brunswick" , "New Milford" , "Newark" , "Ocean City" , "Orange" , "Parsippany–Troy Hills" , "Passaic" , "Paterson" , "Perth Amboy" , "Plainfield" , "Princeton" , "Ridgewood" , "Roselle" , "Rutherford" , "Salem" , "Somerville" , "South Orange Village" , "Totowa" , "Trenton" , "Union" , "Union City" , "Vineland" , "Wayne" , "Weehawken" , "West New York" , "West Orange" , "Willingboro" , "Woodbridge"])
    , (NewMexico, ["Acoma" , "Alamogordo" , "Albuquerque" , "Artesia" , "Belen" , "Carlsbad" , "Clovis" , "Deming" , "Farmington" , "Gallup" , "Grants" , "Hobbs" , "Las Cruces" , "Las Vegas" , "Los Alamos" , "Lovington" , "Portales" , "Raton" , "Roswell" , "Santa Fe" , "Shiprock" , "Silver City" , "Socorro" , "Taos" , "Truth or Consequences" , "Tucumcari"])
    , (NewYork, ["Albany" , "Amsterdam" , "Auburn" , "Babylon" , "Batavia" , "Beacon" , "Bedford" , "Binghamton" , "Bronx" , "Brooklyn" , "Buffalo" , "Chautauqua" , "Cheektowaga" , "Clinton" , "Cohoes" , "Coney Island" , "Cooperstown" , "Corning" , "Cortland" , "Crown Point" , "Dunkirk" , "East Aurora" , "East Hampton" , "Eastchester" , "Elmira" , "Flushing" , "Forest Hills" , "Fredonia" , "Garden City" , "Geneva" , "Glens Falls" , "Gloversville" , "Great Neck" , "Hammondsport" , "Harlem" , "Hempstead" , "Herkimer" , "Hudson" , "Huntington" , "Hyde Park" , "Ilion" , "Ithaca" , "Jamestown" , "Johnstown" , "Kingston" , "Lackawanna" , "Lake Placid" , "Levittown" , "Lockport" , "Mamaroneck" , "Manhattan" , "Massena" , "Middletown" , "Mineola" , "Mount Vernon" , "New Paltz" , "New Rochelle" , "New Windsor" , "New York City" , "Newburgh" , "Niagara Falls" , "North Hempstead" , "Nyack" , "Ogdensburg" , "Olean" , "Oneida" , "Oneonta" , "Ossining" , "Oswego" , "Oyster Bay" , "Palmyra" , "Peekskill" , "Plattsburgh" , "Port Washington" , "Potsdam" , "Poughkeepsie" , "Queens" , "Rensselaer" , "Rochester" , "Rome" , "Rotterdam" , "Rye" , "Sag Harbor" , "Saranac Lake" , "Saratoga Springs" , "Scarsdale" , "Schenectady" , "Seneca Falls" , "Southampton" , "Staten Island" , "Stony Brook" , "Stony Point" , "Syracuse" , "Tarrytown" , "Ticonderoga" , "Tonawanda" , "Troy" , "Utica" , "Watertown" , "Watervliet" , "Watkins Glen" , "West Seneca" , "White Plains" , "Woodstock" , "Yonkers"])
    , (NorthCarolina, ["Asheboro" , "Asheville" , "Bath" , "Beaufort" , "Boone" , "Burlington" , "Chapel Hill" , "Charlotte" , "Concord" , "Durham" , "Edenton" , "Elizabeth City" , "Fayetteville" , "Gastonia" , "Goldsboro" , "Greensboro" , "Greenville" , "Halifax" , "Henderson" , "Hickory" , "High Point" , "Hillsborough" , "Jacksonville" , "Kinston" , "Kitty Hawk" , "Lumberton" , "Morehead City" , "Morganton" , "Nags Head" , "New Bern" , "Pinehurst" , "Raleigh" , "Rocky Mount" , "Salisbury" , "Shelby" , "Washington" , "Wilmington" , "Wilson" , "Winston-Salem"])
    , (NorthDakota, ["Bismarck" , "Devils Lake" , "Dickinson" , "Fargo" , "Grand Forks" , "Jamestown" , "Mandan" , "Minot" , "Rugby" , "Valley City" , "Wahpeton" , "Williston"])
    , (Ohio, ["Akron" , "Alliance" , "Ashtabula" , "Athens" , "Barberton" , "Bedford" , "Bellefontaine" , "Bowling Green" , "Canton" , "Chillicothe" , "Cincinnati" , "Cleveland" , "Cleveland Heights" , "Columbus" , "Conneaut" , "Cuyahoga Falls" , "Dayton" , "Defiance" , "Delaware" , "East Cleveland" , "East Liverpool" , "Elyria" , "Euclid" , "Findlay" , "Gallipolis" , "Greenville" , "Hamilton" , "Kent" , "Kettering" , "Lakewood" , "Lancaster" , "Lima" , "Lorain" , "Mansfield" , "Marietta" , "Marion" , "Martins Ferry" , "Massillon" , "Mentor" , "Middletown" , "Milan" , "Mount Vernon" , "New Philadelphia" , "Newark" , "Niles" , "North College Hill" , "Norwalk" , "Oberlin" , "Painesville" , "Parma" , "Piqua" , "Portsmouth" , "Put-in-Bay" , "Salem" , "Sandusky" , "Shaker Heights" , "Springfield" , "Steubenville" , "Tiffin" , "Toledo" , "Urbana" , "Warren" , "Wooster" , "Worthington" , "Xenia" , "Yellow Springs" , "Youngstown" , "Zanesville"])
    , (Oklahoma, ["Ada" , "Altus" , "Alva" , "Anadarko" , "Ardmore" , "Bartlesville" , "Bethany" , "Chickasha" , "Claremore" , "Clinton" , "Cushing" , "Duncan" , "Durant" , "Edmond" , "El Reno" , "Elk City" , "Enid" , "Eufaula" , "Frederick" , "Guthrie" , "Guymon" , "Hobart" , "Holdenville" , "Hugo" , "Lawton" , "McAlester" , "Miami" , "Midwest City" , "Moore" , "Muskogee" , "Norman" , "Oklahoma City" , "Okmulgee" , "Pauls Valley" , "Pawhuska" , "Perry" , "Ponca City" , "Pryor" , "Sallisaw" , "Sand Springs" , "Sapulpa" , "Seminole" , "Shawnee" , "Stillwater" , "Tahlequah" , "The Village" , "Tulsa" , "Vinita" , "Wewoka" , "Woodward"])
    , (Oregon, ["Albany" , "Ashland" , "Astoria" , "Baker City" , "Beaverton" , "Bend" , "Brookings" , "Burns" , "Coos Bay" , "Corvallis" , "Eugene" , "Grants Pass" , "Hillsboro" , "Hood River" , "Jacksonville" , "John Day" , "Klamath Falls" , "La Grande" , "Lake Oswego" , "Lakeview" , "McMinnville" , "Medford" , "Newberg" , "Newport" , "Ontario" , "Oregon City" , "Pendleton" , "Port Orford" , "Portland" , "Prineville" , "Redmond" , "Reedsport" , "Roseburg" , "Salem" , "Seaside" , "Springfield" , "The Dalles" , "Tillamook"])
    , (Pennsylvania, ["Abington" , "Aliquippa" , "Allentown" , "Altoona" , "Ambridge" , "Bedford" , "Bethlehem" , "Bloomsburg" , "Bradford" , "Bristol" , "Carbondale" , "Carlisle" , "Chambersburg" , "Chester" , "Columbia" , "Easton" , "Erie" , "Franklin" , "Germantown" , "Gettysburg" , "Greensburg" , "Hanover" , "Harmony" , "Harrisburg" , "Hazleton" , "Hershey" , "Homestead" , "Honesdale" , "Indiana" , "Jeannette" , "Jim Thorpe" , "Johnstown" , "Lancaster" , "Lebanon" , "Levittown" , "Lewistown" , "Lock Haven" , "Lower Southampton" , "McKeesport" , "Meadville" , "Middletown" , "Monroeville" , "Nanticoke" , "New Castle" , "New Hope" , "New Kensington" , "Norristown" , "Oil City" , "Philadelphia" , "Phoenixville" , "Pittsburgh" , "Pottstown" , "Pottsville" , "Reading" , "Scranton" , "Shamokin" , "Sharon" , "State College" , "Stroudsburg" , "Sunbury" , "Swarthmore" , "Tamaqua" , "Titusville" , "Uniontown" , "Warren" , "Washington" , "West Chester" , "Wilkes-Barre" , "Williamsport" , "York"])
    , (RhodeIsland, ["Barrington" , "Bristol" , "Central Falls" , "Cranston" , "East Greenwich" , "East Providence" , "Kingston" , "Middletown" , "Narragansett" , "Newport" , "North Kingstown" , "Pawtucket" , "Portsmouth" , "Providence" , "South Kingstown" , "Tiverton" , "Warren" , "Warwick" , "Westerly" , "Wickford" , "Woonsocket"])
    , (SouthCarolina, ["Abbeville" , "Aiken" , "Anderson" , "Beaufort" , "Camden" , "Charleston" , "Columbia" , "Darlington" , "Florence" , "Gaffney" , "Georgetown" , "Greenville" , "Greenwood" , "Hartsville" , "Lancaster" , "Mount Pleasant" , "Myrtle Beach" , "Orangeburg" , "Rock Hill" , "Spartanburg" , "Sumter" , "Union"])
    , (SouthDakota, ["Aberdeen" , "Belle Fourche" , "Brookings" , "Canton" , "Custer" , "De Smet" , "Deadwood" , "Hot Springs" , "Huron" , "Lead" , "Madison" , "Milbank" , "Mitchell" , "Mobridge" , "Pierre" , "Rapid City" , "Sioux Falls" , "Spearfish" , "Sturgis" , "Vermillion" , "Watertown" , "Yankton"])
    , (Tennessee, ["Alcoa" , "Athens" , "Chattanooga" , "Clarksville" , "Cleveland" , "Columbia" , "Cookeville" , "Dayton" , "Elizabethton" , "Franklin" , "Gallatin" , "Gatlinburg" , "Greeneville" , "Jackson" , "Johnson City" , "Jonesborough" , "Kingsport" , "Knoxville" , "Lebanon" , "Maryville" , "Memphis" , "Morristown" , "Murfreesboro" , "Nashville" , "Norris" , "Oak Ridge" , "Shelbyville" , "Tullahoma"])
    , (Texas, ["Abilene" , "Alpine" , "Amarillo" , "Arlington" , "Austin" , "Baytown" , "Beaumont" , "Big Spring" , "Borger" , "Brownsville" , "Bryan" , "Canyon" , "Cleburne" , "College Station" , "Corpus Christi" , "Crystal City" , "Dallas" , "Del Rio" , "Denison" , "Denton" , "Eagle Pass" , "Edinburg" , "El Paso" , "Fort Worth" , "Freeport" , "Galveston" , "Garland" , "Goliad" , "Greenville" , "Harlingen" , "Houston" , "Huntsville" , "Irving" , "Johnson City" , "Kilgore" , "Killeen" , "Kingsville" , "Laredo" , "Longview" , "Lubbock" , "Lufkin" , "Marshall" , "McAllen" , "McKinney" , "Mesquite" , "Midland" , "Mission" , "Nacogdoches" , "New Braunfels" , "Odessa" , "Orange" , "Pampa" , "Paris" , "Pasadena" , "Pecos" , "Pharr" , "Plainview" , "Plano" , "Port Arthur" , "Port Lavaca" , "Richardson" , "San Angelo" , "San Antonio" , "San Felipe" , "San Marcos" , "Sherman" , "Sweetwater" , "Temple" , "Texarkana" , "Texas City" , "Tyler" , "Uvalde" , "Victoria" , "Waco" , "Weatherford" , "Wichita Falls" , "Ysleta"])
    , (Utah, ["Alta" , "American Fork" , "Bountiful" , "Brigham City" , "Cedar City" , "Clearfield" , "Delta" , "Fillmore" , "Green River" , "Heber City" , "Kanab" , "Layton" , "Lehi" , "Logan" , "Manti" , "Moab" , "Monticello" , "Murray" , "Nephi" , "Ogden" , "Orderville" , "Orem" , "Panguitch" , "Park City" , "Payson" , "Price" , "Provo" , "Saint George" , "Salt Lake City" , "Spanish Fork" , "Springville" , "Tooele" , "Vernal"])
    , (Vermont, ["Barre" , "Bellows Falls" , "Bennington" , "Brattleboro" , "Burlington" , "Essex" , "Manchester" , "Middlebury" , "Montpelier" , "Newport" , "Plymouth" , "Rutland" , "Saint Albans" , "Saint Johnsbury" , "Sharon" , "Winooski"])
    , (Virginia, ["Abingdon" , "Alexandria" , "Bristol" , "Charlottesville" , "Chesapeake" , "Danville" , "Fairfax" , "Falls Church" , "Fredericksburg" , "Hampton" , "Hanover" , "Hopewell" , "Lexington" , "Lynchburg" , "Manassas" , "Martinsville" , "New Market" , "Newport News" , "Norfolk" , "Petersburg" , "Portsmouth" , "Reston" , "Richmond" , "Roanoke" , "Staunton" , "Suffolk" , "Virginia Beach" , "Waynesboro" , "Williamsburg" , "Winchester"])
    , (Washington, ["Aberdeen" , "Anacortes" , "Auburn" , "Bellevue" , "Bellingham" , "Bremerton" , "Centralia" , "Coulee Dam" , "Coupeville" , "Ellensburg" , "Ephrata" , "Everett" , "Hoquiam" , "Kelso" , "Kennewick" , "Longview" , "Moses Lake" , "Oak Harbor" , "Olympia" , "Pasco" , "Point Roberts" , "Port Angeles" , "Pullman" , "Puyallup" , "Redmond" , "Renton" , "Richland" , "Seattle" , "Spokane" , "Tacoma" , "Vancouver" , "Walla Walla" , "Wenatchee" , "Yakima"])
    , (WestVirginia, ["Bath" , "Beckley" , "Bluefield" , "Buckhannon" , "Charles Town" , "Charleston" , "Clarksburg" , "Elkins" , "Fairmont" , "Grafton" , "Harpers Ferry" , "Hillsboro" , "Hinton" , "Huntington" , "Keyser" , "Lewisburg" , "Logan" , "Martinsburg" , "Morgantown" , "Moundsville" , "New Martinsville" , "Parkersburg" , "Philippi" , "Point Pleasant" , "Princeton" , "Romney" , "Shepherdstown" , "South Charleston" , "Summersville" , "Weirton" , "Welch" , "Wellsburg" , "Weston" , "Wheeling" , "White Sulphur Springs" , "Williamson"])
    , (Wisconsin, ["Appleton" , "Ashland" , "Baraboo" , "Belmont" , "Beloit" , "Eau Claire" , "Fond du Lac" , "Green Bay" , "Hayward" , "Janesville" , "Kenosha" , "La Crosse" , "Lake Geneva" , "Madison" , "Manitowoc" , "Marinette" , "Menasha" , "Milwaukee" , "Neenah" , "New Glarus" , "Oconto" , "Oshkosh" , "Peshtigo" , "Portage" , "Prairie du Chien" , "Racine" , "Rhinelander" , "Ripon" , "Sheboygan" , "Spring Green" , "Stevens Point" , "Sturgeon Bay" , "Superior" , "Waukesha" , "Wausau" , "Wauwatosa" , "West Allis" , "West Bend" , "Wisconsin Dells"])
    , (Wyoming, ["Buffalo" , "Casper" , "Cheyenne" , "Cody" , "Douglas" , "Evanston" , "Gillette" , "Green River" , "Jackson" , "Lander" , "Laramie" , "Newcastle" , "Powell" , "Rawlins" , "Riverton" , "Rock Springs" , "Sheridan" , "Ten Sleep" , "Thermopolis" , "Torrington" , "Worland"])
    ]