diff --git a/public/assets/images/game-icons.png b/public/assets/images/game-icons.png index 6f37990..1bce167 100644 Binary files a/public/assets/images/game-icons.png and b/public/assets/images/game-icons.png differ diff --git a/public/assets/images/game-icons.psd b/public/assets/images/game-icons.psd index c360ef2..0e01260 100644 Binary files a/public/assets/images/game-icons.psd and b/public/assets/images/game-icons.psd differ diff --git a/public/src/games/minicrossword/MiniCrosswordGame.js b/public/src/games/minicrossword/MiniCrosswordGame.js index 4c2c6b4..fc34e6d 100644 --- a/public/src/games/minicrossword/MiniCrosswordGame.js +++ b/public/src/games/minicrossword/MiniCrosswordGame.js @@ -24,9 +24,13 @@ const TITLE_GOLD = '#d4a017'; const DEPTH = { bg: 0, panel: 2, cell: 8, cellTxt: 10, ui: 20, overlay: 40, overlayUI: 42 }; // ── Grid geometry ──────────────────────────────────────────────────────────────── -const CELL_SIZE = 116; -const GRID_LEFT = 300; -const GRID_TOP = 300; +// The grid is sized to fit the left region (clue panel lives on the right at +// x>=1010), so 5x5 / 6x6 / 7x7 all fit without overlap. Cell size, position and +// font sizes are derived per-puzzle in computeGeometry(). +const GRID_AREA = 680; // target pixel extent of the larger grid dimension +const GRID_LEFT_X = 90; // left edge of the region the grid is centered within +const GRID_REGION = 880; // width of that region +const GRID_TOP = 280; export default class MiniCrosswordGame extends Phaser.Scene { constructor() { super('MiniCrosswordGame'); } @@ -91,21 +95,25 @@ export default class MiniCrosswordGame extends Phaser.Scene { }).setOrigin(0.5).setDepth(DEPTH.ui)); this.startObjs.push(this.add.text(cx, cy - 90, - 'Fill the 5×5 grid so every across and down answer\nmatches its clue. Click a cell or clue to start typing.', { + 'Fill the grid so every across and down answer matches\nits clue. Bigger grid, bigger challenge. Click a cell or\nclue to start typing.', { fontFamily: '"Julius Sans One"', fontSize: '28px', color: COLORS.mutedHex, align: 'center', lineSpacing: 8, }).setOrigin(0.5).setDepth(DEPTH.ui)); - this.startObjs.push(this.add.text(cx, cy + 10, 'Choose difficulty', { + this.startObjs.push(this.add.text(cx, cy + 10, 'Choose a grid size', { fontFamily: 'Righteous', fontSize: '36px', color: COLORS.textHex, }).setOrigin(0.5).setDepth(DEPTH.ui)); - [['Easy', 'easy'], ['Medium', 'medium'], ['Hard', 'hard']].forEach(([label, id], i) => { - const b = new Button(this, cx - 270 + i * 270, cy + 110, label, + [['Easy', '5×5', 'easy'], ['Medium', '6×6', 'medium'], ['Hard', '7×7', 'hard']].forEach(([label, size, id], i) => { + const x = cx - 270 + i * 270; + const b = new Button(this, x, cy + 110, label, () => this.startPuzzle(id), { width: 230, height: 68, fontSize: 28, bgHover: GOLD }); b.setDepth(DEPTH.ui); this.startObjs.push(b); + this.startObjs.push(this.add.text(x, cy + 168, size, { + fontFamily: '"Julius Sans One"', fontSize: '26px', color: COLORS.mutedHex, + }).setOrigin(0.5).setDepth(DEPTH.ui)); }); } @@ -136,7 +144,21 @@ export default class MiniCrosswordGame extends Phaser.Scene { // ── Board ────────────────────────────────────────────────────────────────────── + // Derive cell size, grid origin and font sizes from the puzzle dimensions so + // every grid size fits the left region and stays clear of the clue panel. + computeGeometry() { + const cols = this.grid[0].length; + const rows = this.grid.length; + this.cellSize = Math.max(88, Math.min(128, Math.floor(GRID_AREA / Math.max(rows, cols)))); + const gridW = cols * this.cellSize; + this.gridLeft = GRID_LEFT_X + (GRID_REGION - gridW) / 2; + this.gridTop = GRID_TOP; + this.letterFont = Math.round(this.cellSize * 0.5); + this.numberFont = Math.round(this.cellSize * 0.19); + } + buildBoard() { + this.computeGeometry(); this.buildClueBanner(); this.buildGrid(); this.buildCluePanel(); @@ -154,8 +176,8 @@ export default class MiniCrosswordGame extends Phaser.Scene { cellCenter(r, c) { return { - x: GRID_LEFT + c * CELL_SIZE + CELL_SIZE / 2, - y: GRID_TOP + r * CELL_SIZE + CELL_SIZE / 2, + x: this.gridLeft + c * this.cellSize + this.cellSize / 2, + y: this.gridTop + r * this.cellSize + this.cellSize / 2, }; } @@ -165,7 +187,7 @@ export default class MiniCrosswordGame extends Phaser.Scene { const { x, y } = this.cellCenter(r, c); const block = this.grid[r][c] === '#'; - const rect = this.add.rectangle(x, y, CELL_SIZE - 4, CELL_SIZE - 4, + const rect = this.add.rectangle(x, y, this.cellSize - 4, this.cellSize - 4, block ? BLOCK_FILL : CELL).setStrokeStyle(3, EDGE).setDepth(DEPTH.cell); if (block) continue; @@ -173,13 +195,13 @@ export default class MiniCrosswordGame extends Phaser.Scene { rect.on('pointerdown', () => this.onCellClick(r, c)); const txt = this.add.text(x, y + 6, '', { - fontFamily: 'Righteous', fontSize: '58px', color: INK_DARK, + fontFamily: 'Righteous', fontSize: `${this.letterFont}px`, color: INK_DARK, }).setOrigin(0.5).setDepth(DEPTH.cellTxt); const num = this.numbers[`${r},${c}`]; if (num) { - this.add.text(x - CELL_SIZE / 2 + 12, y - CELL_SIZE / 2 + 8, String(num), { - fontFamily: '"Julius Sans One"', fontSize: '22px', color: INK_DARK, + this.add.text(x - this.cellSize / 2 + 10, y - this.cellSize / 2 + 6, String(num), { + fontFamily: '"Julius Sans One"', fontSize: `${this.numberFont}px`, color: INK_DARK, }).setOrigin(0, 0).setDepth(DEPTH.cellTxt); } @@ -189,8 +211,8 @@ export default class MiniCrosswordGame extends Phaser.Scene { } buildClueBanner() { - const gridW = this.grid[0].length * CELL_SIZE; - this.banner = this.add.text(GRID_LEFT + gridW / 2, GRID_TOP - 70, '', { + const gridW = this.grid[0].length * this.cellSize; + this.banner = this.add.text(this.gridLeft + gridW / 2, this.gridTop - 70, '', { fontFamily: 'Righteous', fontSize: '34px', color: TITLE_GOLD, align: 'center', wordWrap: { width: gridW + 40 }, }).setOrigin(0.5, 1).setDepth(DEPTH.ui); @@ -211,13 +233,17 @@ export default class MiniCrosswordGame extends Phaser.Scene { { title: 'DOWN', dir: 'down', slots: this.down, x: PX + 440 }, ]; + // Space clues to fit the tallest column (up to 8 entries for a 7x7). + const maxRows = Math.max(this.across.length, this.down.length, 1); + const step = Math.min(76, Math.floor((PH - 130) / maxRows)); + for (const col of columns) { this.add.text(col.x, PY + 36, col.title, { fontFamily: 'Righteous', fontSize: '34px', color: TITLE_GOLD, }).setDepth(DEPTH.cellTxt); col.slots.forEach((slot, i) => { - const y = PY + 100 + i * 76; + const y = PY + 100 + i * step; const t = this.add.text(col.x, y, `${slot.number}. ${slot.clue}`, { fontFamily: '"Julius Sans One"', fontSize: '24px', color: COLORS.textHex, wordWrap: { width: 360 }, @@ -230,10 +256,10 @@ export default class MiniCrosswordGame extends Phaser.Scene { } buildControls() { - const y = GRID_TOP + this.grid.length * CELL_SIZE + 70; - this.checkBtn = new Button(this, GRID_LEFT + 120, y, 'Check', + const y = this.gridTop + this.grid.length * this.cellSize + 70; + this.checkBtn = new Button(this, this.gridLeft + 120, y, 'Check', () => this.checkGrid(), { width: 200, height: 60, fontSize: 24 }); - this.revealBtn = new Button(this, GRID_LEFT + 350, y, 'Reveal Word', + this.revealBtn = new Button(this, this.gridLeft + 350, y, 'Reveal Word', () => this.revealWord(), { width: 220, height: 60, fontSize: 24, bgHover: GOLD }); [this.checkBtn, this.revealBtn].forEach((b) => b.setDepth(DEPTH.ui)); diff --git a/public/src/games/tectonic/TectonicGame.js b/public/src/games/tectonic/TectonicGame.js new file mode 100644 index 0000000..7b98ad6 --- /dev/null +++ b/public/src/games/tectonic/TectonicGame.js @@ -0,0 +1,645 @@ +import * as Phaser from 'phaser'; +import { GAME_WIDTH, GAME_HEIGHT, COLORS } from '../../config.js'; +import { api } from '../../services/api.js'; +import { Button } from '../../ui/Button.js'; +import { MusicPlayer } from '../../ui/MusicPlayer.js'; +import { playSound, SFX } from '../../ui/Sounds.js'; +import { HINT_LIMITS, DIFFICULTY_SCORES, isBoardComplete, getHintCell } from './TectonicLogic.js'; + +// ── Palette (graph-paper notebook) ───────────────────────────────────────────── +const PAPER = 0xFCFEFF; // bright graph-paper white +const PAPER_EDGE = 0xD9E4EC; +const GRAPH_BLUE = 0x9DC4E6; // fine printed grid lines +const CELL_BLUE = 0x6FA3CF; // puzzle cell separators +const REGION_INK = 0x223547; // bold cage outlines +const INK = '#21303f'; // given numbers (ink) +const INK_N = 0x21303f; +const FADED = '#8aa6bd'; +const TITLE_BLUE = '#27506e'; +const RED_MARK = 0xc0392b; +const PLAYER_INK = '#1c6fb0'; // player-entered numbers (blue pen) + +const DEPTH = { + bg: 0, paper: 1, graph: 2, cell: 3, cellLines: 4, region: 5, + number: 6, selector: 7, hit: 10, ui: 20, overlay: 40, +}; + +// ── Layout ────────────────────────────────────────────────────────────────── +const CX = GAME_WIDTH / 2; +const CY = GAME_HEIGHT / 2; + +// Paper sheet +const PX = 60, PY = 40, PW = 1800, PH = 1000; +const GRAPH_PITCH = 45; + +// Grid (8×8, centered in the left panel) +const N = 8; +const CELL = 90; +const GRID_W = N * CELL; // 720 +const GRID_H = N * CELL; // 720 +const TITLE_CX = 540; // centre of the left panel +const GRID_X = TITLE_CX - GRID_W / 2; // 180 +const GRID_Y = 200; + +// Right-panel number selector (1–5 + eraser) +const NUM_X = 1440; +const NUM_START_Y = 282; +const NUM_STEP = 108; +const ERASER_CY = NUM_START_Y + 5 * NUM_STEP + 6; // below the "5" +const HINT_BTN_Y = ERASER_CY + 86; +const BTN_Y = PY + PH - 48; + +const DIFF_LABELS = { easy: 'Easy', medium: 'Medium', hard: 'Hard' }; + +export default class TectonicGame extends Phaser.Scene { + constructor() { super('TectonicGame'); } + + init(data) { + this._initData = { ...data }; + this.gameDef = data.game; + + this.grid = null; + this.solution = null; + this.regions = null; + this.regionSize = null; // 2D: size of the region each cell belongs to + this.neededFor = null; // neededFor[v] = how many regions hold value v + this.difficulty = ''; + this.selectedNum = 1; + this.hintsLeft = null; + this.hintsUsed = 0; + this.gameEnded = false; + this.hoveredCell = null; + + this.givenCells = []; + this.cellState = []; // 0=empty, 1=correct, 2=wrong + this.cellBgObjs = []; + this.cellTextObjs = []; + this.cellHitObjs = []; + + this.numCircleGfx = null; + this.numStrikeGfx = null; + this.numTextObjs = {}; + this.numHitObjs = {}; + this.hintBtn = null; + this.startObjs = []; + this.revealed = false; + } + + async create() { + const music = this.cache.json.get('music'); + if (music?.tracks) new MusicPlayer(this, music.tracks); + + this.add.rectangle(CX, CY, GAME_WIDTH, GAME_HEIGHT, COLORS.bg).setDepth(DEPTH.bg); + + await this.showStartPanel(); + } + + // ── Start panel ─────────────────────────────────────────────────────────────── + + async showStartPanel() { + const cx = CX, cy = CY; + + const sheet = this.add.graphics().setDepth(DEPTH.paper); + sheet.postFX.addShadow(0, 6, 0.02, 1.2, 0x000000, 10, 0.6); + sheet.fillStyle(PAPER, 1); + sheet.fillRoundedRect(cx - 600, cy - 320, 1200, 640, 18); + sheet.lineStyle(3, PAPER_EDGE, 1); + sheet.strokeRoundedRect(cx - 600, cy - 320, 1200, 640, 18); + this.startObjs.push(sheet); + + // graph lines inside the start sheet + const g = this.add.graphics().setDepth(DEPTH.graph); + g.lineStyle(1, GRAPH_BLUE, 0.4); + for (let x = cx - 600 + GRAPH_PITCH; x < cx + 600; x += GRAPH_PITCH) + g.lineBetween(x, cy - 320, x, cy + 320); + for (let y = cy - 320 + GRAPH_PITCH; y < cy + 320; y += GRAPH_PITCH) + g.lineBetween(cx - 600, y, cx + 600, y); + this.startObjs.push(g); + + this.startObjs.push( + this.add.text(cx, cy - 226, 'Tectonic', { + fontFamily: 'YummyCupcakes', fontSize: '104px', color: TITLE_BLUE, + }).setOrigin(0.5).setDepth(DEPTH.ui), + ); + + this.startObjs.push( + this.add.text(cx, cy - 118, 'Fill each cage 1–N · no touching twins', { + fontFamily: 'YummyCupcakes', fontSize: '34px', color: '#5a7a92', + }).setOrigin(0.5).setDepth(DEPTH.ui), + ); + + this.startObjs.push( + this.add.text(cx, cy - 44, 'Choose difficulty', { + fontFamily: 'YummyCupcakes', fontSize: '44px', color: INK, + }).setOrigin(0.5).setDepth(DEPTH.ui), + ); + + const diffs = [['Easy', 'easy'], ['Medium', 'medium'], ['Hard', 'hard']]; + diffs.forEach(([label, id], i) => { + const b = new Button(this, cx + (i - 1) * 260, cy + 70, label, + () => this.startGame(id), { width: 230, height: 70, fontSize: 26 }); + b.setDepth(DEPTH.ui); + this.startObjs.push(b); + }); + + const leave = new Button(this, cx, cy + 210, 'Leave', + () => this.scene.start('GameMenu'), + { variant: 'ghost', width: 200, height: 50, fontSize: 22 }); + leave.setDepth(DEPTH.ui); + this.startObjs.push(leave); + } + + destroyStart() { + this.startObjs.forEach(o => o.destroy()); + this.startObjs = []; + } + + // ── Game start ──────────────────────────────────────────────────────────────── + + async startGame(difficulty) { + this.destroyStart(); + playSound(this, SFX.PIECE_CLICK); + + let data; + try { + data = await api.get(`/words/tectonic/start?difficulty=${difficulty}`); + } catch (err) { + console.error('[tectonic] failed to fetch puzzle:', err); + await this.showStartPanel(); + return; + } + + this.grid = data.grid.map(row => [...row]); + this.solution = data.solution; + this.regions = data.regions; + this.difficulty = difficulty; + this.selectedNum = 1; + this.hintsLeft = HINT_LIMITS[difficulty] ?? 0; + this.hintsUsed = 0; + this.gameEnded = false; + this.hoveredCell = null; + this.revealed = false; + + this.computeRegionMeta(); + + this.givenCells = this.grid.map(row => row.map(v => v !== 0)); + this.cellState = Array.from({ length: N }, () => Array(N).fill(0)); + + this.buildPaper(); + this.buildTitle(); + this.buildCellLines(); + this.buildRegionBorders(); + this.buildCells(); + this.buildSelector(); + if (this.hintsLeft > 0) this.buildHintBtn(); + this.buildControls(); + this.refreshSelector(); + this.updateCompletedNums(); + } + + // Region size per cell + how many regions contain each value 1..5. + computeRegionMeta() { + const counts = {}; + for (let r = 0; r < N; r++) + for (let c = 0; c < N; c++) { + const id = this.regions[r][c]; + counts[id] = (counts[id] || 0) + 1; + } + this.regionSize = this.regions.map(row => row.map(id => counts[id])); + this.neededFor = [0, 0, 0, 0, 0, 0]; + for (const id in counts) { + const size = counts[id]; + for (let v = 1; v <= size; v++) this.neededFor[v]++; + } + } + + // ── Paper & graph lines ───────────────────────────────────────────────────── + + buildPaper() { + const g = this.add.graphics().setDepth(DEPTH.paper); + g.postFX.addShadow(0, 8, 0.02, 1.2, 0x000000, 14, 0.55); + g.fillStyle(PAPER, 1); + g.fillRoundedRect(PX, PY, PW, PH, 16); + g.lineStyle(2, PAPER_EDGE, 1); + g.strokeRoundedRect(PX, PY, PW, PH, 16); + + // Printed graph-paper grid across the whole sheet. + const gl = this.add.graphics().setDepth(DEPTH.graph); + gl.lineStyle(1, GRAPH_BLUE, 0.45); + for (let x = PX + GRAPH_PITCH; x < PX + PW; x += GRAPH_PITCH) + gl.lineBetween(x, PY + 6, x, PY + PH - 6); + for (let y = PY + GRAPH_PITCH; y < PY + PH; y += GRAPH_PITCH) + gl.lineBetween(PX + 6, y, PX + PW - 6, y); + } + + buildTitle() { + const titleTxt = this.add.text(TITLE_CX, 116, 'Tectonic', { + fontFamily: 'YummyCupcakes', fontSize: '84px', color: TITLE_BLUE, + }).setOrigin(0.5).setDepth(DEPTH.ui); + + this.add.text(titleTxt.x + titleTxt.width / 2 + 24, titleTxt.y + 14, + DIFF_LABELS[this.difficulty] ?? this.difficulty, { + fontFamily: 'YummyCupcakes', fontSize: '36px', color: FADED, + }).setOrigin(0, 0.5).setDepth(DEPTH.ui); + } + + // ── Grid lines & cage borders ──────────────────────────────────────────────── + + buildCellLines() { + const gfx = this.add.graphics().setDepth(DEPTH.cellLines); + gfx.lineStyle(1.5, CELL_BLUE, 0.5); + for (let i = 1; i < N; i++) { + gfx.lineBetween(GRID_X + i * CELL, GRID_Y, GRID_X + i * CELL, GRID_Y + GRID_H); + gfx.lineBetween(GRID_X, GRID_Y + i * CELL, GRID_X + GRID_W, GRID_Y + i * CELL); + } + } + + buildRegionBorders() { + const gfx = this.add.graphics().setDepth(DEPTH.region); + gfx.lineStyle(5, REGION_INK, 0.92); + + const idAt = (r, c) => (r < 0 || r >= N || c < 0 || c >= N) ? -1 : this.regions[r][c]; + + for (let r = 0; r < N; r++) { + for (let c = 0; c < N; c++) { + const id = this.regions[r][c]; + const x = GRID_X + c * CELL; + const y = GRID_Y + r * CELL; + if (idAt(r - 1, c) !== id) gfx.lineBetween(x, y, x + CELL, y); + if (idAt(r, c - 1) !== id) gfx.lineBetween(x, y, x, y + CELL); + if (idAt(r + 1, c) !== id) gfx.lineBetween(x, y + CELL, x + CELL, y + CELL); + if (idAt(r, c + 1) !== id) gfx.lineBetween(x + CELL, y, x + CELL, y + CELL); + } + } + } + + // ── Cells ───────────────────────────────────────────────────────────────────── + + buildCells() { + this.cellBgObjs = []; + this.cellTextObjs = []; + this.cellHitObjs = []; + + for (let r = 0; r < N; r++) { + this.cellBgObjs.push([]); + this.cellTextObjs.push([]); + this.cellHitObjs.push([]); + + for (let c = 0; c < N; c++) { + const cx = GRID_X + c * CELL + CELL / 2; + const cy = GRID_Y + r * CELL + CELL / 2; + const given = this.givenCells[r][c]; + const val = this.grid[r][c]; + + const bg = this.add.graphics().setDepth(DEPTH.cell); + this.cellBgObjs[r].push(bg); + + const txt = this.add.text(cx, cy, given ? String(val) : '', { + fontFamily: given ? 'Righteous' : 'YummyCupcakes', + fontSize: given ? '46px' : '50px', + color: given ? INK : PLAYER_INK, + }).setOrigin(0.5).setDepth(DEPTH.number); + this.cellTextObjs[r].push(txt); + + if (given) { + this.cellHitObjs[r].push(null); + } else { + const hit = this.add.rectangle(cx, cy, CELL - 2, CELL - 2, 0xffffff, 0.001) + .setDepth(DEPTH.hit) + .setInteractive({ useHandCursor: true }); + hit.on('pointerover', () => this.onCellHover(r, c, true)); + hit.on('pointerout', () => this.onCellHover(r, c, false)); + hit.on('pointerdown', () => this.onCellClick(r, c)); + this.cellHitObjs[r].push(hit); + } + } + } + } + + // ── Number selector ─────────────────────────────────────────────────────────── + + buildSelector() { + this.numCircleGfx = this.add.graphics().setDepth(DEPTH.selector); + this.numStrikeGfx = this.add.graphics().setDepth(DEPTH.selector + 2); + this.numHitObjs = {}; + this.numTextObjs = {}; + + for (let n = 1; n <= 5; n++) { + const ny = NUM_START_Y + (n - 1) * NUM_STEP; + + const numTxt = this.add.text(NUM_X, ny, String(n), { + fontFamily: '"Julius Sans One"', fontSize: '74px', color: INK, + }).setOrigin(0.5).setDepth(DEPTH.number + 1); + this.numTextObjs[n] = numTxt; + + const hit = this.add.rectangle(NUM_X, ny, 220, NUM_STEP - 4, 0xffffff, 0.001) + .setDepth(DEPTH.hit + 1) + .setInteractive({ useHandCursor: true }); + hit.on('pointerdown', () => this.selectNum(n)); + this.numHitObjs[n] = hit; + } + + // Eraser × + this.add.text(NUM_X, ERASER_CY, '×', { + fontFamily: '"Julius Sans One"', fontSize: '60px', color: FADED, + }).setOrigin(0.5).setDepth(DEPTH.number + 1); + + const eraserHit = this.add.rectangle(NUM_X, ERASER_CY, 220, NUM_STEP - 4, 0xffffff, 0.001) + .setDepth(DEPTH.hit + 1) + .setInteractive({ useHandCursor: true }); + eraserHit.on('pointerdown', () => this.selectNum(0)); + this.numHitObjs[0] = eraserHit; + } + + refreshSelector() { + const gfx = this.numCircleGfx; + if (!gfx) return; + gfx.clear(); + + let cy; + if (this.selectedNum >= 1 && this.selectedNum <= 5) { + cy = NUM_START_Y + (this.selectedNum - 1) * NUM_STEP; + } else if (this.selectedNum === 0) { + cy = ERASER_CY; + } else { + return; + } + this.drawHandCircle(gfx, NUM_X, cy); + } + + drawHandCircle(gfx, cx, cy) { + gfx.lineStyle(3, RED_MARK, 0.88); + gfx.strokeEllipse(cx, cy, 92, 80); + gfx.lineStyle(2, RED_MARK, 0.28); + gfx.strokeEllipse(cx + 3, cy - 2, 96, 84); + } + + updateCompletedNums() { + const gfx = this.numStrikeGfx; + if (!gfx) return; + gfx.clear(); + + for (let n = 1; n <= 5; n++) { + let count = 0; + for (let r = 0; r < N; r++) + for (let c = 0; c < N; c++) + if (this.grid[r][c] === n) count++; + + const txt = this.numTextObjs[n]; + if (!txt) continue; + + if (count >= this.neededFor[n]) { + txt.setColor('#9bb0c2'); + const ny = NUM_START_Y + (n - 1) * NUM_STEP; + gfx.lineStyle(3, 0x7a92a6, 0.8); + gfx.lineBetween(NUM_X - 38, ny - 6, NUM_X + 38, ny - 6); + } else { + txt.setColor(INK); + } + } + } + + // ── Hint button ─────────────────────────────────────────────────────────────── + + buildHintBtn() { + const isLimited = isFinite(this.hintsLeft); + const label = isLimited ? `Hint (${this.hintsLeft} left)` : 'Hint'; + + this.hintBtn = new Button(this, NUM_X, HINT_BTN_Y, label, + () => this.useHint(), { width: 240, height: 56, fontSize: 22 }); + this.hintBtn.setDepth(DEPTH.ui); + } + + updateHintBtn() { + if (!this.hintBtn) return; + const isLimited = isFinite(this.hintsLeft); + this.hintBtn.setLabel(isLimited ? `Hint (${this.hintsLeft} left)` : 'Hint'); + if (this.hintsLeft === 0) this.hintBtn.setEnabled(false); + } + + // ── Controls ────────────────────────────────────────────────────────────────── + + buildControls() { + new Button(this, PX + 160, BTN_Y, 'New puzzle', + () => this.scene.restart(this._initData), + { variant: 'ghost', width: 230, height: 50, fontSize: 22 }).setDepth(DEPTH.ui); + + new Button(this, PX + PW - 130, BTN_Y, 'Leave', + () => this.scene.start('GameMenu'), + { variant: 'ghost', width: 200, height: 50, fontSize: 22 }).setDepth(DEPTH.ui); + } + + // ── Input ───────────────────────────────────────────────────────────────────── + + selectNum(num) { + this.selectedNum = num; + this.refreshSelector(); + playSound(this, SFX.PIECE_CLICK); + } + + onCellHover(r, c, entering) { + this.hoveredCell = entering ? { r, c } : null; + this.drawCellBg(r, c, entering); + } + + onCellClick(r, c) { + if (this.gameEnded || this.givenCells[r][c]) return; + playSound(this, SFX.PIECE_CLICK); + + if (this.selectedNum === 0) { + this.clearCell(r, c); + } else if (this.grid[r][c] === this.selectedNum) { + this.clearCell(r, c); + } else { + this.placeNum(r, c, this.selectedNum); + } + } + + placeNum(r, c, num) { + this.grid[r][c] = num; + this.cellTextObjs[r][c].setText(String(num)); + + const hovered = this.hoveredCell?.r === r && this.hoveredCell?.c === c; + + if (this.isEasyMode() || this.revealed) { + const correct = (num === this.solution[r][c]); + this.cellState[r][c] = correct ? 1 : 2; + this.drawCellBg(r, c, hovered); + + if (correct && isBoardComplete(this.grid, this.solution)) { + this.time.delayedCall(300, () => this.handleWin()); + } + } else { + this.cellState[r][c] = 0; + this.drawCellBg(r, c, hovered); + + if (this.isAllFilled()) { + this.time.delayedCall(200, () => this.revealAll()); + } + } + + this.updateCompletedNums(); + } + + isEasyMode() { + return this.difficulty === 'easy'; + } + + isAllFilled() { + for (let r = 0; r < N; r++) + for (let c = 0; c < N; c++) + if (!this.givenCells[r][c] && this.grid[r][c] === 0) return false; + return true; + } + + revealAll() { + this.revealed = true; + let allCorrect = true; + + for (let r = 0; r < N; r++) { + for (let c = 0; c < N; c++) { + if (this.givenCells[r][c]) continue; + const correct = this.grid[r][c] === this.solution[r][c]; + if (!correct) allCorrect = false; + this.cellState[r][c] = correct ? 1 : 2; + this.drawCellBg(r, c, false); + } + } + + this.updateCompletedNums(); + + if (allCorrect) { + this.time.delayedCall(300, () => this.handleWin()); + } + } + + clearCell(r, c) { + if (this.givenCells[r][c]) return; + this.grid[r][c] = 0; + this.cellTextObjs[r][c].setText(''); + this.cellState[r][c] = 0; + const hovered = this.hoveredCell?.r === r && this.hoveredCell?.c === c; + this.drawCellBg(r, c, hovered); + this.updateCompletedNums(); + } + + drawCellBg(r, c, isHovered) { + const bg = this.cellBgObjs[r][c]; + if (!bg) return; + bg.clear(); + + const x = GRID_X + c * CELL + 1; + const y = GRID_Y + r * CELL + 1; + const sz = CELL - 2; + + const state = this.cellState[r][c]; + + if (state === 1) { + bg.fillStyle(0x3c8a4e, isHovered ? 0.30 : 0.20); + bg.fillRect(x, y, sz, sz); + } else if (state === 2) { + bg.fillStyle(0xb03a2e, isHovered ? 0.27 : 0.16); + bg.fillRect(x, y, sz, sz); + } else if (isHovered) { + bg.fillStyle(INK_N, 0.07); + bg.fillRect(x, y, sz, sz); + } + } + + // ── Hint ────────────────────────────────────────────────────────────────────── + + useHint() { + if (this.gameEnded) return; + if (isFinite(this.hintsLeft) && this.hintsLeft <= 0) return; + + const cell = getHintCell(this.grid); + if (!cell) return; + + const { r, c } = cell; + + const bg = this.cellBgObjs[r][c]; + bg.clear(); + bg.fillStyle(0xd4a017, 0.5); + bg.fillRect(GRID_X + c * CELL + 1, GRID_Y + r * CELL + 1, CELL - 2, CELL - 2); + + this.time.delayedCall(550, () => { + this.grid[r][c] = this.solution[r][c]; + this.cellTextObjs[r][c].setText(String(this.solution[r][c])); + this.cellState[r][c] = 1; + this.drawCellBg(r, c, false); + this.updateCompletedNums(); + + if (isBoardComplete(this.grid, this.solution)) { + this.time.delayedCall(200, () => this.handleWin()); + } + }); + + if (isFinite(this.hintsLeft)) { + this.hintsLeft--; + this.hintsUsed++; + this.updateHintBtn(); + } + } + + // ── Win ─────────────────────────────────────────────────────────────────────── + + handleWin() { + if (this.gameEnded) return; + this.gameEnded = true; + this.recordResult(); + this.showWin(); + } + + showWin() { + const cx = CX, cy = CY; + + this.add.rectangle(cx, cy, GAME_WIDTH, GAME_HEIGHT, 0x000000, 0.42) + .setDepth(DEPTH.overlay); + + const panel = this.add.graphics().setDepth(DEPTH.overlay + 1); + panel.postFX.addShadow(0, 6, 0.02, 1.2, 0x000000, 10, 0.55); + panel.fillStyle(PAPER, 1); + panel.fillRoundedRect(cx - 460, cy - 230, 920, 460, 18); + panel.lineStyle(3, PAPER_EDGE, 1); + panel.strokeRoundedRect(cx - 460, cy - 230, 920, 460, 18); + + this.add.text(cx, cy - 130, 'Puzzle Solved!', { + fontFamily: 'YummyCupcakes', fontSize: '88px', color: '#3c8a4e', + }).setOrigin(0.5).setDepth(DEPTH.overlay + 2); + + const diffLabel = DIFF_LABELS[this.difficulty] ?? this.difficulty; + const score = this.calcScore(); + + this.add.text(cx, cy - 26, `${diffLabel} · ${score} pts`, { + fontFamily: 'YummyCupcakes', fontSize: '44px', color: TITLE_BLUE, + }).setOrigin(0.5).setDepth(DEPTH.overlay + 2); + + if (this.hintsUsed > 0) { + this.add.text(cx, cy + 28, `${this.hintsUsed} hint${this.hintsUsed > 1 ? 's' : ''} used`, { + fontFamily: 'YummyCupcakes', fontSize: '32px', color: FADED, + }).setOrigin(0.5).setDepth(DEPTH.overlay + 2); + } + + new Button(this, cx - 175, cy + 130, 'New puzzle', + () => this.scene.restart(this._initData), + { width: 280, height: 58, fontSize: 26 }).setDepth(DEPTH.overlay + 3); + + new Button(this, cx + 175, cy + 130, 'Leave', + () => this.scene.start('GameMenu'), + { variant: 'ghost', width: 280, height: 58, fontSize: 26 }).setDepth(DEPTH.overlay + 3); + } + + calcScore() { + const base = DIFFICULTY_SCORES[this.difficulty] ?? 10; + const hintPenalty = this.difficulty === 'medium' ? this.hintsUsed * 4 : 0; + return Math.max(0, base - hintPenalty); + } + + async recordResult() { + try { + await api.post('/history/single-player', { + slug: 'tectonic', score: this.calcScore(), opponentScores: [], result: 'win', + }); + } catch { /* best effort */ } + } +} diff --git a/public/src/games/tectonic/TectonicLogic.js b/public/src/games/tectonic/TectonicLogic.js new file mode 100644 index 0000000..6d6aefb --- /dev/null +++ b/public/src/games/tectonic/TectonicLogic.js @@ -0,0 +1,28 @@ +export const HINT_LIMITS = { + easy: Infinity, + medium: 5, + hard: 0, +}; + +export const DIFFICULTY_SCORES = { + easy: 20, + medium: 50, + hard: 90, +}; + +export function isBoardComplete(grid, solution) { + for (let r = 0; r < grid.length; r++) + for (let c = 0; c < grid[r].length; c++) + if (grid[r][c] !== solution[r][c]) return false; + return true; +} + +// Returns a random empty cell that still needs filling, or null. +export function getHintCell(grid) { + const empties = []; + for (let r = 0; r < grid.length; r++) + for (let c = 0; c < grid[r].length; c++) + if (grid[r][c] === 0) empties.push({ r, c }); + if (empties.length === 0) return null; + return empties[Math.floor(Math.random() * empties.length)]; +} diff --git a/public/src/main.js b/public/src/main.js index 9870503..88598d8 100644 --- a/public/src/main.js +++ b/public/src/main.js @@ -52,6 +52,7 @@ import MiniCrosswordGame from './games/minicrossword/MiniCrosswordGame.js'; import ForbiddenIslandGame from './games/forbiddenisland/ForbiddenIslandGame.js'; import SolitaireTourGame from './games/solitairetour/SolitaireTourGame.js'; import SplendorGame from './games/splendor/SplendorGame.js'; +import TectonicGame from './games/tectonic/TectonicGame.js'; const config = { type: Phaser.AUTO, @@ -117,6 +118,7 @@ const config = { ForbiddenIslandGame, SolitaireTourGame, SplendorGame, + TectonicGame, ], }; diff --git a/public/src/scenes/GameRoomScene.js b/public/src/scenes/GameRoomScene.js index a125306..0bceab3 100644 --- a/public/src/scenes/GameRoomScene.js +++ b/public/src/scenes/GameRoomScene.js @@ -22,7 +22,7 @@ export default class GameRoomScene extends Phaser.Scene { } create() { - const slugDispatch = { backgammon: 'Backgammon', holdem: 'HoldemGame', blackjack: 'BlackjackGame', parchisi: 'ParchisiGame', yatzi: 'YatziGame', skipbo: 'SkipBoGame', phase10: 'Phase10Game', chinesecheckers: 'ChineseCheckersGame', gofish: 'GoFishGame', uno: 'UnoGame', craps: 'CrapsGame', roulette: 'RouletteGame', mexicantrain: 'MexicanTrainGame', hearts: 'HeartsGame', catan: 'CatanGame', tickettoride: 'TicketToRideGame', nerts: 'NertsGame', bingo: 'BingoGame', baccarat: 'BaccaratGame', dominion: 'DominionGame', checkers: 'CheckersGame', chess: 'ChessGame', wordle: 'WordleGame', scrabble: 'ScrabbleGame', ghost: 'GhostGame', wordladder: 'WordLadderGame', wordsearch: 'WordSearchGame', hangman: 'HangmanGame', sudoku: 'SudokuGame', othello: 'OthelloGame', go: 'GoGame', battleship: 'BattleshipGame', mastermind: 'MastermindGame', connect4: 'Connect4Game', boggle: 'BoggleGame', oldmaid: 'OldMaidGame', blokus: 'BlokusGame', spellingbee: 'SpellingBeeGame', minicrossword: 'MiniCrosswordGame', forbiddenisland: 'ForbiddenIslandGame', solitairetour: 'SolitaireTourGame', splendor: 'SplendorGame' }; + const slugDispatch = { backgammon: 'Backgammon', holdem: 'HoldemGame', blackjack: 'BlackjackGame', parchisi: 'ParchisiGame', yatzi: 'YatziGame', skipbo: 'SkipBoGame', phase10: 'Phase10Game', chinesecheckers: 'ChineseCheckersGame', gofish: 'GoFishGame', uno: 'UnoGame', craps: 'CrapsGame', roulette: 'RouletteGame', mexicantrain: 'MexicanTrainGame', hearts: 'HeartsGame', catan: 'CatanGame', tickettoride: 'TicketToRideGame', nerts: 'NertsGame', bingo: 'BingoGame', baccarat: 'BaccaratGame', dominion: 'DominionGame', checkers: 'CheckersGame', chess: 'ChessGame', wordle: 'WordleGame', scrabble: 'ScrabbleGame', ghost: 'GhostGame', wordladder: 'WordLadderGame', wordsearch: 'WordSearchGame', hangman: 'HangmanGame', sudoku: 'SudokuGame', othello: 'OthelloGame', go: 'GoGame', battleship: 'BattleshipGame', mastermind: 'MastermindGame', connect4: 'Connect4Game', boggle: 'BoggleGame', oldmaid: 'OldMaidGame', blokus: 'BlokusGame', spellingbee: 'SpellingBeeGame', minicrossword: 'MiniCrosswordGame', forbiddenisland: 'ForbiddenIslandGame', solitairetour: 'SolitaireTourGame', splendor: 'SplendorGame', tectonic: 'TectonicGame' }; if (slugDispatch[this.game.slug]) { this.scene.start(slugDispatch[this.game.slug], { game: this.game, diff --git a/server/data/crosswords/_generated.json b/server/data/crosswords/_generated.json new file mode 100644 index 0000000..34c1afc --- /dev/null +++ b/server/data/crosswords/_generated.json @@ -0,0 +1,2722 @@ +[ + { + "id": "easy-001", + "difficulty": "easy", + "grid": [ + "#BLAH", + "SLAVE", + "CANAL", + "AMEND", + "REST#" + ], + "_answersAcross": [ + "1. BLAH", + "5. SLAVE", + "6. CANAL", + "7. AMEND", + "8. REST" + ], + "_answersDown": [ + "1. BLAME", + "2. LANES", + "3. AVANT", + "4. HELD", + "5. SCAR" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-002", + "difficulty": "easy", + "grid": [ + "HABIT", + "AMINO", + "RISEN", + "SCORE", + "HINTS" + ], + "_answersAcross": [ + "1. HABIT", + "6. AMINO", + "7. RISEN", + "8. SCORE", + "9. HINTS" + ], + "_answersDown": [ + "1. HARSH", + "2. AMICI", + "3. BISON", + "4. INERT", + "5. TONES" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-003", + "difficulty": "easy", + "grid": [ + "#BULL", + "LANAI", + "ELITE", + "SLOTS", + "TYNE#" + ], + "_answersAcross": [ + "1. BULL", + "5. LANAI", + "6. ELITE", + "7. SLOTS", + "8. TYNE" + ], + "_answersDown": [ + "1. BALLY", + "2. UNION", + "3. LATTE", + "4. LIES", + "5. LEST" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-004", + "difficulty": "easy", + "grid": [ + "GUESS", + "ENROL", + "AMINO", + "RECAP", + "STARE" + ], + "_answersAcross": [ + "1. GUESS", + "6. ENROL", + "7. AMINO", + "8. RECAP", + "9. STARE" + ], + "_answersDown": [ + "1. GEARS", + "2. UNMET", + "3. ERICA", + "4. SONAR", + "5. SLOPE" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-005", + "difficulty": "easy", + "grid": [ + "#SEEN", + "HALLO", + "OLIVE", + "MOTEL", + "ONES#" + ], + "_answersAcross": [ + "1. SEEN", + "5. HALLO", + "6. OLIVE", + "7. MOTEL", + "8. ONES" + ], + "_answersDown": [ + "1. SALON", + "2. ELITE", + "3. ELVES", + "4. NOEL", + "5. HOMO" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-006", + "difficulty": "easy", + "grid": [ + "SILKS", + "AMINO", + "LABEL", + "AGREE", + "DEALS" + ], + "_answersAcross": [ + "1. SILKS", + "6. AMINO", + "7. LABEL", + "8. AGREE", + "9. DEALS" + ], + "_answersDown": [ + "1. SALAD", + "2. IMAGE", + "3. LIBRA", + "4. KNEEL", + "5. SOLES" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-007", + "difficulty": "easy", + "grid": [ + "#NEWS", + "RADII", + "USING", + "LATCH", + "ELSE#" + ], + "_answersAcross": [ + "1. NEWS", + "5. RADII", + "6. USING", + "7. LATCH", + "8. ELSE" + ], + "_answersDown": [ + "1. NASAL", + "2. EDITS", + "3. WINCE", + "4. SIGH", + "5. RULE" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-008", + "difficulty": "easy", + "grid": [ + "WATCH", + "AWARE", + "SABER", + "PILED", + "STEPS" + ], + "_answersAcross": [ + "1. WATCH", + "6. AWARE", + "7. SABER", + "8. PILED", + "9. STEPS" + ], + "_answersDown": [ + "1. WASPS", + "2. AWAIT", + "3. TABLE", + "4. CREEP", + "5. HERDS" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-009", + "difficulty": "easy", + "grid": [ + "#TONE", + "PERIL", + "URGES", + "BRACE", + "SANE#" + ], + "_answersAcross": [ + "1. TONE", + "5. PERIL", + "6. URGES", + "7. BRACE", + "8. SANE" + ], + "_answersDown": [ + "1. TERRA", + "2. ORGAN", + "3. NIECE", + "4. ELSE", + "5. PUBS" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-010", + "difficulty": "easy", + "grid": [ + "#PEER", + "SHAVE", + "HAVEN", + "AGENT", + "WEST#" + ], + "_answersAcross": [ + "1. PEER", + "5. SHAVE", + "6. HAVEN", + "7. AGENT", + "8. WEST" + ], + "_answersDown": [ + "1. PHAGE", + "2. EAVES", + "3. EVENT", + "4. RENT", + "5. SHAW" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-011", + "difficulty": "easy", + "grid": [ + "ARLES", + "BELLE", + "BLADE", + "AIMED", + "SCARS" + ], + "_answersAcross": [ + "1. ARLES", + "6. BELLE", + "7. BLADE", + "8. AIMED", + "9. SCARS" + ], + "_answersDown": [ + "1. ABBAS", + "2. RELIC", + "3. LLAMA", + "4. ELDER", + "5. SEEDS" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-012", + "difficulty": "easy", + "grid": [ + "#HELL", + "POLIO", + "AGENT", + "PACES", + "ANTS#" + ], + "_answersAcross": [ + "1. HELL", + "5. POLIO", + "6. AGENT", + "7. PACES", + "8. ANTS" + ], + "_answersDown": [ + "1. HOGAN", + "2. ELECT", + "3. LINES", + "4. LOTS", + "5. PAPA" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-013", + "difficulty": "easy", + "grid": [ + "LACKS", + "ALONE", + "TONIC", + "THEFT", + "EASES" + ], + "_answersAcross": [ + "1. LACKS", + "6. ALONE", + "7. TONIC", + "8. THEFT", + "9. EASES" + ], + "_answersDown": [ + "1. LATTE", + "2. ALOHA", + "3. CONES", + "4. KNIFE", + "5. SECTS" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-014", + "difficulty": "easy", + "grid": [ + "#PULP", + "CANAL", + "UNITE", + "BETTA", + "ELSE#" + ], + "_answersAcross": [ + "1. PULP", + "5. CANAL", + "6. UNITE", + "7. BETTA", + "8. ELSE" + ], + "_answersDown": [ + "1. PANEL", + "2. UNITS", + "3. LATTE", + "4. PLEA", + "5. CUBE" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-015", + "difficulty": "easy", + "grid": [ + "BLOOD", + "LARVA", + "ANGER", + "SCART", + "TENTS" + ], + "_answersAcross": [ + "1. BLOOD", + "6. LARVA", + "7. ANGER", + "8. SCART", + "9. TENTS" + ], + "_answersDown": [ + "1. BLAST", + "2. LANCE", + "3. ORGAN", + "4. OVERT", + "5. DARTS" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-016", + "difficulty": "easy", + "grid": [ + "#HACK", + "SOLON", + "PRIMO", + "ASKEW", + "SEES#" + ], + "_answersAcross": [ + "1. HACK", + "5. SOLON", + "6. PRIMO", + "7. ASKEW", + "8. SEES" + ], + "_answersDown": [ + "1. HORSE", + "2. ALIKE", + "3. COMES", + "4. KNOW", + "5. SPAS" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-017", + "difficulty": "easy", + "grid": [ + "SAGES", + "CRUDE", + "AMIGA", + "LOSER", + "PRESS" + ], + "_answersAcross": [ + "1. SAGES", + "6. CRUDE", + "7. AMIGA", + "8. LOSER", + "9. PRESS" + ], + "_answersDown": [ + "1. SCALP", + "2. ARMOR", + "3. GUISE", + "4. EDGES", + "5. SEARS" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-018", + "difficulty": "easy", + "grid": [ + "#FIRE", + "COCOA", + "ALIAS", + "LINDY", + "LOGS#" + ], + "_answersAcross": [ + "1. FIRE", + "5. COCOA", + "6. ALIAS", + "7. LINDY", + "8. LOGS" + ], + "_answersDown": [ + "1. FOLIO", + "2. ICING", + "3. ROADS", + "4. EASY", + "5. CALL" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-019", + "difficulty": "easy", + "grid": [ + "SLASH", + "TANTO", + "AUGER", + "GREEN", + "EARLY" + ], + "_answersAcross": [ + "1. SLASH", + "6. TANTO", + "7. AUGER", + "8. GREEN", + "9. EARLY" + ], + "_answersDown": [ + "1. STAGE", + "2. LAURA", + "3. ANGER", + "4. STEEL", + "5. HORNY" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "easy-020", + "difficulty": "easy", + "grid": [ + "#PILE", + "GENOA", + "RADAR", + "ACIDS", + "BEES#" + ], + "_answersAcross": [ + "1. PILE", + "5. GENOA", + "6. RADAR", + "7. ACIDS", + "8. BEES" + ], + "_answersDown": [ + "1. PEACE", + "2. INDIE", + "3. LOADS", + "4. EARS", + "5. GRAB" + ], + "across": [ + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-001", + "difficulty": "medium", + "grid": [ + "#FISH#", + "CANTOR", + "ALCOVE", + "SCORED", + "HOMERS", + "#NESS#" + ], + "_answersAcross": [ + "1. FISH", + "5. CANTOR", + "7. ALCOVE", + "8. SCORED", + "9. HOMERS", + "10. NESS" + ], + "_answersDown": [ + "1. FALCON", + "2. INCOME", + "3. STORES", + "4. HOVERS", + "5. CASH", + "6. REDS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-002", + "difficulty": "medium", + "grid": [ + "#GOLF#", + "RECALL", + "UNTRUE", + "GRADES", + "SEVENS", + "#SORT#" + ], + "_answersAcross": [ + "1. GOLF", + "5. RECALL", + "7. UNTRUE", + "8. GRADES", + "9. SEVENS", + "10. SORT" + ], + "_answersDown": [ + "1. GENRES", + "2. OCTAVO", + "3. LARDER", + "4. FLUENT", + "5. RUGS", + "6. LESS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-003", + "difficulty": "medium", + "grid": [ + "#TAPS#", + "THROAT", + "ARISTO", + "TESTIS", + "ESTERS", + "#HARE#" + ], + "_answersAcross": [ + "1. TAPS", + "5. THROAT", + "7. ARISTO", + "8. TESTIS", + "9. ESTERS", + "10. HARE" + ], + "_answersDown": [ + "1. THRESH", + "2. ARISTA", + "3. POSTER", + "4. SATIRE", + "5. TATE", + "6. TOSS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-004", + "difficulty": "medium", + "grid": [ + "#WEST#", + "MISHAP", + "ATTIRE", + "CHARGE", + "SETTER", + "#REST#" + ], + "_answersAcross": [ + "1. WEST", + "5. MISHAP", + "7. ATTIRE", + "8. CHARGE", + "9. SETTER", + "10. REST" + ], + "_answersDown": [ + "1. WITHER", + "2. ESTATE", + "3. SHIRTS", + "4. TARGET", + "5. MACS", + "6. PEER" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-005", + "difficulty": "medium", + "grid": [ + "#SKIP#", + "TIARAS", + "ARROYO", + "LEANER", + "ENTIRE", + "#SECS#" + ], + "_answersAcross": [ + "1. SKIP", + "5. TIARAS", + "7. ARROYO", + "8. LEANER", + "9. ENTIRE", + "10. SECS" + ], + "_answersDown": [ + "1. SIRENS", + "2. KARATE", + "3. IRONIC", + "4. PAYERS", + "5. TALE", + "6. SORE" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-006", + "difficulty": "medium", + "grid": [ + "#WIGS#", + "CANOES", + "ASSURE", + "STARVE", + "TENDED", + "#DEED#" + ], + "_answersAcross": [ + "1. WIGS", + "5. CANOES", + "7. ASSURE", + "8. STARVE", + "9. TENDED", + "10. DEED" + ], + "_answersDown": [ + "1. WASTED", + "2. INSANE", + "3. GOURDE", + "4. SERVED", + "5. CAST", + "6. SEED" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-007", + "difficulty": "medium", + "grid": [ + "#WOOL#", + "PIPPIN", + "ALPINE", + "CLOAKS", + "TESTES", + "#DEED#" + ], + "_answersAcross": [ + "1. WOOL", + "5. PIPPIN", + "7. ALPINE", + "8. CLOAKS", + "9. TESTES", + "10. DEED" + ], + "_answersDown": [ + "1. WILLED", + "2. OPPOSE", + "3. OPIATE", + "4. LINKED", + "5. PACT", + "6. NESS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-008", + "difficulty": "medium", + "grid": [ + "#SEAL#", + "MIRROR", + "ARRIVE", + "LEASED", + "ENTERS", + "#SANS#" + ], + "_answersAcross": [ + "1. SEAL", + "5. MIRROR", + "7. ARRIVE", + "8. LEASED", + "9. ENTERS", + "10. SANS" + ], + "_answersDown": [ + "1. SIRENS", + "2. ERRATA", + "3. ARISEN", + "4. LOVERS", + "5. MALE", + "6. REDS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-009", + "difficulty": "medium", + "grid": [ + "#HARE#", + "PARENT", + "ARCADE", + "CRAVEN", + "TONERS", + "#WARS#" + ], + "_answersAcross": [ + "1. HARE", + "5. PARENT", + "7. ARCADE", + "8. CRAVEN", + "9. TONERS", + "10. WARS" + ], + "_answersDown": [ + "1. HARROW", + "2. ARCANA", + "3. REAVER", + "4. ENDERS", + "5. PACT", + "6. TENS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-010", + "difficulty": "medium", + "grid": [ + "#WAVE#", + "BARING", + "ALCOVE", + "SLALOM", + "HONEYS", + "#PETS#" + ], + "_answersAcross": [ + "1. WAVE", + "5. BARING", + "7. ALCOVE", + "8. SLALOM", + "9. HONEYS", + "10. PETS" + ], + "_answersDown": [ + "1. WALLOP", + "2. ARCANE", + "3. VIOLET", + "4. ENVOYS", + "5. BASH", + "6. GEMS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-011", + "difficulty": "medium", + "grid": [ + "#JEEP#", + "MENTAL", + "ASTUTE", + "GUIDES", + "SIRENS", + "#TEST#" + ], + "_answersAcross": [ + "1. JEEP", + "5. MENTAL", + "7. ASTUTE", + "8. GUIDES", + "9. SIRENS", + "10. TEST" + ], + "_answersDown": [ + "1. JESUIT", + "2. ENTIRE", + "3. ETUDES", + "4. PATENT", + "5. MAGS", + "6. LESS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-012", + "difficulty": "medium", + "grid": [ + "#ROOT#", + "COUPON", + "ATTIRE", + "PALAIS", + "STATES", + "#EYES#" + ], + "_answersAcross": [ + "1. ROOT", + "5. COUPON", + "7. ATTIRE", + "8. PALAIS", + "9. STATES", + "10. EYES" + ], + "_answersDown": [ + "1. ROTATE", + "2. OUTLAY", + "3. OPIATE", + "4. TORIES", + "5. CAPS", + "6. NESS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-013", + "difficulty": "medium", + "grid": [ + "#SAKE#", + "SERINE", + "ARISTA", + "MISSES", + "EATERY", + "#LOSS#" + ], + "_answersAcross": [ + "1. SAKE", + "5. SERINE", + "7. ARISTA", + "8. MISSES", + "9. EATERY", + "10. LOSS" + ], + "_answersDown": [ + "1. SERIAL", + "2. ARISTO", + "3. KISSES", + "4. ENTERS", + "5. SAME", + "6. EASY" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-014", + "difficulty": "medium", + "grid": [ + "#PINE#", + "LINENS", + "UPDATE", + "SPIRIT", + "TIGERS", + "#NODE#" + ], + "_answersAcross": [ + "1. PINE", + "5. LINENS", + "7. UPDATE", + "8. SPIRIT", + "9. TIGERS", + "10. NODE" + ], + "_answersDown": [ + "1. PIPPIN", + "2. INDIGO", + "3. NEARED", + "4. ENTIRE", + "5. LUST", + "6. SETS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-015", + "difficulty": "medium", + "grid": [ + "#RODS#", + "HEROES", + "ORACLE", + "PENILE", + "EAGLES", + "#DEER#" + ], + "_answersAcross": [ + "1. RODS", + "5. HEROES", + "7. ORACLE", + "8. PENILE", + "9. EAGLES", + "10. DEER" + ], + "_answersDown": [ + "1. REREAD", + "2. ORANGE", + "3. DOCILE", + "4. SELLER", + "5. HOPE", + "6. SEES" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-016", + "difficulty": "medium", + "grid": [ + "#WEBS#", + "LINEAR", + "ATTIRE", + "SHINES", + "TARGET", + "#LESS#" + ], + "_answersAcross": [ + "1. WEBS", + "5. LINEAR", + "7. ATTIRE", + "8. SHINES", + "9. TARGET", + "10. LESS" + ], + "_answersDown": [ + "1. WITHAL", + "2. ENTIRE", + "3. BEINGS", + "4. SAREES", + "5. LAST", + "6. REST" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-017", + "difficulty": "medium", + "grid": [ + "#SAYS#", + "HERETO", + "EXILED", + "MISLED", + "PETERS", + "#RODS#" + ], + "_answersAcross": [ + "1. SAYS", + "5. HERETO", + "7. EXILED", + "8. MISLED", + "9. PETERS", + "10. RODS" + ], + "_answersDown": [ + "1. SEXIER", + "2. ARISTO", + "3. YELLED", + "4. STEERS", + "5. HEMP", + "6. ODDS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-018", + "difficulty": "medium", + "grid": [ + "#BASE#", + "BURLAP", + "ERRATA", + "EDITED", + "FEVERS", + "#NESS#" + ], + "_answersAcross": [ + "1. BASE", + "5. BURLAP", + "7. ERRATA", + "8. EDITED", + "9. FEVERS", + "10. NESS" + ], + "_answersDown": [ + "1. BURDEN", + "2. ARRIVE", + "3. SLATES", + "4. EATERS", + "5. BEEF", + "6. PADS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-019", + "difficulty": "medium", + "grid": [ + "#ROLE#", + "REPEAL", + "ARISTA", + "TEASER", + "EATERS", + "#DENY#" + ], + "_answersAcross": [ + "1. ROLE", + "5. REPEAL", + "7. ARISTA", + "8. TEASER", + "9. EATERS", + "10. DENY" + ], + "_answersDown": [ + "1. REREAD", + "2. OPIATE", + "3. LESSEN", + "4. EATERY", + "5. RATE", + "6. LARS" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "medium-020", + "difficulty": "medium", + "grid": [ + "#BLEW#", + "PRISON", + "RATTLE", + "OCTAVE", + "MELTED", + "#SEES#" + ], + "_answersAcross": [ + "1. BLEW", + "5. PRISON", + "7. RATTLE", + "8. OCTAVE", + "9. MELTED", + "10. SEES" + ], + "_answersDown": [ + "1. BRACES", + "2. LITTLE", + "3. ESTATE", + "4. WOLVES", + "5. PROM", + "6. NEED" + ], + "across": [ + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-001", + "difficulty": "hard", + "grid": [ + "##CAP##", + "#FADES#", + "CANDLES", + "ART#LIE", + "REAGENT", + "#STATE#", + "##ASS##" + ], + "_answersAcross": [ + "1. CAP", + "4. FADES", + "6. CANDLES", + "8. ART", + "9. LIE", + "10. REAGENT", + "12. STATE", + "13. ASS" + ], + "_answersDown": [ + "1. CANTATA", + "2. ADD", + "3. PELLETS", + "4. FARES", + "5. SEINE", + "6. CAR", + "7. SET", + "11. GAS" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-002", + "difficulty": "hard", + "grid": [ + "##TWO##", + "#POEMS#", + "TIDBITS", + "AND#TEA", + "BELATED", + "#SEVER#", + "##RED##" + ], + "_answersAcross": [ + "1. TWO", + "4. POEMS", + "6. TIDBITS", + "8. AND", + "9. TEA", + "10. BELATED", + "12. SEVER", + "13. RED" + ], + "_answersDown": [ + "1. TODDLER", + "2. WEB", + "3. OMITTED", + "4. PINES", + "5. STEER", + "6. TAB", + "7. SAD", + "11. AVE" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-003", + "difficulty": "hard", + "grid": [ + "##GNU##", + "#BOOTH#", + "HEARTED", + "ALL#ERA", + "STIRRED", + "#SEALS#", + "##SPY##" + ], + "_answersAcross": [ + "1. GNU", + "4. BOOTH", + "6. HEARTED", + "8. ALL", + "9. ERA", + "10. STIRRED", + "12. SEALS", + "13. SPY" + ], + "_answersDown": [ + "1. GOALIES", + "2. NOR", + "3. UTTERLY", + "4. BELTS", + "5. HERES", + "6. HAS", + "7. DAD", + "11. RAP" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-004", + "difficulty": "hard", + "grid": [ + "##TOP##", + "#CHAOS#", + "PARKWAY", + "AGO#DIE", + "REAGENT", + "#START#", + "##SPY##" + ], + "_answersAcross": [ + "1. TOP", + "4. CHAOS", + "6. PARKWAY", + "8. AGO", + "9. DIE", + "10. REAGENT", + "12. START", + "13. SPY" + ], + "_answersDown": [ + "1. THROATS", + "2. OAK", + "3. POWDERY", + "4. CAGES", + "5. SAINT", + "6. PAR", + "7. YET", + "11. GAP" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-005", + "difficulty": "hard", + "grid": [ + "##THE##", + "#HEIRS#", + "LETTUCE", + "ERA#DEN", + "TENDING", + "#SUITE#", + "##SEE##" + ], + "_answersAcross": [ + "1. THE", + "4. HEIRS", + "6. LETTUCE", + "8. ERA", + "9. DEN", + "10. TENDING", + "12. SUITE", + "13. SEE" + ], + "_answersDown": [ + "1. TETANUS", + "2. HIT", + "3. ERUDITE", + "4. HERES", + "5. SCENE", + "6. LET", + "7. ENG", + "11. DIE" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-006", + "difficulty": "hard", + "grid": [ + "##ROB##", + "#TENOR#", + "RIPENED", + "ALL#FAR", + "WEARILY", + "#SCARS#", + "##EYE##" + ], + "_answersAcross": [ + "1. ROB", + "4. TENOR", + "6. RIPENED", + "8. ALL", + "9. FAR", + "10. WEARILY", + "12. SCARS", + "13. EYE" + ], + "_answersDown": [ + "1. REPLACE", + "2. ONE", + "3. BONFIRE", + "4. TILES", + "5. REALS", + "6. RAW", + "7. DRY", + "11. RAY" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-007", + "difficulty": "hard", + "grid": [ + "##WAS##", + "#FILMS#", + "RECLAME", + "OAK#RAY", + "BRISTLE", + "#SNELL#", + "##GAY##" + ], + "_answersAcross": [ + "1. WAS", + "4. FILMS", + "6. RECLAME", + "8. OAK", + "9. RAY", + "10. BRISTLE", + "12. SNELL", + "13. GAY" + ], + "_answersDown": [ + "1. WICKING", + "2. ALL", + "3. SMARTLY", + "4. FEARS", + "5. SMALL", + "6. ROB", + "7. EYE", + "11. SEA" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-008", + "difficulty": "hard", + "grid": [ + "##DOS##", + "#BEAMS#", + "ROCKING", + "EAR#TEA", + "GREATLY", + "#DEVEL#", + "##DEN##" + ], + "_answersAcross": [ + "1. DOS", + "4. BEAMS", + "6. ROCKING", + "8. EAR", + "9. TEA", + "10. GREATLY", + "12. DEVEL", + "13. DEN" + ], + "_answersDown": [ + "1. DECREED", + "2. OAK", + "3. SMITTEN", + "4. BOARD", + "5. SNELL", + "6. REG", + "7. GAY", + "11. AVE" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-009", + "difficulty": "hard", + "grid": [ + "##SUE##", + "#SUPRA#", + "MARSALA", + "OFF#SEC", + "MEASURE", + "#SCART#", + "##EYE##" + ], + "_answersAcross": [ + "1. SUE", + "4. SUPRA", + "6. MARSALA", + "8. OFF", + "9. SEC", + "10. MEASURE", + "12. SCART", + "13. EYE" + ], + "_answersDown": [ + "1. SURFACE", + "2. UPS", + "3. ERASURE", + "4. SAFES", + "5. ALERT", + "6. MOM", + "7. ACE", + "11. SAY" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-010", + "difficulty": "hard", + "grid": [ + "##BIZ##", + "#RULED#", + "PARLORS", + "EVE#LEE", + "REALIST", + "#SUITS#", + "##SEE##" + ], + "_answersAcross": [ + "1. BIZ", + "4. RULED", + "6. PARLORS", + "8. EVE", + "9. LEE", + "10. REALIST", + "12. SUITS", + "13. SEE" + ], + "_answersDown": [ + "1. BUREAUS", + "2. ILL", + "3. ZEOLITE", + "4. RAVES", + "5. DRESS", + "6. PER", + "7. SET", + "11. LIE" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-011", + "difficulty": "hard", + "grid": [ + "##SUN##", + "#CAPES#", + "TRUSTEE", + "OUT#TIN", + "MEETING", + "#LEONE#", + "##DOG##" + ], + "_answersAcross": [ + "1. SUN", + "4. CAPES", + "6. TRUSTEE", + "8. OUT", + "9. TIN", + "10. MEETING", + "12. LEONE", + "13. DOG" + ], + "_answersDown": [ + "1. SAUTEED", + "2. UPS", + "3. NETTING", + "4. CRUEL", + "5. SEINE", + "6. TOM", + "7. ENG", + "11. TOO" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-012", + "difficulty": "hard", + "grid": [ + "##JOE##", + "#POPPY#", + "BASTION", + "ARE#SUE", + "RAPPORT", + "#SHEDS#", + "##SEE##" + ], + "_answersAcross": [ + "1. JOE", + "4. POPPY", + "6. BASTION", + "8. ARE", + "9. SUE", + "10. RAPPORT", + "12. SHEDS", + "13. SEE" + ], + "_answersDown": [ + "1. JOSEPHS", + "2. OPT", + "3. EPISODE", + "4. PARAS", + "5. YOURS", + "6. BAR", + "7. NET", + "11. PEE" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-013", + "difficulty": "hard", + "grid": [ + "##DOS##", + "#DIALS#", + "LUCKILY", + "ACT#DIE", + "STATICS", + "#STINK#", + "##ENG##" + ], + "_answersAcross": [ + "1. DOS", + "4. DIALS", + "6. LUCKILY", + "8. ACT", + "9. DIE", + "10. STATICS", + "12. STINK", + "13. ENG" + ], + "_answersDown": [ + "1. DICTATE", + "2. OAK", + "3. SLIDING", + "4. DUCTS", + "5. SLICK", + "6. LAS", + "7. YES", + "11. TIN" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-014", + "difficulty": "hard", + "grid": [ + "##PIN##", + "#PACED#", + "FORESEE", + "ART#TAG", + "TEASING", + "#SKINS#", + "##ENG##" + ], + "_answersAcross": [ + "1. PIN", + "4. PACED", + "6. FORESEE", + "8. ART", + "9. TAG", + "10. TEASING", + "12. SKINS", + "13. ENG" + ], + "_answersDown": [ + "1. PARTAKE", + "2. ICE", + "3. NESTING", + "4. PORES", + "5. DEANS", + "6. FAT", + "7. EGG", + "11. SIN" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-015", + "difficulty": "hard", + "grid": [ + "##TEE##", + "#NAVAL#", + "METERED", + "EAT#TWO", + "TROPHIC", + "#SORES#", + "##SON##" + ], + "_answersAcross": [ + "1. TEE", + "4. NAVAL", + "6. METERED", + "8. EAT", + "9. TWO", + "10. TROPHIC", + "12. SORES", + "13. SON" + ], + "_answersDown": [ + "1. TATTOOS", + "2. EVE", + "3. EARTHEN", + "4. NEARS", + "5. LEWIS", + "6. MET", + "7. DOC", + "11. PRO" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-016", + "difficulty": "hard", + "grid": [ + "##NOR##", + "#SONAR#", + "VINEGAR", + "ADS#TIE", + "RETAINS", + "#DORMS#", + "##PEE##" + ], + "_answersAcross": [ + "1. NOR", + "4. SONAR", + "6. VINEGAR", + "8. ADS", + "9. TIE", + "10. RETAINS", + "12. DORMS", + "13. PEE" + ], + "_answersDown": [ + "1. NONSTOP", + "2. ONE", + "3. RAGTIME", + "4. SIDED", + "5. RAINS", + "6. VAR", + "7. RES", + "11. ARE" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-017", + "difficulty": "hard", + "grid": [ + "##ICE##", + "#SNORT#", + "PLENARY", + "EAR#SUE", + "ENTRUST", + "#TIERS#", + "##AGE##" + ], + "_answersAcross": [ + "1. ICE", + "4. SNORT", + "6. PLENARY", + "8. EAR", + "9. SUE", + "10. ENTRUST", + "12. TIERS", + "13. AGE" + ], + "_answersDown": [ + "1. INERTIA", + "2. CON", + "3. ERASURE", + "4. SLANT", + "5. TRUSS", + "6. PEE", + "7. YET", + "11. REG" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-018", + "difficulty": "hard", + "grid": [ + "##CHI##", + "#POEMS#", + "COURIER", + "ASP#TEE", + "RELOADS", + "#RENTS#", + "##SEE##" + ], + "_answersAcross": [ + "1. CHI", + "4. POEMS", + "6. COURIER", + "8. ASP", + "9. TEE", + "10. RELOADS", + "12. RENTS", + "13. SEE" + ], + "_answersDown": [ + "1. COUPLES", + "2. HER", + "3. IMITATE", + "4. POSER", + "5. SEEDS", + "6. CAR", + "7. RES", + "11. ONE" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-019", + "difficulty": "hard", + "grid": [ + "##CAP##", + "#DONOR#", + "MANDREL", + "ART#TEA", + "CERTIFY", + "#DOWNS#", + "##LOG##" + ], + "_answersAcross": [ + "1. CAP", + "4. DONOR", + "6. MANDREL", + "8. ART", + "9. TEA", + "10. CERTIFY", + "12. DOWNS", + "13. LOG" + ], + "_answersDown": [ + "1. CONTROL", + "2. AND", + "3. PORTING", + "4. DARED", + "5. REEFS", + "6. MAC", + "7. LAY", + "11. TWO" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": "hard-020", + "difficulty": "hard", + "grid": [ + "##WEB##", + "#MINER#", + "RIDDLED", + "ENG#AGO", + "FIESTAS", + "#STEEL#", + "##SAD##" + ], + "_answersAcross": [ + "1. WEB", + "4. MINER", + "6. RIDDLED", + "8. ENG", + "9. AGO", + "10. FIESTAS", + "12. STEEL", + "13. SAD" + ], + "_answersDown": [ + "1. WIDGETS", + "2. END", + "3. BELATED", + "4. MINIS", + "5. REGAL", + "6. REF", + "7. DOS", + "11. SEA" + ], + "across": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "down": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + } +] \ No newline at end of file diff --git a/server/data/crosswords/minicrossword.json b/server/data/crosswords/minicrossword.json index 19d48c0..dd892d0 100644 --- a/server/data/crosswords/minicrossword.json +++ b/server/data/crosswords/minicrossword.json @@ -2,286 +2,209 @@ { "id": "easy-001", "difficulty": "easy", - "grid": ["APART", "POWER", "AWARE", "RERUN", "TREND"], + "grid": ["#BLAH", "SLAVE", "CANAL", "AMEND", "REST#"], "across": [ - "Separated, as two people", - "Electrical energy", - "Conscious of; in the know", - "TV episode shown again", - "Current fashion or direction" + "Dull and uninspiring", + "One forced to work for no pay", + "Panama waterway", + "Change, as a law", + "Take a break" ], "down": [ - "Not together", - "Strength or might", - "Mindful", - "Summer TV staple", - "What goes viral, perhaps" + "Point the finger at", + "Bowling alley divisions", + "___-garde (cutting-edge)", + "Gripped tightly", + "Mark left by a healed wound" ] }, { - "id": "easy-002", + "id": "easy-008", "difficulty": "easy", - "grid": ["SMART", "POLAR", "OLIVE", "RAVEN", "TREND"], + "grid": ["WATCH", "AWARE", "SABER", "PILED", "STEPS"], "across": [ - "Clever", - "Like a bear at the North Pole", - "Green martini garnish", - "Edgar Allan Poe's black bird", - "Hot new fashion" + "Wrist timepiece", + "In the know", + "Fencing sword", + "Stacked up", + "Stairs, individually" ], "down": [ - "Baseball or soccer, e.g.", - "Back tooth", - "Living and breathing", - "Glossy black bird", - "Topic that's taking off online" + "Stinging insects", + "Wait for", + "Dining room furniture", + "Move slowly and stealthily", + "Cattle groups" ] }, { - "id": "easy-003", + "id": "easy-009", "difficulty": "easy", - "grid": ["START", "THROW", "ARGUE", "ROUTE", "TWEED"], + "grid": ["#TONE", "PERIL", "URGES", "BRACE", "SANE#"], "across": [ - "Begin", - "Toss a ball", - "Quarrel", - "Path a bus takes", - "Rough wool fabric for jackets" + "Muscle firmness, or vocal quality", + "Grave danger", + "Strongly encourages", + "Support for a sprained joint", + "Of sound mind" ], "down": [ - "A race's beginning", - "Pitch, as a baseball", - "Bicker", - "Mail carrier's territory", - "Tweedy jacket cloth" + "___ firma (solid ground)", + "Church keyboard instrument", + "Your sibling's daughter", + "Or ___ (otherwise)", + "Spots for a pint" ] }, { - "id": "easy-004", + "id": "easy-018", "difficulty": "easy", - "grid": ["CLOSE", "LLAMA", "OASIS", "SMILE", "EASEL"], + "grid": ["#FIRE", "COCOA", "ALIAS", "LINDY", "LOGS#"], "across": [ - "Shut, as a door", - "Andean pack animal", - "Green spot in the desert", - "Happy expression", - "Painter's stand" + "Campsite blaze", + "Hot ___ (cozy winter drink)", + "Assumed name", + "___ Hop (jazz-era swing dance)", + "Firewood pieces" ], "down": [ - "Nearby", - "Spitting Andean beast", - "Desert refuge", - "What a camera asks you to do", - "Stand for a canvas" + "Large book-page size", + "Sugary cake topping", + "Routes for cars", + "Not difficult", + "Ring up on the phone" ] }, { - "id": "easy-005", + "id": "easy-020", "difficulty": "easy", - "grid": ["MAPLE", "AGAIN", "PAINT", "LINER", "ENTRY"], + "grid": ["#PILE", "GENOA", "RADAR", "ACIDS", "BEES#"], "across": [ - "Syrup-producing tree", - "Once more", - "What an artist applies", - "Big cruise ship", - "Doorway, or a diary post" + "Big heap", + "Italian port city", + "Speed-gun technology", + "Bases' chemical opposites", + "Hive dwellers" ], "down": [ - "Tree on Canada's flag", - "Time and time ___", - "Wall color in a can", - "Ocean-crossing vessel", - "Way in" + "Opposite of war", + "Like non-mainstream music", + "Tons; a whole lot", + "Corn units, or hearing organs", + "Snatch quickly" ] }, { - "id": "medium-001", + "id": "medium-020", "difficulty": "medium", - "grid": ["DROVE", "RAVEN", "OVERT", "VERVE", "ENTER"], + "grid": ["#BLEW#", "PRISON", "RATTLE", "OCTAVE", "MELTED", "#SEES#"], "across": [ - "Operated the car; also, a herd", - "Bird that quoth 'Nevermore'", - "Out in the open, not hidden", - "Energy and enthusiasm", - "Key pressed to confirm" + "Past tense of \"blow\"", + "Place for inmates", + "Baby's shaking toy", + "Span of eight musical notes", + "Turned to liquid, as ice", + "Lays eyes on" ], "down": [ - "Chauffeured", - "Corvid in a Poe poem", - "Undisguised", - "Pep and flair", - "Go in" + "Teeth straighteners", + "Not much; small", + "Large property with a mansion", + "Pack animals that howl", + "High school spring dance", + "Require" ] }, { - "id": "medium-002", + "id": "medium-008", "difficulty": "medium", - "grid": ["GRASP", "RUMOR", "AMPLE", "SOLVE", "PREEN"], + "grid": ["#SEAL#", "MIRROR", "ARRIVE", "LEASED", "ENTERS", "#SANS#"], "across": [ - "Grip firmly; comprehend", - "Unverified bit of gossip", - "More than enough", - "Crack, as a puzzle", - "Groom feathers, as a bird does" + "Whiskered arctic swimmer", + "Bathroom reflector", + "Reach a destination", + "Rented out", + "Goes inside", + "Without, in French" ], "down": [ - "Get a handle on", - "Word on the street", - "Plentiful", - "Figure out", - "Primp" - ] - }, - { - "id": "medium-003", - "difficulty": "medium", - "grid": ["SHADE", "HELIX", "ALIVE", "RIVER", "EXERT"], - "across": [ - "Shadow cast by a tree", - "DNA's spiral shape", - "Not dead", - "The Nile or the Amazon", - "Put forth, as effort" - ], - "down": [ - "Portion; or post online", - "Double ___ (DNA structure)", - "Kicking, so to speak", - "One leaping off a board", - "Apply, as force" + "Ambulance wailers", + "List of printed errors", + "Gotten up out of bed", + "Romantic partners", + "Not female", + "Crimson shades" ] }, { "id": "medium-004", "difficulty": "medium", - "grid": ["CRANE", "RESIN", "ASSET", "NIECE", "ENTER"], + "grid": ["#WEST#", "MISHAP", "ATTIRE", "CHARGE", "SETTER", "#REST#"], "across": [ - "Construction lifting machine; or a tall bird", - "Sticky secretion that becomes amber", - "Valuable item on a balance sheet", - "Your sibling's daughter", - "Type in, as data" + "Sunset direction", + "Minor accident", + "Clothing; an outfit", + "Put on a credit card", + "Irish ___ (long-haired dog)", + "The remainder" ], "down": [ - "Stretch the neck to see", - "Pine-tree ooze", - "A plus on the books", - "Nephew's sister", - "Walk into a room" - ] - }, - { - "id": "medium-005", - "difficulty": "medium", - "grid": ["EVADE", "VEGAN", "AGENT", "DANCE", "ENTER"], - "across": [ - "Dodge, as a question", - "One who eats no animal products", - "Spy, or an actor's rep", - "Waltz or tango", - "Sign up for, as a contest" - ], - "down": [ - "Slip away from", - "Plant-based eater", - "007, for one", - "Boogie", - "Join, as a race" - ] - }, - { - "id": "hard-001", - "difficulty": "hard", - "grid": ["CRONE", "RIVAL", "OVOID", "NAIVE", "ELDER"], - "across": [ - "Witchy old woman of folklore", - "Competitor to beat", - "Egg-shaped", - "Innocently unworldly", - "Respected senior; also a berry bush" - ], - "down": [ - "Hag of fairy tales", - "Archnemesis", - "Like an egg's outline", - "Wet behind the ears", - "Tribal sage" + "Shrivel and dry up", + "Inherited property", + "Closet hang-ups", + "Bullseye holder", + "Apple computers", + "Look closely" ] }, { "id": "hard-002", "difficulty": "hard", - "grid": ["GRUFF", "RIVER", "UVULA", "FELON", "FRANK"], + "grid": ["##TWO##", "#POEMS#", "TIDBITS", "AND#TEA", "BELATED", "#SEVER#", "##RED##"], "across": [ - "Brusque and surly", - "The Mississippi, for one", - "Dangly bit at the back of the throat", - "Convicted criminal", - "Candidly blunt; or a hot dog" + "Number after one", + "Verses by Emily Dickinson", + "Small, tasty morsels", + "Plus", + "Afternoon British drink", + "Late, as a birthday card", + "Cut off completely", + "Stop sign's color" ], "down": [ - "Hoarse and curt", - "Flowing waterway", - "Throat's little hanging punching bag", - "One with a rap sheet", - "Straight-talking; ballpark sausage" + "Child just learning to walk", + "Spider's silken trap", + "Left out", + "Evergreen trees", + "Guide a car", + "Bar bill", + "Feeling blue", + "Street: Abbr." ] }, { - "id": "hard-003", + "id": "hard-014", "difficulty": "hard", - "grid": ["PLUMB", "LUNAR", "UNTIE", "MAIZE", "BREED"], + "grid": ["##PIN##", "#PACED#", "FORESEE", "ART#TAG", "TEASING", "#SKINS#", "##ENG##"], "across": [ - "Measure the depth of; dead vertical", - "Of the moon", - "Loosen, as shoelaces", - "Corn, by another name", - "Raise animals; a dog variety" + "Bowling target", + "Walked back and forth nervously", + "Predict in advance", + "Museum display", + "Playground chasing game", + "Good-natured ribbing", + "Potato jackets", + "English: Abbr." ], "down": [ - "Perfectly upright", - "___ eclipse", - "Undo a knot", - "Native American staple grain", - "Labrador or poodle, e.g." - ] - }, - { - "id": "hard-004", - "difficulty": "hard", - "grid": ["SARGE", "ACORN", "ROBOT", "GROVE", "ENTER"], - "across": [ - "Nickname for a drill instructor", - "Oak tree's nut", - "Automaton like R2-D2", - "Small cluster of trees", - "Make an entrance" - ], - "down": [ - "Boot-camp boss, informally", - "Squirrel's buried snack", - "Mechanical worker", - "Orange ___ in Florida", - "Step inside" - ] - }, - { - "id": "hard-005", - "difficulty": "hard", - "grid": ["SHALE", "HELIX", "ALIVE", "LIVER", "EXERT"], - "across": [ - "Rock that yields oil and gas", - "Spiral, as of DNA", - "Full of life", - "Organ that filters toxins", - "Bring to bear, as influence" - ], - "down": [ - "Sedimentary fracking rock", - "Corkscrew shape", - "Among the living", - "Onions' classic skillet partner", - "Wield, as pressure" + "Join in; participate", + "Frozen water", + "What birds do in spring", + "Tiny skin openings", + "College administrators", + "Not lean", + "Breakfast protein source", + "Commandment breaker" ] } ] diff --git a/server/data/wordlists/common.txt b/server/data/wordlists/common.txt new file mode 100644 index 0000000..2d9ba38 --- /dev/null +++ b/server/data/wordlists/common.txt @@ -0,0 +1,16164 @@ +THE +AND +FOR +THAT +THIS +WITH +YOU +NOT +ARE +FROM +YOUR +ALL +HAVE +NEW +MORE +WAS +WILL +HOME +CAN +ABOUT +PAGE +HAS +SEARCH +FREE +BUT +OUR +ONE +OTHER +TIME +THEY +SITE +MAY +WHAT +WHICH +THEIR +NEWS +OUT +USE +ANY +THERE +SEE +ONLY +HIS +WHEN +CONTACT +HERE +WHO +WEB +ALSO +NOW +HELP +GET +VIEW +FIRST +BEEN +WOULD +HOW +WERE +SOME +THESE +CLICK +ITS +LIKE +SERVICE +THAN +FIND +PRICE +DATE +BACK +TOP +PEOPLE +HAD +LIST +NAME +JUST +OVER +STATE +YEAR +DAY +INTO +TWO +HEALTH +WORLD +NEXT +USED +WORK +LAST +MOST +MUSIC +BUY +DATA +MAKE +THEM +SHOULD +PRODUCT +SYSTEM +POST +HER +CITY +ADD +POLICY +NUMBER +SUCH +PLEASE +SUPPORT +MESSAGE +AFTER +BEST +THEN +GOOD +VIDEO +WELL +WHERE +INFO +RIGHTS +PUBLIC +BOOKS +HIGH +SCHOOL +THROUGH +EACH +LINKS +SHE +REVIEW +YEARS +ORDER +VERY +PRIVACY +BOOK +ITEMS +COMPANY +READ +GROUP +SEX +NEED +MANY +USER +SAID +DOES +SET +UNDER +GENERAL +MAIL +FULL +MAP +REVIEWS +PROGRAM +LIFE +KNOW +GAMES +WAY +DAYS +PART +COULD +GREAT +UNITED +HOTEL +REAL +ITEM +CENTER +MUST +STORE +TRAVEL +MADE +REPORT +OFF +MEMBER +DETAILS +LINE +TERMS +BEFORE +HOTELS +DID +SEND +RIGHT +TYPE +BECAUSE +LOCAL +THOSE +USING +RESULTS +OFFICE +CAR +DESIGN +TAKE +POSTED +ADDRESS +WITHIN +STATES +AREA +WANT +PHONE +SUBJECT +BETWEEN +FORUM +FAMILY +LONG +BASED +CODE +SHOW +EVEN +BLACK +CHECK +SPECIAL +PRICES +INDEX +BEING +WOMEN +MUCH +SIGN +FILE +LINK +OPEN +TODAY +SOUTH +CASE +PROJECT +SAME +PAGES +VERSION +SECTION +OWN +FOUND +SPORTS +HOUSE +RELATED +BOTH +COUNTY +PHOTO +GAME +MEMBERS +POWER +WHILE +CARE +NETWORK +DOWN +SYSTEMS +THREE +TOTAL +PLACE +END +HIM +WITHOUT +PER +ACCESS +THINK +NORTH +CURRENT +POSTS +BIG +MEDIA +LAW +CONTROL +WATER +HISTORY +SIZE +ART +SINCE +GUIDE +SHOP +BOARD +CHANGE +WHITE +TEXT +SMALL +RATING +RATE +DURING +RETURN +ACCOUNT +TIMES +SITES +LEVEL +DIGITAL +PROFILE +FORM +EVENTS +LOVE +OLD +JOHN +MAIN +CALL +HOURS +IMAGE +TITLE +ANOTHER +WHY +SHALL +CLASS +STILL +MONEY +QUALITY +EVERY +LISTING +CONTENT +COUNTRY +PRIVATE +LITTLE +VISIT +SAVE +TOOLS +LOW +REPLY +COMPARE +MOVIES +INCLUDE +COLLEGE +VALUE +ARTICLE +MAN +CARD +JOBS +PROVIDE +FOOD +SOURCE +AUTHOR +PRESS +LEARN +SALE +AROUND +PRINT +COURSE +JOB +PROCESS +TEEN +ROOM +STOCK +TOO +CREDIT +POINT +JOIN +SCIENCE +MEN +WEST +SALES +LOOK +ENGLISH +LEFT +TEAM +ESTATE +BOX +SELECT +WINDOWS +PHOTOS +GAY +THREAD +WEEK +NOTE +LIVE +LARGE +GALLERY +TABLE +HOWEVER +MARKET +LIBRARY +REALLY +ACTION +START +SERIES +MODEL +AIR +PLAN +HUMAN +YES +SECOND +HOT +COST +MOVIE +FORUMS +MARCH +BETTER +SAY +YAHOO +GOING +MEDICAL +TEST +FRIEND +COME +SERVER +STUDY +CART +STAFF +AGAIN +PLAY +LOOKING +ISSUES +NEVER +USERS +STREET +TOPIC +COMMENT +THINGS +WORKING +AGAINST +TAX +PERSON +BELOW +MOBILE +LESS +GOT +PARTY +PAYMENT +STUDENT +LET +OFFERS +LEGAL +ABOVE +RECENT +PARK +STORES +SIDE +ACT +PROBLEM +RED +GIVE +MEMORY +SOCIAL +AUGUST +QUOTE +STORY +SELL +OPTIONS +RATES +CREATE +KEY +BODY +YOUNG +FIELD +FEW +EAST +PAPER +SINGLE +AGE +CLUB +EXAMPLE +GIRLS +LATEST +ROAD +GIFT +CHANGES +NIGHT +HARD +TEXAS +PAY +FOUR +POKER +STATUS +BROWSE +ISSUE +RANGE +SELLER +COURT +ALWAYS +RESULT +AUDIO +LIGHT +WRITE +WAR +OFFER +BLUE +GROUPS +EASY +GIVEN +FILES +EVENT +RELEASE +REQUEST +FAX +CHINA +MAKING +PICTURE +NEEDS +MIGHT +YET +MONTH +MAJOR +STAR +AREAS +FUTURE +SPACE +HAND +SUN +CARDS +MEETING +BECOME +CHILD +KEEP +ENTER +PORN +SHARE +SIMILAR +GARDEN +SCHOOLS +MILLION +ADDED +LISTED +BABY +ENERGY +RUN +NET +POPULAR +TERM +FILM +STORIES +PUT +JOURNAL +REPORTS +TRY +WELCOME +CENTRAL +IMAGES +NOTICE +GOD +HEAD +RADIO +UNTIL +CELL +COLOR +SELF +COUNCIL +AWAY +TRACK +ARCHIVE +ONCE +OTHERS +FORMAT +LEAST +SOCIETY +MONTHS +LOG +SAFETY +FRIENDS +SURE +TRADE +EDITION +CARS +TELL +FURTHER +UPDATED +ABLE +HAVING +FUN +ALREADY +GREEN +STUDIES +CLOSE +COMMON +DRIVE +SEVERAL +GOLD +LIVING +CALLED +SHORT +ARTS +LOT +ASK +DISPLAY +LIMITED +POWERED +MEANS +DAILY +BEACH +PAST +NATURAL +WHETHER +DUE +FIVE +UPON +PERIOD +SAYS +WEATHER +MAR +LAND +AVERAGE +DONE +WINDOW +PRO +REGION +ISLAND +RECORD +DIRECT +RECORDS +COSTS +STYLE +FRONT +UPDATE +PARTS +EVER +EARLY +MILES +SOUND +PRESENT +EITHER +AGO +WORD +WORKS +BILL +WRITTEN +TALK +FEDERAL +HOSTING +RULES +FINAL +ADULT +TICKETS +THING +CENTRE +VIA +CHEAP +NUDE +KIDS +FINANCE +TRUE +MINUTES +ELSE +MARK +THIRD +ROCK +GIFTS +READING +TOPICS +BAD +TIPS +PLUS +AUTO +COVER +USUALLY +EDIT +VIDEOS +PERCENT +FAST +FACT +UNIT +GETTING +GLOBAL +MEET +FAR +PLAYER +LYRICS +OFTEN +SUBMIT +AMOUNT +WATCH +FEEL +THOUGH +BANK +RISK +THANKS +DEALS +VARIOUS +WORDS +WEIGHT +TOWN +HEART +CHOOSE +POINTS +ERROR +CAMERA +JUN +GIRL +TOYS +CLEAR +GOLF +RECEIVE +DOMAIN +METHODS +CHAPTER +MAKES +LOAN +WIDE +BEAUTY +MANAGER +TAKEN +SORT +MODELS +KNOWN +HALF +CASES +STEP +SIMPLE +QUICK +NONE +LICENSE +LAKE +WHOLE +ANNUAL +LATER +BASIC +SHOWS +CHURCH +METHOD +ACTIVE +FIGURE +FIRE +HOLIDAY +CHAT +ENOUGH +ALONG +AMONG +DEATH +WRITING +SPEED +LOSS +FACE +BRAND +HIGHER +EFFECTS +CREATED +OIL +BIT +YELLOW +KINGDOM +BASE +NEAR +THOUGHT +STUFF +FRENCH +STORAGE +JAPAN +DOING +LOANS +SHOES +ENTRY +STAY +NATURE +ORDERS +SUMMARY +TURN +MEAN +GROWTH +NOTES +AGENCY +KING +COPY +DRUG +PICS +WESTERN +INCOME +FORCE +CASH +OVERALL +BAY +RIVER +PACKAGE +SEEN +PLAYERS +ENGINE +PORT +ALBUM +STOP +STARTED +BAR +VIEWS +PLANS +DOUBLE +DOG +BUILD +SCREEN +TYPES +SOON +LINES +ACROSS +NEEDED +SEASON +APPLY +SOMEONE +HELD +PRINTER +BELIEVE +EFFECT +ASKED +MIND +CASINO +LOST +TOUR +MENU +VOLUME +CROSS +ANYONE +HOPE +SILVER +WISH +INSIDE +MATURE +ROLE +RATHER +WEEKS +CAME +SUPPLY +NOTHING +CERTAIN +RUNNING +LOWER +UNION +JEWELRY +MON +FINE +NAMES +HOUR +GAS +SKILLS +SIX +BUSH +ISLANDS +ADVICE +CAREER +RENTAL +LEAVE +TEENS +HUGE +SAT +WOMAN +ZIP +BID +KIND +SELLERS +MIDDLE +MOVE +CABLE +TAKING +VALUES +COMING +OBJECT +LESBIAN +MACHINE +LOGO +LENGTH +NICE +SCORE +CLIENT +RETURNS +CAPITAL +FOLLOW +SAMPLE +SENT +SHOWN +CULTURE +BAND +FLASH +LEAD +CHOICE +WENT +COURSES +AIRPORT +FOREIGN +ARTIST +OUTSIDE +LEVELS +CHANNEL +LETTER +MODE +PHONES +IDEAS +FUND +SUMMER +ALLOW +DEGREE +BUTTON +WED +HOMES +SUPER +MALE +MATTER +CUSTOM +ALMOST +TOOK +LOCATED +EDITOR +INN +CAUSE +SONG +FOCUS +LATE +FALL +IDEA +ROOMS +FEMALE +WIN +PRIMARY +CANCER +NUMBERS +REASON +TOOL +BROWSER +SPRING +ANSWER +VOICE +PURPOSE +FEATURE +BED +COMES +POLICE +CAMERAS +BROWN +HILL +MAPS +DEAL +HOLD +RATINGS +FORMS +GLASS +HAPPY +SMITH +WANTED +THANK +SAFE +UNIQUE +SURVEY +PRIOR +SPORT +READY +FEED +ANIMAL +SOURCES +REGULAR +SECURE +ASS +SIMPLY +STATION +ROUND +OPTION +MASTER +VALLEY +RENTALS +SEA +BUILT +BLOOD +CUT +IMPROVE +HALL +LARGER +ANTI +EARTH +PARENTS +IMPACT +KITCHEN +STRONG +TEL +WEDDING +GROUND +SHIP +OWNERS +DISEASE +PAID +PERFECT +HAIR +KIT +CLASSIC +BASIS +COMMAND +CITIES +EXPRESS +ANAL +AWARD +TREE +PETER +ENSURE +THUS +WALL +EXTRA +PUSSY +BUDGET +RATED +GUIDES +SUCCESS +MAXIMUM +QUITE +BOY +AMAZON +WARNING +WINE +HORSE +VOTE +FORWARD +FLOWERS +STARS +LISTS +OWNER +RETAIL +ANIMALS +USEFUL +WAYS +SON +RULE +MAC +HOUSING +TAKES +BRING +CATALOG +MAX +TRYING +MOTHER +TOLD +TRAFFIC +JOINED +INPUT +FEET +AGENT +VALID +BIN +MODERN +SENIOR +SEXY +DOOR +GRAND +TESTING +TRIAL +CHARGE +UNITS +INSTEAD +COOL +NORMAL +WROTE +SHIPS +ENTIRE +LEADING +METAL +FITNESS +OPINION +USES +OUTPUT +FUNDS +GREATER +LIKELY +DEVELOP +ARTISTS +JAVA +GUEST +SEEMS +PASS +TRUST +VAN +SESSION +FEES +CENTURY +SKIN +ADS +RING +GRADE +DATING +PACIFIC +POP +FILTER +MAILING +VEHICLE +LONGER +BEHIND +PANEL +FLOOR +GERMAN +BUYING +MATCH +DEFAULT +REQUIRE +BOYS +OUTDOOR +DEEP +MORNING +ALLOWS +REST +PROTEIN +PLANT +HIT +POOL +MINI +PARTNER +AUTHORS +BOARDS +FACULTY +PARTIES +FISH +MISSION +EYE +STRING +SENSE +PACK +STAGE +GOODS +BORN +UNLESS +RACE +TARGET +EXCEPT +ABILITY +MAYBE +MOVING +BRANDS +PLACES +PRETTY +WINTER +RAPE +BATTERY +YOUTH +BOSTON +INCEST +DEBT +MEDIUM +CORE +BREAK +SETS +DANCE +WOOD +ITSELF +DEFINED +PAPERS +PLAYING +AWARDS +FEE +STUDIO +READER +VIRTUAL +DEVICE +ANSWERS +RENT +LAS +REMOTE +DARK +APPLE +OFFERED +THEORY +ENJOY +REMOVE +AID +SURFACE +MINIMUM +VISUAL +HOST +VARIETY +MARTIN +MANUAL +BLOCK +AGENTS +REPAIR +FAIR +CIVIL +STEEL +SONGS +FIXED +WRONG +HANDS +FINALLY +UPDATES +DESKTOP +CLASSES +PARIS +GETS +SECTOR +JERSEY +FAT +FULLY +FATHER +SAW +QUOTES +OFFICER +DRIVER +DEAD +RESPECT +UNKNOWN +MIKE +TRIP +WORTH +POOR +TEACHER +EYES +WORKERS +FARM +FUCKING +PEACE +CAMPUS +TOM +SHOWING +COAST +BENEFIT +FUNDING +DEVICES +LORD +GRANT +SUB +AGREE +FICTION +HEAR +WATCHES +CAREERS +BEYOND +GOES +LED +MUSEUM +FAN +WIFE +FORMER +TEN +HITS +ZONE +COMPLEX +CAT +DIE +JACK +FLAT +FLOW +PARENT +SETTING +SCALE +STAND +ECONOMY +HIGHEST +HELPFUL +MONTHLY +FRAME +MUSICAL +PATH +CHIEF +GIVES +BOTTOM +DETAIL +LAWS +CHANGED +PET +HEARD +BEGIN +ROYAL +CLEAN +SWITCH +LARGEST +GUY +TITLES +JUSTICE +CONNECT +BIBLE +DEV +CUP +BASKET +APPLIED +WEEKLY +DEMAND +SUITE +SQUARE +ADVANCE +SKIP +DIET +ARMY +AUCTION +GEAR +LEE +ALLOWED +CORRECT +NATION +SELLING +LOTS +PIECE +SHEET +FIRM +SEVEN +OLDER +SPECIES +JUMP +CELLS +MODULE +RESORT +RANDOM +PRICING +MOTION +LOOKS +FASHION +MONITOR +TRADING +FOREST +CALLS +WHOSE +COUPLE +GIVING +CHANCE +VISION +BALL +ENDING +CLIENTS +ACTIONS +LISTEN +DISCUSS +ACCEPT +NAKED +GOAL +SOLD +WIND +MARKETS +LOWEST +HIGHLY +APPEAR +LIVES +LEATHER +PALM +PATIENT +ACTUAL +STONE +BOB +PERHAPS +PERSONS +FIT +TESTS +VILLAGE +AMATEUR +MET +PAIN +FACTORS +COFFEE +CUM +BUYER +EASILY +ORAL +FORD +POSTER +EDGE +ROOT +CLOSED +ICE +PINK +BALANCE +REPLIES +SHOT +INITIAL +LABEL +SEC +CANON +LEAGUE +WASTE +MINUTE +BUS +COLD +CHAIR +FISHING +EFFORT +PHASE +FIELDS +BAG +FANTASY +LETTERS +MOTOR +CONTEXT +INSTALL +SHIRT +APPAREL +FOOT +MASS +CRIME +COUNT +BREAST +QUICKLY +DOLLARS +CLAIM +DRIVING +SURGERY +PATCH +HEAT +WILD +MISS +DOCTOR +TASK +REDUCE +BROUGHT +HIMSELF +NOR +ENABLE +BUG +MID +LEADER +DIAMOND +SOFT +SERVERS +ALONE +SECONDS +JONES +KEYWORD +FLIGHT +FUEL +WALK +FUCK +WAIT +POCKET +SAINT +ROSE +FREEDOM +DRUGS +JOINT +PREMIUM +FRESH +UPGRADE +FACTOR +GROWING +STREAM +PICK +HEARING +EASTERN +THERAPY +ENTRIES +DATES +SIGNED +UPPER +SERIOUS +PRIME +LIMIT +BEGAN +LOUIS +STEPS +ERRORS +SHOPS +BONDAGE +DEL +EFFORTS +CREEK +WORKED +URBAN +SORTED +MYSELF +TOURS +LOAD +LABOR +NURSING +DEFENSE +TAGS +HEAVY +COVERED +JOE +GUYS +COCK +EXPERT +PROTECT +DROP +SOLID +BECAME +ORANGE +PREVENT +THEME +RICH +MARINE +GUITAR +FINDING +SAYING +SPIRIT +CLAIMS +PORNO +SEEM +AFFAIRS +TOUCH +TOWARDS +GOALS +HIRE +SUGGEST +BRANCH +CHARGES +SERVE +REASONS +MAGIC +MOUNT +SMART +TALKING +GAVE +ONES +TITS +AVOID +MANAGE +CORNER +RANK +ELEMENT +BIRTH +VIRUS +ABUSE +QUARTER +TABLES +DEFINE +RACING +FACTS +COLUMN +PLANTS +FAITH +CHAIN +AVENUE +MISSING +DIED +MOVED +REACH +MENTAL +VIEWED +MOMENT +INCH +ATTACK +SORRY +CENTERS +OPENING +DAMAGE +LAB +RESERVE +RECIPES +GAMMA +PLASTIC +PRODUCE +SNOW +PLACED +TRUTH +COUNTER +FAILURE +FOLLOWS +WEEKEND +DOLLAR +CAMP +FILMS +BRIDGE +NATIVE +FILL +OWNED +DRAFT +CHART +PLAYED +READERS +CLUBS +EQUAL +SHIRTS +PROFIT +LEADERS +POSTERS +AVE +EXPECT +PARKING +GONE +CODES +KINDS +GOLDEN +TEAMS +FORT +SENATE +FORCES +FUNNY +BROTHER +GENE +TURNED +TRIED +DISC +PATTERN +BOAT +NAMED +THEATRE +LASER +EARLIER +SPONSOR +ICON +HARRY +OBJECTS +ENDS +DELETE +EVENING +NUCLEAR +TAXES +MOUSE +SIGNAL +ISSUED +BRAIN +SEXUAL +DREAM +FALSE +CAST +FLOWER +FELT +PASSED +FALLS +PIC +SOUL +AIDS +PROMOTE +STATED +STATS +APPEARS +CARRY +FLAG +DECIDED +COVERS +HELLO +DESIGNS +TOURISM +ADULTS +CLIPS +SAVINGS +GRAPHIC +ATOM +BINDING +BRIEF +ENDED +WINNING +EIGHT +IRON +SCRIPT +SERVED +WANTS +VOID +DINING +ALERT +TAG +MIX +DISK +QUEEN +CREDITS +CLEARLY +FIX +HANDLE +SWEET +DESK +HONG +VICE +TRUCK +ENLARGE +RAY +REVENUE +MEASURE +VOTES +DUTY +LOOKED +BEAR +GAIN +OCEAN +FLIGHTS +EXPERTS +SIGNS +LACK +DEPTH +LOGGED +LAPTOP +VINTAGE +TRAIN +EXACTLY +DRY +EXPLORE +SPA +CONCEPT +NEARLY +REALITY +FORGOT +ORIGIN +KNEW +GAMING +FEEDS +BILLION +FASTER +BOUGHT +CON +UPS +NATIONS +ROUTE +BROKEN +FRANK +ALASKA +ZOOM +BLOW +BATTLE +ANIME +SPEAK +QUERY +CLIP +EQUITY +SPEECH +WIRE +RURAL +SHARED +SOUNDS +TAPE +JUDGE +ACID +BYTES +CENT +FORCED +FIGHT +HEIGHT +NULL +ZERO +SPEAKER +FILED +OBTAIN +OFFICES +REMAIN +MANAGED +FAILED +ROLL +BANKS +SECRET +BATH +KELLY +LEADS +THEATER +SPRINGS +VAR +PERFORM +HEALTHY +FONT +ASSETS +INJURY +JOSEPH +DRIVERS +LAWYER +FIGURES +MARRIED +SHARING +PORTAL +WAITING +BETA +FAIL +GRATIS +BANKING +TOWARD +WON +ASSIST +CONDUCT +CALLING +JAZZ +SERVING +BAGS +COMICS +MATTERS +HOUSES +DOC +POSTAL +WEAR +WALES +MINOR +FINISH +NOTED +MOM +REDUCED +PHYSICS +RARE +SPENT +EXTREME +SAMPLES +BARS +ROW +REMOVED +HELPS +SINGLES +CYCLE +AMOUNTS +CONTAIN +DUAL +RISE +SLEEP +BIRD +BRAZIL +STATIC +SCENE +HUNTER +LADY +CRYSTAL +FAMOUS +WRITER +FANS +DRINK +ACADEMY +DYNAMIC +GENDER +EAT +DELL +SEAT +COLOUR +VENDOR +AIM +BIDS +REGIONS +JUNIOR +TOLL +CAPE +RINGS +MEANING +TIP +MINE +LADIES +HENRY +TICKET +GUESS +AGREED +WHOM +SKI +SOCCER +MATH +IMPORT +POSTING +INSTANT +VIEWING +DOGS +ASPECTS +AHEAD +MOON +SCHEME +UTILITY +PREVIEW +FLY +MANNER +MATRIX +DEVEL +DESPITE +TURKEY +PROPER +DEGREES +DELTA +FEAR +SEEKING +INCHES +PHOENIX +SHARES +VOYEUR +COMFORT +COLORS +WARS +CISCO +KEPT +ALPHA +APPEAL +CRUISE +BONUS +HEY +BEAT +ADOBE +SMOKING +BECOMES +DRIVES +ARMS +TEA +TREES +ACHIEVE +DRESS +DEALER +SKY +NEARBY +ROM +CARRIED +HAPPEN +HIDE +REFER +MILLER +CLOTHES +CAUSED +LUXURY +BABES +FRAMES +INDEED +TOY +CIRCUIT +LAYER +PRINTED +SLOW +REMOVAL +EASIER +HIP +NINE +ADDING +MOSTLY +SPOT +PRINTS +SPEND +FACTORY +REVISED +GROW +OPTICAL +AMAZING +CLOCK +DOT +SUITES +FEELING +HIDDEN +SERIAL +RELIEF +RATIO +RAIN +ONTO +PLANET +COPIES +RECIPE +PERMIT +SEEING +PROOF +TENNIS +BASS +BEDROOM +EMPTY +HOLE +PETS +RIDE +BUREAU +PAIR +IDEAL +SPECS +DON +PIECES +PARKS +DINNER +LAWYERS +STRESS +CREAM +RUNS +TRENDS +YEAH +BOXES +HILLS +FOURTH +ADVISOR +EVIL +AWARE +SHAPE +REMAINS +FIRMS +EURO +GENERIC +USAGE +CAP +INK +CHARTS +MIXED +CENSUS +PEAK +EXIST +WHEEL +TRANSIT +DICK +SALT +COMPACT +POETRY +LIGHTS +ANGEL +BELL +KEEPING +ATTEMPT +MATCHES +WIDTH +NOISE +ENGINES +FORGET +ARRAY +CLIMATE +PIN +ALCOHOL +GREEK +SISTER +RAW +WALKING +EXPLAIN +SMALLER +NEWEST +GNU +EXTENT +SHARP +BEN +LANE +KILL +EXPORT +MODULES +OCCUR +KNOWS +CONCERN +BACKUP +HOLDING +TROUBLE +SPREAD +COACH +EXPAND +JORDAN +AGES +PLUG +COOK +AFFECT +VIRGIN +RAISED +HAT +DEALERS +HELPING +LIB +BIKE +TOTALLY +PLATE +BLONDE +LOSE +ORGANIC +SEEK +ALBUMS +CHEATS +GUESTS +HOSTED +TONY +KITS +AGENDA +ANYWAY +TRACKS +CAM +LOGIC +PRINCE +CIRCLE +SOIL +GRANTS +WET +RAM +LEAVING +MATT +COOKING +FOX +RESPOND +SIZES +PLAIN +EXIT +ENTERED +ARM +KEYS +LAUNCH +WAVE +COSTA +HOLY +ACTS +MESH +TRAIL +SYMBOL +CRAFTS +HIGHWAY +BUDDY +DEAN +SETUP +POLL +BOOKING +FISCAL +STYLES +FILLED +BOND +NOTIFY +BLUES +PUB +PORTION +SCOPE +CABLES +COTTON +BIOLOGY +DENTAL +KILLED +BORDER +ANCIENT +DEBATE +STARTS +CAUSES +LEISURE +LEARNED +OPENED +HUSBAND +CRAZY +CONCERT +SCORES +COMEDY +ADOPTED +LINEAR +BEARS +JEAN +HOP +CARRIER +EDITED +VISA +MOUTH +METER +LINKED +GUN +REFLECT +PURE +DELIVER +WONDER +HELL +LESSONS +FRUIT +BEGINS +REFORM +LENS +ALERTS +TREATED +DRAW +ASSUME +CONFIRM +WARM +NEITHER +LEWIS +LEAVES +REPLACE +SUCK +BABE +CHECKS +REACHED +BLOWJOB +SAFARI +SUGAR +CREW +LEGS +STICK +ENABLED +GENRE +SLIDE +TESTED +REAR +ENHANCE +EXACT +BOUND +ADAPTER +NODE +FORMAL +LOCK +HOCKEY +STORM +MICRO +LAPTOPS +MILE +SHOWED +EDITORS +THREADS +BOWL +SUPREME +REF +TANK +DOLLS +NAVY +KID +CANCEL +LIMITS +WEAPONS +PAINT +DELAY +PILOT +OUTLET +NOVEL +PAN +ULTRA +WINNER +EPISODE +POTTER +DISH +PLAYS +MODIFY +OXFORD +TRULY +PATENT +SLOT +EATING +PLANNED +LODGE +MIRROR +KERNEL +BOOBS +STOCKS +BUYERS +GRAY +CHARGED +BROAD +CHOSEN +DEMO +SWISS +LABOUR +HATE +NIGHTS +BEHALF +LIQUID +RICE +LOOP +SALARY +FOODS +GOURMET +GUARD +SAVING +EMPIRE +RESUME +TWENTY +NEWLY +RAISE +PREPARE +AVATAR +ILLEGAL +VARY +HELPED +PREMIER +MILK +DECIDE +CONSENT +DRAMA +CONTEST +BANDS +BOOT +LUNCH +DILDO +AUDIT +PUSH +CHAMBER +GUINEA +MUSCLE +POLLS +TYPICAL +TOWER +YOURS +SUM +CHICKEN +ATTEND +SHOWER +ALAN +SENDING +TONIGHT +DEAR +SHELL +OAK +VAT +BEER +SEEMED +FORMULA +SOLAR +CATCH +JANE +SIR +DOUBT +EARN +FINDER +UNABLE +PERIODS +TASKS +ATTACKS +DOORS +RESORTS +BIGGEST +VISITOR +TWIN +FORTH +INSERT +GATEWAY +ALUMNI +DRAWING +ORDERED +HAPPENS +SPY +ROMANCE +SPLIT +THEMES +POWERS +HEAVEN +BITS +TWICE +FOCUSED +BARGAIN +ASKING +BLOCKS +HUNTING +SUIT +SHIFT +CHIP +RES +SIT +BODIES +CUTTING +WOW +WRITERS +MARKS +LOVED +MAPPING +BIRDS +CHAR +INDEXED +SAVED +PAYING +CARTOON +SHOTS +GRANTED +CHOICES +CARBON +CRISIS +OUTLOOK +MASSIVE +BRIGHT +TREAT +HEADER +POVERTY +FORMED +PIANO +ECHO +GRID +SHEETS +PLASMA +MYSTERY +JOURNEY +BIDDING +RISKS +BANNER +CHARTER +FIG +PORTS +DREAMS +STANDS +TEACH +RAPID +PULL +HAIRY +REVERSE +DEPOSIT +SEMINAR +WHEELS +SPECIFY +DUTCH +FORMATS +TAB +DEPENDS +BOOTS +HOLDS +ROUTER +EDITING +FOLDER +UPLOAD +PULSE +VOTING +COURTS +NOTICES +METRO +STRIP +PEARL +NICK +PLOT +AIRLINE +REGARD +PUMP +EXISTS +SMOOTH +STRIKE +NARROW +THREAT +SURVEYS +SITTING +PUTTING +PENIS +TRAILER +CASTLE +GARDENS +MISSED +ANTIQUE +LABELS +WILLING +BIO +ACTING +HEADS +STORED +EXAM +LOGOS +DENSITY +HUNDRED +STRANGE +BEDS +BREASTS +MENTION +GREY +HONDA +AMENDED +OPERATE +BILLS +BOLD +STABLE +OPERA +DOCTORS +LESSON +CINEMA +ASSET +SCAN +BLANK +SEVERE +DELUXE +HUMOR +AGED +LIVED +BULK +FABRIC +VISITS +TIGHT +DOMAINS +FLYING +SIN +BERLIN +CUTE +PARA +SIEMENS +MEANT +CAPTURE +POUNDS +BUFFALO +PLANE +SEED +DESIRE +CAMPING +MEETS +WELFARE +PEER +CAUGHT +MARKED +DRIVEN +BOTTLE +MASSAGE +RUBBER +CLOSING +MEAT +LEGEND +GRACE +PYTHON +MONSTER +BANG +VILLA +BONE +COLUMNS +BUGS +COOKIES +INNER +MED +ENTITY +CRUISES +GATE +HOLDER +ROMAN +DUTIES +EROTIC +TONE +ETHICS +FOREVER +DRAGON +BUSY +CAPTAIN +IMAGINE +BRINGS +HEATING +LEG +NECK +WING +SCRIPTS +STEREO +TASTE +DEALING +COMMIT +TINY +RAIL +LIBERAL +JAY +TRIPS +GAP +SIDES +TUBE +TURNS +CACHE +BELT +JACKET +ORACLE +LEASE +HOBBIES +PROUD +EXCESS +CONSOLE +GIANT +SHIPPED +SEATS +BIZ +ALARM +VOLTAGE +USUAL +LOADING +STAMPS +ANGLE +ROB +VINYL +MINING +ONGOING +WORST +IMAGING +BETTING +LIBERTY +ERA +CONVERT +ANALYST +GARAGE +THONGS +MORGAN +DERIVED +HONOR +ASP +EAGLE +PANTS +NURSE +PRAYER +QUIET +LUCK +POSTAGE +DIAL +CHEESE +COMIC +JET +CROWN +PAR +MAKER +CRACK +PICKS +GANG +FETISH +APPLIES +CASINOS +SMOKE +APACHE +FILTERS +CRAFT +CAKE +APART +FELLOW +BLIND +LOUNGE +MAD +SEMI +COINS +GROSS +CAFE +KEN +HORROR +CAPABLE +TILL +PEN +SHOE +ELECTED +VICTORY +SAND +JOY +MAINLY +ETHNIC +RAN +ACTOR +FINDS +SEAL +FIFTH +CITIZEN +PRIZE +OCCURS +ANYTIME +LIES +PIPE +LECTURE +LAYOUT +ILL +LAY +HORSES +DIRTY +DECK +DONATE +TAUGHT +WORKER +ALIVE +TEMPLE +PROVE +WINGS +BREAKS +GENETIC +WATERS +PROMISE +THIN +PREFER +RIDGE +CABINET +MODEM +SICK +DOSE +TIFFANY +COLLECT +BET +STREETS +VECTOR +SHAVED +TURNING +BUFFER +PURPLE +LETS +MUTUAL +SYNTAX +PRISON +SKILL +CHAIRS +MOVES +INQUIRY +CHECKED +EXHIBIT +THROW +TREND +SIERRA +VISIBLE +CATS +DESERT +OLDEST +BUSTY +MERCURY +WORSE +SUMMIT +VICTIMS +SPACES +BURNING +ESCAPE +COUPONS +BOATS +GLANCE +ARCADE +TELLS +OBVIOUS +FIBER +GRAPH +TALKS +FILING +FOSTER +PASSING +AWARDED +TRIALS +TISSUE +MASTERS +BONDS +FOLK +COMMONS +FRAUD +ARRIVAL +OKAY +POTTERY +ROGER +ASPECT +AWESOME +COUNTS +PRICED +HIST +CRASH +LIFT +DESIRED +INTER +CLOSER +ASSUMES +HEIGHTS +SHADOW +RIDING +EXPENSE +GROVE +VENTURE +CLINIC +HEALING +MALL +PACKET +SPRAY +STUDIOS +DAD +BUTTONS +FUNDED +WINNERS +EXTEND +ROADS +PAT +ROLLING +FELL +YARD +NELSON +ARRIVED +CREATES +FACES +TOURIST +COCKS +MAYOR +MURDER +SENATOR +YIELD +GRADES +POUR +DIGEST +REG +LODGING +DUST +HENCE +RADAR +RESCUE +LOSSES +COMBAT +STOPPED +LAKES +BUTT +CLOSELY +DIARY +KINGS +KENT +ADDS +EAR +FLAGS +BAKER +SHOCK +WALLS +ABROAD +EBONY +TIE +WARD +DRAWN +VISITED +ROOF +WALKER +KISS +BEAST +TARGETS +DODGE +COUNSEL +PIZZA +INVITED +YARDS +MOD +FARMERS +QUERIES +RUSH +ABSENCE +NEAREST +CLUSTER +VENDORS +WHEREAS +YOGA +SERVES +WOODS +LAMP +PARTIAL +COUPLES +RANKING +JOKES +SUBLIME +PALACE +GLAD +WINS +VERIFY +GLOBE +TRUSTED +COPPER +RACK +REP +KERRY +RECEIPT +NOBODY +GHOST +BOSS +PRIDE +KNOWING +CLOUDY +CHILE +ANNA +PLENTY +SOLO +THROAT +IGNORE +MARIA +UNIFORM +WEALTH +TALL +VACUUM +DANCING +BRASS +WRITES +PLAZA +QUEST +PUBLISH +SRI +TOE +TRANS +NOVA +PIONEER +BOOTY +ACROBAT +PLATES +ACRES +VENUE +THERMAL +ESSAYS +VITAL +TELLING +FAIRLY +COASTAL +CHARITY +EXCEL +MODES +WAKE +STUPID +HARBOR +SEGMENT +REALIZE +ENEMY +PUZZLE +RISING +WELLS +OPENS +INSIGHT +SHIT +SECRETS +LUCKY +LATTER +THICK +REPEAT +PENALTY +DRUM +GLASSES +ENABLES +BUILDER +VISTA +CHIPS +TERRY +FLOOD +EASE +ORGY +ARENA +PUPILS +TABS +OUTCOME +CASUAL +GROWN +POLISH +LOVELY +EXTRAS +CENTRES +JERRY +CLAUSE +SMILE +LANDS +TROOPS +INDOOR +ARMED +BROKER +CHARGER +PINE +COOLING +TEND +GULF +RICK +TRUCKS +DIVORCE +LAURA +SHOPPER +PARTLY +CANDY +PILLS +TIGER +FOLKS +SENSOR +EXPOSED +HUNT +ANGELS +DEPUTY +SEALED +LOADED +SCENES +BALLS +BOOST +MILL +FOUNDED +CHRONIC +ICONS +MORAL +DEN +FINGER +KEEPS +POUND +LOCATE +TRAINED +BURN +ROSES +LABS +BREAD +TOBACCO +WOODEN +MOTORS +TOUGH +LIE +CHEST +PENSION +BILLY +WORSHIP +HERSELF +DAMAGES +SOLVE +SHORTS +DIVERSE +AMP +JOHNNY +SOLE +FACING +NANCY +TONES +PASSION +SIGHT +LAID +CLAY +DEFENCE +PATCHES +WEAK +REFUND +TOWNS +DIVIDED +WISE +CYPRUS +ODDS +INSIDER +MAKERS +HEARTS +WORRY +EVE +CARTER +LEGACY +MARC +PLEASED +DANGER +VITAMIN +WIDELY +PHRASE +GENUINE +RAISING +HYBRID +READS +ROLES +SONS +LEAF +PAD +GLORY +BIGGER +BILLING +DIESEL +VERSUS +COMBINE +EXCEED +ROD +FAULT +SILK +BABIES +EXAMINE +JIMMY +GRAHAM +BRISTOL +SAD +WOLF +SLOWLY +RUGBY +INFANT +SECTORS +FLUID +GROUNDS +FITS +KICK +REGARDS +MEAL +HURT +UNLIKE +BASKETS +POT +WRIGHT +PROVEN +CACHED +WARREN +SLIP +STUDIED +PROFITS +DEVIL +GRASS +COMPLY +FLORIST +CHERRY +CUTS +FUNERAL +ENJOYED +PEE +CHARLIE +NIPPLES +MARS +SIZED +NOTICED +SOCKET +SILENT +EGG +SIGNALS +CAPS +PILL +THEFT +SWING +SYMBOLS +LAT +META +HUMANS +ANALOG +FACIAL +TALENT +DATED +SEEKER +WISDOM +SHOOT +MINT +OFFSET +PAYDAY +ELITE +SPIN +HOLDERS +POEMS +ROBOT +WITNESS +COLLINS +STAGES +WINDS +POWDER +ASSESS +WASH +STONES +GNOME +ROOTS +LOSING +GADGETS +NOBLE +IMPACTS +REV +GOSPEL +SHORE +LOVES +INDUCED +KNIGHT +LOOSE +AIMS +LINKING +APPEALS +EARNED +ILLNESS +PENDING +PARKER +TEENAGE +SOAP +TRIPLE +COOPER +JAM +SECURED +UNUSUAL +SLOTS +ROUTINE +ROCKS +TITANS +WEARING +AXIS +SOUGHT +GENES +MOUNTED +HABITAT +MEDIAN +GUNS +SCANNER +HEREIN +HORNY +HERO +INTEGER +ENGAGED +FALLING +BASICS +CARPET +LENSES +BINARY +PUNK +DROPPED +DUKE +PACE +BESIDES +WAGE +ARC +HOSTS +MOMENTS +ATLAS +STRINGS +DAWN +FEELS +TORTURE +CARL +DELETED +COAT +RALPH +WARNER +INKJET +WIZARD +CORPS +ACTORS +LIVER +LIABLE +MORRIS +RECALL +ANTENNA +PICKED +ASSUMED +BELIEF +KILLING +BIKINI +DECOR +LOOKUP +TEXTS +BROKERS +ION +DOLL +TIT +SEASONS +REFINE +BIDDER +SINGER +HERALD +FAILS +AGING +PISSING +FED +DIVING +INVITE +SUPPOSE +REED +INVOLVE +TERROR +YOUNGER +THIRTY +MICE +RAPIDLY +BAN +TEMP +INTRO +FISTING +CLERK +VAST +MILLS +OUTLINE +HOLLAND +JEANS +FONTS +ODD +WRAP +REFERS +MOOD +FAVOR +QUIZ +SIGMA +VICTIM +DEMANDS +CAREFUL +BEAM +ARRIVE +SUNSET +TRACKED +MINIMAL +LOTTERY +TOPS +FRAMED +ASIDE +LICENCE +ESSAY +CAMPS +TRACE +SHUT +PACKS +THOU +CONSULT +GREATLY +MASK +CYCLING +INFORM +COAL +CRY +QUANTUM +INTENT +ZOO +LARGELY +SPOKE +ARROW +ROUGH +WEIRD +TEE +LION +HOLES +BLADE +OXYGEN +COOKIE +MEALS +CANYON +METERS +MERELY +PASSES +POINTER +STRETCH +PERMITS +SLEEVE +CLEANER +CRICKET +BEEF +FEEDING +STROKE +CAD +HATS +ROBIN +STRAP +CROWD +SURF +CUSTOMS +RAINBOW +HOOK +DECLINE +GLOVES +CORD +SKIING +CLOUD +VALVE +PROCEED +KNIFE +SHELF +TIMING +LIKED +ADOPT +DENIED +FUCKED +OUTER +CROP +DEATHS +RIVERS +TALES +NODES +THUMBS +SEEDS +CITED +LITE +HUB +TWELVE +FOUNDER +DECADE +DISPUTE +TIRED +ADVERSE +EXCERPT +ENG +STEAM +DRINKS +ACE +VOICES +ACUTE +STOOD +SING +TONS +PERFUME +CAROL +HONEST +RESTORE +STACK +SUE +HANG +CURVE +CREATOR +AMBER +MUSEUMS +CODING +TRACKER +PASSAGE +TRUNK +HIKING +DAMN +HEADSET +WAVES +CAMEL +LAMPS +HOOD +SUICIDE +CHI +JUICE +CHASE +LOGICAL +SAUCE +FAME +EXTRACT +PANAMA +PAYABLE +JUDGES +RETIRED +REMARKS +DECADES +WALKED +ARISING +INS +EGGS +AFRAID +RAILWAY +POINTED +CAUSING +MISTAKE +LOCKED +FUSION +MINERAL +RUBY +BEADS +FORTUNE +CANVAS +PARISH +CLAIMED +SCREENS +PLANNER +FLOWS +STADIUM +FEWER +COUPON +NURSES +STEM +PROXY +OPT +DREW +FLU +COSTUME +TAGGED +VOTED +KILLER +BIKES +GATES +RAP +TUNE +BISHOP +PULLED +CORN +SHAPED +FARMER +PUTS +GREW +TIN +SLAVE +TREK +HEROES +PAINTED +ARTWORK +ETHICAL +FLORAL +TIES +SCHEMES +NEUTRAL +FISHER +RAT +SPEARS +DILDOS +BEDDING +JOINING +HEADING +EQUALLY +BEARING +BRAD +COMBO +SENIORS +WORLDS +GUILTY +HAVEN +TABLET +JURY +DOS +TAIL +CHARM +LAWN +VIOLENT +BASIN +SOUP +RANCH +COTTAGE +DRUNK +CRIMES +BYTE +TONER +NOSE +LATEX +ANYMORE +ALIEN +LOCATOR +BROKE +RESOLVE +COD +THESIS +THRU +JEWS +NYLON +DISCS +ROCKY +TRIM +CEILING +PIXELS +ANYBODY +FLEET +BUNCH +TOTALS +SINGING +AFFORD +OPTIMAL +QUIT +LUNG +TURNER +SUCKING +CENTS +SPOKEN +OMEGA +STAYED +CIVIC +MANUALS +SEES +WATCHED +SAVER +THEREOF +GRILL +REDEEM +ROGERS +GRAIN +REGIME +WISHES +BULL +DEPEND +DIFFER +RANGING +REPAIRS +BREATH +COLE +MART +CANDLE +HANGING +COLORED +TALE +SEEKS +HERBAL +LOVING +ROUTING +DOCS +ELEGANT +GAINS +RENEWAL +OPPOSED +DEEMED +SCORING +PANTIES +SISTERS +CRITICS +SPOTS +HACKER +MARGIN +COIN +SOLELY +FAKE +SALON +TURBO +HEADED +VOTERS +CURE +MADONNA +ARCH +MURPHY +THINKS +SOLDIER +AIMED +BOMB +HARM +MIRRORS +TRICKS +RESET +BRUSH +PANELS +ASSAULT +SPARE +DEER +TONGUE +BOWLING +DANISH +MONKEY +SKIRT +INVEST +HONEY +LOVERS +ATOMIC +ARABIC +GAUGE +FACED +SOLVING +OVEN +CHAINS +SIXTH +ENGAGE +DEVIANT +NOON +QUOTED +FARMS +IMPORTS +CHEAT +BRONZE +SANDY +SUSPECT +MACRO +SENDER +CRUCIAL +TUITION +SPOUSE +EXOTIC +VIEWER +THREATS +PUZZLES +DAMAGED +CAMS +PISS +LAUGH +DESTROY +PITCH +AUTOS +PERRY +PROVED +DOZEN +TEETH +CLOTH +STAMP +LOTUS +SALMON +CARGO +MATE +STARTER +LIKES +BUTTER +PEPPER +WEAPON +LUGGAGE +BURDEN +CHEF +TAPES +ZONES +RACES +ISLE +STYLISH +SLIM +MAPLE +GROCERY +DEPOT +COMP +BLEND +SPEC +FINEST +REALTY +AUTUMN +PROBE +MIDI +TOILET +RANKED +JACKETS +ROUTES +PACKED +EXCITED +RECOVER +TIED +TIMELY +TALKED +DEBUG +DELAYED +CHUCK +DALE +VILLAS +BOOB +EXCLUDE +PEEING +BROOKS +NEWTON +OILS +SEPT +ANXIETY +BINGO +WHILST +SPATIAL +UNTO +CERAMIC +PROMPT +MINDS +PAYS +FINGERS +SUNNY +CEDAR +LANG +STUD +FOLD +QUALIFY +HOPES +MASON +DIAGRAM +BURNS +PUMPS +SLUT +PEOPLES +VICTOR +ATTACH +ADVISED +SPIDER +RANGES +PAIRS +TRAILS +INTERIM +DIVINE +APPROVE +CHOSE +DIALOG +VENUES +BLAST +CALCIUM +POLE +SHIELD +HARVEST +LOCALLY +PICKUP +MOTHERS +CANDLES +BEND +SAILING +MOMS +SACRED +MOROCCO +CHROME +TOMMY +REFUSED +BRAKE +ECOLOGY +CONGO +GLEN +DELAYS +OLIVE +SCORED +CLONE +DICKS +LAMBDA +RELAY +TEARS +OASIS +ANGRY +SILICON +COMPETE +LOVER +BELONG +LIPS +ESCORT +POND +ROLLS +DADDY +FERRY +RABBIT +SEATING +EXPORTS +TIRE +CHAD +LOADS +HEATHER +MOTEL +UNIONS +WARRANT +FROZEN +JOSH +ROYALTY +SCALES +RALLY +STRAIN +DRAG +SOMEHOW +RIPE +RELY +GAINED +DYING +LAUNDRY +STUCK +PLACING +STOPS +ADJUST +FILLING +IMPOSED +SILENCE +FOCUSES +SOVIET +TREATY +VOCAL +TRAINER +ORGAN +VOLUMES +LEMON +TOXIC +NUTS +NAIL +IMPLIED +SPAN +JOKE +PACKING +STATUTE +SATISFY +SHELTER +CHAPEL +LAYERS +GUIDED +MIXTURE +BENCH +RIDER +RADIUS +LOGGING +BORDERS +PADS +BUTTS +INNS +BOBBY +SHEEP +WINES +NURSERY +HARDER +CUPS +SALAD +TENDER +FOAM +PASTE +CLOUDS +POEM +STAYING +EASTER +PRAISE +VETERAN +STREAMS +LANDING +SIGNING +ASKS +RELAX +HARDLY +PRAIRIE +REUNION +BEAN +SWORD +ABSENT +SELLS +HOPING +SPIRITS +CORAL +PIXEL +FLOAT +COLIN +BIAS +PATHS +BUBBLE +ACQUIRE +TRIBUNE +VESSEL +ACIDS +VIRUSES +CHEAPER +DAIRY +ADMIT +FANCY +LEASING +BELIEFS +SQUAD +ANALYZE +SCROLL +RELATE +SWIM +WAGES +SUFFER +FORESTS +INVALID +MARTIAL +MALES +RETAIN +COLOURS +EXECUTE +TUNNEL +GENRES +PATENTS +CHAOS +WHEAT +BEAVER +EAGLES +BASES +ACCUSED +UNITY +LOUD +BRIDE +RATS +DEFINES +BEGUN +PACKETS +ANCHOR +SOCKS +PARADE +STAT +TRIGGER +BEACHES +FOLDERS +ROUTERS +PENDANT +DRESSES +BAPTIST +HIRING +CLOCKS +BIOS +FEMALES +FEVER +CUISINE +SURELY +THEOREM +THEE +RUTH +PRAY +STYLUS +POPE +DRUMS +TOPLESS +JEEP +CHICKS +BARE +HUNG +CATTLE +RADICAL +ROVER +RELOAD +FLAME +TANKS +ELDERLY +MONO +TILE +BOLIVIA +SPELL +HOTTEST +ALLEGED +COMPILE +WEBSTER +STRUCK +BRIDAL +ANNEX +TRIBAL +CURIOUS +FREIGHT +REBATE +ECLIPSE +SHUTTLE +CYCLES +AFFECTS +DETECT +SLUTS +CIAO +KNEE +PREP +FASTEST +BUTLER +INJURED +PAYROLL +COURIER +HINTS +PROS +TRIBUTE +WIRED +IMMUNE +CANT +RARELY +GENESIS +BARRIER +ARGUE +TRAINS +METALS +BICYCLE +LETTING +ARISE +THEREBY +ADVISE +BOTTLES +BOXING +BANGKOK +BITCH +CHESS +SURVIVE +MENUS +DUCK +REVEAL +CANAL +AMINO +HERBS +CLINICS +LYING +STRICT +DIVE +DRILL +OFFENSE +PROTEST +HOBBY +TRIES +WASHING +TRICK +ENQUIRY +CLOSURE +RAID +TIMBER +VOLT +INTENSE +SHOWERS +RULING +STEADY +DIRT +DROPS +WIDER +SENSORS +SCREW +HOURLY +BLAME +GENEVA +HANDED +INTAKE +HEAVILY +FIFTY +HEADERS +GEEK +UNCLE +SINK +ASSURE +DEVOTED +SODIUM +RANDY +HORMONE +TIMOTHY +BRICK +GRIP +NAVAL +BRIDGES +WATT +DECENT +CASTING +SHORTLY +PINS +DONNA +WARRIOR +DIPLOMA +CABIN +POLO +COPYING +HORN +FIRED +TRIVIA +FROG +GRAMMAR +TIRES +LOGS +HAZARD +RETRO +ANGER +SUITS +CHANCES +SNAP +BIZARRE +FRUITS +RIBBON +STARTUP +KISSING +HANDY +SWAP +EXEMPT +CROPS +REDUCES +FLIP +GUILD +CAPITOL +DISHES +NERVOUS +REFUSE +EXTENDS +REPLICA +TRIBE +TRADES +SUPERB +BUZZ +NUKE +TRINITY +HANDLED +LEGENDS +BOOM +CALM +FLOORS +EXHAUST +SPEAKS +BURTON +COPIED +SCOTIA +FARMING +GIBSON +FORK +TROY +ROLLER +BATCH +ALTER +LATINO +EDGES +MIXING +HANDLES +SKILLED +FITTED +HARMONY +ASTHMA +TWINS +AMEND +REWARD +SPRINT +CHICK +SIMS +TRAY +INPUTS +GENOME +ESCORTS +THONG +MEDAL +COACHES +VESSELS +HARBOUR +WALKS +SUCKS +SAGE +KNIVES +ARRANGE +HONORS +BOOTH +INDIE +UNIFIED +BONES +BREED +IGNORED +POLAR +FALLEN +PRECISE +INVOICE +GATHER +BACKED +MOTELS +FORMING +EMBASSY +CAVE +SLIGHT +AMONGST +WOOL +ARREST +HORIZON +DEEPLY +TOOLBOX +MARINA +PRIZES +PATIO +SURFING +OPTICS +PURSUE +EYED +GRAB +ATTRACT +BEANS +DISABLE +SNAKE +SUCCEED +LENDING +OOPS +NIPPLE +PLAINS +KARAOKE +TRAP +LONELY +FOOL +HEREBY +OBSERVE +BERRY +COLLAR +RACIAL +MOBILES +DIES +TERRACE +REPLIED +SEAFOOD +NOVELS +PLAYBOY +OUGHT +JAIL +SAFELY +FINITE +KIDNEY +FIXES +SENDS +DURABLE +ALLIED +THROWS +ROSTER +SPENCER +TIMER +TABLETS +TUNING +GOTTEN +FUTURES +VERSE +HIGHS +WANTING +CUSTODY +SCRATCH +ROCKET +BULLET +TOWERS +RACKS +LACE +NASTY +TUMOR +UGLY +WATTS +HART +FORTY +TUBES +PRIEST +QUEUE +TRANCE +LOCALE +BUNDLE +HAMMER +RUNNER +ROWS +NOTION +SKINS +MAILED +ARCTIC +EXAMS +REWARDS +BENEATH +DEFEND +SEVENTH +GODS +WELSH +BELLY +STOLEN +SOONEST +POLY +EARS +FIST +LENDERS +FITTING +MERE +AGREES +CONS +SURPLUS +ELDER +SONIC +CHEERS +TAXI +ZONING +GRAVITY +THUMB +GUITARS +ESSENCE +MIGHTY +GALAXY +CARING +WORN +SHAW +EXPO +TWIST +STOMACH +BURIED +RANKS +DEBUT +DENY +ANATOMY +TRIO +CUBE +DEFECTS +MARKER +CLARITY +RUGS +SETTLED +FOLDING +AIRFARE +VACCINE +CRAP +FATE +PENNY +ROBUST +PORTER +JUNGLE +IVORY +ALPINE +REMIX +ALIAS +NEWER +SPICE +OVAL +IMPLIES +SOMA +COOLER +DONOR +TENSION +TRASH +SHAPES +TIER +EARL +MANOR +BREEDS +RAPIDS +DISCO +BAILEY +ETERNAL +CITE +METRIC +MINUS +VARIED +CLOSEST +ACTRESS +MESS +ASSIGN +TIGERS +AURORA +SLIDES +LENDER +SHADE +CHORUS +RHYTHM +DIGIT +ARGUED +DIETARY +SUDDEN +LIONS +POOLS +LYRIC +SPEEDS +MATCHED +ROPE +DUMP +WARMING +VOCALS +CHUBBY +GRAVE +BURNER +GENTLE +DEEPER +HOSE +FOOTAGE +WORTHY +REVEALS +SAINTS +CARRIES +DEVON +SAVES +LOBBY +PUNCH +COWBOY +KARMA +CONSIST +QUEENS +PUBS +TRIBES +DEFEAT +CLICKS +NAUGHTY +HAZARDS +INSURED +HARPER +TENANT +TATTOO +SHAKE +ALGEBRA +SHADOWS +HOLLY +SILLY +MERCY +FREELY +SUNRISE +MILD +BELONGS +READILY +FENCE +NUDIST +ENSURES +CLAN +LEGALLY +SHAME +SYNC +MESA +FATAL +REMEDY +BRIEFLY +GENIUS +FIGHTER +FLESH +RETREAT +ADAPTED +BARELY +ESTATES +BOROUGH +FAILING +MARBLE +JESSE +HULL +SURREY +MODULAR +GIANTS +SHED +BALLOON +MEMO +SOLVED +TIDE +FUNK +MAGNET +CAYMAN +JAGUAR +REEL +SHEER +POSING +BIND +RAND +URGENT +INFANTS +GOTHIC +WITCH +BUCK +PUPPY +ACRE +GRAPHS +REVENGE +EXPIRES +ENEMIES +LOWS +AQUA +ACCEPTS +PATROL +SMELL +PEST +ROUGHLY +STICKER +REEF +DIVIDE +SATIN +DESERVE +PROMO +WORRIED +TUNES +GARBAGE +BETH +PHRASES +BORING +JILL +REACHES +SCHEMA +SOFA +QUIZZES +PREFIX +BARREL +TYPING +NERVE +PLANETS +DEFICIT +BOULDER +RENEW +COUPLED +FLOPPY +TEXTURE +THUNDER +TENT +CAUTION +LOCKS +NAMELY +HACK +DARE +EUROS +PIRATES +AERIAL +HAWK +REBEL +ORIGINS +HIRED +MAKEUP +TEXTILE +LAMB +INDEXES +LICKING +MARKERS +WEIGHTS +LASTING +WICKED +KILLS +PUSHED +JUNK +SLOPE +REGGAE +POET +SURNAME +NAILS +EVIDENT +WHATS +RIDES +REHAB +EPIC +ALLERGY +SAKE +TWISTED +MERIT +ENZYME +PLANES +TACKLE +DISKS +CONDO +SANS +FAIRY +BUILDS +SHAFT +LEAN +KITTY +DUDE +DRAIN +MONTE +FIRES +BLESSED +FAVORS +POTATO +PANIC +STICKS +LEONE +EXCUSE +REFORMS +ONION +STRAND +LAWSUIT +ALTO +CHEQUE +BANNERS +REJECT +CIRCLES +ITALIC +BEATS +MERRY +SCUBA +GORE +CULT +DASH +PASSIVE +VALUED +CAGE +COURAGE +GAZETTE +BATMAN +JAKE +PING +DRIED +SETTLE +KNIGHTS +PALMER +FLUX +DERBY +ALTERED +SCENIC +SEWING +CELEBS +PROPOSE +LIGHTER +RAGE +TACTICS +TRUSTS +PILLOW +SHORTER +RELYING +FINALS +STEAL +PARCEL +REFINED +FIFTEEN +FEARS +PREDICT +ACRYLIC +ROLLED +TUNER +RAYS +TODDLER +FLAVOR +ALIKE +HUNGRY +ACNE +BLOCKED +LIBS +UNDO +HALO +STRIKES +LESSER +GAYS +DRESSED +SCOUT +EXEC +DEALT +CHARMS +TRADER +BUCKS +DENIAL +THROWN +PREPAID +RAISES +ELECTRO +BADGE +WRIST +HEATH +BALLOT +VARYING +TRUSTEE +SQUIRT +REALM +JENNY +HELMET +TSUNAMI +SCHOLAR +NICKEL +BUSES +GEOLOGY +COATING +WALLET +CLEARED +BOATING +CORNERS +BROADER +ROUGE +YEAST +COATED +INTEND +DOOM +HITTING +BEINGS +BITE +AQUATIC +HABITS +MYTH +GILBERT +BROOK +OUTPUTS +INSULIN +ASSURED +WEED +ACCENT +ELEVEN +WIVES +AMBIENT +UTILIZE +MILEAGE +ADAPTOR +AUBURN +UNLOCK +PLEDGE +VAMPIRE +RELATES +XEROX +DICE +MERGER +QUAD +DOCK +MODS +FRAMING +SORTS +HINT +ARMOR +RIDERS +REMARK +DOZENS +VARIES +PICKING +GUARDS +BUYS +NUDITY +POCKETS +GRANNY +PORK +VIRAL +INQUIRE +PIPES +LADEN +MERGE +CHASSIS +BARN +PUSHING +FLEECE +FARE +PIERCE +SPERM +BALD +CRAPS +FUJI +FROST +MOLD +DAME +SALLY +YACHT +PREFERS +HERB +BREACH +WHALE +IDLE +MUSTANG +WIRING +PASTOR +SHARK +PHASES +EMERALD +GROWS +CLIFF +TRACT +BALLET +BUMPER +GARLIC +HOSTELS +SHINE +BANNED +BRIEFS +COVE +OZONE +CASA +RADIOS +TARIFF +PASTA +MUSCLES +SERUM +WRAPPED +SWIFT +FOCAL +VAGINA +DISTANT +DECIMAL +SAMBA +HOSTEL +EMPLOY +PENGUIN +MAGICAL +MIRACLE +REPRINT +FLEX +YEARLY +WOUND +BELLE +HASH +HAMBURG +LAZY +FATHERS +CARB +MARVEL +LINED +PETITE +TERRAIN +PENS +STRIPS +GOSSIP +RANGERS +ROTARY +WORM +BOXED +CUBIC +DEAF +KINASE +SKIRTS +MATS +LABELED +MARKING +SHERIFF +GRIFFIN +SPIES +BLAH +MIME +ELECT +DEADLY +CUNT +BUNNY +CHEVY +ROUNDS +LONGEST +KEEN +FLYER +PEAS +DOSAGE +BAKING +NEEDLE +BATHS +BRAKES +NIRVANA +OWNS +STICKY +DESTINY +MADNESS +CLIMB +BLOWING +HEATED +CARDIAC +BRUTAL +TOKEN +ZINC +SEEKERS +GURU +YIELDS +LEVY +SUITED +NUMERIC +SKATING +EMPEROR +GRAD +BRAS +BELTS +BLACKS +REBATES +BURKE +PROUDLY +PULLING +OBESITY +CURVES +TOURING +VERTEX +TOMATO +EXPIRED +TRAVELS +FLUSH +WAIVER +PALE +DELIGHT +COUNTED +DECLARE +JOHNS +VALVES +GAPS +DONORS +TEAR +JEWEL +TEDDY +TEACHES +TRAGEDY +NEST +DRYER +PAINFUL +VELVET +RULED +PRAYERS +FUNKY +NOWHERE +GALE +JOINS +LATELY +SCARY +BANANA +CAKES +IDOL +BLOODY +MIXER +REMIND +TOOTH +STAYS +AFFAIR +DROVE +WASHER +UPSET +BESIDE +MINES +REBOUND +LOGAN +MENTOR +FOUGHT +METRES +PENCIL +FREEZE +TITLED +SPHERE +MOSS +RATIOS +CONCORD +WALNUT +LANCE +LADDER +CORK +WORKOUT +COLON +LANES +PURSE +STATING +DOME +ALIGN +BLESS +CREST +TRIUMPH +WELDING +ORGASM +HEEL +ALLOY +CONDOS +PLOTS +YANG +GENTLY +LOCKING +DRAWS +FRIDGE +BLANKET +BLOOM +JUSTIFY +BLADES +LOOPS +SURGE +TRAUMA +ADVERT +POSSESS +VANILLA +PICNIC +SOULS +SPANK +DUMB +HOLLOW +VAULT +GROOVE +PURSUIT +WIRES +MAILS +BACKING +SLEEPS +ENDLESS +FIGURED +ORBIT +BACON +HEATER +COLONY +CANNON +CIRCUS +SPINE +TROUT +FEAT +COOKED +FATTY +PRESSED +SCANNED +HUNGER +SURGEON +CEMENT +MISSILE +CLOSES +ASSISTS +GLOW +AUDITOR +VIOLIN +PROPHET +BRACKET +OXIDE +OAKS +MODEMS +HARMFUL +GLUCOSE +PHANTOM +NORM +TURTLE +WARNED +NEURAL +WARE +FOSSIL +BADLY +APOLLO +ROBOTS +JADE +SCOOP +FOUL +KENO +EARNING +MAILMAN +NESTED +MOVERS +VERBAL +BLINK +SEAS +NOVELTY +TILES +POSE +FUZZY +GRAMS +BUDGETS +GOAT +RENDER +CARMEN +EROTICA +SAIL +FORGE +DENSE +BRAVE +AWFUL +IMPOSE +VIEWERS +ENTERS +SAVAGE +WILLOW +RESUMES +BOLT +GAGE +EXISTED +WHORE +WAGON +FAVOUR +KNOCK +URGE +PEERS +OPTIMUM +NEON +QUILT +OURS +MOUNTS +LONE +REFRESH +SUBTLE +STRIPES +COPE +CRADLE +MAMBO +LIME +KIRK +FLOUR +CHOIR +BLOND +EXPECTS +JUMPING +FABRICS +POLYMER +HYGIENE +POULTRY +VIRTUE +BURST +BOUQUET +MANDATE +SPAS +CORPUS +FIBRE +SHADES +JETS +INDICES +DAISY +CURSOR +DONATED +STUFFED +INSECTS +CRUDE +MAIDEN +VIKING +MYRTLE +BORED +CLEANUP +YARN +KNIT +BOTHER +MATING +COMPUTE +REDHEAD +ARRIVES +TRACTOR +UNWRAP +FARES +RESIST +HOPED +PIKE +SAFER +TOUCHED +COLOGNE +WISHING +RANGER +MARSH +SCARED +THETA +BENT +ASYLUM +STAKE +OUTLETS +ARBOR +POISON +COSTLY +STITCH +RIFLE +NOTABLE +WARFARE +MAMA +INLAND +RACISM +ACCORD +MODEST +GAMERS +SORTING +LIAISON +UNUSED +BULBS +SANDALS +INSURE +CLARIFY +WAIST +FATIGUE +PATRIOT +SEWER +TREATS +EXCEEDS +GALLON +COIL +BATTLES +TRADERS +BITTER +BURNED +DRAGONS +ROMEO +TURKS +DEMOS +SIDED +DEPART +GRADING +TENANTS +LILY +MINDED +RESIN +ALLIES +CROSSED +LINEN +SEALS +NOMINAL +DECAY +QUARTZ +EIGHTH +USHER +BUFFET +SKATE +JOEY +HACKERS +TILT +GRANITE +LYNCH +MASSES +ATHLETE +FRANC +BEAD +ENFORCE +LEAK +ADVISER +FLATS +BOOKLET +HEELS +VOTER +URINE +TOWEL +GINGER +SUBURBS +IMAGERY +SEARS +FLIES +CRYING +CRANE +ROTTEN +GARNET +HABIT +BULB +HONOUR +USELESS +IRIS +COUPE +BACH +MANAGES +EROSION +KHAN +PETERS +CLEVER +PRIMER +LORDS +TENDS +HANDBAG +BYPASS +SIXTY +EXPLOIT +ORGIES +HOGTIED +SPARK +PATHWAY +SHALLOW +STIR +SPIKE +PLATED +DRAWER +SPECTRA +LIFTING +CURTAIN +DAVIES +PILOTS +MAILBOX +PILE +HUMOUR +CALLER +TONGA +IMPRINT +GOODBYE +VIABLE +EMERGED +DEFECT +POORLY +GODDESS +BACKS +MAGNETS +ARGUES +WADE +SOILS +CHAPMAN +ORGANS +LOYALTY +BELOVED +BEATING +HUNKS +OFFENCE +EXPANDS +LITHIUM +SEDAN +PONY +LEAP +SWAN +FACIALS +AIRWAYS +REFILL +SAILOR +LINING +BANQUET +CARES +FLORA +STATUE +EQUALS +HARDY +JUMPER +CARAVAN +HARNESS +MAJORS +BELLS +FREEMAN +DENIM +SCAT +PUPPIES +TROPHY +EMOTION +NETS +SIGHTS +LIQUOR +WOUNDED +BASH +DOSES +EDUCATE +BAKED +GLOVE +SPINAL +SOONER +ENACTED +TENURE +PLUSH +WEBER +BIOTECH +NELLY +FULFILL +URGED +BRENT +GAINING +SHIFTS +ADAPT +THEREIN +FUELS +GREENS +NEAT +NAMING +STERN +SHAWN +SLAVES +DENTIST +CRAFTED +TUTOR +IDIOT +MICKEY +DEBIT +ALIENS +DOMINO +EDITS +RAVEN +STRAINS +SLICE +TANNING +GAMBIA +ASPEN +LACKING +ANGLES +LEMMA +SENSING +BUMP +COWBOYS +FLAMES +HALLS +PAUSE +RELAXED +DEMON +HANDLER +AUNT +CROW +DECIDES +CAPTION +TOLEDO +ASSES +COMPASS +CLOSET +COUCH +EVOLVED +DOWNS +ROGUE +UNFAIR +REBUILD +VACANT +FIXING +GRAM +HIDING +SITS +SHELVES +TOES +CLEANED +HONORED +OPTIC +INSECT +DIARIES +CHILI +GRIEF +SWEAT +DOLPHIN +WONDERS +MASKS +CELEB +BUST +LATERAL +QUAKE +ALLEY +SANDERS +REFUNDS +COLA +TWAIN +BREEZE +DEBATES +GEMS +BUFFY +OUTS +SNACKS +BOOSTER +TAXABLE +SADDLE +MALARIA +LOYAL +TORRENT +RENAL +FEDORA +ODYSSEY +SPITE +CAPITA +IMPLY +FREEZER +WHOLLY +CHILL +EMBRACE +LINER +MANILA +PURELY +LIFTS +VIVID +ENROLL +DAEMON +FOIL +BUDDIES +ALARMS +HUNTERS +CRASHES +STAIRS +ACTED +HOTLINE +AMPS +SKULL +SERVANT +FALCON +JOINTLY +AVOIDED +TICK +TERRIER +RENEWED +VARIANT +RILEY +CRITIC +SQUARES +NINJA +VANS +VOUCHER +GLUE +CONE +MARGINS +SANDS +BUCKET +STEAK +COMMITS +COBRA +SUBSET +THREW +ZOMBIE +RECRUIT +GALS +BIDDERS +WHEREIN +DESSERT +NINTH +MUTANT +MARRY +BOUNCE +SPIRAL +WILLS +ATOMS +TISSUES +DRAKE +OLDS +RAMP +NICELY +LAUREL +RAILS +FRIED +TRADED +MALLS +SHRIMP +CHORDS +SCOOTER +DESIRES +WOODY +CRIED +PSYCHIC +CRACKS +LOTION +BEATEN +VISIONS +TOPICAL +COCAINE +TUCKER +PLUGS +CODED +SUPRA +OMITTED +MOLLY +PEAR +CHIEFS +PARKWAY +CLUE +SCANDAL +DUFF +LODGES +DANGERS +BONUSES +SCAM +SCREAM +BIKING +PIRATE +TIMEOUT +SENSES +REPEATS +RIVAL +SLOWER +BECK +BEIGE +RESTART +ROUNDED +VANITY +TOME +PROF +HOMER +GASES +DIOXIDE +GENUS +CUTTER +ROOFING +ELASTIC +MELODY +SINS +COUSIN +HATH +TORQUE +RECALLS +DEBTS +RENTING +BURIAL +BALCONY +PROP +MYTHS +KNEES +NEGLECT +EMERGE +CLUTCH +POETS +WOVEN +PEDRO +MAID +TOWELS +BARBER +RIGID +HAHA +SALSA +BLOWN +BATON +RODS +ABBEY +PIGS +JERSEYS +REFUGEE +STRAPS +MAYA +STAINED +MARITAL +SLAVERY +EVITE +ROMANS +SHORES +FLOWING +DIETS +DEED +SAUNA +SUSTAIN +BOWLS +COSMIC +LENGTHS +BEACON +QUARTET +CRUEL +CONFORM +HELMETS +FIRING +EAGER +VACANCY +PAPA +CHANG +GLORIA +PUPIL +FEAST +CANTON +WARN +BONNIE +LAYING +COPS +STRIVE +SHELLS +PAINTER +COOKER +ANKLE +PESO +LEAGUES +MONKEYS +DIGITS +BANKER +EASIEST +BORROW +BAMBOO +DENOTES +VECTORS +DECKS +STEPPED +VENT +BLUNT +REACT +RISES +ISSUING +HEATERS +ACCENTS +INSANE +VOYAGE +COLONEL +SKETCH +NIGHTLY +DANCER +COATS +FIRMLY +DOTS +MUGS +WASHED +MOSAIC +FIESTA +VASE +FILINGS +FORCING +FAIRS +FLUTE +SIZING +MEADOWS +HARSH +OUTFIT +CEASE +ABOARD +JOINTS +POLES +BOUNDS +VERA +DEVILS +DIGNITY +SLIDING +HOMO +PIER +NAZI +COTE +ARRAYS +FELLOWS +IDEALLY +SPLASH +EQUIP +SAGA +GRAN +HEDGE +FENDER +VIOLET +DANCERS +HANDSET +MAXWELL +CURRY +OBLIQUE +PEARLS +WORMS +APPLES +POUCH +ADVENT +HOOKS +SINGERS +MAYO +MANSION +ARSENAL +SCREWS +PYRAMID +ENJOYS +HACKING +STRIPE +PEAKS +LISP +KEYNOTE +PLANTED +SPOON +BOMBS +NICHE +CIGAR +CHIN +LOCKER +SQUASH +SPOTTED +CURSE +COCONUT +WONT +REMOVES +TITAN +TUMORS +BOOKED +LUMBER +PILLOWS +PORTALS +ASLEEP +SHOUT +NUDES +HUBS +WHOEVER +SUBWAY +STRAW +LIFTED +MANKIND +CITRUS +UPRIGHT +REUSE +SHOCKED +BAKERY +ORCHID +LOSES +WIDGET +SUEDE +SODA +WAITED +PEACH +BREATHE +DIAPER +SMILING +OUNCES +UNCUT +INTACT +NOTING +SAMURAI +DUPLEX +LIGHTLY +RUNNERS +STOVE +TALENTS +REFUGE +CARVED +FREAK +BLUFF +JASPER +NEWBORN +SADLY +LAUGHED +AVAIL +ORCHARD +DEPLOY +HATCH +TOMB +REGINA +STEIN +SPILL +DRIFT +AUTISM +FULLER +BOMBING +METRICS +CRISP +PROM +SCANS +KEEPER +SPELLS +VAGINAL +ROOKIE +ENVIRON +BIRTHS +CUBS +WHEELER +RITUAL +PULP +ONSET +ENZYMES +ASSAY +POTS +PARSER +SLAM +TENTS +PLAQUE +LOWE +BEAVERS +CRIB +STYLING +SNACK +PULLS +QUIETLY +SCENERY +COCA +DRYING +NOUN +LEARNER +SWALLOW +SQUID +MARINES +PROVES +TRILOGY +CRAB +MAXIM +HIKE +BORE +COWS +SLATE +PEEL +DEBRIS +PAGAN +CHOPPED +WIDOW +SLEEVES +VIBRANT +SWEATER +SKIES +BURNERS +KICKS +CANOE +REMINDS +CORRUPT +DROUGHT +BAKE +SYMPTOM +AUDITS +SCALING +JUICY +FAVE +MOODY +GRAINS +THYROID +HEAL +WIZARDS +PEDAL +STORING +TOTE +JUMPED +TUNED +ALFA +STAPLES +SOUR +RENAME +MARKUP +SCRAP +BLONDES +SOCK +COPIER +TERRA +LITERAL +GUIDING +VAPOR +BEWARE +ALOUD +OVERLAP +BAIL +GOOSE +CRUISER +GIFTED +ESTEEM +CASCADE +ENDORSE +STROKES +LANDED +NUCLEUS +TEES +SCOUTS +WARSAW +MIST +VERB +CHIC +HYDRO +PLAYA +NOISY +ABIDE +VEST +REGRET +STAKES +BRIGADE +MOVABLE +DOUBLES +BLISS +TENS +LITTER +PARSE +RUGGED +JELLY +PUMA +APPOINT +HUMBLE +PETROL +MIDWAY +MANIA +FLYERS +HOSTILE +WHITES +RANT +TRAPPED +BOLTS +LOCALS +FRINGE +TYPED +GILL +TATTOOS +RUDE +SANG +CITING +PEPTIDE +HASSLE +REGENTS +DOCKET +NORDIC +CURL +THIRDS +DELI +INTERN +DARLING +OPPOSE +CHEER +CLUTTER +VINE +VALE +WHEREBY +SPARKS +SIMPLER +CLAMP +MAMMALS +GRAPE +CLONING +MADDEN +PEPPERS +DEEDS +LIVELY +TRIPOD +ALRIGHT +LAGUNA +LIMO +ALIGNED +RUST +TRAPS +SHUFFLE +RACER +GUILT +SWEEP +AVID +BLADDER +BETS +DUCKS +SHOOTER +PAINTS +CARR +FADE +TASTES +STORMS +SMILED +LUNAR +SHIELDS +INSERTS +POSED +TASTING +EXPOSE +ARISES +BRANDED +MANNING +FORKS +MONK +BOXER +SHINING +WEIGH +RODEO +VOYAGER +SAMPLER +MOOSE +CHECKER +CRUSH +MYSTIC +POOH +SHAPING +AFGHAN +INSPIRE +TORN +PUMPING +REVIVAL +LEVER +REGENCY +TASTY +MIDLAND +HECK +RANTS +TAROT +BARK +CARTS +WASTED +COCOA +INVITES +CUSHION +LYNX +FOOTER +PANTHER +MIXES +GRAVES +GHETTO +MEADOW +PANTY +FEEDER +MERCER +ROMS +GOODMAN +SUBUNIT +KANE +BULLS +HURRY +ODOR +REACTOR +WASTES +CLASH +BIKER +PARKED +FLEW +PEANUT +HOLDEN +TRUMPET +KAISER +NEURONS +RETIRE +RUMORS +APEX +CRIMSON +NEEDING +STAIN +WISHED +KICKED +CURB +GADGET +REIGN +TRIVIAL +DECO +TICKER +COKE +CLAUSES +BARON +REMOVER +BATES +BRASIL +WEBS +THRUST +PROVING +PROD +NOVICE +CANE +FURY +STIFF +ENCODED +WORE +TRACES +RABBI +SUSHI +PUFFY +ELBOW +FIGHTS +STARK +PADDED +CIRCA +REVISE +URANIUM +HONOURS +ANTIGEN +REFUSAL +LIMA +WEAVER +SECULAR +MACROS +MAJESTY +FISHERY +DUES +PEWTER +PUMPKIN +NOTABLY +INTENDS +GARMENT +RAZOR +COUGH +GRANDMA +GIGS +OCEANS +ARROWS +EUREKA +PLEA +BUNDLES +ISLES +OVENS +PRIESTS +PREY +ZODIAC +TUBING +FENCING +ARTERY +INLET +VIOLATE +REALISE +FLUIDS +LICK +STEALTH +NESS +CANOPY +GLOSS +PANDA +WHIP +PORCH +CONCISE +FIBERS +HANDFUL +BRAINS +EATEN +INDIGO +MOTIONS +SHAMPOO +EXCITE +REBELS +PSEUDO +QUOTING +SINKS +STEEP +DINAR +DYNASTY +CREED +CARAT +RAIDERS +SPREADS +SENSORY +DUMMIES +THRONE +SLOPES +SEIZED +ROUNDUP +LEASES +FAXES +PLUMP +MEMOIRS +EXPIRE +MIDST +METHYL +BORNE +FORGIVE +USABLE +TEMPO +ALMANAC +DENOTE +SLAYER +PROG +TESTER +POLLING +BINS +RELIES +SELECTS +TORCH +HAUNTED +SPARES +BOUT +ADVERTS +SALONS +HANK +UNCLEAR +HELPER +RANCHO +HACKS +ATTIC +PIPER +WEALTHY +SKINNY +SEWAGE +WRETCH +STEMS +RACIST +CONVEY +GOVERN +FEATHER +FOND +SORE +FIAT +REBOOT +SIXTEEN +BLINDS +TRAITS +TIGHTLY +GRADED +NOEL +CANS +ABUSED +BILLED +TOONS +BRUSHES +TENTH +SMILES +MERGED +DESKS +CAPSULE +AIDED +RELIED +SUSPEND +AIDE +KINDLY +CUTIE +SHARKS +NOTCH +MINORS +DANCES +MAPPED +LIEU +DECREE +LACKS +DAYTIME +CONTOUR +GAMBLE +DESCENT +GRAVEL +ANALYSE +JUDGED +SHUTTER +RESIDUE +REDS +ASSERT +GOODIES +INSPECT +THRICE +MUSINGS +POSES +NOIR +LAYOUTS +SCENT +SEQUEL +TITANIC +KNOB +WOLVES +HERPES +UPWARD +JUDGING +KICKING +FINES +GRASP +STREAK +OUNCE +TRAGIC +TOAST +HAPPILY +HOOKED +SHRINK +STANCE +BEADED +EXODUS +KINKY +DOVE +DERIVE +PRETEND +AMNESTY +NEEDLES +QUOTA +MACK +SUNG +OPENER +CHOOSES +JIGSAW +JUMBO +CROWDED +TURBINE +UNREAL +WOUNDS +MATHS +PROBES +FLINT +DUMMY +AWAKE +SWIVEL +ALLY +VARSITY +INSURER +BURNT +ALMA +INVERSE +HOLT +VERDICT +NOMINEE +MEDALS +PROTON +LISTER +STUDS +INCUBUS +IMPULSE +DULL +CABINS +LINENS +BEETLE +ROAST +TESTERS +HUMMER +HATRED +PETTY +BEHAVE +GETAWAY +BEES +ROBBINS +SHINY +ENCORE +SMASH +UNSURE +SOCKETS +AMPLE +ABUSIVE +MERITS +SCARF +GARLAND +RIVIERA +OBSCURE +GLAMOUR +HATED +SIGH +TROLLEY +SPICY +BLOCKER +FRANKLY +FOOLS +BEARD +LINKAGE +WEDGE +MOCK +BATS +RUINS +SHEILA +RIPPER +CHATEAU +BURGER +CHANGER +MELT +HYPER +CYPRESS +CITES +GAMER +TAILOR +FAUX +SAVVY +PASCAL +UPLOADS +PANT +GALLONS +NORMS +HYPE +FAULTS +SILVA +GREASE +URINARY +CAIRNS +PREMISE +PRIMA +CONDOMS +RITE +ALBA +FETAL +PALMS +SEATED +LATTICE +DONG +CHORD +TURF +ASPHALT +REPLAY +FLAVORS +DILEMMA +SHIFTED +SMOKED +HAWKS +PLACEBO +IRONS +COMET +BERG +MUSE +PROBING +TYNE +LOTTO +FOWLER +SYRUP +WARMTH +LUST +VERSES +SOLVENT +TOGGLE +LUNA +SPACING +BARKER +SOLIDS +MERGERS +CERTIFY +DEMONS +COPING +CURVED +ERASE +LIEN +BITES +PROSE +ARGUING +VEIN +HALE +SWEAR +CLOWN +SUMMERS +TABOO +WETLAND +CONSUME +AMAZED +VOLCANO +SOMEDAY +SOUNDED +HONESTY +DWARF +SHOCKS +KILLERS +LASERS +CANDID +CAESAR +SAVERS +PINES +STELLAR +FUCKS +PUSSIES +URGES +TIFF +DECKER +BAIT +EXTERN +BADGES +KITTEN +CODEC +BRIDES +DENT +BULLETS +GLOSSY +HAIRED +LETHAL +CAVITY +MOLDED +PROBATE +DECALS +BEAMS +PROPS +INCENSE +DOUGH +STOOL +MACS +TOWING +WELCH +SEISMIC +HORDE +MOMMY +NANNY +SUBURB +SMOKERS +COHORT +SUMS +LINEUP +GLACIER +PUEBLO +GIGABIT +RELIEVE +ROACH +CLARION +LAME +SQUEEZE +ASHES +NYLONS +NATAL +LOCUS +MISSES +FACTUAL +PURITY +SHAKING +CELLAR +PRONE +FUSE +LOBSTER +POPS +AMID +ONIONS +PRETEEN +BONDING +CROSSES +ISSUER +FURNACE +DOUBLED +CLUES +RABBITS +CREWS +ANXIOUS +TARIFFS +BAPTISM +CUTLERY +KNOT +ACTA +SWORDS +TIMED +EVOLVE +YUAN +DIFFERS +LEASED +TATE +BREWING +COOP +BLOSSOM +SCARE +LOWERED +KRIS +THIEF +PRISONS +GRABBED +ROCKING +REGS +SWEETS +EMPLOYS +BUBBLES +PITCHER +STANDBY +MOTIF +PLUM +SALOON +LOFT +UNISEX +WALLETS +HURTS +ETHANOL +FOLDED +LUMP +HALT +UNPAID +GHOSTS +DOUBTS +WORRIES +REJECTS +SPEAR +REFEREE +SWINGER +BROADLY +AERO +PARSONS +BURY +BOUNDED +INSIST +BIRCH +SLASH +RESALE +MIKES +SCALAR +SESAME +DUCT +TOUCHES +PURSUED +LEND +YACHTS +MISUSE +HELIX +COSMOS +PANS +LEGION +BIOMASS +LESIONS +SHOOK +SAUSAGE +ADDICT +MATTE +PISTOL +JUNIORS +ROCKETS +ZEBRA +RUNWAY +ADMITS +BUCKLE +FETCH +IONS +ASSHOLE +DIVERS +UPSIDE +ADMIRAL +PATRON +BOILER +INDUCE +PADDING +POPCORN +ESPANOL +UNITE +CRACKED +DEBTOR +SHEAR +MORTAL +RAMS +GENOMIC +GOWN +PONDS +ARCHERY +REFUSES +SABBATH +RUIN +TRUMP +ESCAPED +MATES +AVIAN +STELLA +VISAS +ANYWAYS +CEREAL +DRILLS +CHAMP +HOSPICE +RENTED +BRUSHED +OTTO +ANNUITY +RECAP +OPENLY +CRAWL +JABBER +ROTATE +FLAWS +TRACING +INCOMES +FRAGILE +SAPIENS +RUSHING +BEHOLD +TRAINEE +TUNA +HAZEL +WIPE +LEDGER +SCARLET +CRUSHED +LAUGHS +STATUES +DEPTHS +SPICES +LOADER +LATENCY +THEMED +MESSY +RUPEE +SUBSIDY +FELONY +LUNGS +GROWERS +HAUL +DULY +ROASTED +TENDERS +MICK +GENTOO +MUSTARD +STRAIT +OBEY +DONKEY +JACKS +BOASTS +PRAYING +RADIAL +MARE +STOLE +ARMOUR +SHAVING +BISHOPS +KITE +TONNES +CORONA +HEAP +BYLAWS +QUASI +RIBBONS +EXILE +RESIDE +CASHIER +EATS +KNOTS +FLEA +PALS +HAIL +KAPPA +BLENDER +JUMPS +BLASTER +WASTING +DECODER +SELDOM +MORROW +GLITTER +SIDEBAR +LASTED +SNOOP +AWHILE +WINERY +SCALED +PHOTON +VAGUE +OVERLAY +WRAPS +RUSTY +HERD +WARNS +BITCHES +STING +BRAVO +TRIVIUM +RESTING +COARSE +LITER +CARPETS +ARCHER +WARMER +DRYERS +CALF +BASIL +PACED +GROUPED +ORIENT +CONTRA +BOILING +PARSING +ABANDON +RAVE +CIGARS +CINEMAS +ENCODER +MAROON +DRAFTS +JERK +SHACK +MARROW +TAVERN +BATHING +LAMBERT +GOGGLES +UNHAPPY +CLONES +SLEEK +RUNOFF +ARIEL +CAFES +JUKEBOX +HITCH +NEXUS +CANCERS +TANGO +MELTING +GARNER +BUSTER +FLAP +KARATE +SINGS +SORROW +CARTE +CANNED +QUEER +PAINS +WRAPPER +DRUMMER +COMMA +GEEKS +AVANT +SUPPER +HOODED +UNRATED +DIVA +LENGTHY +SONATA +STOOLS +AGENDAS +TORAH +STACKS +OWNING +BIPOLAR +SERMON +TAPS +THRILL +LAGOON +INBOUND +REGIMES +OATH +PIGEON +RIVALS +FREED +BINDER +PARROT +MAGNUM +INVOKED +GALA +CHEEK +UTTERLY +LASTS +KINETIC +GLIMPSE +QUICKER +SMARTER +ATTAIN +CALORIE +TANG +FARTHER +BOWEL +CHATS +MAFIA +RIOT +FATS +DUNGEON +GERMANS +SHIRE +KASHMIR +SKYLINE +SULFUR +SCAMS +LIPID +CORPSE +SPEEDY +RITZ +LUSH +BARRELS +CABLING +STILLS +BIASED +PLAYOFF +BREWER +PAYLOAD +ADHERE +GRILLED +ENQUIRE +TOILETS +MAINS +WHALES +MISTY +PARITY +GRIM +REWRITE +VENDING +PRISM +CHASING +FLOP +BATTING +RESTS +TOSS +GRAPES +WINDING +RIPPED +VEGAN +COBALT +PITY +SYNERGY +ASPIRE +GROOM +JEWELS +DOUGHTY +BONDED +WEEDS +BEERS +FIXTURE +CANARY +WOKE +FILLS +GRIPS +CLERGY +KAYAK +ALTAR +SALVAGE +GEARS +ORBITAL +CUFF +EMPIRES +REPS +OYSTER +STURDY +UNDERGO +RISEN +BLENDED +RHINO +DIGGING +LANTERN +CATCHES +RULER +TOKENS +KIDDING +PIPING +SWEPT +AIRMAIL +STARING +SEVENTY +TROOP +AROSE +ELDERS +HEROIN +HOGAN +WHISTLE +SULFATE +OLDIES +EDDY +PAROLE +SPOUSES +SLIPS +NINETY +TRAYS +CUES +KISSES +FLOCK +SUBPART +BENDING +DENYING +RECYCLE +SHAVE +COLT +FURNISH +RUBBISH +KNOCKED +SWAMP +TORNADO +TURTLES +OFFS +LEARNS +HICKORY +INMATES +SLICES +DAMNED +FAINT +REBUILT +FIERCE +JARS +HIPS +GLAND +WIGS +STRIPED +BLENDS +HUNK +CHAP +BLOWS +TELE +STOKE +GRILLS +HARP +PHAT +ESCROW +ANTHEM +TACK +SACK +SURFERS +ABUSES +JOCKEY +PEEK +MONARCH +HOUSED +NASAL +COSTING +RANGED +SPRUCE +PARADOX +NITRO +JACKPOT +HALFWAY +CORTEX +LOSER +SECS +MIXERS +BRAVES +SUED +SHOOTS +CLOVER +NEUTRON +DIRECTS +JOLLY +SNAKES +FEMME +RESIDES +WORDING +OBLIGED +SIEGE +TRUTHS +REDWOOD +THERETO +TYRES +ENAMEL +TOBY +RADIANT +VIRGINS +FIRSTLY +MARTINI +BUTTE +BOMBER +REEVES +BASTARD +COASTER +SPENDS +HICKS +ALMOND +CHALK +AXLE +PUPPET +GRAZING +PILLAR +MIRAGE +SEASIDE +RENAMED +COBB +SOLUBLE +PIRACY +ROWING +SIDING +HARDEST +FREEWAY +WRATH +OPAL +PATRONS +TOON +LARS +GRIND +ALBEIT +BANKERS +FREAKS +SAMPLED +SINCERE +BLITZ +TENDED +CACTUS +VIVA +BLEW +HOWE +LAVA +SUCKED +BRONCOS +COOKS +SHARPLY +RAINY +REGENT +VINEGAR +RAFTING +VAIL +MISERY +SAFARIS +ENVY +MAILER +PREFACE +LINERS +UNREAD +PENCILS +QUINTA +FORGED +BISTRO +VIOLA +VOODOO +CACHING +RUSTIC +RUMOR +SHAH +VOLTS +RUSHED +BOTS +WEIGHS +DIVER +CASTLES +NOTIONS +PLATEAU +DEXTER +RINGER +ZIPPER +PALETTE +BLAZE +WRECK +ONBOARD +ROBBERY +JASMINE +CROCHET +BROCK +CROWDS +HOOPS +MACON +STAMPED +UPTAKE +GEARED +IDEALS +TYCOON +DISMISS +LAWFUL +STAG +RASH +HORNS +PRESSES +TANDEM +BOIL +GAGGED +BARLEY +POTENT +AMUSING +NERVES +RETAINS +DOCKING +CHIMNEY +PACKERS +RISKY +CARVING +SLIPPED +REALISM +SHERRY +INDIES +TULIP +MADAME +VAIN +DALTON +BOLOGNA +MAZE +RODE +AMEN +OWING +WARP +IMPLANT +DENIES +BUFFERS +DRAPER +BOWMAN +ZETA +BENNY +SPIRES +MASONRY +ACCRUED +TEMPLES +INDOORS +CHAMPS +SALADS +EIGHTY +STAGING +SCARCE +ROPES +SPIDERS +PLAGUE +DILUTED +CANINE +GLADLY +BREWERY +LINEAGE +BREW +KERN +COUP +MORSE +PISTON +CORDS +SEALING +TOPPED +DESPAIR +FORE +ABSORB +ALPS +DUMPING +MAGENTA +TAGGING +DITCH +FEARED +PRELUDE +SLICK +OVERLY +CHUNK +REELS +SLEPT +DRAFTED +CHALET +LAYERED +HOPPER +SUBS +FILLER +SMILEY +ZENITH +BROWNS +WAITS +TENOR +COPIERS +OVARIAN +SOFTLY +PLENARY +SCRUB +LIMB +CELLO +SUFFERS +OCCUPY +MIDTOWN +CAVES +IMMENSE +MERLIN +COCOS +AIMING +SEIZURE +LIMP +MUTE +BEANIE +METRE +TRICKY +SPACED +TOPAZ +SOAPS +DART +PSYCHO +WROUGHT +ROBE +TUTORS +CAPTIVE +KETTLE +BAGGAGE +DUSTY +PATTY +SATIRE +VIKINGS +CRATE +HUMANE +MAST +CARED +SWORN +VICIOUS +COZY +HAYWARD +COMB +LIQUIDS +BEECH +FROGS +EXPAT +RAIDER +TIMERS +MINERS +ROCKER +ALAS +SAWYER +TENSE +COOLED +MIGRANT +INVOKE +LEANING +PADDLE +CHOP +EYEWEAR +ROOTED +ONYX +BENCHES +FOOLISH +FINALE +WEAKER +DECAL +COMPOSE +NAUSEA +HOOP +TEMPS +CLEARER +FLOODS +FRITZ +MOVER +MODELED +ERICA +DIOCESE +THISTLE +SLEEPY +NOPE +SHRINE +ASPIRIN +DIRE +GULL +MEMOIR +FAUNA +CLIFFS +SMELLS +DISPOSE +DETOX +WAKING +REFLEX +FALCONS +SPURS +ORTHO +CRASHED +URGENCY +FLASHES +BRIT +CARERS +RIMS +DARTS +SHIN +KEYPAD +FLAW +TAILS +BIBLES +HANGS +QUARK +DOLCE +PANE +ANGULAR +VEINS +FOLDS +GRINDER +SNEAK +OCTET +SAUCES +CONQUER +VIBE +CREOLE +METH +TRENDY +TEAS +FILMING +BADGER +IMPRESS +WILLY +ANON +EMINENT +RIBS +QUILTS +AGEING +SPLITS +CHEQUES +ALIASES +SCREWED +TOMCAT +TIDAL +BALLOTS +TESTIFY +BOYCOTT +CLERKS +CRUST +DOLLY +PISSED +NITE +BARB +HUNS +MINER +GENITAL +ANALOGY +AURA +SPONGE +SECT +DINER +WINTERS +NOUS +MOUND +SNATCH +MOLE +OWED +ORGASMS +KISSED +BUFF +BUTCHER +PSALMS +CHEFS +HAMLET +CLAD +GRANGE +FLED +BRANDY +SWINGS +SCION +VORTEX +PURSES +BODILY +HOODS +EQUINE +BROS +LIZARD +WEARS +REGAL +CABBAGE +ARRESTS +SIGNAGE +ENCODE +SLICED +BREAKER +CURLY +COLLAGE +ACES +JEALOUS +LEARNT +HOUND +GAUGES +WHARF +RHYTHMS +FLICK +DATUM +SHOTGUN +LANGLEY +MAIZE +UNAWARE +PSALM +SCENTED +GOWNS +SPYING +LIED +SANDBOX +BLOC +LEAKS +SWELL +KOSHER +MANTLE +CHICO +IRONY +GESTURE +ARMIES +HUGS +SANTOS +OWLS +CUTTERS +CAMPER +CEASED +MERGING +PLAQUES +BREADTH +MAMMOTH +INNINGS +PARCELS +PASTRY +MANNERS +LEVIN +AMIGA +VIPER +GYPSY +THIEVES +PIMP +REPEAL +GIMP +HEMP +PELICAN +CYCLIC +COUSINS +CONDOM +ADMIRE +DODGERS +LITRE +POURED +BINDS +TEXTUAL +SUFFIX +SPINDLE +HEAVENS +INKS +WINK +MISTER +FLARE +WIGHT +COUTURE +FOLIAGE +FIFE +CRANK +GOATS +STUB +CREAMY +RAINS +TORT +BRACE +BACKUPS +MAYHEM +WASHERS +OCTAVE +STRUTS +DAMS +PROOFS +GARTH +ALLOYS +MACH +CONN +ARGUS +MANGO +SPUR +JUBILEE +POLITE +SITH +THIGH +PAVING +CYCLONE +MEATS +BULLDOG +GRADUAL +SKIS +PACT +LULU +WINDY +ALAMO +MASTERY +VITA +STEER +NESTING +VOGUE +AIRED +OUTWARD +WHISPER +BOOGIE +VODKA +MOLDING +ZAIRE +BRICKS +LEOPARD +JINGLE +BOUNTY +ARCADIA +FISHES +RINGING +KNOBS +WHISKEY +ABSURD +STOVES +EARRING +EMBRYO +SALTS +FURIOUS +UNSAFE +REFILLS +IBIS +SOUPS +MOIST +DRAINED +COED +MULE +SHEIKH +KIWI +APPEND +MOTIVE +PESTS +ACREAGE +DUEL +STOCKED +BETHEL +MOTIVES +PROVOST +STOKES +LAKERS +MEAD +STEROID +GONG +RESETS +ISOLATE +BAYS +ACRONYM +VERITAS +FAULTY +MESSIAH +BRUNCH +PUNDIT +MUTANTS +EXPIRY +SENSUAL +PETIT +BURGESS +INNING +GAZE +FRIES +FRESHLY +FOUNDRY +MONIES +ACETATE +POINTE +STALL +MARCEL +HULK +CYAN +CORY +PORTAGE +SERIF +ALAMEDA +AEROSOL +HOSTAGE +CRACKER +MONKS +STOREY +SCOTCH +SERMONS +COOLERS +AUDITED +ADJUNCT +GALORE +ALOHA +AXES +POSTFIX +HAZE +PITS +UTTER +BOTTLED +ANTS +GASTRIC +RENTS +CHRISTY +THEIRS +TODAYS +TOASTER +CATER +COLTS +TUCK +SLAB +LURE +KART +LING +EMBLEM +ROADWAY +SERIALS +DUNES +MURDERS +BOTTOMS +TUBS +MEDINA +SNIPER +PINCH +SCOPES +BRACES +TROLL +FILTH +WIDGETS +MAGS +KRAFT +CHOPPER +NITRATE +PINBALL +SKATES +HERS +GRIN +TUNNELS +CRISES +HEAVIER +SPIT +DARKER +GLOBES +ALGAE +DISSENT +MAXIMAL +CHORAL +EDIBLE +ANARCHY +CLICKED +DRAWERS +ACME +LEAKAGE +SHADY +CHEMIST +EVENLY +ROVE +PROPANE +PRAISED +RHYMES +ERECT +VESTS +COYOTE +BREEDER +CHOW +POLLEN +DRUNKEN +VALET +SPOILER +SHRUBS +BAROQUE +BARROW +JIHAD +RIFLES +ARIA +EXCISE +POETIC +MORTAR +BLAMED +INMATE +DIRK +POSTURE +THEREON +VALLEYS +SEPTIC +ARMADA +WRENCH +THANKED +SCAR +APOLOGY +RAPED +COLLARS +PUDDING +FLAWED +DORM +SQUARED +PIES +TAXIS +HATES +FENCES +COOKERS +LUCKILY +LIGHTED +ERECTED +DIALING +MIGRATE +CARTON +MENTORS +AMMONIA +OUTLAW +TAMMY +SAWS +BOVINE +DISLIKE +MADAM +TIGHTS +SOYBEAN +BREWERS +TEASE +MOTLEY +AROMA +PIERCED +CAIN +COCO +PUNISH +CAUSAL +ROWAN +DWELL +HACKED +AWKWARD +WEAVING +STAIR +DINE +CLASSY +LOOKOUT +IRONING +SLAP +JAWS +ENTROPY +SNOOKER +SALINE +SONNY +STERILE +ORIOLES +BOTANY +ROTOR +QUART +THERES +BISON +ALLEGRO +FUNGI +DREAMY +SCROLLS +FAIRIES +GREED +SPARKLE +GASKET +REFRAIN +LASTLY +WANDER +FIREARM +ANTE +MICRON +BUNDLED +PANTIE +BOMBERS +COVERT +CRATER +FAVORED +BRED +THENCE +BLEED +SHEA +GOBLET +FRONTS +INCUR +CORES +NODDED +NIFTY +UNVEILS +PEACOCK +UTMOST +INFOS +HELPERS +ELAPSED +ANTHRAX +TOUT +HOPEFUL +SPINACH +CHEEKS +HARE +BEASTS +PLANAR +PEANUTS +DISCARD +CAVALRY +QUORUM +PLAT +DUKES +TRIMMED +FERRIES +MULLER +MOSQUE +FUDGE +VESTED +EARNEST +TORY +SANDER +CLIMAX +WEAVE +EXITS +PARDON +OUTBACK +TELLER +BIOPSY +VEIL +PECK +QUARRY +SENECA +OCEANIC +HELM +FESTIVE +HUSTLER +JESS +INSULT +SCRAPS +WAIVED +CURED +BUGGY +RECON +KENNEL +DRILLED +ROYALS +SLACK +PASTEL +JAYS +PILGRIM +VINES +GORGE +CARROT +OPAQUE +SAUL +FLAMING +EMPOWER +LIENS +HURLEY +PEDALS +CHEW +TEAK +PREVAIL +CAGES +METHANE +PAGER +BANJO +SHAKER +NATIVES +STOUT +DEEPEST +SANE +CLIMBED +RELAYS +FADING +ROAMING +SIBLING +WEIGHED +ASHAMED +GORILLA +ENDURE +INHIBIT +DICKENS +JUNIPER +DUNE +CURSED +BLOWOUT +YOUTHS +TUMBLE +OVERSEE +STARE +MISSY +FLAIR +HELIUM +CLEMENT +FINELY +ROBOTIC +MANA +LEST +FILMED +SMOKER +BENIGN +AISLE +BLUR +LIMBS +PUNT +SLUDGE +CRYPTO +TANNED +BUNKER +PAVED +PASTURE +RICHEST +CRUELTY +SCOTS +PLUGGED +MARSHAL +RITUALS +SEIZE +SPAWN +BLANKS +EPOXY +SAILORS +STONY +ANNALS +SADNESS +LOSERS +FLAVOUR +CRYPT +ONWARDS +BOGUS +PROMPTS +WITCHES +BARRED +SKINNER +NOUVEAU +FEEDERS +URGING +FADED +TYING +DIODE +MELTED +WHORES +MOTTO +SINGLED +STAPLE +RULERS +CENTRIC +MILITIA +BANANAS +GOLFING +GRILLE +PUSHES +KITTENS +DETER +FURRY +CUBES +SCARVES +RINSE +OUTFITS +ULSTER +TIDES +VENOM +TAILED +PUPPETS +TAPPING +EXPLODE +ESCAPES +BERRIES +HAPPIER +MUMMY +STACKED +WINGED +CRIES +RUINED +CATCHER +SANITY +ETHER +SUCTION +CRUSADE +RUMBLE +HEROIC +SHEDS +BONSAI +SPHERES +ASSIGNS +SOFAS +BOING +WHIPPED +DINNERS +SELFISH +FAUCET +MIDGET +BOILED +HAUTE +HERRING +WACKY +ANEMIA +BITING +IDIOTS +MUDDY +SAVANNA +PAGING +NUDISTS +SPIKES +KEELING +YIELDED +LATENT +SHALT +SPARROW +POOREST +HECTOR +MILLING +SINKING +SULPHUR +WICKER +NEPHEW +CONFESS +CHAOTIC +VISOR +TRACED +MYRIAD +STAINS +SANDAL +RUBBING +NAIVE +DETECTS +HANGER +DRAGGED +FOREMAN +HIRES +CONDUIT +ECHOES +LADDERS +PRUDENT +GLOWING +BLAZER +ALCHEMY +LINDEN +AUDIBLE +FOLIO +COLLEEN +LEXICON +DUMPED +BARRE +FIERY +CONVEX +RICHER +SURFER +DIAPERS +PAIRED +FAKES +VAULTS +YOGURT +TOSSED +CAUCUS +PILLARS +SALUTE +SHOPPE +PARODY +LACKED +PISTONS +ACORN +BOSSES +CATION +THRIVE +RIGHTLY +PARAGON +BASAL +TURNOUT +BRUINS +PERSIST +CLAMPS +ILLICIT +FIREFLY +PLEDGED +CURLING +SMOKY +FLIRT +SLANG +PRINCES +FINCH +LARGO +PLURAL +SKIPPED +TALLY +TEMPTED +CREEP +SHADED +PLASTER +HEARTED +AGILITY +UPSCALE +AGILE +SACKS +KIOSK +IONIC +STRAY +RUNAWAY +SLOWING +HOODIE +PAYOUT +POPPY +FRENZY +JARGON +SLEEPER +UNNAMED +JERKING +BAZAAR +SHARPER +GREEDY +TERMED +COOLEST +DOWNING +BASQUE +HALOGEN +DORADO +DARING +REALMS +MAESTRO +FORTE +COAXIAL +TIPPING +HOLSTER +FIDDLE +CRUNCH +FAUCETS +PAYOUTS +CALIBER +APOSTLE +PLAYFUL +STYLED +WAIVE +SOPRANO +MARQUIS +LOGGER +GREET +ACCLAIM +BIRDING +LYMPH +ROLLERS +PUMPED +WEEKDAY +REVOKED +LATCH +VERBS +DRANK +GROWER +OUTPOST +LITRES +CHATTER +SANTO +LETTUCE +RAGING +ASSAYS +TORSO +OCCULT +HOOKER +LILIES +AEROBIC +ECSTASY +FULFIL +LUCENT +STRANDS +COMPOST +GRABS +MARLIN +PULSES +THESES +FLOODED +CORSAIR +IRONIC +WARDS +HINGE +ULTIMA +COCKPIT +CARROTS +RESUMED +STUNT +MAVEN +EXCUSES +COMMUTE +STAGED +VITAE +HUSTLE +STIMULI +UPWARDS +WITTY +LOOSELY +ANCHORS +HERTZ +ATHEIST +CAPPED +LIKING +FUCKERS +BLOWER +FLOWN +DUBBED +SILKY +GROOVY +GRIZZLY +CHAIRED +REPAY +HURTING +AWAIT +SPARSE +FOSSILS +FETUS +CIDER +CROOKED +GANGS +REMAKE +BRAILLE +LILAC +SINUS +CHARMED +HEARS +CLEARS +PIVOT +SOARING +VIRTUES +BANNING +GLIDE +BLOOMS +JACKING +SLOGAN +BISCUIT +CREME +SUBMITS +WALTZ +MENACE +EMERGES +BLUSH +LEAFLET +MONDE +INFORMS +DRAMAS +GEISHA +UNSEEN +SILICA +MODAL +WIDEST +MEDLEY +CADET +TEMPER +ASSERTS +CARBS +MARINER +COLLIER +ARTISAN +AQUEOUS +JUICES +MORALE +MORALES +SOLDER +TRENCH +OPTED +LODGED +REVOLT +RENDERS +SHINES +REGAIN +RESIZE +TWEAK +TRAIT +POPPED +BUSTED +BASINS +OTTOMAN +GRADERS +EATER +TUNERS +UTOPIA +SLIDER +INSISTS +POURING +HIDES +MANURE +SAVIOR +SECRECY +DREAMED +FERTILE +HINGES +CREEPY +SYNTH +FILTHY +LAYUP +PIAZZA +DENOTED +NAZIS +ONESELF +PILES +VAGINAS +STROLL +ANOMALY +THIGHS +INFECT +BEZEL +AVATARS +DOTTED +FRONTAL +HAVOC +ARSENIC +SYNONYM +DOOMED +FRANCS +BALLAD +SLING +DEVISED +BILLIE +RAVENS +OBSCENE +UPTIME +NUCLEI +TUMMY +AXIAL +SLOWED +OUTING +BURGERS +CAMPERS +AFFIRM +SPELLED +EPOCH +PLAID +FABLE +RESCUED +PADRES +SCARS +WHISKY +UPTOWN +BATTER +RECTAL +NUGGETS +PESOS +SHAKES +EMBRYOS +SPANS +PALLET +PISTOLS +GARAGES +TANNER +AVENUES +UROLOGY +OBESE +SOBER +TREAD +ZOOLOGY +STEALS +WIGAN +PADDY +HUSKIES +PLUNGE +CHASER +VANTAGE +DIFFUSE +BOREDOM +CROSSE +MONDO +FLATBED +SPADES +COFFIN +OTTER +GOLFERS +EARNS +RECESS +SHOUTED +STARED +SASSY +VASES +ADVISES +COWARD +TEAMED +PRESET +DRESSER +RICHES +RESIGN +RAMPS +TACKLES +POISED +BARKING +DREAD +TACTIC +SERPENT +TAPPED +PITCHED +WISELY +STEAKS +TOXINS +CASTS +TUBULAR +AVOIDS +LARVAE +KERNELS +FUNGAL +LIGAND +RIDDLE +FAINTER +CABARET +AWAITED +NOZZLE +NEEDY +WHEELED +NOODLES +DINERS +CORNING +ARMORED +WEARY +TWEED +SNOWY +PIANIST +PIGMENT +FACTION +GENIE +CHARS +RULINGS +SLATER +ORPHAN +LINKER +CARVER +SHOUTS +EPSILON +ANNOYED +STALLS +FINED +INWARD +GREETED +STARCH +APRON +GLAZING +TYRANNY +REGIMEN +FLUFFY +SLENDER +BENDER +AIDES +GLAZED +DASHED +BULLOCK +YUMMY +MOMMA +MERMAID +SEXES +WILDER +CENTRED +UNCOVER +HUSKY +BLAND +ROUTED +ABIGAIL +SHAVER +SAILS +PORTED +ROBES +FUNGUS +CHUNKS +BOURNE +REVERT +IGNORES +POPPING +PANDORA +ENIGMA +GLANDS +LATINOS +INFERNO +ARENAS +OUTSET +CONFUSE +ADEPT +LOUNGES +TRUNKS +STRATA +SOLVER +HYBRIDS +KUDOS +CREAMS +ENSURED +CEREALS +OUTRAGE +SCRUBS +KRONA +DEVOTE +FACETS +NOISES +BOOTHS +ELUSIVE +MADEIRA +HALLWAY +RIPPING +POLYGON +ESTER +SERVO +HAMPERS +SNAIL +CURATOR +DEMISE +GROOVES +SUTRA +MOWER +SWINE +FAXING +QUICKEN +HERON +GRAFT +DERRICK +ENVOY +STENCIL +DOORWAY +REDDING +WARDEN +CLANS +NOTARY +ABORT +INDENT +BARLOW +EDGED +DUVET +SPADE +GLARE +DECODE +LOONEY +PLEDGES +SULTAN +MASKED +CASING +PLOTTED +GRIDS +SPACER +SPILLS +REAPER +BROADEN +BEGGING +HANDOUT +BUSHES +CONTEND +HAIKU +PAISLEY +CUTOFF +GIBBONS +NITRIC +VISUALS +BREADS +GLOVER +UNICORN +FLOATS +ORDERLY +WAFER +STASH +ROOFS +REEFS +SEMEN +HOVER +MOLDS +FLANGE +CHILLED +CITADEL +WRINKLE +INDULGE +HEARTH +MELODIC +GENOA +STRIDE +LEAFS +BLEACH +FERRET +AGONY +TALLER +ENRICH +RAFFLE +MASCOT +PRIMERS +LACEY +PREACH +CONES +LUPUS +TAXED +PETALS +GATOR +HELLER +WALLA +REMIXES +TAPED +DOCKS +BULLY +VALIANT +BANGING +VERTIGO +FLUENT +RHYME +RENTER +SUFFICE +DEBATED +WALKERS +BOOKER +KEEPERS +ORANGES +SNORT +AIRWAY +COMMAS +ANYHOW +OBTAINS +PRIMAL +STRAITS +UPHELD +SUBSETS +BLAZERS +TRIAD +FITCH +ENDOWED +ALAMOS +CAMEO +ATTIRE +LEACH +FANNY +MILKY +COMBS +UPLAND +OUTAGE +CHUNKY +ADOPTS +RAPTOR +COULTER +SNAPS +DEFENDS +DEPICTS +GLUTEN +SPANKED +HURST +ASCENT +NOTEPAD +TEDIOUS +CRAPPY +GOLFER +CHEWING +WELDED +CIRQUE +DEPICT +COILS +CALLERS +NAVEL +INTERNS +QUOTAS +SUCKER +BUMPS +BIKINIS +WILDLY +SABLE +ADDICTS +NEATLY +SPANIEL +SPOOL +ROVERS +VOICED +ANNOY +GRANDPA +GUESSED +KENNELS +TOXIN +AXIOM +STAMINA +ABOUND +CURING +CONFER +VENTS +MATER +CROWNED +CRANES +ROOSTER +PROCTOR +HUMPS +DICTATE +JOKER +TRIMMER +HIKES +KICKOFF +WIPED +ABDOMEN +FRACTAL +PRAYED +HEIRS +TWILL +CURES +KICKER +FASTING +LOUDLY +RACERS +RECITAL +PAIRING +BEDTIME +RAPPORT +CATFISH +BRINK +TRUSS +PEACHES +SKIPPER +DRAINS +MAXIMA +PINOT +KHAKI +SLOUGH +PRODIGY +MOULD +BLASTS +POORER +SHAKERS +BOURBON +RUBBED +LEXICAL +UTERUS +TRASHY +CHIMES +GIMME +PLATTER +SHAMAN +CROFT +PENAL +PAGEANT +PLYWOOD +BINDERS +TRACTS +MORALLY +HOSIERY +REPTILE +OVERDUE +RIOTS +SHOWBIZ +TEASING +UNBOUND +NESTLE +BOXERS +LAPSE +WALLY +HEPATIC +SHRUB +KINDRED +AQUIFER +CONDEMN +AWAITS +AMENDS +FULLEST +SHAFTS +FINER +MARLINS +BURDENS +SHELLY +EXITING +BROOCH +MOTIFS +SWOLLEN +GRASSES +SCATTER +STEWARD +SMACK +CODEINE +TOUGHER +CLOAK +CLIPPER +CYNICAL +MANIC +ETCHED +CHOKE +TUXEDO +MOUTHS +HALTER +HAMSTER +LUMENS +PACKER +ARROYO +TIPPED +AMIDST +ETCHING +GRAVY +INHERIT +HANDING +PAYER +LABORER +RESINS +WATCHER +ABBAS +MOODS +COUGAR +DOBSON +SURREAL +SOAKED +RASTER +QUIRKY +PALATE +ENCRYPT +PAJAMAS +QUESTS +SAYINGS +PLASMID +UPSTATE +TOPPING +FUELED +GLAZE +PELVIC +PHASED +AIRBUS +SIMPLEX +INFRA +CONDOR +GATED +RASCAL +DIZZY +CRIBS +RELIANT +PSYCH +VERGE +RANSOM +NOMAD +TWELFTH +DAGGER +THORN +SPINS +SOLICIT +ORCHIDS +BUCKETS +SPOIL +LAUDER +PHONO +BLAZING +GRANTEE +ANGLERS +SNAPPED +INVADE +HOSES +STRIVES +PIVOTAL +PLATING +INVENT +EAGERLY +SISSY +TROOPER +HYMNS +PALSY +CUFFS +FAMINE +ORALLY +JOGGING +HORRORS +BEARER +PASTORS +PITCHES +MORALS +INVADED +SPOILED +PICKLE +DIETING +QUAKER +TANGENT +TEMPEST +XENON +WAVING +UNEVEN +ROCKERS +BAYOU +QUEUES +STAFFED +ORPHANS +LOUDER +BOILERS +YELLING +TROUGH +LEANED +TONIC +RESELL +BURNOUT +HARROW +RAINING +PEASANT +EPHEDRA +CITRATE +SNOWMAN +THORPE +SAUCER +CHINOOK +POTTY +SPOOKY +RITES +DEVIOUS +DREAMER +ESTUARY +POUCHES +DITTO +WAITER +ODDLY +TYPHOON +INDUCES +TOOLING +THRIFT +TIDBITS +ADMIRED +STUNTS +CYSTIC +FAIRWAY +EMITTED +SPINNER +BRAKING +WEAKLY +PARSLEY +UNDUE +SETBACK +STUNNED +SMITHS +GROVES +REFLUX +CULVER +ELVES +CHANT +TURNKEY +SPRAYS +RENTERS +TIGHTEN +HUTCH +CROWNS +MATTED +APRICOT +TUFTS +CUCKOLD +PARRY +TONGUES +MANTRA +SOURCED +RAVES +MAMMA +ENTAILS +FOLLY +MURAL +WAGER +TUNDRA +PURGE +SKATER +DISRUPT +RAMPAGE +CAVERN +IMPOSES +COMIX +SOLVES +SPOONS +PERSONA +POSER +PERKY +EXCUSED +FUSED +ROARING +STOPPER +FIBRES +CRESTED +STUMP +SCALP +ACTIN +MELON +SIREN +VASTLY +CLASP +OLIVES +SUMMONS +POROUS +BATHTUB +FREAKY +MERLOT +THIRST +IODINE +PHOEBE +SALINAS +LEGGED +WIPES +KRONE +EXPOSES +AEGIS +NATURES +DERRY +VERBOSE +AMOUR +SUBNET +SAILED +CHALETS +CRAVING +LEAKING +TOTES +MASONIC +FORAGE +THUGS +PAYOFF +SONAR +PEBBLE +FLASHER +STAFFS +PATCHED +LESION +TICKLE +BANDIT +ETHYL +LAMBS +CARAMEL +BLOUSE +OCTOPUS +CHESTS +FELINE +ZOMBIES +ULCER +TITTIES +HORNETS +CANALS +SPANDEX +ZEPHYR +TEARING +MUFFINS +ETHIC +TAXON +COUGARS +ATRIUM +THINE +GENET +NEMESIS +DEVISE +TOYING +TRIPODS +WREATH +PLIGHT +OPIUM +ENEMA +GOALIE +ARCHES +LOWERS +COOKERY +METROS +HANGERS +JURORS +SEAMS +PLEADED +GUTTER +ULCERS +SLOPPY +FLANNEL +JAILED +RIDDEN +BONITA +STEAMER +BARGE +SPARTAN +RUMOURS +FAMED +RESID +LESSEE +RESPITE +TASTED +LICKED +BANGED +SAFEST +DAPHNE +SERINE +POLLOCK +METEOR +SCHEMAS +BOOSTS +VENEER +SLANT +POLLARD +CHOPS +BROOM +PLAINLY +PUNCHES +SNARE +SHANK +UPHOLD +GLIDER +NURTURE +LOTIONS +LEASH +HUNTS +ADRENAL +SIXTIES +BOOTING +ENGAGES +CARBIDE +CUNTS +PULLMAN +KINDER +DEEMS +DEDUCT +TWEAKS +BEAGLE +CADMIUM +SPEEDO +LOCUST +VILLAIN +WAIVERS +SECURES +REJOICE +PLUMPER +UTERINE +BURSTS +HURDLES +GEESE +CANDIES +POLIO +MECCA +REGATTA +RESTED +PAUSED +WIDTHS +BROTH +MARTINS +TELFORD +TOPPLES +NEBULA +CROWS +JUNKIE +TAPER +SUGARS +FALLOUT +ALLURE +STALKER +RECLAIM +PIANOS +EXTINCT +PONDER +MESSED +REVUE +LUNCHES +FOOLED +SMEAR +RIGGING +DERIVES +PRAISES +COMBOS +CLONED +FULHAM +REISSUE +STRIKER +MEMOS +SCREAMS +MASKING +TENSOR +JAGUARS +ASSURES +TRACER +SERGE +CHIEFLY +AUTOPSY +POWDERS +DEBTORS +SLAIN +NEARER +WARTIME +QUAIL +TANKER +MAYAN +FUTON +RECTOR +BALLAST +TAXING +ICING +PINNED +GABLES +BANTAM +RALLIES +EARTHLY +PROXIES +REWIND +POPLAR +ISSUERS +MARTIAN +EQUINOX +HINDER +PRESUME +STRUT +CANDIDA +ADJUSTS +PLUME +PICKUPS +CALYPSO +PANTRY +ITALICS +BILLET +PORTING +HAMMOCK +REVOKE +CHEVRON +SLATED +WAGONS +PLANK +WOLFRAM +BONANZA +LUMBAR +LONGING +OSPREY +ENACT +INERTIA +DEITY +PRUNING +SWIFTLY +CLAWS +MANLY +FEARFUL +POTENCY +PINGS +PERIL +TEASER +NESTLED +HAIRS +DRASTIC +PROMOS +CATERED +GUARDED +NEURON +PULSAR +CELERY +OFFEND +CAVIAR +QUADS +RETINA +MAIDS +BUREAUS +VOYAGES +BOUNCY +RETINAL +SHEATH +LOUIE +DUBIOUS +MAMMAL +LISTENS +SWIRL +EMERY +TWISTS +ALLELE +ECZEMA +DIALECT +FANATIC +RAPTORS +DANCED +REVIVE +COROLLA +VEGGIE +DHARMA +HOOPER +ABODE +SAVOY +KORUNA +COMFY +AMUSED +KNITTED +CAMPO +QUINTET +RAMPANT +FUCKER +POLKA +WIPER +OXIDES +SMOKEY +RITTER +VACUUMS +ATTENDS +NICER +MELLOW +BOAST +GENTS +RAPPER +HOOTERS +TIGHTER +THRIFTY +CANNING +TOTALED +SHIPPER +PERCH +CRAVEN +HOMAGE +UNITARY +ANGST +LITURGY +SURETY +CUTLER +SWEETIE +CRADLES +RESENT +PODIUM +OPPOSES +FACETED +GECKO +TUCKED +TURMOIL +SEEDED +UNJUST +DISTURB +BOUNCED +SADDLES +GUSHING +PICKER +DIALER +ICEBERG +PLUMBER +CODEX +JUDAS +NOODLE +SCENTS +BANGLE +BERTHA +LEVIED +HUMPING +BARNS +RAIDS +INTUIT +SOLOS +FACET +REDNECK +PLANTER +SHAKEN +WARES +RIVALRY +VERVE +CHARLEY +SPREE +EMBED +GURUS +BESPOKE +DROWNED +BRUTE +KIDNEYS +WARBLER +ONWARD +DIPPED +LANCET +SNIPPET +PELLETS +STARRED +DEACON +SWEEPS +BUTCH +SCART +SKILLET +OFFEROR +CHORES +YARNS +GINSENG +GRENADE +RIDDER +ENCLOSE +MOWERS +SINNERS +SIENNA +CALVES +DEFER +LIARS +PHARAOH +ITCHING +ENDEMIC +TOURNEY +SAITH +ASTRAL +YELLED +HAMPER +BLURRED +AORTIC +MARTENS +DEANS +DUALITY +KITES +LIPIDS +CORDOBA +ROMANO +DUMPS +BUCKLES +JOYFUL +HANKS +DOSING +CRAVE +STROBE +WAFFLE +RIPPLE +SWEEPER +MEASLES +UPBEAT +AMENITY +DONUTS +SALTY +RUPEES +ZEROS +SPORTY +HAWKING +TUMOUR +POOLED +DIVIDES +HEALED +VALOR +GATHERS +CEASES +DORSAL +COLLIE +SPLEEN +MESSING +EMPRESS +ORBITS +WHENCE +SLOGANS +SABRE +STIGMA +MINDSET +INJECT +TARTAN +PROLOG +GOOFY +MIMIC +STORMY +RAGLAN +VULGAR +FASCISM +SERENE +CODECS +FORBID +TICKS +ISOTOPE +LOCALES +VIGIL +ROBBED +CRORE +REBIRTH +BANCO +HOTTER +ITCHY +BULKY +PARLOR +SETTER +STIRRED +SUBTYPE +FACADE +BOOZE +WIDEN +BIKERS +CIPHER +ARREARS +HEARTY +TRITON +ADORE +COLDS +THICKER +WEEPING +VENOUS +MONEYS +INFANCY +CLEANS +CLEANSE +CHILLY +ROSTERS +BOLIVAR +CHEDDAR +CORSET +HINGED +GOPHER +DISTAL +CUMMINS +ROBINS +BOOMING +CRAMPS +ATLASES +DIGGER +FLUKE +AVENGED +CACHES +STOMP +GLADE +ACIDIC +BOUNCES +FASCIST +THINNER +LICKS +CASTE +PSYCHE +ERASER +ANGLING +LIBRA +REQUIEM +SIGHED +LURES +SLOWS +HEROINE +OUTSOLE +FLAPS +INSET +CADENCE +FROSTED +OPENERS +RATTLE +INSULTS +OATMEAL +UNREST +DRUID +POODLE +SITTER +COLDER +KELVIN +SWARM +LEDGE +NECTAR +RACEWAY +MONSOON +DROWN +STRIFE +ESPRIT +TREASON +RECKON +PROSPER +MURALS +BANGS +RADON +SINFUL +CHEESES +ABYSS +CODER +NIECE +PLEAS +SOFTER +EMPATHY +TARZAN +FLASK +ARISEN +FEMMES +RIBBED +OMNIBUS +STABLES +HEREOF +UNTOLD +MITZVAH +TULIPS +BASHING +IDOLS +NUGGET +GUSTS +HIPPO +TENANCY +RUPTURE +LYRICAL +BRAIDED +WOODED +BODIED +DUDES +ALTOS +SLEEVED +OVERS +BASSETT +CATHODE +SLAMMED +AVIATOR +PALADIN +NESTS +MARCHED +ROTATED +SIGHTED +HOPPING +ROSARY +PLATOON +PULLEY +REGRETS +TWISTER +SEQUOIA +MARQUEE +DARKEST +BALLADS +SETON +CATCHY +HUGELY +BOBCATS +FRANKS +THINKER +INFLUX +CONVOY +TESLA +KRONER +PHONICS +PADRE +ENDINGS +REAGENT +NAILED +FRANTIC +COCOON +BOWERS +VALANCE +BREEZY +MUNDANE +MATADOR +CLOTHS +DELETES +CLOWNS +BARREN +PLEAD +BEHAVED +EMBARGO +CURRIE +SHEEN +SPECTER +ASSENT +SHADING +WARTS +MEDIC +HARMED +CONCEAL +GRAIL +TABLED +SEINE +FLOWED +SAVIOUR +LAPEL +BOOMERS +YOUNGS +PECAN +TINTED +BENZENE +TOPPER +ACHES +LEAKED +GENERA +SPARKED +IDIOMS +CHIME +SPENCE +CONNER +ARGENT +MILDLY +FORGING +CARIBOU +FOOTING +CHEETAH +REMIT +BONNET +STUMBLE +FRIDGES +UNBORN +HAMMERS +COASTS +CHEESY +CONCUR +EXERT +PINTO +WORLDLY +WEDGES +CORDED +PORTRAY +NAPKINS +BAKERS +PEARS +HEATS +LUCID +SHIVA +TONERS +INFER +UPFRONT +HAULING +QUAINT +DIPPING +REVERE +SOLEMN +CELESTE +GENTRY +CADETS +RAMBLER +DRYWALL +ENDURED +DANDY +MOULIN +SWAPS +LOCKERS +LOOKUPS +LANDER +LANCER +FISHERS +MUFFIN +SYNOD +LOUSY +AMIGO +CADDY +BURROWS +BEDSIDE +HOMOLOG +FRUITY +STRATUS +BUMPERS +SUMMED +CHOPIN +TORCHES +JOINER +PROCURE +SUNSETS +BRITS +PLIERS +KAYAKS +BLEAK +DAMPING +DRUDGE +TRAMP +SALIVA +BOOTLEG +MINIS +LESSEN +SYRINGE +LEFTIST +TEQUILA +GRANGER +GLACIAL +TAPERED +ALLEGES +BLAMING +EMBARK +MANNED +SLUTTY +SPHINX +SPIEGEL +GLITCH +GEARBOX +SONNET +STANG +SPRUNG +HEDGES +TENSILE +SPLICE +CROOKS +HUBBY +QUILTED +WALLED +IMPROV +RELAPSE +DEBUTS +COMMEND +DESCEND +BOLSTER +SAFES +ROCKED +RANCID +MALICE +RACQUET +TRIDENT +STUBS +DENTS +PERKS +CALMING +LINGUAL +PUNTO +VIBES +FUNNEL +MOONS +THIRSTY +LATHE +HIPPIE +SHABBY +PUNCHED +MARBLES +BYLAW +TRIMS +HALVES +LEAPS +TEAPOT +CONVEYS +LENDS +SQUIRE +CROOK +REARING +TYPOS +MELTON +DIVES +POOLING +COYOTES +STALE +LEVERS +PUTTY +REACTED +SUNLESS +PUZZLED +PATSY +GASKETS +ELDEST +CLIMBS +NONSTOP +CORGI +SWANS +TORIES +REMNANT +IMMORAL +MALKIN +UNEQUAL +WEAKEN +CUPID +CLINE +BACKLOG +PIERS +ENSUING +DYKES +REVIVED +HASTE +FLAKES +ALFALFA +ARGYLL +JOKING +PRONG +SIMMER +ATRIAL +REACTS +EXPOS +CHERISH +UNDEAD +BERTH +CRABS +LINGO +BUDDING +HACKNEY +PIGGY +SABER +MIDDAY +INNATE +TUNNING +LEXIS +GLANCED +RAPTURE +SUNBEAM +BEETLES +IMPAIR +BEADING +LAGER +GOBLIN +BLUFFS +RATCHET +PARROTS +ANTHEMS +TIERED +OPTIMA +PHOTONS +EMULATE +ACCUSE +DOGGY +HUNTED +HURDLE +ERRATA +RIDLEY +DIVAS +ZIPPED +BABEL +INSOFAR +PRIMATE +DICKIES +GONZO +REVISIT +CUCKOO +ACACIA +WHITING +NETTING +OFFSETS +FOYER +PALACES +BROOD +AZURE +COMPEL +AIRFLOW +SABINE +SNIFF +GLIDING +DIETER +UNWIND +HALTED +OUTINGS +CROTCH +WAVELET +DIODES +HOSTESS +DIPOLE +POSSE +TANGLED +FRYING +PIXIE +IMPALA +FLICKS +PUNDITS +UNSET +WAXING +SINNER +COLES +MELEE +GRABBER +CRAFTY +LLAMA +PERIDOT +PACERS +VOWEL +FEARING +PARTON +FECAL +DOSSIER +TREBLE +GALLEY +SHOVEL +ENTAIL +MASHED +PACING +FLUXES +FINDERS +DESERTS +MILKING +CICERO +SCRIBE +NELLIE +OUTAGES +SLEIGH +BLISTER +OPACITY +RATION +HUMID +VEGGIES +GUILE +LACQUER +UNFOLD +TUTTI +MINED +FISHNET +THRILLS +SORES +SELVES +TITTY +SPRITE +OXIDASE +ATHEISM +CELLARS +CATERER +TAINTED +PRAXIS +REEDS +ANGLER +MIDTERM +RESEND +AUGMENT +FLARES +GELATIN +SWATCH +BUMPED +CURSORS +CRIPPLE +DIVERT +LOFTY +KANJI +DROPOUT +CROPPED +LOCKOUT +MORON +ABACUS +RICHLY +DOGMA +VAGUELY +WINCH +MELONS +EVILS +LIMOS +ALMONDS +JOCKS +EQUATOR +UNZIP +GUILDS +BLATANT +FLOSS +SARGE +ENDNOTE +RIDGES +OYSTERS +PORNOS +PUBERTY +CRAWLER +ANGLED +SHORTEN +SHAWL +BENDS +GRIMES +UNISON +TABULAR +DORMANT +TROPICS +CROUCH +PENCE +PLACID +NAPKIN +SOAKING +FERROUS +THYME +ZILLION +CHINO +ABUSING +CAVEAT +BEDROCK +BADGERS +GARTER +FOOTED +TOUCHE +OVARY +ACCRUAL +SMASHED +PAYERS +GRITTY +HAILED +HOUNDS +PAROLES +REBORN +BEBOP +DAZZLE +SEEDING +DANGLE +EATERS +BOTANIC +BRONCO +CHASED +MERLE +SAVORY +MURINE +RODENT +RACKET +PUTTER +FLOPS +SICKLE +ATTEST +BASSIST +STATURE +SKATERS +SENTRY +VICES +KARAT +GINNY +TOLLS +BANGLES +STEREOS +FIREMAN +MANIAC +ANTICS +WRONGLY +FALSELY +ABBOT +MAGMA +CONSUL +PLAGUED +AIDING +SUCKERS +CHILLI +CANOES +MATILDA +FODDER +IMPETUS +PEELED +INBRED +WHINING +RABIES +ARSON +MODULUS +BOOSTED +SPRAYED +GEARING +FREEING +REDRESS +SETTLES +ANGINA +GEEKY +COUPLER +SEAMAN +SKULLS +CAYENNE +BALBOA +DEFEATS +MONTAGE +BIASES +SPRAWL +REOPEN +HAUNT +HEDGING +ERASED +INHALED +FUSES +BRITT +COLLIDE +BLINDED +MADRAS +FAITHS +TINKER +ECHOED +GAZING +BRAID +GRAINED +MEDIATE +CUNNING +FISTS +DIVIDER +PENNIES +MINIVAN +CHIMP +GIRAFFE +AWNING +SPILLED +STROUD +LEFTY +HERES +AZIMUTH +VIGOR +CHARIOT +SQUADS +TWEEN +PAYBACK +COOLANT +PARSED +HEALER +WARMERS +GLUED +ALLELES +WEINER +SHUTS +OCULAR +SANDMAN +SCOOPS +ALDER +LULLABY +TRUCKER +LAWNS +CHOKING +CASTOR +STATELY +RACED +DEUCE +RISER +REDUX +EVOKED +STUDDED +CLERIC +SPARED +BROWNIE +QUITS +ENSIGN +NEARING +BURGLAR +WARPED +FREEZES +KNOLL +WILDCAT +INLAY +PARTING +AVOCADO +TORPEDO +OCTETS +MUFFLER +JUMPERS +HERETO +CRAZE +CURACAO +GRATED +PROVOKE +CALVARY +BANDED +INVESTS +ROPER +TOURED +BOBBLE +ADJOURN +WIDOWS +CITRINE +VOLTA +MEDIUMS +CALUMET +PELLET +DISCERN +DOGGIE +INFLOW +FUMES +FUTILE +FENCED +ANIMATE +TOTEM +AGONIST +HARMS +RETHINK +AGGIES +CLOSETS +JUNKIES +CARVE +MUSTER +PERTAIN +MARTYRS +HITTER +APNEA +SYLVAN +SWISH +SHAVERS +ABORTED +ASKER +BOOTIES +ABIDING +CANCELS +RELIC +SLIPPER +CLASHES +ETHOS +ARGYLE +CLING +COMMUNE +SNORING +QUASAR +LITERS +COMETS +GOVERNS +ROOFTOP +TONED +ERRED +DARED +NUDGE +SEEMING +ROSEBUD +DOVES +RUMOUR +INTAKES +SAFFRON +RAGGED +PULSED +IGNITE +HORNET +JESUIT +MOUNDS +DEVOID +PARTED +ELITES +MUNSTER +SKUNK +PLACER +CASTERS +HEAPS +HYDRA +ANVIL +STALK +MAILBAG +INERT +DOPING +POSTWAR +FAVOURS +SMARTY +EJECT +RAYON +SAUNAS +MOCHA +JITTER +BARTER +FRUGAL +STARRY +NOUNS +HOBBIT +EVASION +MAYORS +TONNE +CASTER +GOSPELS +WICKET +GLYCOL +MEDIAL +FAXED +KARTING +BLASTED +TRIPLES +PIXIES +PANCAKE +ACCRUE +VENTED +FIRTH +SLAMS +OUTLAY +DREADED +AIRING +LOOPING +CRATES +UNDATED +EXALTED +CADRE +TABLOID +JAEGER +HATCHER +CODERS +SQUAT +VELOUR +MARTYR +ZONED +PUBIC +NITROUS +TIARA +GENOMES +SKINNED +HIVES +SEMINAL +RODENTS +KOALA +DISCUS +GAPING +ABRUPT +SEXIEST +GAMBLER +FOSTERS +LANDAU +FILLERS +AMIGOS +CROCK +BOLDLY +GAZEBO +COCKER +CLOVES +PRESTO +RETRY +TELEX +BOWED +HARDEN +MOLTEN +AUREUS +REPAID +BELTWAY +WARMLY +PENANG +EYEBROW +LESSOR +KINASES +TROIS +REUSED +HYDROXY +APPLAUD +PRIMO +ABOLISH +UNEASY +SHALOM +BUSIEST +CLOGS +FLANK +SPAWNED +CARTEL +WIENER +SEXTON +WASHES +DEPARTS +MINDFUL +LURKING +LOOMS +SPECTRE +ATOLL +SMOTHER +DUCTS +FROSTY +MARMOT +REMAND +MULES +SPOOF +MOANING +PONIES +PRESETS +BLIGHT +GRADER +DUCHESS +RAINIER +SPOUT +PERISH +SNAPPER +HEFTY +HOIST +CERES +BRAVERY +LIZARDS +FLAGGED +OFFBEAT +RELICS +RELISH +PROTONS +KNOCKS +PRIMES +FLEEING +SAULT +THRASH +TROLLS +FLUENCY +UNITING +BEHAVES +SLABS +AGATE +INCLINE +SCORER +SWAMI +OILERS +LISTERS +ONENESS +CLIMBER +GATORS +CRUCES +LACTOSE +STRIDES +VANISH +LOFTS +FERAL +RINGGIT +ELBOWS +TRUCE +KIOSKS +HOOKING +LAIRD +RESIGNS +ANGUISH +PETAL +BANGERS +HANDGUN +ODORS +CLIPPED +AMICUS +CERVIX +DRIES +GRATING +ELIXIR +MANTIS +PEEPS +ALERTED +INTRON +REMODEL +CARPAL +BUNTING +AVENGER +WAUGH +TIERS +VAPOUR +PLUCK +PRICK +MORBID +RUBBLE +CHEEKY +HERDS +PIRANHA +ADDER +WEAKEST +ASCOT +GERMS +GRAYS +FREES +SALIENT +BEEHIVE +CENSOR +SHORTY +FISSION +WIDOWED +BEGGED +FLUSHED +SCOPING +LAVISH +ROSCOE +VIXEN +WHIPS +MARCHES +BALLY +BUNNIES +OUTFLOW +RESIDED +SCARAB +SKIERS +WEASEL +RAUNCHY +TOASTED +FADES +OCTANE +BULGE +BRITTLE +BANDITS +SOAPBOX +CAROLS +TAPING +SOMATIC +FETCHED +SLUMP +NERDS +HIATUS +ENROL +LOUVRE +GLOOM +AIKIDO +BATCHES +ANGELIC +WAKES +ASHORE +WORKMAN +SWIMMER +UNLOAD +MARGE +JOCKEYS +SEATER +BADNESS +SANDING +VULGATE +STONED +FABLES +ALAND +CRUMBS +COMPS +EDEMA +CAROTID +STINK +CONVENT +SQUISH +ADHERED +JAGGED +OVERT +SQUEAK +HAIRCUT +DEARLY +DIALOGS +GYPSUM +SLIME +BROMIDE +SUMMING +LAMENT +CANYONS +DISGUST +BANKED +DISMAL +RANCHES +COCHIN +ENCODES +WHALING +CIRRUS +PATROLS +SWUNG +OUTLAWS +WAVED +HIJACK +LIBEL +ELLIPSE +ALARMED +FRYER +CAESARS +GREATS +BORON +PHOBIA +RIFFS +APATHY +STALLED +INFUSED +PEAKED +TETRA +BEARDED +GREASY +TACTILE +VOWED +CARNAGE +SKIER +CREEKS +RATTAN +CORONER +TILED +HECTIC +RAISER +SANGER +MULLEN +SNUFF +CONVENE +CALMLY +DILUTE +GASEOUS +GLOOMY +RETIREE +BUCKEYE +MARQUES +DINGHY +CLOTHED +FLIED +TALON +BLOWERS +SORCERY +ABSTAIN +BARRING +CHAKRA +GRASSY +APRONS +CLUMSY +FIELDER +POUNDED +STINT +SARCASM +COLITIS +LIANG +UPHILL +HASSLES +WARMED +PARABLE +AFFORDS +RHODIUM +BUMBLE +SARCOMA +SNIFFER +ELECTS +ALPACA +DEGRADE +FLEMISH +SHRED +MAILERS +TENTED +STEAMED +AROUSED +SIEVE +REDDISH +BINGE +PLEADS +SCISSOR +CAPRICE +HORNED +JAZZY +CATIONS +COHORTS +CENTOS +TORSION +RARITY +LIMBO +SHOVE +SYKES +FLAKE +HATING +SEWERS +SPORES +SHEARS +FLUTES +MINCED +ORNATE +UTILISE +MIDWIFE +ROLLOUT +COVETED +DIRHAM +MOULDED +CONVICT +ALBUMIN +TOSSING +POTABLE +DUMAS +JESTER +RECOUNT +MASCARA +PROLINE +DEAREST +WIPERS +SNOOPY +BOWLER +UNLEASH +WISER +GALLANT +ROTORS +BAGELS +JEWELER +OSTRICH +SPLINE +PALLETS +UPLINK +FLUNG +WARLOCK +BREAKUP +FICHE +JUROR +GOGGLE +RAILING +BANTER +AWAKEN +PIGEONS +SIGNIFY +PROGENY +GRADS +ALTERS +FLEETS +DONUT +LIBIDO +TACKLED +SHOALS +PASEO +CLIQUE +CURRAN +SATANIC +TORMENT +MUSSELS +HILLTOP +TABOR +TENET +ACETYL +BOOMER +CHUTE +BOHEMIA +FONDS +PICKLES +CURSES +MULCH +MARINAS +WHINE +LOOMING +UNDIES +PREPAY +ANKLES +SOULFUL +MOSQUES +FOULS +CANES +ALUMINA +SPIKED +EVOLVES +DUFFEL +STRUNG +HERMIT +LOCATES +DEEPEN +ANALOGS +CREASE +CANTOR +RINGERS +DICED +CARTONS +IMPEDE +CLASPS +TILTED +VICAR +PRANK +REPENT +CENTRUM +KINKS +RIDDLES +PULPIT +MARSHES +BELLIES +AMBUSH +PALAZZO +HEPARIN +BONFIRE +STILES +ELICIT +PLOTTER +SLAPPED +BITTEN +DOODLE +DYNAMO +SUMMON +LINGUA +STACKER +FORFEIT +PADDLES +PLASMAS +BARBELL +LOOSEN +SNEAKY +SMARTS +IMPUTED +COACHED +CHEATED +WILLOWS +DELFT +GRUNGE +CARNEY +FLIPPED +FRIGHT +HARBORS +ADORNED +DECAYS +COWGIRL +EASING +LAYOFFS +PICKET +MATURES +THRONES +SUING +BRINE +SNEAKER +WANING +ARMOIRE +QUEUED +PILED +TWINKLE +FLUFF +SHIFTER +SUPPLE +UNFIT +UTTERED +TENDING +SHAGGY +ORDEAL +HERNIA +FLICKER +MIDSIZE +OPERAS +BEASTIE +ROUSE +APPEL +YUCCA +SPIEL +BRIEFED +CARCASS +GIZMO +SCAMP +REPRISE +ARCANE +PEAVEY +PEBBLES +SACKED +CYSTS +STIPEND +SNORKEL +IRIDIUM +TOPPERS +AMULET +BOMBED +DAISIES +SORROWS +BOOBIES +HELMS +SHERPA +LIGANDS +SORGHUM +GROUSE +PASTED +MOTHS +EVOKE +SLOTTED +DECKING +CYANIDE +MOUSSE +CHIFFON +FANFARE +MAPPER +ARCHAIC +ELEVATE +PALMYRA +FOXES +AFFIXED +TICKING +GULLY +BRILL +WEBBING +THRUSH +BRIBERY +SMOKES +KETTLES +ASCEND +REVERB +NUTMEG +CHAINED +MAGNIFY +GAUSS +TRAVAIL +LIVRES +FIDDLER +WRISTS +SEVERED +MITES +RUBRIC +OPERAND +PUDDLE +AGORA +MACHO +REEVE +WILLFUL +PLOUGH +BUSTING +SMELLY +HANGAR +ANNEXED +UMPIRE +CARLING +BUILDUP +KEYED +ESQUIRE +CRYPTIC +PRIMUS +ENTREES +CORPORA +CHOLERA +JERKS +BULLION +HATEFUL +MOLINE +TAKERS +WALLEYE +LEMONS +BAGEL +STRATUM +WISTS +WALKWAY +CULTS +AMAZE +EASEL +CARER +POTION +OVATION +PADDOCK +GABLE +LACED +QUILL +MARES +CHAPS +LANAI +TENDON +CHIRAL +FERMI +BELLOWS +CUDDLY +DECEIT +JOYOUS +VENTING +PRICEY +SHEKEL +READOUT +GUNNER +DIMES +VERSO +GROSSLY +CRANKY +CLEFT +STABBED +BANDING +ORIGAMI +AWNINGS +DONATES +UNTRUE +HURRIED +VACATED +MANATEE +LARVAL +DRAPES +WOMANS +GROIN +BOOTED +SPROUTS +BOWER +LATTE +SHOPPED +PURITAN +FOREARM +SEAPORT +FLASHED +LONGS +REPRO +DECEIVE +STARVED +SCORERS +SITCOM +HASTILY +INVADER +SWAIN +GRUMPY +SIRENS +MOURN +SOFTEN +CATERS +TROUPE +GIRLY +ORBITER +THIRDLY +KEYLESS +CALICO +WRONGS +PORES +OILED +SHARPEN +BLURB +COINED +MORAY +CAVEATS +BIRDIE +LANYARD +HORST +NOSES +PAGERS +CORRAL +HICKEY +ERODE +PLUNGED +REALS +DEFIANT +TERMITE +BRISK +LYSINE +PONCE +PERJURY +BUSTERS +PRONTO +VISTAS +IMAGER +EERIE +HECTARE +SALAAM +JACKASS +EXITED +CRISPY +PRIORY +COFFEES +SEQUIN +CORPSES +WIPING +HOWLING +NOZZLES +RAISINS +TURKEYS +PASTING +BUTYL +SHALE +VARNA +CALIPER +ANODE +TORTS +SITING +EGRESS +ERODED +CREPE +CONCAVE +HERESY +ARMORY +SNELL +AVERT +GUISE +VOMIT +BONGO +SHAKY +BLOKE +PENNANT +NICEST +SLALOM +NECKS +CALIF +LEVEE +LURKER +CHEWS +HOODIES +PHONY +SOLES +JETTY +LUSTER +OVERRUN +UNDONE +UPLIFT +NUKES +INHABIT +RERUN +PLEATED +DIGESTS +PERILS +JERKY +RESISTS +SUBDUED +CODON +PYLORI +ACIDITY +WELDER +JUICER +ECHELON +NARROWS +SENSED +QUEUING +VALUING +ARGON +HOORAY +BIOTIN +SALTER +MORPH +TANTRA +ACCUSES +CALIBRE +NOBLES +FUMBLE +DISCOS +ROBLES +PROVERB +CLAMS +LEVIES +SPECK +GUTTERS +RUDDER +MICRONS +SCARES +MAHJONG +SURPASS +HIDEOUS +ABREAST +POMPANO +TYRANT +SKEWED +DECENCY +PAPAL +SPRANG +PALAIS +TEAMING +AROMAS +DUETS +GLYCINE +SADISM +PLENUM +AXIOMS +LABIA +SWEATY +MOGUL +VARNISH +ROUNDER +RECTUM +PERCHED +SUNROOF +VIALS +DENSELY +DROIT +RAFFLES +TEENY +BENTHIC +CARLIN +STONER +DECREES +BISQUE +SOLANO +REDLINE +GRIEVE +REIGNS +SOLVERS +LUCERNE +FIASCO +DEACONS +TUMOURS +SLINGS +DWARFS +REINS +MIDGETS +SWEATS +MASSA +HIDALGO +AURAL +LAWLESS +INHUMAN +BIGFOOT +DESPISE +FLOATED +FRESCO +RUNDOWN +AUTEUR +CUSTARD +GIZMOS +MILDEW +TOMBS +FROWN +ACCORDS +STEELS +PRIVY +FEEBLE +GENTILE +LOADERS +TROUSER +ANNUALS +SEPIA +VALENCE +DROITS +BRAVA +UNPACK +HOMBRES +DAMPER +MADMAN +PEERING +SLUMBER +CHIPPED +PELVIS +POTLUCK +CREAMER +FORTS +FLEDGED +GUNMEN +POLLACK +HOYLE +AROUSAL +VANDALS +MAMMARY +GARNISH +PEELING +BLINDLY +HALIBUT +FIFTIES +GOODY +DUGOUT +ALUMNUS +FENDERS +GIGGLE +SEAGULL +POLOS +STREAKS +JAILS +CASKET +DICKEY +DETOUR +VISIBLY +DEFUNCT +DIOXIN +UNVEIL +BRANT +LAYOFF +DECODED +SHITTY +DODGER +KINSHIP +ACUITY +POPPER +BLOUSES +HEMLOCK +UNCANNY +STORK +CONCEDE +CURATED +FALLACY +NOXIOUS +TUNIC +FARCE +CHANTS +LUNATIC +HOWDY +HAGGARD +REORDER +MANGER +CHILLS +WHACK +DRONE +BREEZES +GODLY +SPIRE +EDGING +CYMBALS +SALINA +EMBLEMS +SHROUD +ACHING +STEAD +RECOIL +RAISIN +BOBCAT +JAMMING +POISONS +MUCOSA +MISLED +STONEY +CULPRIT +CANOLA +SLICING +SPICED +NICKS +LIGHTEN +PAMPER +CANTEEN +SHRUG +BOILS +COVEY +DONNE +TABBED +DIALS +OMINOUS +MISFITS +PARLOUR +QUIETER +POKING +BUYOUT +REPLAYS +CALDERA +BASEMAN +TECHIE +TALLEST +WRESTLE +RECTIFY +ASTER +SNAILS +MITTENS +FERNS +CURLS +CRANIAL +WRECKED +WINCE +RUSHES +DEITIES +MELTS +TRICKLE +ERRATIC +CASHING +SPOUSAL +ABUSERS +DRIFTED +MALLARD +AIRMAN +SABRES +CORSETS +WASPS +MITRE +TONNAGE +CORALS +MILLE +HISTONE +OPIOID +GREENER +GRUDGE +HELICAL +FONDUE +WETTING +BOSOM +MANIACS +BALES +RAPES +REMOTES +FASCIA +FRYERS +PICKY +CRITTER +MOORING +EXPATS +BUSTS +LUMEN +PORTERS +JAGGER +FORGERY +SETUPS +JUMBLE +COGNAC +WADING +GAWKER +GAGGING +IMITATE +CYCLIST +MAGNETO +CRUNCHY +SEALANT +THORNS +MOSAICS +PIOUS +BASALT +TONAL +UNFOLDS +BROCADE +ASHTRAY +SEAWEED +VOTIVE +WAFERS +MODULO +ANTLER +TARTS +NANCE +BABBLE +NICHES +HUGGING +POSTMAN +HIKERS +CUTIES +PREHEAT +ROOKIES +FOGGY +SHONE +LEAFY +JARHEAD +MATURED +DOLOR +CAMELS +LOWDOWN +TROVE +EASED +DEPRIVE +KREMLIN +FILER +LUSTY +BUZZING +DAUPHIN +ARIAS +STEED +UNITES +CLEATS +MILLET +INVERT +GRINNED +CARATS +HASTY +DIESES +NIGGER +MACULAR +SCRAPE +PRIZED +HOMBRE +MUNCH +TRAITOR +CLOVE +WIDENED +PREPS +MALLET +LEECH +GIVER +EQUATE +NYMPH +PAJAMA +TONING +FUELING +FRAIL +CRAYONS +TIKES +AWFULLY +ARCHED +CURFEW +ENLIST +CORNEAL +PROFANE +CRUSHER +SWANK +ROBBER +ROVING +DRINKER +MODELER +LINGER +FILLET +CHURN +NIMBUS +MADRE +IMPART +MUTED +FEATS +NONZERO +TOUTED +HANGMAN +BUMPY +ALEPH +SLOPING +MASONS +SURGES +UNLUCKY +DISTORT +KETCHUP +ALIMONY +VISCOUS +LOOSING +PILING +SOLOIST +AMINE +ROBBERS +BURLEY +WOOFER +LOWLAND +SPAKE +AWOKE +PARKA +UNHEARD +PRUNE +SCOUSE +CAIRN +NOMADIC +GALENA +PROLONG +KNITS +KROON +THINLY +WEANING +ARABLE +ALKALI +MOWING +NUTTY +SEVER +MYELOMA +EXPEND +AUNTIE +AFGHANS +BLAMES +VIVIDLY +MERINO +STOOGES +BARIUM +TORIC +LOOTING +HUMMING +SHEARER +EXERTED +TITRE +TUMBLER +ADAGIO +BONNE +FLOCKS +RANTING +ERUPTED +FLING +COMRADE +PICCOLO +HAVENS +BUSHING +RAVING +LINDY +PANZER +SOVIETS +TWEETER +PONCHO +CHOIRS +FAERIE +STINGER +WREATHS +PROJET +ABSORBS +DRIER +BOTHERS +PARADES +CUBICLE +SHOVED +INVOKES +PAPAYA +CANNONS +AUGER +ICONIC +SULFIDE +GAMBIT +DALES +POLLED +EMPTIED +JOGGER +VERITY +TURRET +PRECEDE +JODHPUR +DOMES +TETANUS +CARIBE +EXECS +HIKER +WILDEST +OUTLAYS +ZLOTY +OSMOSIS +PRIMING +VOWELS +SOOTHE +LEARY +SLURRY +TAMPER +BERETTA +HEATHEN +UNDULY +WINGER +RIGGED +FANNING +SPURRED +LOGICS +COEDS +CRUMB +GUILDER +SEALER +SLEAZY +ONSTAGE +PINKY +MINTS +YIKES +GRATE +GRILLES +DEMONIC +DEDUCED +BURIALS +ARMPIT +RATIFY +GINKGO +FIEND +DRAPERY +MUZZLE +ENTRANT +PHASING +LACTATE +SKEPTIC +BACKLIT +SLANDER +BASING +BAITS +ONSHORE +FLORALS +WICKS +TOXICS +POTIONS +SQUIRTS +WATERED +FLEAS +OPTING +HAULED +TAUPE +HOOKUP +RECITE +DISMAY +SMELLED +HEALS +GROOMED +LEAPING +SUNKEN +SLIDERS +REARED +SEDANS +SUNDRY +RUNES +PIQUE +QUICKIE +SWORE +BOREAL +TRIER +FLASHY +PROWESS +DOGWOOD +SIGNET +QWERTY +MANHOOD +NEPHEWS +WILCO +FEUDAL +BASSES +BOARDED +SYLLABI +LIVRE +YONKERS +FATHOM +COOLS +EXTANT +UNMASK +UMPIRES +CHISEL +WAYWARD +LEGIT +REDNESS +WANDS +ERASURE +FISHY +PREAMP +PAUSES +GLIMMER +RADARS +BLOODED +TEDDIES +UPSILON +SIZABLE +FILMY +TIMID +WEAVERS +THYSELF +CHILLER +ROOTING +SUCROSE +MODESTY +BANSHEE +VEILS +CAJON +FISHEYE +WAYSIDE +AERIALS +SUMMITS +STYLIST +SPRAYER +GLIDERS +CORBY +BARBED +LEGIONS +LUSTRE +HADITH +LOBOS +JUICERS +HANGOUT +AMNESIA +BIGOTRY +LEAKY +PAGANS +ACTUATE +DINARS +CAPOTE +MOLAR +AFLOAT +BRUISED +DASHES +IMPEACH +ATROPHY +BULLPEN +MAMAS +EARLS +UTOPIAN +CONFERS +HYPED +DECRYPT +BATIK +ODOUR +FRINGES +FORINT +NUDISM +AFFIRMS +GULCH +HOODY +MOANED +AXLES +DILDOES +TAKEOFF +WIGGLE +HENNA +BRIBE +PROPEL +VERILY +DOPED +ARDENT +HITTERS +WICKETS +SHIMMER +TREMOR +LOANED +VIOLINS +ASTUTE +LOGBOOK +INFLICT +ROTATES +LEGIBLE +TOWED +RESCUES +SALTED +TILING +WAFFLES +DOUBLY +BREWED +ANNEXES +LISLE +FIANCE +VULTURE +MISLEAD +VENTRAL +RETARD +CANTO +WELDERS +SPONGES +REVERED +SHINGLE +TIMBERS +IGUANA +GLARING +CHOKER +TILTING +HARASS +TUNICA +AORTA +DELVE +CRIMP +LUMPS +FISHED +OREGANO +DRIZZLE +BOATERS +BRACING +REMORSE +CLOUT +SPACERS +FECES +FELLA +METERED +HETERO +LUCIFER +UNHOLY +PHAGE +FATTIES +INFLOWS +CAVING +ALKYL +LIVERY +MILIEU +INJURE +ESTERS +MEDUSA +PAGODA +DOSAGES +PRIMED +RECITED +ENSUED +JUSTLY +THROATS +BARRAGE +CURLED +PEEPING +DERMAL +PACES +EARNERS +WALNUTS +LASHES +CONICAL +MOCKING +TRICKED +RACCOON +CHEAPLY +ALLEGE +DRAPED +SUBTLY +CONSORT +SERRANO +NIACIN +GLYPH +PLUMB +TOOLED +MATCHUP +CHUCKLE +UNIFY +BRIAR +SWAPPED +MOULDS +BLOATED +PRANKS +MANTEL +ARMBAND +BELATED +STEMMED +WINDER +JUNTA +SHRUNK +CRAMMED +HATCHET +GROUT +PASTELS +CREEPER +CURIE +FARMED +HOCKING +FEMORAL +ZOOMING +NUANCES +KNUCKLE +TAKER +BASTION +TUPELO +GYPSIES +WATERY +SUBMENU +KWACHA +COILED +SIPPING +JANES +SLEDGE +STEPPER +GILDED +SAGES +TROPIC +REALIST +MIDSOLE +SCORN +WHIRL +PERVERT +RETAILS +CIRCLED +WITHERS +SPROUT +CAMPOS +BUNCHES +BAGGED +DEVIATE +HINDS +STINKY +ATELIER +VENEERS +TIBIA +PENNED +KIDDIE +CONTE +VENTURI +CHEERED +BEANIES +SOLACE +PESKY +MOLES +SALVIA +BEACONS +STUCCO +POSADA +OBITS +SHAMS +SHAWLS +BRUISES +FREEBIE +LOWES +BULIMIA +INTROS +LADYBUG +RUFFLE +BASSOON +KNACK +RIVET +AGGIE +GRUNT +DOUBTED +RAVAGED +AILING +OBEYED +EASES +GHOSTLY +MUTINY +FORESEE +RATIONS +CORNEA +BARWARE +BUFFS +TRIPLET +SONICS +RISKING +INGRESS +BARBERS +RETIRES +DENGUE +SHANKS +ORGANZA +DEDUCE +BOLTED +RABID +PROBED +FUNNIES +CUMIN +HAMLETS +SETTERS +PAYEE +JAMMED +CYMBAL +NOSED +SHOGUN +LOVABLE +QUANTA +SYNAPSE +AIRPLAY +SAWMILL +UPPERS +PITMAN +LACES +MINIMA +HUGGED +FLURRY +WARMEST +CAPPING +HIPSTER +TESTIS +AUNTS +VAPORS +GEMMA +RUPIAH +BULLISH +HIPPY +MUTATED +STREP +ROOST +AMYLOID +TENETS +DIALED +MITTS +NAPPY +FUCHSIA +MUSCAT +QUERIED +CRAYON +ROTTING +SOONERS +MARQUE +DITCHES +EVADE +REWORK +COFFS +SCOURGE +LAPIS +BANDAGE +DETACH +WEBBY +APOGEE +WORSEN +TANKERS +CRAMPED +RACKING +SHUNT +SYNCH +PATTEN +SECTS +ENCLAVE +INGLES +SENDERS +STEAMY +UPDATER +ACETIC +UNARMED +DYEING +TAWNY +SCONCES +LAYMAN +BUNGEE +VELLUM +STALKS +STANZA +MUCUS +MORONS +NOVICES +GRASPED +PHAROS +BEQUEST +BEGGARS +FLORIN +QUIXOTE +CHAISE +RAINED +TIMINGS +MERGES +TRELLIS +MYTHIC +MARRIES +ECHOING +TASKED +FLIPS +APTLY +LIEGE +USEABLE +NIECES +PAPYRUS +WIGGLES +SYNTHS +SHEIK +PINTS +GIRDLE +SIAMESE +VEILED +JAVELIN +BOUNCER +PHENOL +STARES +BYLINE +BEDLAM +ENTREE +DESIST +PIETY +EMBODY +PETITES +CRAWLED +FOLATE +MANITOU +SOILED +GOOFS +FROZE +PLEXUS +DISARM +TACIT +WARING +RALLIED +QUAKERS +PUTTERS +ASTRAY +PATIOS +FIREBOX +HINTED +MODUS +SONATAS +BULLIES +CAUSTIC +EMPORIA +LEMONY +BASSET +LIMITER +EXILED +PRETEXT +WHISK +FLARED +ARTFUL +UNMET +CATAWBA +ORDINAL +CARESS +HAILS +DOWNED +MAUVE +TWITCH +COMBED +SPORE +CREPT +FIBROUS +SWAMPS +EPISTLE +ACETONE +ALANINE +EXILES +FINESSE +NICKELS +QUARKS +REPUTED +SEDUCE +BEARERS +KIMONO +GUESSES +SHARIF +COURANT +CANNA +POTTERS +HANGED +FLATTER +DIMMER +DREDGE +CORDIAL +PUNKS +PATCHY +HATERS +QUARREL +FRITH +REMIXED +HYPOXIA +PENILE +LIQUEUR +SPOKES +PASTIME +PURSUES +BUGLE +HEALERS +FOURS +MULLET +DEVOUT +ACTUARY +LATCHES +EMITTER +PIZZAS +TROTTER +WINDERS +AVION +MORTALS +COMER +TILLAGE +LAGGED +LASAGNA +LANDERS +TAPAS +HAWKER +CALLA +DEBUTED +LAGGING +ROSETTE +SEQUELS +TRUMPS +TWOFOLD +THWART +POTTED +CHANSON +REDOX +GOINGS +CLINCH +LEPROSY +COMETH +FITTER +FASTEN +GODDAMN +BIMBO +DAGGERS +PLEASES +MOORS +TRITIUM +REVOLVE +WAGED +WAXED +CONFINE +JADED +MINGLE +YARDAGE +PURIFY +RADII +CHOKED +WHEREOF +DEFYING +OUTCAST +FARADAY +OBLONG +MACABRE +WEARER +SPOTTER +HEARSAY +ROOMY +HEROS +MATTING +CAPERS +ENTICE +NEARS +LASSO +YONDER +HERETIC +CABANA +DRAUGHT +COMICAL +WAITERS +GASPED +CATWALK +CAVERNS +BOARDER +BLURRY +MINIBUS +BUMPING +GREETS +WAXES +AMPLIFY +BEVEL +CODEN +SEDUCED +DODGY +THYMUS +ANGRILY +BELIVE +CROQUET +VACATE +NEATH +BURRITO +EYELID +BACKERS +TAMING +WARLORD +SNIDER +BARONS +SUCRE +AFFINE +STUFFS +BLURBS +ENDER +CONEY +SHOCKER +SOWING +FRILLS +RUINING +PINION +HAUNTS +BRAWL +HEROISM +OBLAST +SAXONY +DATOS +TOLUENE +TUBAL +POSSUM +TONNEAU +BAYONET +JANITOR +HOLLA +REUNITE +MOHAIR +CHORE +STEERS +JURIES +CRAZED +FONDLY +WHITHER +SIGHS +FLIPPER +EYEBALL +FLASKS +WIFES +PHENYL +BOSSIER +RAIDED +CULVERT +SPANNER +MISES +BATTLED +KARTS +VISORS +EVOKES +SPOILS +SEXIST +STYRENE +ALUMNAE +TRIAGE +PROTEGE +SETTLER +RABBLE +PIPED +SCONCE +OVARIES +DADDIES +FOLLIES +DELLS +LACTIC +CLEANLY +UNCLEAN +SEIZING +BOSON +MILLED +ANIMA +MESHES +FIRSTS +FERRETS +GROTTO +BUZZER +RIVETS +LEVELED +GRACES +TRAMS +ADHERES +RAWHIDE +DOWNERS +KNOTTED +SORTER +MISUSED +OCTAL +BETRAY +FANDOM +DEBACLE +BENNET +UNDRESS +GAUZE +GAZED +SKIPS +SODOMY +MOIRA +TENURED +RUMORED +AMUSE +FIXER +HAVES +GRANTOR +IDIOM +TANGLE +SAGGY +UPSETS +SCEPTRE +MATINEE +PLUNDER +MIDWEEK +RIALTO +BUSTLE +TRAWL +RISERS +GAMUT +INHALER +REFUTE +SPICER +SHUDDER +PARSON +FIREMEN +SLINKY +PEASE +DREARY +TUXEDOS +BATTERS +DUFFLE +HORRID +SCRAPER +DRYNESS +PARAS +GOPHERS +RELIST +DOCKERS +MANTA +COMPO +FILET +INFIDEL +VOLLEY +CARNAL +LARCENY +VERSED +LORRY +RECAPS +BRIDLE +REVAMP +ARISTA +UNRAVEL +ANDROID +GALILEE +TILLER +ORIFICE +RUBELLA +HORDES +SAPPHIC +BERYL +LEUCINE +JOBLESS +CUTOUT +SLASHED +GARVEY +SAUTE +IDYLLIC +SATCHEL +PERUSE +GIGGLES +REVEL +ALLEYS +SUTURE +MADLY +STILLER +LOGGERS +STEEPED +GRIPE +SUMMA +EYELIDS +ARCHERS +FORBIDS +DISDAIN +BRIBES +KIDNAP +FORME +MITRAL +LOWLY +DAEMONS +SCANT +SORELY +ENLACES +FLIER +MASTIFF +DAHLIA +PIRATED +LEAVERS +RAVINE +POURS +NAPALM +AMITY +STARVE +FRONTED +PICNICS +BROILER +LICKERS +ABSCESS +SKIMPY +MEMENTO +TUMBLED +DROOL +SEPSIS +CHOLINE +TRIKES +CASAS +ROUBLE +SWEETER +TALLIED +SAUCERS +KEYING +LUPIN +EIDOS +GONDOLA +SPINES +TRUFFLE +FLUTTER +ACUMEN +HALLO +SHIVER +SHATTER +PICKLED +CHICOS +CLICHE +HADES +ZONAL +CIVICS +CHEMO +NUANCE +ROTATOR +MYOSIN +CARPOOL +HONKY +ARMPITS +LEVEES +SLACKER +MUSES +BANDANA +PADLOCK +CLASSED +FREER +FENNEL +SOLIDLY +WEAVES +CHIMERA +FUTONS +FOAMING +TAILORS +TASSEL +LEANS +FIXINGS +BAFFLED +TRIPOLI +FILLETS +PHONED +DAILIES +FOILS +RETRACT +BUOYS +TINTING +BURNIE +RENOWN +MURKY +TONGS +CYBORG +YANKS +CABAL +BEGGAR +CUDDLE +DOWNER +ABELIAN +MUCOUS +POKED +SLASHES +DWARVES +STINKS +ARTISTE +SLICER +REPOSE +HASTEN +RISQUE +EARTHY +RABBIS +ADORED +CENTAUR +RAPIST +PINHOLE +PASSE +PARTAKE +DOUCHE +SNOOPER +RANCHER +GROCERS +VESTING +PANACHE +GNATS +SOLON +DETRACT +SPARKY +SYSOP +PITTED +WRECKS +DARES +SIESTA +PELAGIC +CYNIC +RUNWAYS +FROWNED +TASKING +TWEAKED +RUBIES +HATCHED +SNAPPY +TRAMPLE +COLONIC +ZIRCON +WATTAGE +BOOMS +SWIPE +UPKEEP +BILIARY +RESIZED +FORGETS +GRAPPLE +INSEAM +FAVES +CLAYS +DENIER +UNCLES +SOARED +NESTOR +FUMBLES +NITRITE +MOUSER +PESTO +WHOOPS +TANTO +VIOLETS +NETHER +HELIOS +MONOMER +NOMADS +RAMBLE +HEXAGON +LUBES +IDIOTIC +TARPON +BOUGH +RADIX +WORKMEN +GRIST +DUSTER +PRONOUN +SIGNER +SLOTH +STEELY +PULLEYS +SUBLETS +FATES +STEWS +TACKY +ANTIWAR +DRAGS +RELIVE +SHADOWY +LIQUORS +ABALONE +CREASES +NOURISH +QUIRKS +GINGHAM +TEASERS +BEVELED +PLOVER +SOLUTE +MUMPS +CHASM +HAGGIS +STYLI +EJECTED +SCRIBES +BROWSED +ACUTELY +PROFESS +RAZORS +MASSE +LEGUMES +INFLATE +WORDED +QUANT +FLESHY +SUNDOWN +RAVEL +DECOY +BALSAM +OUTCRY +PECANS +GRIME +CORDON +WORKDAY +EARED +CUTLASS +RIGOR +GUSTO +MAIDENS +HUMBLY +LANGUE +FOOTY +JOINERY +OCTAGON +EQUATES +AZALEA +TACOS +DWELT +HALIDE +GENDERS +HARMING +INSOLE +HILLY +AISLES +SLACKS +TRUSTY +SAGER +FATALLY +CAGED +RADIUM +PRAWN +PHYLUM +ALGAL +WAGING +PHENIX +ROWDY +POPES +BRAVELY +PUFFIN +SHAPER +CHEATER +LEGER +TORUS +COTTA +CLOGGED +RAPING +LEASHES +SOUNDER +STENCH +CHOCK +CURSING +MESSIER +EMITS +FLANGES +BOWLERS +THEFTS +KEYPADS +REGRESS +SPANNED +POLITY +CELIAC +RAPPERS +CUMULUS +REIGNED +WANTON +AIRMEN +CURIO +HOOKERS +AMALGAM +LOCKET +GANDER +VOILA +SAVOR +DARKLY +PLEURAL +DILATED +ANGERED +CONDONE +THERMOS +GARTERS +ADAMANT +PONTOON +TABLEAU +ANION +NUMERAL +VERNAL +TABBY +THERM +MYELOID +HANTS +FRIGATE +DAZED +HARRIER +SITED +ENTRUST +TRIPLED +PUFFS +BURYING +CHICANO +ERASING +FLEER +DEUCES +CYCLOPS +GUNFIRE +KEENLY +GOURD +GROANED +VOICING +FLIERS +GROUPER +NEGATE +DEFIES +MOPED +BUNKERS +LIGASE +PRECAST +PUREST +BODICE +FORAY +OPIATE +CARITAS +FILLY +RHUBARB +RAGTIME +VULVA +MAYORAL +FORTIS +TIDINGS +HONEYS +SILVERY +CROTON +DEPOTS +NODDING +JASMIN +LIBRI +AMICI +BUBBLY +NODAL +TEMPLAR +CEDARS +ALOFT +MATED +SNOOZE +KESTREL +PRAWNS +RUFFLED +PLUMS +FAIRER +HOPPERS +PRIDES +TRINKET +TELLY +SLURP +WISHFUL +TRAILED +ROGUES +EXPANSE +HIPPIES +PRESIDE +ARLES +OEUVRES +MUSSEL +UNRULY +STAPLER +CUTEST +ENCASED +TEMPT +ETUDES +GURNEY +BATHE +SCARRED +IGNITED +VROUW +CORONAL +TANTRIC +LIFTER +SCROOGE +NAGGING +BELLOW +GIRTH +MILLERS +CLERICS +POPPIES +INLAID +BUSSES +NOTCHED +PULLOUT +REELING +RIMMING +CRESTS +MOLTO +LOAFERS +FUELLED +TOFFEE +SQUIRES +INSURES +SLAYING +MAHATMA +PIPPIN +FRAUDS +LOBES +WINCHES +HOAXES +COALS +SHADER +GRAFTS +MODERNE +CARINA +NECKED +FEASTS +TEACUP +TOQUES +CHAPELS +TRYOUTS +MINIONS +ADAPTS +BRUNT +GLENS +RODMAN +ITERATE +EMBER +VETOED +PROTEUS +SIMIAN +APIECE +GAMMON +ISLET +GANGLIA +HEADWAY +FRIARS +MAPLES +COBBLE +SPODE +BUZZARD +PLUNGER +HALTING +CRANKS +LOWERY +BURROW +VERANDA +CYTOSOL +HYPHEN +HATCHES +TEASED +DETAIN +EYELETS +LEGALS +FLATTEN +SAVANT +LEADED +GULLS +SULTRY +SINNED +BALSA +ENDURO +CAPER +GIVENS +MUCOSAL +LENTILS +QUACK +DRAPE +SHARPS +GROOMS +OTTERS +OUSTED +GROCER +AUBERGE +PAPRIKA +CHASES +MEZZO +NOVELLA +HITHER +DIGGERS +GLANCES +SILOS +TYRANTS +GIDDY +OATHS +RIPPLES +DRUIDS +GRIDDLE +NASCENT +PRECEPT +PATINA +GIBBON +URCHIN +WOODMAN +GRAVELY +ERRANDS +HELLS +CARTES +SPASMS +UPROAR +SAVAGES +CRATERS +MOCKERY +TENTHS +QUENCH +PASSER +BROIL +HURRAH +EPITAPH +TRYPSIN +BURSARY +BARGES +CACTI +BUGABOO +CHOWDER +FREAKED +CURBS +WALRUS +MASCOTS +COMEDIC +APICAL +JOKERS +PIGLET +CRUMBLE +SPATULA +CATES +DRIFTER +NETTED +STARDOM +DISPEL +EXOTICS +JIFFY +IMMERSE +ENVIOUS +COLIC +HIRSUTE +PRELIM +FOOLING +VAULTED +WARMS +ECTOPIC +COULOMB +SAUCY +MASQUE +GLEANED +FLOWERY +SUNBURN +ELECTOR +FIELDED +ASKEW +GROAN +DUSTING +TOUTS +SHRINES +BRIDGED +TOILE +SITCOMS +UKULELE +BRACKEN +COUCHES +GIRLIE +ANTES +ARDUOUS +SLUGGER +CREEPS +STOKER +FULCRUM +GRIPPED +NYMPHS +JURIST +DUCKY +VESTAL +SPRITES +DASHING +SHIPMAN +TIRING +ABATE +VOIDS +BELLIED +DECREED +MOSSY +ADDENDA +KEYHOLE +USAGES +BOWELS +SHIATSU +CORNET +UNPLUG +PORCINE +LODGER +INSHORE +CLOTS +REDUCER +TREMORS +APROPOS +PITIFUL +LININGS +ARBITER +HATER +BUOYANT +AIRTIME +EXPEL +GRYPHON +MINNOW +SWOOP +GUMBO +NEUTER +LATED +MONTERO +VITALLY +MAVIS +CHATTED +LURED +HURLING +BREVITY +EPITOPE +VISAGE +PRICKLY +WHITTLE +ELITIST +BEHELD +MANNA +SOARS +COPYCAT +DENIALS +ADORN +DORMS +PIMPS +PROJETS +BELLES +BAFFLE +PARED +ALBINO +SLUMS +BURNET +ANKLETS +IMPASSE +PILOTED +SEXISM +SQUAW +BOUTS +MURMUR +COTTER +SQUEAKY +ZYDECO +ATTACHE +BULGING +CHEMISE +EPICS +BIONIC +LARVA +CHROMA +GROWL +GORGES +BRASH +CANONS +HYDRATE +DIURNAL +SUBWAYS +FADER +BUGGER +ROEBUCK +TYPHOID +AFGHANI +HAULERS +SLITS +IMAGED +SCALLOP +CRUSTY +CHARD +SINGLET +DRONES +KIDDIES +MINSTER +SULLY +INSTILL +INEPT +CAMPED +FRAUGHT +DROPLET +SLOWEST +REVISES +PARLAY +DIVAN +COEXIST +TRIPPED +STREWN +RUBLES +BELLING +SNARK +COPIOUS +TREMBLE +PAPAS +THUMP +WINING +ALLUDED +SOJOURN +ZIPPERS +DECAF +CALORIC +SLEUTH +SURGING +GREASED +MINAS +WILLED +YOGHURT +BRUIN +MAGPIE +ROBBING +DIMER +DEWAR +DOCKED +CAPES +SALVO +TWIGS +EPITOME +NICOL +DEGAS +JOKED +BREATHS +FARED +FLECK +CLOUGH +UNLINK +FLANKED +HOMERS +PRIMACY +POINTY +EYEING +MISTS +CARMINE +STOVER +WOMBAT +ZIPPY +ODEON +INHALE +DREAMT +GOERS +CHIPPER +FIANCEE +RHYMING +LICHEN +LAPSED +STROKED +GALLOP +BARRIO +BUGGIES +SPEEDUP +CRANIUM +POLITIC +MITOTIC +SLUGS +CARIES +PLEASER +MITER +TALKIE +MINGLED +RAFTS +METAZOA +LONGED +SHELVED +RAMMED +WAILING +SHRUGS +POLYPS +AVAST +MOANS +BUFFETS +EAVES +MARRED +POETICS +ENTITLE +ALIBI +RELAYED +JELLIES +AIRLIFT +HASHES +NODULES +PIKES +TUNABLE +MEAGER +PLUCKED +RIPPERS +DISCORD +INFIELD +PEELS +PRETERM +STANCES +HASHING +THROWER +TRIKE +REREAD +FUNNIER +STORMED +GIFTING +IODIDE +FISTULA +CENSURE +CARBINE +CREDO +FEMUR +BUSHY +GRITS +PORCHES +GLORIFY +LINEMAN +CLEAVER +OVERUSE +HAULAGE +NETTLE +GOLEM +CONIFER +FATEFUL +EYELET +BEESWAX +KITSCH +SPRINTS +INSULAR +LAGOONS +FAKED +BANYAN +AFFIX +QUIRK +BLINKS +SAWING +TELLERS +HERDING +HOPPED +FUNCTOR +HALCYON +BOWING +COGENT +CANTINA +MOLLIE +NAPPIES +SUNDIAL +TUFTED +FLAKY +PREAMPS +GESTALT +CHORALE +TIARAS +FLITE +JAMMER +CYCLASE +ADONIS +DOMED +MORRO +GELDING +PANES +NYMPHO +COOKTOP +MEDICS +DAINTY +BEATER +CRACKLE +TREKS +SPLICES +PLANKS +BELCHER +SPIRALS +PLUMES +BEETS +BETTA +REPEL +EMMET +LUMINA +ONEROUS +LITAS +HAKIM +PUREE +BONNY +HADDOCK +COSINE +PYJAMAS +SWATH +ARGOSY +COPILOT +PHOBIAS +STUMPS +CLOUDED +ROUEN +BIGHORN +GIMMICK +FOULED +WIRETAP +MONIKER +WELLING +PRODS +INCITE +DIVULGE +WARDENS +GUARANI +TAMPON +EASELS +SUBLET +PEAKING +HAREM +FUSSY +SELTZER +DELUGE +GOODIE +FLUTED +VENISON +SHOAL +BASKING +PINGING +SMEARS +EXONS +RESEAL +COOPERS +BIOTA +HEADY +DEPLOYS +CELTS +BATHED +FIVES +HOARD +LADING +CROCUS +CREAMED +MESON +CHERUB +LIEDER +STRAWS +NANNIES +SENNA +LEBEN +SPELT +BARKS +NERDY +DODGING +BROWNED +CRINGE +KAROO +UNEARTH +HOOKUPS +GAZELLE +GAUCHE +MINION +HARPERS +DRIVEL +TENDONS +THRIVES +ROARED +UNWISE +STIFLE +REFUGES +ROUSING +KNELT +DEVOUR +PETTING +GLUES +ROASTER +WARRING +AROUSE +WOBBLE +TICKED +PURGED +FATED +PARSERS +HAULER +HALTS +YERBA +SAYERS +CINCH +CUBED +UPHOLDS +INROADS +DINKY +BOASTED +STIRS +DONKEYS +HONED +SYNCHRO +CHUTNEY +AVERSE +AFIELD +CASEIN +MISHAP +LACKEY +LABORS +NORMALS +SONNETS +SCRUM +MUSING +LOPES +INQUEST +SNIPE +HAPLESS +MIRZA +HITCHES +BEAUX +GUNMAN +SHRINKS +INDEXER +PHONING +SPACEY +LEGATO +AGAROSE +BADASS +SINGLY +FUSING +ABUSER +SEVENS +LITHO +THANE +SALVE +HADRON +GRATES +FISSURE +CURTAIL +TRANSOM +TALKER +VITESSE +WINKS +BESTOW +HULLS +ENRAGED +BLOTTER +SITTERS +CLAMPED +FRIAR +CREASED +TRAPPER +PYGMY +SLANTED +PLAGUES +ADIPOSE +POTTING +PROGS +SURGED +BLUME +NATURED +WOOLLY +BLEMISH +BUSHELS +TAPERS +BOOMBOX +PANSY +EVICTED +TABLA +DINGO +DIGRESS +BEAKER +FETUSES +ARCADES +BAGGY +JEWELED +HEIST +REPAINT +SPASTIC +DICKIE +QUIVER +CUTOUTS +CORONET +TAVERNS +WIELD +ADAGE +GETTER +MIMICS +COOMBS +WETTER +CONJURE +MOREL +ADRIFT +ENABLER +STINGS +BUDGE +HERBALS +SILKS +SEQUINS +CHASERS +FRINGED +LIAISE +CITRIC +GOBLINS +NITRIDE +KNEEL +EXCELS +CAVEMAN +MASTS +GARRET +OTITIS +EATERY +PEONY +CULLED +NUCLEON +HIDEOUT +CALCITE +GUNSHOT +LENSE +BATTY +ZEALOUS +OCARINA +MODULI +PAYOFFS +DEFROST +BONGS +TWINE +METEORS +SAREES +DICTION +HOISTS +REENTRY +GRANOLA +FERRITE +AGAPE +LAMPOON +FIRMING +ANNULAR +DRIFTS +CHALICE +RECODE +PREFECT +SWEETLY +CLEAVE +FLIMSY +KINGPIN +BEDDED +COMTE +GRACED +VERMEIL +ULTIMO +SILAGE +BILGE +MORAINE +SUNBELT +CHEWY +GRINS +CHEWED +BUSBY +CHEEP +PASHA +CORRIE +SCOUR +DUELING +FALLOW +RESHAPE +LEAPT +GAINERS +WIDOWER +RIYAL +TAFFY +PURGING +SCARING +STRIDER +JACKAL +IGNEOUS +RINSED +BOGGED +TEMPERA +LACING +MYSTICS +TEAPOTS +FRESHER +BONEY +BROWS +SKIMMER +TECHNIC +SKETCHY +TIFFIN +PACER +STEERED +BITTY +LAPSES +DWELLS +KAHUNA +SHREWD +MICROS +FLACK +LIDAR +WHATNOT +CRASS +BIOTIC +EUGENIA +CROWDER +MANGLED +STAUNCH +SHAVEN +VISCOSE +MANHUNT +PAVERS +EUCHRE +QUARTS +MITOSIS +YELLS +PAISA +WRAITH +CRORES +NIMBLE +BIGGIE +DURST +SKYLARK +BRAZEN +BRAHMA +PRION +PIPERS +BUTANE +ANGERS +INKED +JIGSAWS +LICHT +BODEGA +DOCKETS +CARLE +OBJET +BUYBACK +GIGOLO +SLIVER +BUMMER +DUNNING +GRINCH +IMPURE +RUMBA +SPUNK +PINNING +RAISERS +STUNG +RETORT +ANEMONE +NINJAS +INCASE +WEEDING +EVASIVE +SYRUPS +SMIRK +CHILES +PAUSING +GRANDS +REPLETE +GLORIES +PRELIMS +PAWNEE +MANDALA +BRISTLE +TERRORS +OBLIGE +NONFARM +ANKLET +PANACEA +VIBRATE +TOADS +DEFLECT +LIBER +CHAKRAS +SAMARA +UNSUNG +LOSSY +MITOGEN +STUMPED +CRAMP +SODOM +TRYOUT +PANDAS +APPEASE +FURLONG +SHOVELS +CONUS +MOUTHED +MOXIE +GILLS +BRAIDS +FUGUE +MILDER +CARMAN +SPEER +LATHES +HOARY +PENNE +CORSE +ANDANTE +OVERTLY +TUBULIN +BEAMED +SCRAPED +CHAGRIN +PANNING +WASABI +TICKLED +SPARING +HEIFERS +WANDERS +SATEEN +RESTFUL +PINCHED +GRANULE +PURPORT +MARTEN +AGELESS +HOWLER +HARDTOP +CARDED +SWAYING +AMBLER +FIRMER +ARCANA +BACKHOE +TRASHED +LOBBIES +COLDEST +PROVISO +BAZOOKA +GERBERA +RESCIND +GLIDES +DIOXINS +GYMNAST +FORCEPS +HURLED +ADJOINT +SPLINT +LLAMAS +TOUCHY +RAFTERS +DECOYS +PARIAH +JORDANS +FRAMERS +HUMBLED +RADIATE +FELLAS +LEAVED +ATTAINS +GALLUS +OOCYTES +FILERS +SCONES +BLUNDER +BELTED +ANTLERS +POWWOWS +REAPING +DUMBEST +PROWLER +SIZZLE +DREDGED +FIFTHS +CARPORT +DUBBING +ZANDER +DAYBED +COBBLER +HEINOUS +KULTUR +MANHOLE +ERODING +SHUTOUT +LOAVES +HEELED +QUIBBLE +CHEERY +CURBING +HARSHLY +FEISTY +ETOILE +MUTTON +BLINKED +SNUGGLE +ZIGZAG +BATTEN +DRAGOON +MERRILY +WETHER +LARYNX +GRIFFON +PERDUE +CEASING +MEEKER +EYELASH +CLICKER +ACADEME +OBEYING +GUNNERS +GOSLING +MISHAPS +FOULING +DUSTED +INLETS +MUTTER +LITTERS +BROTHEL +SHELLED +CHITTY +ATAXIA +PLANING +ABYSMAL +TERMINI +BOURSE +DENTURE +FOURTHS +WAGONER +MINDING +CATNIP +RENEWS +LOWING +BULLIED +BLUISH +PUSHER +TINGLE +GNOSTIC +PARLORS +TYPIST +BRUISE +SCOTTIE +FISTFUL +STAFFER +THITHER +REBUKE +SWAYED +VESICLE +GAUGING +LIPASE +SEAMEN +CENSORS +VOYEURS +BOYHOOD +CAMPION +SCULPT +FERVENT +LIKENED +HYDRIDE +PAUPER +BROOMS +LIVABLE +USHERED +INSTEP +SEPTUM +ESCUDO +PETTER +ADENINE +PASTAS +ALEXIA +CHECKUP +MIGNON +IONIZED +THORAX +WARSHIP +PARSES +RATTLES +TROPHIC +MARVELS +QUETZAL +HOMING +WEEVIL +MORGUE +KICKERS +JUGGLE +YESHIVA +ERRANT +HEIFER +EARTHEN +UPLANDS +OPERON +SURFED +STEINS +SHIVERS +SMITTEN +RAREST +RASHES +AVERTED +EQUATED +CLOCKED +LOOSER +BOOKIE +SKEWERS +LAUDED +STEEPLE +NAILING +PEPTIC +TANNINS +PENANCE +RISKED +BOWLED +PEARLY +KIRSCH +CHARTED +ISLETS +LOOTED +WAGERS +RAVIOLI +WALLING +JOINTED +HEYDAY +TOPSOIL +ISOMERS +LEMANS +BEAMING +CHOOSER +BUGGING +PROTEA +LIPPER +CHESTED +ADOPTEE +LIVERS +PLOWING +GLASSY +RIDDLED +MIMOSA +SHRILL +HALVED +SWEDES +UTENSIL +PULLER +DINNING +MISFIT +ASIDES +RUSTED +BALLON +MISTRAL +ZEROES +ADMIRER +DIVISOR +CANDOR +VIBRIO +SEARING +WIGWAM +BUSTIER +DRUGGED +GNOMES +MARBLED +MOCKED +HOLLER +GUANINE +CRUELLY +TAPIOCA +FURROW +FEWEST +DROWSY +CASHEW +BUSHEL +CYPHER +CURSIVE +FORTIES +EXAMEN +TONGUED +GHASTLY +SUCCUMB +BOLERO +DUMBER +INSOLES +STARLET +EARNER +ZOOMED +GROUPIE +LAMINAR +FORKED +COWARDS +CAMBER +CAPTORS +GUTTED +ARMING +AMASSED +FELONS +DEARTH +TARMAC +DECORS +RICKEY +SWELLS +CHARADE +BOBBIN +DOINGS +DUMPER +SILKEN +ANAGRAM +FOGDOG +SEEPAGE +POPPERS +RAPISTS +SEABED +RECTORY +DIPTERA +LOOPED +MYELIN +HANGUL +CURRANT +ODDITY +APHIDS +PUFFED +CRUSTAL +HACKMAN +SEDUCES +SAWDUST +LEAPED +EMBERS +PESETA +BALLETS +SORDID +SNOWING +BLEEDS +AVENGE +SPORTIF +YARROW +FICKLE +POLICES +DOGGING +ROTUNDA +FAINTLY +ZAPPER +ROPING +DECKED +CHOPPY +VANDAL +ROMPER +DWELLER +BITUMEN +NIMROD +SPLICED +GUNNING +BEARDS +TADPOLE +CANTER +BERSERK +FACILE +COERCED +BILLETS +SNEEZE +SOMBER +SHARDS +ADVICES +WHIMSY +COFFERS +ICEMAN +CLUMPS +PEGGED +DEPOSED +KETONE +GLAZER +FORSAKE +BABOON +SWAMPED +ENSUES +TENUOUS +ELATED +LENTIL +BACKER +ALBEDO +ANGORA +STUFFY +DEPRESS +CLINGS +KITTIES +HUBRIS +WAIVING +SWIRLS +DAMPERS +DAWNED +SEIDEL +BAYARD +FARROW +DINGLE +RELAXES +MALAISE +POSTDOC +BICEPS +HYDRANT +ROCOCO +PRESSER +CHAMOIS +URETHRA +SEARED +TINGED +LEEWARD +AMINES +TUGRIK +FAKING +RISOTTO +ANAEMIA +JUNGLES +SHREDS +BOXCAR +POUNDER +KRONOR +ARCHWAY +OVERSAW +LOUDEST +CINDER +VIADUCT +LAURELS +TREKKER +GLYPHS +ALIGNS +RECOUP +NAUGHT +WARHEAD +PRISMS +COINAGE +ENDGAME +PLANER +DEFRAY +DIMMING +ZEALOTS +WEIGHTY +OEUVRE +GASPING +IDIOCY +REVISOR +PENDENT +KLEZMER +EDIFICE +VERMIN +ISCHIA +INCURS +LOBBIED +GALLIUM +SORBET +STEEPER +TOPIARY +BUTTERY +CRONIES +PIPETTE +SOUNDLY +WICKING +AUSTRAL +WEAKENS +LARIAT +REDRAW +TRIFLE +POOPING +BERTHS +RETAKE +MARENGO +QUICHE +RESALES +MADURO +UNDOING +CASSAVA +GRIPPER +NEGATED +PURVIEW +BOSQUE +EULOGY +BABBITT +GALLOWS +DEVOTEE +FABLED +SMELTER +MANMADE +SAGGING +STATICS +CUPCAKE +DEFIED +ERRAND +YEOMAN +RAGGEDY +COERCE +ANNEXE +SOBBING +MUSLIN +HUGGER +PREQUEL +SHEKELS +THORNY +PONDERS +SEALERS +ERRATUM +FOXTROT +TESTES +ORIOLE +REUSING +SHINER +RHESUS +THRUSTS +GIVERS +FARAWAY +OSTOMY +INGEST +GAZEBOS +SIRLOIN +ABOUNDS +SALUTES +POTASH +LAPPING +WYVERN +MUFFLED +INLAYS +LOCKETS +WHITEY +FOILED +FLOCKED +DIALERS +ROSELLE +TETHER +TOUCAN +PULSING +OBLIGOR +MATCHER +HERALDS +LESSORS +KARATS +AMIABLE +URINAL +HINDERS +TUBERS +CLONER +JERKED +OPULENT +WADERS +SQUALL +CHOKES +CINQUE +BOWERY +OUTLIER +FERVOR +EXOTICA +SCOOPED +REEFER +EXERTS +IDLING +LEPTON +CURSORY +BATSMAN +REFUTED +PENISES +VELVETY +TERNARY +TEEMING +PANTING +COMERS +ROMAINE +LUNACY +SIGNERS +LOATHE +CENTRA +HUDDLE +ADENOMA +TRUANCY +TAXICAB +MIDLIFE +COUGHS +ROOTER +WIDENER +ONETIME +GATING +WIDENS +RINGED +BAGGING +HUDDLED +MALACCA +CARRION +PLANTAR +BRACED +BRAISED +SPIGOT +NAILER +COUPES +POLLUTE +CHARING +PRETZEL +WARPING +PRONGED +BARING +JACKED +TARTAR +REJOIN +SNIPERS +GOSPORT +RUBRICS +HARKEN +CRAWLS +GREAVES +SMUDGE +PATTIES +GAMBIER +SMEARED +HERDER +OUTFALL +PARASOL +CONCURS +FARTING +ATOPIC +CULLING +STINGY +ZEALOT +DEVOTES +SHANTI +VIGOUR +SNARES +MORTARS +DUCTILE +WITHER +SEAMED +CALMED +PISSES +VIPERS +TASTER +ARBORS +PUNTERS +DROPPER +KRYPTON +CHUCKY +BUSHMAN +FOREGO +RICOTTA +HUMIDOR +BROILED +INSIDES +FARINA +CUTAWAY +DEFRAUD +TOOTHED +BYGONE +CLICHES +EXHALE +LIKABLE +ALTARS +STANDUP +FLEXION +KINSMAN +FOOTERS +MUTABLE +SPUTNIK +COFFINS +CASHED +USHERS +BARFLY +ANNOYS +RACKETS +DUCTED +CRISPS +HEIRESS +DRESSY +GODHEAD +SHYNESS +PICKERS +ANGELUS +MOMENTO +FRAYED +WOOLEN +CUTICLE +PIMPLES +SHORTED +SPUNKY +READIES +LITANY +FAIREST +NUTTER +LARDER +SYNCING +OBELISK +CLARET +CANZONI +WOBBLY +DENNING +JESUITS +MOTTLED +LOCKUP +TOSSES +PUBLICS +UNLOCKS +THRONG +RINSING +PREEMPT +SHUNNED +RESOLD +WIPEOUT +TURNIP +CRUSHES +GUSSET +BANISH +PUNTING +SCHISM +TIDBIT +DOGGED +FERMION +PINYIN +MESSES +TOPPLE +PUNGENT +WAIVES +REBOOTS +FANZINE +TECHIES +CANVASS +RADISH +BAITING +SUNSPOT +RETYPE +ELATION +COWBELL +FELLER +TRANCHE +ENMITY +SANCTUM +SOUTER +BOATER +WEIRDO +RACKED +STAPLED +FANCIED +SPOILT +STRODE +GRAINY +GIGGLED +TITULAR +SWEARS +TRAPEZE +EXTENTS +SUNBIRD +PARING +DAMNING +HUMBUG +AILMENT +HOMELY +SHARPIE +CURRIER +TAPROOT +DINERO +SHOVING +MENTHOL +SUBNETS +MENSCH +FROGGY +BAGPIPE +COCKED +DRIBBLE +GOBBLE +MYTHOS +COLLOID +BREECH +OXIDANT +PYRITE +DRUNKS +KIDDER +PARQUET +DAMASK +BATTED +EMOTIVE +PAPACY +THIMBLE +RACISTS +ABLAZE +SPOTTY +THAWED +LOAFER +SKYDIVE +RETINOL +FAIRING +SWISHER +HOTSPUR +FJORDS +COLLATE +INVADES +DIPPER +TALKERS +SOCKEYE +BYWAYS +BECKET +BLUNTLY +ASSAYED +DERAIL +GOBLETS +TOUTING +CRAPPIE +CLONAL +DIGOXIN +DIORAMA +AMAZES +PRATER +ENDERS +GRIPES +SPIFFY +CURIAE +NUANCED +RATTLED +TRAMWAY +SLAYERS +REAPPLY +DAMPEN +SNOWMEN +RHIZOME +IMBUED +BUREAUX +LEOTARD +LOOPER +IMPEDED +POMPOUS +SUBVERT +MUSCLED +CALLAS +TAKINGS +TRIPLEX +MOUTON +CAMEOS +CASINGS +SPARKLY +SPUTUM +MONGOL +PEELER +REPEALS +DUCTING +FANTOM +ALPACAS +POWDERY +DIVERGE +RADIAN +JURIED +GEYSER +UNTAMED +SHODDY +MENDED +NOTCHES +ABJECT +RIVETED +KISMET +DRAFTER +DEEJAY +HOOKAH +PITTING +ETHERS +FITTEST +TARNISH +ISTHMUS +TREADS +MAYDAY +HONING +DEFTLY +RAUCOUS +CURIOS +HAIRPIN +TOASTS +LITMUS +TOOTSIE +BLUSHED +SADDEST +SPOOLS +MEDICO +GRINDS +EXEMPTS +COULEE +BUGGED +RIBOSE +LEFTIES +FAGGOT +BLOOMER +BARROWS +SARONG +LUMPED +SCRIBED +BORROWS +FRIGID +BUTTERS +ARMREST +WOOLLEN +ASHRAM +IMPAIRS +CARAFE +ENTERIC +MARIMBA +PEACHY +WINDED +MYOPIA +RAMBLES +DIATOMS +BLUNTS +INTERNE +DAWNING +CAPLETS +WINGERS +SEMPRE +TRACHEA +NUMBING +COLLET +FLIRTY +OSMOTIC +EGGERS +KNITTER +CLOTHE +SWELLED +BELTING +SNIPES +STAKED +RIGIDLY +SIMILE +PHALANX +SLOPED +BALLER +SIFTING +MEANDER +GROANS +CANKER +KEENER +AUDIOS +BUSILY +POACHED +HAILING +SLUMPED +GLUING +CAPTOR +GRAZED +JOULES +THRIVED +ASCRIBE +STALKED +DELUDED +NITRILE +LABORED +SMACKS +TROUGHS +PISCINE +SKILFUL +BOLDER +ENDURES +XYLENE +GIRDER +BISMUTH +INTENTS +PRUNED +LANTANA +WEDDED +LASHED +SHRIVER +WHALER +SMACKED +TRUSSES +ZOSTER +GROOVED +PLAYAS +INTITLE +ALCOVE +UNGODLY +FELLING +HAZING +MONTES +SKYWAY +BOTCHED +MICROBE +NECKTIE +MATRON +SEAWARD +CIPHERS +NIBBLE +FLEECES +PECKER +ADOPTER +DECAYED +SAUTEED +ODDBALL +HEDGED +MINTER +TAPETA +VICEROY +POWTER +YELLOWS +DRILLER +MUMMIES +PRETEST +TROWEL +BESEECH +HITCHED +BENZYL +STIFFS +ENCHANT +AUSTERE +EARTHS +COWHIDE +PLUMAGE +TENORS +RAPIER +HAUGHTY +OPIATES +SALAMI +CADAVER +YAWNING +PRUNES +REDONE +MALLOW +DURESS +ATTUNED +HERONS +RAIDING +BANGER +KWANZA +DOABLE +RAMMING +REENTER +INBOARD +CABOOSE +QUATRE +FITTERS +STOKED +CEMENTS +BOUDOIR +GLADES +CRUTCH +RIOTING +AMYLASE +UNPAVED +TURNERS +DINETTE +DIMPLES +HESSIAN +ARDOUR +LEVANT +HILLER +PETUNIA +SLEAZE +GREMLIN +SUNDAE +LIFTERS +RHINOS +LEEWAY +OFFENDS +WISEST +SHACKLE +KABUKI +ITEMIZE +SPLINTS +AIRSHIP +CESIUM +YIPPEE +SIPHON +SCANDIC +AVIARY +TRUNDLE +HUSHED +CADRES +COGNATE +MARKKA +FLUSHES +RESTATE +SANDED +BOUVIER +GODLESS +BIRDERS +BRAZING +MEDIAS +HINTING +VENTER +OMICRON +MAGGOT +BAILIFF +HOUSER +INFUSE +DEFACED +PAMPERS +MOORISH +BOBBING +MACHETE +PATHOS +SMARTLY +LAMENTS +MENORAH +ROUSED +CHARRED +VALIDLY +REMATCH +CHUTES +UNSOUND +HATTER +LINSEY +TAKEOUT +BEARISH +SORREL +REVERIE +PHONON +CALLOUS +JINGLES +GAINER +SOFTENS +FLANGED +SINUSES +AMPUTEE +UNDYING +STUBBLE +CADDIES +KNESSET +SPLINES +UPTIGHT +ACTIVES +DOODLES +HATTERS +GRINGO +SOOTHES +BELUGA +COMPELS +DIATOM +BOBSLED +LEGUME +REDIAL +DAMSEL +DECORUM +TAFFETA +LENIENT +RIMMED +HYPHENS +EFFLUX +MEDULLA +MOORED +PEERED +BONITO +ZEOLITE +SCRAPPY +MAXIMS +STROMAL +JEZEBEL +REVERTS +PURINE +FROLIC +CASSIA +LAMINA +TOPPLED +MENDING +RERUNS +PLAZAS +HURTFUL +WITNEY +ROASTS +STRAYER +ERUPTS +SWARMS +CHIVES +ORATORY +SEPTAL +SPRAINS +GROWLED +MASJID +NEBULAE +FISTED +GENTLER +INFECTS +SQUATS +STUBBY +IMPALED +FORAYS +SICKLY +FLANKS +CURBED +RETEST +DIESELS +BANJOS +GEODESY +VALUERS +PITFALL +MINDER +ORATOR +PINATA +MOPEDS +STEPPE +PLOWED +LINGERS +LEMPIRA +RECAST +BURSAR +CHASTE +BESTIAL +RESTOCK +LINEUPS +OOZING +BOOKISH +SUBDUE +RAKING +GILLIES +BOWYER +GROMMET +RUCKUS +WETNESS +BINDERY +TANTRUM +JUICED +FLEXING +TRACERS +AWAKENS +AMOEBA +DUVETS +SORTIE +WITHAL +METHOXY +BARMAN +BROMINE +RAMPART +FACADES +MOURNS +FERRIC +CONCEIT +NEEDFUL +LOCUSTS +THATCH +BAMBINI +EMBOSS +MEIOSIS +GRUNTS +THICKET +PRYING +RASCALS +STOCKER +RUDELY +LACUNA +LUTEIN +BIRDIES +QUEERS +RADIANS +FLARING +YANKED +MINTED +LECTIN +TILAPIA +SLASHER +OXFORDS +GRAFTED +PROPPED +STAKING +BEDOUIN +FANCIES +PEEVES +ACCUSER +ANIMAS +SULTANS +FINCHES +BASQUES +MULLAHS +LOWBALL +CITRON +GROSSES +TACKED +OILSEED +STIFFER +SLATES +ALLELIC +BIRDMAN +LAYETTE +TIMBRE +SCROTUM +CLASPED +PECKING +GRIEVED +TALLIES +SNIPING +ENTERAL +RELIEFS +TASSELS +WHITER +REGALIA +PEERAGE +TABOOS +STORIED +VERBENA +DOUBLET +TYPESET +MOSSES +BONING +SUBSIDE +JARRING +WATTLE +STOLES +GLIOMA +TINSEL +ADVERB +MUMBLED +PRUNUS +LAZILY +CATTERY +JEEPERS +FOLIAR +CUESTA +CANTATA +HAKEEM +NACHOS +HILLIER +SHANDY +DIPLOID +TOGGLES +CALVING +OFFSIDE +CASTES +MASSIF +SHRIKE +DAIRIES +BIOGAS +PLUNGES +SERVOS +ASEPTIC +DARKEN +DEFAMER +SHAPERS +GOUGING +ACYCLIC +FULFILS +RUFIYAA +MITTEN +DALASI +HERIOT +REPRESS +MOIETY +STEEPLY +DARNED +AMPERE +PEEKING +DENSER +LIGNIN +GUSHERS +DEBITS +SKIMMED +LASSIE +SPEWING +ERASERS +LOREAL +PUMICE +STATOR +COMBING +DOVECOT +INDIUM +DEEPENS +BLATHER +HEAPED +ORACLES +UNTIED +QUINCE +HANSEL +DAYLILY +CRANKED +MONTANE +PIECING +QUARTO +HELICES +BRINDLE +CREEDS +OUTRUN +BENDERS +TAURINE +SHANTY +VOIDED +RAPPING +DIEHARD +GEEZER +SWIVELS +BRAVADO +RAVINGS +SADDLED +CRUSTS +TIBIAL +TRAWLER +BIFOCAL +UNSOLD +OPINED +BINNING +FALTER +CHATTY +PATACA +SACHETS +TITRES +SCALPEL +FAERIES +FASCIAS +WEDLOCK +STYLER +OBTUSE +CAUDAL +SEXTET +STERNLY +CHANTED +SAVOUR +LUPINE +GOURDE +GELATO +SOFTEST +SNIFFED +BABBLER +TENSES +SPOOKS +PYRENE +PREFAB +REWROTE +YEASTS +TECHED +BUFFING +SEIZES +APHASIA +COHOSH +ICICLES +FESCUE +FLAMED +GODSEND +DOORMAN +RUBBERS +SWOOSH +SUBSEA +INJURES +PIGTAIL +RELOADS +STRAYS +FOETUS +PUNTER +DOLLIES +INDICIA +EXCISED +DAMPED +FORLORN +WHACKED +METICAL +LEANER +SLIMMER +BATONS +SOCIALS +CALMER +PASSERS +SCREECH +FETCHES +CLOBBER +PALTRY +THREES +TREMOLO +GOULASH +BECKONS +TURBAN +GOONIES +RUFFLES +GAITERS +ZEBRAS +SCOPED +CURVING +ALLIUM +TANKARD +TOASTY +AMOROUS +SHADERS +WEANED +DRYLAND +PECTIN +GRUMBLE +WRONGED +MUSICS +LABOURS +FLATLY +HARSHER +TIPPER +ALIGHT +EPOCHS +GENIAL +LANGUES +SNOWED +CACHET +FORTIFY +CHERUBS +CANZONE +TOLLING +FLEURY +PUMPER +BUCKING +BAFFLES +OBVERSE +INFAMY +DAPPER +BELFRY +ELYSIAN +ODIOUS +WHERES +SUTURES +CYCLED +COBBLED +IMPARTS +JOGGERS +QUILTER +LUMINAL +THAWING +STRANG +HOVERED +STUNTED +PORTICO +BROADS +EXCITES +WEASELS +PLACARD +DEPORT +LEMMAS +SLAMMER +KARMIC +INKING +JITTERS +DOBBINS +PERUSAL +DELVES +BOSONS +CALLAN +CLOAKED +LICHENS +FRESNEL +CARTERS +TITLING +SUNFISH +FACIES +BELLMAN +PLIABLE +BACULA +MANTUA +CHUCKS +RAFTER +DISSECT +HEXANE +BLAZES +OLIVINE +GOODLY +GESTAPO +BRAMBLE +DALLES +HOLLIES +RIMMER +ENACTS +CANASTA +TOOTING +SCALARS +ANTHILL +LATHER +BALDING +QUASARS +STRAYED +QUAKES +GAPPED +PASTES +GERBIL +WEBWORK +PLUCKER +HICCUPS +SILVERS +JURISTS +CLOAKS +GLAZES +FINIAL +POSSES +PERCHES +CANDLER +SCRAPES +WARTHOG +VETTING +GOALIES +JOINERS +MANTRAS +REMADE +GRISLY +FIGURAL +PISCINA +TRAMPS +WINKLE +MESONS +BROGAN +OMELET +QUIRED +FOLIOS +LAZULI +DICTUM +THORIUM +LORRIES +LEDGES +CATLIN +SWINDLE +CANDIED +SCALER +GABBER +FRIEZE +CLUNKY +POODLES +YUPPIE +BARYON +SUNNAH +UNBOXED +WRECKER +SULLEN +UPSTART +REFOCUS +CROUSE +BEEPER +REMAKES +SEQUENT +RETRIES +DONNAS +RALLYE +WAILERS +FORBADE +WOOFERS +PIECED +OOCYTE +ARCHING +GOURDS +WORSTED +ACORNS +ROWERS +VAGRANT +EMPTIES +DOMINOS +DECIBEL +JOSEPHS +MORGEN +DORMER +STASIS +PYTHONS +BARRIOS +PANICS +ARNICA +EMBARKS +TALONS +DUALISM +POUNCE +PANIER +DUALLY +VALOUR +FACTOID +WEENIE +TWEEDY +ARRAYED +STAMPER +HISSING +JOJOBA +OUTCROP +TOPMOST +INTRUDE +OPIOIDS +BEHEST +CHARMER +LIPPED +INFIRM +PONTIFF +QUAGGA +MENAGE +SCABIES +NAPPING +MOMENTA +BOUTON +WINGMAN +DIVEST +ABATED +POPLIN +TINIEST +CASKETS +AURORAL +URINATE +LYCEUM +HARLOT +RAVAGES +UNLINED +HUMANLY +ABIOTIC +PEDDLER +GLARED +ADVERBS +HOBBITS +MIKADO +GUNNED +THROES +CROWBAR +NETTLES +CRUISED +LASHING +THEISM +TABLING +FLOATER +TROIKA +RECLUSE +STONING +BLACKER +ASPIRES +ISOTYPE +BRAINY +PATTED +CLOTURE +CALCULI +VICTORS +REVELS +SUGARY +DROVES +BOOKMAN +PHRASED +PUDDLES +PENNER +PARDONS +DEFUSE +WHISKER +RIGORS +BOOBED +BLOKES +LATCHED +SPAWNS +CRAVERS +CLASHED +HOLDALL +HARPOON +REINING +SOMBRE +HEARSE +ROAMED +FATTER +DEFLATE +CANNERY +MANNOSE +GAUCHO +CHASSE +CREPES +SENILE +COBWEBS +HELLISH +HOMINID +UGLIEST +TRUMPED +GRAVER +KERATIN +TORRID +TILBURY +HUTCHES +ENGRAVE +BAUXITE +BARRACK +GOUACHE +PLUSES +MYOPIC +LYSATES +SNUGLY +FEVERS +MUDDLED +CODONS +EVOKING +HOARSE +CURRIES +SLINGER +CLIQUES +DELVING +MALLETS +FLOORED +HAGGLE +MIDLINE +BEATERS +IMPLODE +PHONIC +STAGGER +CRUSTED +GANTRY +TURRETS +SLITHER +JUGGLER +MOCKUP +WORSENS +STIFLED +URINALS +SAMSARA +TEASES +LIONESS +SCYTHE +HEAVING +HOMILY +PENSIVE +PASCHAL +UPSHOT +SHOWOFF +SIFTED +RUFOUS +COWLING +FERMENT +BUSIER +PHENOM +WARMUP +THINNED +FOODIE +FLAPPER +AIRCREW +SEABIRD +HOISTED +AUTEURS +WASTAGE +DIMMED +MOMMIES +BULGES +SCURRY +GROWTHS +OUTBOX +TOTING +FIENDS +GARBLED +STROKER +TALLOW +ANIONS +TICKERS +INTRONS +DIMMERS +UNKIND +MISREAD +AFFICHE +SPOOFS +PAUCITY +HORSEY +THUMPER +EERILY +SLOUCH +AMULETS +CARGOES +BIOPIC +EYEBEAM +EDDIES +JOISTS +DISOBEY +ALUMNA +CHROMED +SAVOURY +HUMVEE +IRISES +CLEAVED +BLARNEY +NICKLE +MAGNATE +PILLAGE +TEETER +GADFLY +SCRUFFY +BARONY +VIBRATO +CADDIE +EJECTOR +ISOMER +TAMPONS +CURABLE +GUINEAS +SWERVE +PANDIT +LECTOR +BRISKET +CAPRIS +RAMPING +VEGANS +PLUMMET +DEPLETE +CASUALS +BAMBINO +TUBULES +FRAILTY +TANGIER +OUGUIYA +PREWAR +BATEAU +RAGWEED +VETIVER +REOPENS +BOXWOOD +CASSIS +STENTOR +PROVER +BROKING +SACRAL +WILFUL +TWISTY +ERUDITE +WESTER +BITCHY +SPRAIN +PLATEN +CHISELS +PHONEME +ABIDES +SPOOFED +STROVE +TALKIES +STUTTER +RETICLE +COPTER +BONKERS +VERDANT +SECRETE +LOUNGER +BEADLE +COCKNEY +PENNING +GAMMONS +NODULE +PAELLA +HANDOFF +LEECHES +CONVOYS +OSPREYS +SHAPELY +MULLAH +WHEELIE +PREEMIE +SPAYED +REFINER +TOURER +ICICLE +HOOVES +HOTDOG +GALLEON +KETONES +PRIORS +CHAFING +BETRAYS +SUNROOM +INWARDS +REGROUP +SCAMMED +SOILING +JACOBUS +GERMANE +CHIMPS +MOURNED +FRISKY +WOODCUT +RACOON +THICKLY +CISTERN +FIBRIN +PHAETON +PURISTS +CALIPH +SPEEDOS +FUNNELS +CUFFED +TUMULT +CURATE +DONNED +VIXENS +TARSUS +AMAZONS +CANINES +STROBES +BHAKTI +TRUEST +GHOULS +SNITCH +FELLED +TINNED +PATTER +COMMIE +BEANBAG +BOOTIE +SNARKY +BUMMED +SIDECAR +WINTRY +BILAYER +SKEETER +ANEMIC +SHAMED +CARTELS +ELUDED +MILTER +SQUELCH +BANZAI +BEREFT +SEAWAY +VITRIOL +VESTRY +RUMBLES +ASCITES +FEBRILE +MERCIES +MANILLA +GLOBIN +TAILLE +THRALL +BARKED +AIRFOIL +LIGNITE +SCORNED +THICKEN +BLAZED +CUPPED +MAIMED +DERNIER +PETREL +PUFFING +WIELDED +LAVAGE +CASTORS +HYMNAL +FINIALS +TRESTLE +SOUFFLE +SPIKING +AXONAL +VINYLS +MULLING +SIGHING +PERGOLA +SHRANK +CUPPING +PINEAL +EARACHE +BUDGIE +UPPING +KNOLLS +IONIZER +UNWELL +WEDGED +EVADING +DELTAS +STRIPER +REDFISH +CUBISM +SHRIMPS +STIRRUP +FLOPPED +SUBTEXT +LOOTERS +STUFFER +GLUCAN +CURLEW +MINNOWS +SALSAS +COFFRET +THALER +BRISKLY +HUMORAL +SNAZZY +SUBPLOT +INGROWN +HUSKER +AFFRONT +BAILEYS +OUTTURN +VINING +RIPSTOP +MOGULS +MURMURS +GLEANER +LAPPED +RIDINGS +CLAWED +CHOKERS +NABBED +TANAGER +WINSOME +CAPSID +EQUALED +GASSES +EMERITA +LONGBOW +QUILLS +ERASES +SCALPER +TARTANS +GRAYISH +HARING +ETHANE +PUFFER +HOMERED +IOLITE +RECLINE +FLUVIAL +CANDELA +HEEDED +WHAMMY +COLLARD +SACHET +DRAKES +ROUSER +VETTED +TITERS +TYPISTS +LEDGERS +SHRIEK +POSITS +FAECAL +REHABS +DEICIDE +BUNGLE +PROBIT +CROZIER +SOLITON +POKERS +CROPPER +GROPING +CABANAS +TAGGER +SHORING +MEDIANS +MUTATE +ASUNDER +STATIST +QUALMS +SHEAVES +POLEMIC +ARMOURY +HUBCAPS +STILTS +HAPTIC +KNOCKER +ROOFED +STOREYS +SHERBET +INSTAL +VERNIER +CAHIERS +HOTBED +BREADED +GUSHER +HEMMED +MALATE +POMFRET +NIBBLES +CORNICE +MUSKET +TANNERY +BUCKLED +KINDLED +SPINOFF +REPUTE +FAECES +RIMLESS +WISTFUL +ADMIRES +MORONIC +HISSED +TIRADE +SELLOUT +PRONGS +FUMBLED +RATERS +LANCERS +MARSALA +UPSURGE +PEEWEE +CONGER +TUGGING +HECKLER +FISSILE +UNEASE +BARRET +PARKERS +WHIPPET +CHICANE +FEEDLOT +GAMELAN +SATORI +UPTURN +MUDDLE +SHEARED +UNAIDED +BLADED +BAILED +CURRIED +CLAPPED +SQUISHY +BOGGLE +EXUDES +RECEDE +SHAMANS +SWANKY +STEROL +SMOCKED +OBJETS +FAULTED +MASTIC +MAGGOTS +BONGOS +CANING +SNAGGED +DOCENT +MANORS +CARAWAY +EARSHOT +SAILER +BATSMEN +TURBOS +EIGHTS +COUGHED +FILIAL +NIGGERS +THIAMIN +TUGBOAT +BORAGE +SLEWING +DEANERY +KIBBUTZ +REGNUM +MIDRASH +COMMODE +POSERS +SNEAKS +ADORING +TRODDEN +HUSKERS +DEBITED +DIKTAT +REAPED +CICADA +SAGUARO +ENJOIN +BOYISH +NEARED +COBRAS +REAMING +CARVERS +ANILINE +DECODES +GRATER +PEYOTE +RIGOUR +OXALATE +EVINCED +ARISTO +AFRESH +FREESIA +MUSKIE +DUCKED +SITUATE +LOOMED +CLAMOR +DEVISES +DITCHED +RESEDA +WHALERS +WRESTER +SMUGGLE +ACCRUES +GALLET +HICCUP +TITANIA +FLAVIN +PLASMON +NICKLES +STEWED +STOWED +PIDGIN +SQUEAL +DUCKING +SCORCH +CELLIST +RUSTING +SLICKER +BOLLING +HEMMER +FALSIFY +SWAGGER +FLICKED +ARBOUR +HADRONS +HELLCAT +MANDREL +VALINE +ACTINIC +OFFLOAD +PONCHOS +DETOURS +BRAVEST +CREVICE +DIMERS +SKEINS +SEMPLE +HUMMUS +FOXTAIL +FORGES +LOOSED +MADCAP +HYPOXIC +CRABBY +BURLAP +RESCUER +PROPYL +EQUIPS +EPITHET +BLONDS +ELUTION +MONGOLS +CAMPHOR +RUDDOCK +DOZIER +COMINGS +CRINKLE +CAUSEY +EDIBLES +KAMALA +TEARFUL +BETWIXT +PURPURA +MASSED +DYSPNEA +SHIRES +MANTELS +STOMPER +SORTIES +REVIVES +SUITORS +FORKING +WIGGLY +SLEIGHT +TRICOT +SHUTOFF +SKIRTED +KIRKMAN +BIGOTS +DAYBOOK +RECKONS +PUZZLER +FAINTED +FLESHED +WINKING +WALLABY +HOVERS +GROSSED +COTTONS +MULLED +DAZZLED +INBORN +CONSULS +NEWNESS +ASCETIC +KHALIFA +RUSSET +SPECIE +GILDER +PATELLA +REFLOW +MORPHS +SLICERS +METTLE +BULGER +PLACKET +FORMATE +INSETS +LYSATE +BIGOTED +FORMERS +LILACS +LEVYING +BUOYED +MALADY +TAVERNA +TEMPERS +QUININE +OLEFIN +PARKAS +FESTER +RETARDS +SAINTLY +NONFAT +GRUBBY +WOOING +HIPPOS +MOONLIT +MELANGE +HOOPLA +LITHIA +DEMOTED +NULLIFY +REFINES +INFARCT +ABORTS +ENVIED +CORING +REZONE +NURSED +SQUIRM +ALTHEA +TRIPPY +SACKING +CLAPPER +SETTEE +DRIEST +UPSWING +FLAUNT +DASHER +GUNNERY +REAVER +CALLUS +SHIFTY +SNORTED +UPWIND +NYMPHOS +FITMENT +LEMMING +APPENDS +BUTTOCK +ERGODIC +RETRACE +SPLURGE +BOMBARD +MAGPIES +MISSUS +HASHED +SWIRLED +DARTED +WARLIKE +COLONS +FRETTED +BEGONIA +GAUGED +DIETERS +ROACHES +NOUGHT +SINKER +EGGNOG +PULSARS +CORDING +SCEPTER +SCRAPIE +ENTICED +SCHMUCK +EXCLAIM +REHASH +ENLACE +CLAVIER +PURIST +DISHED +CORNED +HONOREE +OCTAVO +BAILOUT +BICOLOR +ANNULUS +NEWTONS +LURING +WHISKED +FLIRTS +WITTED +SIGNORE +COLDLY +ENVOYS +STAVES +GROUCHY +MOBSTER +RIVIERE +AVOWED +OODLES +BRAZIER +ARCHON +DOCILE +CANTONS +WRIGHTS +SUBITO +TANGLES +PARADOR +MEANEST +REFUTES +SEXIER +HOLLOWS +DECILE +MUMBLE +MINIMAX +OPPRESS +COVERUP +VIZIER +NOSTRIL +IMPEDES +ROADIE +SMALLS +SURMISE +BLANCH +MUGGER +CREWED +GROOMER +SALUTED +POLENTA +ANONYM +SABERS +OCTAVES +EMANATE +RUMMAGE +MAKINGS +DUCTAL +ANIMUS +DIMPLE +NOBLEST +SUPINE +SQUINT +VITALS +KHAKIS +BOBBINS +SPLENIC +SCANTY +MARMITE +HEMMING +DEFILED +TRICEPS +NEONATE +LAYMEN +ROOFERS +COMBATS +AQUARIA +DRENCH +LEGIBLY +CUPOLA +CLOSERS +MINUET +SPOUTS +GLIDED +RIPOFF +LARGOS +SOLEUS +DOORMAT +AREOLAS +CELADON +TIMPANI +FANNED +WAGGING +FARRIER +WETTED +BALLERS +GRANARY +WHITISH +MELANIN +WALLOP +LEAVER +BLACKED +DOWSING +BOOKIES +BEFALL +FIGMENT +ANODES +WEARILY +GLAZIER +PLAYPEN +ANCHOVY +MALLEE +EARINGS +HOTSHOT +SUNLAND +LINSEED +TROGON +DODGED +LECTERN +FINNED +LOOSES +BLOODS +ODOURS +MONGREL +HASHISH +MEAGRE +MOPPING +CHINTZ +LINEAL +GAINFUL +ALDRIN +LESSEES +WHIMPER +SPINEL +INCISED +ELICITS +INVENTS +WANTAGE +TENFOLD +BLUEFIN +JAMMERS +SCOURED +PRETAX +BUSHIDO +LAYAWAY +GELDER +PILSNER +KNOTTY +CHANCEL +LAMPREY +WASHOUT +IRONED +BLUESY +DARSHAN +PIGSKIN +RETOLD +PHOTOG +EMBEDS +VOLANT +AIRWAVE +FUSIONS +TAPPER +NAPHTHA +OVERSEA +GIRDLES +SMITHY +BANNOCK +CRATING +FERRULE +IGNITES +ENROLLS +GRATIN +FULNESS +MAJORED +CALKINS +BRONZES +BAYWOOD +STARTLE +SMASHES +ERECTOR +SUITOR +CICHLID +AWARDEE +ROOMING +SPILLER +BEARCAT +CRECHE +EXCIMER +CASHEWS +OPOSSUM +GHIBLI +TICKLES +OUTDRAW +URBANE +LURKERS +SARDINE +MESHING +STUPOR +SEXING +AIMLESS +PARFAIT +PLEATS +ACCEDE +MEASLY +CUDDLES +SORTERS +SANGRIA +TURNIPS +BAHADUR +SEXTANT +STOMPED +SWAMPY +DONNING +PLANERS +LUSTFUL +GRANDAD +REBUKED +BUYOUTS +PHENOLS +PRESAGE +CAMISA +TIDYING +MAYPOLE +LIFTOFF +DATURA +STABLY +LENSING +PIGLETS +LIFERS +MONGERS +GIBSONS +OUSTER +GREASES +AETHER +MORGANS +BOATMAN +SARDAR +NEGATES +SYNCOPE +FRESHEN +TUGGED +OUTDONE +STERNUM +IGUANAS +DETEST +HAMMING +PARADED +SCAPES +INBUILT +NIPPER +WHIRLED +RECLAME +PASSIM +ENLISTS +JOVIAL +BAGGER +NAILERS +BLARING +ENGINED +MEDDLE +TOMBOY +ALIYAH +HEAPING +ORATION +GRUNTED +BENZOYL +WAMPUM +SUTRAS +CANARD +BATCHED +POSITED +WINKED +PENNINE +FIESTAS +SCURVY +WOULDST +LENTEN +COARSER +MARKUPS +PATTIE +GRAMPS +SHIMMY +CHALLIS +ALIQUOT +OUTSELL +REGAINS +LESSENS +WARNERS +TAUNTS +RIPENED +MADRONA +PIVOTS +TOENAIL +GLOWED +WALTZES +SUNLIT +ATTESTS +PARCHED +STANZAS +RIGGER +TONSILS +ASEXUAL +GAGGLE +KINDEST +BONNETS +PANELED +SCIATIC +SHEATHS +CALLOW +EDICTS +JUGULAR +PIMPLE +BEMUSED +HACKSAW +BASHED +SWEETEN +CONFIDE +MACAQUE +TANNIN +PALMERS +CHILIES +BOUGHS +SPENDER +DERMIS +SPRIGS +ANIMES +STYMIE +VIRAGO +CHICORY +SUBSOIL +THRESH +CHABLIS +UNIFIES +SNOOTY +ELITISM +FOETAL +HELICON +CARWASH +HEARKEN +TACHYON +PINOLE +BRALESS +PATTING +CONGAS +NIOBIUM diff --git a/server/games/registry.js b/server/games/registry.js index cbcbeec..ff24bf6 100644 --- a/server/games/registry.js +++ b/server/games/registry.js @@ -64,6 +64,7 @@ registerGame({ slug: 'oldmaid', name: 'Old Maid', category: 'ca registerGame({ slug: 'blokus', name: 'Blokus', category: 'tabletop', minPlayers: 2, maxPlayers: 4, minOpponents: 1, maxOpponents: 3, iconFrame: 36 }); registerGame({ slug: 'spellingbee', name: 'Spelling Bee', category: 'word', minPlayers: 1, maxPlayers: 1, minOpponents: 0, maxOpponents: 0, iconFrame: 37 }); registerGame({ slug: 'minicrossword', name: 'Mini Crossword', category: 'word', minPlayers: 1, maxPlayers: 1, minOpponents: 0, maxOpponents: 0, iconFrame: 38 }); +registerGame({ slug: 'tectonic', name: 'Tectonic', category: 'word', minPlayers: 1, maxPlayers: 1, minOpponents: 0, maxOpponents: 0, iconFrame: 42 }); registerGame({ slug: 'forbiddenisland', name: 'Forbidden Island', category: 'tabletop', minPlayers: 2, maxPlayers: 4, minOpponents: 1, maxOpponents: 3, hasTutorial: false, iconFrame: 39 }); registerGame({ slug: 'solitairetour', name: 'Solitaire Tour', category: 'cards', cardGame: true, minPlayers: 1, maxPlayers: 1, minOpponents: 0, maxOpponents: 0, iconFrame: 40 }); registerGame({ slug: 'splendor', name: 'Splendor', category: 'cards', cardGame: true, minPlayers: 2, maxPlayers: 4, minOpponents: 1, maxOpponents: 3, iconFrame: 41 }); diff --git a/server/scripts/buildCommonWords.js b/server/scripts/buildCommonWords.js new file mode 100644 index 0000000..cdda954 --- /dev/null +++ b/server/scripts/buildCommonWords.js @@ -0,0 +1,54 @@ +// Builds server/data/wordlists/common.txt — the clue-able word subset the Mini +// Crossword generator fills from. It intersects the ENABLE dictionary with the +// Norvig word-frequency list, applying a *tighter rank cutoff for short words*: +// short obscure words (ANI, CESS, SEG) are the worst crossword fill, and the +// truly common short words rank very high, so a low cutoff filters the junk +// while keeping enough vocabulary to fill. +// +// Usage: node server/scripts/buildCommonWords.js +// Caches the 5 MB frequency list at /tmp/count_1w.txt to avoid re-downloading. + +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const ENABLE_PATH = path.join(__dirname, '../data/wordlists/enable1.txt'); +const OUT_PATH = path.join(__dirname, '../data/wordlists/common.txt'); +const FREQ_URL = 'https://norvig.com/ngrams/count_1w.txt'; +const FREQ_CACHE = '/tmp/count_1w.txt'; + +// Frequency-rank cutoff per word length. Short words get a much stricter bar. +const CUTOFF = { 3: 6000, 4: 18000, 5: 45000, 6: 70000, 7: 70000 }; + +async function loadFreq() { + if (fs.existsSync(FREQ_CACHE)) return fs.readFileSync(FREQ_CACHE, 'utf8'); + console.log('Downloading frequency list...'); + const text = await (await fetch(FREQ_URL)).text(); + fs.writeFileSync(FREQ_CACHE, text); + return text; +} + +async function main() { + const enable = new Set( + fs.readFileSync(ENABLE_PATH, 'utf8').split('\n').map((w) => w.trim().toUpperCase()), + ); + const ranked = (await loadFreq()) + .split('\n').map((l) => l.split('\t')[0]).filter(Boolean).map((w) => w.toUpperCase()); + + const out = []; + const byLen = {}; + ranked.forEach((w, rank) => { + const len = w.length; + if (!CUTOFF[len] || rank >= CUTOFF[len]) return; + if (!/^[A-Z]+$/.test(w) || !enable.has(w)) return; + out.push(w); + byLen[len] = (byLen[len] || 0) + 1; + }); + + fs.writeFileSync(OUT_PATH, out.join('\n') + '\n'); + console.log(`Wrote ${out.length} common words to ${OUT_PATH}`); + console.log('Per length:', JSON.stringify(byLen)); +} + +main(); diff --git a/server/scripts/genMiniCrossword.js b/server/scripts/genMiniCrossword.js new file mode 100644 index 0000000..208613b --- /dev/null +++ b/server/scripts/genMiniCrossword.js @@ -0,0 +1,339 @@ +// Offline generator for Mini Crossword grids. +// +// Produces *non-symmetric* crossword grids (across words differ from down words) +// at three sizes — easy 5x5, medium 6x6, hard 7x7 — by filling block templates +// against the ENABLE word list with a backtracking solver (MRV slot ordering + +// forward checking). It emits a candidate JSON whose `across`/`down` clue arrays +// are blank placeholders, plus the answers, so clues can be hand-authored after. +// +// Usage: +// node server/scripts/genMiniCrossword.js [perTier] [outFile] +// node server/scripts/genMiniCrossword.js 20 server/data/crosswords/_generated.json +// +// All runs are length >= 3. Templates are rotationally symmetric. Each puzzle +// uses every word at most once. + +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +// Common-word subset (top frequency ∩ ENABLE) so fills stay clue-able rather +// than picking obscure Scrabble words. Built once via buildCommonWords.js. +const WORDLIST_PATH = path.join(__dirname, '../data/wordlists/common.txt'); + +const BLOCK = '#'; +const EMPTY = '.'; + +// ── Block templates ──────────────────────────────────────────────────────────── +// '.' = fillable cell, '#' = black square. Each is rotationally symmetric with no +// run shorter than 3. Blocks make the fill *easier* (shorter, more-flexible runs) +// while giving a real-crossword shape. More than one template per tier yields +// more grid variety. + +const TEMPLATES = { + easy: [ + // Open 5x5: a double word square — 5 across + 5 down, all distinct words. + [ + '.....', + '.....', + '.....', + '.....', + '.....', + ], + // 5x5 with symmetric corner nicks (len-4 corners + len-5 spines). + [ + '#....', + '.....', + '.....', + '.....', + '....#', + ], + ], + medium: [ + // 6x6 corner-cut: len-4 corners, len-6 spines. + [ + '#....#', + '......', + '......', + '......', + '......', + '#....#', + ], + ], + hard: [ + // 7x7 with symmetric corner blocks + center split. Runs of length 3, 5, 7. + [ + '##...##', + '#.....#', + '.......', + '...#...', + '.......', + '#.....#', + '##...##', + ], + ], +}; + +const TIER_SIZE = { easy: 5, medium: 6, hard: 7 }; + +// ── Word list ─────────────────────────────────────────────────────────────────── + +// Returns { byLen: Map, index: Map>>> }. +// The index lets us find words matching a partial pattern by intersecting the +// candidate sets of the already-fixed letter positions. +function loadWords() { + const raw = fs.readFileSync(WORDLIST_PATH, 'utf8'); + const byLen = new Map(); + for (const line of raw.split('\n')) { + const w = line.trim().toUpperCase(); + if (w.length < 3 || w.length > 7 || !/^[A-Z]+$/.test(w)) continue; + if (!byLen.has(w.length)) byLen.set(w.length, []); + byLen.get(w.length).push(w); + } + + const index = new Map(); + const sets = new Map(); + for (const [len, words] of byLen) { + sets.set(len, new Set(words)); + const positions = Array.from({ length: len }, () => new Map()); + words.forEach((w, i) => { + for (let p = 0; p < len; p++) { + const m = positions[p]; + const ch = w[p]; + if (!m.has(ch)) m.set(ch, new Set()); + m.get(ch).add(i); + } + }); + index.set(len, positions); + } + return { byLen, index, sets }; +} + +// Words of `len` whose letters match `pattern` (array of letter|null), excluding +// any already in `used`. Intersects the smallest fixed-position sets first. +function candidates({ byLen, index }, len, pattern, used) { + const fixed = []; + for (let p = 0; p < len; p++) { + if (pattern[p]) fixed.push([p, pattern[p]]); + } + const words = byLen.get(len) || []; + if (!fixed.length) { + return words.filter((w) => !used.has(w)); + } + + const positions = index.get(len); + const sets = fixed.map(([p, ch]) => positions[p].get(ch) || new Set()); + if (sets.some((s) => s.size === 0)) return []; + sets.sort((a, b) => a.size - b.size); + + const out = []; + for (const i of sets[0]) { + let ok = true; + for (let k = 1; k < sets.length; k++) { + if (!sets[k].has(i)) { ok = false; break; } + } + if (!ok) continue; + const w = words[i]; + if (!used.has(w)) out.push(w); + } + return out; +} + +// ── Slot extraction (matches the engine's numbering convention) ───────────────── + +function buildGrid(template) { + return template.map((row) => row.split('')); +} + +function isCell(grid, r, c) { + return r >= 0 && r < grid.length && c >= 0 && c < grid[0].length && grid[r][c] !== BLOCK; +} + +// Returns numbered across/down slots; each slot lists its cells in order. +function deriveSlots(grid) { + const across = []; + const down = []; + let number = 0; + for (let r = 0; r < grid.length; r++) { + for (let c = 0; c < grid[0].length; c++) { + if (!isCell(grid, r, c)) continue; + const startsAcross = !isCell(grid, r, c - 1) && isCell(grid, r, c + 1); + const startsDown = !isCell(grid, r - 1, c) && isCell(grid, r + 1, c); + if (!startsAcross && !startsDown) continue; + number += 1; + if (startsAcross) { + const cells = []; + let cc = c; + while (isCell(grid, r, cc)) { cells.push([r, cc]); cc += 1; } + across.push({ number, row: r, col: c, len: cells.length, cells }); + } + if (startsDown) { + const cells = []; + let rr = r; + while (isCell(grid, rr, c)) { cells.push([rr, c]); rr += 1; } + down.push({ number, row: r, col: c, len: cells.length, cells }); + } + } + } + return [...across, ...down]; // combined slot list for the solver +} + +// ── Backtracking solver ───────────────────────────────────────────────────────── + +function patternFor(grid, slot) { + return slot.cells.map(([r, c]) => (grid[r][c] === EMPTY ? null : grid[r][c])); +} + +function isFilled(grid, slot) { + return slot.cells.every(([r, c]) => grid[r][c] !== EMPTY); +} + +function wordAt(grid, slot) { + return slot.cells.map(([r, c]) => grid[r][c]).join(''); +} + +function placeWord(grid, slot, word) { + const prev = slot.cells.map(([r, c]) => grid[r][c]); + slot.cells.forEach(([r, c], i) => { grid[r][c] = word[i]; }); + return prev; +} + +function unplace(grid, slot, prev) { + slot.cells.forEach(([r, c], i) => { grid[r][c] = prev[i]; }); +} + +// Fills `grid` so every slot is a distinct valid word. Every slot is explicitly +// assigned a candidate word — a slot already fully determined by crossing words +// simply has one candidate (if that spelling is a real word) or zero (if not), so +// invalid crossings are pruned automatically. Mutates grid in place; returns true +// on success. `assigned` tracks resolved slots; `deadline` is an epoch-ms budget. +function solve(grid, slots, words, used, assigned, deadline) { + if (Date.now() > deadline) return false; + + // MRV: assign the unresolved slot with the fewest candidates first. Slots fixed + // by crossings collapse to <=1 candidate and resolve immediately. + let target = null; + let targetCands = null; + for (const slot of slots) { + if (assigned.has(slot)) continue; + const cands = candidates(words, slot.len, patternFor(grid, slot), used); + if (cands.length === 0) return false; + if (!targetCands || cands.length < targetCands.length) { + target = slot; + targetCands = cands; + if (cands.length === 1) break; + } + } + if (!target) return true; // every slot assigned + + shuffle(targetCands); + for (const word of targetCands) { + const prev = placeWord(grid, target, word); + used.add(word); + assigned.add(target); + if (solve(grid, slots, words, used, assigned, deadline)) return true; + assigned.delete(target); + used.delete(word); + unplace(grid, target, prev); + } + return false; +} + +function shuffle(arr) { + for (let i = arr.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [arr[i], arr[j]] = [arr[j], arr[i]]; + } + return arr; +} + +// ── Puzzle assembly ───────────────────────────────────────────────────────────── + +// Re-derive ordered across/down answer lists from a solved grid (numbering order). +function answersFromGrid(grid) { + const across = []; + const down = []; + let number = 0; + for (let r = 0; r < grid.length; r++) { + for (let c = 0; c < grid[0].length; c++) { + if (!isCell(grid, r, c)) continue; + const sa = !isCell(grid, r, c - 1) && isCell(grid, r, c + 1); + const sd = !isCell(grid, r - 1, c) && isCell(grid, r + 1, c); + if (!sa && !sd) continue; + number += 1; + if (sa) { let s = '', cc = c; while (isCell(grid, r, cc)) { s += grid[r][cc]; cc++; } across.push({ number, answer: s }); } + if (sd) { let s = '', rr = r; while (isCell(grid, rr, c)) { s += grid[rr][c]; rr++; } down.push({ number, answer: s }); } + } + } + return { across, down }; +} + +function generateOne(template, words, timeoutMs = 800) { + const grid = buildGrid(template); + const slots = deriveSlots(grid); + const used = new Set(); + const ok = solve(grid, slots, words, used, new Set(), Date.now() + timeoutMs); + if (!ok) return null; + + // Safety net: every across/down answer must be a real common word and unique. + const seen = new Set(); + for (const slot of slots) { + const w = wordAt(grid, slot); + if (!words.sets.get(slot.len)?.has(w) || seen.has(w)) return null; + seen.add(w); + } + return grid.map((row) => row.join('')); +} + +function main() { + const perTier = parseInt(process.argv[2], 10) || 20; + const outFile = process.argv[3] || path.join(__dirname, '../data/crosswords/_generated.json'); + + console.log('Loading ENABLE word list...'); + const words = loadWords(); + console.log(` ${[...words.byLen].map(([l, a]) => `${l}:${a.length}`).join(' ')}`); + + const bank = []; + for (const tier of ['easy', 'medium', 'hard']) { + const templates = TEMPLATES[tier]; + const seen = new Set(); + let made = 0; + let attempts = 0; + const maxAttempts = perTier * 80; + const t0 = Date.now(); + + while (made < perTier && attempts < maxAttempts) { + attempts += 1; + const template = templates[attempts % templates.length]; + const rows = generateOne(template, words); + if (process.env.CW_DEBUG && attempts % 5 === 0) { + console.log(` [${tier}] attempt ${attempts}, made ${made}, ${((Date.now() - t0) / 1000).toFixed(1)}s`); + } + if (!rows) continue; + const key = rows.join('|'); + if (seen.has(key)) continue; + seen.add(key); + + const { across, down } = answersFromGrid(buildGrid(rows)); + bank.push({ + id: `${tier}-${String(made + 1).padStart(3, '0')}`, + difficulty: tier, + grid: rows, + // Reference answers (NOT consumed by the engine) to author clues against: + _answersAcross: across.map((a) => `${a.number}. ${a.answer}`), + _answersDown: down.map((a) => `${a.number}. ${a.answer}`), + across: across.map(() => ''), + down: down.map(() => ''), + }); + made += 1; + } + console.log(`${tier} (${TIER_SIZE[tier]}x${TIER_SIZE[tier]}): ${made}/${perTier} grids in ${attempts} attempts, ${((Date.now() - t0) / 1000).toFixed(1)}s`); + } + + fs.writeFileSync(outFile, JSON.stringify(bank, null, 2)); + console.log(`\nWrote ${bank.length} candidate puzzles to ${outFile}`); + console.log('Fill the empty across/down clue arrays; _answers* fields are references.'); +} + +main(); diff --git a/server/words/miniCrosswordEngine.js b/server/words/miniCrosswordEngine.js index 4889a13..1eabce3 100644 --- a/server/words/miniCrosswordEngine.js +++ b/server/words/miniCrosswordEngine.js @@ -1,10 +1,11 @@ -// Mini Crossword engine: serves curated 5x5 puzzles from a hand-authored bank. +// Mini Crossword engine: serves curated puzzles from a hand-authored bank. // Pure logic — no Express. Loaded once at server start. // -// A puzzle is authored as { id, difficulty, grid:[5 row strings], across:[5], -// down:[5] }. Grids are fixed 5x5; a '#' marks a black square. Across/Down clue -// arrays are ordered by row index / column index respectively. This engine -// derives the standard crossword numbering and pairs each clue with its slot. +// A puzzle is authored as { id, difficulty, grid:[row strings], across:[...], +// down:[...] }. Difficulty sets the grid size: easy 5x5, medium 6x6, hard 7x7. +// A '#' marks a black square. Across/Down clue arrays are ordered by the derived +// crossword numbering (reading order). This engine derives that numbering and +// pairs each clue with its slot. import fs from 'node:fs'; import path from 'node:path'; @@ -13,18 +14,19 @@ import { fileURLToPath } from 'node:url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const PUZZLE_PATH = path.join(__dirname, '../data/crosswords/minicrossword.json'); -const SIZE = 5; const BLOCK = '#'; -const DIFFICULTIES = ['easy', 'medium', 'hard']; +// Difficulty no longer means clue obscurity — it sets the grid size. +const TIER_SIZE = { easy: 5, medium: 6, hard: 7 }; +const DIFFICULTIES = Object.keys(TIER_SIZE); let byDifficulty = { easy: [], medium: [], hard: [] }; let allPuzzles = []; // ── Slot extraction & numbering ─────────────────────────────────────────────── -// Returns true when (r,c) is a letter cell (not a black square). +// Returns true when (r,c) is a letter cell (not a black square) within the grid. function isCell(grid, r, c) { - return r >= 0 && r < SIZE && c >= 0 && c < SIZE && grid[r][c] !== BLOCK; + return r >= 0 && r < grid.length && c >= 0 && c < grid[r].length && grid[r][c] !== BLOCK; } // Walks the grid in reading order and builds the numbered across/down slots. @@ -36,8 +38,8 @@ function deriveSlots(grid) { const down = []; let number = 0; - for (let r = 0; r < SIZE; r++) { - for (let c = 0; c < SIZE; c++) { + for (let r = 0; r < grid.length; r++) { + for (let c = 0; c < grid[r].length; c++) { if (!isCell(grid, r, c)) continue; const startsAcross = !isCell(grid, r, c - 1) && isCell(grid, r, c + 1); @@ -66,12 +68,17 @@ function deriveSlots(grid) { // ── Validation ──────────────────────────────────────────────────────────────── function validatePuzzle(p) { - if (!Array.isArray(p.grid) || p.grid.length !== SIZE) { - throw new Error(`puzzle ${p.id}: grid must have ${SIZE} rows`); + const size = TIER_SIZE[p.difficulty]; + if (!size) { + throw new Error(`puzzle ${p.id}: unknown difficulty '${p.difficulty}'`); } + if (!Array.isArray(p.grid) || p.grid.length !== size) { + throw new Error(`puzzle ${p.id}: ${p.difficulty} grid must have ${size} rows`); + } + const rowRe = new RegExp(`^[A-Z#]{${size}}$`); for (const row of p.grid) { - if (typeof row !== 'string' || row.length !== SIZE || !/^[A-Z#]{5}$/.test(row)) { - throw new Error(`puzzle ${p.id}: each row must be ${SIZE} chars of A-Z or '#'`); + if (typeof row !== 'string' || !rowRe.test(row)) { + throw new Error(`puzzle ${p.id}: each row must be ${size} chars of A-Z or '#'`); } } const { across, down } = deriveSlots(p.grid); @@ -101,8 +108,7 @@ export function initMiniCrosswordPuzzles() { const bank = JSON.parse(raw); for (const p of bank) { validatePuzzle(p); - const diff = DIFFICULTIES.includes(p.difficulty) ? p.difficulty : 'medium'; - byDifficulty[diff].push(p); + byDifficulty[p.difficulty].push(p); allPuzzles.push(p); } return { puzzles: allPuzzles.length }; @@ -112,10 +118,10 @@ export function initMiniCrosswordPuzzles() { // Returns a random puzzle for the requested difficulty, packaged with derived // numbering. Each clue entry carries its number, start cell, length and answer. -export function getPuzzle(difficulty = 'medium') { +export function getPuzzle(difficulty = 'easy') { const bucket = byDifficulty[difficulty]?.length ? byDifficulty[difficulty] : allPuzzles; if (!bucket.length) { - return { id: null, difficulty, rows: SIZE, cols: SIZE, grid: [], across: [], down: [] }; + return { id: null, difficulty, rows: 0, cols: 0, grid: [], across: [], down: [] }; } const p = bucket[Math.floor(Math.random() * bucket.length)]; @@ -124,8 +130,8 @@ export function getPuzzle(difficulty = 'medium') { return { id: p.id, difficulty: p.difficulty, - rows: SIZE, - cols: SIZE, + rows: p.grid.length, + cols: p.grid[0].length, grid: p.grid, across: across.map((slot, i) => ({ ...slot, clue: p.across[i] })), down: down.map((slot, i) => ({ ...slot, clue: p.down[i] })), diff --git a/server/words/tectonicEngine.js b/server/words/tectonicEngine.js new file mode 100644 index 0000000..f1ae71a --- /dev/null +++ b/server/words/tectonicEngine.js @@ -0,0 +1,317 @@ +// Tectonic (a.k.a. Suguru) generator. +// +// Rules: +// • The grid is partitioned into irregular regions ("cages") of 1–5 cells. +// • A region of N cells contains the numbers 1..N (so digits never exceed 5). +// • No two cells that touch orthogonally OR diagonally (king-move / 8-way) +// may hold the same number. +// +// generatePuzzle(difficulty) → { grid, solution, regions, difficulty } +// grid : 8×8, 0 = empty cell the player must fill +// solution : 8×8 fully-solved board +// regions : 8×8 of integer region IDs (which cage each cell belongs to) +// +// Generation: +// 1. Partition the grid into 1–5-cell regions (randomized greedy growth). +// 2. Fill a random valid solution (backtracking on flat Int8Array boards with +// precomputed peer lists and most-constrained-variable ordering). +// 3. Dig holes: remove a cell only while the remaining givens are still +// uniquely solvable *by logic alone* (naked singles + hidden singles in a +// region). Logical solvability proves a unique solution AND guarantees the +// puzzle is human-solvable without guessing. The propagation solver is +// polynomial, so digging is fast and low-variance (unlike brute-force +// solution-counting, which blows up on sparse Tectonic boards). + +const N = 8; +const CELLS = N * N; + +const ORTHO = [[-1, 0], [1, 0], [0, -1], [0, 1]]; +const KING = [ + [-1, -1], [-1, 0], [-1, 1], + [0, -1], [0, 1], + [1, -1], [1, 0], [1, 1], +]; + +function shuffle(arr) { + for (let i = arr.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [arr[i], arr[j]] = [arr[j], arr[i]]; + } + return arr; +} + +function inBounds(r, c) { + return r >= 0 && r < N && c >= 0 && c < N; +} + +function orthoNeighbors(r, c) { + const out = []; + for (const [dr, dc] of ORTHO) { + const nr = r + dr, nc = c + dc; + if (inBounds(nr, nc)) out.push([nr, nc]); + } + return out; +} + +function bitToValue(bit) { + return bit === 1 ? 1 : bit === 2 ? 2 : bit === 4 ? 3 : bit === 8 ? 4 : 5; +} + +// ── Region partition ──────────────────────────────────────────────────────── +// Greedy growth that seeds the most-constrained free cell (fewest free +// neighbours) and grows toward size 5, always extending into the tightest +// pocket. This keeps stranded size-1 regions rare without forbidding them. + +function partition() { + const regions = Array.from({ length: N }, () => Array(N).fill(-1)); + let unassigned = CELLS; + let nextId = 0; + + const freeNeighborCount = (r, c) => { + let cnt = 0; + for (const [nr, nc] of orthoNeighbors(r, c)) + if (regions[nr][nc] === -1) cnt++; + return cnt; + }; + + while (unassigned > 0) { + const free = []; + for (let r = 0; r < N; r++) + for (let c = 0; c < N; c++) + if (regions[r][c] === -1) free.push([r, c]); + shuffle(free); + let seed = free[0], bestSeed = Infinity; + for (const [r, c] of free) { + const u = freeNeighborCount(r, c); + if (u < bestSeed) { bestSeed = u; seed = [r, c]; } + } + + const id = nextId++; + const members = [seed]; + regions[seed[0]][seed[1]] = id; + + while (members.length < 5) { + const frontier = []; + for (const [mr, mc] of members) + for (const [nr, nc] of orthoNeighbors(mr, mc)) + if (regions[nr][nc] === -1) frontier.push([nr, nc]); + if (frontier.length === 0) break; + shuffle(frontier); + let pick = frontier[0], bestPick = Infinity; + for (const [r, c] of frontier) { + const u = freeNeighborCount(r, c); + if (u < bestPick) { bestPick = u; pick = [r, c]; } + } + regions[pick[0]][pick[1]] = id; + members.push(pick); + } + + unassigned -= members.length; + } + + return regions; +} + +// Precompute flat lookup tables from a 2D region grid. +// sizeOf[i] : size of i's region (max value allowed in i) +// peers[i] : Int16Array of region-mates + king-neighbours (excl. self) +// byRegion : Map regionId -> array of cell indices +function buildTables(regions) { + const regionOf = new Int16Array(CELLS); + const byRegion = new Map(); + for (let r = 0; r < N; r++) + for (let c = 0; c < N; c++) { + const i = r * N + c; + const id = regions[r][c]; + regionOf[i] = id; + if (!byRegion.has(id)) byRegion.set(id, []); + byRegion.get(id).push(i); + } + + const sizeOf = new Int8Array(CELLS); + const peers = new Array(CELLS); + for (let r = 0; r < N; r++) + for (let c = 0; c < N; c++) { + const i = r * N + c; + const fellows = byRegion.get(regionOf[i]); + sizeOf[i] = fellows.length; + const set = new Set(); + for (const j of fellows) if (j !== i) set.add(j); + for (const [dr, dc] of KING) { + const nr = r + dr, nc = c + dc; + if (inBounds(nr, nc)) set.add(nr * N + nc); + } + peers[i] = Int16Array.from(set); + } + + return { sizeOf, peers, byRegion }; +} + +// ── Solution fill (backtracking) ────────────────────────────────────────────── + +function valueOk(g, peers, i, v) { + const p = peers[i]; + for (let k = 0; k < p.length; k++) if (g[p[k]] === v) return false; + return true; +} + +// Most-constrained empty cell. Returns { idx, cands } or null when full; +// short-circuits on the first forced (0- or 1-candidate) cell. +function findBestCell(g, sizeOf, peers) { + let bestIdx = -1, bestCands = null, bestLen = 99; + for (let i = 0; i < CELLS; i++) { + if (g[i] !== 0) continue; + const max = sizeOf[i]; + const cands = []; + for (let v = 1; v <= max; v++) if (valueOk(g, peers, i, v)) cands.push(v); + if (cands.length < bestLen) { + bestLen = cands.length; bestIdx = i; bestCands = cands; + if (bestLen <= 1) return { idx: bestIdx, cands: bestCands }; + } + } + return bestIdx === -1 ? null : { idx: bestIdx, cands: bestCands }; +} + +// Fills g in place with one random valid solution. Returns true on success, +// false if unsatisfiable, or null if the node budget was exhausted. +function solveOne(g, sizeOf, peers, budget) { + let nodes = 0; + function rec() { + if (++nodes > budget) return null; + const next = findBestCell(g, sizeOf, peers); + if (!next) return true; + if (next.cands.length === 0) return false; + const { idx } = next; + for (const v of shuffle([...next.cands])) { + g[idx] = v; + const r = rec(); + if (r === true || r === null) return r; + g[idx] = 0; + } + return false; + } + return rec(); +} + +// ── Logic solver (naked + hidden singles) ───────────────────────────────────── +// Returns true iff `given` is fully solvable by propagation alone — which proves +// the solution is unique and the puzzle needs no guessing. + +function logicSolves(given, tables) { + const { sizeOf, peers, byRegion } = tables; + const val = new Int8Array(CELLS); + const cand = new Int8Array(CELLS); + for (let i = 0; i < CELLS; i++) cand[i] = (1 << sizeOf[i]) - 1; + + const assign = (i, v) => { + val[i] = v; + cand[i] = 1 << (v - 1); + const p = peers[i]; + const mask = ~(1 << (v - 1)); + for (let k = 0; k < p.length; k++) + if (val[p[k]] === 0) cand[p[k]] &= mask; + }; + + for (let i = 0; i < CELLS; i++) if (given[i] !== 0) assign(i, given[i]); + + let progress = true; + while (progress) { + progress = false; + + // Naked singles + for (let i = 0; i < CELLS; i++) { + if (val[i] !== 0) continue; + const c = cand[i]; + if (c === 0) return false; // contradiction + if ((c & (c - 1)) === 0) { // exactly one bit + assign(i, bitToValue(c)); + progress = true; + } + } + if (progress) continue; + + // Hidden singles within each region + for (const cells of byRegion.values()) { + const size = cells.length; + for (let v = 1; v <= size; v++) { + const bit = 1 << (v - 1); + let count = 0, where = -1, present = false; + for (const i of cells) { + if (val[i] === v) { present = true; break; } + if (val[i] === 0 && (cand[i] & bit)) { count++; where = i; } + } + if (present) continue; + if (count === 0) return false; // value has nowhere to go + if (count === 1) { assign(where, v); progress = true; } + } + } + } + + for (let i = 0; i < CELLS; i++) if (val[i] === 0) return false; + return true; +} + +// ── Hole digging (logic-guarded) ────────────────────────────────────────────── + +const GIVENS = { easy: 30, medium: 24, hard: 18 }; + +function dig(solution, tables, target) { + const given = Int8Array.from(solution); + const order = shuffle([...Array(CELLS).keys()]); + let givens = CELLS; + for (const i of order) { + if (givens <= target) break; + const saved = given[i]; + given[i] = 0; + if (logicSolves(given, tables)) givens--; + else given[i] = saved; + } + return { given, givens }; +} + +// ── Public API ─────────────────────────────────────────────────────────────── + +function buildSolved(deadline) { + for (let attempt = 0; attempt < 200; attempt++) { + if (Date.now() > deadline) return null; + const regions = partition(); + const tables = buildTables(regions); + const sol = new Int8Array(CELLS); + if (solveOne(sol, tables.sizeOf, tables.peers, 30000) === true) + return { regions, tables, sol }; + } + return null; +} + +function toGrid(flat) { + const out = []; + for (let r = 0; r < N; r++) { + const row = []; + for (let c = 0; c < N; c++) row.push(flat[r * N + c]); + out.push(row); + } + return out; +} + +export function generatePuzzle(difficulty) { + const target = GIVENS[difficulty] ?? GIVENS.medium; + const deadline = Date.now() + 3000; + + let best = null; + while (Date.now() < deadline) { + const built = buildSolved(deadline); + if (!built) break; + const { regions, tables, sol } = built; + const { given, givens } = dig(sol, tables, target); + + if (givens <= target) { + return { grid: toGrid(given), solution: toGrid(sol), regions, difficulty }; + } + if (!best || givens < best.givens) { + best = { grid: toGrid(given), solution: toGrid(sol), regions, givens }; + } + } + + if (!best) throw new Error('tectonic: failed to generate a board'); + return { grid: best.grid, solution: best.solution, regions: best.regions, difficulty }; +} diff --git a/server/words/wordRoutes.js b/server/words/wordRoutes.js index 10826cd..d67e30e 100644 --- a/server/words/wordRoutes.js +++ b/server/words/wordRoutes.js @@ -17,6 +17,7 @@ import { listThemes as wordSearchThemes, } from './wordSearchEngine.js'; import { generatePuzzle as sudokuGenerate } from './sudokuEngine.js'; +import { generatePuzzle as tectonicGenerate } from './tectonicEngine.js'; import { initBoggleDictionary, rollBoard, solveBoard } from './boggleEngine.js'; import { initSpellingBeeDictionary, generatePuzzle as spellingBeeGenerate } from './spellingBeeEngine.js'; import { initMiniCrosswordPuzzles, getPuzzle as miniCrosswordGet } from './miniCrosswordEngine.js'; @@ -156,7 +157,7 @@ function loadWordLists() { const beeStats = initSpellingBeeDictionary(allWords); console.log(`[words] loaded ${beeStats.words} Spelling Bee words (${beeStats.pangrams} pangram sets)`); - // Mini Crossword: curated 5x5 puzzle bank (independent of the ENABLE list). + // Mini Crossword: curated puzzle bank, 5x5/6x6/7x7 by difficulty (independent of the ENABLE list). const crosswordStats = initMiniCrosswordPuzzles(); console.log(`[words] loaded ${crosswordStats.puzzles} Mini Crossword puzzles`); @@ -216,10 +217,11 @@ router.get('/spellingbee/start', (req, res) => { // ── Mini Crossword ──────────────────────────────────────────────────────────── // GET /api/words/minicrossword/start?difficulty=easy|medium|hard -// Returns a curated 5x5 puzzle (grid + numbered across/down clues with answers). +// Difficulty sets the grid size: easy 5x5, medium 6x6, hard 7x7. Returns the +// grid + numbered across/down clues (with answers). router.get('/minicrossword/start', (req, res) => { const VALID = ['easy', 'medium', 'hard']; - const difficulty = VALID.includes(req.query.difficulty) ? req.query.difficulty : 'medium'; + const difficulty = VALID.includes(req.query.difficulty) ? req.query.difficulty : 'easy'; res.json(miniCrosswordGet(difficulty)); }); @@ -425,4 +427,11 @@ router.get('/sudoku/start', (req, res) => { res.json(sudokuGenerate(difficulty)); }); +// GET /api/words/tectonic/start?difficulty=easy|medium|hard +router.get('/tectonic/start', (req, res) => { + const VALID = ['easy', 'medium', 'hard']; + const difficulty = VALID.includes(req.query.difficulty) ? req.query.difficulty : 'medium'; + res.json(tectonicGenerate(difficulty)); +}); + export default router;