├── src
├── mnemonic.d.ts
├── params.d.ts
├── params.js
├── cipherseed.d.ts
├── cipherseed.js
└── mnemonic.js
├── ts_src
├── params.ts
├── mnemonic.spec.ts
├── cipherseed.ts
├── cipherseed.spec.ts
└── mnemonic.ts
├── jest.json
├── tsconfig.json
├── LICENSE
├── tslint.json
├── package.json
├── .gitignore
└── README.md
/src/mnemonic.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | export declare function mnemonicFromBytes(bytes: Buffer): string;
3 | export declare function mnemonicToBytes(mnemonic: string): Buffer;
4 |
--------------------------------------------------------------------------------
/src/params.d.ts:
--------------------------------------------------------------------------------
1 | export declare const PARAMS: {
2 | n: number;
3 | r: number;
4 | p: number;
5 | }[];
6 | export declare const DEFAULT_PASSWORD = "aezeed";
7 | export declare const CIPHER_SEED_VERSION = 0;
8 | export declare const ONE_DAY: number;
9 |
--------------------------------------------------------------------------------
/ts_src/params.ts:
--------------------------------------------------------------------------------
1 | export const PARAMS = [
2 | {
3 | // version 0
4 | n: 32768,
5 | r: 8,
6 | p: 1,
7 | },
8 | ];
9 | export const DEFAULT_PASSWORD = 'aezeed';
10 | export const CIPHER_SEED_VERSION = 0;
11 | export const ONE_DAY = 24 * 60 * 60 * 1000;
12 |
--------------------------------------------------------------------------------
/src/params.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.ONE_DAY = exports.CIPHER_SEED_VERSION = exports.DEFAULT_PASSWORD = exports.PARAMS = void 0;
4 | exports.PARAMS = [
5 | {
6 | // version 0
7 | n: 32768,
8 | r: 8,
9 | p: 1,
10 | },
11 | ];
12 | exports.DEFAULT_PASSWORD = 'aezeed';
13 | exports.CIPHER_SEED_VERSION = 0;
14 | exports.ONE_DAY = 24 * 60 * 60 * 1000;
15 |
--------------------------------------------------------------------------------
/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "moduleFileExtensions": [
3 | "ts",
4 | "js",
5 | "json"
6 | ],
7 | "transform": {
8 | "^.+\\.ts$": "ts-jest"
9 | },
10 | "testRegex": "/ts_src/.*\\.spec\\.ts$",
11 | "testURL": "http://localhost/",
12 | "coverageThreshold": {
13 | "global": {
14 | "statements": 90,
15 | "branches": 90,
16 | "functions": 90,
17 | "lines": 90
18 | }
19 | },
20 | "collectCoverageFrom": [
21 | "ts_src/**/*.ts",
22 | "!**/node_modules/**"
23 | ],
24 | "coverageReporters": [
25 | "lcov",
26 | "text"
27 | ],
28 | "verbose": true
29 | }
30 |
--------------------------------------------------------------------------------
/src/cipherseed.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | export declare const daysSinceGenesis: (time: Date) => number;
3 | export declare class CipherSeed {
4 | entropy: Buffer;
5 | salt: Buffer;
6 | internalVersion: number;
7 | birthday: number;
8 | private static decipher;
9 | static fromMnemonic(mnemonic: string, password?: string): CipherSeed;
10 | static random(): CipherSeed;
11 | static changePassword(mnemonic: string, oldPassword: string | null, newPassword: string): string;
12 | constructor(entropy: Buffer, salt: Buffer, internalVersion?: number, birthday?: number);
13 | get birthDate(): Date;
14 | toMnemonic(password?: string, cipherSeedVersion?: number): string;
15 | private encipher;
16 | }
17 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2015",
4 | "module": "commonjs",
5 | "outDir": "./src",
6 | "declaration": true,
7 | "rootDir": "./ts_src",
8 | "types": [
9 | "node",
10 | "jest"
11 | ],
12 | "allowJs": false,
13 | "strict": true,
14 | "noImplicitAny": true,
15 | "strictNullChecks": true,
16 | "strictFunctionTypes": true,
17 | "strictBindCallApply": true,
18 | "strictPropertyInitialization": true,
19 | "noImplicitThis": true,
20 | "alwaysStrict": true,
21 | "esModuleInterop": false,
22 | "noUnusedLocals": true,
23 | "noUnusedParameters": true
24 | },
25 | "include": [
26 | "ts_src/**/*.ts"
27 | ],
28 | "exclude": [
29 | "**/*.spec.ts",
30 | "node_modules/**/*"
31 | ]
32 | }
33 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 bitcoinjs
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "defaultSeverity": "error",
3 | "extends": ["tslint:recommended"],
4 | "rules": {
5 | "arrow-parens": [true, "ban-single-arg-parens"],
6 | "curly": false,
7 | "indent": [
8 | true,
9 | "spaces",
10 | 2
11 | ],
12 | "interface-name": [false],
13 | "match-default-export-name": true,
14 | "max-classes-per-file": [false],
15 | "member-access": [true, "no-public"],
16 | "no-bitwise": false,
17 | "no-console": false,
18 | "no-empty": [true, "allow-empty-catch"],
19 | "no-implicit-dependencies": [true, "dev"],
20 | "no-return-await": true,
21 | "no-var-requires": false,
22 | "no-unused-expression": false,
23 | "object-literal-sort-keys": false,
24 | "quotemark": [true, "single", "avoid-escape"],
25 | "typedef": [
26 | true,
27 | "call-signature",
28 | "arrow-call-signature",
29 | "property-declaration"
30 | ],
31 | "variable-name": [
32 | true,
33 | "ban-keywords",
34 | "check-format",
35 | "allow-leading-underscore",
36 | "allow-pascal-case"
37 | ]
38 | },
39 | "rulesDirectory": []
40 | }
41 |
--------------------------------------------------------------------------------
/ts_src/mnemonic.spec.ts:
--------------------------------------------------------------------------------
1 | import { mnemonicFromBytes, mnemonicToBytes } from './mnemonic';
2 |
3 | const bytes = Buffer.from(
4 | '000a9f416caaa8988c1848a053fc14f6bb815981eea3195b481d4efe3eb8846b3f',
5 | 'hex',
6 | );
7 |
8 | // This is a valid aezeed v0, a valid BIP39, and a valid Electrum v2 segwit seed
9 | const mnemonic =
10 | 'abandon female space sun pride era corn animal park paper ' +
11 | 'ahead uniform retreat proud amateur stamp bone surge also ' +
12 | 'over token fox balance gun';
13 | const wrongLength =
14 | 'above judge emerge veteran reform crunch system all ' +
15 | 'snap please shoulder vault hurt city quarter cover enlist ' +
16 | 'swear success suggest drink wagon enrich body body';
17 | const wrongWord =
18 | 'zzzzz judge emerge veteran reform crunch system all ' +
19 | 'snap please shoulder vault hurt city quarter cover enlist ' +
20 | 'swear success suggest drink wagon enrich body';
21 |
22 | describe('mnemonic', () => {
23 | it('should convert mnemonic to bytes', () => {
24 | expect(mnemonicToBytes(mnemonic)).toEqual(bytes);
25 | });
26 | it('should convert bytes to mnemonic', () => {
27 | expect(mnemonicFromBytes(bytes)).toEqual(mnemonic);
28 | });
29 | it('should fail with wrong word count', () => {
30 | expect(() => {
31 | mnemonicToBytes(wrongLength);
32 | }).toThrow(/^Invalid Mnemonic$/);
33 | });
34 | it('should fail with unknown word', () => {
35 | expect(() => {
36 | mnemonicToBytes(wrongWord);
37 | }).toThrow(/^Invalid Mnemonic$/);
38 | });
39 | });
40 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "aezeed",
3 | "version": "0.0.5",
4 | "description": "A package for encoding, decoding, and generating mnemonics of the aezeed specification.",
5 | "main": "src/cipherseed.js",
6 | "types": "src/cipherseed.d.ts",
7 | "files": [
8 | "src"
9 | ],
10 | "scripts": {
11 | "build": "npm run clean && tsc -p tsconfig.json",
12 | "clean": "rm -rf src",
13 | "coverage": "npm run unit -- --coverage",
14 | "format": "npm run prettier -- --write",
15 | "format:ci": "npm run prettier -- --check",
16 | "gitdiff": "git diff --exit-code",
17 | "gitdiff:ci": "npm run build && npm run gitdiff",
18 | "lint": "tslint -p tsconfig.json -c tslint.json",
19 | "prepublishOnly": "npm run test && npm run gitdiff",
20 | "prettier": "prettier 'ts_src/**/*.ts' --single-quote --trailing-comma=all --ignore-path ./.prettierignore",
21 | "test": "npm run build && npm run format:ci && npm run lint && npm run unit",
22 | "unit": "jest --config=jest.json --runInBand"
23 | },
24 | "repository": {
25 | "type": "git",
26 | "url": "git+https://github.com/bitcoinjs/aezeed.git"
27 | },
28 | "keywords": [
29 | "aezeed",
30 | "bitcoin",
31 | "lightning",
32 | "lnd"
33 | ],
34 | "author": "Jonathan Underwood",
35 | "license": "MIT",
36 | "bugs": {
37 | "url": "https://github.com/bitcoinjs/aezeed/issues"
38 | },
39 | "homepage": "https://github.com/bitcoinjs/aezeed#readme",
40 | "dependencies": {
41 | "aez": "^1.0.1",
42 | "crc-32": "^1.2.1",
43 | "randombytes": "^2.1.0",
44 | "scryptsy": "^2.1.0"
45 | },
46 | "devDependencies": {
47 | "@types/jest": "^26.0.10",
48 | "@types/node": "^14.6.0",
49 | "@types/randombytes": "^2.0.0",
50 | "@types/scryptsy": "^2.0.0",
51 | "jest": "^26.4.2",
52 | "prettier": "^2.1.0",
53 | "ts-jest": "^26.2.0",
54 | "tslint": "^6.1.3",
55 | "typescript": "^4.0.2"
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 |
78 | # Next.js build output
79 | .next
80 |
81 | # Nuxt.js build / generate output
82 | .nuxt
83 | dist
84 |
85 | # Gatsby files
86 | .cache/
87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js
88 | # https://nextjs.org/blog/next-9-1#public-directory-support
89 | # public
90 |
91 | # vuepress build output
92 | .vuepress/dist
93 |
94 | # Serverless directories
95 | .serverless/
96 |
97 | # FuseBox cache
98 | .fusebox/
99 |
100 | # DynamoDB Local files
101 | .dynamodb/
102 |
103 | # TernJS port file
104 | .tern-port
105 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # aezeed
2 | A package for encoding, decoding, and generating mnemonics of the aezeed specification. (WIP)
3 |
4 | # Example
5 |
6 | * TypeScript types are available as well. commonjs example below.
7 |
8 | ```js
9 | const { CipherSeed } = require('aezeed');
10 | ```
11 |
12 | * You can also pass the 16 byte entropy and 5 byte salt as Buffers to the constructor.
13 | * random() uses randombytes under the hood to generate the 21 random bytes needed.
14 |
15 | ```js
16 | // Make a random seed and password protect it.
17 | const mnemonic1 = CipherSeed.random().toMnemonic('strongPassword');
18 | console.log(mnemonic1);
19 |
20 | // Or no password protection (default password is 'aezeed' when not passed)
21 | const mnemonic2 = CipherSeed.random().toMnemonic();
22 | console.log(mnemonic2);
23 | ```
24 |
25 | * You can decode mnemonics as well.
26 | * `birthDate` is a Date object of the approximate day when the wallet was generated. (rounded down to the nearest 18:15:05 UTC (the time-of-day of the timestamp in the Bitcoin genesis block))
27 | * `birthday` is a number, represents the number of days since the genesis block.
28 | * `entropy` is the 16 bytes needed for generating the root key for the BIP32 HD key.
29 |
30 | ```js
31 | // Decoding to get at the entropy and birthday values with password
32 | const mnemonic3 =
33 | 'able mix price funny host express lawsuit congress antique float pig ' +
34 | 'exchange vapor drip wide cup style apple tumble verb fix blush tongue ' +
35 | 'market';
36 | const cipherSeed1 = CipherSeed.fromMnemonic(mnemonic3, 'strongPassword');
37 | console.log(cipherSeed1.entropy);
38 | //
39 | console.log(cipherSeed1.birthDate);
40 | //
41 |
42 | // Without password
43 | const mnemonic4 =
44 | 'able concert slush lend olive cost wagon dawn board robot park snap ' +
45 | 'dignity churn fiction quote shrimp hammer wing jump immune skill sunset ' +
46 | 'west';
47 | const cipherSeed2 = CipherSeed.fromMnemonic(mnemonic4);
48 | console.log(cipherSeed2.entropy);
49 | //
50 | console.log(cipherSeed2.birthDate);
51 | //
52 | ```
53 |
--------------------------------------------------------------------------------
/src/cipherseed.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.CipherSeed = exports.daysSinceGenesis = void 0;
4 | const scrypt = require("scryptsy");
5 | const rng = require("randombytes");
6 | const mn = require("./mnemonic");
7 | const params_1 = require("./params");
8 | const aez = require('aez');
9 | const crc = require('crc-32/crc32c');
10 | const BITCOIN_GENESIS = new Date('2009-01-03T18:15:05.000Z').getTime();
11 | exports.daysSinceGenesis = (time) => Math.floor((time.getTime() - BITCOIN_GENESIS) / params_1.ONE_DAY);
12 | class CipherSeed {
13 | constructor(entropy, salt, internalVersion = 0, birthday = exports.daysSinceGenesis(new Date())) {
14 | this.entropy = entropy;
15 | this.salt = salt;
16 | this.internalVersion = internalVersion;
17 | this.birthday = birthday;
18 | if (entropy && entropy.length !== 16)
19 | throw new Error('incorrect entropy length');
20 | if (salt && salt.length !== 5)
21 | throw new Error('incorrect salt length');
22 | }
23 | static decipher(cipherBuf, password) {
24 | if (cipherBuf[0] >= params_1.PARAMS.length) {
25 | throw new Error('Invalid cipherSeedVersion');
26 | }
27 | const cipherSeedVersion = cipherBuf[0];
28 | const params = params_1.PARAMS[cipherSeedVersion];
29 | const checksum = Buffer.allocUnsafe(4);
30 | const checksumNum = crc.buf(cipherBuf.slice(0, 29));
31 | checksum.writeInt32BE(checksumNum);
32 | if (!checksum.equals(cipherBuf.slice(29))) {
33 | throw new Error('CRC checksum mismatch');
34 | }
35 | const salt = cipherBuf.slice(24, 29);
36 | const key = scrypt(Buffer.from(password, 'utf8'), salt, params.n, params.r, params.p, 32);
37 | const adBytes = Buffer.allocUnsafe(6);
38 | adBytes.writeUInt8(cipherSeedVersion, 0);
39 | salt.copy(adBytes, 1);
40 | const plainText = aez.decrypt(key, null, [adBytes], 4, cipherBuf.slice(1, 24));
41 | if (plainText === null)
42 | throw new Error('Invalid Password');
43 | return new CipherSeed(plainText.slice(3, 19), salt, plainText[0], plainText.readUInt16BE(1));
44 | }
45 | static fromMnemonic(mnemonic, password = params_1.DEFAULT_PASSWORD) {
46 | const bytes = mn.mnemonicToBytes(mnemonic);
47 | return CipherSeed.decipher(bytes, password);
48 | }
49 | static random() {
50 | return new CipherSeed(rng(16), rng(5));
51 | }
52 | static changePassword(mnemonic, oldPassword, newPassword) {
53 | const pwd = oldPassword === null ? params_1.DEFAULT_PASSWORD : oldPassword;
54 | const cs = CipherSeed.fromMnemonic(mnemonic, pwd);
55 | return cs.toMnemonic(newPassword);
56 | }
57 | get birthDate() {
58 | return new Date(BITCOIN_GENESIS + this.birthday * params_1.ONE_DAY);
59 | }
60 | toMnemonic(password = params_1.DEFAULT_PASSWORD, cipherSeedVersion = params_1.CIPHER_SEED_VERSION) {
61 | return mn.mnemonicFromBytes(this.encipher(password, cipherSeedVersion));
62 | }
63 | encipher(password, cipherSeedVersion) {
64 | const pwBuf = Buffer.from(password, 'utf8');
65 | const params = params_1.PARAMS[cipherSeedVersion];
66 | const key = scrypt(pwBuf, this.salt, params.n, params.r, params.p, 32);
67 | const seedBytes = Buffer.allocUnsafe(19);
68 | seedBytes.writeUInt8(this.internalVersion, 0);
69 | seedBytes.writeUInt16BE(this.birthday, 1);
70 | this.entropy.copy(seedBytes, 3);
71 | const adBytes = Buffer.allocUnsafe(6);
72 | adBytes.writeUInt8(cipherSeedVersion, 0);
73 | this.salt.copy(adBytes, 1);
74 | const cipherText = aez.encrypt(key, null, [adBytes], 4, seedBytes);
75 | const cipherSeedBytes = Buffer.allocUnsafe(33);
76 | cipherSeedBytes.writeUInt8(cipherSeedVersion, 0);
77 | cipherText.copy(cipherSeedBytes, 1);
78 | this.salt.copy(cipherSeedBytes, 24);
79 | const checksumNum = crc.buf(cipherSeedBytes.slice(0, 29));
80 | cipherSeedBytes.writeInt32BE(checksumNum, 29);
81 | return cipherSeedBytes;
82 | }
83 | }
84 | exports.CipherSeed = CipherSeed;
85 |
--------------------------------------------------------------------------------
/ts_src/cipherseed.ts:
--------------------------------------------------------------------------------
1 | import * as scrypt from 'scryptsy';
2 | import * as rng from 'randombytes';
3 | import * as mn from './mnemonic';
4 | import {
5 | PARAMS,
6 | DEFAULT_PASSWORD,
7 | ONE_DAY,
8 | CIPHER_SEED_VERSION,
9 | } from './params';
10 | const aez = require('aez');
11 | const crc = require('crc-32/crc32c');
12 |
13 | const BITCOIN_GENESIS = new Date('2009-01-03T18:15:05.000Z').getTime();
14 | export const daysSinceGenesis = (time: Date): number =>
15 | Math.floor((time.getTime() - BITCOIN_GENESIS) / ONE_DAY);
16 |
17 | export class CipherSeed {
18 | private static decipher(cipherBuf: Buffer, password: string): CipherSeed {
19 | if (cipherBuf[0] >= PARAMS.length) {
20 | throw new Error('Invalid cipherSeedVersion');
21 | }
22 | const cipherSeedVersion = cipherBuf[0];
23 | const params = PARAMS[cipherSeedVersion];
24 |
25 | const checksum = Buffer.allocUnsafe(4);
26 | const checksumNum = crc.buf(cipherBuf.slice(0, 29));
27 | checksum.writeInt32BE(checksumNum);
28 | if (!checksum.equals(cipherBuf.slice(29))) {
29 | throw new Error('CRC checksum mismatch');
30 | }
31 | const salt = cipherBuf.slice(24, 29);
32 | const key = scrypt(
33 | Buffer.from(password, 'utf8'),
34 | salt,
35 | params.n,
36 | params.r,
37 | params.p,
38 | 32,
39 | );
40 |
41 | const adBytes = Buffer.allocUnsafe(6);
42 | adBytes.writeUInt8(cipherSeedVersion, 0);
43 | salt.copy(adBytes, 1);
44 |
45 | const plainText: Buffer | null = aez.decrypt(
46 | key,
47 | null,
48 | [adBytes],
49 | 4,
50 | cipherBuf.slice(1, 24),
51 | );
52 | if (plainText === null) throw new Error('Invalid Password');
53 |
54 | return new CipherSeed(
55 | plainText.slice(3, 19),
56 | salt,
57 | plainText[0],
58 | plainText.readUInt16BE(1),
59 | );
60 | }
61 |
62 | static fromMnemonic(
63 | mnemonic: string,
64 | password: string = DEFAULT_PASSWORD,
65 | ): CipherSeed {
66 | const bytes = mn.mnemonicToBytes(mnemonic);
67 | return CipherSeed.decipher(bytes, password);
68 | }
69 |
70 | static random(): CipherSeed {
71 | return new CipherSeed(rng(16), rng(5));
72 | }
73 |
74 | static changePassword(
75 | mnemonic: string,
76 | oldPassword: string | null,
77 | newPassword: string,
78 | ): string {
79 | const pwd = oldPassword === null ? DEFAULT_PASSWORD : oldPassword;
80 | const cs = CipherSeed.fromMnemonic(mnemonic, pwd);
81 | return cs.toMnemonic(newPassword);
82 | }
83 |
84 | constructor(
85 | public entropy: Buffer,
86 | public salt: Buffer,
87 | public internalVersion: number = 0,
88 | public birthday: number = daysSinceGenesis(new Date()),
89 | ) {
90 | if (entropy && entropy.length !== 16)
91 | throw new Error('incorrect entropy length');
92 | if (salt && salt.length !== 5) throw new Error('incorrect salt length');
93 | }
94 |
95 | get birthDate(): Date {
96 | return new Date(BITCOIN_GENESIS + this.birthday * ONE_DAY);
97 | }
98 |
99 | toMnemonic(
100 | password: string = DEFAULT_PASSWORD,
101 | cipherSeedVersion: number = CIPHER_SEED_VERSION,
102 | ): string {
103 | return mn.mnemonicFromBytes(this.encipher(password, cipherSeedVersion));
104 | }
105 |
106 | private encipher(password: string, cipherSeedVersion: number): Buffer {
107 | const pwBuf = Buffer.from(password, 'utf8');
108 | const params = PARAMS[cipherSeedVersion];
109 | const key = scrypt(pwBuf, this.salt, params.n, params.r, params.p, 32);
110 |
111 | const seedBytes = Buffer.allocUnsafe(19);
112 | seedBytes.writeUInt8(this.internalVersion, 0);
113 | seedBytes.writeUInt16BE(this.birthday, 1);
114 | this.entropy.copy(seedBytes, 3);
115 |
116 | const adBytes = Buffer.allocUnsafe(6);
117 | adBytes.writeUInt8(cipherSeedVersion, 0);
118 | this.salt.copy(adBytes, 1);
119 |
120 | const cipherText = aez.encrypt(key, null, [adBytes], 4, seedBytes);
121 |
122 | const cipherSeedBytes = Buffer.allocUnsafe(33);
123 | cipherSeedBytes.writeUInt8(cipherSeedVersion, 0);
124 | cipherText.copy(cipherSeedBytes, 1);
125 | this.salt.copy(cipherSeedBytes, 24);
126 |
127 | const checksumNum = crc.buf(cipherSeedBytes.slice(0, 29));
128 | cipherSeedBytes.writeInt32BE(checksumNum, 29);
129 |
130 | return cipherSeedBytes;
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/ts_src/cipherseed.spec.ts:
--------------------------------------------------------------------------------
1 | import { mocked } from 'ts-jest/utils';
2 | import * as params from './params';
3 | import { CipherSeed, daysSinceGenesis } from './cipherseed';
4 | let lndVersion0TestVectors: Vector[];
5 | let extraVersion0TestVectors: Vector[];
6 |
7 | describe('CipherSeed', () => {
8 | // This is used for running the various vectors
9 | const runVector = (vector: Vector): void => {
10 | const birthday = daysSinceGenesis(vector.time);
11 | expect(birthday).toBe(vector.expectedBirthday);
12 | const seed = new CipherSeed(
13 | vector.entropy,
14 | vector.salt,
15 | vector.version,
16 | birthday,
17 | );
18 | const mnemonic = seed.toMnemonic(vector.password);
19 | expect(mnemonic).toBe(vector.expectedMnemonic);
20 | };
21 |
22 | // Actually run each vector
23 | it('should pass lnd vectors', () => {
24 | lndVersion0TestVectors.forEach(runVector);
25 | });
26 | it('should pass extra vectors', () => {
27 | extraVersion0TestVectors.forEach(runVector);
28 | });
29 |
30 | it('should decode from mnemonic', () => {
31 | const cSeed = CipherSeed.fromMnemonic(mnemonic);
32 | expect(cSeed).toEqual(CSEED);
33 | });
34 | it('should encode to the same mnemonic', () => {
35 | const newMnemonic = CSEED.toMnemonic();
36 | expect(newMnemonic).toEqual(mnemonic);
37 | });
38 | it('should get birthDate', () => {
39 | expect(CSEED.birthDate).toEqual(new Date('2009-01-03T18:15:05.000Z'));
40 | });
41 | it('should allow changing password', () => {
42 | const newMnemonic = CipherSeed.changePassword(mnemonic, null, 'notDefault');
43 | const sameMnemonic = CipherSeed.changePassword(
44 | newMnemonic,
45 | 'notDefault',
46 | 'aezeed',
47 | );
48 | expect(newMnemonic).toEqual(
49 | 'abandon ski rough double differ easy match patient dynamic ' +
50 | 'engage crystal artefact attract puppy slam abstract outer ' +
51 | 'item response grow obscure amount vivid vessel',
52 | );
53 | expect(sameMnemonic).toEqual(mnemonic);
54 | });
55 | it('should encode and decode with password', () => {
56 | const seed = CipherSeed.random();
57 | const mnemonic = seed.toMnemonic('strongPw');
58 | const seed2 = CipherSeed.fromMnemonic(mnemonic, 'strongPw');
59 | expect(seed2).toEqual(seed);
60 | });
61 | it('should generate a random mnemonic', () => {
62 | expect(CipherSeed.random()).toBeTruthy();
63 | });
64 | it('should fail on incorrect checksum', () => {
65 | expect(() => {
66 | CipherSeed.fromMnemonic(wrongChecksum);
67 | }).toThrow(/^CRC checksum mismatch$/);
68 | });
69 | it('should fail on incorrect version', () => {
70 | expect(() => {
71 | CipherSeed.fromMnemonic(wrongVersion);
72 | }).toThrow(/^Invalid cipherSeedVersion$/);
73 | });
74 | it('should fail on incorrect password', () => {
75 | expect(() => {
76 | CipherSeed.fromMnemonic(mnemonic, 'wrong');
77 | }).toThrow(/^Invalid Password$/);
78 | });
79 | it('should fail on incorrect entropy length', () => {
80 | expect(() => {
81 | new CipherSeed(Buffer.from([1, 2, 3]), Buffer.from([1, 2, 3, 4, 5]));
82 | }).toThrow(/^incorrect entropy length$/);
83 | });
84 | it('should fail on incorrect salt length', () => {
85 | expect(() => {
86 | new CipherSeed(
87 | Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]),
88 | Buffer.from([1, 2, 3]),
89 | );
90 | }).toThrow(/^incorrect salt length$/);
91 | });
92 | });
93 |
94 | // Mock the PARAMS to make them weaking, testing is faster.
95 | // These mock params match LND (so we can test against their vectors)
96 | jest.mock('./params');
97 | const mockedParams = mocked(params, true);
98 | mockedParams.PARAMS[0] = {
99 | n: 16,
100 | r: 8,
101 | p: 1,
102 | };
103 |
104 | const entropy = Buffer.from('dadeb38984dadeb38984dadeb3898442', 'hex');
105 | const CSEED = new CipherSeed(entropy, Buffer.from('dadeb38984', 'hex'), 0, 0);
106 | const mnemonic =
107 | 'abandon razor cage merit again upon sort only grace brother ' +
108 | 'dinosaur reform path poverty despair detail tattoo bitter ' +
109 | 'response grow obscure broccoli dirt swallow';
110 |
111 | const wrongChecksum =
112 | 'above judge emerge veteran reform crunch system all ' +
113 | 'snap please shoulder vault hurt city quarter cover enlist ' +
114 | 'swear success suggest drink wagon enrich boil';
115 | const wrongVersion =
116 | 'airport judge emerge veteran reform crunch system all ' +
117 | 'snap please shoulder vault hurt city quarter cover enlist ' +
118 | 'swear success suggest drink wagon enrich body';
119 |
120 | // From LND repository
121 | // ./aezeed/cipherseed_test.go#L23-L63
122 | // at commit 63bd8e77760f77650e854e69cff5b8a4acc18862
123 |
124 | const testEntropy = Buffer.from('81b637d86359e6960de795e41e0b4cfd', 'hex');
125 | const testSalt = Buffer.from([0x73, 0x61, 0x6c, 0x74, 0x31]);
126 | const BitcoinGenesisDate = new Date('2009-01-03T18:15:05.000Z');
127 | lndVersion0TestVectors = [
128 | {
129 | version: 0,
130 | time: BitcoinGenesisDate,
131 | entropy: testEntropy,
132 | salt: testSalt,
133 | password: undefined,
134 | expectedMnemonic:
135 | 'ability liquid travel stem barely drastic pact cupboard apple thrive ' +
136 | 'morning oak feature tissue couch old math inform success suggest drink ' +
137 | 'motion know royal',
138 | expectedBirthday: 0,
139 | },
140 | {
141 | version: 0,
142 | time: new Date(1521799345000), // 03/23/2018 @ 10:02am (UTC)
143 | entropy: testEntropy,
144 | salt: testSalt,
145 | password: '!very_safe_55345_password*',
146 | expectedMnemonic:
147 | 'able tree stool crush transfer cloud cross three profit outside hen ' +
148 | 'citizen plate ride require leg siren drum success suggest drink ' +
149 | 'require fiscal upgrade',
150 | expectedBirthday: 3365,
151 | },
152 | ];
153 |
154 | extraVersion0TestVectors = [
155 | {
156 | version: 0,
157 | time: new Date(4062184705000), // 09/22/2098 @ 12:38:25am (UTC)
158 | entropy: testEntropy,
159 | salt: testSalt,
160 | password: 'LsD58g1jZH3dKsSpdaVa6J9Lxd',
161 | expectedMnemonic:
162 | 'abandon spare anxiety dry resemble hub false behind bachelor van ' +
163 | 'express chunk belt flat flash junior moon fatal success suggest ' +
164 | 'drink share document thrive',
165 | expectedBirthday: 0x8000, // 0x8000 to make sure we handle unsigned properly
166 | },
167 | ];
168 |
169 | interface Vector {
170 | version: number;
171 | time: Date;
172 | entropy: Buffer;
173 | salt: Buffer;
174 | password?: string;
175 | expectedMnemonic: string;
176 | expectedBirthday: number;
177 | }
178 |
--------------------------------------------------------------------------------
/ts_src/mnemonic.ts:
--------------------------------------------------------------------------------
1 | export function mnemonicFromBytes(bytes: Buffer): string {
2 | const bits = bytesToBinary(Array.from(bytes));
3 |
4 | const chunks = bits.match(/(.{1,11})/g)!;
5 | const words = chunks.map((binary: string): string => {
6 | const index = binaryToByte(binary);
7 | return WORDLIST[index];
8 | });
9 |
10 | return words.join(' ');
11 | }
12 |
13 | export function mnemonicToBytes(mnemonic: string): Buffer {
14 | const INVALID = 'Invalid Mnemonic';
15 | const words = mnemonic.split(' ');
16 | if (words.length !== 24) throw new Error(INVALID);
17 | const bits = words
18 | .map((word: string): string => {
19 | const index = WORDLIST.indexOf(word);
20 | if (index === -1) throw new Error(INVALID);
21 |
22 | return lpad(index.toString(2), '0', 11);
23 | })
24 | .join('');
25 | const entropyBytes = bits.match(/(.{8})/g)!.map(binaryToByte);
26 | return Buffer.from(entropyBytes);
27 | }
28 |
29 | function bytesToBinary(bytes: number[]): string {
30 | return bytes.map((x: number): string => lpad(x.toString(2), '0', 8)).join('');
31 | }
32 |
33 | function binaryToByte(bin: string): number {
34 | return parseInt(bin, 2);
35 | }
36 |
37 | function lpad(str: string, padString: string, length: number): string {
38 | while (str.length < length) str = padString + str;
39 | return str;
40 | }
41 |
42 | const WORDLIST = [
43 | 'abandon',
44 | 'ability',
45 | 'able',
46 | 'about',
47 | 'above',
48 | 'absent',
49 | 'absorb',
50 | 'abstract',
51 | 'absurd',
52 | 'abuse',
53 | 'access',
54 | 'accident',
55 | 'account',
56 | 'accuse',
57 | 'achieve',
58 | 'acid',
59 | 'acoustic',
60 | 'acquire',
61 | 'across',
62 | 'act',
63 | 'action',
64 | 'actor',
65 | 'actress',
66 | 'actual',
67 | 'adapt',
68 | 'add',
69 | 'addict',
70 | 'address',
71 | 'adjust',
72 | 'admit',
73 | 'adult',
74 | 'advance',
75 | 'advice',
76 | 'aerobic',
77 | 'affair',
78 | 'afford',
79 | 'afraid',
80 | 'again',
81 | 'age',
82 | 'agent',
83 | 'agree',
84 | 'ahead',
85 | 'aim',
86 | 'air',
87 | 'airport',
88 | 'aisle',
89 | 'alarm',
90 | 'album',
91 | 'alcohol',
92 | 'alert',
93 | 'alien',
94 | 'all',
95 | 'alley',
96 | 'allow',
97 | 'almost',
98 | 'alone',
99 | 'alpha',
100 | 'already',
101 | 'also',
102 | 'alter',
103 | 'always',
104 | 'amateur',
105 | 'amazing',
106 | 'among',
107 | 'amount',
108 | 'amused',
109 | 'analyst',
110 | 'anchor',
111 | 'ancient',
112 | 'anger',
113 | 'angle',
114 | 'angry',
115 | 'animal',
116 | 'ankle',
117 | 'announce',
118 | 'annual',
119 | 'another',
120 | 'answer',
121 | 'antenna',
122 | 'antique',
123 | 'anxiety',
124 | 'any',
125 | 'apart',
126 | 'apology',
127 | 'appear',
128 | 'apple',
129 | 'approve',
130 | 'april',
131 | 'arch',
132 | 'arctic',
133 | 'area',
134 | 'arena',
135 | 'argue',
136 | 'arm',
137 | 'armed',
138 | 'armor',
139 | 'army',
140 | 'around',
141 | 'arrange',
142 | 'arrest',
143 | 'arrive',
144 | 'arrow',
145 | 'art',
146 | 'artefact',
147 | 'artist',
148 | 'artwork',
149 | 'ask',
150 | 'aspect',
151 | 'assault',
152 | 'asset',
153 | 'assist',
154 | 'assume',
155 | 'asthma',
156 | 'athlete',
157 | 'atom',
158 | 'attack',
159 | 'attend',
160 | 'attitude',
161 | 'attract',
162 | 'auction',
163 | 'audit',
164 | 'august',
165 | 'aunt',
166 | 'author',
167 | 'auto',
168 | 'autumn',
169 | 'average',
170 | 'avocado',
171 | 'avoid',
172 | 'awake',
173 | 'aware',
174 | 'away',
175 | 'awesome',
176 | 'awful',
177 | 'awkward',
178 | 'axis',
179 | 'baby',
180 | 'bachelor',
181 | 'bacon',
182 | 'badge',
183 | 'bag',
184 | 'balance',
185 | 'balcony',
186 | 'ball',
187 | 'bamboo',
188 | 'banana',
189 | 'banner',
190 | 'bar',
191 | 'barely',
192 | 'bargain',
193 | 'barrel',
194 | 'base',
195 | 'basic',
196 | 'basket',
197 | 'battle',
198 | 'beach',
199 | 'bean',
200 | 'beauty',
201 | 'because',
202 | 'become',
203 | 'beef',
204 | 'before',
205 | 'begin',
206 | 'behave',
207 | 'behind',
208 | 'believe',
209 | 'below',
210 | 'belt',
211 | 'bench',
212 | 'benefit',
213 | 'best',
214 | 'betray',
215 | 'better',
216 | 'between',
217 | 'beyond',
218 | 'bicycle',
219 | 'bid',
220 | 'bike',
221 | 'bind',
222 | 'biology',
223 | 'bird',
224 | 'birth',
225 | 'bitter',
226 | 'black',
227 | 'blade',
228 | 'blame',
229 | 'blanket',
230 | 'blast',
231 | 'bleak',
232 | 'bless',
233 | 'blind',
234 | 'blood',
235 | 'blossom',
236 | 'blouse',
237 | 'blue',
238 | 'blur',
239 | 'blush',
240 | 'board',
241 | 'boat',
242 | 'body',
243 | 'boil',
244 | 'bomb',
245 | 'bone',
246 | 'bonus',
247 | 'book',
248 | 'boost',
249 | 'border',
250 | 'boring',
251 | 'borrow',
252 | 'boss',
253 | 'bottom',
254 | 'bounce',
255 | 'box',
256 | 'boy',
257 | 'bracket',
258 | 'brain',
259 | 'brand',
260 | 'brass',
261 | 'brave',
262 | 'bread',
263 | 'breeze',
264 | 'brick',
265 | 'bridge',
266 | 'brief',
267 | 'bright',
268 | 'bring',
269 | 'brisk',
270 | 'broccoli',
271 | 'broken',
272 | 'bronze',
273 | 'broom',
274 | 'brother',
275 | 'brown',
276 | 'brush',
277 | 'bubble',
278 | 'buddy',
279 | 'budget',
280 | 'buffalo',
281 | 'build',
282 | 'bulb',
283 | 'bulk',
284 | 'bullet',
285 | 'bundle',
286 | 'bunker',
287 | 'burden',
288 | 'burger',
289 | 'burst',
290 | 'bus',
291 | 'business',
292 | 'busy',
293 | 'butter',
294 | 'buyer',
295 | 'buzz',
296 | 'cabbage',
297 | 'cabin',
298 | 'cable',
299 | 'cactus',
300 | 'cage',
301 | 'cake',
302 | 'call',
303 | 'calm',
304 | 'camera',
305 | 'camp',
306 | 'can',
307 | 'canal',
308 | 'cancel',
309 | 'candy',
310 | 'cannon',
311 | 'canoe',
312 | 'canvas',
313 | 'canyon',
314 | 'capable',
315 | 'capital',
316 | 'captain',
317 | 'car',
318 | 'carbon',
319 | 'card',
320 | 'cargo',
321 | 'carpet',
322 | 'carry',
323 | 'cart',
324 | 'case',
325 | 'cash',
326 | 'casino',
327 | 'castle',
328 | 'casual',
329 | 'cat',
330 | 'catalog',
331 | 'catch',
332 | 'category',
333 | 'cattle',
334 | 'caught',
335 | 'cause',
336 | 'caution',
337 | 'cave',
338 | 'ceiling',
339 | 'celery',
340 | 'cement',
341 | 'census',
342 | 'century',
343 | 'cereal',
344 | 'certain',
345 | 'chair',
346 | 'chalk',
347 | 'champion',
348 | 'change',
349 | 'chaos',
350 | 'chapter',
351 | 'charge',
352 | 'chase',
353 | 'chat',
354 | 'cheap',
355 | 'check',
356 | 'cheese',
357 | 'chef',
358 | 'cherry',
359 | 'chest',
360 | 'chicken',
361 | 'chief',
362 | 'child',
363 | 'chimney',
364 | 'choice',
365 | 'choose',
366 | 'chronic',
367 | 'chuckle',
368 | 'chunk',
369 | 'churn',
370 | 'cigar',
371 | 'cinnamon',
372 | 'circle',
373 | 'citizen',
374 | 'city',
375 | 'civil',
376 | 'claim',
377 | 'clap',
378 | 'clarify',
379 | 'claw',
380 | 'clay',
381 | 'clean',
382 | 'clerk',
383 | 'clever',
384 | 'click',
385 | 'client',
386 | 'cliff',
387 | 'climb',
388 | 'clinic',
389 | 'clip',
390 | 'clock',
391 | 'clog',
392 | 'close',
393 | 'cloth',
394 | 'cloud',
395 | 'clown',
396 | 'club',
397 | 'clump',
398 | 'cluster',
399 | 'clutch',
400 | 'coach',
401 | 'coast',
402 | 'coconut',
403 | 'code',
404 | 'coffee',
405 | 'coil',
406 | 'coin',
407 | 'collect',
408 | 'color',
409 | 'column',
410 | 'combine',
411 | 'come',
412 | 'comfort',
413 | 'comic',
414 | 'common',
415 | 'company',
416 | 'concert',
417 | 'conduct',
418 | 'confirm',
419 | 'congress',
420 | 'connect',
421 | 'consider',
422 | 'control',
423 | 'convince',
424 | 'cook',
425 | 'cool',
426 | 'copper',
427 | 'copy',
428 | 'coral',
429 | 'core',
430 | 'corn',
431 | 'correct',
432 | 'cost',
433 | 'cotton',
434 | 'couch',
435 | 'country',
436 | 'couple',
437 | 'course',
438 | 'cousin',
439 | 'cover',
440 | 'coyote',
441 | 'crack',
442 | 'cradle',
443 | 'craft',
444 | 'cram',
445 | 'crane',
446 | 'crash',
447 | 'crater',
448 | 'crawl',
449 | 'crazy',
450 | 'cream',
451 | 'credit',
452 | 'creek',
453 | 'crew',
454 | 'cricket',
455 | 'crime',
456 | 'crisp',
457 | 'critic',
458 | 'crop',
459 | 'cross',
460 | 'crouch',
461 | 'crowd',
462 | 'crucial',
463 | 'cruel',
464 | 'cruise',
465 | 'crumble',
466 | 'crunch',
467 | 'crush',
468 | 'cry',
469 | 'crystal',
470 | 'cube',
471 | 'culture',
472 | 'cup',
473 | 'cupboard',
474 | 'curious',
475 | 'current',
476 | 'curtain',
477 | 'curve',
478 | 'cushion',
479 | 'custom',
480 | 'cute',
481 | 'cycle',
482 | 'dad',
483 | 'damage',
484 | 'damp',
485 | 'dance',
486 | 'danger',
487 | 'daring',
488 | 'dash',
489 | 'daughter',
490 | 'dawn',
491 | 'day',
492 | 'deal',
493 | 'debate',
494 | 'debris',
495 | 'decade',
496 | 'december',
497 | 'decide',
498 | 'decline',
499 | 'decorate',
500 | 'decrease',
501 | 'deer',
502 | 'defense',
503 | 'define',
504 | 'defy',
505 | 'degree',
506 | 'delay',
507 | 'deliver',
508 | 'demand',
509 | 'demise',
510 | 'denial',
511 | 'dentist',
512 | 'deny',
513 | 'depart',
514 | 'depend',
515 | 'deposit',
516 | 'depth',
517 | 'deputy',
518 | 'derive',
519 | 'describe',
520 | 'desert',
521 | 'design',
522 | 'desk',
523 | 'despair',
524 | 'destroy',
525 | 'detail',
526 | 'detect',
527 | 'develop',
528 | 'device',
529 | 'devote',
530 | 'diagram',
531 | 'dial',
532 | 'diamond',
533 | 'diary',
534 | 'dice',
535 | 'diesel',
536 | 'diet',
537 | 'differ',
538 | 'digital',
539 | 'dignity',
540 | 'dilemma',
541 | 'dinner',
542 | 'dinosaur',
543 | 'direct',
544 | 'dirt',
545 | 'disagree',
546 | 'discover',
547 | 'disease',
548 | 'dish',
549 | 'dismiss',
550 | 'disorder',
551 | 'display',
552 | 'distance',
553 | 'divert',
554 | 'divide',
555 | 'divorce',
556 | 'dizzy',
557 | 'doctor',
558 | 'document',
559 | 'dog',
560 | 'doll',
561 | 'dolphin',
562 | 'domain',
563 | 'donate',
564 | 'donkey',
565 | 'donor',
566 | 'door',
567 | 'dose',
568 | 'double',
569 | 'dove',
570 | 'draft',
571 | 'dragon',
572 | 'drama',
573 | 'drastic',
574 | 'draw',
575 | 'dream',
576 | 'dress',
577 | 'drift',
578 | 'drill',
579 | 'drink',
580 | 'drip',
581 | 'drive',
582 | 'drop',
583 | 'drum',
584 | 'dry',
585 | 'duck',
586 | 'dumb',
587 | 'dune',
588 | 'during',
589 | 'dust',
590 | 'dutch',
591 | 'duty',
592 | 'dwarf',
593 | 'dynamic',
594 | 'eager',
595 | 'eagle',
596 | 'early',
597 | 'earn',
598 | 'earth',
599 | 'easily',
600 | 'east',
601 | 'easy',
602 | 'echo',
603 | 'ecology',
604 | 'economy',
605 | 'edge',
606 | 'edit',
607 | 'educate',
608 | 'effort',
609 | 'egg',
610 | 'eight',
611 | 'either',
612 | 'elbow',
613 | 'elder',
614 | 'electric',
615 | 'elegant',
616 | 'element',
617 | 'elephant',
618 | 'elevator',
619 | 'elite',
620 | 'else',
621 | 'embark',
622 | 'embody',
623 | 'embrace',
624 | 'emerge',
625 | 'emotion',
626 | 'employ',
627 | 'empower',
628 | 'empty',
629 | 'enable',
630 | 'enact',
631 | 'end',
632 | 'endless',
633 | 'endorse',
634 | 'enemy',
635 | 'energy',
636 | 'enforce',
637 | 'engage',
638 | 'engine',
639 | 'enhance',
640 | 'enjoy',
641 | 'enlist',
642 | 'enough',
643 | 'enrich',
644 | 'enroll',
645 | 'ensure',
646 | 'enter',
647 | 'entire',
648 | 'entry',
649 | 'envelope',
650 | 'episode',
651 | 'equal',
652 | 'equip',
653 | 'era',
654 | 'erase',
655 | 'erode',
656 | 'erosion',
657 | 'error',
658 | 'erupt',
659 | 'escape',
660 | 'essay',
661 | 'essence',
662 | 'estate',
663 | 'eternal',
664 | 'ethics',
665 | 'evidence',
666 | 'evil',
667 | 'evoke',
668 | 'evolve',
669 | 'exact',
670 | 'example',
671 | 'excess',
672 | 'exchange',
673 | 'excite',
674 | 'exclude',
675 | 'excuse',
676 | 'execute',
677 | 'exercise',
678 | 'exhaust',
679 | 'exhibit',
680 | 'exile',
681 | 'exist',
682 | 'exit',
683 | 'exotic',
684 | 'expand',
685 | 'expect',
686 | 'expire',
687 | 'explain',
688 | 'expose',
689 | 'express',
690 | 'extend',
691 | 'extra',
692 | 'eye',
693 | 'eyebrow',
694 | 'fabric',
695 | 'face',
696 | 'faculty',
697 | 'fade',
698 | 'faint',
699 | 'faith',
700 | 'fall',
701 | 'false',
702 | 'fame',
703 | 'family',
704 | 'famous',
705 | 'fan',
706 | 'fancy',
707 | 'fantasy',
708 | 'farm',
709 | 'fashion',
710 | 'fat',
711 | 'fatal',
712 | 'father',
713 | 'fatigue',
714 | 'fault',
715 | 'favorite',
716 | 'feature',
717 | 'february',
718 | 'federal',
719 | 'fee',
720 | 'feed',
721 | 'feel',
722 | 'female',
723 | 'fence',
724 | 'festival',
725 | 'fetch',
726 | 'fever',
727 | 'few',
728 | 'fiber',
729 | 'fiction',
730 | 'field',
731 | 'figure',
732 | 'file',
733 | 'film',
734 | 'filter',
735 | 'final',
736 | 'find',
737 | 'fine',
738 | 'finger',
739 | 'finish',
740 | 'fire',
741 | 'firm',
742 | 'first',
743 | 'fiscal',
744 | 'fish',
745 | 'fit',
746 | 'fitness',
747 | 'fix',
748 | 'flag',
749 | 'flame',
750 | 'flash',
751 | 'flat',
752 | 'flavor',
753 | 'flee',
754 | 'flight',
755 | 'flip',
756 | 'float',
757 | 'flock',
758 | 'floor',
759 | 'flower',
760 | 'fluid',
761 | 'flush',
762 | 'fly',
763 | 'foam',
764 | 'focus',
765 | 'fog',
766 | 'foil',
767 | 'fold',
768 | 'follow',
769 | 'food',
770 | 'foot',
771 | 'force',
772 | 'forest',
773 | 'forget',
774 | 'fork',
775 | 'fortune',
776 | 'forum',
777 | 'forward',
778 | 'fossil',
779 | 'foster',
780 | 'found',
781 | 'fox',
782 | 'fragile',
783 | 'frame',
784 | 'frequent',
785 | 'fresh',
786 | 'friend',
787 | 'fringe',
788 | 'frog',
789 | 'front',
790 | 'frost',
791 | 'frown',
792 | 'frozen',
793 | 'fruit',
794 | 'fuel',
795 | 'fun',
796 | 'funny',
797 | 'furnace',
798 | 'fury',
799 | 'future',
800 | 'gadget',
801 | 'gain',
802 | 'galaxy',
803 | 'gallery',
804 | 'game',
805 | 'gap',
806 | 'garage',
807 | 'garbage',
808 | 'garden',
809 | 'garlic',
810 | 'garment',
811 | 'gas',
812 | 'gasp',
813 | 'gate',
814 | 'gather',
815 | 'gauge',
816 | 'gaze',
817 | 'general',
818 | 'genius',
819 | 'genre',
820 | 'gentle',
821 | 'genuine',
822 | 'gesture',
823 | 'ghost',
824 | 'giant',
825 | 'gift',
826 | 'giggle',
827 | 'ginger',
828 | 'giraffe',
829 | 'girl',
830 | 'give',
831 | 'glad',
832 | 'glance',
833 | 'glare',
834 | 'glass',
835 | 'glide',
836 | 'glimpse',
837 | 'globe',
838 | 'gloom',
839 | 'glory',
840 | 'glove',
841 | 'glow',
842 | 'glue',
843 | 'goat',
844 | 'goddess',
845 | 'gold',
846 | 'good',
847 | 'goose',
848 | 'gorilla',
849 | 'gospel',
850 | 'gossip',
851 | 'govern',
852 | 'gown',
853 | 'grab',
854 | 'grace',
855 | 'grain',
856 | 'grant',
857 | 'grape',
858 | 'grass',
859 | 'gravity',
860 | 'great',
861 | 'green',
862 | 'grid',
863 | 'grief',
864 | 'grit',
865 | 'grocery',
866 | 'group',
867 | 'grow',
868 | 'grunt',
869 | 'guard',
870 | 'guess',
871 | 'guide',
872 | 'guilt',
873 | 'guitar',
874 | 'gun',
875 | 'gym',
876 | 'habit',
877 | 'hair',
878 | 'half',
879 | 'hammer',
880 | 'hamster',
881 | 'hand',
882 | 'happy',
883 | 'harbor',
884 | 'hard',
885 | 'harsh',
886 | 'harvest',
887 | 'hat',
888 | 'have',
889 | 'hawk',
890 | 'hazard',
891 | 'head',
892 | 'health',
893 | 'heart',
894 | 'heavy',
895 | 'hedgehog',
896 | 'height',
897 | 'hello',
898 | 'helmet',
899 | 'help',
900 | 'hen',
901 | 'hero',
902 | 'hidden',
903 | 'high',
904 | 'hill',
905 | 'hint',
906 | 'hip',
907 | 'hire',
908 | 'history',
909 | 'hobby',
910 | 'hockey',
911 | 'hold',
912 | 'hole',
913 | 'holiday',
914 | 'hollow',
915 | 'home',
916 | 'honey',
917 | 'hood',
918 | 'hope',
919 | 'horn',
920 | 'horror',
921 | 'horse',
922 | 'hospital',
923 | 'host',
924 | 'hotel',
925 | 'hour',
926 | 'hover',
927 | 'hub',
928 | 'huge',
929 | 'human',
930 | 'humble',
931 | 'humor',
932 | 'hundred',
933 | 'hungry',
934 | 'hunt',
935 | 'hurdle',
936 | 'hurry',
937 | 'hurt',
938 | 'husband',
939 | 'hybrid',
940 | 'ice',
941 | 'icon',
942 | 'idea',
943 | 'identify',
944 | 'idle',
945 | 'ignore',
946 | 'ill',
947 | 'illegal',
948 | 'illness',
949 | 'image',
950 | 'imitate',
951 | 'immense',
952 | 'immune',
953 | 'impact',
954 | 'impose',
955 | 'improve',
956 | 'impulse',
957 | 'inch',
958 | 'include',
959 | 'income',
960 | 'increase',
961 | 'index',
962 | 'indicate',
963 | 'indoor',
964 | 'industry',
965 | 'infant',
966 | 'inflict',
967 | 'inform',
968 | 'inhale',
969 | 'inherit',
970 | 'initial',
971 | 'inject',
972 | 'injury',
973 | 'inmate',
974 | 'inner',
975 | 'innocent',
976 | 'input',
977 | 'inquiry',
978 | 'insane',
979 | 'insect',
980 | 'inside',
981 | 'inspire',
982 | 'install',
983 | 'intact',
984 | 'interest',
985 | 'into',
986 | 'invest',
987 | 'invite',
988 | 'involve',
989 | 'iron',
990 | 'island',
991 | 'isolate',
992 | 'issue',
993 | 'item',
994 | 'ivory',
995 | 'jacket',
996 | 'jaguar',
997 | 'jar',
998 | 'jazz',
999 | 'jealous',
1000 | 'jeans',
1001 | 'jelly',
1002 | 'jewel',
1003 | 'job',
1004 | 'join',
1005 | 'joke',
1006 | 'journey',
1007 | 'joy',
1008 | 'judge',
1009 | 'juice',
1010 | 'jump',
1011 | 'jungle',
1012 | 'junior',
1013 | 'junk',
1014 | 'just',
1015 | 'kangaroo',
1016 | 'keen',
1017 | 'keep',
1018 | 'ketchup',
1019 | 'key',
1020 | 'kick',
1021 | 'kid',
1022 | 'kidney',
1023 | 'kind',
1024 | 'kingdom',
1025 | 'kiss',
1026 | 'kit',
1027 | 'kitchen',
1028 | 'kite',
1029 | 'kitten',
1030 | 'kiwi',
1031 | 'knee',
1032 | 'knife',
1033 | 'knock',
1034 | 'know',
1035 | 'lab',
1036 | 'label',
1037 | 'labor',
1038 | 'ladder',
1039 | 'lady',
1040 | 'lake',
1041 | 'lamp',
1042 | 'language',
1043 | 'laptop',
1044 | 'large',
1045 | 'later',
1046 | 'latin',
1047 | 'laugh',
1048 | 'laundry',
1049 | 'lava',
1050 | 'law',
1051 | 'lawn',
1052 | 'lawsuit',
1053 | 'layer',
1054 | 'lazy',
1055 | 'leader',
1056 | 'leaf',
1057 | 'learn',
1058 | 'leave',
1059 | 'lecture',
1060 | 'left',
1061 | 'leg',
1062 | 'legal',
1063 | 'legend',
1064 | 'leisure',
1065 | 'lemon',
1066 | 'lend',
1067 | 'length',
1068 | 'lens',
1069 | 'leopard',
1070 | 'lesson',
1071 | 'letter',
1072 | 'level',
1073 | 'liar',
1074 | 'liberty',
1075 | 'library',
1076 | 'license',
1077 | 'life',
1078 | 'lift',
1079 | 'light',
1080 | 'like',
1081 | 'limb',
1082 | 'limit',
1083 | 'link',
1084 | 'lion',
1085 | 'liquid',
1086 | 'list',
1087 | 'little',
1088 | 'live',
1089 | 'lizard',
1090 | 'load',
1091 | 'loan',
1092 | 'lobster',
1093 | 'local',
1094 | 'lock',
1095 | 'logic',
1096 | 'lonely',
1097 | 'long',
1098 | 'loop',
1099 | 'lottery',
1100 | 'loud',
1101 | 'lounge',
1102 | 'love',
1103 | 'loyal',
1104 | 'lucky',
1105 | 'luggage',
1106 | 'lumber',
1107 | 'lunar',
1108 | 'lunch',
1109 | 'luxury',
1110 | 'lyrics',
1111 | 'machine',
1112 | 'mad',
1113 | 'magic',
1114 | 'magnet',
1115 | 'maid',
1116 | 'mail',
1117 | 'main',
1118 | 'major',
1119 | 'make',
1120 | 'mammal',
1121 | 'man',
1122 | 'manage',
1123 | 'mandate',
1124 | 'mango',
1125 | 'mansion',
1126 | 'manual',
1127 | 'maple',
1128 | 'marble',
1129 | 'march',
1130 | 'margin',
1131 | 'marine',
1132 | 'market',
1133 | 'marriage',
1134 | 'mask',
1135 | 'mass',
1136 | 'master',
1137 | 'match',
1138 | 'material',
1139 | 'math',
1140 | 'matrix',
1141 | 'matter',
1142 | 'maximum',
1143 | 'maze',
1144 | 'meadow',
1145 | 'mean',
1146 | 'measure',
1147 | 'meat',
1148 | 'mechanic',
1149 | 'medal',
1150 | 'media',
1151 | 'melody',
1152 | 'melt',
1153 | 'member',
1154 | 'memory',
1155 | 'mention',
1156 | 'menu',
1157 | 'mercy',
1158 | 'merge',
1159 | 'merit',
1160 | 'merry',
1161 | 'mesh',
1162 | 'message',
1163 | 'metal',
1164 | 'method',
1165 | 'middle',
1166 | 'midnight',
1167 | 'milk',
1168 | 'million',
1169 | 'mimic',
1170 | 'mind',
1171 | 'minimum',
1172 | 'minor',
1173 | 'minute',
1174 | 'miracle',
1175 | 'mirror',
1176 | 'misery',
1177 | 'miss',
1178 | 'mistake',
1179 | 'mix',
1180 | 'mixed',
1181 | 'mixture',
1182 | 'mobile',
1183 | 'model',
1184 | 'modify',
1185 | 'mom',
1186 | 'moment',
1187 | 'monitor',
1188 | 'monkey',
1189 | 'monster',
1190 | 'month',
1191 | 'moon',
1192 | 'moral',
1193 | 'more',
1194 | 'morning',
1195 | 'mosquito',
1196 | 'mother',
1197 | 'motion',
1198 | 'motor',
1199 | 'mountain',
1200 | 'mouse',
1201 | 'move',
1202 | 'movie',
1203 | 'much',
1204 | 'muffin',
1205 | 'mule',
1206 | 'multiply',
1207 | 'muscle',
1208 | 'museum',
1209 | 'mushroom',
1210 | 'music',
1211 | 'must',
1212 | 'mutual',
1213 | 'myself',
1214 | 'mystery',
1215 | 'myth',
1216 | 'naive',
1217 | 'name',
1218 | 'napkin',
1219 | 'narrow',
1220 | 'nasty',
1221 | 'nation',
1222 | 'nature',
1223 | 'near',
1224 | 'neck',
1225 | 'need',
1226 | 'negative',
1227 | 'neglect',
1228 | 'neither',
1229 | 'nephew',
1230 | 'nerve',
1231 | 'nest',
1232 | 'net',
1233 | 'network',
1234 | 'neutral',
1235 | 'never',
1236 | 'news',
1237 | 'next',
1238 | 'nice',
1239 | 'night',
1240 | 'noble',
1241 | 'noise',
1242 | 'nominee',
1243 | 'noodle',
1244 | 'normal',
1245 | 'north',
1246 | 'nose',
1247 | 'notable',
1248 | 'note',
1249 | 'nothing',
1250 | 'notice',
1251 | 'novel',
1252 | 'now',
1253 | 'nuclear',
1254 | 'number',
1255 | 'nurse',
1256 | 'nut',
1257 | 'oak',
1258 | 'obey',
1259 | 'object',
1260 | 'oblige',
1261 | 'obscure',
1262 | 'observe',
1263 | 'obtain',
1264 | 'obvious',
1265 | 'occur',
1266 | 'ocean',
1267 | 'october',
1268 | 'odor',
1269 | 'off',
1270 | 'offer',
1271 | 'office',
1272 | 'often',
1273 | 'oil',
1274 | 'okay',
1275 | 'old',
1276 | 'olive',
1277 | 'olympic',
1278 | 'omit',
1279 | 'once',
1280 | 'one',
1281 | 'onion',
1282 | 'online',
1283 | 'only',
1284 | 'open',
1285 | 'opera',
1286 | 'opinion',
1287 | 'oppose',
1288 | 'option',
1289 | 'orange',
1290 | 'orbit',
1291 | 'orchard',
1292 | 'order',
1293 | 'ordinary',
1294 | 'organ',
1295 | 'orient',
1296 | 'original',
1297 | 'orphan',
1298 | 'ostrich',
1299 | 'other',
1300 | 'outdoor',
1301 | 'outer',
1302 | 'output',
1303 | 'outside',
1304 | 'oval',
1305 | 'oven',
1306 | 'over',
1307 | 'own',
1308 | 'owner',
1309 | 'oxygen',
1310 | 'oyster',
1311 | 'ozone',
1312 | 'pact',
1313 | 'paddle',
1314 | 'page',
1315 | 'pair',
1316 | 'palace',
1317 | 'palm',
1318 | 'panda',
1319 | 'panel',
1320 | 'panic',
1321 | 'panther',
1322 | 'paper',
1323 | 'parade',
1324 | 'parent',
1325 | 'park',
1326 | 'parrot',
1327 | 'party',
1328 | 'pass',
1329 | 'patch',
1330 | 'path',
1331 | 'patient',
1332 | 'patrol',
1333 | 'pattern',
1334 | 'pause',
1335 | 'pave',
1336 | 'payment',
1337 | 'peace',
1338 | 'peanut',
1339 | 'pear',
1340 | 'peasant',
1341 | 'pelican',
1342 | 'pen',
1343 | 'penalty',
1344 | 'pencil',
1345 | 'people',
1346 | 'pepper',
1347 | 'perfect',
1348 | 'permit',
1349 | 'person',
1350 | 'pet',
1351 | 'phone',
1352 | 'photo',
1353 | 'phrase',
1354 | 'physical',
1355 | 'piano',
1356 | 'picnic',
1357 | 'picture',
1358 | 'piece',
1359 | 'pig',
1360 | 'pigeon',
1361 | 'pill',
1362 | 'pilot',
1363 | 'pink',
1364 | 'pioneer',
1365 | 'pipe',
1366 | 'pistol',
1367 | 'pitch',
1368 | 'pizza',
1369 | 'place',
1370 | 'planet',
1371 | 'plastic',
1372 | 'plate',
1373 | 'play',
1374 | 'please',
1375 | 'pledge',
1376 | 'pluck',
1377 | 'plug',
1378 | 'plunge',
1379 | 'poem',
1380 | 'poet',
1381 | 'point',
1382 | 'polar',
1383 | 'pole',
1384 | 'police',
1385 | 'pond',
1386 | 'pony',
1387 | 'pool',
1388 | 'popular',
1389 | 'portion',
1390 | 'position',
1391 | 'possible',
1392 | 'post',
1393 | 'potato',
1394 | 'pottery',
1395 | 'poverty',
1396 | 'powder',
1397 | 'power',
1398 | 'practice',
1399 | 'praise',
1400 | 'predict',
1401 | 'prefer',
1402 | 'prepare',
1403 | 'present',
1404 | 'pretty',
1405 | 'prevent',
1406 | 'price',
1407 | 'pride',
1408 | 'primary',
1409 | 'print',
1410 | 'priority',
1411 | 'prison',
1412 | 'private',
1413 | 'prize',
1414 | 'problem',
1415 | 'process',
1416 | 'produce',
1417 | 'profit',
1418 | 'program',
1419 | 'project',
1420 | 'promote',
1421 | 'proof',
1422 | 'property',
1423 | 'prosper',
1424 | 'protect',
1425 | 'proud',
1426 | 'provide',
1427 | 'public',
1428 | 'pudding',
1429 | 'pull',
1430 | 'pulp',
1431 | 'pulse',
1432 | 'pumpkin',
1433 | 'punch',
1434 | 'pupil',
1435 | 'puppy',
1436 | 'purchase',
1437 | 'purity',
1438 | 'purpose',
1439 | 'purse',
1440 | 'push',
1441 | 'put',
1442 | 'puzzle',
1443 | 'pyramid',
1444 | 'quality',
1445 | 'quantum',
1446 | 'quarter',
1447 | 'question',
1448 | 'quick',
1449 | 'quit',
1450 | 'quiz',
1451 | 'quote',
1452 | 'rabbit',
1453 | 'raccoon',
1454 | 'race',
1455 | 'rack',
1456 | 'radar',
1457 | 'radio',
1458 | 'rail',
1459 | 'rain',
1460 | 'raise',
1461 | 'rally',
1462 | 'ramp',
1463 | 'ranch',
1464 | 'random',
1465 | 'range',
1466 | 'rapid',
1467 | 'rare',
1468 | 'rate',
1469 | 'rather',
1470 | 'raven',
1471 | 'raw',
1472 | 'razor',
1473 | 'ready',
1474 | 'real',
1475 | 'reason',
1476 | 'rebel',
1477 | 'rebuild',
1478 | 'recall',
1479 | 'receive',
1480 | 'recipe',
1481 | 'record',
1482 | 'recycle',
1483 | 'reduce',
1484 | 'reflect',
1485 | 'reform',
1486 | 'refuse',
1487 | 'region',
1488 | 'regret',
1489 | 'regular',
1490 | 'reject',
1491 | 'relax',
1492 | 'release',
1493 | 'relief',
1494 | 'rely',
1495 | 'remain',
1496 | 'remember',
1497 | 'remind',
1498 | 'remove',
1499 | 'render',
1500 | 'renew',
1501 | 'rent',
1502 | 'reopen',
1503 | 'repair',
1504 | 'repeat',
1505 | 'replace',
1506 | 'report',
1507 | 'require',
1508 | 'rescue',
1509 | 'resemble',
1510 | 'resist',
1511 | 'resource',
1512 | 'response',
1513 | 'result',
1514 | 'retire',
1515 | 'retreat',
1516 | 'return',
1517 | 'reunion',
1518 | 'reveal',
1519 | 'review',
1520 | 'reward',
1521 | 'rhythm',
1522 | 'rib',
1523 | 'ribbon',
1524 | 'rice',
1525 | 'rich',
1526 | 'ride',
1527 | 'ridge',
1528 | 'rifle',
1529 | 'right',
1530 | 'rigid',
1531 | 'ring',
1532 | 'riot',
1533 | 'ripple',
1534 | 'risk',
1535 | 'ritual',
1536 | 'rival',
1537 | 'river',
1538 | 'road',
1539 | 'roast',
1540 | 'robot',
1541 | 'robust',
1542 | 'rocket',
1543 | 'romance',
1544 | 'roof',
1545 | 'rookie',
1546 | 'room',
1547 | 'rose',
1548 | 'rotate',
1549 | 'rough',
1550 | 'round',
1551 | 'route',
1552 | 'royal',
1553 | 'rubber',
1554 | 'rude',
1555 | 'rug',
1556 | 'rule',
1557 | 'run',
1558 | 'runway',
1559 | 'rural',
1560 | 'sad',
1561 | 'saddle',
1562 | 'sadness',
1563 | 'safe',
1564 | 'sail',
1565 | 'salad',
1566 | 'salmon',
1567 | 'salon',
1568 | 'salt',
1569 | 'salute',
1570 | 'same',
1571 | 'sample',
1572 | 'sand',
1573 | 'satisfy',
1574 | 'satoshi',
1575 | 'sauce',
1576 | 'sausage',
1577 | 'save',
1578 | 'say',
1579 | 'scale',
1580 | 'scan',
1581 | 'scare',
1582 | 'scatter',
1583 | 'scene',
1584 | 'scheme',
1585 | 'school',
1586 | 'science',
1587 | 'scissors',
1588 | 'scorpion',
1589 | 'scout',
1590 | 'scrap',
1591 | 'screen',
1592 | 'script',
1593 | 'scrub',
1594 | 'sea',
1595 | 'search',
1596 | 'season',
1597 | 'seat',
1598 | 'second',
1599 | 'secret',
1600 | 'section',
1601 | 'security',
1602 | 'seed',
1603 | 'seek',
1604 | 'segment',
1605 | 'select',
1606 | 'sell',
1607 | 'seminar',
1608 | 'senior',
1609 | 'sense',
1610 | 'sentence',
1611 | 'series',
1612 | 'service',
1613 | 'session',
1614 | 'settle',
1615 | 'setup',
1616 | 'seven',
1617 | 'shadow',
1618 | 'shaft',
1619 | 'shallow',
1620 | 'share',
1621 | 'shed',
1622 | 'shell',
1623 | 'sheriff',
1624 | 'shield',
1625 | 'shift',
1626 | 'shine',
1627 | 'ship',
1628 | 'shiver',
1629 | 'shock',
1630 | 'shoe',
1631 | 'shoot',
1632 | 'shop',
1633 | 'short',
1634 | 'shoulder',
1635 | 'shove',
1636 | 'shrimp',
1637 | 'shrug',
1638 | 'shuffle',
1639 | 'shy',
1640 | 'sibling',
1641 | 'sick',
1642 | 'side',
1643 | 'siege',
1644 | 'sight',
1645 | 'sign',
1646 | 'silent',
1647 | 'silk',
1648 | 'silly',
1649 | 'silver',
1650 | 'similar',
1651 | 'simple',
1652 | 'since',
1653 | 'sing',
1654 | 'siren',
1655 | 'sister',
1656 | 'situate',
1657 | 'six',
1658 | 'size',
1659 | 'skate',
1660 | 'sketch',
1661 | 'ski',
1662 | 'skill',
1663 | 'skin',
1664 | 'skirt',
1665 | 'skull',
1666 | 'slab',
1667 | 'slam',
1668 | 'sleep',
1669 | 'slender',
1670 | 'slice',
1671 | 'slide',
1672 | 'slight',
1673 | 'slim',
1674 | 'slogan',
1675 | 'slot',
1676 | 'slow',
1677 | 'slush',
1678 | 'small',
1679 | 'smart',
1680 | 'smile',
1681 | 'smoke',
1682 | 'smooth',
1683 | 'snack',
1684 | 'snake',
1685 | 'snap',
1686 | 'sniff',
1687 | 'snow',
1688 | 'soap',
1689 | 'soccer',
1690 | 'social',
1691 | 'sock',
1692 | 'soda',
1693 | 'soft',
1694 | 'solar',
1695 | 'soldier',
1696 | 'solid',
1697 | 'solution',
1698 | 'solve',
1699 | 'someone',
1700 | 'song',
1701 | 'soon',
1702 | 'sorry',
1703 | 'sort',
1704 | 'soul',
1705 | 'sound',
1706 | 'soup',
1707 | 'source',
1708 | 'south',
1709 | 'space',
1710 | 'spare',
1711 | 'spatial',
1712 | 'spawn',
1713 | 'speak',
1714 | 'special',
1715 | 'speed',
1716 | 'spell',
1717 | 'spend',
1718 | 'sphere',
1719 | 'spice',
1720 | 'spider',
1721 | 'spike',
1722 | 'spin',
1723 | 'spirit',
1724 | 'split',
1725 | 'spoil',
1726 | 'sponsor',
1727 | 'spoon',
1728 | 'sport',
1729 | 'spot',
1730 | 'spray',
1731 | 'spread',
1732 | 'spring',
1733 | 'spy',
1734 | 'square',
1735 | 'squeeze',
1736 | 'squirrel',
1737 | 'stable',
1738 | 'stadium',
1739 | 'staff',
1740 | 'stage',
1741 | 'stairs',
1742 | 'stamp',
1743 | 'stand',
1744 | 'start',
1745 | 'state',
1746 | 'stay',
1747 | 'steak',
1748 | 'steel',
1749 | 'stem',
1750 | 'step',
1751 | 'stereo',
1752 | 'stick',
1753 | 'still',
1754 | 'sting',
1755 | 'stock',
1756 | 'stomach',
1757 | 'stone',
1758 | 'stool',
1759 | 'story',
1760 | 'stove',
1761 | 'strategy',
1762 | 'street',
1763 | 'strike',
1764 | 'strong',
1765 | 'struggle',
1766 | 'student',
1767 | 'stuff',
1768 | 'stumble',
1769 | 'style',
1770 | 'subject',
1771 | 'submit',
1772 | 'subway',
1773 | 'success',
1774 | 'such',
1775 | 'sudden',
1776 | 'suffer',
1777 | 'sugar',
1778 | 'suggest',
1779 | 'suit',
1780 | 'summer',
1781 | 'sun',
1782 | 'sunny',
1783 | 'sunset',
1784 | 'super',
1785 | 'supply',
1786 | 'supreme',
1787 | 'sure',
1788 | 'surface',
1789 | 'surge',
1790 | 'surprise',
1791 | 'surround',
1792 | 'survey',
1793 | 'suspect',
1794 | 'sustain',
1795 | 'swallow',
1796 | 'swamp',
1797 | 'swap',
1798 | 'swarm',
1799 | 'swear',
1800 | 'sweet',
1801 | 'swift',
1802 | 'swim',
1803 | 'swing',
1804 | 'switch',
1805 | 'sword',
1806 | 'symbol',
1807 | 'symptom',
1808 | 'syrup',
1809 | 'system',
1810 | 'table',
1811 | 'tackle',
1812 | 'tag',
1813 | 'tail',
1814 | 'talent',
1815 | 'talk',
1816 | 'tank',
1817 | 'tape',
1818 | 'target',
1819 | 'task',
1820 | 'taste',
1821 | 'tattoo',
1822 | 'taxi',
1823 | 'teach',
1824 | 'team',
1825 | 'tell',
1826 | 'ten',
1827 | 'tenant',
1828 | 'tennis',
1829 | 'tent',
1830 | 'term',
1831 | 'test',
1832 | 'text',
1833 | 'thank',
1834 | 'that',
1835 | 'theme',
1836 | 'then',
1837 | 'theory',
1838 | 'there',
1839 | 'they',
1840 | 'thing',
1841 | 'this',
1842 | 'thought',
1843 | 'three',
1844 | 'thrive',
1845 | 'throw',
1846 | 'thumb',
1847 | 'thunder',
1848 | 'ticket',
1849 | 'tide',
1850 | 'tiger',
1851 | 'tilt',
1852 | 'timber',
1853 | 'time',
1854 | 'tiny',
1855 | 'tip',
1856 | 'tired',
1857 | 'tissue',
1858 | 'title',
1859 | 'toast',
1860 | 'tobacco',
1861 | 'today',
1862 | 'toddler',
1863 | 'toe',
1864 | 'together',
1865 | 'toilet',
1866 | 'token',
1867 | 'tomato',
1868 | 'tomorrow',
1869 | 'tone',
1870 | 'tongue',
1871 | 'tonight',
1872 | 'tool',
1873 | 'tooth',
1874 | 'top',
1875 | 'topic',
1876 | 'topple',
1877 | 'torch',
1878 | 'tornado',
1879 | 'tortoise',
1880 | 'toss',
1881 | 'total',
1882 | 'tourist',
1883 | 'toward',
1884 | 'tower',
1885 | 'town',
1886 | 'toy',
1887 | 'track',
1888 | 'trade',
1889 | 'traffic',
1890 | 'tragic',
1891 | 'train',
1892 | 'transfer',
1893 | 'trap',
1894 | 'trash',
1895 | 'travel',
1896 | 'tray',
1897 | 'treat',
1898 | 'tree',
1899 | 'trend',
1900 | 'trial',
1901 | 'tribe',
1902 | 'trick',
1903 | 'trigger',
1904 | 'trim',
1905 | 'trip',
1906 | 'trophy',
1907 | 'trouble',
1908 | 'truck',
1909 | 'true',
1910 | 'truly',
1911 | 'trumpet',
1912 | 'trust',
1913 | 'truth',
1914 | 'try',
1915 | 'tube',
1916 | 'tuition',
1917 | 'tumble',
1918 | 'tuna',
1919 | 'tunnel',
1920 | 'turkey',
1921 | 'turn',
1922 | 'turtle',
1923 | 'twelve',
1924 | 'twenty',
1925 | 'twice',
1926 | 'twin',
1927 | 'twist',
1928 | 'two',
1929 | 'type',
1930 | 'typical',
1931 | 'ugly',
1932 | 'umbrella',
1933 | 'unable',
1934 | 'unaware',
1935 | 'uncle',
1936 | 'uncover',
1937 | 'under',
1938 | 'undo',
1939 | 'unfair',
1940 | 'unfold',
1941 | 'unhappy',
1942 | 'uniform',
1943 | 'unique',
1944 | 'unit',
1945 | 'universe',
1946 | 'unknown',
1947 | 'unlock',
1948 | 'until',
1949 | 'unusual',
1950 | 'unveil',
1951 | 'update',
1952 | 'upgrade',
1953 | 'uphold',
1954 | 'upon',
1955 | 'upper',
1956 | 'upset',
1957 | 'urban',
1958 | 'urge',
1959 | 'usage',
1960 | 'use',
1961 | 'used',
1962 | 'useful',
1963 | 'useless',
1964 | 'usual',
1965 | 'utility',
1966 | 'vacant',
1967 | 'vacuum',
1968 | 'vague',
1969 | 'valid',
1970 | 'valley',
1971 | 'valve',
1972 | 'van',
1973 | 'vanish',
1974 | 'vapor',
1975 | 'various',
1976 | 'vast',
1977 | 'vault',
1978 | 'vehicle',
1979 | 'velvet',
1980 | 'vendor',
1981 | 'venture',
1982 | 'venue',
1983 | 'verb',
1984 | 'verify',
1985 | 'version',
1986 | 'very',
1987 | 'vessel',
1988 | 'veteran',
1989 | 'viable',
1990 | 'vibrant',
1991 | 'vicious',
1992 | 'victory',
1993 | 'video',
1994 | 'view',
1995 | 'village',
1996 | 'vintage',
1997 | 'violin',
1998 | 'virtual',
1999 | 'virus',
2000 | 'visa',
2001 | 'visit',
2002 | 'visual',
2003 | 'vital',
2004 | 'vivid',
2005 | 'vocal',
2006 | 'voice',
2007 | 'void',
2008 | 'volcano',
2009 | 'volume',
2010 | 'vote',
2011 | 'voyage',
2012 | 'wage',
2013 | 'wagon',
2014 | 'wait',
2015 | 'walk',
2016 | 'wall',
2017 | 'walnut',
2018 | 'want',
2019 | 'warfare',
2020 | 'warm',
2021 | 'warrior',
2022 | 'wash',
2023 | 'wasp',
2024 | 'waste',
2025 | 'water',
2026 | 'wave',
2027 | 'way',
2028 | 'wealth',
2029 | 'weapon',
2030 | 'wear',
2031 | 'weasel',
2032 | 'weather',
2033 | 'web',
2034 | 'wedding',
2035 | 'weekend',
2036 | 'weird',
2037 | 'welcome',
2038 | 'west',
2039 | 'wet',
2040 | 'whale',
2041 | 'what',
2042 | 'wheat',
2043 | 'wheel',
2044 | 'when',
2045 | 'where',
2046 | 'whip',
2047 | 'whisper',
2048 | 'wide',
2049 | 'width',
2050 | 'wife',
2051 | 'wild',
2052 | 'will',
2053 | 'win',
2054 | 'window',
2055 | 'wine',
2056 | 'wing',
2057 | 'wink',
2058 | 'winner',
2059 | 'winter',
2060 | 'wire',
2061 | 'wisdom',
2062 | 'wise',
2063 | 'wish',
2064 | 'witness',
2065 | 'wolf',
2066 | 'woman',
2067 | 'wonder',
2068 | 'wood',
2069 | 'wool',
2070 | 'word',
2071 | 'work',
2072 | 'world',
2073 | 'worry',
2074 | 'worth',
2075 | 'wrap',
2076 | 'wreck',
2077 | 'wrestle',
2078 | 'wrist',
2079 | 'write',
2080 | 'wrong',
2081 | 'yard',
2082 | 'year',
2083 | 'yellow',
2084 | 'you',
2085 | 'young',
2086 | 'youth',
2087 | 'zebra',
2088 | 'zero',
2089 | 'zone',
2090 | 'zoo',
2091 | ];
2092 |
--------------------------------------------------------------------------------
/src/mnemonic.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.mnemonicToBytes = exports.mnemonicFromBytes = void 0;
4 | function mnemonicFromBytes(bytes) {
5 | const bits = bytesToBinary(Array.from(bytes));
6 | const chunks = bits.match(/(.{1,11})/g);
7 | const words = chunks.map((binary) => {
8 | const index = binaryToByte(binary);
9 | return WORDLIST[index];
10 | });
11 | return words.join(' ');
12 | }
13 | exports.mnemonicFromBytes = mnemonicFromBytes;
14 | function mnemonicToBytes(mnemonic) {
15 | const INVALID = 'Invalid Mnemonic';
16 | const words = mnemonic.split(' ');
17 | if (words.length !== 24)
18 | throw new Error(INVALID);
19 | const bits = words
20 | .map((word) => {
21 | const index = WORDLIST.indexOf(word);
22 | if (index === -1)
23 | throw new Error(INVALID);
24 | return lpad(index.toString(2), '0', 11);
25 | })
26 | .join('');
27 | const entropyBytes = bits.match(/(.{8})/g).map(binaryToByte);
28 | return Buffer.from(entropyBytes);
29 | }
30 | exports.mnemonicToBytes = mnemonicToBytes;
31 | function bytesToBinary(bytes) {
32 | return bytes.map((x) => lpad(x.toString(2), '0', 8)).join('');
33 | }
34 | function binaryToByte(bin) {
35 | return parseInt(bin, 2);
36 | }
37 | function lpad(str, padString, length) {
38 | while (str.length < length)
39 | str = padString + str;
40 | return str;
41 | }
42 | const WORDLIST = [
43 | 'abandon',
44 | 'ability',
45 | 'able',
46 | 'about',
47 | 'above',
48 | 'absent',
49 | 'absorb',
50 | 'abstract',
51 | 'absurd',
52 | 'abuse',
53 | 'access',
54 | 'accident',
55 | 'account',
56 | 'accuse',
57 | 'achieve',
58 | 'acid',
59 | 'acoustic',
60 | 'acquire',
61 | 'across',
62 | 'act',
63 | 'action',
64 | 'actor',
65 | 'actress',
66 | 'actual',
67 | 'adapt',
68 | 'add',
69 | 'addict',
70 | 'address',
71 | 'adjust',
72 | 'admit',
73 | 'adult',
74 | 'advance',
75 | 'advice',
76 | 'aerobic',
77 | 'affair',
78 | 'afford',
79 | 'afraid',
80 | 'again',
81 | 'age',
82 | 'agent',
83 | 'agree',
84 | 'ahead',
85 | 'aim',
86 | 'air',
87 | 'airport',
88 | 'aisle',
89 | 'alarm',
90 | 'album',
91 | 'alcohol',
92 | 'alert',
93 | 'alien',
94 | 'all',
95 | 'alley',
96 | 'allow',
97 | 'almost',
98 | 'alone',
99 | 'alpha',
100 | 'already',
101 | 'also',
102 | 'alter',
103 | 'always',
104 | 'amateur',
105 | 'amazing',
106 | 'among',
107 | 'amount',
108 | 'amused',
109 | 'analyst',
110 | 'anchor',
111 | 'ancient',
112 | 'anger',
113 | 'angle',
114 | 'angry',
115 | 'animal',
116 | 'ankle',
117 | 'announce',
118 | 'annual',
119 | 'another',
120 | 'answer',
121 | 'antenna',
122 | 'antique',
123 | 'anxiety',
124 | 'any',
125 | 'apart',
126 | 'apology',
127 | 'appear',
128 | 'apple',
129 | 'approve',
130 | 'april',
131 | 'arch',
132 | 'arctic',
133 | 'area',
134 | 'arena',
135 | 'argue',
136 | 'arm',
137 | 'armed',
138 | 'armor',
139 | 'army',
140 | 'around',
141 | 'arrange',
142 | 'arrest',
143 | 'arrive',
144 | 'arrow',
145 | 'art',
146 | 'artefact',
147 | 'artist',
148 | 'artwork',
149 | 'ask',
150 | 'aspect',
151 | 'assault',
152 | 'asset',
153 | 'assist',
154 | 'assume',
155 | 'asthma',
156 | 'athlete',
157 | 'atom',
158 | 'attack',
159 | 'attend',
160 | 'attitude',
161 | 'attract',
162 | 'auction',
163 | 'audit',
164 | 'august',
165 | 'aunt',
166 | 'author',
167 | 'auto',
168 | 'autumn',
169 | 'average',
170 | 'avocado',
171 | 'avoid',
172 | 'awake',
173 | 'aware',
174 | 'away',
175 | 'awesome',
176 | 'awful',
177 | 'awkward',
178 | 'axis',
179 | 'baby',
180 | 'bachelor',
181 | 'bacon',
182 | 'badge',
183 | 'bag',
184 | 'balance',
185 | 'balcony',
186 | 'ball',
187 | 'bamboo',
188 | 'banana',
189 | 'banner',
190 | 'bar',
191 | 'barely',
192 | 'bargain',
193 | 'barrel',
194 | 'base',
195 | 'basic',
196 | 'basket',
197 | 'battle',
198 | 'beach',
199 | 'bean',
200 | 'beauty',
201 | 'because',
202 | 'become',
203 | 'beef',
204 | 'before',
205 | 'begin',
206 | 'behave',
207 | 'behind',
208 | 'believe',
209 | 'below',
210 | 'belt',
211 | 'bench',
212 | 'benefit',
213 | 'best',
214 | 'betray',
215 | 'better',
216 | 'between',
217 | 'beyond',
218 | 'bicycle',
219 | 'bid',
220 | 'bike',
221 | 'bind',
222 | 'biology',
223 | 'bird',
224 | 'birth',
225 | 'bitter',
226 | 'black',
227 | 'blade',
228 | 'blame',
229 | 'blanket',
230 | 'blast',
231 | 'bleak',
232 | 'bless',
233 | 'blind',
234 | 'blood',
235 | 'blossom',
236 | 'blouse',
237 | 'blue',
238 | 'blur',
239 | 'blush',
240 | 'board',
241 | 'boat',
242 | 'body',
243 | 'boil',
244 | 'bomb',
245 | 'bone',
246 | 'bonus',
247 | 'book',
248 | 'boost',
249 | 'border',
250 | 'boring',
251 | 'borrow',
252 | 'boss',
253 | 'bottom',
254 | 'bounce',
255 | 'box',
256 | 'boy',
257 | 'bracket',
258 | 'brain',
259 | 'brand',
260 | 'brass',
261 | 'brave',
262 | 'bread',
263 | 'breeze',
264 | 'brick',
265 | 'bridge',
266 | 'brief',
267 | 'bright',
268 | 'bring',
269 | 'brisk',
270 | 'broccoli',
271 | 'broken',
272 | 'bronze',
273 | 'broom',
274 | 'brother',
275 | 'brown',
276 | 'brush',
277 | 'bubble',
278 | 'buddy',
279 | 'budget',
280 | 'buffalo',
281 | 'build',
282 | 'bulb',
283 | 'bulk',
284 | 'bullet',
285 | 'bundle',
286 | 'bunker',
287 | 'burden',
288 | 'burger',
289 | 'burst',
290 | 'bus',
291 | 'business',
292 | 'busy',
293 | 'butter',
294 | 'buyer',
295 | 'buzz',
296 | 'cabbage',
297 | 'cabin',
298 | 'cable',
299 | 'cactus',
300 | 'cage',
301 | 'cake',
302 | 'call',
303 | 'calm',
304 | 'camera',
305 | 'camp',
306 | 'can',
307 | 'canal',
308 | 'cancel',
309 | 'candy',
310 | 'cannon',
311 | 'canoe',
312 | 'canvas',
313 | 'canyon',
314 | 'capable',
315 | 'capital',
316 | 'captain',
317 | 'car',
318 | 'carbon',
319 | 'card',
320 | 'cargo',
321 | 'carpet',
322 | 'carry',
323 | 'cart',
324 | 'case',
325 | 'cash',
326 | 'casino',
327 | 'castle',
328 | 'casual',
329 | 'cat',
330 | 'catalog',
331 | 'catch',
332 | 'category',
333 | 'cattle',
334 | 'caught',
335 | 'cause',
336 | 'caution',
337 | 'cave',
338 | 'ceiling',
339 | 'celery',
340 | 'cement',
341 | 'census',
342 | 'century',
343 | 'cereal',
344 | 'certain',
345 | 'chair',
346 | 'chalk',
347 | 'champion',
348 | 'change',
349 | 'chaos',
350 | 'chapter',
351 | 'charge',
352 | 'chase',
353 | 'chat',
354 | 'cheap',
355 | 'check',
356 | 'cheese',
357 | 'chef',
358 | 'cherry',
359 | 'chest',
360 | 'chicken',
361 | 'chief',
362 | 'child',
363 | 'chimney',
364 | 'choice',
365 | 'choose',
366 | 'chronic',
367 | 'chuckle',
368 | 'chunk',
369 | 'churn',
370 | 'cigar',
371 | 'cinnamon',
372 | 'circle',
373 | 'citizen',
374 | 'city',
375 | 'civil',
376 | 'claim',
377 | 'clap',
378 | 'clarify',
379 | 'claw',
380 | 'clay',
381 | 'clean',
382 | 'clerk',
383 | 'clever',
384 | 'click',
385 | 'client',
386 | 'cliff',
387 | 'climb',
388 | 'clinic',
389 | 'clip',
390 | 'clock',
391 | 'clog',
392 | 'close',
393 | 'cloth',
394 | 'cloud',
395 | 'clown',
396 | 'club',
397 | 'clump',
398 | 'cluster',
399 | 'clutch',
400 | 'coach',
401 | 'coast',
402 | 'coconut',
403 | 'code',
404 | 'coffee',
405 | 'coil',
406 | 'coin',
407 | 'collect',
408 | 'color',
409 | 'column',
410 | 'combine',
411 | 'come',
412 | 'comfort',
413 | 'comic',
414 | 'common',
415 | 'company',
416 | 'concert',
417 | 'conduct',
418 | 'confirm',
419 | 'congress',
420 | 'connect',
421 | 'consider',
422 | 'control',
423 | 'convince',
424 | 'cook',
425 | 'cool',
426 | 'copper',
427 | 'copy',
428 | 'coral',
429 | 'core',
430 | 'corn',
431 | 'correct',
432 | 'cost',
433 | 'cotton',
434 | 'couch',
435 | 'country',
436 | 'couple',
437 | 'course',
438 | 'cousin',
439 | 'cover',
440 | 'coyote',
441 | 'crack',
442 | 'cradle',
443 | 'craft',
444 | 'cram',
445 | 'crane',
446 | 'crash',
447 | 'crater',
448 | 'crawl',
449 | 'crazy',
450 | 'cream',
451 | 'credit',
452 | 'creek',
453 | 'crew',
454 | 'cricket',
455 | 'crime',
456 | 'crisp',
457 | 'critic',
458 | 'crop',
459 | 'cross',
460 | 'crouch',
461 | 'crowd',
462 | 'crucial',
463 | 'cruel',
464 | 'cruise',
465 | 'crumble',
466 | 'crunch',
467 | 'crush',
468 | 'cry',
469 | 'crystal',
470 | 'cube',
471 | 'culture',
472 | 'cup',
473 | 'cupboard',
474 | 'curious',
475 | 'current',
476 | 'curtain',
477 | 'curve',
478 | 'cushion',
479 | 'custom',
480 | 'cute',
481 | 'cycle',
482 | 'dad',
483 | 'damage',
484 | 'damp',
485 | 'dance',
486 | 'danger',
487 | 'daring',
488 | 'dash',
489 | 'daughter',
490 | 'dawn',
491 | 'day',
492 | 'deal',
493 | 'debate',
494 | 'debris',
495 | 'decade',
496 | 'december',
497 | 'decide',
498 | 'decline',
499 | 'decorate',
500 | 'decrease',
501 | 'deer',
502 | 'defense',
503 | 'define',
504 | 'defy',
505 | 'degree',
506 | 'delay',
507 | 'deliver',
508 | 'demand',
509 | 'demise',
510 | 'denial',
511 | 'dentist',
512 | 'deny',
513 | 'depart',
514 | 'depend',
515 | 'deposit',
516 | 'depth',
517 | 'deputy',
518 | 'derive',
519 | 'describe',
520 | 'desert',
521 | 'design',
522 | 'desk',
523 | 'despair',
524 | 'destroy',
525 | 'detail',
526 | 'detect',
527 | 'develop',
528 | 'device',
529 | 'devote',
530 | 'diagram',
531 | 'dial',
532 | 'diamond',
533 | 'diary',
534 | 'dice',
535 | 'diesel',
536 | 'diet',
537 | 'differ',
538 | 'digital',
539 | 'dignity',
540 | 'dilemma',
541 | 'dinner',
542 | 'dinosaur',
543 | 'direct',
544 | 'dirt',
545 | 'disagree',
546 | 'discover',
547 | 'disease',
548 | 'dish',
549 | 'dismiss',
550 | 'disorder',
551 | 'display',
552 | 'distance',
553 | 'divert',
554 | 'divide',
555 | 'divorce',
556 | 'dizzy',
557 | 'doctor',
558 | 'document',
559 | 'dog',
560 | 'doll',
561 | 'dolphin',
562 | 'domain',
563 | 'donate',
564 | 'donkey',
565 | 'donor',
566 | 'door',
567 | 'dose',
568 | 'double',
569 | 'dove',
570 | 'draft',
571 | 'dragon',
572 | 'drama',
573 | 'drastic',
574 | 'draw',
575 | 'dream',
576 | 'dress',
577 | 'drift',
578 | 'drill',
579 | 'drink',
580 | 'drip',
581 | 'drive',
582 | 'drop',
583 | 'drum',
584 | 'dry',
585 | 'duck',
586 | 'dumb',
587 | 'dune',
588 | 'during',
589 | 'dust',
590 | 'dutch',
591 | 'duty',
592 | 'dwarf',
593 | 'dynamic',
594 | 'eager',
595 | 'eagle',
596 | 'early',
597 | 'earn',
598 | 'earth',
599 | 'easily',
600 | 'east',
601 | 'easy',
602 | 'echo',
603 | 'ecology',
604 | 'economy',
605 | 'edge',
606 | 'edit',
607 | 'educate',
608 | 'effort',
609 | 'egg',
610 | 'eight',
611 | 'either',
612 | 'elbow',
613 | 'elder',
614 | 'electric',
615 | 'elegant',
616 | 'element',
617 | 'elephant',
618 | 'elevator',
619 | 'elite',
620 | 'else',
621 | 'embark',
622 | 'embody',
623 | 'embrace',
624 | 'emerge',
625 | 'emotion',
626 | 'employ',
627 | 'empower',
628 | 'empty',
629 | 'enable',
630 | 'enact',
631 | 'end',
632 | 'endless',
633 | 'endorse',
634 | 'enemy',
635 | 'energy',
636 | 'enforce',
637 | 'engage',
638 | 'engine',
639 | 'enhance',
640 | 'enjoy',
641 | 'enlist',
642 | 'enough',
643 | 'enrich',
644 | 'enroll',
645 | 'ensure',
646 | 'enter',
647 | 'entire',
648 | 'entry',
649 | 'envelope',
650 | 'episode',
651 | 'equal',
652 | 'equip',
653 | 'era',
654 | 'erase',
655 | 'erode',
656 | 'erosion',
657 | 'error',
658 | 'erupt',
659 | 'escape',
660 | 'essay',
661 | 'essence',
662 | 'estate',
663 | 'eternal',
664 | 'ethics',
665 | 'evidence',
666 | 'evil',
667 | 'evoke',
668 | 'evolve',
669 | 'exact',
670 | 'example',
671 | 'excess',
672 | 'exchange',
673 | 'excite',
674 | 'exclude',
675 | 'excuse',
676 | 'execute',
677 | 'exercise',
678 | 'exhaust',
679 | 'exhibit',
680 | 'exile',
681 | 'exist',
682 | 'exit',
683 | 'exotic',
684 | 'expand',
685 | 'expect',
686 | 'expire',
687 | 'explain',
688 | 'expose',
689 | 'express',
690 | 'extend',
691 | 'extra',
692 | 'eye',
693 | 'eyebrow',
694 | 'fabric',
695 | 'face',
696 | 'faculty',
697 | 'fade',
698 | 'faint',
699 | 'faith',
700 | 'fall',
701 | 'false',
702 | 'fame',
703 | 'family',
704 | 'famous',
705 | 'fan',
706 | 'fancy',
707 | 'fantasy',
708 | 'farm',
709 | 'fashion',
710 | 'fat',
711 | 'fatal',
712 | 'father',
713 | 'fatigue',
714 | 'fault',
715 | 'favorite',
716 | 'feature',
717 | 'february',
718 | 'federal',
719 | 'fee',
720 | 'feed',
721 | 'feel',
722 | 'female',
723 | 'fence',
724 | 'festival',
725 | 'fetch',
726 | 'fever',
727 | 'few',
728 | 'fiber',
729 | 'fiction',
730 | 'field',
731 | 'figure',
732 | 'file',
733 | 'film',
734 | 'filter',
735 | 'final',
736 | 'find',
737 | 'fine',
738 | 'finger',
739 | 'finish',
740 | 'fire',
741 | 'firm',
742 | 'first',
743 | 'fiscal',
744 | 'fish',
745 | 'fit',
746 | 'fitness',
747 | 'fix',
748 | 'flag',
749 | 'flame',
750 | 'flash',
751 | 'flat',
752 | 'flavor',
753 | 'flee',
754 | 'flight',
755 | 'flip',
756 | 'float',
757 | 'flock',
758 | 'floor',
759 | 'flower',
760 | 'fluid',
761 | 'flush',
762 | 'fly',
763 | 'foam',
764 | 'focus',
765 | 'fog',
766 | 'foil',
767 | 'fold',
768 | 'follow',
769 | 'food',
770 | 'foot',
771 | 'force',
772 | 'forest',
773 | 'forget',
774 | 'fork',
775 | 'fortune',
776 | 'forum',
777 | 'forward',
778 | 'fossil',
779 | 'foster',
780 | 'found',
781 | 'fox',
782 | 'fragile',
783 | 'frame',
784 | 'frequent',
785 | 'fresh',
786 | 'friend',
787 | 'fringe',
788 | 'frog',
789 | 'front',
790 | 'frost',
791 | 'frown',
792 | 'frozen',
793 | 'fruit',
794 | 'fuel',
795 | 'fun',
796 | 'funny',
797 | 'furnace',
798 | 'fury',
799 | 'future',
800 | 'gadget',
801 | 'gain',
802 | 'galaxy',
803 | 'gallery',
804 | 'game',
805 | 'gap',
806 | 'garage',
807 | 'garbage',
808 | 'garden',
809 | 'garlic',
810 | 'garment',
811 | 'gas',
812 | 'gasp',
813 | 'gate',
814 | 'gather',
815 | 'gauge',
816 | 'gaze',
817 | 'general',
818 | 'genius',
819 | 'genre',
820 | 'gentle',
821 | 'genuine',
822 | 'gesture',
823 | 'ghost',
824 | 'giant',
825 | 'gift',
826 | 'giggle',
827 | 'ginger',
828 | 'giraffe',
829 | 'girl',
830 | 'give',
831 | 'glad',
832 | 'glance',
833 | 'glare',
834 | 'glass',
835 | 'glide',
836 | 'glimpse',
837 | 'globe',
838 | 'gloom',
839 | 'glory',
840 | 'glove',
841 | 'glow',
842 | 'glue',
843 | 'goat',
844 | 'goddess',
845 | 'gold',
846 | 'good',
847 | 'goose',
848 | 'gorilla',
849 | 'gospel',
850 | 'gossip',
851 | 'govern',
852 | 'gown',
853 | 'grab',
854 | 'grace',
855 | 'grain',
856 | 'grant',
857 | 'grape',
858 | 'grass',
859 | 'gravity',
860 | 'great',
861 | 'green',
862 | 'grid',
863 | 'grief',
864 | 'grit',
865 | 'grocery',
866 | 'group',
867 | 'grow',
868 | 'grunt',
869 | 'guard',
870 | 'guess',
871 | 'guide',
872 | 'guilt',
873 | 'guitar',
874 | 'gun',
875 | 'gym',
876 | 'habit',
877 | 'hair',
878 | 'half',
879 | 'hammer',
880 | 'hamster',
881 | 'hand',
882 | 'happy',
883 | 'harbor',
884 | 'hard',
885 | 'harsh',
886 | 'harvest',
887 | 'hat',
888 | 'have',
889 | 'hawk',
890 | 'hazard',
891 | 'head',
892 | 'health',
893 | 'heart',
894 | 'heavy',
895 | 'hedgehog',
896 | 'height',
897 | 'hello',
898 | 'helmet',
899 | 'help',
900 | 'hen',
901 | 'hero',
902 | 'hidden',
903 | 'high',
904 | 'hill',
905 | 'hint',
906 | 'hip',
907 | 'hire',
908 | 'history',
909 | 'hobby',
910 | 'hockey',
911 | 'hold',
912 | 'hole',
913 | 'holiday',
914 | 'hollow',
915 | 'home',
916 | 'honey',
917 | 'hood',
918 | 'hope',
919 | 'horn',
920 | 'horror',
921 | 'horse',
922 | 'hospital',
923 | 'host',
924 | 'hotel',
925 | 'hour',
926 | 'hover',
927 | 'hub',
928 | 'huge',
929 | 'human',
930 | 'humble',
931 | 'humor',
932 | 'hundred',
933 | 'hungry',
934 | 'hunt',
935 | 'hurdle',
936 | 'hurry',
937 | 'hurt',
938 | 'husband',
939 | 'hybrid',
940 | 'ice',
941 | 'icon',
942 | 'idea',
943 | 'identify',
944 | 'idle',
945 | 'ignore',
946 | 'ill',
947 | 'illegal',
948 | 'illness',
949 | 'image',
950 | 'imitate',
951 | 'immense',
952 | 'immune',
953 | 'impact',
954 | 'impose',
955 | 'improve',
956 | 'impulse',
957 | 'inch',
958 | 'include',
959 | 'income',
960 | 'increase',
961 | 'index',
962 | 'indicate',
963 | 'indoor',
964 | 'industry',
965 | 'infant',
966 | 'inflict',
967 | 'inform',
968 | 'inhale',
969 | 'inherit',
970 | 'initial',
971 | 'inject',
972 | 'injury',
973 | 'inmate',
974 | 'inner',
975 | 'innocent',
976 | 'input',
977 | 'inquiry',
978 | 'insane',
979 | 'insect',
980 | 'inside',
981 | 'inspire',
982 | 'install',
983 | 'intact',
984 | 'interest',
985 | 'into',
986 | 'invest',
987 | 'invite',
988 | 'involve',
989 | 'iron',
990 | 'island',
991 | 'isolate',
992 | 'issue',
993 | 'item',
994 | 'ivory',
995 | 'jacket',
996 | 'jaguar',
997 | 'jar',
998 | 'jazz',
999 | 'jealous',
1000 | 'jeans',
1001 | 'jelly',
1002 | 'jewel',
1003 | 'job',
1004 | 'join',
1005 | 'joke',
1006 | 'journey',
1007 | 'joy',
1008 | 'judge',
1009 | 'juice',
1010 | 'jump',
1011 | 'jungle',
1012 | 'junior',
1013 | 'junk',
1014 | 'just',
1015 | 'kangaroo',
1016 | 'keen',
1017 | 'keep',
1018 | 'ketchup',
1019 | 'key',
1020 | 'kick',
1021 | 'kid',
1022 | 'kidney',
1023 | 'kind',
1024 | 'kingdom',
1025 | 'kiss',
1026 | 'kit',
1027 | 'kitchen',
1028 | 'kite',
1029 | 'kitten',
1030 | 'kiwi',
1031 | 'knee',
1032 | 'knife',
1033 | 'knock',
1034 | 'know',
1035 | 'lab',
1036 | 'label',
1037 | 'labor',
1038 | 'ladder',
1039 | 'lady',
1040 | 'lake',
1041 | 'lamp',
1042 | 'language',
1043 | 'laptop',
1044 | 'large',
1045 | 'later',
1046 | 'latin',
1047 | 'laugh',
1048 | 'laundry',
1049 | 'lava',
1050 | 'law',
1051 | 'lawn',
1052 | 'lawsuit',
1053 | 'layer',
1054 | 'lazy',
1055 | 'leader',
1056 | 'leaf',
1057 | 'learn',
1058 | 'leave',
1059 | 'lecture',
1060 | 'left',
1061 | 'leg',
1062 | 'legal',
1063 | 'legend',
1064 | 'leisure',
1065 | 'lemon',
1066 | 'lend',
1067 | 'length',
1068 | 'lens',
1069 | 'leopard',
1070 | 'lesson',
1071 | 'letter',
1072 | 'level',
1073 | 'liar',
1074 | 'liberty',
1075 | 'library',
1076 | 'license',
1077 | 'life',
1078 | 'lift',
1079 | 'light',
1080 | 'like',
1081 | 'limb',
1082 | 'limit',
1083 | 'link',
1084 | 'lion',
1085 | 'liquid',
1086 | 'list',
1087 | 'little',
1088 | 'live',
1089 | 'lizard',
1090 | 'load',
1091 | 'loan',
1092 | 'lobster',
1093 | 'local',
1094 | 'lock',
1095 | 'logic',
1096 | 'lonely',
1097 | 'long',
1098 | 'loop',
1099 | 'lottery',
1100 | 'loud',
1101 | 'lounge',
1102 | 'love',
1103 | 'loyal',
1104 | 'lucky',
1105 | 'luggage',
1106 | 'lumber',
1107 | 'lunar',
1108 | 'lunch',
1109 | 'luxury',
1110 | 'lyrics',
1111 | 'machine',
1112 | 'mad',
1113 | 'magic',
1114 | 'magnet',
1115 | 'maid',
1116 | 'mail',
1117 | 'main',
1118 | 'major',
1119 | 'make',
1120 | 'mammal',
1121 | 'man',
1122 | 'manage',
1123 | 'mandate',
1124 | 'mango',
1125 | 'mansion',
1126 | 'manual',
1127 | 'maple',
1128 | 'marble',
1129 | 'march',
1130 | 'margin',
1131 | 'marine',
1132 | 'market',
1133 | 'marriage',
1134 | 'mask',
1135 | 'mass',
1136 | 'master',
1137 | 'match',
1138 | 'material',
1139 | 'math',
1140 | 'matrix',
1141 | 'matter',
1142 | 'maximum',
1143 | 'maze',
1144 | 'meadow',
1145 | 'mean',
1146 | 'measure',
1147 | 'meat',
1148 | 'mechanic',
1149 | 'medal',
1150 | 'media',
1151 | 'melody',
1152 | 'melt',
1153 | 'member',
1154 | 'memory',
1155 | 'mention',
1156 | 'menu',
1157 | 'mercy',
1158 | 'merge',
1159 | 'merit',
1160 | 'merry',
1161 | 'mesh',
1162 | 'message',
1163 | 'metal',
1164 | 'method',
1165 | 'middle',
1166 | 'midnight',
1167 | 'milk',
1168 | 'million',
1169 | 'mimic',
1170 | 'mind',
1171 | 'minimum',
1172 | 'minor',
1173 | 'minute',
1174 | 'miracle',
1175 | 'mirror',
1176 | 'misery',
1177 | 'miss',
1178 | 'mistake',
1179 | 'mix',
1180 | 'mixed',
1181 | 'mixture',
1182 | 'mobile',
1183 | 'model',
1184 | 'modify',
1185 | 'mom',
1186 | 'moment',
1187 | 'monitor',
1188 | 'monkey',
1189 | 'monster',
1190 | 'month',
1191 | 'moon',
1192 | 'moral',
1193 | 'more',
1194 | 'morning',
1195 | 'mosquito',
1196 | 'mother',
1197 | 'motion',
1198 | 'motor',
1199 | 'mountain',
1200 | 'mouse',
1201 | 'move',
1202 | 'movie',
1203 | 'much',
1204 | 'muffin',
1205 | 'mule',
1206 | 'multiply',
1207 | 'muscle',
1208 | 'museum',
1209 | 'mushroom',
1210 | 'music',
1211 | 'must',
1212 | 'mutual',
1213 | 'myself',
1214 | 'mystery',
1215 | 'myth',
1216 | 'naive',
1217 | 'name',
1218 | 'napkin',
1219 | 'narrow',
1220 | 'nasty',
1221 | 'nation',
1222 | 'nature',
1223 | 'near',
1224 | 'neck',
1225 | 'need',
1226 | 'negative',
1227 | 'neglect',
1228 | 'neither',
1229 | 'nephew',
1230 | 'nerve',
1231 | 'nest',
1232 | 'net',
1233 | 'network',
1234 | 'neutral',
1235 | 'never',
1236 | 'news',
1237 | 'next',
1238 | 'nice',
1239 | 'night',
1240 | 'noble',
1241 | 'noise',
1242 | 'nominee',
1243 | 'noodle',
1244 | 'normal',
1245 | 'north',
1246 | 'nose',
1247 | 'notable',
1248 | 'note',
1249 | 'nothing',
1250 | 'notice',
1251 | 'novel',
1252 | 'now',
1253 | 'nuclear',
1254 | 'number',
1255 | 'nurse',
1256 | 'nut',
1257 | 'oak',
1258 | 'obey',
1259 | 'object',
1260 | 'oblige',
1261 | 'obscure',
1262 | 'observe',
1263 | 'obtain',
1264 | 'obvious',
1265 | 'occur',
1266 | 'ocean',
1267 | 'october',
1268 | 'odor',
1269 | 'off',
1270 | 'offer',
1271 | 'office',
1272 | 'often',
1273 | 'oil',
1274 | 'okay',
1275 | 'old',
1276 | 'olive',
1277 | 'olympic',
1278 | 'omit',
1279 | 'once',
1280 | 'one',
1281 | 'onion',
1282 | 'online',
1283 | 'only',
1284 | 'open',
1285 | 'opera',
1286 | 'opinion',
1287 | 'oppose',
1288 | 'option',
1289 | 'orange',
1290 | 'orbit',
1291 | 'orchard',
1292 | 'order',
1293 | 'ordinary',
1294 | 'organ',
1295 | 'orient',
1296 | 'original',
1297 | 'orphan',
1298 | 'ostrich',
1299 | 'other',
1300 | 'outdoor',
1301 | 'outer',
1302 | 'output',
1303 | 'outside',
1304 | 'oval',
1305 | 'oven',
1306 | 'over',
1307 | 'own',
1308 | 'owner',
1309 | 'oxygen',
1310 | 'oyster',
1311 | 'ozone',
1312 | 'pact',
1313 | 'paddle',
1314 | 'page',
1315 | 'pair',
1316 | 'palace',
1317 | 'palm',
1318 | 'panda',
1319 | 'panel',
1320 | 'panic',
1321 | 'panther',
1322 | 'paper',
1323 | 'parade',
1324 | 'parent',
1325 | 'park',
1326 | 'parrot',
1327 | 'party',
1328 | 'pass',
1329 | 'patch',
1330 | 'path',
1331 | 'patient',
1332 | 'patrol',
1333 | 'pattern',
1334 | 'pause',
1335 | 'pave',
1336 | 'payment',
1337 | 'peace',
1338 | 'peanut',
1339 | 'pear',
1340 | 'peasant',
1341 | 'pelican',
1342 | 'pen',
1343 | 'penalty',
1344 | 'pencil',
1345 | 'people',
1346 | 'pepper',
1347 | 'perfect',
1348 | 'permit',
1349 | 'person',
1350 | 'pet',
1351 | 'phone',
1352 | 'photo',
1353 | 'phrase',
1354 | 'physical',
1355 | 'piano',
1356 | 'picnic',
1357 | 'picture',
1358 | 'piece',
1359 | 'pig',
1360 | 'pigeon',
1361 | 'pill',
1362 | 'pilot',
1363 | 'pink',
1364 | 'pioneer',
1365 | 'pipe',
1366 | 'pistol',
1367 | 'pitch',
1368 | 'pizza',
1369 | 'place',
1370 | 'planet',
1371 | 'plastic',
1372 | 'plate',
1373 | 'play',
1374 | 'please',
1375 | 'pledge',
1376 | 'pluck',
1377 | 'plug',
1378 | 'plunge',
1379 | 'poem',
1380 | 'poet',
1381 | 'point',
1382 | 'polar',
1383 | 'pole',
1384 | 'police',
1385 | 'pond',
1386 | 'pony',
1387 | 'pool',
1388 | 'popular',
1389 | 'portion',
1390 | 'position',
1391 | 'possible',
1392 | 'post',
1393 | 'potato',
1394 | 'pottery',
1395 | 'poverty',
1396 | 'powder',
1397 | 'power',
1398 | 'practice',
1399 | 'praise',
1400 | 'predict',
1401 | 'prefer',
1402 | 'prepare',
1403 | 'present',
1404 | 'pretty',
1405 | 'prevent',
1406 | 'price',
1407 | 'pride',
1408 | 'primary',
1409 | 'print',
1410 | 'priority',
1411 | 'prison',
1412 | 'private',
1413 | 'prize',
1414 | 'problem',
1415 | 'process',
1416 | 'produce',
1417 | 'profit',
1418 | 'program',
1419 | 'project',
1420 | 'promote',
1421 | 'proof',
1422 | 'property',
1423 | 'prosper',
1424 | 'protect',
1425 | 'proud',
1426 | 'provide',
1427 | 'public',
1428 | 'pudding',
1429 | 'pull',
1430 | 'pulp',
1431 | 'pulse',
1432 | 'pumpkin',
1433 | 'punch',
1434 | 'pupil',
1435 | 'puppy',
1436 | 'purchase',
1437 | 'purity',
1438 | 'purpose',
1439 | 'purse',
1440 | 'push',
1441 | 'put',
1442 | 'puzzle',
1443 | 'pyramid',
1444 | 'quality',
1445 | 'quantum',
1446 | 'quarter',
1447 | 'question',
1448 | 'quick',
1449 | 'quit',
1450 | 'quiz',
1451 | 'quote',
1452 | 'rabbit',
1453 | 'raccoon',
1454 | 'race',
1455 | 'rack',
1456 | 'radar',
1457 | 'radio',
1458 | 'rail',
1459 | 'rain',
1460 | 'raise',
1461 | 'rally',
1462 | 'ramp',
1463 | 'ranch',
1464 | 'random',
1465 | 'range',
1466 | 'rapid',
1467 | 'rare',
1468 | 'rate',
1469 | 'rather',
1470 | 'raven',
1471 | 'raw',
1472 | 'razor',
1473 | 'ready',
1474 | 'real',
1475 | 'reason',
1476 | 'rebel',
1477 | 'rebuild',
1478 | 'recall',
1479 | 'receive',
1480 | 'recipe',
1481 | 'record',
1482 | 'recycle',
1483 | 'reduce',
1484 | 'reflect',
1485 | 'reform',
1486 | 'refuse',
1487 | 'region',
1488 | 'regret',
1489 | 'regular',
1490 | 'reject',
1491 | 'relax',
1492 | 'release',
1493 | 'relief',
1494 | 'rely',
1495 | 'remain',
1496 | 'remember',
1497 | 'remind',
1498 | 'remove',
1499 | 'render',
1500 | 'renew',
1501 | 'rent',
1502 | 'reopen',
1503 | 'repair',
1504 | 'repeat',
1505 | 'replace',
1506 | 'report',
1507 | 'require',
1508 | 'rescue',
1509 | 'resemble',
1510 | 'resist',
1511 | 'resource',
1512 | 'response',
1513 | 'result',
1514 | 'retire',
1515 | 'retreat',
1516 | 'return',
1517 | 'reunion',
1518 | 'reveal',
1519 | 'review',
1520 | 'reward',
1521 | 'rhythm',
1522 | 'rib',
1523 | 'ribbon',
1524 | 'rice',
1525 | 'rich',
1526 | 'ride',
1527 | 'ridge',
1528 | 'rifle',
1529 | 'right',
1530 | 'rigid',
1531 | 'ring',
1532 | 'riot',
1533 | 'ripple',
1534 | 'risk',
1535 | 'ritual',
1536 | 'rival',
1537 | 'river',
1538 | 'road',
1539 | 'roast',
1540 | 'robot',
1541 | 'robust',
1542 | 'rocket',
1543 | 'romance',
1544 | 'roof',
1545 | 'rookie',
1546 | 'room',
1547 | 'rose',
1548 | 'rotate',
1549 | 'rough',
1550 | 'round',
1551 | 'route',
1552 | 'royal',
1553 | 'rubber',
1554 | 'rude',
1555 | 'rug',
1556 | 'rule',
1557 | 'run',
1558 | 'runway',
1559 | 'rural',
1560 | 'sad',
1561 | 'saddle',
1562 | 'sadness',
1563 | 'safe',
1564 | 'sail',
1565 | 'salad',
1566 | 'salmon',
1567 | 'salon',
1568 | 'salt',
1569 | 'salute',
1570 | 'same',
1571 | 'sample',
1572 | 'sand',
1573 | 'satisfy',
1574 | 'satoshi',
1575 | 'sauce',
1576 | 'sausage',
1577 | 'save',
1578 | 'say',
1579 | 'scale',
1580 | 'scan',
1581 | 'scare',
1582 | 'scatter',
1583 | 'scene',
1584 | 'scheme',
1585 | 'school',
1586 | 'science',
1587 | 'scissors',
1588 | 'scorpion',
1589 | 'scout',
1590 | 'scrap',
1591 | 'screen',
1592 | 'script',
1593 | 'scrub',
1594 | 'sea',
1595 | 'search',
1596 | 'season',
1597 | 'seat',
1598 | 'second',
1599 | 'secret',
1600 | 'section',
1601 | 'security',
1602 | 'seed',
1603 | 'seek',
1604 | 'segment',
1605 | 'select',
1606 | 'sell',
1607 | 'seminar',
1608 | 'senior',
1609 | 'sense',
1610 | 'sentence',
1611 | 'series',
1612 | 'service',
1613 | 'session',
1614 | 'settle',
1615 | 'setup',
1616 | 'seven',
1617 | 'shadow',
1618 | 'shaft',
1619 | 'shallow',
1620 | 'share',
1621 | 'shed',
1622 | 'shell',
1623 | 'sheriff',
1624 | 'shield',
1625 | 'shift',
1626 | 'shine',
1627 | 'ship',
1628 | 'shiver',
1629 | 'shock',
1630 | 'shoe',
1631 | 'shoot',
1632 | 'shop',
1633 | 'short',
1634 | 'shoulder',
1635 | 'shove',
1636 | 'shrimp',
1637 | 'shrug',
1638 | 'shuffle',
1639 | 'shy',
1640 | 'sibling',
1641 | 'sick',
1642 | 'side',
1643 | 'siege',
1644 | 'sight',
1645 | 'sign',
1646 | 'silent',
1647 | 'silk',
1648 | 'silly',
1649 | 'silver',
1650 | 'similar',
1651 | 'simple',
1652 | 'since',
1653 | 'sing',
1654 | 'siren',
1655 | 'sister',
1656 | 'situate',
1657 | 'six',
1658 | 'size',
1659 | 'skate',
1660 | 'sketch',
1661 | 'ski',
1662 | 'skill',
1663 | 'skin',
1664 | 'skirt',
1665 | 'skull',
1666 | 'slab',
1667 | 'slam',
1668 | 'sleep',
1669 | 'slender',
1670 | 'slice',
1671 | 'slide',
1672 | 'slight',
1673 | 'slim',
1674 | 'slogan',
1675 | 'slot',
1676 | 'slow',
1677 | 'slush',
1678 | 'small',
1679 | 'smart',
1680 | 'smile',
1681 | 'smoke',
1682 | 'smooth',
1683 | 'snack',
1684 | 'snake',
1685 | 'snap',
1686 | 'sniff',
1687 | 'snow',
1688 | 'soap',
1689 | 'soccer',
1690 | 'social',
1691 | 'sock',
1692 | 'soda',
1693 | 'soft',
1694 | 'solar',
1695 | 'soldier',
1696 | 'solid',
1697 | 'solution',
1698 | 'solve',
1699 | 'someone',
1700 | 'song',
1701 | 'soon',
1702 | 'sorry',
1703 | 'sort',
1704 | 'soul',
1705 | 'sound',
1706 | 'soup',
1707 | 'source',
1708 | 'south',
1709 | 'space',
1710 | 'spare',
1711 | 'spatial',
1712 | 'spawn',
1713 | 'speak',
1714 | 'special',
1715 | 'speed',
1716 | 'spell',
1717 | 'spend',
1718 | 'sphere',
1719 | 'spice',
1720 | 'spider',
1721 | 'spike',
1722 | 'spin',
1723 | 'spirit',
1724 | 'split',
1725 | 'spoil',
1726 | 'sponsor',
1727 | 'spoon',
1728 | 'sport',
1729 | 'spot',
1730 | 'spray',
1731 | 'spread',
1732 | 'spring',
1733 | 'spy',
1734 | 'square',
1735 | 'squeeze',
1736 | 'squirrel',
1737 | 'stable',
1738 | 'stadium',
1739 | 'staff',
1740 | 'stage',
1741 | 'stairs',
1742 | 'stamp',
1743 | 'stand',
1744 | 'start',
1745 | 'state',
1746 | 'stay',
1747 | 'steak',
1748 | 'steel',
1749 | 'stem',
1750 | 'step',
1751 | 'stereo',
1752 | 'stick',
1753 | 'still',
1754 | 'sting',
1755 | 'stock',
1756 | 'stomach',
1757 | 'stone',
1758 | 'stool',
1759 | 'story',
1760 | 'stove',
1761 | 'strategy',
1762 | 'street',
1763 | 'strike',
1764 | 'strong',
1765 | 'struggle',
1766 | 'student',
1767 | 'stuff',
1768 | 'stumble',
1769 | 'style',
1770 | 'subject',
1771 | 'submit',
1772 | 'subway',
1773 | 'success',
1774 | 'such',
1775 | 'sudden',
1776 | 'suffer',
1777 | 'sugar',
1778 | 'suggest',
1779 | 'suit',
1780 | 'summer',
1781 | 'sun',
1782 | 'sunny',
1783 | 'sunset',
1784 | 'super',
1785 | 'supply',
1786 | 'supreme',
1787 | 'sure',
1788 | 'surface',
1789 | 'surge',
1790 | 'surprise',
1791 | 'surround',
1792 | 'survey',
1793 | 'suspect',
1794 | 'sustain',
1795 | 'swallow',
1796 | 'swamp',
1797 | 'swap',
1798 | 'swarm',
1799 | 'swear',
1800 | 'sweet',
1801 | 'swift',
1802 | 'swim',
1803 | 'swing',
1804 | 'switch',
1805 | 'sword',
1806 | 'symbol',
1807 | 'symptom',
1808 | 'syrup',
1809 | 'system',
1810 | 'table',
1811 | 'tackle',
1812 | 'tag',
1813 | 'tail',
1814 | 'talent',
1815 | 'talk',
1816 | 'tank',
1817 | 'tape',
1818 | 'target',
1819 | 'task',
1820 | 'taste',
1821 | 'tattoo',
1822 | 'taxi',
1823 | 'teach',
1824 | 'team',
1825 | 'tell',
1826 | 'ten',
1827 | 'tenant',
1828 | 'tennis',
1829 | 'tent',
1830 | 'term',
1831 | 'test',
1832 | 'text',
1833 | 'thank',
1834 | 'that',
1835 | 'theme',
1836 | 'then',
1837 | 'theory',
1838 | 'there',
1839 | 'they',
1840 | 'thing',
1841 | 'this',
1842 | 'thought',
1843 | 'three',
1844 | 'thrive',
1845 | 'throw',
1846 | 'thumb',
1847 | 'thunder',
1848 | 'ticket',
1849 | 'tide',
1850 | 'tiger',
1851 | 'tilt',
1852 | 'timber',
1853 | 'time',
1854 | 'tiny',
1855 | 'tip',
1856 | 'tired',
1857 | 'tissue',
1858 | 'title',
1859 | 'toast',
1860 | 'tobacco',
1861 | 'today',
1862 | 'toddler',
1863 | 'toe',
1864 | 'together',
1865 | 'toilet',
1866 | 'token',
1867 | 'tomato',
1868 | 'tomorrow',
1869 | 'tone',
1870 | 'tongue',
1871 | 'tonight',
1872 | 'tool',
1873 | 'tooth',
1874 | 'top',
1875 | 'topic',
1876 | 'topple',
1877 | 'torch',
1878 | 'tornado',
1879 | 'tortoise',
1880 | 'toss',
1881 | 'total',
1882 | 'tourist',
1883 | 'toward',
1884 | 'tower',
1885 | 'town',
1886 | 'toy',
1887 | 'track',
1888 | 'trade',
1889 | 'traffic',
1890 | 'tragic',
1891 | 'train',
1892 | 'transfer',
1893 | 'trap',
1894 | 'trash',
1895 | 'travel',
1896 | 'tray',
1897 | 'treat',
1898 | 'tree',
1899 | 'trend',
1900 | 'trial',
1901 | 'tribe',
1902 | 'trick',
1903 | 'trigger',
1904 | 'trim',
1905 | 'trip',
1906 | 'trophy',
1907 | 'trouble',
1908 | 'truck',
1909 | 'true',
1910 | 'truly',
1911 | 'trumpet',
1912 | 'trust',
1913 | 'truth',
1914 | 'try',
1915 | 'tube',
1916 | 'tuition',
1917 | 'tumble',
1918 | 'tuna',
1919 | 'tunnel',
1920 | 'turkey',
1921 | 'turn',
1922 | 'turtle',
1923 | 'twelve',
1924 | 'twenty',
1925 | 'twice',
1926 | 'twin',
1927 | 'twist',
1928 | 'two',
1929 | 'type',
1930 | 'typical',
1931 | 'ugly',
1932 | 'umbrella',
1933 | 'unable',
1934 | 'unaware',
1935 | 'uncle',
1936 | 'uncover',
1937 | 'under',
1938 | 'undo',
1939 | 'unfair',
1940 | 'unfold',
1941 | 'unhappy',
1942 | 'uniform',
1943 | 'unique',
1944 | 'unit',
1945 | 'universe',
1946 | 'unknown',
1947 | 'unlock',
1948 | 'until',
1949 | 'unusual',
1950 | 'unveil',
1951 | 'update',
1952 | 'upgrade',
1953 | 'uphold',
1954 | 'upon',
1955 | 'upper',
1956 | 'upset',
1957 | 'urban',
1958 | 'urge',
1959 | 'usage',
1960 | 'use',
1961 | 'used',
1962 | 'useful',
1963 | 'useless',
1964 | 'usual',
1965 | 'utility',
1966 | 'vacant',
1967 | 'vacuum',
1968 | 'vague',
1969 | 'valid',
1970 | 'valley',
1971 | 'valve',
1972 | 'van',
1973 | 'vanish',
1974 | 'vapor',
1975 | 'various',
1976 | 'vast',
1977 | 'vault',
1978 | 'vehicle',
1979 | 'velvet',
1980 | 'vendor',
1981 | 'venture',
1982 | 'venue',
1983 | 'verb',
1984 | 'verify',
1985 | 'version',
1986 | 'very',
1987 | 'vessel',
1988 | 'veteran',
1989 | 'viable',
1990 | 'vibrant',
1991 | 'vicious',
1992 | 'victory',
1993 | 'video',
1994 | 'view',
1995 | 'village',
1996 | 'vintage',
1997 | 'violin',
1998 | 'virtual',
1999 | 'virus',
2000 | 'visa',
2001 | 'visit',
2002 | 'visual',
2003 | 'vital',
2004 | 'vivid',
2005 | 'vocal',
2006 | 'voice',
2007 | 'void',
2008 | 'volcano',
2009 | 'volume',
2010 | 'vote',
2011 | 'voyage',
2012 | 'wage',
2013 | 'wagon',
2014 | 'wait',
2015 | 'walk',
2016 | 'wall',
2017 | 'walnut',
2018 | 'want',
2019 | 'warfare',
2020 | 'warm',
2021 | 'warrior',
2022 | 'wash',
2023 | 'wasp',
2024 | 'waste',
2025 | 'water',
2026 | 'wave',
2027 | 'way',
2028 | 'wealth',
2029 | 'weapon',
2030 | 'wear',
2031 | 'weasel',
2032 | 'weather',
2033 | 'web',
2034 | 'wedding',
2035 | 'weekend',
2036 | 'weird',
2037 | 'welcome',
2038 | 'west',
2039 | 'wet',
2040 | 'whale',
2041 | 'what',
2042 | 'wheat',
2043 | 'wheel',
2044 | 'when',
2045 | 'where',
2046 | 'whip',
2047 | 'whisper',
2048 | 'wide',
2049 | 'width',
2050 | 'wife',
2051 | 'wild',
2052 | 'will',
2053 | 'win',
2054 | 'window',
2055 | 'wine',
2056 | 'wing',
2057 | 'wink',
2058 | 'winner',
2059 | 'winter',
2060 | 'wire',
2061 | 'wisdom',
2062 | 'wise',
2063 | 'wish',
2064 | 'witness',
2065 | 'wolf',
2066 | 'woman',
2067 | 'wonder',
2068 | 'wood',
2069 | 'wool',
2070 | 'word',
2071 | 'work',
2072 | 'world',
2073 | 'worry',
2074 | 'worth',
2075 | 'wrap',
2076 | 'wreck',
2077 | 'wrestle',
2078 | 'wrist',
2079 | 'write',
2080 | 'wrong',
2081 | 'yard',
2082 | 'year',
2083 | 'yellow',
2084 | 'you',
2085 | 'young',
2086 | 'youth',
2087 | 'zebra',
2088 | 'zero',
2089 | 'zone',
2090 | 'zoo',
2091 | ];
2092 |
--------------------------------------------------------------------------------