#[macro_use]
mod heap;
#[macro_use]
mod search;
use core::cmp::Ordering;
use crate::core::{Class, Opcode, Rcode, Type};
type I = usize;
type K = u16;
type V<'v> = &'v str;
type Pair = (K, V<'static>);
type Entry = (I, K, V<'static>);
pub struct NamedConstants {
ks: &'static [Entry],
vs: &'static [Entry],
}
pub struct NamedRcodes(NamedConstants);
impl NamedConstants {
pub const fn to_name(&self, k: K) -> Option<V> {
match search!(self.ks, get_k, cmp_k, k) {
Some(entry) => Some(get_v(entry)),
_ => None,
}
}
#[allow(unused)]
#[cfg(any(test, feature = "bench"))]
const fn to_name_linear(&self, k: K) -> Option<V> {
match linear!(self.ks, get_k, cmp_k, k) {
Some(entry) => Some(get_v(entry)),
_ => None,
}
}
pub const fn to_number(&self, v: V) -> Option<K> {
match search!(self.vs, get_v, cmp_v, v) {
Some(entry) => Some(get_k(entry)),
_ => None,
}
}
#[allow(unused)]
#[cfg(any(test, feature = "bench"))]
const fn to_number_linear(&self, v: V) -> Option<K> {
match linear!(self.vs, get_v, cmp_v, v) {
Some(entry) => Some(get_k(entry)),
_ => None,
}
}
}
impl NamedRcodes {
pub const fn to_name_opt(&self, k: K) -> Option<V> {
match k {
16 => Some("BADVERS"),
_ => self.0.to_name(k),
}
}
pub const fn to_name_tsig(&self, k: K) -> Option<V> {
match k {
16 => Some("BADSIG"),
_ => self.0.to_name(k),
}
}
#[allow(unused)]
pub const fn to_number(&self, v: V) -> Option<K> {
self.0.to_number(v)
}
}
macro_rules! replace {
($old:tt $new:expr) => {
$new
};
}
macro_rules! count {
($($token:tt)*) => {<[()]>::len(&[$(replace!($token ())),*])};
}
macro_rules! names {
(@ $vis:vis $named_constants_name:ident[$n:expr] $ty:ident [$($name:ident $text:literal = $value:literal,)*]) => {
::paste::paste! {
impl $ty {
$(
#[doc = concat!("<span>", $text, "</span> (", $value, ")")]
#[allow(unused, non_upper_case_globals)]
pub const $name: Self = Self($value);
)*
}
const [<$named_constants_name _ARRAY>]: ([Entry; $n], [Entry; $n]) = {
let pairs: [Pair; $n] = [$(($value, $text),)*];
let mut ks = [(0, 0, ""); $n];
let mut vs = [(0, 0, ""); $n];
let mut kn = 0;
let mut vn = 0;
let mut i = 0;
while i < pairs.len() {
let (k, v) = pairs[i];
let entry = (i, k, v);
insert!(ks, kn, cmp_ki, entry);
insert!(vs, vn, cmp_vi, entry);
i += 1;
}
drain!(ks, kn, cmp_ki);
drain!(vs, vn, cmp_vi);
(ks, vs)
};
$vis const $named_constants_name: NamedConstants = NamedConstants {
ks: &[<$named_constants_name _ARRAY>].0,
vs: &[<$named_constants_name _ARRAY>].1,
};
}
};
($vis:vis $named_constants_name:ident $ty:ident [$($name:ident $text:literal = $value:literal,)*]) => {
names!(@ $vis $named_constants_name[count!($(($name $text $value))*)] $ty [$($name $text = $value,)*]);
};
}
names!(pub OPCODE Opcode [
Query "Query" = 0,
IQuery "IQuery" = 1,
Status "Status" = 2,
Notify "Notify" = 4,
Update "Update" = 5,
DSO "DSO" = 6,
]);
names!(RCODE_ Rcode [
NoError "NoError" = 0,
FormErr "FormErr" = 1,
ServFail "ServFail" = 2,
NXDomain "NXDomain" = 3,
NotImp "NotImp" = 4,
Refused "Refused" = 5,
YXDomain "YXDomain" = 6,
YXRRSet "YXRRSet" = 7,
NXRRSet "NXRRSet" = 8,
NotAuth "NotAuth" = 9,
NotZone "NotZone" = 10,
DSOTYPENI "DSOTYPENI" = 11,
BADVERS "BADVERS" = 16,
BADSIG "BADSIG" = 16,
BADKEY "BADKEY" = 17,
BADTIME "BADTIME" = 18,
BADMODE "BADMODE" = 19,
BADNAME "BADNAME" = 20,
BADALG "BADALG" = 21,
BADTRUNC "BADTRUNC" = 22,
BADCOOKIE "BADCOOKIE" = 23,
]);
pub const RCODE: NamedRcodes = NamedRcodes(RCODE_);
names!(pub TYPE Type [
A "A" = 1,
NS "NS" = 2,
MD "MD" = 3,
MF "MF" = 4,
CNAME "CNAME" = 5,
SOA "SOA" = 6,
MB "MB" = 7,
MG "MG" = 8,
MR "MR" = 9,
NULL "NULL" = 10,
WKS "WKS" = 11,
PTR "PTR" = 12,
HINFO "HINFO" = 13,
MINFO "MINFO" = 14,
MX "MX" = 15,
TXT "TXT" = 16,
RP "RP" = 17,
AFSDB "AFSDB" = 18,
X25 "X25" = 19,
ISDN "ISDN" = 20,
RT "RT" = 21,
NSAP "NSAP" = 22,
NSAP_PTR "NSAP-PTR" = 23,
SIG "SIG" = 24,
KEY "KEY" = 25,
PX "PX" = 26,
GPOS "GPOS" = 27,
AAAA "AAAA" = 28,
LOC "LOC" = 29,
NXT "NXT" = 30,
EID "EID" = 31,
NIMLOC "NIMLOC" = 32,
SRV "SRV" = 33,
ATMA "ATMA" = 34,
NAPTR "NAPTR" = 35,
KX "KX" = 36,
CERT "CERT" = 37,
A6 "A6" = 38,
DNAME "DNAME" = 39,
SINK "SINK" = 40,
OPT "OPT" = 41,
APL "APL" = 42,
DS "DS" = 43,
SSHFP "SSHFP" = 44,
IPSECKEY "IPSECKEY" = 45,
RRSIG "RRSIG" = 46,
NSEC "NSEC" = 47,
DNSKEY "DNSKEY" = 48,
DHCID "DHCID" = 49,
NSEC3 "NSEC3" = 50,
NSEC3PARAM "NSEC3PARAM" = 51,
TLSA "TLSA" = 52,
SMIMEA "SMIMEA" = 53,
HIP "HIP" = 55,
NINFO "NINFO" = 56,
RKEY "RKEY" = 57,
TALINK "TALINK" = 58,
CDS "CDS" = 59,
CDNSKEY "CDNSKEY" = 60,
OPENPGPKEY "OPENPGPKEY" = 61,
CSYNC "CSYNC" = 62,
ZONEMD "ZONEMD" = 63,
SVCB "SVCB" = 64,
HTTPS "HTTPS" = 65,
DSYNC "DSYNC" = 66,
HHIT "HHIT" = 67,
BRID "BRID" = 68,
SPF "SPF" = 99,
UINFO "UINFO" = 100,
UID "UID" = 101,
GID "GID" = 102,
UNSPEC "UNSPEC" = 103,
NID "NID" = 104,
L32 "L32" = 105,
L64 "L64" = 106,
LP "LP" = 107,
EUI48 "EUI48" = 108,
EUI64 "EUI64" = 109,
NXNAME "NXNAME" = 128,
TKEY "TKEY" = 249,
TSIG "TSIG" = 250,
IXFR "IXFR" = 251,
AXFR "AXFR" = 252,
MAILB "MAILB" = 253,
MAILA "MAILA" = 254,
__ "*" = 255,
ALL "ALL" = 255,
ANY "ANY" = 255,
URI "URI" = 256,
CAA "CAA" = 257,
AVC "AVC" = 258,
DOA "DOA" = 259,
AMTRELAY "AMTRELAY" = 260,
RESINFO "RESINFO" = 261,
WALLET "WALLET" = 262,
CLA "CLA" = 263,
IPN "IPN" = 264,
TA "TA" = 32768,
DLV "DLV" = 32769,
]);
names!(pub CLASS Class [
IN "IN" = 1,
CS "CS" = 2,
CH "CH" = 3,
HS "HS" = 4,
NONE "NONE" = 254,
__ "*" = 255,
ANY "ANY" = 255,
]);
macro_rules! then {
($first:expr $($(, $rest:expr)+)?) => {
match $first {
$(::core::cmp::Ordering::Equal => then!($($rest),*),)?
x => x,
}
};
}
const fn get_i(x: Entry) -> I {
x.0
}
const fn get_k(x: Entry) -> K {
x.1
}
const fn get_v(x: Entry) -> V<'static> {
x.2
}
const fn cmp_ki(p: Entry, q: Entry) -> Ordering {
then!(cmp_k(get_k(p), get_k(q)), cmp_i(get_i(p), get_i(q)))
}
const fn cmp_vi(p: Entry, q: Entry) -> Ordering {
then!(cmp_v(get_v(p), get_v(q)), cmp_i(get_i(p), get_i(q)))
}
const fn cmp_i(p: I, q: I) -> Ordering {
if p < q {
Ordering::Less
} else if p > q {
Ordering::Greater
} else {
Ordering::Equal
}
}
const fn cmp_k(p: K, q: K) -> Ordering {
if p < q {
Ordering::Less
} else if p > q {
Ordering::Greater
} else {
Ordering::Equal
}
}
const fn cmp_v(p: V, q: V) -> Ordering {
let p = p.as_bytes();
let q = q.as_bytes();
let mut i = 0;
loop {
match (i >= p.len(), i >= q.len()) {
(true, true) => break,
(true, _) => return Ordering::Less,
(_, true) => return Ordering::Greater,
(_, _) => {}
}
let p = p[i].to_ascii_uppercase();
let q = q[i].to_ascii_uppercase();
if p < q {
return Ordering::Less;
} else if p > q {
return Ordering::Greater;
}
i += 1;
}
Ordering::Equal
}
#[cfg(test)]
mod test {
use super::{CLASS, RCODE, TYPE};
#[test]
fn any() {
assert_eq!(TYPE.to_name(255), Some("ANY"));
assert_eq!(CLASS.to_name(255), Some("ANY"));
}
#[test]
fn number() {
assert_eq!(TYPE.to_number("cname"), Some(5));
assert_eq!(TYPE.to_number_linear("cname"), Some(5));
assert_eq!(TYPE.to_number("mx"), Some(15));
assert_eq!(TYPE.to_number_linear("mx"), Some(15));
assert_eq!(TYPE.to_number("wks"), Some(11));
assert_eq!(TYPE.to_number_linear("wks"), Some(11));
assert_eq!(RCODE.to_number("badvers"), Some(16));
assert_eq!(RCODE.to_number("badsig"), Some(16));
}
#[test]
fn name() {
assert_eq!(TYPE.to_name(5), Some("CNAME"));
assert_eq!(TYPE.to_name_linear(5), Some("CNAME"));
assert_eq!(TYPE.to_name(11), Some("WKS"));
assert_eq!(TYPE.to_name_linear(11), Some("WKS"));
assert_eq!(TYPE.to_name(15), Some("MX"));
assert_eq!(TYPE.to_name_linear(15), Some("MX"));
assert_eq!(TYPE.to_name(28), Some("AAAA"));
assert_eq!(TYPE.to_name_linear(28), Some("AAAA"));
assert_eq!(TYPE.to_name(257), Some("CAA"));
assert_eq!(TYPE.to_name_linear(257), Some("CAA"));
assert_eq!(RCODE.to_name_opt(16), Some("BADVERS"));
assert_eq!(RCODE.to_name_tsig(16), Some("BADSIG"));
}
#[cfg(feature = "std")]
#[test]
#[ntest::timeout(5000)]
fn infinite() {
use super::*;
let search = 9; #[allow(unused)]
struct Odd(u8);
names!(ODD Odd [ a "a" = 1, b "b" = 2, c "c" = 3, ]);
assert_eq!(ODD.to_name(search), None);
#[allow(unused)]
struct Even(u8);
names!(EVEN Even [ a "a" = 1, b "b" = 2, c "c" = 3, d "d" = 4, ]);
assert_eq!(EVEN.to_name(search), None);
}
}
#[cfg(all(test, feature = "bench"))]
#[rustfmt::skip]
mod bench {
extern crate test;
use test::Bencher;
use test::bench::{black_box as b};
use super::{TYPE, NamedConstants, Entry, Pair, cmp_ki, cmp_vi};
#[bench] fn bee_name_binary(bencher: &mut Bencher) { bencher.iter(|| BEE.to_name(b(429))); }
#[bench] fn bee_name_linear(bencher: &mut Bencher) { bencher.iter(|| BEE.to_name_linear(b(429))); }
#[bench] fn bee_number_binary(bencher: &mut Bencher) { bencher.iter(|| BEE.to_number(b("dies"))); }
#[bench] fn bee_number_linear(bencher: &mut Bencher) { bencher.iter(|| BEE.to_number_linear(b("dies"))); }
#[bench] fn name_binary0(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_name(b(5))); }
#[bench] fn name_binary1(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_name(b(11))); }
#[bench] fn name_binary2(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_name(b(15))); }
#[bench] fn name_binary3(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_name(b(28))); }
#[bench] fn name_binary4(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_name(b(257))); }
#[bench] fn name_linear0(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_name_linear(b(5))); }
#[bench] fn name_linear1(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_name_linear(b(11))); }
#[bench] fn name_linear2(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_name_linear(b(15))); }
#[bench] fn name_linear3(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_name_linear(b(28))); }
#[bench] fn name_linear4(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_name_linear(b(257))); }
#[bench] fn number_binary0(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_number(b("cname"))); }
#[bench] fn number_binary1(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_number(b("mx"))); }
#[bench] fn number_binary2(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_number(b("wks"))); }
#[bench] fn number_linear0(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_number_linear(b("cname"))); }
#[bench] fn number_linear1(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_number_linear(b("mx"))); }
#[bench] fn number_linear2(bencher: &mut Bencher) { bencher.iter(|| TYPE.to_number_linear(b("wks"))); }
#[allow(unused)]
struct Bee(u16);
names!(BEE Bee [
a "a" = 1,
able "able" = 2,
abort "abort" = 3,
aborting "aborting" = 4,
about "about" = 5,
absolutely "absolutely" = 6,
absurd "absurd" = 7,
according "according" = 8,
account "account" = 9,
across "across" = 10,
action "action" = 11,
actor "actor" = 12,
actual "actual" = 13,
actually "actually" = 14,
adam "adam" = 15,
addicted "addicted" = 16,
adjusted "adjusted" = 17,
adrenaline "adrenaline" = 18,
ads "ads" = 19,
advancement "advancement" = 20,
advantage "advantage" = 21,
advisory "advisory" = 22,
affect "affect" = 23,
affects "affects" = 24,
affirmative "affirmative" = 25,
afraid "afraid" = 26,
after "after" = 27,
afternoon "afternoon" = 28,
aftertaste "aftertaste" = 29,
again "again" = 30,
against "against" = 31,
agreed "agreed" = 32,
ahead "ahead" = 33,
aim "aim" = 34,
aiming "aiming" = 35,
air "air" = 36,
airport "airport" = 37,
alaska "alaska" = 38,
alert "alert" = 39,
alive "alive" = 40,
all "all" = 41,
allergic "allergic" = 42,
allow "allow" = 43,
almost "almost" = 44,
alone "alone" = 45,
already "already" = 46,
also "also" = 47,
always "always" = 48,
am "am" = 49,
amazing "amazing" = 50,
amen "amen" = 51,
amusement "amusement" = 52,
an "an" = 53,
anchor "anchor" = 54,
and "and" = 55,
angel "angel" = 56,
anger "anger" = 57,
angry "angry" = 58,
animal "animal" = 59,
animals "animals" = 60,
another "another" = 61,
ant "ant" = 62,
antennae "antennae" = 63,
antennas "antennas" = 64,
antonio "antonio" = 65,
anxiously "anxiously" = 66,
any "any" = 67,
anybody "anybody" = 68,
anyone "anyone" = 69,
anything "anything" = 70,
anyway "anyway" = 71,
anywhere "anywhere" = 72,
approach "approach" = 73,
appropriate "appropriate" = 74,
approved "approved" = 75,
are "are" = 76,
area "area" = 77,
aren "aren" = 78,
around "around" = 79,
arousing "arousing" = 80,
artie "artie" = 81,
artificial "artificial" = 82,
r#as "as" = 83,
ask "ask" = 84,
asked "asked" = 85,
aspect "aspect" = 86,
associate "associate" = 87,
assume "assume" = 88,
assuming "assuming" = 89,
at "at" = 90,
athletic "athletic" = 91,
attack "attack" = 92,
attempting "attempting" = 93,
attendant "attendant" = 94,
attention "attention" = 95,
attorney "attorney" = 96,
attracted "attracted" = 97,
authorities "authorities" = 98,
autograph "autograph" = 99,
automatic "automatic" = 100,
automatically "automatically" = 101,
autopilot "autopilot" = 102,
available "available" = 103,
aviation "aviation" = 104,
aware "aware" = 105,
away "away" = 106,
awful "awful" = 107,
awfully "awfully" = 108,
awkward "awkward" = 109,
b "b" = 110,
babbling "babbling" = 111,
baby "baby" = 112,
back "back" = 113,
backhand "backhand" = 114,
bad "bad" = 115,
badfella "badfella" = 116,
balance "balance" = 117,
bald "bald" = 118,
ball "ball" = 119,
balloon "balloon" = 120,
balm "balm" = 121,
band "band" = 122,
barely "barely" = 123,
barricade "barricade" = 124,
barrier "barrier" = 125,
barry "barry" = 126,
base "base" = 127,
bats "bats" = 128,
battery "battery" = 129,
be "be" = 130,
beams "beams" = 131,
bear "bear" = 132,
beards "beards" = 133,
bears "bears" = 134,
beast "beast" = 135,
beautiful "beautiful" = 136,
because "because" = 137,
bed "bed" = 138,
bedbug "bedbug" = 139,
bee "bee" = 140,
beekeeper "beekeeper" = 141,
beekeepers "beekeepers" = 142,
been "been" = 143,
beep "beep" = 144,
beer "beer" = 145,
bees "bees" = 146,
before "before" = 147,
begin "begin" = 148,
begins "begins" = 149,
behind "behind" = 150,
being "being" = 151,
bejesus "bejesus" = 152,
belated "belated" = 153,
believe "believe" = 154,
believed "believed" = 155,
belong "belong" = 156,
benefit "benefit" = 157,
benson "benson" = 158,
bent "bent" = 159,
best "best" = 160,
bet "bet" = 161,
better "better" = 162,
between "between" = 163,
big "big" = 164,
billion "billion" = 165,
birds "birds" = 166,
birth "birth" = 167,
bit "bit" = 168,
biting "biting" = 169,
black "black" = 170,
blacktop "blacktop" = 171,
blade "blade" = 172,
blend "blend" = 173,
blew "blew" = 174,
blinked "blinked" = 175,
blood "blood" = 176,
bloome "bloome" = 177,
blossom "blossom" = 178,
blow "blow" = 179,
blows "blows" = 180,
blue "blue" = 181,
bluffing "bluffing" = 182,
boat "boat" = 183,
bob "bob" = 184,
body "body" = 185,
bogus "bogus" = 186,
book "book" = 187,
boots "boots" = 188,
bored "bored" = 189,
born "born" = 190,
borrow "borrow" = 191,
both "both" = 192,
bothering "bothering" = 193,
bottom "bottom" = 194,
bounty "bounty" = 195,
bouquets "bouquets" = 196,
bowl "bowl" = 197,
r#box "box" = 198,
boy "boy" = 199,
boys "boys" = 200,
brain "brain" = 201,
brave "brave" = 202,
brazenly "brazenly" = 203,
bread "bread" = 204,
r#break "break" = 205,
breakfast "breakfast" = 206,
breaking "breaking" = 207,
breath "breath" = 208,
breathe "breathe" = 209,
breaths "breaths" = 210,
bred "bred" = 211,
briefcase "briefcase" = 212,
bright "bright" = 213,
bring "bring" = 214,
bringing "bringing" = 215,
britches "britches" = 216,
brochure "brochure" = 217,
brooch "brooch" = 218,
brooms "brooms" = 219,
bubble "bubble" = 220,
bud "bud" = 221,
buddy "buddy" = 222,
bug "bug" = 223,
bugging "bugging" = 224,
bugs "bugs" = 225,
build "build" = 226,
building "building" = 227,
bumble "bumble" = 228,
bumbleton "bumbleton" = 229,
business "business" = 230,
businesses "businesses" = 231,
busted "busted" = 232,
busy "busy" = 233,
but "but" = 234,
buttocks "buttocks" = 235,
buzz "buzz" = 236,
buzzwell "buzzwell" = 237,
buzzy "buzzy" = 238,
by "by" = 239,
bye "bye" = 240,
cab "cab" = 241,
cafeteria "cafeteria" = 242,
cake "cake" = 243,
california "california" = 244,
call "call" = 245,
called "called" = 246,
calories "calories" = 247,
campaign "campaign" = 248,
camps "camps" = 249,
can "can" = 250,
candy "candy" = 251,
cannonball "cannonball" = 252,
cannot "cannot" = 253,
capable "capable" = 254,
captain "captain" = 255,
capture "capture" = 256,
car "car" = 257,
card "card" = 258,
care "care" = 259,
career "career" = 260,
careful "careful" = 261,
carefully "carefully" = 262,
carl "carl" = 263,
carob "carob" = 264,
case "case" = 265,
casually "casually" = 266,
catch "catch" = 267,
catches "catches" = 268,
cause "cause" = 269,
celebrate "celebrate" = 270,
celebrating "celebrating" = 271,
celery "celery" = 272,
center "center" = 273,
century "century" = 274,
ceremonies "ceremonies" = 275,
chance "chance" = 276,
change "change" = 277,
changes "changes" = 278,
chapstick "chapstick" = 279,
charges "charges" = 280,
check "check" = 281,
cheering "cheering" = 282,
cheese "cheese" = 283,
chemical "chemical" = 284,
children "children" = 285,
chill "chill" = 286,
chips "chips" = 287,
choice "choice" = 288,
choices "choices" = 289,
choose "choose" = 290,
chopsticks "chopsticks" = 291,
chung "chung" = 292,
church "church" = 293,
churning "churning" = 294,
chute "chute" = 295,
cicada "cicada" = 296,
cinnabon "cinnabon" = 297,
cinnamon "cinnamon" = 298,
circular "circular" = 299,
circumstances "circumstances" = 300,
city "city" = 301,
class "class" = 302,
classy "classy" = 303,
clean "clean" = 304,
clear "clear" = 305,
clients "clients" = 306,
cloning "cloning" = 307,
close "close" = 308,
closed "closed" = 309,
clothes "clothes" = 310,
cloudy "cloudy" = 311,
coaster "coaster" = 312,
cockpit "cockpit" = 313,
coffee "coffee" = 314,
collectively "collectively" = 315,
collector "collector" = 316,
college "college" = 317,
color "color" = 318,
colored "colored" = 319,
combined "combined" = 320,
come "come" = 321,
comes "comes" = 322,
coming "coming" = 323,
common "common" = 324,
community "community" = 325,
compadres "compadres" = 326,
companies "companies" = 327,
company "company" = 328,
compelling "compelling" = 329,
compete "compete" = 330,
competition "competition" = 331,
complete "complete" = 332,
completely "completely" = 333,
comrades "comrades" = 334,
concentrate "concentrate" = 335,
concludes "concludes" = 336,
congratulations "congratulations" = 337,
consider "consider" = 338,
considered "considered" = 339,
conspiracy "conspiracy" = 340,
constantly "constantly" = 341,
contoured "contoured" = 342,
contraption "contraption" = 343,
control "control" = 344,
controls "controls" = 345,
cool "cool" = 346,
coolest "coolest" = 347,
cooling "cooling" = 348,
coordinator "coordinator" = 349,
copilot "copilot" = 350,
copy "copy" = 351,
corrected "corrected" = 352,
correctly "correctly" = 353,
cotton "cotton" = 354,
couch "couch" = 355,
could "could" = 356,
couldn "couldn" = 357,
counting "counting" = 358,
county "county" = 359,
couple "couple" = 360,
course "course" = 361,
coursing "coursing" = 362,
court "court" = 363,
cousin "cousin" = 364,
cousins "cousins" = 365,
covered "covered" = 366,
crashing "crashing" = 367,
crazy "crazy" = 368,
cream "cream" = 369,
creatures "creatures" = 370,
creep "creep" = 371,
crew "crew" = 372,
cricket "cricket" = 373,
crime "crime" = 374,
crossed "crossed" = 375,
crowds "crowds" = 376,
crud "crud" = 377,
crumb "crumb" = 378,
cry "cry" = 379,
culture "culture" = 380,
cup "cup" = 381,
cups "cups" = 382,
cut "cut" = 383,
cute "cute" = 384,
d "d" = 385,
da "da" = 386,
dad "dad" = 387,
dada "dada" = 388,
daffodil "daffodil" = 389,
daisies "daisies" = 390,
damage "damage" = 391,
dangerous "dangerous" = 392,
dash "dash" = 393,
date "date" = 394,
dated "dated" = 395,
dating "dating" = 396,
dave "dave" = 397,
dawg "dawg" = 398,
day "day" = 399,
days "days" = 400,
dead "dead" = 401,
deadified "deadified" = 402,
deady "deady" = 403,
deal "deal" = 404,
dean "dean" = 405,
death "death" = 406,
decide "decide" = 407,
decision "decision" = 408,
decisions "decisions" = 409,
deck "deck" = 410,
dee "dee" = 411,
degrees "degrees" = 412,
delay "delay" = 413,
deli "deli" = 414,
demand "demand" = 415,
denouncing "denouncing" = 416,
deny "deny" = 417,
depends "depends" = 418,
desk "desk" = 419,
destruction "destruction" = 420,
detail "detail" = 421,
developing "developing" = 422,
devilishly "devilishly" = 423,
diabolical "diabolical" = 424,
did "did" = 425,
didn "didn" = 426,
die "die" = 427,
died "died" = 428,
]);
}