UNPKG

sv

Version:

A CLI for creating and updating SvelteKit projects

56 lines 183 kB
[ { "name": "src/app.d.ts", "contents": "// See https://svelte.dev/docs/kit/types#app.d.ts\n// for information about these interfaces\ndeclare global {\n\tnamespace App {\n\t\t// interface Error {}\n\t\t// interface Locals {}\n\t\t// interface PageData {}\n\t\t// interface PageState {}\n\t\t// interface Platform {}\n\t}\n}\n\nexport {};\n" }, { "name": "src/routes/+layout.svelte", "contents": "<script lang=\"ts\">\n\timport Header from './Header.svelte';\n\timport '../app.css';\n\n\tlet { children } = $props();\n</script>\n\n<div class=\"app\">\n\t<Header />\n\n\t<main>\n\t\t{@render children()}\n\t</main>\n\n\t<footer>\n\t\t<p>\n\t\t\tvisit <a href=\"https://svelte.dev/docs/kit\">svelte.dev/docs/kit</a> to learn about SvelteKit\n\t\t</p>\n\t</footer>\n</div>\n\n<style>\n\t.app {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tmin-height: 100vh;\n\t}\n\n\tmain {\n\t\tflex: 1;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding: 1rem;\n\t\twidth: 100%;\n\t\tmax-width: 64rem;\n\t\tmargin: 0 auto;\n\t\tbox-sizing: border-box;\n\t}\n\n\tfooter {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tpadding: 12px;\n\t}\n\n\tfooter a {\n\t\tfont-weight: bold;\n\t}\n\n\t@media (min-width: 480px) {\n\t\tfooter {\n\t\t\tpadding: 12px 0;\n\t\t}\n\t}\n</style>\n" }, { "name": "src/routes/+page.svelte", "contents": "<script lang=\"ts\">\n\timport Counter from './Counter.svelte';\n\timport welcome from '$lib/images/svelte-welcome.webp';\n\timport welcomeFallback from '$lib/images/svelte-welcome.png';\n</script>\n\n<svelte:head>\n\t<title>Home</title>\n\t<meta name=\"description\" content=\"Svelte demo app\" />\n</svelte:head>\n\n<section>\n\t<h1>\n\t\t<span class=\"welcome\">\n\t\t\t<picture>\n\t\t\t\t<source srcset={welcome} type=\"image/webp\" />\n\t\t\t\t<img src={welcomeFallback} alt=\"Welcome\" />\n\t\t\t</picture>\n\t\t</span>\n\n\t\tto your new<br />SvelteKit app\n\t</h1>\n\n\t<h2>\n\t\ttry editing <strong>src/routes/+page.svelte</strong>\n\t</h2>\n\n\t<Counter />\n</section>\n\n<style>\n\tsection {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tflex: 0.6;\n\t}\n\n\th1 {\n\t\twidth: 100%;\n\t}\n\n\t.welcome {\n\t\tdisplay: block;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\theight: 0;\n\t\tpadding: 0 0 calc(100% * 495 / 2048) 0;\n\t}\n\n\t.welcome img {\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\ttop: 0;\n\t\tdisplay: block;\n\t}\n</style>\n" }, { "name": "src/routes/+page.ts", "contents": "// since there's no dynamic data here, we can prerender\n// it so that it gets served as a static asset in production\nexport const prerender = true;\n" }, { "name": "src/routes/Counter.svelte", "contents": "<script lang=\"ts\">\n\timport { Spring } from 'svelte/motion';\n\n\tconst count = new Spring(0);\n\tconst offset = $derived(modulo(count.current, 1));\n\n\tfunction modulo(n: number, m: number) {\n\t\t// handle negative numbers\n\t\treturn ((n % m) + m) % m;\n\t}\n</script>\n\n<div class=\"counter\">\n\t<button onclick={() => (count.target -= 1)} aria-label=\"Decrease the counter by one\">\n\t\t<svg aria-hidden=\"true\" viewBox=\"0 0 1 1\">\n\t\t\t<path d=\"M0,0.5 L1,0.5\" />\n\t\t</svg>\n\t</button>\n\n\t<div class=\"counter-viewport\">\n\t\t<div class=\"counter-digits\" style=\"transform: translate(0, {100 * offset}%)\">\n\t\t\t<strong class=\"hidden\" aria-hidden=\"true\">{Math.floor(count.current + 1)}</strong>\n\t\t\t<strong>{Math.floor(count.current)}</strong>\n\t\t</div>\n\t</div>\n\n\t<button onclick={() => (count.target += 1)} aria-label=\"Increase the counter by one\">\n\t\t<svg aria-hidden=\"true\" viewBox=\"0 0 1 1\">\n\t\t\t<path d=\"M0,0.5 L1,0.5 M0.5,0 L0.5,1\" />\n\t\t</svg>\n\t</button>\n</div>\n\n<style>\n\t.counter {\n\t\tdisplay: flex;\n\t\tborder-top: 1px solid rgba(0, 0, 0, 0.1);\n\t\tborder-bottom: 1px solid rgba(0, 0, 0, 0.1);\n\t\tmargin: 1rem 0;\n\t}\n\n\t.counter button {\n\t\twidth: 2em;\n\t\tpadding: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tborder: 0;\n\t\tbackground-color: transparent;\n\t\ttouch-action: manipulation;\n\t\tfont-size: 2rem;\n\t}\n\n\t.counter button:hover {\n\t\tbackground-color: var(--color-bg-1);\n\t}\n\n\tsvg {\n\t\twidth: 25%;\n\t\theight: 25%;\n\t}\n\n\tpath {\n\t\tvector-effect: non-scaling-stroke;\n\t\tstroke-width: 2px;\n\t\tstroke: #444;\n\t}\n\n\t.counter-viewport {\n\t\twidth: 8em;\n\t\theight: 4em;\n\t\toverflow: hidden;\n\t\ttext-align: center;\n\t\tposition: relative;\n\t}\n\n\t.counter-viewport strong {\n\t\tposition: absolute;\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tfont-weight: 400;\n\t\tcolor: var(--color-theme-1);\n\t\tfont-size: 4rem;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.counter-digits {\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\n\t.hidden {\n\t\ttop: -100%;\n\t\tuser-select: none;\n\t}\n</style>\n" }, { "name": "src/routes/Header.svelte", "contents": "<script lang=\"ts\">\n\timport { page } from '$app/state';\n\timport logo from '$lib/images/svelte-logo.svg';\n\timport github from '$lib/images/github.svg';\n</script>\n\n<header>\n\t<div class=\"corner\">\n\t\t<a href=\"https://svelte.dev/docs/kit\">\n\t\t\t<img src={logo} alt=\"SvelteKit\" />\n\t\t</a>\n\t</div>\n\n\t<nav>\n\t\t<svg viewBox=\"0 0 2 3\" aria-hidden=\"true\">\n\t\t\t<path d=\"M0,0 L1,2 C1.5,3 1.5,3 2,3 L2,0 Z\" />\n\t\t</svg>\n\t\t<ul>\n\t\t\t<li aria-current={page.url.pathname === '/' ? 'page' : undefined}>\n\t\t\t\t<a href=\"/\">Home</a>\n\t\t\t</li>\n\t\t\t<li aria-current={page.url.pathname === '/about' ? 'page' : undefined}>\n\t\t\t\t<a href=\"/about\">About</a>\n\t\t\t</li>\n\t\t\t<li aria-current={page.url.pathname.startsWith('/sverdle') ? 'page' : undefined}>\n\t\t\t\t<a href=\"/sverdle\">Sverdle</a>\n\t\t\t</li>\n\t\t</ul>\n\t\t<svg viewBox=\"0 0 2 3\" aria-hidden=\"true\">\n\t\t\t<path d=\"M0,0 L0,3 C0.5,3 0.5,3 1,2 L2,0 Z\" />\n\t\t</svg>\n\t</nav>\n\n\t<div class=\"corner\">\n\t\t<a href=\"https://github.com/sveltejs/kit\">\n\t\t\t<img src={github} alt=\"GitHub\" />\n\t\t</a>\n\t</div>\n</header>\n\n<style>\n\theader {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t}\n\n\t.corner {\n\t\twidth: 3em;\n\t\theight: 3em;\n\t}\n\n\t.corner a {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\n\t.corner img {\n\t\twidth: 2em;\n\t\theight: 2em;\n\t\tobject-fit: contain;\n\t}\n\n\tnav {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\t--background: rgba(255, 255, 255, 0.7);\n\t}\n\n\tsvg {\n\t\twidth: 2em;\n\t\theight: 3em;\n\t\tdisplay: block;\n\t}\n\n\tpath {\n\t\tfill: var(--background);\n\t}\n\n\tul {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\theight: 3em;\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tlist-style: none;\n\t\tbackground: var(--background);\n\t\tbackground-size: contain;\n\t}\n\n\tli {\n\t\tposition: relative;\n\t\theight: 100%;\n\t}\n\n\tli[aria-current='page']::before {\n\t\t--size: 6px;\n\t\tcontent: '';\n\t\twidth: 0;\n\t\theight: 0;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: calc(50% - var(--size));\n\t\tborder: var(--size) solid transparent;\n\t\tborder-top: var(--size) solid var(--color-theme-1);\n\t}\n\n\tnav a {\n\t\tdisplay: flex;\n\t\theight: 100%;\n\t\talign-items: center;\n\t\tpadding: 0 0.5rem;\n\t\tcolor: var(--color-text);\n\t\tfont-weight: 700;\n\t\tfont-size: 0.8rem;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.1em;\n\t\ttext-decoration: none;\n\t\ttransition: color 0.2s linear;\n\t}\n\n\ta:hover {\n\t\tcolor: var(--color-theme-1);\n\t}\n</style>\n" }, { "name": "src/routes/about/+page.svelte", "contents": "<svelte:head>\n\t<title>About</title>\n\t<meta name=\"description\" content=\"About this app\" />\n</svelte:head>\n\n<div class=\"text-column\">\n\t<h1>About this app</h1>\n\n\t<p>\n\t\tThis is a <a href=\"https://svelte.dev/docs/kit\">SvelteKit</a> app. You can make your own by typing\n\t\tthe following into your command line and following the prompts:\n\t</p>\n\n\t<pre>npx sv create</pre>\n\n\t<p>\n\t\tThe page you're looking at is purely static HTML, with no client-side interactivity needed.\n\t\tBecause of that, we don't need to load any JavaScript. Try viewing the page's source, or opening\n\t\tthe devtools network panel and reloading.\n\t</p>\n\n\t<p>\n\t\tThe <a href=\"/sverdle\">Sverdle</a> page illustrates SvelteKit's data loading and form handling. Try\n\t\tusing it with JavaScript disabled!\n\t</p>\n</div>\n" }, { "name": "src/routes/about/+page.ts", "contents": "import { dev } from '$app/environment';\n\n// we don't need any JS on this page, though we'll load\n// it in dev so that we get hot module replacement\nexport const csr = dev;\n\n// since there's no dynamic data here, we can prerender\n// it so that it gets served as a static asset in production\nexport const prerender = true;\n" }, { "name": "src/routes/sverdle/+page.server.ts", "contents": "import { fail } from '@sveltejs/kit';\nimport { Game } from './game';\nimport type { PageServerLoad, Actions } from './$types';\n\nexport const load = (({ cookies }) => {\n\tconst game = new Game(cookies.get('sverdle'));\n\n\treturn {\n\t\t/**\n\t\t * The player's guessed words so far\n\t\t */\n\t\tguesses: game.guesses,\n\n\t\t/**\n\t\t * An array of strings like '__x_c' corresponding to the guesses, where 'x' means\n\t\t * an exact match, and 'c' means a close match (right letter, wrong place)\n\t\t */\n\t\tanswers: game.answers,\n\n\t\t/**\n\t\t * The correct answer, revealed if the game is over\n\t\t */\n\t\tanswer: game.answers.length >= 6 ? game.answer : null\n\t};\n}) satisfies PageServerLoad;\n\nexport const actions = {\n\t/**\n\t * Modify game state in reaction to a keypress. If client-side JavaScript\n\t * is available, this will happen in the browser instead of here\n\t */\n\tupdate: async ({ request, cookies }) => {\n\t\tconst game = new Game(cookies.get('sverdle'));\n\n\t\tconst data = await request.formData();\n\t\tconst key = data.get('key');\n\n\t\tconst i = game.answers.length;\n\n\t\tif (key === 'backspace') {\n\t\t\tgame.guesses[i] = game.guesses[i].slice(0, -1);\n\t\t} else {\n\t\t\tgame.guesses[i] += key;\n\t\t}\n\n\t\tcookies.set('sverdle', game.toString(), { path: '/' });\n\t},\n\n\t/**\n\t * Modify game state in reaction to a guessed word. This logic always runs on\n\t * the server, so that people can't cheat by peeking at the JavaScript\n\t */\n\tenter: async ({ request, cookies }) => {\n\t\tconst game = new Game(cookies.get('sverdle'));\n\n\t\tconst data = await request.formData();\n\t\tconst guess = data.getAll('guess') as string[];\n\n\t\tif (!game.enter(guess)) {\n\t\t\treturn fail(400, { badGuess: true });\n\t\t}\n\n\t\tcookies.set('sverdle', game.toString(), { path: '/' });\n\t},\n\n\trestart: async ({ cookies }) => {\n\t\tcookies.delete('sverdle', { path: '/' });\n\t}\n} satisfies Actions;\n" }, { "name": "src/routes/sverdle/+page.svelte", "contents": "<script lang=\"ts\">\n\timport { enhance } from '$app/forms';\n\timport { confetti } from '@neoconfetti/svelte';\n\timport type { ActionData, PageData } from './$types';\n\timport { MediaQuery } from 'svelte/reactivity';\n\n\tinterface Props {\n\t\tdata: PageData;\n\t\tform: ActionData;\n\t}\n\tlet { data, form = $bindable() }: Props = $props();\n\n\t/** Whether the user prefers reduced motion */\n\tconst reducedMotion = new MediaQuery('(prefers-reduced-motion: reduce)');\n\n\t/** Whether or not the user has won */\n\tlet won = $derived(data.answers.at(-1) === 'xxxxx');\n\n\t/** The index of the current guess */\n\tlet i = $derived(won ? -1 : data.answers.length);\n\n\t/** The current guess */\n\tlet currentGuess = $derived(data.guesses[i] || '');\n\n\t/** Whether the current guess can be submitted */\n\tlet submittable = $derived(currentGuess.length === 5);\n\n\tconst { classnames, description } = $derived.by(() => {\n\t\t/**\n\t\t * A map of classnames for all letters that have been guessed,\n\t\t * used for styling the keyboard\n\t\t */\n\t\tlet classnames: Record<string, 'exact' | 'close' | 'missing'> = {};\n\t\t/**\n\t\t * A map of descriptions for all letters that have been guessed,\n\t\t * used for adding text for assistive technology (e.g. screen readers)\n\t\t */\n\t\tlet description: Record<string, string> = {};\n\t\tdata.answers.forEach((answer, i) => {\n\t\t\tconst guess = data.guesses[i];\n\t\t\tfor (let i = 0; i < 5; i += 1) {\n\t\t\t\tconst letter = guess[i];\n\t\t\t\tif (answer[i] === 'x') {\n\t\t\t\t\tclassnames[letter] = 'exact';\n\t\t\t\t\tdescription[letter] = 'correct';\n\t\t\t\t} else if (!classnames[letter]) {\n\t\t\t\t\tclassnames[letter] = answer[i] === 'c' ? 'close' : 'missing';\n\t\t\t\t\tdescription[letter] = answer[i] === 'c' ? 'present' : 'absent';\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn { classnames, description };\n\t});\n\n\t/**\n\t * Modify the game state without making a trip to the server,\n\t * if client-side JavaScript is enabled\n\t */\n\tfunction update(event: MouseEvent) {\n\t\tevent.preventDefault();\n\t\tconst key = (event.target as HTMLButtonElement).getAttribute(\n\t\t\t'data-key'\n\t\t);\n\n\t\tif (key === 'backspace') {\n\t\t\tcurrentGuess = currentGuess.slice(0, -1);\n\t\t\tif (form?.badGuess) form.badGuess = false;\n\t\t} else if (currentGuess.length < 5) {\n\t\t\tcurrentGuess += key;\n\t\t}\n\t}\n\n\t/**\n\t * Trigger form logic in response to a keydown event, so that\n\t * desktop users can use the keyboard to play the game\n\t */\n\tfunction keydown(event: KeyboardEvent) {\n\t\tif (event.metaKey) return;\n\n\t\tif (event.key === 'Enter' && !submittable) return;\n\n\t\tdocument\n\t\t\t.querySelector(`[data-key=\"${event.key}\" i]`)\n\t\t\t?.dispatchEvent(new MouseEvent('click', { cancelable: true, bubbles: true }));\n\t}\n</script>\n\n<svelte:window onkeydown={keydown} />\n\n<svelte:head>\n\t<title>Sverdle</title>\n\t<meta name=\"description\" content=\"A Wordle clone written in SvelteKit\" />\n</svelte:head>\n\n<h1 class=\"visually-hidden\">Sverdle</h1>\n\n<form\n\tmethod=\"post\"\n\taction=\"?/enter\"\n\tuse:enhance={() => {\n\t\t// prevent default callback from resetting the form\n\t\treturn ({ update }) => {\n\t\t\tupdate({ reset: false });\n\t\t};\n\t}}\n>\n\t<a class=\"how-to-play\" href=\"/sverdle/how-to-play\">How to play</a>\n\n\t<div class=\"grid\" class:playing={!won} class:bad-guess={form?.badGuess}>\n\t\t{#each Array.from(Array(6).keys()) as row (row)}\n\t\t\t{@const current = row === i}\n\t\t\t<h2 class=\"visually-hidden\">Row {row + 1}</h2>\n\t\t\t<div class=\"row\" class:current>\n\t\t\t\t{#each Array.from(Array(5).keys()) as column (column)}\n\t\t\t\t\t{@const guess = current ? currentGuess : data.guesses[row]}\n\t\t\t\t\t{@const answer = data.answers[row]?.[column]}\n\t\t\t\t\t{@const value = guess?.[column] ?? ''}\n\t\t\t\t\t{@const selected = current && column === guess.length}\n\t\t\t\t\t{@const exact = answer === 'x'}\n\t\t\t\t\t{@const close = answer === 'c'}\n\t\t\t\t\t{@const missing = answer === '_'}\n\t\t\t\t\t<div class=\"letter\" class:exact class:close class:missing class:selected>\n\t\t\t\t\t\t{value}\n\t\t\t\t\t\t<span class=\"visually-hidden\">\n\t\t\t\t\t\t\t{#if exact}\n\t\t\t\t\t\t\t\t(correct)\n\t\t\t\t\t\t\t{:else if close}\n\t\t\t\t\t\t\t\t(present)\n\t\t\t\t\t\t\t{:else if missing}\n\t\t\t\t\t\t\t\t(absent)\n\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\tempty\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<input name=\"guess\" disabled={!current} type=\"hidden\" {value} />\n\t\t\t\t\t</div>\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t{/each}\n\t</div>\n\n\t<div class=\"controls\">\n\t\t{#if won || data.answers.length >= 6}\n\t\t\t{#if !won && data.answer}\n\t\t\t\t<p>the answer was \"{data.answer}\"</p>\n\t\t\t{/if}\n\t\t\t<button data-key=\"enter\" class=\"restart selected\" formaction=\"?/restart\">\n\t\t\t\t{won ? 'you won :)' : `game over :(`} play again?\n\t\t\t</button>\n\t\t{:else}\n\t\t\t<div class=\"keyboard\">\n\t\t\t\t<button data-key=\"enter\" class:selected={submittable} disabled={!submittable}>enter</button>\n\n\t\t\t\t<button\n\t\t\t\t\tonclick={update}\n\t\t\t\t\tdata-key=\"backspace\"\n\t\t\t\t\tformaction=\"?/update\"\n\t\t\t\t\tname=\"key\"\n\t\t\t\t\tvalue=\"backspace\"\n\t\t\t\t>\n\t\t\t\t\tback\n\t\t\t\t</button>\n\n\t\t\t\t{#each ['qwertyuiop', 'asdfghjkl', 'zxcvbnm'] as row (row)}\n\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t{#each row as letter, index (index)}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonclick={update}\n\t\t\t\t\t\t\t\tdata-key={letter}\n\t\t\t\t\t\t\t\tclass={classnames[letter]}\n\t\t\t\t\t\t\t\tdisabled={submittable}\n\t\t\t\t\t\t\t\tformaction=\"?/update\"\n\t\t\t\t\t\t\t\tname=\"key\"\n\t\t\t\t\t\t\t\tvalue={letter}\n\t\t\t\t\t\t\t\taria-label=\"{letter} {description[letter] || ''}\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{letter}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t{/if}\n\t</div>\n</form>\n\n{#if won}\n\t<div\n\t\tstyle=\"position: absolute; left: 50%; top: 30%\"\n\t\tuse:confetti={{\n\t\t\tparticleCount: reducedMotion.current ? 0 : undefined,\n\t\t\tforce: 0.7,\n\t\t\tstageWidth: window.innerWidth,\n\t\t\tstageHeight: window.innerHeight,\n\t\t\tcolors: ['#ff3e00', '#40b3ff', '#676778']\n\t\t}}\n\t></div>\n{/if}\n\n<style>\n\tform {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 1rem;\n\t\tflex: 1;\n\t}\n\n\t.how-to-play {\n\t\tcolor: var(--color-text);\n\t}\n\n\t.how-to-play::before {\n\t\tcontent: 'i';\n\t\tdisplay: inline-block;\n\t\tfont-size: 0.8em;\n\t\tfont-weight: 900;\n\t\twidth: 1em;\n\t\theight: 1em;\n\t\tpadding: 0.2em;\n\t\tline-height: 1;\n\t\tborder: 1.5px solid var(--color-text);\n\t\tborder-radius: 50%;\n\t\ttext-align: center;\n\t\tmargin: 0 0.5em 0 0;\n\t\tposition: relative;\n\t\ttop: -0.05em;\n\t}\n\n\t.grid {\n\t\t--width: min(100vw, 40vh, 380px);\n\t\tmax-width: var(--width);\n\t\talign-self: center;\n\t\tjustify-self: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tjustify-content: flex-start;\n\t}\n\n\t.grid .row {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(5, 1fr);\n\t\tgrid-gap: 0.2rem;\n\t\tmargin: 0 0 0.2rem 0;\n\t}\n\n\t@media (prefers-reduced-motion: no-preference) {\n\t\t.grid.bad-guess .row.current {\n\t\t\tanimation: wiggle 0.5s;\n\t\t}\n\t}\n\n\t.grid.playing .row.current {\n\t\tfilter: drop-shadow(3px 3px 10px var(--color-bg-0));\n\t}\n\n\t.letter {\n\t\taspect-ratio: 1;\n\t\twidth: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttext-align: center;\n\t\tbox-sizing: border-box;\n\t\ttext-transform: lowercase;\n\t\tborder: none;\n\t\tfont-size: calc(0.08 * var(--width));\n\t\tborder-radius: 2px;\n\t\tbackground: white;\n\t\tmargin: 0;\n\t\tcolor: rgba(0, 0, 0, 0.7);\n\t}\n\n\t.letter.missing {\n\t\tbackground: rgba(255, 255, 255, 0.5);\n\t\tcolor: rgba(0, 0, 0, 0.5);\n\t}\n\n\t.letter.exact {\n\t\tbackground: var(--color-theme-2);\n\t\tcolor: white;\n\t}\n\n\t.letter.close {\n\t\tborder: 2px solid var(--color-theme-2);\n\t}\n\n\t.selected {\n\t\toutline: 2px solid var(--color-theme-1);\n\t}\n\n\t.controls {\n\t\ttext-align: center;\n\t\tjustify-content: center;\n\t\theight: min(18vh, 10rem);\n\t}\n\n\t.keyboard {\n\t\t--gap: 0.2rem;\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--gap);\n\t\theight: 100%;\n\t}\n\n\t.keyboard .row {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\tgap: 0.2rem;\n\t\tflex: 1;\n\t}\n\n\t.keyboard button,\n\t.keyboard button:disabled {\n\t\t--size: min(8vw, 4vh, 40px);\n\t\tbackground-color: white;\n\t\tcolor: black;\n\t\twidth: var(--size);\n\t\tborder: none;\n\t\tborder-radius: 2px;\n\t\tfont-size: calc(var(--size) * 0.5);\n\t\tmargin: 0;\n\t}\n\n\t.keyboard button.exact {\n\t\tbackground: var(--color-theme-2);\n\t\tcolor: white;\n\t}\n\n\t.keyboard button.missing {\n\t\topacity: 0.5;\n\t}\n\n\t.keyboard button.close {\n\t\tborder: 2px solid var(--color-theme-2);\n\t}\n\n\t.keyboard button:focus {\n\t\tbackground: var(--color-theme-1);\n\t\tcolor: white;\n\t\toutline: none;\n\t}\n\n\t.keyboard button[data-key='enter'],\n\t.keyboard button[data-key='backspace'] {\n\t\tposition: absolute;\n\t\tbottom: 0;\n\t\twidth: calc(1.5 * var(--size));\n\t\theight: calc(1 / 3 * (100% - 2 * var(--gap)));\n\t\ttext-transform: uppercase;\n\t\tfont-size: calc(0.3 * var(--size));\n\t\tpadding-top: calc(0.15 * var(--size));\n\t}\n\n\t.keyboard button[data-key='enter'] {\n\t\tright: calc(50% + 3.5 * var(--size) + 0.8rem);\n\t}\n\n\t.keyboard button[data-key='backspace'] {\n\t\tleft: calc(50% + 3.5 * var(--size) + 0.8rem);\n\t}\n\n\t.keyboard button[data-key='enter']:disabled {\n\t\topacity: 0.5;\n\t}\n\n\t.restart {\n\t\twidth: 100%;\n\t\tpadding: 1rem;\n\t\tbackground: rgba(255, 255, 255, 0.5);\n\t\tborder-radius: 2px;\n\t\tborder: none;\n\t}\n\n\t.restart:focus,\n\t.restart:hover {\n\t\tbackground: var(--color-theme-1);\n\t\tcolor: white;\n\t\toutline: none;\n\t}\n\n\t@keyframes wiggle {\n\t\t0% {\n\t\t\ttransform: translateX(0);\n\t\t}\n\t\t10% {\n\t\t\ttransform: translateX(-2px);\n\t\t}\n\t\t30% {\n\t\t\ttransform: translateX(4px);\n\t\t}\n\t\t50% {\n\t\t\ttransform: translateX(-6px);\n\t\t}\n\t\t70% {\n\t\t\ttransform: translateX(+4px);\n\t\t}\n\t\t90% {\n\t\t\ttransform: translateX(-2px);\n\t\t}\n\t\t100% {\n\t\t\ttransform: translateX(0);\n\t\t}\n\t}\n</style>\n" }, { "name": "src/routes/sverdle/game.ts", "contents": "import { words, allowed } from './words.server';\n\nexport class Game {\n\tindex: number;\n\tguesses: string[];\n\tanswers: string[];\n\tanswer: string;\n\n\t/**\n\t * Create a game object from the player's cookie, or initialise a new game\n\t */\n\tconstructor(serialized: string | undefined = undefined) {\n\t\tif (serialized) {\n\t\t\tconst [index, guesses, answers] = serialized.split('-');\n\n\t\t\tthis.index = +index;\n\t\t\tthis.guesses = guesses ? guesses.split(' ') : [];\n\t\t\tthis.answers = answers ? answers.split(' ') : [];\n\t\t} else {\n\t\t\tthis.index = Math.floor(Math.random() * words.length);\n\t\t\tthis.guesses = ['', '', '', '', '', ''];\n\t\t\tthis.answers = [];\n\t\t}\n\n\t\tthis.answer = words[this.index];\n\t}\n\n\t/**\n\t * Update game state based on a guess of a five-letter word. Returns\n\t * true if the guess was valid, false otherwise\n\t */\n\tenter(letters: string[]) {\n\t\tconst word = letters.join('');\n\t\tconst valid = allowed.has(word);\n\n\t\tif (!valid) return false;\n\n\t\tthis.guesses[this.answers.length] = word;\n\n\t\tconst available = Array.from(this.answer);\n\t\tconst answer = Array(5).fill('_');\n\n\t\t// first, find exact matches\n\t\tfor (let i = 0; i < 5; i += 1) {\n\t\t\tif (letters[i] === available[i]) {\n\t\t\t\tanswer[i] = 'x';\n\t\t\t\tavailable[i] = ' ';\n\t\t\t}\n\t\t}\n\n\t\t// then find close matches (this has to happen\n\t\t// in a second step, otherwise an early close\n\t\t// match can prevent a later exact match)\n\t\tfor (let i = 0; i < 5; i += 1) {\n\t\t\tif (answer[i] === '_') {\n\t\t\t\tconst index = available.indexOf(letters[i]);\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tanswer[i] = 'c';\n\t\t\t\t\tavailable[index] = ' ';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.answers.push(answer.join(''));\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Serialize game state so it can be set as a cookie\n\t */\n\ttoString() {\n\t\treturn `${this.index}-${this.guesses.join(' ')}-${this.answers.join(' ')}`;\n\t}\n}\n" }, { "name": "src/routes/sverdle/how-to-play/+page.svelte", "contents": "<svelte:head>\n\t<title>How to play Sverdle</title>\n\t<meta name=\"description\" content=\"How to play Sverdle\" />\n</svelte:head>\n\n<div class=\"text-column\">\n\t<h1>How to play Sverdle</h1>\n\n\t<p>\n\t\tSverdle is a clone of <a href=\"https://www.nytimes.com/games/wordle/index.html\">Wordle</a>, the\n\t\tword guessing game. To play, enter a five-letter English word. For example:\n\t</p>\n\n\t<div class=\"example\">\n\t\t<span class=\"close\">r</span>\n\t\t<span class=\"missing\">i</span>\n\t\t<span class=\"close\">t</span>\n\t\t<span class=\"missing\">z</span>\n\t\t<span class=\"exact\">y</span>\n\t</div>\n\n\t<p>\n\t\tThe <span class=\"exact\">y</span> is in the right place. <span class=\"close\">r</span> and\n\t\t<span class=\"close\">t</span>\n\t\tare the right letters, but in the wrong place. The other letters are wrong, and can be discarded.\n\t\tLet's make another guess:\n\t</p>\n\n\t<div class=\"example\">\n\t\t<span class=\"exact\">p</span>\n\t\t<span class=\"exact\">a</span>\n\t\t<span class=\"exact\">r</span>\n\t\t<span class=\"exact\">t</span>\n\t\t<span class=\"exact\">y</span>\n\t</div>\n\n\t<p>This time we guessed right! You have <strong>six</strong> guesses to get the word.</p>\n\n\t<p>\n\t\tUnlike the original Wordle, Sverdle runs on the server instead of in the browser, making it\n\t\timpossible to cheat. It uses <code>&lt;form&gt;</code> and cookies to submit data, meaning you can\n\t\teven play with JavaScript disabled!\n\t</p>\n</div>\n\n<style>\n\tspan {\n\t\tdisplay: inline-flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tfont-size: 0.8em;\n\t\twidth: 2.4em;\n\t\theight: 2.4em;\n\t\tbackground-color: white;\n\t\tbox-sizing: border-box;\n\t\tborder-radius: 2px;\n\t\tborder-width: 2px;\n\t\tcolor: rgba(0, 0, 0, 0.7);\n\t}\n\n\t.missing {\n\t\tbackground: rgba(255, 255, 255, 0.5);\n\t\tcolor: rgba(0, 0, 0, 0.5);\n\t}\n\n\t.close {\n\t\tborder-style: solid;\n\t\tborder-color: var(--color-theme-2);\n\t}\n\n\t.exact {\n\t\tbackground: var(--color-theme-2);\n\t\tcolor: white;\n\t}\n\n\t.example {\n\t\tdisplay: flex;\n\t\tjustify-content: flex-start;\n\t\tmargin: 1rem 0;\n\t\tgap: 0.2rem;\n\t}\n\n\t.example span {\n\t\tfont-size: 1.4rem;\n\t}\n\n\tp span {\n\t\tposition: relative;\n\t\tborder-width: 1px;\n\t\tborder-radius: 1px;\n\t\tfont-size: 0.4em;\n\t\ttransform: scale(2) translate(0, -10%);\n\t\tmargin: 0 1em;\n\t}\n</style>\n" }, { "name": "src/routes/sverdle/how-to-play/+page.ts", "contents": "import { dev } from '$app/environment';\n\n// we don't need any JS on this page, though we'll load\n// it in dev so that we get hot module replacement\nexport const csr = dev;\n\n// since there's no dynamic data here, we can prerender\n// it so that it gets served as a static asset in production\nexport const prerender = true;\n" }, { "name": "src/routes/sverdle/words.server.ts", "contents": "/** The list of possible words */\nexport const words = [\n\t'aback',\n\t'abase',\n\t'abate',\n\t'abbey',\n\t'abbot',\n\t'abhor',\n\t'abide',\n\t'abled',\n\t'abode',\n\t'abort',\n\t'about',\n\t'above',\n\t'abuse',\n\t'abyss',\n\t'acorn',\n\t'acrid',\n\t'actor',\n\t'acute',\n\t'adage',\n\t'adapt',\n\t'adept',\n\t'admin',\n\t'admit',\n\t'adobe',\n\t'adopt',\n\t'adore',\n\t'adorn',\n\t'adult',\n\t'affix',\n\t'afire',\n\t'afoot',\n\t'afoul',\n\t'after',\n\t'again',\n\t'agape',\n\t'agate',\n\t'agent',\n\t'agile',\n\t'aging',\n\t'aglow',\n\t'agony',\n\t'agora',\n\t'agree',\n\t'ahead',\n\t'aider',\n\t'aisle',\n\t'alarm',\n\t'album',\n\t'alert',\n\t'algae',\n\t'alibi',\n\t'alien',\n\t'align',\n\t'alike',\n\t'alive',\n\t'allay',\n\t'alley',\n\t'allot',\n\t'allow',\n\t'alloy',\n\t'aloft',\n\t'alone',\n\t'along',\n\t'aloof',\n\t'aloud',\n\t'alpha',\n\t'altar',\n\t'alter',\n\t'amass',\n\t'amaze',\n\t'amber',\n\t'amble',\n\t'amend',\n\t'amiss',\n\t'amity',\n\t'among',\n\t'ample',\n\t'amply',\n\t'amuse',\n\t'angel',\n\t'anger',\n\t'angle',\n\t'angry',\n\t'angst',\n\t'anime',\n\t'ankle',\n\t'annex',\n\t'annoy',\n\t'annul',\n\t'anode',\n\t'antic',\n\t'anvil',\n\t'aorta',\n\t'apart',\n\t'aphid',\n\t'aping',\n\t'apnea',\n\t'apple',\n\t'apply',\n\t'apron',\n\t'aptly',\n\t'arbor',\n\t'ardor',\n\t'arena',\n\t'argue',\n\t'arise',\n\t'armor',\n\t'aroma',\n\t'arose',\n\t'array',\n\t'arrow',\n\t'arson',\n\t'artsy',\n\t'ascot',\n\t'ashen',\n\t'aside',\n\t'askew',\n\t'assay',\n\t'asset',\n\t'atoll',\n\t'atone',\n\t'attic',\n\t'audio',\n\t'audit',\n\t'augur',\n\t'aunty',\n\t'avail',\n\t'avert',\n\t'avian',\n\t'avoid',\n\t'await',\n\t'awake',\n\t'award',\n\t'aware',\n\t'awash',\n\t'awful',\n\t'awoke',\n\t'axial',\n\t'axiom',\n\t'axion',\n\t'azure',\n\t'bacon',\n\t'badge',\n\t'badly',\n\t'bagel',\n\t'baggy',\n\t'baker',\n\t'baler',\n\t'balmy',\n\t'banal',\n\t'banjo',\n\t'barge',\n\t'baron',\n\t'basal',\n\t'basic',\n\t'basil',\n\t'basin',\n\t'basis',\n\t'baste',\n\t'batch',\n\t'bathe',\n\t'baton',\n\t'batty',\n\t'bawdy',\n\t'bayou',\n\t'beach',\n\t'beady',\n\t'beard',\n\t'beast',\n\t'beech',\n\t'beefy',\n\t'befit',\n\t'began',\n\t'begat',\n\t'beget',\n\t'begin',\n\t'begun',\n\t'being',\n\t'belch',\n\t'belie',\n\t'belle',\n\t'belly',\n\t'below',\n\t'bench',\n\t'beret',\n\t'berry',\n\t'berth',\n\t'beset',\n\t'betel',\n\t'bevel',\n\t'bezel',\n\t'bible',\n\t'bicep',\n\t'biddy',\n\t'bigot',\n\t'bilge',\n\t'billy',\n\t'binge',\n\t'bingo',\n\t'biome',\n\t'birch',\n\t'birth',\n\t'bison',\n\t'bitty',\n\t'black',\n\t'blade',\n\t'blame',\n\t'bland',\n\t'blank',\n\t'blare',\n\t'blast',\n\t'blaze',\n\t'bleak',\n\t'bleat',\n\t'bleed',\n\t'bleep',\n\t'blend',\n\t'bless',\n\t'blimp',\n\t'blind',\n\t'blink',\n\t'bliss',\n\t'blitz',\n\t'bloat',\n\t'block',\n\t'bloke',\n\t'blond',\n\t'blood',\n\t'bloom',\n\t'blown',\n\t'bluer',\n\t'bluff',\n\t'blunt',\n\t'blurb',\n\t'blurt',\n\t'blush',\n\t'board',\n\t'boast',\n\t'bobby',\n\t'boney',\n\t'bongo',\n\t'bonus',\n\t'booby',\n\t'boost',\n\t'booth',\n\t'booty',\n\t'booze',\n\t'boozy',\n\t'borax',\n\t'borne',\n\t'bosom',\n\t'bossy',\n\t'botch',\n\t'bough',\n\t'boule',\n\t'bound',\n\t'bowel',\n\t'boxer',\n\t'brace',\n\t'braid',\n\t'brain',\n\t'brake',\n\t'brand',\n\t'brash',\n\t'brass',\n\t'brave',\n\t'bravo',\n\t'brawl',\n\t'brawn',\n\t'bread',\n\t'break',\n\t'breed',\n\t'briar',\n\t'bribe',\n\t'brick',\n\t'bride',\n\t'brief',\n\t'brine',\n\t'bring',\n\t'brink',\n\t'briny',\n\t'brisk',\n\t'broad',\n\t'broil',\n\t'broke',\n\t'brood',\n\t'brook',\n\t'broom',\n\t'broth',\n\t'brown',\n\t'brunt',\n\t'brush',\n\t'brute',\n\t'buddy',\n\t'budge',\n\t'buggy',\n\t'bugle',\n\t'build',\n\t'built',\n\t'bulge',\n\t'bulky',\n\t'bully',\n\t'bunch',\n\t'bunny',\n\t'burly',\n\t'burnt',\n\t'burst',\n\t'bused',\n\t'bushy',\n\t'butch',\n\t'butte',\n\t'buxom',\n\t'buyer',\n\t'bylaw',\n\t'cabal',\n\t'cabby',\n\t'cabin',\n\t'cable',\n\t'cacao',\n\t'cache',\n\t'cacti',\n\t'caddy',\n\t'cadet',\n\t'cagey',\n\t'cairn',\n\t'camel',\n\t'cameo',\n\t'canal',\n\t'candy',\n\t'canny',\n\t'canoe',\n\t'canon',\n\t'caper',\n\t'caput',\n\t'carat',\n\t'cargo',\n\t'carol',\n\t'carry',\n\t'carve',\n\t'caste',\n\t'catch',\n\t'cater',\n\t'catty',\n\t'caulk',\n\t'cause',\n\t'cavil',\n\t'cease',\n\t'cedar',\n\t'cello',\n\t'chafe',\n\t'chaff',\n\t'chain',\n\t'chair',\n\t'chalk',\n\t'champ',\n\t'chant',\n\t'chaos',\n\t'chard',\n\t'charm',\n\t'chart',\n\t'chase',\n\t'chasm',\n\t'cheap',\n\t'cheat',\n\t'check',\n\t'cheek',\n\t'cheer',\n\t'chess',\n\t'chest',\n\t'chick',\n\t'chide',\n\t'chief',\n\t'child',\n\t'chili',\n\t'chill',\n\t'chime',\n\t'china',\n\t'chirp',\n\t'chock',\n\t'choir',\n\t'choke',\n\t'chord',\n\t'chore',\n\t'chose',\n\t'chuck',\n\t'chump',\n\t'chunk',\n\t'churn',\n\t'chute',\n\t'cider',\n\t'cigar',\n\t'cinch',\n\t'circa',\n\t'civic',\n\t'civil',\n\t'clack',\n\t'claim',\n\t'clamp',\n\t'clang',\n\t'clank',\n\t'clash',\n\t'clasp',\n\t'class',\n\t'clean',\n\t'clear',\n\t'cleat',\n\t'cleft',\n\t'clerk',\n\t'click',\n\t'cliff',\n\t'climb',\n\t'cling',\n\t'clink',\n\t'cloak',\n\t'clock',\n\t'clone',\n\t'close',\n\t'cloth',\n\t'cloud',\n\t'clout',\n\t'clove',\n\t'clown',\n\t'cluck',\n\t'clued',\n\t'clump',\n\t'clung',\n\t'coach',\n\t'coast',\n\t'cobra',\n\t'cocoa',\n\t'colon',\n\t'color',\n\t'comet',\n\t'comfy',\n\t'comic',\n\t'comma',\n\t'conch',\n\t'condo',\n\t'conic',\n\t'copse',\n\t'coral',\n\t'corer',\n\t'corny',\n\t'couch',\n\t'cough',\n\t'could',\n\t'count',\n\t'coupe',\n\t'court',\n\t'coven',\n\t'cover',\n\t'covet',\n\t'covey',\n\t'cower',\n\t'coyly',\n\t'crack',\n\t'craft',\n\t'cramp',\n\t'crane',\n\t'crank',\n\t'crash',\n\t'crass',\n\t'crate',\n\t'crave',\n\t'crawl',\n\t'craze',\n\t'crazy',\n\t'creak',\n\t'cream',\n\t'credo',\n\t'creed',\n\t'creek',\n\t'creep',\n\t'creme',\n\t'crepe',\n\t'crept',\n\t'cress',\n\t'crest',\n\t'crick',\n\t'cried',\n\t'crier',\n\t'crime',\n\t'crimp',\n\t'crisp',\n\t'croak',\n\t'crock',\n\t'crone',\n\t'crony',\n\t'crook',\n\t'cross',\n\t'croup',\n\t'crowd',\n\t'crown',\n\t'crude',\n\t'cruel',\n\t'crumb',\n\t'crump',\n\t'crush',\n\t'crust',\n\t'crypt',\n\t'cubic',\n\t'cumin',\n\t'curio',\n\t'curly',\n\t'curry',\n\t'curse',\n\t'curve',\n\t'curvy',\n\t'cutie',\n\t'cyber',\n\t'cycle',\n\t'cynic',\n\t'daddy',\n\t'daily',\n\t'dairy',\n\t'daisy',\n\t'dally',\n\t'dance',\n\t'dandy',\n\t'datum',\n\t'daunt',\n\t'dealt',\n\t'death',\n\t'debar',\n\t'debit',\n\t'debug',\n\t'debut',\n\t'decal',\n\t'decay',\n\t'decor',\n\t'decoy',\n\t'decry',\n\t'defer',\n\t'deign',\n\t'deity',\n\t'delay',\n\t'delta',\n\t'delve',\n\t'demon',\n\t'demur',\n\t'denim',\n\t'dense',\n\t'depot',\n\t'depth',\n\t'derby',\n\t'deter',\n\t'detox',\n\t'deuce',\n\t'devil',\n\t'diary',\n\t'dicey',\n\t'digit',\n\t'dilly',\n\t'dimly',\n\t'diner',\n\t'dingo',\n\t'dingy',\n\t'diode',\n\t'dirge',\n\t'dirty',\n\t'disco',\n\t'ditch',\n\t'ditto',\n\t'ditty',\n\t'diver',\n\t'dizzy',\n\t'dodge',\n\t'dodgy',\n\t'dogma',\n\t'doing',\n\t'dolly',\n\t'donor',\n\t'donut',\n\t'dopey',\n\t'doubt',\n\t'dough',\n\t'dowdy',\n\t'dowel',\n\t'downy',\n\t'dowry',\n\t'dozen',\n\t'draft',\n\t'drain',\n\t'drake',\n\t'drama',\n\t'drank',\n\t'drape',\n\t'drawl',\n\t'drawn',\n\t'dread',\n\t'dream',\n\t'dress',\n\t'dried',\n\t'drier',\n\t'drift',\n\t'drill',\n\t'drink',\n\t'drive',\n\t'droit',\n\t'droll',\n\t'drone',\n\t'drool',\n\t'droop',\n\t'dross',\n\t'drove',\n\t'drown',\n\t'druid',\n\t'drunk',\n\t'dryer',\n\t'dryly',\n\t'duchy',\n\t'dully',\n\t'dummy',\n\t'dumpy',\n\t'dunce',\n\t'dusky',\n\t'dusty',\n\t'dutch',\n\t'duvet',\n\t'dwarf',\n\t'dwell',\n\t'dwelt',\n\t'dying',\n\t'eager',\n\t'eagle',\n\t'early',\n\t'earth',\n\t'easel',\n\t'eaten',\n\t'eater',\n\t'ebony',\n\t'eclat',\n\t'edict',\n\t'edify',\n\t'eerie',\n\t'egret',\n\t'eight',\n\t'eject',\n\t'eking',\n\t'elate',\n\t'elbow',\n\t'elder',\n\t'elect',\n\t'elegy',\n\t'elfin',\n\t'elide',\n\t'elite',\n\t'elope',\n\t'elude',\n\t'email',\n\t'embed',\n\t'ember',\n\t'emcee',\n\t'empty',\n\t'enact',\n\t'endow',\n\t'enema',\n\t'enemy',\n\t'enjoy',\n\t'ennui',\n\t'ensue',\n\t'enter',\n\t'entry',\n\t'envoy',\n\t'epoch',\n\t'epoxy',\n\t'equal',\n\t'equip',\n\t'erase',\n\t'erect',\n\t'erode',\n\t'error',\n\t'erupt',\n\t'essay',\n\t'ester',\n\t'ether',\n\t'ethic',\n\t'ethos',\n\t'etude',\n\t'evade',\n\t'event',\n\t'every',\n\t'evict',\n\t'evoke',\n\t'exact',\n\t'exalt',\n\t'excel',\n\t'exert',\n\t'exile',\n\t'exist',\n\t'expel',\n\t'extol',\n\t'extra',\n\t'exult',\n\t'eying',\n\t'fable',\n\t'facet',\n\t'faint',\n\t'fairy',\n\t'faith',\n\t'false',\n\t'fancy',\n\t'fanny',\n\t'farce',\n\t'fatal',\n\t'fatty',\n\t'fault',\n\t'fauna',\n\t'favor',\n\t'feast',\n\t'fecal',\n\t'feign',\n\t'fella',\n\t'felon',\n\t'femme',\n\t'femur',\n\t'fence',\n\t'feral',\n\t'ferry',\n\t'fetal',\n\t'fetch',\n\t'fetid',\n\t'fetus',\n\t'fever',\n\t'fewer',\n\t'fiber',\n\t'fibre',\n\t'ficus',\n\t'field',\n\t'fiend',\n\t'fiery',\n\t'fifth',\n\t'fifty',\n\t'fight',\n\t'filer',\n\t'filet',\n\t'filly',\n\t'filmy',\n\t'filth',\n\t'final',\n\t'finch',\n\t'finer',\n\t'first',\n\t'fishy',\n\t'fixer',\n\t'fizzy',\n\t'fjord',\n\t'flack',\n\t'flail',\n\t'flair',\n\t'flake',\n\t'flaky',\n\t'flame',\n\t'flank',\n\t'flare',\n\t'flash',\n\t'flask',\n\t'fleck',\n\t'fleet',\n\t'flesh',\n\t'flick',\n\t'flier',\n\t'fling',\n\t'flint',\n\t'flirt',\n\t'float',\n\t'flock',\n\t'flood',\n\t'floor',\n\t'flora',\n\t'floss',\n\t'flour',\n\t'flout',\n\t'flown',\n\t'fluff',\n\t'fluid',\n\t'fluke',\n\t'flume',\n\t'flung',\n\t'flunk',\n\t'flush',\n\t'flute',\n\t'flyer',\n\t'foamy',\n\t'focal',\n\t'focus',\n\t'foggy',\n\t'foist',\n\t'folio',\n\t'folly',\n\t'foray',\n\t'force',\n\t'forge',\n\t'forgo',\n\t'forte',\n\t'forth',\n\t'forty',\n\t'forum',\n\t'found',\n\t'foyer',\n\t'frail',\n\t'frame',\n\t'frank',\n\t'fraud',\n\t'freak',\n\t'freed',\n\t'freer',\n\t'fresh',\n\t'friar',\n\t'fried',\n\t'frill',\n\t'frisk',\n\t'fritz',\n\t'frock',\n\t'frond',\n\t'front',\n\t'frost',\n\t'froth',\n\t'frown',\n\t'froze',\n\t'fruit',\n\t'fudge',\n\t'fugue',\n\t'fully',\n\t'fungi',\n\t'funky',\n\t'funny',\n\t'furor',\n\t'furry',\n\t'fussy',\n\t'fuzzy',\n\t'gaffe',\n\t'gaily',\n\t'gamer',\n\t'gamma',\n\t'gamut',\n\t'gassy',\n\t'gaudy',\n\t'gauge',\n\t'gaunt',\n\t'gauze',\n\t'gavel',\n\t'gawky',\n\t'gayer',\n\t'gayly',\n\t'gazer',\n\t'gecko',\n\t'geeky',\n\t'geese',\n\t'genie',\n\t'genre',\n\t'ghost',\n\t'ghoul',\n\t'giant',\n\t'giddy',\n\t'gipsy',\n\t'girly',\n\t'girth',\n\t'given',\n\t'giver',\n\t'glade',\n\t'gland',\n\t'glare',\n\t'glass',\n\t'glaze',\n\t'gleam',\n\t'glean',\n\t'glide',\n\t'glint',\n\t'gloat',\n\t'globe',\n\t'gloom',\n\t'glory',\n\t'gloss',\n\t'glove',\n\t'glyph',\n\t'gnash',\n\t'gnome',\n\t'godly',\n\t'going',\n\t'golem',\n\t'golly',\n\t'gonad',\n\t'goner',\n\t'goody',\n\t'gooey',\n\t'goofy',\n\t'goose',\n\t'gorge',\n\t'gouge',\n\t'gourd',\n\t'grace',\n\t'grade',\n\t'graft',\n\t'grail',\n\t'grain',\n\t'grand',\n\t'grant',\n\t'grape',\n\t'graph',\n\t'grasp',\n\t'grass',\n\t'grate',\n\t'grave',\n\t'gravy',\n\t'graze',\n\t'great',\n\t'greed',\n\t'green',\n\t'greet',\n\t'grief',\n\t'grill',\n\t'grime',\n\t'grimy',\n\t'grind',\n\t'gripe',\n\t'groan',\n\t'groin',\n\t'groom',\n\t'grope',\n\t'gross',\n\t'group',\n\t'grout',\n\t'grove',\n\t'growl',\n\t'grown',\n\t'gruel',\n\t'gruff',\n\t'grunt',\n\t'guard',\n\t'guava',\n\t'guess',\n\t'guest',\n\t'guide',\n\t'guild',\n\t'guile',\n\t'guilt',\n\t'guise',\n\t'gulch',\n\t'gully',\n\t'gumbo',\n\t'gummy',\n\t'guppy',\n\t'gusto',\n\t'gusty',\n\t'gypsy',\n\t'habit',\n\t'hairy',\n\t'halve',\n\t'handy',\n\t'happy',\n\t'hardy',\n\t'harem',\n\t'harpy',\n\t'harry',\n\t'harsh',\n\t'haste',\n\t'hasty',\n\t'hatch',\n\t'hater',\n\t'haunt',\n\t'haute',\n\t'haven',\n\t'havoc',\n\t'hazel',\n\t'heady',\n\t'heard',\n\t'heart',\n\t'heath',\n\t'heave',\n\t'heavy',\n\t'hedge',\n\t'hefty',\n\t'heist',\n\t'helix',\n\t'hello',\n\t'hence',\n\t'heron',\n\t'hilly',\n\t'hinge',\n\t'hippo',\n\t'hippy',\n\t'hitch',\n\t'hoard',\n\t'hobby',\n\t'hoist',\n\t'holly',\n\t'homer',\n\t'honey',\n\t'honor',\n\t'horde',\n\t'horny',\n\t'horse',\n\t'hotel',\n\t'hotly',\n\t'hound',\n\t'house',\n\t'hovel',\n\t'hover',\n\t'howdy',\n\t'human',\n\t'humid',\n\t'humor',\n\t'humph',\n\t'humus',\n\t'hunch',\n\t'hunky',\n\t'hurry',\n\t'husky',\n\t'hussy',\n\t'hutch',\n\t'hydro',\n\t'hyena',\n\t'hymen',\n\t'hyper',\n\t'icily',\n\t'icing',\n\t'ideal',\n\t'idiom',\n\t'idiot',\n\t'idler',\n\t'idyll',\n\t'igloo',\n\t'iliac',\n\t'image',\n\t'imbue',\n\t'impel',\n\t'imply',\n\t'inane',\n\t'inbox',\n\t'incur',\n\t'index',\n\t'inept',\n\t'inert',\n\t'infer',\n\t'ingot',\n\t'inlay',\n\t'inlet',\n\t'inner',\n\t'input',\n\t'inter',\n\t'intro',\n\t'ionic',\n\t'irate',\n\t'irony',\n\t'islet',\n\t'issue',\n\t'itchy',\n\t'ivory',\n\t'jaunt',\n\t'jazzy',\n\t'jelly',\n\t'jerky',\n\t'jetty',\n\t'jewel',\n\t'jiffy',\n\t'joint',\n\t'joist',\n\t'joker',\n\t'jolly',\n\t'joust',\n\t'judge',\n\t'juice',\n\t'juicy',\n\t'jumbo',\n\t'jumpy',\n\t'junta',\n\t'junto',\n\t'juror',\n\t'kappa',\n\t'karma',\n\t'kayak',\n\t'kebab',\n\t'khaki',\n\t'kinky',\n\t'kiosk',\n\t'kitty',\n\t'knack',\n\t'knave',\n\t'knead',\n\t'kneed',\n\t'kneel',\n\t'knelt',\n\t'knife',\n\t'knock',\n\t'knoll',\n\t'known',\n\t'koala',\n\t'krill',\n\t'label',\n\t'labor',\n\t'laden',\n\t'ladle',\n\t'lager',\n\t'lance',\n\t'lanky',\n\t'lapel',\n\t'lapse',\n\t'large',\n\t'larva',\n\t'lasso',\n\t'latch',\n\t'later',\n\t'lathe',\n\t'latte',\n\t'laugh',\n\t'layer',\n\t'leach',\n\t'leafy',\n\t'leaky',\n\t'leant',\n\t'leapt',\n\t'learn',\n\t'lease',\n\t'leash',\n\t'least',\n\t'leave',\n\t'ledge',\n\t'leech',\n\t'leery',\n\t'lefty',\n\t'legal',\n\t'leggy',\n\t'lemon',\n\t'lemur',\n\t'leper',\n\t'level',\n\t'lever',\n\t'libel',\n\t'liege',\n\t'light',\n\t'liken',\n\t'lilac',\n\t'limbo',\n\t'limit',\n\t'linen',\n\t'liner',\n\t'lingo',\n\t'lipid',\n\t'lithe',\n\t'liver',\n\t'livid',\n\t'llama',\n\t'loamy',\n\t'loath',\n\t'lobby',\n\t'local',\n\t'locus',\n\t'lodge',\n\t'lofty',\n\t'logic',\n\t'login',\n\t'loopy',\n\t'loose',\n\t'lorry',\n\t'loser',\n\t'louse',\n\t'lousy',\n\t'lover',\n\t'lower',\n\t'lowly',\n\t'loyal',\n\t'lucid',\n\t'lucky',\n\t'lumen',\n\t'lumpy',\n\t'lunar',\n\t'lunch',\n\t'lunge',\n\t'lupus',\n\t'lurch',\n\t'lurid',\n\t'lusty',\n\t'lying',\n\t'lymph',\n\t'lynch',\n\t'lyric',\n\t'macaw',\n\t'macho',\n\t'macro',\n\t'madam',\n\t'madly',\n\t'mafia',\n\t'magic',\n\t'magma',\n\t'maize',\n\t'major',\n\t'maker',\n\t'mambo',\n\t'mamma',\n\t'mammy',\n\t'manga',\n\t'mange',\n\t'mango',\n\t'mangy',\n\t'mania',\n\t'manic',\n\t'manly',\n\t'manor',\n\t'maple',\n\t'march',\n\t'marry',\n\t'marsh',\n\t'mason',\n\t'masse',\n\t'match',\n\t'matey',\n\t'mauve',\n\t'maxim',\n\t'maybe',\n\t'mayor',\n\t'mealy',\n\t'meant',\n\t'meaty',\n\t'mecca',\n\t'medal',\n\t'media',\n\t'medic',\n\t'melee',\n\t'melon',\n\t'mercy',\n\t'merge',\n\t'merit',\n\t'merry',\n\t'metal',\n\t'meter',\n\t'metro',\n\t'micro',\n\t'midge',\n\t'midst',\n\t'might',\n\t'milky',\n\t'mimic',\n\t'mince',\n\t'miner',\n\t'minim',\n\t'minor',\n\t'minty',\n\t'minus',\n\t'mirth',\n\t'miser',\n\t'missy',\n\t'mocha',\n\t'modal',\n\t'model',\n\t'modem',\n\t'mogul',\n\t'moist',\n\t'molar',\n\t'moldy',\n\t'money',\n\t'month',\n\t'moody',\n\t'moose',\n\t'moral',\n\t'moron',\n\t'morph',\n\t'mossy',\n\t'motel',\n\t'motif',\n\t'motor',\n\t'motto',\n\t'moult',\n\t'mound',\n\t'mount',\n\t'mourn',\n\t'mouse',\n\t'mouth',\n\t'mover',\n\t'movie',\n\t'mower',\n\t'mucky',\n\t'mucus',\n\t'muddy',\n\t'mulch',\n\t'mummy',\n\t'munch',\n\t'mural',\n\t'murky',\n\t'mushy',\n\t'music',\n\t'musky',\n\t'musty',\n\t'myrrh',\n\t'nadir',\n\t'naive',\n\t'nanny',\n\t'nasal',\n\t'nasty',\n\t'natal',\n\t'naval',\n\t'navel',\n\t'needy',\n\t'neigh',\n\t'nerdy',\n\t'nerve',\n\t'never',\n\t'newer',\n\t'newly',\n\t'nicer',\n\t'niche',\n\t'niece',\n\t'night',\n\t'ninja',\n\t'ninny',\n\t'ninth',\n\t'noble',\n\t'nobly',\n\t'noise',\n\t'noisy',\n\t'nomad',\n\t'noose',\n\t'north',\n\t'nosey',\n\t'notch',\n\t'novel',\n\t'nudge',\n\t'nurse',\n\t'nutty',\n\t'nylon',\n\t'nymph',\n\t'oaken',\n\t'obese',\n\t'occur',\n\t'ocean',\n\t'octal',\n\t'octet',\n\t'odder',\n\t'oddly',\n\t'offal',\n\t'offer',\n\t'often',\n\t'olden',\n\t'older',\n\t'olive',\n\t'ombre',\n\t'omega',\n\t'onion',\n\t'onset',\n\t'opera',\n\t'opine',\n\t'opium',\n\t'optic',\n\t'orbit',\n\t'order',\n\t'organ',\n\t'other',\n\t'otter',\n\t'ought',\n\t'ounce',\n\t'outdo',\n\t'outer',\n\t'outgo',\n\t'ovary',\n\t'ovate',\n\t'overt',\n\t'ovine',\n\t'ovoid',\n\t'owing',\n\t'owner',\n\t'oxide',\n\t'ozone',\n\t'paddy',\n\t'pagan',\n\t'paint',\n\t'paler',\n\t'palsy',\n\t'panel',\n\t'panic',\n\t'pansy',\n\t'papal',\n\t'paper',\n\t'parer',\n\t'parka',\n\t'parry',\n\t'parse',\n\t'party',\n\t'pasta',\n\t'paste',\n\t'pasty',\n\t'patch',\n\t'patio',\n\t'patsy',\n\t'patty',\n\t'pause',\n\t'payee',\n\t'payer',\n\t'peace',\n\t'peach',\n\t'pearl',\n\t'pecan',\n\t'pedal',\n\t'penal',\n\t'pence',\n\t'penne',\n\t'penny',\n\t'perch',\n\t'peril',\n\t'perky',\n\t'pesky',\n\t'pesto',\n\t'petal',\n\t'petty',\n\t'phase',\n\t'phone',\n\t'phony',\n\t'photo',\n\t'piano',\n\t'picky',\n\t'piece',\n\t'piety',\n\t'piggy',\n\t'pilot',\n\t'pinch',\n\t'piney',\n\t'pinky',\n\t'pinto',\n\t'piper',\n\t'pique',\n\t'pitch',\n\t'pithy',\n\t'pivot',\n\t'pixel',\n\t'pixie',\n\t'pizza',\n\t'place',\n\t'plaid',\n\t'plain',\n\t'plait',\n\t'plane',\n\t'plank',\n\t'plant',\n\t'plate',\n\t'plaza',\n\t'plead',\n\t'pleat',\n\t'plied',\n\t'plier',\n\t'pluck',\n\t'plumb',\n\t'plume',\n\t'plump',\n\t'plunk',\n\t'plush',\n\t'poesy',\n\t'point',\n\t'poise',\n\t'poker',\n\t'polar',\n\t'polka',\n\t'polyp',\n\t'pooch',\n\t'poppy',\n\t'porch',\n\t'poser',\n\t'posit',\n\t'posse',\n\t'pouch',\n\t'pound',\n\t'pouty',\n\t'power',\n\t'prank',\n\t'prawn',\n\t'preen',\n\t'press',\n\t'price',\n\t'prick',\n\t'pride',\n\t'pried',\n\t'prime',\n\t'primo',\n\t'print',\n\t'prior',\n\t'prism',\n\t'privy',\n\t'prize',\n\t'probe',\n\t'prone',\n\t'prong',\n\t'proof',\n\t'prose',\n\t'proud',\n\t'prove',\n\t'prowl',\n\t'proxy',\n\t'prude',\n\t'prune',\n\t'psalm',\n\t'pubic',\n\t'pudgy',\n\t'puffy',\n\t'pulpy',\n\t'pulse',\n\t'punch',\n\t'pupal',\n\t'pupil',\n\t'puppy',\n\t'puree',\n\t'purer',\n\t'purge',\n\t'purse',\n\t'pushy',\n\t'putty',\n\t'pygmy',\n\t'quack',\n\t'quail',\n\t'quake',\n\t'qualm',\n\t'quark',\n\t'quart',\n\t'quash',\n\t'quasi',\n\t'queen',\n\t'queer',\n\t'quell',\n\t'query',\n\t'quest',\n\t'queue',\n\t'quick',\n\t'quiet',\n\t'quill',\n\t'quilt',\n\t'quirk',\n\t'quite',\n\t'quota',\n\t'quote',\n\t'quoth',\n\t'rabbi',\n\t'rabid',\n\t'racer',\n\t'radar',\n\t'radii',\n\t'radio',\n\t'rainy',\n\t'raise',\n\t'rajah',\n\t'rally',\n\t'ralph',\n\t'ramen',\n\t'ranch',\n\t'randy',\n\t'range',\n\t'rapid',\n\t'rarer',\n\t'raspy',\n\t'ratio',\n\t'ratty',\n\t'raven',\n\t'rayon',\n\t'razor',\n\t'reach',\n\t'react',\n\t'ready',\n\t'realm',\n\t'rearm',\n\t'rebar',\n\t'rebel',\n\t'rebus',\n\t'rebut',\n\t'recap',\n\t'recur',\n\t'recut',\n\t'reedy',\n\t'refer',\n\t'refit',\n\t'regal',\n\t'rehab',\n\t'reign',\n\t'relax',\n\t'relay',\n\t'relic',\n\t'remit',\n\t'renal',\n\t'renew',\n\t'repay',\n\t'repel',\n\t'reply',\n\t'rerun',\n\t'reset',\n\t'resin',\n\t'retch',\n\t'retro',\n\t'retry',\n\t'reuse',\n\t'revel',\n\t'revue',\n\t'rhino',\n\t'rhyme',\n\t'rider',\n\t'ridge',\n\t'rifle',\n\t'right',\n\t'rigid',\n\t'rigor',\n\t'rinse',\n\t'ripen',\n\t'riper',\n\t'risen',\n\t'riser',\n\t'risky',\n\t'rival',\n\t'river',\n\t'rivet',\n\t'roach',\n\t'roast',\n\t'robin',\n\t'robot',\n\t'rocky',\n\t'rodeo',\n\t'roger',\n\t'rogue',\n\t'roomy',\n\t'roost',\n\t'rotor',\n\t'rouge',\n\t'rough',\n\t'round',\n\t'rouse',\n\t'route',\n\t'rover',\n\t'rowdy',\n\t'rower',\n\t'royal',\n\t'ruddy',\n\t'ruder',\n\t'rugby',\n\t'ruler',\n\t'rumba',\n\t'rumor',\n\t'rupee',\n\t'rural',\n\t'rusty',\n\t'sadly',\n\t'safer',\n\t'saint',\n\t'salad',\n\t'sally',\n\t'salon',\n\t'salsa',\n\t'salty',\n\t'salve',\n\t'salvo',\n\t'sandy',\n\t'saner',\n\t'sappy',\n\t'sassy',\n\t'satin',\n\t'satyr',\n\t'sauce',\n\t'saucy',\n\t'sauna',\n\t'saute',\n\t'savor',\n\t'savoy',\n\t'savvy',\n\t'scald',\n\t'scale',\n\t'scalp',\n\t'scaly',\n\t'scamp',\n\t'scant',\n\t'scare',\n\t'scarf',\n\t'scary',\n\t'scene',\n\t'scent',\n\t'scion',\n\t'scoff',\n\t'scold',\n\t'scone',\n\t'scoop',\n\t'scope',\n\t'score',\n\t'scorn',\n\t'scour',\n\t'scout',\n\t'scowl',\n\t'scram',\n\t'scrap',\n\t'scree',\n\t'screw',\n\t'scrub',\n\t'scrum',\n\t'scuba',\n\t'sedan',\n\t'seedy',\n\t'segue',\n\t'seize',\n\t'semen',\n\t'sense',\n\t'sepia',\n\t'serif',\n\t'serum',\n\t'serve',\n\t'setup',\n\t'seven',\n\t'sever',\n\t'sewer',\n\t'shack',\n\t'shade',\n\t'shady',\n\t'shaft',\n\t'shake',\n\t'shaky',\n\t'shale',\n\t'shall',\n\t'shalt',\n\t'shame',\n\t'shank',\n\t'shape',\n\t'shard',\n\t'share',\n\t'shark',\n\t'sharp',\n\t'shave',\n\t'shawl',\n\t'shear',\n\t'sheen',\n\t'sheep',\n\t'sheer',\n\t'sheet',\n\t'sheik',\n\t'shelf',\n\t'shell',\n\t'shied',\n\t'shift',\n\t'shine',\n\t'shiny',\n\t'shire',\n\t'shirk',\n\t'shirt',\n\t'shoal',\n\t'shock',\n\t'shone',\n\t'shook',\n\t'shoot',\n\t'shore',\n\t'shorn',\n\t'short',\n\t'shout',\n\t'shove',\n\t'shown',\n\t'showy',\n\t'shrew',\n\t'shrub',\n\t'shrug',\n\t'shuck',\n\t'shunt',\n\t'shush',\n\t'shyly',\n\t'siege',\n\t'sieve',\n\t'sight',\n\t'sigma',\n\t'silky',\n\t'silly',\n\t'since',\n\t'sinew',\n\t'singe',\n\t'siren',\n\t'sissy',\n\t'sixth',\n\t'sixty',\n\t'skate',\n\t'skier',\n\t'skiff',\n\t'skill',\n\t'skimp',\n\t'skirt',\n\t'skulk',\n\t'skull',\n\t'skunk',\n\t'slack',\n\t'slain',\n\t'slang',\n\t'slant',\n\t'slash',\n\t'slate',\n\t'slave',\n\t'sleek',\n\t'sleep',\n\t'sleet',\n\t'slept',\n\t'slice',\n\t'slick',\n\t'slide',\n\t'slime',\n\t'slimy',\n\t'sling',\n\t'slink',\n\t'sloop',\n\t'slope',\n\t'slosh',\n\t'sloth',\n\t'slump',\n\t'slung',\n\t'slunk',\n\t'slurp',\n\t'slush',\n\t'slyly',\n\t'smack',\n\t'small',\n\t'smart',\n\t'smash',\n\t'smear',\n\t'smell',\n\t'smelt',\n\t'smile',\n\t'smirk',\n\t'smite',\n\t'smith',\n\t'smock',\n\t'smoke',\n\t'smoky',\n\t'smote',\n\t'snack',\n\t'snail',\n\t'snake',\n\t'snaky',\n\t'snare',\n\t'snarl',\n\t'sneak',\n\t'sneer',\n\t'snide',\n\t'sniff',\n\t'snipe',\n\t'snoop',\n\t'snore',\n\t'snort',\n\t'snout',\n\t'snowy',\n\t'snuck',\n\t'snuff',\n\t'soapy',\n\t'sober',\n\t'soggy',\n\t'solar',\n\t'solid',\n\t'solve',\n\t'sonar',\n\t'sonic',\n\t'sooth',\n\t'sooty',\n\t'sorry',\n\t'sound',\n\t'south',\n\t'sower',\n\t'space',\n\t'spade',\n\t'spank',\n\t'spare',\n\t'spark',\n\t'spasm',\n\t'spawn',\n\t'speak',\n\t'spear',\n\t'speck',\n\t'speed',\n\t'spell',\n\t'spelt',\n\t'spend',\n\t'spent',\n\t'sperm',\n\t'spice',\n\t'spicy',\n\t'spied',\n\t'spiel',\n\t'spike',\n\t'spiky',\n\t'spill',\n\t'spilt',\n\t'spine',\n\t'spiny',\n\t'spire',\n\t'spite',\n\t'splat',\n\t'split',\n\t'spoil',\n\t'spoke',\n\t'spoof',\n\t'spook',\n\t'spool',\n\t'spoon',\n\t'spore',\n\t'sport',\n\t'spout',\n\t'spray',\n\t'spree',\n\t'sprig',\n\t'spunk',\n\t'spurn',\n\t'spurt',\n\t'squad',\n\t'squat',\n\t'squib',\n\t'stack',\n\t'staff',\n\t'stage',\n\t'staid',\n\t'stain',\n\t'stair',\n\t'stake',\n\t'stale',\n\t'stalk',\n\t'stall',\n\t'stamp',\n\t'stand',\n\t'stank',\n\t'stare',\n\t'stark',\n\t'start',\n\t'stash',\n\t'state',\n\t'stave',\n\t'stead',\n\t'steak',\n\t'steal',\n\t'steam',\n\t'steed',\n\t'steel',\n\t'steep',\n\t'steer',\n\t'stein',\n\t'stern',\n\t'stick',\n\t'stiff',\n\t'still',\n\t'stilt',\n\t'sting',\n\t'stink',\n\t'st