From c88a670a56b9d3a1775c2394ed2b256c0600ea2a Mon Sep 17 00:00:00 2001
From: adash
Date: Fri, 18 Dec 2009 06:15:56 +0000
Subject: [PATCH] add range prefetch version of SpamFilter
---
.../SpamFilter/BufferedReader.java | 86 +
.../SpamFilter/DistributedHashMap.java | 38 +
.../SpamFilter/EphemeralSignature.java | 47 +
.../SpamFilter/FilterResult.java | 80 +
.../SpamFilter/FilterStatistic.java | 66 +
.../ManualPrefetch/SpamFilter/GString.java | 169 +
.../ManualPrefetch/SpamFilter/HashEntry.java | 68 +
.../ManualPrefetch/SpamFilter/HashStat.java | 70 +
.../ManualPrefetch/SpamFilter/MD5.java | 424 +++
.../ManualPrefetch/SpamFilter/Mail.java | 422 +++
.../SpamFilter/SignatureComputer.java | 289 ++
.../ManualPrefetch/SpamFilter/SpamFilter.java | 618 ++++
.../SpamFilter/WhiplashSignature.java | 258 ++
.../ManualPrefetch/SpamFilter/emails/URLList | 752 +++++
.../SpamFilter/emails/accountList | 600 ++++
.../SpamFilter/emails/filter.java | 47 +
.../ManualPrefetch/SpamFilter/emails/gen.c | 197 ++
.../SpamFilter/emails/wordList1 | 2964 +++++++++++++++++
.../ManualPrefetch/SpamFilter/makefile | 32 +
.../Benchmarks/Prefetch/ManualPrefetch/run.sh | 5 +-
20 files changed, 7230 insertions(+), 2 deletions(-)
create mode 100644 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/BufferedReader.java
create mode 100755 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/DistributedHashMap.java
create mode 100755 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/EphemeralSignature.java
create mode 100755 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/FilterResult.java
create mode 100755 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/FilterStatistic.java
create mode 100755 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/GString.java
create mode 100755 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/HashEntry.java
create mode 100755 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/HashStat.java
create mode 100755 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/MD5.java
create mode 100755 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/Mail.java
create mode 100755 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/SignatureComputer.java
create mode 100755 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/SpamFilter.java
create mode 100644 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/WhiplashSignature.java
create mode 100644 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/URLList
create mode 100644 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/accountList
create mode 100644 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/filter.java
create mode 100644 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/gen.c
create mode 100644 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/wordList1
create mode 100755 Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/makefile
diff --git a/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/BufferedReader.java b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/BufferedReader.java
new file mode 100644
index 00000000..d4c96fdd
--- /dev/null
+++ b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/BufferedReader.java
@@ -0,0 +1,86 @@
+public class BufferedReader {
+ FileInputStream fr;
+ byte[] buffer;
+ int offset;
+ int end;
+
+ public BufferedReader(FileInputStream fr) {
+ this.fr=fr;
+ this.buffer=new byte[2048];
+ }
+
+ public int read() {
+ if (offset=arraylen)
+ return off;
+ array[off++]=buffer[offset];
+ }
+ readBuffer();
+ if (end==0)
+ return off;
+ if (end<0)
+ return end;
+ } while(true);
+ }
+
+ public void readBuffer() {
+ offset=0;
+ end=fr.read(buffer);
+ }
+
+ public String readLine() {
+ String str=null;
+ do {
+ boolean foundcr=false;
+ int index=offset;
+ for(;index> 27)) ^ str.charAt(i);
+ }
+
+ return hash;
+ }
+ */
+
+}
diff --git a/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/FilterResult.java b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/FilterResult.java
new file mode 100755
index 00000000..196006be
--- /dev/null
+++ b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/FilterResult.java
@@ -0,0 +1,80 @@
+/**
+ * A FilterResult encapsulates the result of a filter made by checking a mail.
+ **/
+public class FilterResult {
+ /**
+ * This value is used if type is ERROR or UNKNOWN.
+ */
+ public double NO_RESULT;
+
+ /**
+ * A result value greater or equal this value indicates that the filter has
+ * decided on spam.
+ */
+ public int SPAM_THRESHOLD;
+ public int ABSOLUTE_SPAM;
+ public int ABSOLUTE_HAM;
+
+ //public double result; // the result, a value between -1 (ham) and 1000 (spam),
+ // negative values for "error", "unknown" etc.
+
+ // -----------------------------------------------------------------------------
+
+ public FilterResult(double result) {
+ SPAM_THRESHOLD=50;
+ ABSOLUTE_SPAM=100;
+ ABSOLUTE_HAM=0;
+ NO_RESULT=-1;
+ //this.result = result;
+ }
+
+ public FilterResult() {
+ SPAM_THRESHOLD=50;
+ ABSOLUTE_SPAM=100;
+ ABSOLUTE_HAM=0;
+ NO_RESULT=-1;
+ }
+
+ public boolean getResult(int[] confidenceVals) {
+ int[] res = new int[3]; //3 equals spam, ham and unknown
+ for(int i=0; i= 0 && confidenceVals[i] < SPAM_THRESHOLD)
+ res[1]+=1; //ham
+ if(confidenceVals[i] >= SPAM_THRESHOLD)
+ res[2]+=1;//spam
+ }
+ int maxVotes=0;
+ int max;
+ for(int i=0; i<3;i++) {
+ if(res[i] > maxVotes) {
+ maxVotes = res[i];
+ max = i;
+ }
+ }
+ if(max==0)
+ return false;
+ if(max==1)
+ return false;
+ if(max==2)
+ return true;
+
+ System.out.println("Err: getResult() Control shouldn't come here, max= " + max);
+ return false;
+ }
+
+ /*
+ public void addProperty(String key, String value) {
+ properties.put(key,value);
+ }
+
+ public String getProperty(String key) {
+ return properties.get(key);
+ }
+
+ public HashMap getProperties() {
+ return properties;
+ }
+ */
+}
diff --git a/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/FilterStatistic.java b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/FilterStatistic.java
new file mode 100755
index 00000000..2e326a5d
--- /dev/null
+++ b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/FilterStatistic.java
@@ -0,0 +1,66 @@
+public class FilterStatistic {
+ int unknown;
+ int spam;
+ int ham;
+
+ // -------------------------------------------------------
+
+ public FilterStatistic() {
+ this.spam = 0;
+ this.ham = 0;
+ this.unknown = 0;
+ }
+
+ public FilterStatistic(int spam, int ham, int unknown) {
+ this.spam = spam;
+ this.ham = ham;
+ this.unknown = unknown;
+ }
+
+ public int getChecked() {
+ return getSpam() + getHam() + getUnknown();
+ }
+
+ public int getHam() {
+ return ham;
+ }
+
+ public int getSpam() {
+ return spam;
+ }
+
+ public void setHam(int i) {
+ ham = i;
+ }
+
+ public void setSpam(int i) {
+ spam = i;
+ }
+
+ public int getUnknown() {
+ return unknown;
+ }
+
+ public void setUnknown(int u) {
+ unknown = u;
+ }
+
+ public void increaseSpam() {
+ setSpam(getSpam() + 1);
+ }
+
+ public void increaseHam() {
+ setHam(getHam() + 1);
+ }
+
+ public void increaseUnknown() {
+ setUnknown(getUnknown() + 1);
+ }
+
+ public String toString() {
+ String str = "Filterstats_spam_"+spam;
+ str += "_ham_" +ham;
+ str += "_unknown_"+unknown;
+ return str;
+ }
+}
diff --git a/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/GString.java b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/GString.java
new file mode 100755
index 00000000..47e3fcf3
--- /dev/null
+++ b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/GString.java
@@ -0,0 +1,169 @@
+public class GString {
+ public char value[];
+ public int count;
+ public int offset;
+
+ public GString() {
+ }
+
+ public GString(char c) {
+ char[] str = global new char[1];
+ str[0] = c;
+ GString(str);
+ }
+
+ public GString(String str) {
+ value = global new char[str.count];
+ for(int i =0; i< str.count;i++) {
+ value[i] = str.value[i+str.offset];
+ }
+ count = str.count;
+ offset = 0;
+ }
+
+ public GString(GString gstr) {
+ this.value = gstr.value;
+ this.count = gstr.count;
+ this.offset = gstr.offset;
+ }
+
+ /*
+ public GString(StringBuffer gsb) {
+ value = global new char[gsb.length()];
+ count = gsb.length();
+ offset = 0;
+ for (int i = 0; i < count; i++)
+ value[i] = gsb.value[i];
+ }
+ */
+
+ public GString(char str[]) {
+ char charstr[]=new char[str.length];
+ for(int i=0; i 0; i--)
+ if (this.charAt(i) == ch)
+ return i;
+ return -1;
+ }
+
+ public char charAt(int i) {
+ return value[i+offset];
+ }
+
+ public int indexOf(String str) {
+ return this.indexOf(str, 0);
+ }
+
+ public int indexOf(String str, int fromIndex) {
+ if (fromIndex < 0)
+ fromIndex = 0;
+ for (int i = fromIndex; i <= (count-str.count); i++)
+ if (regionMatches(i, str, 0, str.count))
+ return i;
+ return -1;
+ }
+
+ public boolean regionMatches(int toffset, String other, int ooffset, int len) {
+ if (toffset < 0 || ooffset < 0 || (toffset+len) > count || (ooffset+len) > other.count)
+ return false;
+
+ for (int i = 0; i < len; i++) {
+ if (other.value[i+other.offset+ooffset] != this.value[i+this.offset+toffset])
+ return false;
+ }
+ return true;
+ }
+
+ public String subString(int beginIndex, int endIndex) {
+ return substring(beginIndex, endIndex);
+ }
+
+ public String substring(int beginIndex, int endIndex) {
+ String str;
+ str = global new String();
+ str.value = this.value;
+ str.count = endIndex-beginIndex;
+ str.offset = this.offset + beginIndex;
+ return str;
+ }
+
+ public static String valueOf(Object o) {
+ if (o==null)
+ return "null";
+ else
+ return o.toString();
+ }
+
+ public String toLocalString() {
+ return new String(toLocalCharArray(this));
+ }
+
+ public static char[] toLocalCharArray(GString str) {
+ char[] c;
+ int length;
+ length = str.length();
+ c = new char[length];
+ for (int i = 0; i < length; i++) {
+ c[i] = str.value[i+str.offset];
+ }
+ return c;
+ }
+
+ public int hashCode() {
+ String s = this.toLocalString();
+ return s.hashCode();
+ }
+
+ public boolean equals(Object o) {
+ if(o == null)
+ return false;
+ if(!(o instanceof GString))
+ return false;
+ GString gs = (GString)o;
+ String s1 = gs.toLocalString();
+ String s2 = this.toLocalString();
+ if(s2.equals(s1))
+ return true;
+ return false;
+ }
+}
diff --git a/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/HashEntry.java b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/HashEntry.java
new file mode 100755
index 00000000..f76828ca
--- /dev/null
+++ b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/HashEntry.java
@@ -0,0 +1,68 @@
+public class HashEntry {
+ public GString engine;
+ public GString signature;
+ public HashStat stats;
+
+ public HashEntry() {
+
+ }
+
+ /**
+ * hashCode that combines two strings using xor.
+ * @return a hash code value on the entire object.
+ */
+ public int hashCode() {
+ int result=0;
+ // this will not work well if some of the strings are equal.
+ result = engine.hashCode();
+ result ^= signature.hashCode();
+ //result ^= stats.hashCode();
+ //System.out.println("HashEntry: hashCode= " + result);
+ return result;
+ }
+
+ public void setengine(GString engine) {
+ this.engine=engine;
+ }
+
+ public void setstats(HashStat stats) {
+ this.stats=stats;
+ }
+
+ public void setsig(GString signature) {
+ this.signature=signature;
+ }
+
+ public GString getEngine() {
+ return engine;
+ }
+
+ public GString getSignature() {
+ return signature;
+ }
+
+ public HashStat getStats() {
+ return stats;
+ }
+
+ public boolean equals(Object o) {
+ HashEntry he = (HashEntry)o;
+ if(!(he.getEngine().equals(engine)))
+ return false;
+ if(!(he.getSignature().equals(signature)))
+ return false;
+ //if(!(he.getStats().equals(stats)))
+ // return false;
+ return true;
+ }
+
+ public int askForSpam() {
+ int[] users = stats.getUsers();
+ int spamConfidence=0;
+ for(int i=0; i
+// from some public domain C code (md5.c) included with the ssh-1.2.22 source.
+// Tue Jan 19 15:55:50 EST 1999
+// $Id: MD5.java,v 1.1 2009/12/18 06:15:56 adash Exp $
+//
+// To compute the message digest of a chunk of bytes, create an
+// MD5 object 'md5', call md5.update() as needed on buffers full
+// of bytes, and then call md5.md5final(), which
+// will fill a supplied 16-byte array with the digest.
+//
+// A main() method is included that hashes the data on System.in.
+//
+// It seems to run around 25-30 times slower (JDK1.1.6) than optimized C
+// (gcc -O4, version 2.7.2.3). Measured on a Sun Ultra 5 (SPARC 270MHz).
+//
+// Comments from md5.c from ssh-1.2.22, the basis for this code:
+//
+/* This code has been heavily hacked by Tatu Ylonen to
+ make it compile on machines like Cray that don't have a 32 bit integer
+ type. */
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest. This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ */
+
+public class MD5 {
+ int buf[]; // These were originally unsigned ints.
+ // This Java code makes an effort to avoid sign traps.
+ // buf[] is where the hash accumulates.
+ long bits; // This is the count of bits hashed so far.
+ byte in[]; // This is a buffer where we stash bytes until we have
+ // enough (64) to perform a transform operation.
+ int inint[];
+ // inint[] used and discarded inside transform(),
+ // but why allocate it over and over?
+ // (In the C version this is allocated on the stack.)
+
+ public MD5() {
+ buf = new int[4];
+ // fill the hash accumulator with a seed value
+ buf[0] = 0x67452301;
+ buf[1] = 0xefcdab89;
+ buf[2] = 0x98badcfe;
+ buf[3] = 0x10325476;
+
+ // initially, we've hashed zero bits
+ bits = 0L;
+
+ in = new byte[64];
+ inint = new int[16];
+ }
+
+ public void update(byte[] newbuf) {
+ update(newbuf, 0, newbuf.length);
+ }
+
+ public void update(byte[] newbuf, int length) {
+ update(newbuf, 0, length);
+ }
+
+ public void update(byte[] newbuf, int bufstart, int buflen) {
+ int t;
+ int len = buflen;
+
+ // shash old bits value for the "Bytes already in" computation
+ // just below.
+ t = (int) bits; // (int) cast should just drop high bits, I hope
+
+ /* update bitcount */
+ /* the C code used two 32-bit ints separately, and carefully
+ * ensured that the carry carried.
+ * Java has a 64-bit long, which is just what the code really wants.
+ */
+ bits += (long)(len<<3);
+
+ t = (t >>> 3) & 0x3f; /* Bytes already in this->in */
+
+ /* Handle any leading odd-sized chunks */
+ /* (that is, any left-over chunk left by last update() */
+
+ if (t!=0) {
+ int p = t;
+ t = 64 - t;
+ if (len < t) {
+ arraycopy(newbuf, bufstart, in, p, len);
+ return;
+ }
+ arraycopy(newbuf, bufstart, in, p, t);
+ transform();
+ bufstart += t;
+ len -= t;
+ }
+
+ /* Process data in 64-byte chunks */
+ while (len >= 64) {
+ arraycopy(newbuf, bufstart, in, 0, 64);
+ transform();
+ bufstart += 64;
+ len -= 64;
+ }
+
+ /* Handle any remaining bytes of data. */
+ /* that is, stash them for the next update(). */
+ arraycopy(newbuf, bufstart, in, 0, len);
+ }
+
+ public void arraycopy(byte[] src, int srcPos, byte[] dest, int destPos, int len) {
+ for (int i = 0; i < len; i++) {
+ dest[destPos+i] = src[srcPos+i];
+ }
+ return;
+ }
+
+ /*
+ * Final wrapup - pad to 64-byte boundary with the bit pattern
+ * 1 0* (64-bit count of bits processed, MSB-first)
+ */
+ public void md5final(byte[] digest) {
+ /* "final" is a poor method name in Java. :v) */
+ int count;
+ int p; // in original code, this is a pointer; in this java code
+ // it's an index into the array this->in.
+
+ /* Compute number of bytes mod 64 */
+ count = (int) ((bits >>> 3) & 0x3F);
+
+ /* Set the first char of padding to 0x80. This is safe since there is
+ always at least one byte free */
+ p = count;
+ in[p++] = (byte) 0x80;
+
+ /* Bytes of padding needed to make 64 bytes */
+ count = 64 - 1 - count;
+
+ /* Pad out to 56 mod 64 */
+ if (count < 8) {
+ /* Two lots of padding: Pad the first block to 64 bytes */
+ zeroByteArray(in, p, count);
+ transform();
+
+ /* Now fill the next block with 56 bytes */
+ zeroByteArray(in, 0, 56);
+ } else {
+ /* Pad block to 56 bytes */
+ zeroByteArray(in, p, count - 8);
+ }
+
+ /* Append length in bits and transform */
+ // Could use a PUT_64BIT... func here. This is a fairly
+ // direct translation from the C code, where bits was an array
+ // of two 32-bit ints.
+ int lowbits = (int) bits;
+ int highbits = (int) (bits >>> 32);
+ PUT_32BIT_LSB_FIRST(in, 56, lowbits);
+ PUT_32BIT_LSB_FIRST(in, 60, highbits);
+
+ transform();
+ PUT_32BIT_LSB_FIRST(digest, 0, buf[0]);
+ PUT_32BIT_LSB_FIRST(digest, 4, buf[1]);
+ PUT_32BIT_LSB_FIRST(digest, 8, buf[2]);
+ PUT_32BIT_LSB_FIRST(digest, 12, buf[3]);
+
+ /* zero sensitive data */
+ /* notice this misses any sneaking out on the stack. The C
+ * version uses registers in some spots, perhaps because
+ * they care about this.
+ */
+ zeroByteArray(in);
+ zeroIntArray(buf);
+ bits = 0;
+ zeroIntArray(inint);
+ }
+
+ /*
+ public static void main(String args[]) {
+ // This main() method was created to easily test
+ // this class. It hashes whatever's on System.in.
+
+ byte buf[] = new byte[397];
+ // arbitrary buffer length designed to irritate update()
+ int rc;
+ MD5 md = new MD5();
+ byte out[] = new byte[16];
+ int i;
+ int len = 0;
+
+ try {
+ while ((rc = System.in.read(buf, 0, 397)) > 0) {
+ md.update(buf, rc);
+ len += rc;
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ return;
+ }
+ md.md5final(out);
+
+ System.out.println("file length: "+len);
+ System.out.println("hash: "+dumpBytes(out));
+ }
+ */
+
+
+ /////////////////////////////////////////////////////////////////////
+ // Below here ye will only finde private functions //
+ /////////////////////////////////////////////////////////////////////
+
+ // There must be a way to do these functions that's
+ // built into Java, and I just haven't noticed it yet.
+
+ private void zeroByteArray(byte[] a) {
+ zeroByteArray(a, 0, a.length);
+ }
+
+ private void zeroByteArray(byte[] a, int start, int length) {
+ setByteArray(a, (byte) 0, start, length);
+ }
+
+ private void setByteArray(byte[] a, byte val, int start, int length) {
+ int i;
+ int end = start+length;
+ for (i=start; i>>(32-s);
+ w += x;
+ return w;
+ }
+
+ private int MD5STEP2(int w, int x, int y, int z, int data, int s) {
+ w += (y ^ (z & (x ^ y))) + data;
+ w = w<>>(32-s);
+ w += x;
+ return w;
+ }
+
+ private int MD5STEP3(int w, int x, int y, int z, int data, int s) {
+ w += (x ^ y ^ z) + data;
+ w = w<>>(32-s);
+ w += x;
+ return w;
+ }
+
+ private int MD5STEP4(int w, int x, int y, int z, int data, int s) {
+ w += (y ^ (x | ~z)) + data;
+ w = w<>>(32-s);
+ w += x;
+ return w;
+ }
+
+ private void transform() {
+ /* load in[] byte array into an internal int array */
+ int i;
+ int[] inint = new int[16];
+
+ for (i=0; i<16; i++) {
+ inint[i] = GET_32BIT_LSB_FIRST(in, 4*i);
+ }
+
+ int a, b, c, d;
+ a = buf[0];
+ b = buf[1];
+ c = buf[2];
+ d = buf[3];
+
+ a = MD5STEP1(a, b, c, d, inint[0] + 0xd76aa478, 7);
+ d = MD5STEP1(d, a, b, c, inint[1] + 0xe8c7b756, 12);
+ c = MD5STEP1(c, d, a, b, inint[2] + 0x242070db, 17);
+ b = MD5STEP1(b, c, d, a, inint[3] + 0xc1bdceee, 22);
+ a = MD5STEP1(a, b, c, d, inint[4] + 0xf57c0faf, 7);
+ d = MD5STEP1(d, a, b, c, inint[5] + 0x4787c62a, 12);
+ c = MD5STEP1(c, d, a, b, inint[6] + 0xa8304613, 17);
+ b = MD5STEP1(b, c, d, a, inint[7] + 0xfd469501, 22);
+ a = MD5STEP1(a, b, c, d, inint[8] + 0x698098d8, 7);
+ d = MD5STEP1(d, a, b, c, inint[9] + 0x8b44f7af, 12);
+ c = MD5STEP1(c, d, a, b, inint[10] + 0xffff5bb1, 17);
+ b = MD5STEP1(b, c, d, a, inint[11] + 0x895cd7be, 22);
+ a = MD5STEP1(a, b, c, d, inint[12] + 0x6b901122, 7);
+ d = MD5STEP1(d, a, b, c, inint[13] + 0xfd987193, 12);
+ c = MD5STEP1(c, d, a, b, inint[14] + 0xa679438e, 17);
+ b = MD5STEP1(b, c, d, a, inint[15] + 0x49b40821, 22);
+
+ a = MD5STEP2(a, b, c, d, inint[1] + 0xf61e2562, 5);
+ d = MD5STEP2(d, a, b, c, inint[6] + 0xc040b340, 9);
+ c = MD5STEP2(c, d, a, b, inint[11] + 0x265e5a51, 14);
+ b = MD5STEP2(b, c, d, a, inint[0] + 0xe9b6c7aa, 20);
+ a = MD5STEP2(a, b, c, d, inint[5] + 0xd62f105d, 5);
+ d = MD5STEP2(d, a, b, c, inint[10] + 0x02441453, 9);
+ c = MD5STEP2(c, d, a, b, inint[15] + 0xd8a1e681, 14);
+ b = MD5STEP2(b, c, d, a, inint[4] + 0xe7d3fbc8, 20);
+ a = MD5STEP2(a, b, c, d, inint[9] + 0x21e1cde6, 5);
+ d = MD5STEP2(d, a, b, c, inint[14] + 0xc33707d6, 9);
+ c = MD5STEP2(c, d, a, b, inint[3] + 0xf4d50d87, 14);
+ b = MD5STEP2(b, c, d, a, inint[8] + 0x455a14ed, 20);
+ a = MD5STEP2(a, b, c, d, inint[13] + 0xa9e3e905, 5);
+ d = MD5STEP2(d, a, b, c, inint[2] + 0xfcefa3f8, 9);
+ c = MD5STEP2(c, d, a, b, inint[7] + 0x676f02d9, 14);
+ b = MD5STEP2(b, c, d, a, inint[12] + 0x8d2a4c8a, 20);
+
+ a = MD5STEP3(a, b, c, d, inint[5] + 0xfffa3942, 4);
+ d = MD5STEP3(d, a, b, c, inint[8] + 0x8771f681, 11);
+ c = MD5STEP3(c, d, a, b, inint[11] + 0x6d9d6122, 16);
+ b = MD5STEP3(b, c, d, a, inint[14] + 0xfde5380c, 23);
+ a = MD5STEP3(a, b, c, d, inint[1] + 0xa4beea44, 4);
+ d = MD5STEP3(d, a, b, c, inint[4] + 0x4bdecfa9, 11);
+ c = MD5STEP3(c, d, a, b, inint[7] + 0xf6bb4b60, 16);
+ b = MD5STEP3(b, c, d, a, inint[10] + 0xbebfbc70, 23);
+ a = MD5STEP3(a, b, c, d, inint[13] + 0x289b7ec6, 4);
+ d = MD5STEP3(d, a, b, c, inint[0] + 0xeaa127fa, 11);
+ c = MD5STEP3(c, d, a, b, inint[3] + 0xd4ef3085, 16);
+ b = MD5STEP3(b, c, d, a, inint[6] + 0x04881d05, 23);
+ a = MD5STEP3(a, b, c, d, inint[9] + 0xd9d4d039, 4);
+ d = MD5STEP3(d, a, b, c, inint[12] + 0xe6db99e5, 11);
+ c = MD5STEP3(c, d, a, b, inint[15] + 0x1fa27cf8, 16);
+ b = MD5STEP3(b, c, d, a, inint[2] + 0xc4ac5665, 23);
+
+ a = MD5STEP4(a, b, c, d, inint[0] + 0xf4292244, 6);
+ d = MD5STEP4(d, a, b, c, inint[7] + 0x432aff97, 10);
+ c = MD5STEP4(c, d, a, b, inint[14] + 0xab9423a7, 15);
+ b = MD5STEP4(b, c, d, a, inint[5] + 0xfc93a039, 21);
+ a = MD5STEP4(a, b, c, d, inint[12] + 0x655b59c3, 6);
+ d = MD5STEP4(d, a, b, c, inint[3] + 0x8f0ccc92, 10);
+ c = MD5STEP4(c, d, a, b, inint[10] + 0xffeff47d, 15);
+ b = MD5STEP4(b, c, d, a, inint[1] + 0x85845dd1, 21);
+ a = MD5STEP4(a, b, c, d, inint[8] + 0x6fa87e4f, 6);
+ d = MD5STEP4(d, a, b, c, inint[15] + 0xfe2ce6e0, 10);
+ c = MD5STEP4(c, d, a, b, inint[6] + 0xa3014314, 15);
+ b = MD5STEP4(b, c, d, a, inint[13] + 0x4e0811a1, 21);
+ a = MD5STEP4(a, b, c, d, inint[4] + 0xf7537e82, 6);
+ d = MD5STEP4(d, a, b, c, inint[11] + 0xbd3af235, 10);
+ c = MD5STEP4(c, d, a, b, inint[2] + 0x2ad7d2bb, 15);
+ b = MD5STEP4(b, c, d, a, inint[9] + 0xeb86d391, 21);
+
+ buf[0] += a;
+ buf[1] += b;
+ buf[2] += c;
+ buf[3] += d;
+ }
+
+ private int GET_32BIT_LSB_FIRST(byte[] b, int off) {
+ return
+ ((int)(b[off+0]&0xff)) |
+ ((int)(b[off+1]&0xff) << 8) |
+ ((int)(b[off+2]&0xff) << 16) |
+ ((int)(b[off+3]&0xff) << 24);
+ }
+
+ private void PUT_32BIT_LSB_FIRST(byte[] b, int off, int value) {
+ b[off+0] = (byte) (value & 0xff);
+ b[off+1] = (byte) ((value >> 8) & 0xff);
+ b[off+2] = (byte) ((value >> 16)& 0xff);
+ b[off+3] = (byte) ((value >> 24)& 0xff);
+ }
+
+ // These are debug routines I was using while trying to
+ // get this code to generate the same hashes as the C version.
+ // (IIRC, all the errors were due to the absence of unsigned
+ // ints in Java.)
+ /*
+ private void debugStatus(String m) {
+ System.out.println(m+":");
+ System.out.println("in: "+dumpBytes(in));
+ System.out.println("bits: "+bits);
+ System.out.println("buf: "
+ +Integer.toHexString(buf[0])+" "
+ +Integer.toHexString(buf[1])+" "
+ +Integer.toHexString(buf[2])+" "
+ +Integer.toHexString(buf[3]));
+ }
+
+ private static String dumpBytes(byte[] bytes) {
+ int i;
+ StringBuffer sb = new StringBuffer();
+ for (i=0; i 2) {
+ s = s.substring(s.length()-2);
+ }
+ sb.append(s);
+ }
+ return sb.toString();
+ }
+ */
+}
diff --git a/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/Mail.java b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/Mail.java
new file mode 100755
index 00000000..3afbe19c
--- /dev/null
+++ b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/Mail.java
@@ -0,0 +1,422 @@
+/**
+ * This class is a container for all data contained in an Email Message.
+ **/
+public class Mail {
+
+ String header; // the full header
+ //String sentOn; // time the message was sent
+ //String receivedOn; // time when the message arrived
+ String from; // the "from" field
+ String to; // the "to" field
+ String cc;
+ String subject;
+ String body;
+ String noURLBody;
+ String sourceCode;
+ String spam;
+ boolean hasAttachement;
+ String encoding; //rich text, plain, html
+
+ String messageID; // cached message ID for reuse (takes a lot of memory and is used all over the place)
+ //same as hashcode of a class
+ boolean isSpam;
+
+ /**
+ * this is a really simple implementation of a tokenizer
+ * used to build tokens from an email and divide email into parts
+ **/
+ int MAX_TOKEN_SIZE;
+
+ public Mail() {
+ messageID=null;
+ }
+
+ public Mail(String fileName) // read a mail from file
+ {
+ //System.out.println("DEBUG: fileName= " + fileName);
+
+ BufferedReader fileinput = new BufferedReader(new FileInputStream(fileName));
+ String line;
+ boolean chk = false;
+
+ while((line = fileinput.readLine()) != null)
+ {
+ chk = true;
+
+ Vector splittedLine = line.split();
+ if(((String)(splittedLine.elementAt(0))).equals("Spam:"))
+ {
+ spam = (String)(splittedLine.elementAt(1));
+ }
+ else if(((String)(splittedLine.elementAt(0))).equals("Header:")) // message id
+ {
+ header = (String)splittedLine.elementAt(1);
+ }
+ else if(((String)(splittedLine.elementAt(0))).equals("To:")) // receiver
+ {
+ to = (String)splittedLine.elementAt(1);
+ }
+ else if(((String)(splittedLine.elementAt(0))).equals("From:")) // sender
+ {
+ from = (String)splittedLine.elementAt(1);
+ }
+ else if(((String)(splittedLine.elementAt(0))).equals("Cc:")) // cc
+ {
+ cc = (String)splittedLine.elementAt(1);
+ }
+ else if(((String)(splittedLine.elementAt(0))).equals("Subject:")) // Subject
+ {
+ subject = (String)splittedLine.elementAt(1);
+ break;
+ }
+ } // parsed messageID, To, from, cc, Title
+
+ /**
+ * error checking
+ **/
+ if(!chk)
+ System.out.println("no line read");
+
+
+ body = new String();
+ byte[] readBody = new byte[256];
+
+ while((fileinput.read(readBody)>0))
+ {
+ body += new String(readBody);
+ readBody = new byte[256];
+ }
+
+ fileinput.close();
+
+ MAX_TOKEN_SIZE = 1024;
+ }
+
+ // -------------------------------------------------------
+
+ public void setHeader(String header) {
+ this.header = header;
+ }
+
+ public String getHeader() {
+ return header;
+ }
+
+
+ /*
+ public void setSentOn(String sentOn) {
+ this.sentOn = sentOn;
+ }
+
+ public String getSentOn() {
+ return sentOn;
+ }
+
+ public Date getSentOnAsDate() {
+ String sentOn = getSentOn();
+ return parseDate(sentOn);
+ }
+
+ public void setReceivedOn(String receivedOn) {
+ this.receivedOn = receivedOn;
+ }
+
+ public String getReceivedOn() {
+ return receivedOn;
+ }
+
+ public Date getReceivedOnAsDate() {
+ String receivedOn = getReceivedOn();
+ return parseDate(receivedOn);
+ }
+ */
+
+
+ /**
+ * Parses a given Date-String in into a real Date-Object
+ *
+ * @param stringDate the string in format dd.mm.yyyy hh:mm
+ * @return a Date containing the info of the string or the actual date and time if something fails.
+ */
+ /*
+ public Date parseDate(String stringDate) {
+ // date is in this format: dd.mm.yyyy hh:mm
+ if (stringDate == null || "N/A".equals(stringDate)) {
+ return new Date();
+ }
+ try {
+ synchronized (MAIL_TIME_FORMAT) {
+ return MAIL_TIME_FORMAT.parse(stringDate);
+ }
+ } catch (Throwable e) {
+ return new Date();
+ }
+ }
+ */
+
+ public void setFrom(String from) {
+ this.from = from;
+ }
+
+ public String getFrom() {
+ return from;
+ }
+
+ public void setTo(String to) {
+ this.to = to;
+ }
+
+ public String getTo() {
+ return to;
+ }
+
+ public void setCc(String cc) {
+ this.cc = cc;
+ }
+
+ public String getCc() {
+ return cc;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public void setBody(String body) {
+ this.body = body;
+ }
+
+ public String getBody() {
+ return body;
+ }
+
+ public void setSourceCode(String sourceCode) {
+ this.sourceCode = sourceCode;
+ }
+
+ public String getSourceCode() {
+ return sourceCode;
+ }
+
+ public void setHasAttachement(boolean hasAttachement) {
+ this.hasAttachement = hasAttachement;
+ }
+
+ public boolean getHasAttachement() {
+ return hasAttachement;
+ }
+
+ public void setEncoding(String encoding) {
+ this.encoding = encoding;
+ }
+
+ public String getEncoding() {
+ return encoding;
+ }
+
+ public boolean isTextEncoding() {
+ return getEncoding().toLowerCase().indexOf("plain") >= 0;
+ }
+
+ public boolean isHTMLEncoding() {
+ return getEncoding().toLowerCase().indexOf("html") >= 0;
+ }
+
+ /*
+ public String toString() {
+ return getBody() + "," + getCc() + "," + getEncoding() + "," + getFrom() + "," + getHasAttachement() + "," + getHeader() + "," + getReceivedOn() + "," + getSentOn() + "," + getSourceCode() + "," + getSubject() + "," + getTo();
+ }
+ */
+
+ public String toString() {
+ return getBody() + "," + getCc() + "," + getEncoding() + "," + getFrom() + "," + getHasAttachement() + "," + getHeader() + "," + getSourceCode() + "," + getSubject() + "," + getTo();
+ }
+
+ /*
+ public String getID() {
+ if (messageID == null) { // no cached version
+ // Take the message-ID header as ID (if present)
+ String[] messageIDs = getHeaderField("Message-ID");
+ if ((messageIDs != null) && (messageIDs.length > 0)) {
+ messageID = messageIDs[0];
+ } else { // otherwise, hash header and body as ID
+ return String.valueOf(getHeader().hashCode() + getBody().hashCode());
+ }
+ }
+
+ return messageID;
+ }
+ */
+
+ public String[] getHeaderField(String fieldName) {
+
+ }
+
+ public String extractEMailAddress() {
+
+ }
+
+ /*
+ public boolean equals(Object o) {
+ if (o instanceof Mail) {
+ Mail mail = (Mail)o;
+ return this.getID().equals(mail.getID());
+ }
+
+ return false;
+ }
+ */
+
+ public Vector getCommonPart()
+ {
+ Vector returnStrings = new Vector();
+
+ // add header, sender, and title
+ returnStrings.addElement(header);
+ returnStrings.addElement(from);
+ returnStrings.addElement(subject);
+
+ return returnStrings;
+ }
+
+ public String getBodyString()
+ {
+ return body;
+ }
+
+ public Vector returnEmail() {
+ Vector myemail = new Vector();
+ myemail.addElement(getCommonPart());
+ //System.out.println("DEBUG: getCommonPart.size= " + getCommonPart().size());
+ myemail.addElement(getURLs());
+ //System.out.println("DEBUG: getURLs.size= " + getURLs().size());
+ myemail.addElement(getSplittedBody(MAX_TOKEN_SIZE));
+ //System.out.println("DEBUG: getSplittedBody.size= " + getSplittedBody(MAX_TOKEN_SIZE).size());
+ return myemail;
+ }
+
+ public Vector getURLs()
+ {
+ Vector returnStrings = new Vector();
+ Vector splittedBody = body.split();
+
+ // add URL and email in the body
+ for(int i=0; i=end) {
+ String str=noURLBody.substring(i, end);
+ returnStrings.addElement(str);
+ }
+ else {
+ String str=noURLBody.substring(i, i+size);
+ returnStrings.addElement(str);
+ }
+ }
+ return returnStrings;
+ }
+
+
+ public void setIsSpam(boolean spam) {
+ isSpam = spam;
+ }
+
+ public boolean getIsSpam() {
+ if(spam.equals("yes"))
+ return true;
+ return false;
+ }
+
+ /**
+ * Returns result to the Spam filter
+ **/
+ public Vector checkMail(int userid) {
+ //Preprocess emails
+
+ //long startGetParts=System.currentTimeMillis();
+ Vector partsOfMailStrings = returnEmail();
+ //long stopGetParts=System.currentTimeMillis();
+ //System.out.println("Time to read email= " + (stopGetParts-startGetParts));
+
+ //Compute signatures
+ SignatureComputer sigComp = new SignatureComputer();
+ //Vector signatures = sigComp.computeSigs(partsOfMailStrings);//vector of strings
+ //long startGetsignatures=System.currentTimeMillis();
+ Vector signatures = sigComp.computeSigs(partsOfMailStrings);//vector of vector of strings
+ //long stopGetsignatures=System.currentTimeMillis();
+ //System.out.println("Time to Getsignatures= " + (stopGetsignatures-startGetsignatures));
+
+ return signatures;
+ }
+
+ /* For tests only */
+ /*
+ public static void main(String[] args)
+ {
+ Mail mail = new Mail("./emails/email1");
+
+ String[] a = mail.createMailStrings();
+
+ for(String b : a)
+ {
+ System.out.println(b);
+ }
+ }
+ */
+}
diff --git a/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/SignatureComputer.java b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/SignatureComputer.java
new file mode 100755
index 00000000..4f98a2d0
--- /dev/null
+++ b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/SignatureComputer.java
@@ -0,0 +1,289 @@
+public class SignatureComputer {
+ public EphemeralSignature sig4; //signature engines
+ public WhiplashSignature sig8; //signature engines
+
+ int[] enginesToUseForCheck;
+
+ public SignatureComputer() {
+ sig4 = new EphemeralSignature(); //default values
+ sig8 = new WhiplashSignature();
+ createEnginesToCheck();
+ }
+
+ /**
+ * constructor to be used when some parsing has already taken place with the
+ * server-provides value randomNumberSeed
.
+ *
+ * @param randomNumberSeed
+ * a non-negative number used for seeding the random number generator
+ * before starting to hash values.
+ * @param separator
+ * how the mail-text should be splitted into lines. (== what chars
+ * separate 2 lines)
+ */
+ public SignatureComputer(int randomNumberSeed, String separator) {
+ sig4 = new EphemeralSignature(randomNumberSeed,separator);
+ sig8 = new WhiplashSignature();
+ createEnginesToCheck();
+ }
+
+ /**
+ * the constructor to be used most of the time. you can hand over the
+ * seed-string exactly as it is provided by the razor-server.
+ *
+ * @param seedAndSeparator
+ * a string containing the seed value for the RNG and a separator list
+ * (separated by ' - '). default value is
+ * "7542-10"
which means server-seed 7542 and only one
+ * separator 10 (which is ascii '\n').
+ */
+ public SignatureComputer(String seedAndSeparator) {
+ sig4 = new EphemeralSignature(seedAndSeparator);
+ sig8 = new WhiplashSignature();
+ createEnginesToCheck();
+ }
+
+ /**
+ *
+ */
+ public void createEnginesToCheck() {
+ enginesToUseForCheck = new int[2];
+ enginesToUseForCheck[0] = 4; //Ephemeral engine
+ enginesToUseForCheck[1] = 8;//Whiplash engine
+ }
+
+ public boolean isSigSupported(int sig) {
+ boolean found = false;
+ for (int i = 0; i < enginesToUseForCheck.length && !found; i++) {
+ if (enginesToUseForCheck[i] == sig) {
+ found = true;
+ }
+ }
+ return found;
+ }
+
+ public boolean isSigSupported(String sig) {
+ return (sig != null && isSigSupported(Integer.parseInt(sig)));
+ }
+
+ public String getDefaultEngine() {
+ return "4";
+ }
+
+ public Vector computeSigs(Vector EmailParts) {
+ if (EmailParts == null) return null;
+
+ Vector printableSigs = new Vector(); // vector of strings
+
+ /**
+ * Step -I
+ * Get signatures for the common parts
+ **/
+
+ Vector commonpart = (Vector) (EmailParts.elementAt(0));
+ for (int mailIndex = 0; mailIndex < commonpart.size(); mailIndex++) {
+ String mail = (String) (commonpart.elementAt(mailIndex));
+
+ if (mail == null) continue;
+
+ /*
+ * Compute Sig for email header that are cleaned.
+ */
+ for (int engineIndex = 0; engineIndex < enginesToUseForCheck.length; engineIndex++) {
+ int engineNo = enginesToUseForCheck[engineIndex];
+ String sig = null;
+
+ /* EphemeralSignature calculator */
+ if(engineNo==4) {
+ sig = computeSignature(engineNo,mail);
+ }
+
+ if(engineNo==8) {
+ continue;
+ }
+
+ if((engineNo!=4)) {
+ System.out.println("Err: Common part Couldn't find the signature engine: " + engineNo);
+ }
+
+ if (sig != null) {
+ String hash = engineNo + ":" + sig;
+ printableSigs.addElement(hash);
+
+ //System.out.println("DEBUG: mail= " +mail + " hash= " + hash);
+
+ } else {
+ // we didn't produce a signature for the mail.
+ }
+ }//engine
+ }//common part
+
+ /**
+ * Step -II
+ * Get signatures for the body parts without URLs
+ **/
+ Vector getBodywithNoURLs = (Vector)(EmailParts.elementAt(2));
+ for (int mailIndex = 0; mailIndex < getBodywithNoURLs.size(); mailIndex++) {
+ String mail = (String) (getBodywithNoURLs.elementAt(mailIndex));
+
+
+ if (mail == null) continue;
+
+ /*
+ * Compute Sig for email header that are cleaned.
+ */
+ for (int engineIndex = 0; engineIndex < enginesToUseForCheck.length; engineIndex++) {
+ int engineNo = enginesToUseForCheck[engineIndex];
+ String sig = null;
+
+ /* EphemeralSignature calculator */
+ if(engineNo==4) {
+ sig = computeSignature(engineNo,mail);
+ }
+
+ if(engineNo==8)
+ continue;
+
+ if(engineNo!=4) {
+ System.out.println("Err: body parts without URL Couldn't find the signature engine: " + engineNo);
+ }
+
+ if (sig != null) {
+ String hash = engineNo + ":" + sig;
+ printableSigs.addElement(hash);
+ } else {
+ // we didn't produce a signature for the mail.
+ }
+ }//engine
+ }
+
+ /**
+ * Step -III
+ * Get signatures for the body parts with URLs
+ **/
+ Vector getURLs = (Vector)(EmailParts.elementAt(1));
+ for (int mailIndex = 0; mailIndex < getURLs.size(); mailIndex++) {
+ String mail = (String) (getURLs.elementAt(mailIndex));
+
+ /*
+ * Compute Sig for bodyparts that are cleaned.
+ */
+ for (int engineIndex = 0; engineIndex < enginesToUseForCheck.length; engineIndex++) {
+ int engineNo = enginesToUseForCheck[engineIndex];
+ if(engineNo==4)
+ continue;
+
+ /* WhiplashSignature calculator */
+ String[] hosts = null;
+ String sig = null;
+ if(engineNo==8) {
+ //hosts = computeSignature(engineNo,mail);
+ hosts = sig8.computeSignature(mail);
+ if(hosts != null) {
+ for(int i=0; i -e -t \n");
+ System.out.println( " -n : num iterations");
+ System.out.println( " -e : number of emails");
+ System.out.println( " -t : number of threads");
+ }
+
+ public int[] check(Vector signatures, int userid) {
+ //prefetch this.mydhmap.table
+ short[] offsets = new short[4];
+ offsets[0] = getoffset{SpamFilter, mydhmap};
+ offsets[1] = (short) 0;
+ offsets[2] = getoffset{DistributedHashMap, table};
+ offsets[3] = (short) 0;
+ System.rangePrefetch(this, offsets);
+
+ int numparts = signatures.size();
+
+ int[] confidenceVals = new int[numparts];
+
+ for(int i=0; i the mail client is able to determine if it is spam or not
+ // --- According to the "any"-logic (in Core#check_logic) in original Razor ---
+ // If any answer is spam, the entire email is spam.
+ return confidenceVals;
+ }
+
+ /**
+ * This method sends feedback from the user to a distributed
+ * spam database and trains the spam database to check future
+ * emails and detect spam
+ **/
+ public void sendFeedBack(Vector signatures, boolean isSpam, int id, Random myrand) {
+
+ for(int i=0;ihex.
+ */
+ public String hexToBase64(String hex){
+ if(hex == null)
+ return null;
+ int[] b64s = new int[hex.length()*2/3 + ((hex.length()*2)%3)];
+ int i=0;
+ int b64count = 0;
+
+ while(i < hex.length()){
+ //process 3 hex char chunks at a time
+ int upperBorder = Math.imin(i+3,hex.length());
+ String hex3 = hex.substring(i,upperBorder);
+ i+=3;
+
+ int bv = convertHexToRazorEncoding(hex3);
+ //now the right endian encoding
+ b64s[b64count++] = ((0xfc0 & bv)>>>6); //higher 6 bits
+ b64s[b64count++] = (0x3f & bv) ; //lower 6 bits
+
+ }
+ String bs = "";
+ for (int j= 0; j < b64s.length; j++) {
+ bs += b64table[ b64s[j] ];
+ }
+ return bs;
+ }
+
+ /**
+ * razor does some special conversion using perl's pack()
which
+ * we must do manually in java.
+ */
+ private int convertHexToRazorEncoding(String hex3) {
+ if((hex3 == null))
+ return 0; //error
+ int res = 0;
+ int cur = Integer.parseInt(hex3.substring(0,1),16);
+ cur = mirror4LSBits(cur);
+ res |= ( (cur&0xf) << 8);
+ if(hex3.length() >=2) {
+ cur = Integer.parseInt(hex3.substring(1,2),16);
+ } else {
+ cur = 0;
+ }
+ //cur = ( hex3.length() >=2 ? Integer.parseInt(hex3.substring(1,2),16) : 0);
+ cur = mirror4LSBits(cur);
+ res |= ((cur & 0xf) << 4);
+ if(hex3.length() >= 3) {
+ cur = Integer.parseInt(hex3.substring(2,3),16);
+ } else {
+ cur = 0;
+ }
+ //cur = ( hex3.length() >= 3 ? Integer.parseInt(hex3.substring(2,3),16): 0);
+ cur = mirror4LSBits(cur);
+ res |= (cur & 0xf);
+
+ return res;
+ }
+
+ /**
+ * mirrors the 4 least significant bytes of an integer
+ * @param cur an int containing 4 Least Singificant bytes like 00000...00abcd
+ * @return the mirrored 4 least significant bytes 00000...00dcba
. all bits except a-b
are lost.
+ */
+ public int mirror4LSBits(int cur) {
+ int res = 0;
+ res |= (cur & 0x8)>>>3;
+ res |= (cur & 0x4)>>>1;
+ res |= (cur & 0x2)<<1;
+ res |= (cur & 0x1)<<3;
+ return res;
+ }
+
+ public String[] whiplash(String text) {
+
+ if (text == null) {
+ return null;
+ }
+ String[] hosts = extractHosts(text);
+ if (hosts == null || hosts.length < 1) {
+ return null;
+ }
+ String[] sigs = new String[hosts.length];
+
+ for (int i = 0; i < hosts.length; i++) {
+ MD5 md = new MD5();
+ String host = hosts[i];
+ int len = host.length();
+ byte buf[] = host.getBytes();
+ byte sig[] = new byte[16];
+ md.update(buf, len);
+ md.md5final(sig);
+ String signature = new String(sig);
+
+ // System.out.println("DEBUG: host= " + host + " whiplash sig= " + signature);
+
+ sigs[i] = signature;
+ }
+ return sigs;
+ }
+
+ public String[] extractHosts(String text) {
+ //System.out.println("Inside extractHosts");
+ Vector hosts = new Vector();
+ String buf = new String(text);
+
+ //System.out.println("DEBUG: extractHosts() string= " + buf);
+
+ /* Extract hosts from http:// links */
+ int idx;
+ String strwww = new String("www.");
+ while ((idx = buf.indexOf(strwww)) != -1) {
+ int startidx = idx + strwww.length();
+ String strcom = new String(".");
+ buf = buf.subString(startidx);
+ int endidx = buf.indexOf(strcom);
+ String host = buf.subString(0, endidx);
+ //System.out.println("DEBUG: http links extracted host= " + host);
+
+ buf = buf.subString(endidx);
+ endidx = buf.indexOf(strcom);
+ host += buf.subString(0, endidx);
+
+ hosts.addElement(host);
+ buf = buf.subString(endidx+strcom.length());
+ }
+
+ /* Extract hosts from email addressess */
+ buf = new String(text);
+ String strrate = new String("@");
+ while ((idx = buf.indexOf(strrate)) != -1) {
+ int startidx = idx + strrate.length();
+ String strdot = new String(".");
+ buf = buf.subString(startidx);
+ int endidx = buf.indexOf(strdot);
+ String host = buf.subString(0, endidx);
+ //System.out.println("DEBUG: email addr extracted host= " + host);
+
+ buf = buf.subString(endidx);
+ endidx = buf.indexOf(strdot);
+ host += buf.subString(0, endidx);
+
+ hosts.addElement(host);
+ buf = buf.subString(endidx+strdot.length());
+ }
+
+ if (hosts.size() == 0) {
+ return null;
+ }
+
+ String[] retbuf = new String[hosts.size()];
+ for (int i = 0; i < hosts.size(); i++) {
+ retbuf[i] = (String) (hosts.elementAt(i));
+ }
+
+ return retbuf;
+ }
+
+// Testing the signature computation
+// public static void main(String[] args) {
+// /* String testVector = " Test Vectors: \n"+
+// "\n" +
+// "1. http:www.nodg.com@www.geocities.com/nxcisdsfdfdsy/off\n"+
+// "2. http:www.ksleybiuh.com@213.171.60.74/getoff/\n"+
+// "3. \n"+
+// "4. http:217.12.4.7/rmi/http:definethis.net/526/index.html\n"+
+// "5. http:magalygr8sex.free-host.com/h.html\n"+
+// "6. http:%3CVenkatrs%3E@218.80.74.102/thecard/4index.htm\n"+
+// "7. http:EBCDVKIGURGGCEOKXHINOCANVQOIDOXJWTWGPC@218.80.74.102/thecard/5in\n"+
+// "8. http:g.india2.bag.gs/remove_page.htm\n"+
+// "9. https:220.97.40.149\n"+
+// "10. http:mjaked.biz/unsubscribe.ddd?leaving\n"+
+// "11. http:g5j99m8@it.rd.yahoo.com/bassi/*http:www.lekobas.com/c/index.php\n"+
+// "12. look great / feel great\n"+
+// "13. \n"+
+// "14. www.pillzthatwork.com # anything that starts with www. \n";
+// */
+// String testVector = "\n"+
+// "\n"+
+// "Our first autolink: www.autolink1.com or another link like www.autolink2.co.uk or how about https:plaintextlink1.co.uk or http:plaintextlink2.com
\n"+
+// "now a masked link http://www.coveringlink1.com and another link http:plaintextlink3.net and how about https:plaintextlink4.to
\n"+
+// "another masked link https:coveringlink2.com and another link https:plaintextlink5.com
\n"+
+// "\n"+
+// "\n";
+// String test1 = "Our first autolink: www.autolink1.com or another link like www.autolink2.co.uk or how about https:plaintextlink1.co.uk or http:plaintextlink2.com
\n";
+// WhiplashSignature whiplash = new WhiplashSignature();
+// String[] hosts = whiplash.computeSignature(testVector);
+// //String[] hosts = whiplash.computeSignature(test1);
+// for (int i = 0; i < hosts.length; i++) {
+// String string = hosts[i];
+// System.out.println("host " + i + ":\t" + string);
+// }
+// }
+
+}
diff --git a/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/URLList b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/URLList
new file mode 100644
index 00000000..d0ddb91f
--- /dev/null
+++ b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/URLList
@@ -0,0 +1,752 @@
+http://www.yward.co.kr
+http://www.Chandler.co.uk
+http://www.San.ca
+http://www.Bernardino.co.kr
+http://www.Oil.ca
+http://www.La.co.uk
+http://www.Puente.com
+http://www.Lincoln.ca
+http://www.Walla.ca
+http://www.Walla.co.uk
+http://www.Mission.co.kr
+http://www.Viejo.co.uk
+http://www.Hattiesburg.co.kr
+http://www.Asbury.co.kr
+http://www.Park.co.uk
+http://www.Cicero.com
+http://www.Egg.co.uk
+http://www.Harbor.com
+http://www.Pascagoula.com
+http://www.Detroit.co.kr
+http://www.Carbondale.com
+http://www.Starkville.co.kr
+http://www.South.ca
+http://www.El.co.uk
+http://www.Monte.co.uk
+http://www.Port.co.uk
+http://www.Arthur.co.kr
+http://www.Woodruff.co.kr
+http://www.Blythe.co.kr
+http://www.Monrovia.ca
+http://www.Areceibo.co.uk
+http://www.Plattsburgh.co.uk
+http://www.Visalia.co.uk
+http://www.Rolla.ca
+http://www.Jeffersonville.co.kr
+http://www.Naperville.ca
+http://www.Ada.com
+http://www.Newport.co.kr
+http://www.Rutland.co.uk
+http://www.Urbana.ca
+http://www.Agawam.ca
+http://www.Valencia.ca
+http://www.Pierre.co.kr
+http://www.Oneida.com
+http://www.Hickory.ca
+http://www.Corinth.co.uk
+http://www.Murray.com
+http://www.West.co.kr
+http://www.Hollywood.co.uk
+http://www.Mission.ca
+http://www.News.com
+http://www.Butte.com
+http://www.Shreveport.ca
+http://www.Fredericksburg.co.uk
+http://www.Greenville.co.uk
+http://www.Wheeling.com
+http://www.Claremore.ca
+http://www.Corvallis.ca
+http://www.Parma.ca
+http://www.Cheyenne.com
+http://www.Flint.co.kr
+http://www.Eden.com
+http://www.Prairie.ca
+http://www.Commerce.co.uk
+http://www.Commerce.ca
+http://www.West.ca
+http://www.Covina.com
+http://www.Johnstown.co.kr
+http://www.nus.co.uk
+http://www.Uriel.ca
+http://www.Connor.co.uk
+http://www.Joel.co.kr
+http://www.Tanek.co.uk
+http://www.Luke.com
+http://www.Eric.co.kr
+http://www.Keith.co.uk
+http://www.Giacomo.co.kr
+http://www.Joseph.com
+http://www.Walter.com
+http://www.Barry.co.uk
+http://www.Vladimir.com
+http://www.Jerome.com
+http://www.Derek.co.kr
+http://www.Igor.co.kr
+http://www.Damian.co.uk
+http://www.Baxter.co.kr
+http://www.Carter.com
+http://www.Tate.com
+http://www.Brody.com
+http://www.Baxter.com
+http://www.Cameron.co.kr
+http://www.Oscar.com
+http://www.Declan.co.uk
+http://www.Carson.co.uk
+http://www.Kevin.co.uk
+http://www.Nero.co.kr
+http://www.Abbot.co.kr
+http://www.Wallace.co.uk
+http://www.Calvin.co.uk
+http://www.Logan.co.uk
+http://www.Talon.co.kr
+http://www.Graham.ca
+http://www.Callum.ca
+http://www.Phelan.co.uk
+http://www.Amos.ca
+http://www.James.com
+http://www.Erich.com
+http://www.Hedley.com
+http://www.Amal.ca
+http://www.Dolan.com
+http://www.Jordan.co.uk
+http://www.Zachery.ca
+http://www.Richard.ca
+http://www.Robert.ca
+http://www.Hu.com
+http://www.Travis.com
+http://www.Lyle.ca
+http://www.Warren.co.kr
+http://www.Amir.ca
+http://www.Oren.ca
+http://www.Brennan.co.kr
+http://www.Ralph.ca
+http://www.Adrian.co.kr
+http://www.Duncan.ca
+http://www.Garrison.co.kr
+http://www.Norman.co.kr
+http://www.Dylan.com
+http://www.Erasmus.ca
+http://www.Theodore.ca
+http://www.Wade.co.uk
+http://www.Cody.ca
+http://www.Dorian.co.uk
+http://www.Boris.co.kr
+http://www.Yoshio.co.kr
+http://www.Felix.com
+http://www.Len.com
+http://www.Elliott.co.kr
+http://www.Raphael.com
+http://www.Mannix.ca
+http://www.Len.co.kr
+http://www.Macon.co.uk
+http://www.Harlan.com
+http://www.Cain.com
+http://www.Brandon.co.kr
+http://www.Jamal.com
+http://www.Asher.ca
+http://www.Porter.com
+http://www.Hiram.co.kr
+http://www.Branden.co.uk
+http://www.Jasper.ca
+http://www.Kermit.co.uk
+http://www.Tucker.co.kr
+http://www.Joel.ca
+http://www.Theodore.co.kr
+http://www.Drew.co.kr
+http://www.Daniel.com
+http://www.Christopher.com
+http://www.Lucas.com
+http://www.Cadman.ca
+http://www.Cadman.co.uk
+http://www.Simon.ca
+http://www.Herrod.com
+http://www.David.co.uk
+http://www.Samuel.com
+http://www.Raymond.com
+http://www.Lance.com
+http://www.Julian.co.kr
+http://www.Quinlan.co.kr
+http://www.Vladimir.co.kr
+http://www.Chase.ca
+http://www.Coby.co.kr
+http://www.Bernard.com
+http://www.Elliott.com
+http://www.Nigel.co.kr
+http://www.Carl.ca
+http://www.Beau.com
+http://www.Carson.co.kr
+http://www.Dominic.co.kr
+http://www.Lane.co.uk
+http://www.Phelan.ca
+http://www.Clarke.co.uk
+http://www.Bruce.co.kr
+http://www.Malcolm.ca
+http://www.Steel.ca
+http://www.Caesar.co.uk
+http://www.Kamal.com
+http://www.Ahmed.co.kr
+http://www.Addison.co.kr
+http://www.Abraham.com
+http://www.Devin.ca
+http://www.Simon.com
+http://www.Reuben.com
+http://www.Camden.co.kr
+http://www.Alan.co.kr
+http://www.Hall.ca
+http://www.Nicholas.co.uk
+http://www.Reed.co.uk
+http://www.Francis.com
+http://www.Troy.com
+http://www.Alden.co.uk
+http://www.Cooper.com
+http://www.Oscar.ca
+http://www.Lucius.ca
+http://www.Emery.ca
+http://www.Ulric.com
+http://www.Vernon.com
+http://www.Vincent.co.kr
+http://www.Michael.co.uk
+http://www.Byron.co.kr
+http://www.Barclay.co.uk
+http://www.Ezra.co.kr
+http://www.Mark.com
+http://www.Ira.ca
+http://www.Clayton.com
+http://www.Rogan.co.uk
+http://www.Ali.ca
+http://www.Conan.co.kr
+http://www.Ryder.co.uk
+http://www.Amal.co.uk
+http://www.Jeremy.ca
+http://www.Murphy.co.uk
+http://www.Silas.co.uk
+http://www.Micah.com
+http://www.Noah.ca
+http://www.Dennis.co.kr
+http://www.Grady.co.kr
+http://www.Jonah.com
+http://www.Edward.co.kr
+http://www.Kasimir.co.uk
+http://www.Brady.com
+http://www.Kareem.co.kr
+http://www.Dustin.co.kr
+http://www.Thaddeus.com
+http://www.Colton.com
+http://www.Nasim.co.uk
+http://www.Russell.co.kr
+http://www.Tyrone.co.uk
+http://www.Seth.ca
+http://www.Tucker.ca
+http://www.Davis.ca
+http://www.Jermaine.co.uk
+http://www.Gil.co.uk
+http://www.Isaac.ca
+http://www.Harrison.com
+http://www.Nicholas.com
+http://www.Igor.co.uk
+http://www.Conan.ca
+http://www.Stone.com
+http://www.Eric.com
+http://www.Knox.co.uk
+http://www.Leo.com
+http://www.Elmo.ca
+http://www.Brent.co.uk
+http://www.Darius.com
+http://www.Lucian.com
+http://www.Mohammad.com
+http://www.San.com
+http://www.Juan.co.kr
+http://www.Capistrano.co.kr
+http://www.West.co.uk
+http://www.Hollywood.com
+http://www.Batavia.co.kr
+http://www.Middletown.ca
+http://www.Sturgis.co.kr
+http://www.Bay.ca
+http://www.St..co.uk
+http://www.Louis.ca
+http://www.Laredo.co.uk
+http://www.Minneapolis.com
+http://www.Prescott.co.kr
+http://www.Stillwater.co.kr
+http://www.Rome.ca
+http://www.Gadsden.co.kr
+http://www.Seattle.com
+http://www.Glen.co.kr
+http://www.Cove.ca
+http://www.Waycross.ca
+http://www.Wausau.com
+http://www.Chula.co.uk
+http://www.Vista.co.kr
+http://www.Edmond.co.uk
+http://www.Fort.co.uk
+http://www.Collins.com
+http://www.Carolina.com
+http://www.Joplin.co.uk
+http://www.Lodi.com
+http://www.Scottsdale.com
+http://www.Murfreesboro.co.uk
+http://www.Sanford.com
+http://www.Bend.co.kr
+http://www.Antonio.com
+http://www.Santa.co.kr
+http://www.Cruz.co.uk
+http://www.Elkhart.co.kr
+http://www.Rapid.com
+http://www.Dover.com
+http://www.Battle.co.kr
+http://www.Creek.ca
+http://www.Peoria.com
+http://www.Fond.co.uk
+http://www.du.co.uk
+http://www.Lac.co.kr
+http://www.Newburgh.co.uk
+http://www.Michigan.ca
+http://www.Half.com
+http://www.Moon.ca
+http://www.Bay.co.kr
+http://www.Bremerton.co.kr
+http://www.Calumet.co.kr
+http://www.Biddeford.com
+http://www.Williamsport.co.kr
+http://www.Titusville.co.kr
+http://www.Huntington.com
+http://www.Park.co.kr
+http://www.Mateo.com
+http://www.Denver.co.kr
+http://www.Green.co.uk
+http://www.River.com
+http://www.Reedsport.co.uk
+http://www.Hopkinsville.com
+http://www.New.com
+http://www.Bedford.co.uk
+http://www.Augusta.ca
+http://www.Marlborough.com
+http://www.Austin.ca
+http://www.Mequon.co.uk
+http://www.Green.com
+http://www.North.com
+http://www.Platte.com
+http://www.Greenfield.co.uk
+http://www.Jenks.ca
+http://www.Jeffersontown.ca
+http://www.Cheyenne.co.uk
+http://www.Philadelphia.co.kr
+http://www.Chicopee.com
+http://www.Hot.co.uk
+http://www.Springs.co.uk
+http://www.Rockford.ca
+http://www.Marys.co.uk
+http://www.Pico.com
+http://www.Rivera.co.uk
+http://www.Hermosa.ca
+http://www.Beach.ca
+http://www.Irwindale.co.kr
+http://www.Baton.com
+http://www.Rouge.com
+http://www.Lawton.co.kr
+http://www.Melrose.co.uk
+http://www.Centennial.com
+http://www.La.co.kr
+http://www.Puente.ca
+http://www.Kalispell.ca
+http://www.Meriden.com
+http://www.Harbor.co.kr
+http://www.Oshkosh.com
+http://www.Tupelo.co.uk
+http://www.Agoura.co.kr
+http://www.Hills.com
+http://www.Baytown.ca
+http://www.Lufkin.ca
+http://www.Baldwin.ca
+http://www.Myrtle.com
+http://www.Midland.ca
+http://www.Nanticoke.co.uk
+http://www.Covington.com
+http://www.Haven.co.uk
+http://www.Helena.co.uk
+http://www.Nome.com
+http://www.Brookings.ca
+http://www.Bend.co.uk
+http://www.Rafael.com
+http://www.Louisville.ca
+http://www.Signal.com
+http://www.Hill.com
+http://www.Oil.co.uk
+http://www.City.co.uk
+http://www.Culver.com
+http://www.Darlington.ca
+http://www.Bellflower.com
+http://www.Enid.co.kr
+http://www.Pocatello.ca
+http://www.New.ca
+http://www.Madrid.com
+http://www.Ithaca.co.uk
+http://www.Clarksburg.co.uk
+http://www.Wichita.co.uk
+http://www.Falls.com
+http://www.Kahului.ca
+http://www.Pullman.com
+http://www.Syracuse.co.uk
+http://www.Kearns.com
+http://www.Juan.ca
+http://www.Capistrano.co.uk
+http://www.Homer.co.kr
+http://www.Lewiston.ca
+http://www.Memphis.ca
+http://www.Bossier.com
+http://www.Grand.ca
+http://www.Forks.com
+http://www.Bakersfield.co.kr
+http://www.Provo.com
+http://www.Rafael.ca
+http://www.Chino.com
+http://www.Santa.com
+http://www.Barbara.co.uk
+http://www.Murrieta.ca
+http://www.Palos.com
+http://www.Verdes.com
+http://www.Estates.com
+http://www.North.co.kr
+http://www.Chicago.co.uk
+http://www.East.com
+http://www.Lansing.com
+http://www.The.co.uk
+http://www.Dalles.co.uk
+http://www.St..ca
+http://www.Petersburg.co.kr
+http://www.Gardena.co.kr
+http://www.Chicago.co.kr
+http://www.Heights.co.uk
+http://www.Minnetonka.com
+http://www.Waukegan.co.kr
+http://www.Montpelier.com
+http://www.Reno.ca
+http://www.Hills.co.uk
+http://www.Meridian.co.kr
+http://www.Cody.co.kr
+http://www.Rancho.co.kr
+http://www.Cordova.co.uk
+http://www.Jersey.co.kr
+http://www.Newburyport.co.kr
+http://www.Mandan.co.kr
+http://www.Selma.com
+http://www.ve.ca
+http://www.Vacaville.ca
+http://www.Fort.com
+http://www.Worth.ca
+http://www.of.co.kr
+http://www.Industry.co.kr
+http://www.Coatesville.com
+http://www.Fremont.co.uk
+http://www.Chickasha.co.kr
+http://www.Broken.ca
+http://www.Arrow.ca
+http://www.Valley.com
+http://www.Oro.co.kr
+http://www.Valley.co.kr
+http://www.Poughkeepsie.com
+http://www.Downey.ca
+http://www.Huron.co.uk
+http://www.Greensburg.com
+http://www.Cheyenne.ca
+http://www.Fernando.co.uk
+http://www.Nichols.com
+http://www.Hills.ca
+http://www.Lockport.co.uk
+http://www.Flagstaff.com
+http://www.Long.ca
+http://www.Beach.co.kr
+http://www.Cortland.ca
+http://www.Sioux.ca
+http://www.Falls.ca
+http://www.Brookfield.co.uk
+http://www.Merced.ca
+http://www.Miami.com
+http://www.Phenix.ca
+http://www.Allentown.co.uk
+http://www.Muncie.com
+http://www.Belleville.ca
+http://www.Wausau.co.uk
+http://www.Longview.com
+http://www.Healdsburg.ca
+http://www.Buena.co.uk
+http://www.Park.com
+http://www.Knoxville.co.uk
+http://www.Gardens.co.uk
+http://www.Joliet.co.uk
+http://www.New.co.uk
+http://www.Kensington.com
+http://www.Oxnard.com
+http://www.Honolulu.co.uk
+http://www.Fairmont.ca
+http://www.Homer.co.uk
+http://www.Norfolk.co.uk
+http://www.Yuma.co.kr
+http://www.Rialto.co.uk
+http://www.San.co.kr
+http://www.Luis.com
+http://www.Obispo.co.kr
+http://www.Diego.ca
+http://www.Helena.co.kr
+http://www.Fontana.com
+http://www.Bethany.co.uk
+http://www.Dalles.co.kr
+http://www.Little.com
+http://www.Rock.co.uk
+http://www.Vancouver.com
+http://www.Abilene.co.kr
+http://www.Baldwin.co.uk
+http://www.Park.ca
+http://www.Laramie.ca
+http://www.Philadelphia.co.uk
+http://www.Beaumont.co.kr
+http://www.Columbus.ca
+http://www.Farmer.com
+http://www.Carbondale.co.uk
+http://www.Sandpoint.co.uk
+http://www.Lynwood.co.uk
+http://www.Easton.com
+http://www.Easthampton.com
+http://www.Berkeley.ca
+http://www.Pawtucket.co.uk
+http://www.Sun.com
+http://www.Valley.ca
+http://www.Riverside.ca
+http://www.Bethany.ca
+http://www.Chelsea.co.kr
+http://www.Cedarburg.ca
+http://www.Portland.co.uk
+http://www.Chattanooga.ca
+http://www.Tok.co.kr
+http://www.Lowell.ca
+http://www.Watertown.co.uk
+http://www.Escondido.ca
+http://www.Sault.ca
+http://www.Ste..ca
+http://www.Marie.co.kr
+http://www.Ansonia.co.kr
+http://www.Chico.co.uk
+http://www.Frederiksted.ca
+http://www.Webster.co.uk
+http://www.Groves.co.kr
+http://www.Chicopee.ca
+http://www.Hammond.com
+http://www.Jenks.co.kr
+http://www.Stanton.co.uk
+http://www.Johnstown.co.uk
+http://www.London.com
+http://www.Charleston.co.uk
+http://www.Mobile.ca
+http://www.Rochester.ca
+http://www.Allis.ca
+http://www.Blacksburg.co.uk
+http://www.Albany.co.uk
+http://www.Covina.co.kr
+http://www.Industry.ca
+http://www.Laurel.co.kr
+http://www.Fernley.co.uk
+http://www.Marquette.co.uk
+http://www.Charleston.ca
+http://www.Athens.co.kr
+http://www.Sioux.co.kr
+http://www.Falls.co.uk
+http://www.Norwalk.co.uk
+http://www.Las.co.uk
+http://www.Vegas.com
+http://www.Baltimore.co.kr
+http://www.Lancaster.ca
+http://www.Woodward.co.kr
+http://www.Mentor.ca
+http://www.Tucson.ca
+http://www.Utica.co.uk
+http://www.Spokane.co.kr
+http://www.Auburn.co.kr
+http://www.Hills.co.kr
+http://www.Livonia.ca
+http://www.Hampton.ca
+http://www.Compton.com
+http://www.Spartanburg.co.uk
+http://www.Brea.co.uk
+http://www.Dixon.co.uk
+http://www.Yakima.ca
+http://www.Lynwood.ca
+http://www.Georgetown.com
+http://www.Pittsburgh.com
+http://www.Caguas.co.uk
+http://www.Visalia.co.kr
+http://www.Culver.co.kr
+http://www.Brookfield.com
+http://www.Phoenix.co.uk
+http://www.Hutchinson.ca
+http://www.Texarkana.co.uk
+http://www.South.co.uk
+http://www.Portland.com
+http://www.Kenner.co.kr
+http://www.Provo.ca
+http://www.Liberal.ca
+http://www.Vineland.com
+http://www.Saipan.com
+http://www.Williston.com
+http://www.Vail.co.kr
+http://www.Garland.co.kr
+http://www.Tallahassee.co.kr
+http://www.Shelton.ca
+http://www.Cleveland.com
+http://www.Ventura.co.kr
+http://www.Gettysburg.co.kr
+http://www.Medford.co.kr
+http://www.Brookings.co.uk
+http://www.Cohoes.com
+http://www.Ogden.com
+http://www.Grand.co.uk
+http://www.Rapids.ca
+http://www.Claremont.co.kr
+http://www.of.com
+http://www.Parkersburg.ca
+http://www.Superior.co.uk
+http://www.Florence.co.kr
+http://www.New.co.kr
+http://www.Bedford.co.kr
+http://www.Beverly.co.uk
+http://www.Independence.com
+http://www.Westlake.ca
+http://www.Village.co.uk
+http://www.Angelo.co.uk
+http://www.Schenectady.co.uk
+http://www.Nogales.ca
+http://www.Cerrito.ca
+http://www.Monrovia.co.uk
+http://www.Cambridge.co.uk
+http://www.Concord.ca
+http://www.Greensburg.co.uk
+http://www.Bradford.ca
+http://www.Brigham.co.kr
+http://www.Pasadena.co.uk
+http://www.Wisconsin.ca
+http://www.Rapids.co.kr
+http://www.Warwick.ca
+http://www.Starkville.co.uk
+http://www.Tupelo.co.kr
+http://www.Enid.com
+http://www.Idabel.co.kr
+http://www.Amesbury.co.uk
+http://www.Knoxville.com
+http://www.Baton.co.uk
+http://www.Rouge.ca
+http://www.Hannibal.co.uk
+http://www.News.ca
+http://www.Dickinson.co.kr
+http://www.Lockport.co.kr
+http://www.Manitowoc.ca
+http://www.Oneonta.com
+http://www.Moscow.ca
+http://www.Washington.co.kr
+http://www.Hastings.co.uk
+http://www.Lake.com
+http://www.Forest.co.kr
+http://www.Anaheim.co.uk
+http://www.Baltimore.co.uk
+http://www.Cape.com
+http://www.May.co.kr
+http://www.Daly.ca
+http://www.Idabel.ca
+http://www.Dover.ca
+http://www.Garden.ca
+http://www.Grove.com
+http://www.Birmingham.co.kr
+http://www.Dayton.ca
+http://www.Paso.com
+http://www.Covina.ca
+http://www.Calabasas.co.uk
+http://www.Marshfield.co.kr
+http://www.Guthrie.co.kr
+http://www.Yonkers.com
+http://www.Jackson.co.kr
+http://www.Lower.co.uk
+http://www.Burrell.co.kr
+http://www.York.com
+http://www.Ogdensburg.ca
+http://www.Cairo.com
+http://www.College.com
+http://www.Station.co.kr
+http://www.Deadwood.co.uk
+http://www.Orford.co.kr
+http://www.Cairo.co.uk
+http://www.South.com
+http://www.Gate.com
+http://www.Biloxi.co.kr
+http://www.Tempe.ca
+http://www.Galveston.co.uk
+http://www.Bloomington.com
+http://www.Turlock.com
+http://www.Hawthorne.co.kr
+http://www.Delta.co.uk
+http://www.Junction.com
+http://www.Burbank.co.kr
+http://www.Laconia.co.uk
+http://www.Keene.co.kr
+http://www.Superior.co.kr
+http://www.Peabody.co.uk
+http://www.Pocatello.co.uk
+http://www.Shamokin.ca
+http://www.Schaumburg.co.uk
+http://www.Dunkirk.co.kr
+http://www.Columbia.co.uk
+http://www.Warwick.com
+http://www.Dover.co.uk
+http://www.Natchitoches.co.kr
+http://www.Lakeland.com
+http://www.Stanton.com
+http://www.Athens.co.uk
+http://www.Worcester.co.uk
+http://www.Kenner.com
+http://www.Cerrito.co.kr
+http://www.Pittston.co.uk
+http://www.Mobile.co.uk
+http://www.Bristol.co.kr
+http://www.Gabriel.com
+http://www.Kokomo.co.kr
+http://www.Joliet.com
+http://www.Temple.com
+http://www.Half.co.uk
+http://www.Moon.co.kr
+http://www.Santa.ca
+http://www.Rosa.ca
+http://www.Brookfield.co.kr
+http://www.Las.co.kr
+http://www.Cruces.com
+http://www.Muncie.ca
+http://www.Monterey.co.uk
+http://www.Villa.co.kr
+http://www.Laconia.ca
+http://www.Elmira.co.kr
+http://www.Adams.com
+http://www.Beverly.ca
+http://www.Tempe.com
+http://www.Aurora.com
+http://www.Burlington.co.uk
+http://www.Biloxi.co.uk
+http://www.Malibu.co.kr
+http://www.Woburn.com
+http://www.Midland.com
+http://www.Wichita.co.kr
+http://www.Rafael.co.kr
+http://www.Shamokin.co.uk
+http://www.Paducah.co.uk
+http://www.Hartford.com
+http://www.Waltham.com
+http://www.La.ca
+http://www.Puente.co.kr
+http://www.Sharon.com
+http://www.Hartford.co.uk
+http://www.Great.ca
+http://www.Cleveland.co.uk
+http://www.Mirada.ca
+http://www.Saint.co.kr
+http://www.Albans.co.kr
+http://www.Atwater.co.kr
+http://www.Nanticoke.co.kr
+http://www.Duarte.co.kr
+http://www.Fredericksburg.com
+http://www.Phoenix.ca
diff --git a/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/accountList b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/accountList
new file mode 100644
index 00000000..8fb7f8ea
--- /dev/null
+++ b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/accountList
@@ -0,0 +1,600 @@
+urabitur.vel.lectus@orcilobortis.com
+Aenean.gravida.nunc@Nullatemporaugue.edu
+Duis@auctorveliteget.edu
+erat.volutpat@Mauris.com
+vel@Nullamfeugiat.edu
+Aliquam@at.edu
+metus.facilisis.lorem@euligulaAenean.ca
+sed.tortor@Morbi.edu
+lobortis@Integervulputaterisus.org
+molestie.pharetra.nibh@turpisegestas.org
+magna.malesuada.vel@Sedid.edu
+sit.amet.dapibus@varius.com
+eu.tellus@per.ca
+in@aliquamerosturpis.ca
+ultricies@mattisInteger.edu
+Donec@Integerid.com
+nulla@Cras.org
+luctus.Curabitur@orci.com
+ultrices.iaculis@nequenonquam.com
+scelerisque.neque.sed@ametultriciessem.edu
+orci.Ut.semper@montesnascetur.org
+dolor.elit@cursus.ca
+dui.semper@eratvitae.edu
+nascetur@metusVivamuseuismod.edu
+amet@ut.ca
+erat.in@magnaPhasellusdolor.org
+quis.diam.luctus@ut.org
+tempus.lorem.fringilla@Phasellus.ca
+placerat.velit.Quisque@Phasellus.edu
+eget@vestibulumnec.ca
+dapibus.quam@tempusloremfringilla.edu
+odio.sagittis.semper@sodales.org
+Nunc.mauris@vulputatenisisem.com
+ullamcorper.velit@faucibuslectusa.org
+aliquet.Proin.velit@risusatfringilla.ca
+interdum@venenatislacus.edu
+adipiscing@sit.ca
+mauris@nectellusNunc.com
+nunc.ac@Nullamlobortis.ca
+erat.eget.ipsum@amagna.edu
+purus@etnetus.com
+tempus.eu@Sedcongue.ca
+tincidunt.pede@Vestibulum.edu
+feugiat.tellus.lorem@Maecenas.edu
+sagittis.lobortis@Aenean.ca
+Fusce.aliquet.magna@Crasvehicula.ca
+penatibus.et.magnis@eget.org
+Aliquam.nisl@neceuismodin.com
+a.facilisis@arcuVestibulum.ca
+fermentum.metus.Aenean@volutpatNullafacilisis.org
+lobortis.mauris.Suspendisse@a.org
+nunc.id.enim@miloremvehicula.com
+Class.aptent@commodoipsumSuspendisse.org
+mauris.blandit@suscipit.org
+nulla.Integer.vulputate@enimconsequatpurus.org
+sed.sem.egestas@fermentum.org
+orci.luctus.et@nunc.org
+lorem.eu.metus@semmagna.com
+Mauris.molestie.pharetra@feliseget.edu
+dictum@velarcuCurabitur.com
+rhoncus@Donecegestas.com
+primis.in.faucibus@nec.ca
+magna.a.neque@euerosNam.ca
+convallis.dolor@dictumsapienAenean.org
+magna@sempertellusid.ca
+porttitor@nec.com
+Donec.sollicitudin.adipiscing@vestibulummassa.org
+non.vestibulum.nec@auctorveliteget.edu
+at.libero.Morbi@turpis.edu
+Quisque@Donec.edu
+torquent.per.conubia@luctus.edu
+nonummy@Phasellusdolorelit.ca
+metus.In@fames.edu
+vel.lectus.Cum@Nulla.org
+at@enimcommodo.edu
+sagittis.augue@eget.ca
+aliquet@iaculis.edu
+nec@ipsum.edu
+gravida.molestie.arcu@pellentesque.com
+Aliquam.vulputate@molestie.ca
+eget.venenatis.a@nibh.com
+Proin.ultrices@Aenean.com
+egestas@odiotristiquepharetra.com
+arcu.Vestibulum.ut@Fusce.ca
+mauris@blandit.edu
+vulputate.nisi.sem@luctuset.com
+Sed@est.org
+turpis.egestas@semperpretium.com
+sagittis@ullamcorper.edu
+Curabitur.consequat@elitpellentesquea.ca
+sed.pede@Duisami.edu
+tempus@sem.edu
+turpis.nec@liberoDonec.edu
+luctus.ipsum@arcuimperdietullamcorper.ca
+eget@nibhAliquamornare.edu
+metus.Aenean.sed@metusurnaconvallis.edu
+feugiat.metus.sit@orciconsectetuereuismod.ca
+dictum.eu.placerat@adipiscingelit.edu
+interdum.Sed@placerataugueSed.edu
+tristique.neque.venenatis@elit.org
+metus@semmollisdui.edu
+placerat.orci.lacus@pedeCrasvulputate.com
+placerat.orci.lacus@facilisisfacilisis.com
+dapibus.id@ultrices.org
+penatibus.et@aodiosemper.org
+metus@Duis.com
+nulla.Integer.urna@mus.edu
+eu.nibh@maurissitamet.com
+sed@Sed.org
+eros.Proin@ultricies.org
+Aliquam.erat.volutpat@consectetuermaurisid.ca
+natoque.penatibus@duiSuspendisseac.ca
+natoque@mauris.com
+feugiat.non@magnisdisparturient.edu
+amet@fermentum.ca
+Proin.non.massa@pedeacurna.edu
+consectetuer.euismod@erat.com
+tincidunt.nibh.Phasellus@eget.org
+elementum.purus.accumsan@Quisque.org
+mi.lacinia@eutellus.edu
+sed.pede@feliseget.ca
+Donec.dignissim@nequevitae.org
+tristique.senectus@loremfringilla.edu
+dolor.tempus.non@Donec.com
+egestas.lacinia.Sed@tellusimperdiet.edu
+commodo.hendrerit.Donec@Sedmalesuadaaugue.edu
+id.erat.Etiam@blanditmattisCras.ca
+dui.Cras@diamPellentesque.org
+euismod@tempuslorem.com
+pellentesque.a@vel.edu
+Nullam.nisl@elitEtiamlaoreet.com
+est.arcu.ac@utaliquamiaculis.edu
+at.pede.Cras@montes.com
+facilisi.Sed.neque@milorem.com
+elit.sed.consequat@MorbimetusVivamus.com
+mi.felis@lobortisquama.org
+sagittis@ProinmiAliquam.org
+fermentum.vel@a.ca
+faucibus.Morbi@maurisSuspendisse.ca
+porttitor.interdum.Sed@accumsan.ca
+interdum.Sed@ProinvelitSed.ca
+auctor@Fuscediamnunc.edu
+vestibulum.nec@Pellentesqueultriciesdignissim.ca
+pharetra.Nam@sedpedenec.edu
+at.lacus.Quisque@nec.com
+auctor@felisullamcorperviverra.ca
+aliquet.odio.Etiam@diam.edu
+vitae@ProindolorNulla.org
+pellentesque@commodoatlibero.com
+porttitor.eros@Quisque.ca
+primis@etrutrumeu.org
+faucibus.orci@massaMaurisvestibulum.edu
+ac.libero@mollisduiin.ca
+fringilla@fermentumvelmauris.org
+dolor.sit@pedeNuncsed.ca
+orci@ligula.edu
+Quisque@sagittissemper.edu
+Donec.non.justo@pellentesquetellussem.edu
+molestie.dapibus.ligula@urnaNunc.edu
+sed@amalesuadaid.org
+Sed.malesuada@Curae;Phasellusornare.com
+ligula.Aliquam@id.org
+Quisque@ipsum.edu
+a@Quisquepurus.com
+convallis.in.cursus@acturpisegestas.org
+ut@ipsum.com
+turpis@atarcuVestibulum.ca
+arcu@Aliquam.edu
+ridiculus.mus.Donec@enimnonnisi.com
+dui@penatibus.com
+erat.Vivamus@Nunc.com
+non.luctus.sit@ametanteVivamus.com
+purus@sempercursusInteger.ca
+rhoncus.Nullam.velit@ac.org
+elit@Fuscefermentum.ca
+vitae.posuere.at@enim.ca
+lobortis.mauris@mi.ca
+dui.augue.eu@tellusnon.ca
+eu.metus.In@laciniamattisInteger.ca
+in.hendrerit.consectetuer@nec.org
+nonummy.Fusce.fermentum@Vivamusmolestie.com
+Curabitur@tempusscelerisquelorem.edu
+fames.ac@massaVestibulum.ca
+penatibus.et@lacuspede.edu
+Praesent@eu.com
+Proin.mi.Aliquam@eget.ca
+in.felis@consequat.org
+tempor.diam@porttitorerosnec.org
+ut.dolor.dapibus@massaMaurisvestibulum.ca
+nunc.Quisque@Integermollis.ca
+dui.semper.et@sedconsequat.org
+quis.urna.Nunc@convallisin.ca
+non.bibendum@est.com
+euismod.mauris.eu@arcuCurabitur.org
+nibh@eratvel.org
+sit@metusvitae.com
+arcu.Curabitur@amagnaLorem.edu
+aliquet@luctusetultrices.com
+gravida.Praesent.eu@lobortisquispede.ca
+dolor@Donecdignissimmagna.edu
+fermentum.fermentum.arcu@cubiliaCurae;Donec.com
+ullamcorper@sitamet.edu
+erat@egestasa.ca
+In.faucibus.Morbi@cursus.org
+In@quamvelsapien.com
+ac.fermentum@aliquetProinvelit.edu
+eros@elitpharetra.edu
+eget.lacus.Mauris@necmollisvitae.ca
+sagittis@penatibusetmagnis.org
+dapibus.id.blandit@Integersemelit.edu
+Fusce.mollis@vulputateullamcorpermagna.org
+hendrerit@litoratorquent.ca
+orci.Ut.sagittis@non.com
+nunc@Sedeget.edu
+amet.ornare@maurissagittisplacerat.ca
+est@accumsaninterdum.com
+tristique.ac@ProinvelitSed.com
+pharetra@venenatislacusEtiam.ca
+lorem.ac.risus@elementumat.org
+conubia.nostra.per@egetnisi.com
+egestas.Aliquam@pharetraQuisqueac.org
+Nullam.enim.Sed@dictum.org
+vel.pede@litoratorquentper.edu
+odio.a@felisullamcorperviverra.edu
+Nulla.facilisi.Sed@nibhAliquam.com
+Curabitur.dictum.Phasellus@eleifendnunc.org
+nec@dolorsitamet.com
+eu.ultrices@lobortistellusjusto.org
+eu.eleifend@sollicitudinorci.com
+mi.fringilla@justofaucibuslectus.edu
+Duis@maurisSuspendisse.org
+porttitor.interdum@leoelementumsem.ca
+turpis.non@porttitorerosnec.ca
+sit.amet@Integerurna.com
+Phasellus@turpisnec.com
+cursus@ac.org
+sollicitudin@atpretiumaliquet.com
+posuere@elitAliquamauctor.com
+nulla.Cras.eu@acmetus.ca
+luctus.ipsum@Maecenasmi.org
+diam.Pellentesque.habitant@dolorFusce.org
+parturient.montes.nascetur@ligulaDonecluctus.com
+purus@dolorsit.org
+torquent.per.conubia@magnaatortor.com
+ut@maurisipsumporta.edu
+ornare.facilisis@dolorsit.edu
+justo.nec.ante@nostra.com
+Fusce.diam.nunc@montesnasceturridiculus.org
+lorem.eget@elitEtiamlaoreet.ca
+tincidunt.orci@luctus.com
+dictum.ultricies@DonecegestasAliquam.com
+et.ipsum.cursus@torquentperconubia.org
+non.lorem.vitae@mollisvitae.com
+congue.a.aliquet@enimmi.ca
+molestie@veliteusem.edu
+mauris.sit@quamdignissimpharetra.com
+egestas.a.dui@penatibusetmagnis.edu
+magna.tellus@dolorquamelementum.ca
+Duis.risus@elitafeugiat.edu
+vitae.diam@Inscelerisque.org
+at@nuncQuisqueornare.org
+mattis.semper.dui@ornareplaceratorci.edu
+Duis@vehicula.com
+Donec.consectetuer@lectusjustoeu.org
+mauris.id.sapien@ipsumSuspendisse.com
+sem.ut.cursus@lorem.ca
+a.purus.Duis@mollisduiin.com
+mollis.dui@Praesenteunulla.com
+orci@eu.org
+gravida.Aliquam@aptenttaciti.edu
+erat@ornareplaceratorci.ca
+fringilla@NullamenimSed.ca
+semper.egestas.urna@id.edu
+morbi.tristique@enimnectempus.edu
+justo.Praesent@parturientmontes.ca
+et@nislQuisquefringilla.edu
+sed@porttitor.edu
+eget.dictum.placerat@facilisisSuspendissecommodo.ca
+auctor.velit@dui.edu
+urna.Nullam@egestas.ca
+feugiat@dapibusid.com
+commodo@odio.edu
+risus.quis@idmagnaet.edu
+enim.gravida.sit@condimentumDonec.com
+rhoncus@risus.ca
+varius@magnisdis.edu
+porttitor@turpis.ca
+cursus.et@idlibero.edu
+sollicitudin.a.malesuada@arcu.org
+Praesent.luctus@vulputate.com
+vulputate.eu@dictumaugue.org
+elementum.lorem@turpisegestas.edu
+ac.urna@disparturient.org
+Fusce.aliquet@scelerisquesed.org
+habitant.morbi@liberoettristique.com
+ac@turpisNullaaliquet.edu
+Suspendisse@Inscelerisque.com
+nisl.sem.consequat@eleifend.edu
+neque.Nullam@dolor.ca
+odio.vel.est@turpisvitaepurus.com
+dis.parturient@velit.com
+sed.libero.Proin@orciconsectetuereuismod.ca
+Maecenas.mi.felis@Cumsociisnatoque.org
+pede@montesnasceturridiculus.ca
+ac@AeneanmassaInteger.ca
+quam.Pellentesque@egetmassa.edu
+vulputate.posuere.vulputate@auctorMauris.edu
+leo@lacusQuisqueimperdiet.org
+pede.blandit.congue@Suspendissesed.edu
+tempus@Maecenaslibero.com
+cursus@nec.com
+ipsum@Integer.ca
+massa@atpedeCras.org
+luctus@portaelit.org
+Donec@laciniamattis.edu
+aliquam.eu@atliberoMorbi.edu
+at@quamvel.edu
+orci.adipiscing.non@adipiscingenim.edu
+pede.Nunc@antelectus.ca
+dictum@idliberoDonec.com
+et.malesuada@nuncQuisqueornare.org
+pellentesque.a.facilisis@placeratorcilacus.com
+euismod.est.arcu@euodio.ca
+accumsan.sed@fermentumvel.ca
+nibh.enim@nequesedsem.ca
+Nunc.ac.sem@Duiscursus.org
+interdum.enim.non@atfringilla.edu
+vel@Suspendissesagittis.com
+Nunc.commodo.auctor@Donec.edu
+tortor@egestas.com
+accumsan@Curabitursedtortor.ca
+fringilla.cursus.purus@nonluctussit.com
+Maecenas@nonlacinia.edu
+auctor.velit@nequetellusimperdiet.com
+congue@Nullam.ca
+pellentesque@Fusce.ca
+placerat.augue.Sed@Curabiturvellectus.com
+Etiam.imperdiet@Pellentesque.edu
+dapibus.id@rhoncusid.edu
+ullamcorper.velit@duiquisaccumsan.org
+luctus@magnaPhasellus.edu
+magna@blanditat.ca
+mollis.vitae@posuere.ca
+ut@velarcu.edu
+Etiam.vestibulum@duiFusce.edu
+Proin.vel.nisl@acfacilisisfacilisis.ca
+eget.mollis@interdumNuncsollicitudin.com
+vitae.purus.gravida@aauctornon.org
+Donec.at.arcu@mauriserateget.ca
+cursus.Integer.mollis@dignissimlacusAliquam.org
+sit.amet.luctus@Utsagittis.ca
+egestas.rhoncus.Proin@temporarcu.ca
+non.egestas@cursusIntegermollis.edu
+vulputate@accumsan.edu
+magna.tellus.faucibus@risusDuisa.com
+Cras.dolor.dolor@penatibuset.ca
+nisi.Cum.sociis@felisDonectempor.ca
+ac.ipsum.Phasellus@eros.ca
+aliquet@imperdieteratnonummy.org
+elementum.lorem.ut@Donecfeugiat.org
+adipiscing.elit@nondapibus.ca
+Cras.sed.leo@rhoncusid.edu
+Donec.nibh@necdiam.org
+Phasellus.libero@elitfermentumrisus.edu
+mollis.lectus@urnajusto.org
+gravida@bibendumfermentum.com
+adipiscing@malesuadavel.ca
+arcu@neque.com
+vulputate@nibhPhasellus.com
+nulla@lectusante.com
+convallis.ante@auctor.ca
+nisl.Quisque.fringilla@lorem.edu
+dui.Cum@metusIn.com
+semper@dapibusrutrum.edu
+tristique@ridiculus.org
+mi.lacinia@diam.org
+dignissim.pharetra@non.edu
+libero@mollisvitae.ca
+ultricies.adipiscing.enim@Inmi.ca
+lorem.vehicula.et@Morbi.edu
+egestas.ligula@loremvehiculaet.edu
+odio.Nam@vitaerisusDuis.edu
+luctus.et@egestaslaciniaSed.ca
+mi.lacinia.mattis@est.edu
+Phasellus@nuncrisusvarius.com
+Vivamus.non.lorem@egetlacusMauris.com
+ut.eros.non@portaelita.edu
+Cras.eu.tellus@vel.edu
+posuere@purusMaecenas.ca
+orci@sitametdapibus.org
+dis.parturient.montes@duinectempus.ca
+neque@Suspendisse.ca
+Suspendisse.commodo@nuncsed.org
+Mauris.blandit@quam.ca
+neque.tellus@ultricies.edu
+purus@a.org
+tristique.neque.venenatis@velit.com
+tempor@eu.com
+nulla.vulputate.dui@urna.edu
+pede.et.risus@dolor.org
+mollis.dui@anteiaculis.edu
+arcu.Nunc.mauris@Aeneanegetmagna.ca
+consequat.dolor@sollicitudinadipiscingligula.edu
+augue.id.ante@tempusnon.org
+Phasellus.nulla@aliquamarcu.edu
+nunc.Quisque.ornare@incursuset.org
+purus@vitaediam.ca
+urna.Nunc@ornare.com
+risus@Phasellusdapibus.com
+consectetuer.adipiscing.elit@eleifendnec.org
+amet@urnaconvallis.ca
+Suspendisse.eleifend@felisullamcorper.com
+Duis.elementum@portaelita.edu
+orci.Ut.sagittis@atlacusQuisque.ca
+a@a.edu
+interdum.Sed@lectus.org
+a.enim.Suspendisse@auctor.ca
+gravida@faucibus.com
+mollis.Integer@Phasellusinfelis.ca
+nunc.ac.mattis@lectuspede.ca
+dictum.eu@Nullam.ca
+Nunc@Aliquamerat.org
+sem@diamloremauctor.com
+lectus.quis@magnaa.edu
+Donec.est@malesuada.com
+Vivamus@vulputate.edu
+Quisque@Proinnisl.edu
+dui.quis@eratnonummyultricies.ca
+nulla.magna@porttitor.edu
+a.nunc@aliquamiaculis.com
+nec.luctus.felis@sedsapien.ca
+Curabitur.dictum.Phasellus@urna.org
+sed.leo@utdolor.org
+lectus.pede.ultrices@eu.edu
+ligula.Aliquam.erat@acfermentumvel.org
+Integer@scelerisqueneque.com
+placerat.orci.lacus@faucibusidlibero.org
+Nullam.suscipit@ipsumCurabiturconsequat.ca
+Mauris.eu@ultrices.com
+eget.metus.In@consectetueradipiscing.ca
+ac.fermentum.vel@pretium.ca
+accumsan.neque.et@elementum.ca
+eu.tellus@liberonec.edu
+dolor@pedeNuncsed.ca
+vestibulum.lorem@et.ca
+pretium.aliquet@NullafacilisiSed.org
+feugiat.non.lobortis@dictumcursus.org
+a.enim@Sedpharetra.org
+sem.eget@placerat.org
+dictum@veliteusem.ca
+eget.volutpat@lectussit.edu
+semper.dui@vulputatemauris.org
+vestibulum@malesuadavel.org
+euismod@mitemporlorem.edu
+Vestibulum.ante@Crassed.edu
+Proin.sed@nequeNullamut.com
+lobortis.ultrices.Vivamus@sedliberoProin.org
+nonummy.ipsum.non@Nulla.org
+dis.parturient.montes@tellus.org
+nec.metus@Phasellusdolorelit.org
+dictum@vestibulumloremsit.edu
+Integer.aliquam.adipiscing@purusmaurisa.edu
+ac@sodaleseliterat.com
+nisl.Quisque@quisaccumsan.ca
+risus.quis.diam@arcuet.org
+quis@pulvinararcu.edu
+metus@elitCurabitursed.ca
+mollis@sagittisaugueeu.org
+quis.pede.Suspendisse@pedenec.org
+Ut.tincidunt.vehicula@arcu.com
+eu@sodaleseliterat.edu
+sollicitudin.commodo@porttitorvulputateposuere.ca
+habitant.morbi.tristique@lacus.edu
+lacus.Cras.interdum@nequeMorbiquis.ca
+Ut.tincidunt@turpisegestasFusce.com
+mauris.erat@sed.ca
+interdum.Nunc.sollicitudin@molestiearcuSed.org
+adipiscing.elit.Aliquam@quamdignissimpharetra.ca
+penatibus.et@tortordictumeu.com
+a@ullamcorperDuis.com
+orci@adipiscingfringillaporttitor.org
+Suspendisse@vulputatemauris.edu
+Duis@Vivamus.ca
+pede.Nunc.sed@sitametdapibus.ca
+Phasellus.at.augue@vulputatedui.ca
+at.fringilla.purus@facilisiseget.ca
+montes@convallisconvallis.com
+In@nullaIntincidunt.ca
+nec@Vivamus.edu
+hendrerit.a.arcu@a.com
+augue.malesuada.malesuada@viverraMaecenas.com
+Sed.id@vitae.org
+ac.arcu.Nunc@diam.com
+fringilla.ornare@pellentesquea.com
+ut.nulla@euultrices.org
+aliquam.enim@turpisIn.com
+quam@semmagnanec.edu
+Donec@id.org
+turpis.Aliquam.adipiscing@Integersemelit.org
+sit@neque.ca
+Integer.mollis.Integer@ultricesiaculis.org
+at.pretium.aliquet@lorem.com
+ridiculus@ut.edu
+Morbi@pharetraQuisque.org
+turpis.Aliquam.adipiscing@mattisIntegereu.edu
+nunc.Quisque@nasceturridiculusmus.org
+Vivamus.nisi@ametconsectetueradipiscing.com
+pede@sociis.com
+parturient.montes@facilisisnonbibendum.ca
+enim@magnis.ca
+Cum.sociis@quam.com
+congue@eratneque.com
+faucibus.ut.nulla@Aeneanegetmagna.com
+tincidunt@ipsumDonec.edu
+luctus.et.ultrices@utipsumac.edu
+auctor.velit.eget@fermentumconvallis.org
+neque.Nullam@ut.org
+Donec.non.justo@nisiAenean.com
+mauris.aliquam.eu@ullamcorpervelitin.org
+dolor.nonummy@luctuset.com
+Donec.porttitor.tellus@Donecluctusaliquet.com
+sodales@Donecluctus.edu
+risus@Nunclectus.org
+eget.metus@blandit.edu
+metus.facilisis.lorem@sit.com
+nonummy.ac.feugiat@sitamet.org
+neque.Nullam.nisl@Curabitur.edu
+egestas.Sed@tinciduntpede.org
+libero.mauris.aliquam@estacmattis.com
+cursus.et@Donecest.org
+tincidunt.neque@estNunc.edu
+id.ante.Nunc@IntegerurnaVivamus.edu
+mollis.Phasellus@adipiscingenim.org
+Quisque.fringilla@vehiculaPellentesque.org
+mauris@nonummyac.org
+nisl.Maecenas.malesuada@quistristique.edu
+lectus@acnulla.org
+et.magnis@porttitor.edu
+enim@vitae.ca
+neque.Nullam.nisl@ligulaNullam.org
+gravida@anteblanditviverra.com
+mauris.id@porttitorvulputateposuere.edu
+gravida.Praesent.eu@felisorciadipiscing.ca
+non.leo@laciniaat.com
+ipsum.Curabitur@acnulla.org
+Proin.sed@pede.ca
+sit.amet.consectetuer@dolorFusce.org
+interdum.Nunc.sollicitudin@elit.ca
+tellus@ut.edu
+fermentum.metus.Aenean@sit.com
+metus.In@tincidunt.ca
+hendrerit.neque.In@Duisvolutpat.com
+Duis@egetipsum.edu
+ultrices@tincidunt.org
+velit.in.aliquet@nunc.ca
+augue.eu@duiaugue.com
+congue.a.aliquet@metuseu.edu
+erat@Namligulaelit.org
+volutpat@tempor.org
+amet.ultricies@Nullam.edu
+inceptos.hymenaeos.Mauris@Naminterdumenim.edu
+dictum.augue@Aliquam.edu
+egestas.a@diamProin.edu
+imperdiet.nec@atvelitCras.org
+urna.Vivamus.molestie@Loremipsum.ca
+molestie@diamlorem.ca
+sem.Nulla.interdum@odio.com
+odio@loremloremluctus.com
+ac@viverraMaecenas.com
+Nunc.ac@Namporttitor.edu
+Integer.tincidunt.aliquam@auctornon.edu
+Vivamus.euismod@Donecnibh.org
+dictum@egestasrhoncusProin.edu
+purus@aliquamadipiscing.org
+sapien.gravida@massa.com
+quis.accumsan@dui.ca
+mollis.lectus@Loremipsumdolor.edu
+lobortis@convallisest.org
+penatibus@elitdictum.ca
+ullamcorper.viverra@Maecenasmi.com
+suscipit@porttitorscelerisque.org
+scelerisque.mollis.Phasellus@Pellentesque.edu
+Proin.vel.nisl@sedsemegestas.org
+Proin@velit.com
+sed.hendrerit@justo.edu
+id.blandit.at@massaQuisque.com
+placerat.velit.Quisque@taciti.ca
+convallis.dolor.Quisque@nuncnullavulputate.edu
+montes.nascetur.ridiculus@atpede.org
+Suspendisse@aliquetsem.org
+Vestibulum.ante.ipsum@Sedcongue.org
+magna.nec.quam@dictum.ca
+ante.Vivamus@viverraDonec.com
+montes@maurisInteger.edu
+lorem.Donec@dolorDonecfringilla.org
+ad@quisurna.com
+nulla@erat.edu
+interdum.ligula.eu@pharetrautpharetra.ca
+et.rutrum.non@utmolestiein.edu
+ligula.consectetuer@Etiamligula.com
diff --git a/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/filter.java b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/filter.java
new file mode 100644
index 00000000..6fbd604d
--- /dev/null
+++ b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/filter.java
@@ -0,0 +1,47 @@
+import java.io.*;
+import java.util.*;
+
+public class filter
+{
+ public static void main(String[] args)
+ {
+
+ ArrayList wordpool = new ArrayList();
+ String line;
+ int cnt=0;
+
+ try {
+ BufferedReader br = new BufferedReader(new FileReader(args[0]));
+ BufferedWriter bw = new BufferedWriter(new FileWriter(args[1]));
+
+ while((line = br.readLine()) != null) {
+
+
+ StringTokenizer stk = new StringTokenizer(line);
+
+ while(stk.hasMoreTokens())
+ {
+ String word = stk.nextToken();
+
+ // if word is not in wordpool
+ if(!wordpool.contains(word))
+ {
+ wordpool.add(word);
+ bw.write(word);
+ cnt++;
+ bw.newLine();
+ }
+ }
+ }
+ br.close();
+ bw.close();
+ }catch(IOException e) {
+ System.out.println(e);
+ }
+ System.out.println("Number of new Words = " + cnt);
+ }
+}
+
+
+
+
diff --git a/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/gen.c b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/gen.c
new file mode 100644
index 00000000..0b21fbae
--- /dev/null
+++ b/Robust/src/Benchmarks/Prefetch/ManualPrefetch/SpamFilter/emails/gen.c
@@ -0,0 +1,197 @@
+#include
+#include
+#include
+#include
+
+#define WORD_FILE "wordList1"
+#define URL_FILE "URLList"
+#define ACCOUNT_FILE "accountList"
+#define FILE_NAME "email"
+#define NUM_EMAIL 500
+
+char** readList(char* fileName,int* num);
+void generateEmails(int,char**,int,char**,int,char**,int,char*);
+void freeList(char**,int);
+void writeString(FILE* newFile,char* prefix,char** list,int size_list,int* counter);
+void shuffle(char** list,int size_int);
+
+int main()
+{
+ int num_email = NUM_EMAIL; // how many emails do you need?
+ char** wordList;
+ char** urlList;
+ char** accountList;
+ int word_num;
+ int url_num;
+ int account_num;
+
+ wordList = readList(WORD_FILE,&word_num);
+ urlList = readList(URL_FILE,&url_num);
+ accountList = readList(ACCOUNT_FILE,&account_num);
+
+ generateEmails(NUM_EMAIL,wordList,word_num,urlList,url_num,accountList,account_num,FILE_NAME);
+
+ freeList(wordList,word_num);
+ freeList(urlList,url_num);
+ freeList(accountList,account_num);
+
+ return 0;
+}
+
+void freeList(char** list,int num)
+{
+ int i;
+
+ for(i=0;i