Index: pom.xml
===================================================================
--- pom.xml	(revision 1627562)
+++ pom.xml	(working copy)
@@ -54,7 +54,8 @@
     <module>tika-bundle</module>
     <module>tika-server</module>
     <module>tika-translate</module>
-    <module>tika-example</module>
+    <module>tika-batch</module>
+ <!--  coming soon  <module>tika-eval</module> -->
   </modules>
 
   <profiles>
Index: tika-serialization/pom.xml
===================================================================
--- tika-serialization/pom.xml	(revision 1627562)
+++ tika-serialization/pom.xml	(working copy)
@@ -84,7 +84,7 @@
     <url>http://www.apache.org</url>
   </organization>
   <scm>
-    <url>http://svn.apache.org/viewvc/tika/trunk/tika-app</url>
+    <url>http://svn.apache.org/viewvc/tika/trunk/tika-serialization</url>
     <connection>scm:svn:http://svn.apache.org/repos/asf/tika/trunk/tika-serialization</connection>
     <developerConnection>scm:svn:https://svn.apache.org/repos/asf/tika/trunk/tika-serialization</developerConnection>
   </scm>
Index: tika-parsers/src/test/java/org/apache/tika/TikaTest.java
===================================================================
--- tika-parsers/src/test/java/org/apache/tika/TikaTest.java	(revision 1627562)
+++ tika-parsers/src/test/java/org/apache/tika/TikaTest.java	(working copy)
@@ -30,6 +30,7 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URISyntaxException;
@@ -81,6 +82,11 @@
        return stream;
    }
 
+   public static void assertContains(File f, String encoding, String needle) throws Exception {
+       String haystack = getStringFromFile(f, encoding);
+       assertContains(needle, haystack);
+   }
+
     public static void assertContains(String needle, String haystack) {
        assertTrue(needle + " not found in:\n" + haystack, haystack.contains(needle));
     }
@@ -143,6 +149,12 @@
         return getText(is, parser, new ParseContext(), new Metadata());
     }
 
+    public static String getStringFromFile(File targFile, String encoding) throws Exception {
+        InputStream is = new FileInputStream(targFile);
+        String string = IOUtils.toString(is, encoding);
+        IOUtils.closeQuietly(is);
+        return string;
+    }
     /**
      * Keeps track of media types and file names recursively.
      *
Index: tika-batch/target/surefire-reports/org.apache.tika.batch.fs.BatchDriverTest.txt
===================================================================
--- tika-batch/target/surefire-reports/org.apache.tika.batch.fs.BatchDriverTest.txt	(revision 0)
+++ tika-batch/target/surefire-reports/org.apache.tika.batch.fs.BatchDriverTest.txt	(revision 0)
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: org.apache.tika.batch.fs.BatchDriverTest
+-------------------------------------------------------------------------------
+Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 38.059 sec
Index: tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.BatchProcessTest.xml
===================================================================
--- tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.BatchProcessTest.xml	(revision 0)
+++ tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.BatchProcessTest.xml	(revision 0)
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite failures="0" time="28.967" errors="0" skipped="0" tests="5" name="org.apache.tika.batch.fs.BatchProcessTest">
+  <properties>
+    <property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/>
+    <property name="sun.boot.library.path" value="/usr/java/jdk1.7.0_40/jre/lib/amd64"/>
+    <property name="java.vm.version" value="24.0-b56"/>
+    <property name="java.vm.vendor" value="Oracle Corporation"/>
+    <property name="java.vendor.url" value="http://java.oracle.com/"/>
+    <property name="path.separator" value=":"/>
+    <property name="java.vm.name" value="Java HotSpot(TM) 64-Bit Server VM"/>
+    <property name="file.encoding.pkg" value="sun.io"/>
+    <property name="user.country" value="US"/>
+    <property name="sun.java.launcher" value="SUN_STANDARD"/>
+    <property name="sun.os.patch.level" value="unknown"/>
+    <property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
+    <property name="user.dir" value="/rhapsode-data/svnwork/tika-trunk"/>
+    <property name="java.runtime.version" value="1.7.0_40-b43"/>
+    <property name="java.awt.graphicsenv" value="sun.awt.X11GraphicsEnvironment"/>
+    <property name="java.endorsed.dirs" value="/usr/java/jdk1.7.0_40/jre/lib/endorsed"/>
+    <property name="os.arch" value="amd64"/>
+    <property name="java.io.tmpdir" value="/tmp"/>
+    <property name="line.separator" value="
+"/>
+    <property name="java.vm.specification.vendor" value="Oracle Corporation"/>
+    <property name="os.name" value="Linux"/>
+    <property name="classworlds.conf" value="/home/tallison/maven2/apache-maven-2.2.1/bin/m2.conf"/>
+    <property name="sun.jnu.encoding" value="UTF-8"/>
+    <property name="java.library.path" value="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib"/>
+    <property name="http.proxyPort" value="80"/>
+    <property name="java.specification.name" value="Java Platform API Specification"/>
+    <property name="java.class.version" value="51.0"/>
+    <property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
+    <property name="os.version" value="2.6.32-431.5.1.el6.x86_64"/>
+    <property name="user.home" value="/home/tallison"/>
+    <property name="user.timezone" value="America/New_York"/>
+    <property name="java.awt.printerjob" value="sun.print.PSPrinterJob"/>
+    <property name="file.encoding" value="UTF-8"/>
+    <property name="java.specification.version" value="1.7"/>
+    <property name="user.name" value="tallison"/>
+    <property name="java.class.path" value="/home/tallison/maven2/apache-maven-2.2.1/boot/classworlds-1.1.jar"/>
+    <property name="java.vm.specification.version" value="1.7"/>
+    <property name="sun.arch.data.model" value="64"/>
+    <property name="java.home" value="/usr/java/jdk1.7.0_40/jre"/>
+    <property name="sun.java.command" value="org.codehaus.classworlds.Launcher &quot;clean&quot; &quot;install&quot;"/>
+    <property name="java.specification.vendor" value="Oracle Corporation"/>
+    <property name="user.language" value="en"/>
+    <property name="awt.toolkit" value="sun.awt.X11.XToolkit"/>
+    <property name="java.vm.info" value="mixed mode"/>
+    <property name="java.version" value="1.7.0_40"/>
+    <property name="java.ext.dirs" value="/usr/java/jdk1.7.0_40/jre/lib/ext:/usr/java/packages/lib/ext"/>
+    <property name="securerandom.source" value="file:/dev/./urandom"/>
+    <property name="sun.boot.class.path" value="/usr/java/jdk1.7.0_40/jre/lib/resources.jar:/usr/java/jdk1.7.0_40/jre/lib/rt.jar:/usr/java/jdk1.7.0_40/jre/lib/sunrsasign.jar:/usr/java/jdk1.7.0_40/jre/lib/jsse.jar:/usr/java/jdk1.7.0_40/jre/lib/jce.jar:/usr/java/jdk1.7.0_40/jre/lib/charsets.jar:/usr/java/jdk1.7.0_40/jre/lib/jfr.jar:/usr/java/jdk1.7.0_40/jre/classes"/>
+    <property name="http.proxyHost" value="gatekeeper-w.mitre.org"/>
+    <property name="java.vendor" value="Oracle Corporation"/>
+    <property name="maven.home" value="/home/tallison/maven2/apache-maven-2.2.1"/>
+    <property name="file.separator" value="/"/>
+    <property name="java.vendor.url.bug" value="http://bugreport.sun.com/bugreport/"/>
+    <property name="sun.cpu.endian" value="little"/>
+    <property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
+    <property name="sun.cpu.isalist" value=""/>
+  </properties>
+  <testcase time="13.587" classname="org.apache.tika.batch.fs.BatchProcessTest" name="allHeavyHangsTestWithStarvedCrawler"/>
+  <testcase time="4.509" classname="org.apache.tika.batch.fs.BatchProcessTest" name="oneHeavyHangTest"/>
+  <testcase time="4.539" classname="org.apache.tika.batch.fs.BatchProcessTest" name="allHeavyHangsTest"/>
+  <testcase time="1.704" classname="org.apache.tika.batch.fs.BatchProcessTest" name="outOfMemory"/>
+  <testcase time="4.628" classname="org.apache.tika.batch.fs.BatchProcessTest" name="allHeavyHangsTestWithCrazyNumberConsumersTest"/>
+</testsuite>
\ No newline at end of file
Index: tika-batch/target/surefire-reports/org.apache.tika.batch.fs.BatchProcessTest.txt
===================================================================
--- tika-batch/target/surefire-reports/org.apache.tika.batch.fs.BatchProcessTest.txt	(revision 0)
+++ tika-batch/target/surefire-reports/org.apache.tika.batch.fs.BatchProcessTest.txt	(revision 0)
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: org.apache.tika.batch.fs.BatchProcessTest
+-------------------------------------------------------------------------------
+Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 28.97 sec
Index: tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.HandlerBuilderTest.xml
===================================================================
--- tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.HandlerBuilderTest.xml	(revision 0)
+++ tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.HandlerBuilderTest.xml	(revision 0)
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite failures="0" time="0.23" errors="0" skipped="0" tests="5" name="org.apache.tika.batch.fs.HandlerBuilderTest">
+  <properties>
+    <property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/>
+    <property name="sun.boot.library.path" value="/usr/java/jdk1.7.0_40/jre/lib/amd64"/>
+    <property name="java.vm.version" value="24.0-b56"/>
+    <property name="java.vm.vendor" value="Oracle Corporation"/>
+    <property name="java.vendor.url" value="http://java.oracle.com/"/>
+    <property name="path.separator" value=":"/>
+    <property name="java.vm.name" value="Java HotSpot(TM) 64-Bit Server VM"/>
+    <property name="file.encoding.pkg" value="sun.io"/>
+    <property name="user.country" value="US"/>
+    <property name="sun.java.launcher" value="SUN_STANDARD"/>
+    <property name="sun.os.patch.level" value="unknown"/>
+    <property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
+    <property name="user.dir" value="/rhapsode-data/svnwork/tika-trunk"/>
+    <property name="java.runtime.version" value="1.7.0_40-b43"/>
+    <property name="java.awt.graphicsenv" value="sun.awt.X11GraphicsEnvironment"/>
+    <property name="java.endorsed.dirs" value="/usr/java/jdk1.7.0_40/jre/lib/endorsed"/>
+    <property name="os.arch" value="amd64"/>
+    <property name="java.io.tmpdir" value="/tmp"/>
+    <property name="line.separator" value="
+"/>
+    <property name="java.vm.specification.vendor" value="Oracle Corporation"/>
+    <property name="os.name" value="Linux"/>
+    <property name="classworlds.conf" value="/home/tallison/maven2/apache-maven-2.2.1/bin/m2.conf"/>
+    <property name="sun.jnu.encoding" value="UTF-8"/>
+    <property name="java.library.path" value="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib"/>
+    <property name="http.proxyPort" value="80"/>
+    <property name="java.specification.name" value="Java Platform API Specification"/>
+    <property name="java.class.version" value="51.0"/>
+    <property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
+    <property name="os.version" value="2.6.32-431.5.1.el6.x86_64"/>
+    <property name="user.home" value="/home/tallison"/>
+    <property name="user.timezone" value="America/New_York"/>
+    <property name="java.awt.printerjob" value="sun.print.PSPrinterJob"/>
+    <property name="file.encoding" value="UTF-8"/>
+    <property name="java.specification.version" value="1.7"/>
+    <property name="user.name" value="tallison"/>
+    <property name="java.class.path" value="/home/tallison/maven2/apache-maven-2.2.1/boot/classworlds-1.1.jar"/>
+    <property name="java.vm.specification.version" value="1.7"/>
+    <property name="sun.arch.data.model" value="64"/>
+    <property name="java.home" value="/usr/java/jdk1.7.0_40/jre"/>
+    <property name="sun.java.command" value="org.codehaus.classworlds.Launcher &quot;clean&quot; &quot;install&quot;"/>
+    <property name="java.specification.vendor" value="Oracle Corporation"/>
+    <property name="user.language" value="en"/>
+    <property name="awt.toolkit" value="sun.awt.X11.XToolkit"/>
+    <property name="java.vm.info" value="mixed mode"/>
+    <property name="java.version" value="1.7.0_40"/>
+    <property name="java.ext.dirs" value="/usr/java/jdk1.7.0_40/jre/lib/ext:/usr/java/packages/lib/ext"/>
+    <property name="securerandom.source" value="file:/dev/./urandom"/>
+    <property name="sun.boot.class.path" value="/usr/java/jdk1.7.0_40/jre/lib/resources.jar:/usr/java/jdk1.7.0_40/jre/lib/rt.jar:/usr/java/jdk1.7.0_40/jre/lib/sunrsasign.jar:/usr/java/jdk1.7.0_40/jre/lib/jsse.jar:/usr/java/jdk1.7.0_40/jre/lib/jce.jar:/usr/java/jdk1.7.0_40/jre/lib/charsets.jar:/usr/java/jdk1.7.0_40/jre/lib/jfr.jar:/usr/java/jdk1.7.0_40/jre/classes"/>
+    <property name="http.proxyHost" value="gatekeeper-w.mitre.org"/>
+    <property name="java.vendor" value="Oracle Corporation"/>
+    <property name="maven.home" value="/home/tallison/maven2/apache-maven-2.2.1"/>
+    <property name="file.separator" value="/"/>
+    <property name="java.vendor.url.bug" value="http://bugreport.sun.com/bugreport/"/>
+    <property name="sun.cpu.endian" value="little"/>
+    <property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
+    <property name="sun.cpu.isalist" value=""/>
+  </properties>
+  <testcase time="0.03" classname="org.apache.tika.batch.fs.HandlerBuilderTest" name="testXML"/>
+  <testcase time="0.029" classname="org.apache.tika.batch.fs.HandlerBuilderTest" name="testXMLWithWriteLimit"/>
+  <testcase time="0.03" classname="org.apache.tika.batch.fs.HandlerBuilderTest" name="testHTML"/>
+  <testcase time="0.027" classname="org.apache.tika.batch.fs.HandlerBuilderTest" name="testText"/>
+  <testcase time="0.114" classname="org.apache.tika.batch.fs.HandlerBuilderTest" name="testRecursiveParserWrapper"/>
+</testsuite>
\ No newline at end of file
Index: tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.OutputStreamFactoryTest.xml
===================================================================
--- tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.OutputStreamFactoryTest.xml	(revision 0)
+++ tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.OutputStreamFactoryTest.xml	(revision 0)
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite failures="0" time="1.07" errors="0" skipped="0" tests="3" name="org.apache.tika.batch.fs.OutputStreamFactoryTest">
+  <properties>
+    <property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/>
+    <property name="sun.boot.library.path" value="/usr/java/jdk1.7.0_40/jre/lib/amd64"/>
+    <property name="java.vm.version" value="24.0-b56"/>
+    <property name="java.vm.vendor" value="Oracle Corporation"/>
+    <property name="java.vendor.url" value="http://java.oracle.com/"/>
+    <property name="path.separator" value=":"/>
+    <property name="java.vm.name" value="Java HotSpot(TM) 64-Bit Server VM"/>
+    <property name="file.encoding.pkg" value="sun.io"/>
+    <property name="user.country" value="US"/>
+    <property name="sun.java.launcher" value="SUN_STANDARD"/>
+    <property name="sun.os.patch.level" value="unknown"/>
+    <property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
+    <property name="user.dir" value="/rhapsode-data/svnwork/tika-trunk"/>
+    <property name="java.runtime.version" value="1.7.0_40-b43"/>
+    <property name="java.awt.graphicsenv" value="sun.awt.X11GraphicsEnvironment"/>
+    <property name="java.endorsed.dirs" value="/usr/java/jdk1.7.0_40/jre/lib/endorsed"/>
+    <property name="os.arch" value="amd64"/>
+    <property name="java.io.tmpdir" value="/tmp"/>
+    <property name="line.separator" value="
+"/>
+    <property name="java.vm.specification.vendor" value="Oracle Corporation"/>
+    <property name="os.name" value="Linux"/>
+    <property name="classworlds.conf" value="/home/tallison/maven2/apache-maven-2.2.1/bin/m2.conf"/>
+    <property name="sun.jnu.encoding" value="UTF-8"/>
+    <property name="java.library.path" value="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib"/>
+    <property name="http.proxyPort" value="80"/>
+    <property name="java.specification.name" value="Java Platform API Specification"/>
+    <property name="java.class.version" value="51.0"/>
+    <property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
+    <property name="os.version" value="2.6.32-431.5.1.el6.x86_64"/>
+    <property name="user.home" value="/home/tallison"/>
+    <property name="user.timezone" value="America/New_York"/>
+    <property name="java.awt.printerjob" value="sun.print.PSPrinterJob"/>
+    <property name="file.encoding" value="UTF-8"/>
+    <property name="java.specification.version" value="1.7"/>
+    <property name="user.name" value="tallison"/>
+    <property name="java.class.path" value="/home/tallison/maven2/apache-maven-2.2.1/boot/classworlds-1.1.jar"/>
+    <property name="java.vm.specification.version" value="1.7"/>
+    <property name="sun.arch.data.model" value="64"/>
+    <property name="java.home" value="/usr/java/jdk1.7.0_40/jre"/>
+    <property name="sun.java.command" value="org.codehaus.classworlds.Launcher &quot;clean&quot; &quot;install&quot;"/>
+    <property name="java.specification.vendor" value="Oracle Corporation"/>
+    <property name="user.language" value="en"/>
+    <property name="awt.toolkit" value="sun.awt.X11.XToolkit"/>
+    <property name="java.vm.info" value="mixed mode"/>
+    <property name="java.version" value="1.7.0_40"/>
+    <property name="java.ext.dirs" value="/usr/java/jdk1.7.0_40/jre/lib/ext:/usr/java/packages/lib/ext"/>
+    <property name="securerandom.source" value="file:/dev/./urandom"/>
+    <property name="sun.boot.class.path" value="/usr/java/jdk1.7.0_40/jre/lib/resources.jar:/usr/java/jdk1.7.0_40/jre/lib/rt.jar:/usr/java/jdk1.7.0_40/jre/lib/sunrsasign.jar:/usr/java/jdk1.7.0_40/jre/lib/jsse.jar:/usr/java/jdk1.7.0_40/jre/lib/jce.jar:/usr/java/jdk1.7.0_40/jre/lib/charsets.jar:/usr/java/jdk1.7.0_40/jre/lib/jfr.jar:/usr/java/jdk1.7.0_40/jre/classes"/>
+    <property name="http.proxyHost" value="gatekeeper-w.mitre.org"/>
+    <property name="java.vendor" value="Oracle Corporation"/>
+    <property name="maven.home" value="/home/tallison/maven2/apache-maven-2.2.1"/>
+    <property name="file.separator" value="/"/>
+    <property name="java.vendor.url.bug" value="http://bugreport.sun.com/bugreport/"/>
+    <property name="sun.cpu.endian" value="little"/>
+    <property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
+    <property name="sun.cpu.isalist" value=""/>
+  </properties>
+  <testcase time="0.984" classname="org.apache.tika.batch.fs.OutputStreamFactoryTest" name="testSkip"/>
+  <testcase time="0.022" classname="org.apache.tika.batch.fs.OutputStreamFactoryTest" name="testIllegalState"/>
+  <testcase time="0.064" classname="org.apache.tika.batch.fs.OutputStreamFactoryTest" name="testRename"/>
+</testsuite>
\ No newline at end of file
Index: tika-batch/target/surefire-reports/org.apache.tika.batch.fs.OutputStreamFactoryTest.txt
===================================================================
--- tika-batch/target/surefire-reports/org.apache.tika.batch.fs.OutputStreamFactoryTest.txt	(revision 0)
+++ tika-batch/target/surefire-reports/org.apache.tika.batch.fs.OutputStreamFactoryTest.txt	(revision 0)
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: org.apache.tika.batch.fs.OutputStreamFactoryTest
+-------------------------------------------------------------------------------
+Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.111 sec
Index: tika-batch/target/surefire-reports/org.apache.tika.batch.fs.HandlerBuilderTest.txt
===================================================================
--- tika-batch/target/surefire-reports/org.apache.tika.batch.fs.HandlerBuilderTest.txt	(revision 0)
+++ tika-batch/target/surefire-reports/org.apache.tika.batch.fs.HandlerBuilderTest.txt	(revision 0)
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: org.apache.tika.batch.fs.HandlerBuilderTest
+-------------------------------------------------------------------------------
+Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.234 sec
Index: tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.strawman.StrawmanTest.xml
===================================================================
--- tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.strawman.StrawmanTest.xml	(revision 0)
+++ tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.strawman.StrawmanTest.xml	(revision 0)
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite failures="0" time="0.002" errors="0" skipped="0" tests="1" name="org.apache.tika.batch.fs.strawman.StrawmanTest">
+  <properties>
+    <property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/>
+    <property name="sun.boot.library.path" value="/usr/java/jdk1.7.0_40/jre/lib/amd64"/>
+    <property name="java.vm.version" value="24.0-b56"/>
+    <property name="java.vm.vendor" value="Oracle Corporation"/>
+    <property name="java.vendor.url" value="http://java.oracle.com/"/>
+    <property name="path.separator" value=":"/>
+    <property name="java.vm.name" value="Java HotSpot(TM) 64-Bit Server VM"/>
+    <property name="file.encoding.pkg" value="sun.io"/>
+    <property name="user.country" value="US"/>
+    <property name="sun.java.launcher" value="SUN_STANDARD"/>
+    <property name="sun.os.patch.level" value="unknown"/>
+    <property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
+    <property name="user.dir" value="/rhapsode-data/svnwork/tika-trunk"/>
+    <property name="java.runtime.version" value="1.7.0_40-b43"/>
+    <property name="java.awt.graphicsenv" value="sun.awt.X11GraphicsEnvironment"/>
+    <property name="java.endorsed.dirs" value="/usr/java/jdk1.7.0_40/jre/lib/endorsed"/>
+    <property name="os.arch" value="amd64"/>
+    <property name="java.io.tmpdir" value="/tmp"/>
+    <property name="line.separator" value="
+"/>
+    <property name="java.vm.specification.vendor" value="Oracle Corporation"/>
+    <property name="os.name" value="Linux"/>
+    <property name="classworlds.conf" value="/home/tallison/maven2/apache-maven-2.2.1/bin/m2.conf"/>
+    <property name="sun.jnu.encoding" value="UTF-8"/>
+    <property name="java.library.path" value="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib"/>
+    <property name="http.proxyPort" value="80"/>
+    <property name="java.specification.name" value="Java Platform API Specification"/>
+    <property name="java.class.version" value="51.0"/>
+    <property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
+    <property name="os.version" value="2.6.32-431.5.1.el6.x86_64"/>
+    <property name="user.home" value="/home/tallison"/>
+    <property name="user.timezone" value="America/New_York"/>
+    <property name="java.awt.printerjob" value="sun.print.PSPrinterJob"/>
+    <property name="file.encoding" value="UTF-8"/>
+    <property name="java.specification.version" value="1.7"/>
+    <property name="user.name" value="tallison"/>
+    <property name="java.class.path" value="/home/tallison/maven2/apache-maven-2.2.1/boot/classworlds-1.1.jar"/>
+    <property name="java.vm.specification.version" value="1.7"/>
+    <property name="sun.arch.data.model" value="64"/>
+    <property name="java.home" value="/usr/java/jdk1.7.0_40/jre"/>
+    <property name="sun.java.command" value="org.codehaus.classworlds.Launcher &quot;clean&quot; &quot;install&quot;"/>
+    <property name="java.specification.vendor" value="Oracle Corporation"/>
+    <property name="user.language" value="en"/>
+    <property name="awt.toolkit" value="sun.awt.X11.XToolkit"/>
+    <property name="java.vm.info" value="mixed mode"/>
+    <property name="java.version" value="1.7.0_40"/>
+    <property name="java.ext.dirs" value="/usr/java/jdk1.7.0_40/jre/lib/ext:/usr/java/packages/lib/ext"/>
+    <property name="securerandom.source" value="file:/dev/./urandom"/>
+    <property name="sun.boot.class.path" value="/usr/java/jdk1.7.0_40/jre/lib/resources.jar:/usr/java/jdk1.7.0_40/jre/lib/rt.jar:/usr/java/jdk1.7.0_40/jre/lib/sunrsasign.jar:/usr/java/jdk1.7.0_40/jre/lib/jsse.jar:/usr/java/jdk1.7.0_40/jre/lib/jce.jar:/usr/java/jdk1.7.0_40/jre/lib/charsets.jar:/usr/java/jdk1.7.0_40/jre/lib/jfr.jar:/usr/java/jdk1.7.0_40/jre/classes"/>
+    <property name="http.proxyHost" value="gatekeeper-w.mitre.org"/>
+    <property name="java.vendor" value="Oracle Corporation"/>
+    <property name="maven.home" value="/home/tallison/maven2/apache-maven-2.2.1"/>
+    <property name="file.separator" value="/"/>
+    <property name="java.vendor.url.bug" value="http://bugreport.sun.com/bugreport/"/>
+    <property name="sun.cpu.endian" value="little"/>
+    <property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
+    <property name="sun.cpu.isalist" value=""/>
+  </properties>
+  <testcase time="0.002" classname="org.apache.tika.batch.fs.strawman.StrawmanTest" name="basicTest"/>
+</testsuite>
\ No newline at end of file
Index: tika-batch/target/surefire-reports/org.apache.tika.batch.fs.strawman.StrawmanTest.txt
===================================================================
--- tika-batch/target/surefire-reports/org.apache.tika.batch.fs.strawman.StrawmanTest.txt	(revision 0)
+++ tika-batch/target/surefire-reports/org.apache.tika.batch.fs.strawman.StrawmanTest.txt	(revision 0)
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: org.apache.tika.batch.fs.strawman.StrawmanTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.068 sec
Index: tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.BatchDriverTest.xml
===================================================================
--- tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.BatchDriverTest.xml	(revision 0)
+++ tika-batch/target/surefire-reports/TEST-org.apache.tika.batch.fs.BatchDriverTest.xml	(revision 0)
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite failures="0" time="38.054" errors="0" skipped="0" tests="4" name="org.apache.tika.batch.fs.BatchDriverTest">
+  <properties>
+    <property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/>
+    <property name="sun.boot.library.path" value="/usr/java/jdk1.7.0_40/jre/lib/amd64"/>
+    <property name="java.vm.version" value="24.0-b56"/>
+    <property name="java.vm.vendor" value="Oracle Corporation"/>
+    <property name="java.vendor.url" value="http://java.oracle.com/"/>
+    <property name="path.separator" value=":"/>
+    <property name="java.vm.name" value="Java HotSpot(TM) 64-Bit Server VM"/>
+    <property name="file.encoding.pkg" value="sun.io"/>
+    <property name="user.country" value="US"/>
+    <property name="sun.java.launcher" value="SUN_STANDARD"/>
+    <property name="sun.os.patch.level" value="unknown"/>
+    <property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
+    <property name="user.dir" value="/rhapsode-data/svnwork/tika-trunk"/>
+    <property name="java.runtime.version" value="1.7.0_40-b43"/>
+    <property name="java.awt.graphicsenv" value="sun.awt.X11GraphicsEnvironment"/>
+    <property name="java.endorsed.dirs" value="/usr/java/jdk1.7.0_40/jre/lib/endorsed"/>
+    <property name="os.arch" value="amd64"/>
+    <property name="java.io.tmpdir" value="/tmp"/>
+    <property name="line.separator" value="
+"/>
+    <property name="java.vm.specification.vendor" value="Oracle Corporation"/>
+    <property name="os.name" value="Linux"/>
+    <property name="classworlds.conf" value="/home/tallison/maven2/apache-maven-2.2.1/bin/m2.conf"/>
+    <property name="sun.jnu.encoding" value="UTF-8"/>
+    <property name="java.library.path" value="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib"/>
+    <property name="http.proxyPort" value="80"/>
+    <property name="java.specification.name" value="Java Platform API Specification"/>
+    <property name="java.class.version" value="51.0"/>
+    <property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
+    <property name="os.version" value="2.6.32-431.5.1.el6.x86_64"/>
+    <property name="user.home" value="/home/tallison"/>
+    <property name="user.timezone" value="America/New_York"/>
+    <property name="java.awt.printerjob" value="sun.print.PSPrinterJob"/>
+    <property name="file.encoding" value="UTF-8"/>
+    <property name="java.specification.version" value="1.7"/>
+    <property name="user.name" value="tallison"/>
+    <property name="java.class.path" value="/home/tallison/maven2/apache-maven-2.2.1/boot/classworlds-1.1.jar"/>
+    <property name="java.vm.specification.version" value="1.7"/>
+    <property name="sun.arch.data.model" value="64"/>
+    <property name="java.home" value="/usr/java/jdk1.7.0_40/jre"/>
+    <property name="sun.java.command" value="org.codehaus.classworlds.Launcher &quot;clean&quot; &quot;install&quot;"/>
+    <property name="java.specification.vendor" value="Oracle Corporation"/>
+    <property name="user.language" value="en"/>
+    <property name="awt.toolkit" value="sun.awt.X11.XToolkit"/>
+    <property name="java.vm.info" value="mixed mode"/>
+    <property name="java.version" value="1.7.0_40"/>
+    <property name="java.ext.dirs" value="/usr/java/jdk1.7.0_40/jre/lib/ext:/usr/java/packages/lib/ext"/>
+    <property name="securerandom.source" value="file:/dev/./urandom"/>
+    <property name="sun.boot.class.path" value="/usr/java/jdk1.7.0_40/jre/lib/resources.jar:/usr/java/jdk1.7.0_40/jre/lib/rt.jar:/usr/java/jdk1.7.0_40/jre/lib/sunrsasign.jar:/usr/java/jdk1.7.0_40/jre/lib/jsse.jar:/usr/java/jdk1.7.0_40/jre/lib/jce.jar:/usr/java/jdk1.7.0_40/jre/lib/charsets.jar:/usr/java/jdk1.7.0_40/jre/lib/jfr.jar:/usr/java/jdk1.7.0_40/jre/classes"/>
+    <property name="http.proxyHost" value="gatekeeper-w.mitre.org"/>
+    <property name="java.vendor" value="Oracle Corporation"/>
+    <property name="maven.home" value="/home/tallison/maven2/apache-maven-2.2.1"/>
+    <property name="file.separator" value="/"/>
+    <property name="java.vendor.url.bug" value="http://bugreport.sun.com/bugreport/"/>
+    <property name="sun.cpu.endian" value="little"/>
+    <property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
+    <property name="sun.cpu.isalist" value=""/>
+  </properties>
+  <testcase time="5.015" classname="org.apache.tika.batch.fs.BatchDriverTest" name="restartOnOOMTest"/>
+  <testcase time="16.013" classname="org.apache.tika.batch.fs.BatchDriverTest" name="allHeavyHangsTestWithStarvedCrawler"/>
+  <testcase time="6.007" classname="org.apache.tika.batch.fs.BatchDriverTest" name="oneHeavyHangTest"/>
+  <testcase time="11.019" classname="org.apache.tika.batch.fs.BatchDriverTest" name="restartOnFullHangTest"/>
+</testsuite>
\ No newline at end of file
Index: tika-batch/target/maven-shared-archive-resources/META-INF/NOTICE
===================================================================
--- tika-batch/target/maven-shared-archive-resources/META-INF/NOTICE	(revision 0)
+++ tika-batch/target/maven-shared-archive-resources/META-INF/NOTICE	(revision 0)
@@ -0,0 +1,8 @@
+
+Apache Tika batch
+Copyright 2007-2014 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+
Index: tika-batch/target/maven-shared-archive-resources/META-INF/LICENSE
===================================================================
--- tika-batch/target/maven-shared-archive-resources/META-INF/LICENSE	(revision 0)
+++ tika-batch/target/maven-shared-archive-resources/META-INF/LICENSE	(revision 0)
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
Index: tika-batch/target/maven-shared-archive-resources/META-INF/DEPENDENCIES
===================================================================
--- tika-batch/target/maven-shared-archive-resources/META-INF/DEPENDENCIES	(revision 0)
+++ tika-batch/target/maven-shared-archive-resources/META-INF/DEPENDENCIES	(revision 0)
@@ -0,0 +1,131 @@
+// ------------------------------------------------------------------
+// Transitive dependencies of this project determined from the
+// maven pom organized by organization.
+// ------------------------------------------------------------------
+
+Apache Tika batch
+
+
+From: 'an unknown organization'
+  - XMP Library for Java (http://www.adobe.com/devnet/xmp.html) com.adobe.xmp:xmpcore:jar:5.1.2
+    License: The BSD License  (http://www.adobe.com/devnet/xmp/library/eula-xmp-library-java.html)
+  - metadata-extractor (http://code.google.com/p/metadata-extractor/) com.drewnoakes:metadata-extractor:jar:2.6.2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - juniversalchardet (http://juniversalchardet.googlecode.com/) com.googlecode.juniversalchardet:juniversalchardet:jar:1.0.3
+    License: Mozilla Public License 1.1 (MPL 1.1)  (http://www.mozilla.org/MPL/MPL-1.1.html)
+  - ISO Parser (http://code.google.com/p/mp4parser/) com.googlecode.mp4parser:isoparser:jar:1.0.2
+    License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - java-libpst (https://code.google.com/p/java-libpst/) com.pff:java-libpst:jar:0.8.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Boilerpipe -- Boilerplate Removal and Fulltext Extraction from HTML pages (http://code.google.com/p/boilerpipe/) de.l3s.boilerpipe:boilerpipe:jar:1.1.0
+    License: Apache License 2.0 
+  - Unnamed - jdom:jdom:jar:1.0  jdom:jdom:jar:1.0
+
+  - "Java Concurrency in Practice" book annotations (http://jcip.net/) net.jcip:jcip-annotations:jar:1.0
+
+  - jmatio (http://sourceforge.net/projects/jmatio/) net.sourceforge.jmatio:jmatio:jar:1.0
+    License: BSD  (http://www.linfo.org/bsdlicense.html)
+  - AspectJ runtime (http://www.aspectj.org) org.aspectj:aspectjrt:jar:1.8.0
+    License: Eclipse Public License - v 1.0  (http://www.eclipse.org/legal/epl-v10.html)
+  - Bouncy Castle CMS and S/MIME API (http://www.bouncycastle.org/java.html) org.bouncycastle:bcmail-jdk15:jar:1.45
+    License: Bouncy Castle Licence  (http://www.bouncycastle.org/licence.html)
+  - Bouncy Castle Provider (http://www.bouncycastle.org/java.html) org.bouncycastle:bcprov-jdk15:jar:1.45
+    License: Bouncy Castle Licence  (http://www.bouncycastle.org/licence.html)
+  - TagSoup (http://home.ccil.org/~cowan/XML/tagsoup/) org.ccil.cowan.tagsoup:tagsoup:jar:1.2.1
+    License: Apache License 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Ogg and Vorbis for Java, Core (https://github.com/Gagravarr/VorbisJava) org.gagravarr:vorbis-java-core:jar:0.6
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Tika plugin for Ogg, Vorbis and FLAC (https://github.com/Gagravarr/VorbisJava) org.gagravarr:vorbis-java-tika:jar:0.6
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - XZ for Java (http://tukaani.org/xz/java.html) org.tukaani:xz:jar:1.5
+    License: Public Domain 
+
+From: 'Apache Software Foundation' (http://jakarta.apache.org/)
+  - HttpClient (http://jakarta.apache.org/httpcomponents/httpclient-3.x/) commons-httpclient:commons-httpclient:jar:3.1
+    License: Apache License  (http://www.apache.org/licenses/LICENSE-2.0)
+
+From: 'Apache Software Foundation' (http://www.apache.org)
+  - Log4j (http://logging.apache.org/log4j/docs/) log4j:log4j:jar:1.2.14
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'Apache Software Foundation' (http://www.apache.org/)
+  - Apache POI (http://poi.apache.org/) org.apache.poi:poi:jar:3.11-beta2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache POI (http://poi.apache.org/) org.apache.poi:poi-ooxml:jar:3.11-beta2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache POI (http://poi.apache.org/) org.apache.poi:poi-ooxml-schemas:jar:3.11-beta2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache POI (http://poi.apache.org/) org.apache.poi:poi-scratchpad:jar:3.11-beta2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Xerces2 Java Parser (http://xerces.apache.org/xerces2-j/) xerces:xercesImpl:jar:2.8.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Unnamed - xml-apis:xml-apis:jar:1.3.03 (http://xml.apache.org/commons/#external) xml-apis:xml-apis:jar:1.3.03
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'Google, Inc.' (http://www.google.com)
+  - Gson (http://code.google.com/p/google-gson/) com.google.code.gson:gson:jar:1.7.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'ObjectWeb' (http://www.objectweb.org/)
+  - ASM Debug All (http://asm.objectweb.org/asm-debug-all) org.ow2.asm:asm-debug-all:jar:4.1
+    License: BSD  (http://asm.objectweb.org/license.html)
+
+From: 'QOS.ch' (http://www.qos.ch)
+  - SLF4J API Module (http://www.slf4j.org) org.slf4j:slf4j-api:jar:1.5.6
+
+  - SLF4J LOG4J-12 Binding (http://www.slf4j.org) org.slf4j:slf4j-log4j12:jar:1.5.6
+
+
+From: 'Sun Microsystems' (http://java.sun.com/)
+  - ROME, RSS and atOM utilitiEs for Java (https://rome.dev.java.net/) rome:rome:jar:1.0
+
+
+From: 'The Apache Software Foundation' (http://pdfbox.apache.org)
+  - Apache FontBox (http://pdfbox.apache.org/) org.apache.pdfbox:fontbox:bundle:1.8.7
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache JempBox (http://www.apache.org/pdfbox-parent/jempbox) org.apache.pdfbox:jempbox:bundle:1.8.7
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache PDFBox (http://www.apache.org/pdfbox-parent/pdfbox) org.apache.pdfbox:pdfbox:bundle:1.8.7
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'The Apache Software Foundation' (http://www.apache.org)
+  - Apache Tika core (http://tika.apache.org/) org.apache.tika:tika-core:bundle:1.7-SNAPSHOT
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Tika parsers (http://tika.apache.org/) org.apache.tika:tika-parsers:bundle:1.7-SNAPSHOT
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Tika serialization (http://tika.apache.org) org.apache.tika:tika-serialization:jar:1.7-SNAPSHOT
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Tika XMP (http://tika.apache.org/) org.apache.tika:tika-xmp:bundle:1.7-SNAPSHOT
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'The Apache Software Foundation' (http://www.apache.org/)
+  - Commons CLI (http://commons.apache.org/cli/) commons-cli:commons-cli:jar:1.2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Commons Codec (http://commons.apache.org/proper/commons-codec/) commons-codec:commons-codec:jar:1.9
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Commons Logging (http://commons.apache.org/logging) commons-logging:commons-logging:jar:1.1.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Commons Compress (http://commons.apache.org/proper/commons-compress/) org.apache.commons:commons-compress:jar:1.8.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache JAMES Mime4j (Core) (http://james.apache.org/mime4j/apache-mime4j-core) org.apache.james:apache-mime4j-core:jar:0.7.2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache JAMES Mime4j (DOM) (http://james.apache.org/mime4j/apache-mime4j-dom) org.apache.james:apache-mime4j-dom:jar:0.7.2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'UCAR/Unidata' (http://www.ucar.edu/)
+  - NetCDF-Java Library (http://www.unidata.ucar.edu/software/netcdf-java/) edu.ucar:netcdf:jar:4.2.20
+    License: (MIT-style) netCDF C library license  (http://www.unidata.ucar.edu/software/netcdf/copyright.html)
+  - Unidata Common (http://www.unidata.ucar.edu/software/netcdf-java/) edu.ucar:unidataCommon:jar:4.2.20
+    License: (MIT-style) netCDF C library license  (http://www.unidata.ucar.edu/software/netcdf/copyright.html)
+
+From: 'Uwyn' (http://uwyn.com/)
+  - JHighlight (https://jhighlight.dev.java.net/) com.uwyn:jhighlight:jar:1.0
+    License: CDDL, v1.0  (http://www.opensource.org/licenses/cddl1.php)    License: LGPL, v2.1 or later  (http://www.opensource.org/licenses/lgpl-license.php)
+
+From: 'XmlBeans' (http://xmlbeans.apache.org/)
+  - XmlBeans (http://xmlbeans.apache.org) org.apache.xmlbeans:xmlbeans:jar:2.6.0
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+
+
+
Index: tika-batch/target/tika-batch-1.7-SNAPSHOT.jar
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/tika-batch-1.7-SNAPSHOT.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/tika-batch-1.7-SNAPSHOT-tests.jar
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/tika-batch-1.7-SNAPSHOT-tests.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/failsafe-reports/failsafe-summary.xml
===================================================================
--- tika-batch/target/failsafe-reports/failsafe-summary.xml	(revision 0)
+++ tika-batch/target/failsafe-reports/failsafe-summary.xml	(revision 0)
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<failsafe-summary result="254" />
Index: tika-batch/target/.plxarc
===================================================================
--- tika-batch/target/.plxarc	(revision 0)
+++ tika-batch/target/.plxarc	(revision 0)
@@ -0,0 +1 @@
+maven-shared-archive-resources
\ No newline at end of file
Index: tika-batch/target/maven-archiver/pom.properties
===================================================================
--- tika-batch/target/maven-archiver/pom.properties	(revision 0)
+++ tika-batch/target/maven-archiver/pom.properties	(revision 0)
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Thu Sep 25 11:51:55 EDT 2014
+version=1.7-SNAPSHOT
+groupId=org.apache.tika
+artifactId=tika-batch
Index: tika-batch/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
===================================================================
--- tika-batch/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst	(revision 0)
+++ tika-batch/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst	(revision 0)
@@ -0,0 +1,53 @@
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/builders/AbstractConsumersBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/builders/BasicTikaFSConsumersBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/BatchNoRestartException.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/StatusReporterFutureResult.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/AutoDetectParserFactory.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/builders/BatchProcessBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/ParserFactory.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/CommandLineInterrupter.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/OutputStreamFactory.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/IInterrupter.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/FSFileResource.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/builders/ObjectFromDOMAndQueueBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/builders/ObjectFromDOMBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/IFileProcessorFutureResult.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/InterrupterFutureResult.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/FSDirectoryCrawler.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/util/DurationFormatUtils.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/RecursiveParserWrapperFSConsumer.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/FSOutputStreamFactory.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/FileResourceCrawler.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/FSBatchProcessCLI.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/builders/ReporterBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/FSListCrawler.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/util/XMLDOMUtil.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/builders/ICrawlerBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/FSUtil.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/FileStarted.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/FSConsumersManager.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/FSDocumentSelector.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/ConsumersManager.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/FileResourceCrawlerFutureResult.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/builders/FSCrawlerBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/builders/IInterupterBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/BatchProcessDriverCLI.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/util/BatchLocalization.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/ParallelFileProcessingResult.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/FileResourceConsumer.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/builders/SimpleLogReporterBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/BasicTikaFSConsumer.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/builders/ContentHandlerFactoryBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/PoisonFileResource.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/util/PropsUtil.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/builders/StatusReporterBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/SimpleLogStatusReporter.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/IStatusReporter.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/fs/FSProperties.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/builders/DefaultContentHandlerFactoryBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/util/ClassLoaderUtil.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/BatchProcess.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/builders/CommandLineInterrupterBuilder.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/FileResource.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/main/java/org/apache/tika/batch/FileConsumerFutureResult.java
Index: tika-batch/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
===================================================================
--- tika-batch/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst	(revision 0)
+++ tika-batch/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst	(revision 0)
@@ -0,0 +1,68 @@
+org/apache/tika/batch/FileResourceConsumer.class
+org/apache/tika/batch/BatchProcess$1.class
+org/apache/tika/batch/IFileProcessorFutureResult.class
+org/apache/tika/batch/CommandLineInterrupter.class
+org/apache/tika/util/DurationFormatUtils.class
+org/apache/tika/batch/fs/FSListCrawler.class
+org/apache/tika/batch/BatchProcess$StaleChecker.class
+org/apache/tika/batch/builders/ContentHandlerFactoryBuilder.class
+org/apache/tika/batch/ConsumersManager.class
+org/apache/tika/batch/builders/BatchProcessBuilder.class
+org/apache/tika/batch/BatchProcessDriverCLI.class
+org/apache/tika/batch/fs/FSDirectoryCrawler$1.class
+org/apache/tika/util/PropsUtil.class
+org/apache/tika/batch/fs/FSOutputStreamFactory.class
+org/apache/tika/batch/OutputStreamFactory.class
+org/apache/tika/batch/IInterrupter.class
+org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver.class
+org/apache/tika/batch/builders/ReporterBuilder.class
+org/apache/tika/batch/BatchProcess.class
+org/apache/tika/batch/BatchProcessDriverCLI$StreamGobbler.class
+org/apache/tika/batch/ParserFactory.class
+org/apache/tika/batch/InterrupterFutureResult.class
+org/apache/tika/batch/fs/FSFileResource.class
+org/apache/tika/batch/FileResourceConsumer$STATE.class
+org/apache/tika/batch/builders/ObjectFromDOMAndQueueBuilder.class
+org/apache/tika/util/XMLDOMUtil.class
+org/apache/tika/batch/SimpleLogStatusReporter.class
+org/apache/tika/batch/BatchProcessDriverCLI$1.class
+org/apache/tika/batch/fs/FSDocumentSelector.class
+org/apache/tika/batch/IStatusReporter.class
+org/apache/tika/batch/builders/IInterupterBuilder.class
+org/apache/tika/batch/fs/FSDirectoryCrawler.class
+org/apache/tika/batch/fs/builders/FSCrawlerBuilder.class
+org/apache/tika/batch/AutoDetectParserFactory.class
+org/apache/tika/batch/fs/FSUtil$HANDLE_EXISTING.class
+org/apache/tika/batch/builders/DefaultContentHandlerFactoryBuilder.class
+org/apache/tika/batch/FileResourceCrawler.class
+org/apache/tika/batch/fs/FSUtil.class
+org/apache/tika/batch/fs/FSConsumersManager.class
+org/apache/tika/batch/BatchNoRestartException.class
+org/apache/tika/util/BatchLocalization.class
+org/apache/tika/batch/fs/FSProperties.class
+org/apache/tika/batch/fs/BasicTikaFSConsumer.class
+org/apache/tika/batch/BatchProcessDriverCLI$StreamWriter.class
+org/apache/tika/batch/fs/FSBatchProcessCLI.class
+org/apache/tika/batch/ParallelFileProcessingResult.class
+org/apache/tika/batch/fs/RecursiveParserWrapperFSConsumer.class
+org/apache/tika/batch/builders/CommandLineInterrupterBuilder.class
+org/apache/tika/batch/BatchProcess$CAUSE_FOR_TERMINATION.class
+org/apache/tika/batch/builders/ObjectFromDOMBuilder.class
+org/apache/tika/batch/fs/FSDirectoryCrawler$CRAWL_ORDER.class
+org/apache/tika/batch/builders/StatusReporterBuilder.class
+org/apache/tika/batch/builders/ICrawlerBuilder.class
+org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver$1.class
+org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver$RedirectGobbler.class
+org/apache/tika/util/ClassLoaderUtil.class
+org/apache/tika/batch/FileStarted.class
+org/apache/tika/batch/FileResource.class
+org/apache/tika/batch/builders/AbstractConsumersBuilder.class
+org/apache/tika/batch/BatchProcess$StaleFutureResult.class
+org/apache/tika/batch/builders/SimpleLogReporterBuilder.class
+org/apache/tika/batch/fs/FSDirectoryCrawler$FileNameComparator.class
+org/apache/tika/batch/StatusReporterFutureResult.class
+org/apache/tika/batch/FileConsumerFutureResult.class
+org/apache/tika/batch/PoisonFileResource.class
+org/apache/tika/batch/fs/builders/BasicTikaFSConsumersBuilder.class
+org/apache/tika/batch/FileResourceCrawlerFutureResult.class
+org/apache/tika/batch/BatchProcess$BATCH_CONSTANTS.class
Index: tika-batch/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
===================================================================
--- tika-batch/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst	(revision 0)
+++ tika-batch/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst	(revision 0)
@@ -0,0 +1,9 @@
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/test/java/org/apache/tika/batch/fs/BatchDriverTest.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/test/java/org/apache/tika/batch/fs/strawman/StrawmanTest.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/test/java/org/apache/tika/batch/fs/StringStreamGobbler.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/test/java/org/apache/tika/parser/evil/EvilParserFactory.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/test/java/org/apache/tika/parser/evil/EvilParser.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/test/java/org/apache/tika/batch/fs/FSBatchTestBase.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/test/java/org/apache/tika/batch/fs/HandlerBuilderTest.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/test/java/org/apache/tika/batch/fs/OutputStreamFactoryTest.java
+/rhapsode-data/svnwork/tika-trunk/tika-batch/src/test/java/org/apache/tika/batch/fs/BatchProcessTest.java
Index: tika-batch/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
===================================================================
--- tika-batch/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst	(revision 0)
+++ tika-batch/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst	(revision 0)
@@ -0,0 +1,12 @@
+org/apache/tika/batch/fs/StringStreamGobbler.class
+org/apache/tika/batch/fs/BatchDriverTest.class
+org/apache/tika/batch/fs/BatchProcessTest$BatchProcessTestExecutor.class
+org/apache/tika/batch/fs/OutputStreamFactoryTest.class
+org/apache/tika/batch/fs/BatchProcessTest$1.class
+org/apache/tika/batch/fs/BatchProcessTest.class
+org/apache/tika/batch/fs/HandlerBuilderTest.class
+org/apache/tika/batch/fs/BatchProcessTest$StreamStrings.class
+org/apache/tika/parser/evil/EvilParserFactory.class
+org/apache/tika/parser/evil/EvilParser.class
+org/apache/tika/batch/fs/FSBatchTestBase.class
+org/apache/tika/batch/fs/strawman/StrawmanTest.class
Index: tika-batch/target/test-classes/evil/runtime_exception.evil
===================================================================
--- tika-batch/target/test-classes/evil/runtime_exception.evil	(revision 0)
+++ tika-batch/target/test-classes/evil/runtime_exception.evil	(revision 0)
@@ -0,0 +1 @@
+run time exception
\ No newline at end of file
Index: tika-batch/target/test-classes/evil/hang_light_load.evil
===================================================================
--- tika-batch/target/test-classes/evil/hang_light_load.evil	(revision 0)
+++ tika-batch/target/test-classes/evil/hang_light_load.evil	(revision 0)
@@ -0,0 +1 @@
+hang light load
\ No newline at end of file
Index: tika-batch/target/test-classes/evil/tika_exception.evil
===================================================================
--- tika-batch/target/test-classes/evil/tika_exception.evil	(revision 0)
+++ tika-batch/target/test-classes/evil/tika_exception.evil	(revision 0)
@@ -0,0 +1 @@
+tika exception
\ No newline at end of file
Index: tika-batch/target/test-classes/evil/hang_heavy_load.evil
===================================================================
--- tika-batch/target/test-classes/evil/hang_heavy_load.evil	(revision 0)
+++ tika-batch/target/test-classes/evil/hang_heavy_load.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/target/test-classes/evil/oom_exception.evil
===================================================================
--- tika-batch/target/test-classes/evil/oom_exception.evil	(revision 0)
+++ tika-batch/target/test-classes/evil/oom_exception.evil	(revision 0)
@@ -0,0 +1 @@
+oom exception
\ No newline at end of file
Index: tika-batch/target/test-classes/evil/sleep_2000.evil
===================================================================
--- tika-batch/target/test-classes/evil/sleep_2000.evil	(revision 0)
+++ tika-batch/target/test-classes/evil/sleep_2000.evil	(revision 0)
@@ -0,0 +1 @@
+sleep 2000
\ No newline at end of file
Index: tika-batch/target/test-classes/evil/tika-evil-config.xml
===================================================================
--- tika-batch/target/test-classes/evil/tika-evil-config.xml	(revision 0)
+++ tika-batch/target/test-classes/evil/tika-evil-config.xml	(revision 0)
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+<properties>
+
+    <mimeTypeRepository resource="/evil/tika-evil-mimetypes.xml" magic="false"/>
+
+    <parsers>
+    
+        <parser name="parse-evil" class="org.apache.tika.parser.evil.EvilParser">
+        		<mime>application/evil</mime>
+        </parser>
+
+        <parser name="parse-dcxml" class="org.apache.tika.parser.xml.DcXMLParser">
+                <mime>application/xml</mime>
+        </parser>
+
+        <parser name="parse-office" class="org.apache.tika.parser.microsoft.OfficeParser">
+                <mime>application/x-tika-msoffice</mime>
+                <mime>application/msword</mime>
+                <mime>application/vnd.ms-excel</mime>
+                <mime>application/vnd.ms-powerpoint</mime>
+                <mime>application/vnd.visio</mime>
+                <mime>application/vnd.ms-outlook</mime>
+        </parser>
+
+        <parser name="parse-html" class="org.apache.tika.parser.html.HtmlParser">
+                <mime>text/html</mime>
+                <mime>application/xhtml+xml</mime>
+                <mime>application/x-asp</mime>
+        </parser>
+
+        <parser mame="parse-rtf" class="org.apache.tika.parser.rtf.RTFParser">
+                <mime>application/rtf</mime>
+        </parser>
+
+        <parser name="parse-pdf" class="org.apache.tika.parser.pdf.PDFParser">
+                <mime>application/pdf</mime>
+        </parser>
+
+        <parser name="parse-txt" class="org.apache.tika.parser.txt.TXTParser">
+                <mime>text/plain</mime>
+        </parser>
+
+        <parser name="parse-openoffice" class="org.apache.tika.parser.opendocument.OpenOfficeParser">
+                <mime>application/vnd.sun.xml.writer</mime>
+                <mime>application/vnd.oasis.opendocument.text</mime>
+                <mime>application/vnd.oasis.opendocument.graphics</mime>
+                <mime>application/vnd.oasis.opendocument.presentation</mime>
+                <mime>application/vnd.oasis.opendocument.spreadsheet</mime>
+                <mime>application/vnd.oasis.opendocument.chart</mime>
+                <mime>application/vnd.oasis.opendocument.image</mime>
+                <mime>application/vnd.oasis.opendocument.formula</mime>
+                <mime>application/vnd.oasis.opendocument.text-master</mime>
+                <mime>application/vnd.oasis.opendocument.text-web</mime>
+                <mime>application/vnd.oasis.opendocument.text-template</mime>
+                <mime>application/vnd.oasis.opendocument.graphics-template</mime>
+                <mime>application/vnd.oasis.opendocument.presentation-template</mime>
+                <mime>application/vnd.oasis.opendocument.spreadsheet-template</mime>
+                <mime>application/vnd.oasis.opendocument.chart-template</mime>
+                <mime>application/vnd.oasis.opendocument.image-template</mime>
+                <mime>application/vnd.oasis.opendocument.formula-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.text</mime>
+                <mime>application/x-vnd.oasis.opendocument.graphics</mime>
+                <mime>application/x-vnd.oasis.opendocument.presentation</mime>
+                <mime>application/x-vnd.oasis.opendocument.spreadsheet</mime>
+                <mime>application/x-vnd.oasis.opendocument.chart</mime>
+                <mime>application/x-vnd.oasis.opendocument.image</mime>
+                <mime>application/x-vnd.oasis.opendocument.formula</mime>
+                <mime>application/x-vnd.oasis.opendocument.text-master</mime>
+                <mime>application/x-vnd.oasis.opendocument.text-web</mime>
+                <mime>application/x-vnd.oasis.opendocument.text-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.graphics-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.presentation-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.spreadsheet-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.chart-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.image-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.formula-template</mime>
+        </parser>
+
+        <parser name="parse-image" class="org.apache.tika.parser.image.ImageParser">
+                <mime>image/bmp</mime>
+                <mime>image/gif</mime>
+                <mime>image/jpeg</mime>
+                <mime>image/png</mime>
+                <mime>image/tiff</mime>
+                <mime>image/vnd.wap.wbmp</mime>
+                <mime>image/x-icon</mime>
+                <mime>image/x-psd</mime>
+                <mime>image/x-xcf</mime>
+        </parser>
+
+        <parser name="parse-zip" class="org.apache.tika.parser.pkg.PackageParser">
+                <mime>application/zip</mime>
+        </parser>
+
+        <parser name="parse-tar" class="org.apache.tika.parser.pkg.PackageParser">
+                <mime>application/x-tar</mime>
+        </parser>
+
+        <parser name="parse-gzip" class="org.apache.tika.parser.pkg.CompressorParser">
+                <mime>application/x-gzip</mime>
+        </parser>
+
+        <parser name="parse-bzip2" class="org.apache.tika.parser.pkg.CompressorParser">
+                <mime>application/x-bzip</mime>
+        </parser>
+
+        <parser name="parse-class" class="org.apache.tika.parser.asm.ClassParser">
+                <mime>application/x-tika-java-class</mime>
+        </parser>
+
+        <parser name="parse-mp3" class="org.apache.tika.parser.mp3.Mp3Parser">
+                <mime>audio/mpeg</mime>
+        </parser>
+
+        <parser name="parse-midi" class="org.apache.tika.parser.audio.MidiParser">
+                <mime>application/x-midi</mime>
+                <mime>audio/midi</mime>
+        </parser>
+
+        <parser name="parse-audio" class="org.apache.tika.parser.audio.AudioParser">
+                <mime>audio/basic</mime>
+                <mime>audio/x-wav</mime>
+                <mime>audio/x-aiff</mime>
+        </parser>
+
+    </parsers>
+
+</properties>
Index: tika-batch/target/test-classes/evil/no_problem.txt
===================================================================
--- tika-batch/target/test-classes/evil/no_problem.txt	(revision 0)
+++ tika-batch/target/test-classes/evil/no_problem.txt	(revision 0)
@@ -0,0 +1 @@
+the quick brown fox jumped over the lazy dog.
\ No newline at end of file
Index: tika-batch/target/test-classes/evil/assertion_error.evil
===================================================================
--- tika-batch/target/test-classes/evil/assertion_error.evil	(revision 0)
+++ tika-batch/target/test-classes/evil/assertion_error.evil	(revision 0)
@@ -0,0 +1 @@
+assertion error
\ No newline at end of file
Index: tika-batch/target/test-classes/evil/tika-evil-mimetypes.xml
===================================================================
--- tika-batch/target/test-classes/evil/tika-evil-mimetypes.xml	(revision 0)
+++ tika-batch/target/test-classes/evil/tika-evil-mimetypes.xml	(revision 0)
@@ -0,0 +1,5887 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!--
+  Description: This xml file defines the valid mime types used by Tika.
+  The mime type data within this file is based on information from various
+  sources like Apache Nutch, Apache HTTP Server, the file(1) command, etc.
+
+  Notes:
+   * Tika supports a wider range of match types than Freedesktop does
+   * Glob patterns must be unique, if there's a clash assign to the most
+     popular format
+   * The main mime type should be the canonical one, use aliases for any
+     other widely used forms
+   * Where there's a hierarchy in the types, list it via a parent
+   * Highly specific magic matches get a high priority
+   * General magic matches which could trigger a false-positive need
+     a low one
+   * The priority for containers normally need to be higher than for
+     the things they contain, so they don't accidently get detected
+     as what's in them
+   * For logic too complex to be expressed in a magic match, do the best
+     you can here, then provide a Custom Detector for the rest
+-->
+<mime-info>
+  <mime-type type="application/evil">
+    <glob pattern="*.evil"/>
+  </mime-type>
+  <mime-type type="application/activemessage"/>
+  <mime-type type="application/andrew-inset">
+    <glob pattern="*.ez"/>
+  </mime-type>
+  <mime-type type="application/applefile"/>
+  <mime-type type="application/applixware">
+    <glob pattern="*.aw"/>
+  </mime-type>
+
+  <mime-type type="application/atom+xml">
+    <root-XML localName="feed" namespaceURI="http://purl.org/atom/ns#"/>
+    <root-XML localName="feed" namespaceURI="http://www.w3.org/2005/Atom"/>
+    <glob pattern="*.atom"/>
+  </mime-type>
+
+  <mime-type type="application/atomcat+xml">
+    <glob pattern="*.atomcat"/>
+  </mime-type>
+  <mime-type type="application/atomicmail"/>
+  <mime-type type="application/atomsvc+xml">
+    <glob pattern="*.atomsvc"/>
+  </mime-type>
+  <mime-type type="application/auth-policy+xml"/>
+  <mime-type type="application/batch-smtp"/>
+  <mime-type type="application/beep+xml"/>
+
+  <mime-type type="application/bizagi-modeler">
+    <_comment>BizAgi Process Modeler</_comment>
+    <sub-class-of type="application/zip"/>
+    <glob pattern="*.bpm"/>
+  </mime-type>
+
+  <mime-type type="application/cals-1840"/>
+  <mime-type type="application/ccxml+xml">
+    <glob pattern="*.ccxml"/>
+  </mime-type>
+  <mime-type type="application/cea-2018+xml"/>
+  <mime-type type="application/cellml+xml"/>
+  <mime-type type="application/cnrp+xml"/>
+  <mime-type type="application/commonground"/>
+  <mime-type type="application/conference-info+xml"/>
+  <mime-type type="application/cpl+xml"/>
+  <mime-type type="application/csta+xml"/>
+  <mime-type type="application/cstadata+xml"/>
+  <mime-type type="application/cu-seeme">
+    <glob pattern="*.cu"/>
+  </mime-type>
+  <mime-type type="application/cybercash"/>
+  <mime-type type="application/davmount+xml">
+    <glob pattern="*.davmount"/>
+  </mime-type>
+  <mime-type type="application/dca-rft"/>
+  <mime-type type="application/dec-dx"/>
+  <mime-type type="application/dialog-info+xml"/>
+  <mime-type type="application/dicom"/>
+
+  <mime-type type="application/dita+xml">
+    <sub-class-of type="application/xml"/>
+    <_comment>Darwin Information Typing Architecture</_comment>
+  </mime-type>
+
+  <mime-type type="application/dita+xml;format=map">
+    <sub-class-of type="application/dita+xml"/>
+    <_comment>DITA Map</_comment>
+    <root-XML localName="map"/>
+    <root-XML localName="map" namespaceURI="http://docs.oasis-open.org/namespace"/>
+    <glob pattern="*.ditamap"/>
+  </mime-type>
+  <mime-type type="application/dita+xml;format=topic">
+    <sub-class-of type="application/dita+xml"/>
+    <_comment>DITA Topic</_comment>
+    <root-XML localName="topic"/>
+    <root-XML localName="topic" namespaceURI="http://docs.oasis-open.org/namespace"/>
+    <!-- Topic is the default, Task and Concept are specialisations -->
+    <glob pattern="*.dita"/>
+  </mime-type>
+  <mime-type type="application/dita+xml;format=task">
+    <sub-class-of type="application/dita+xml;format=task"/>
+    <_comment>DITA Task Topic</_comment>
+    <root-XML localName="task"/>
+    <root-XML localName="task" namespaceURI="http://docs.oasis-open.org/namespace"/>
+  </mime-type>
+  <mime-type type="application/dita+xml;format=concept">
+    <sub-class-of type="application/dita+xml;format=topic"/>
+    <_comment>DITA Concept Topic</_comment>
+    <root-XML localName="concept"/>
+    <root-XML localName="concept" namespaceURI="http://docs.oasis-open.org/namespace"/>
+  </mime-type>
+  <mime-type type="application/dita+xml;format=val">
+    <sub-class-of type="application/dita+xml"/>
+    <_comment>DITA Conditional Processing Profile</_comment>
+    <root-XML localName="val"/>
+    <root-XML localName="val" namespaceURI="http://docs.oasis-open.org/namespace"/>
+    <glob pattern="*.ditaval"/>
+  </mime-type>
+
+  <mime-type type="application/dns"/>
+  <mime-type type="application/dvcs"/>
+  <mime-type type="application/ecmascript">
+    <glob pattern="*.ecma"/>
+  </mime-type>
+  <mime-type type="application/edi-consent"/>
+  <mime-type type="application/edi-x12"/>
+  <mime-type type="application/edifact"/>
+  <mime-type type="application/emma+xml">
+    <glob pattern="*.emma"/>
+  </mime-type>
+  <mime-type type="application/epp+xml"/>
+
+  <mime-type type="application/epub+zip">
+    <acronym>EPUB</acronym>
+    <_comment>Electronic Publication</_comment>
+    <magic priority="50">
+      <match value="PK\003\004" type="string" offset="0">
+        <match value="mimetypeapplication/epub+zip" type="string" offset="30"/>
+      </match>
+    </magic>
+    <glob pattern="*.epub"/>
+  </mime-type>
+
+  <mime-type type="application/eshop"/>
+  <mime-type type="application/example"/>
+  <mime-type type="application/fastinfoset"/>
+  <mime-type type="application/fastsoap"/>
+
+  <mime-type type="application/fits">
+    <acronym>FITS</acronym>
+    <_comment>Flexible Image Transport System</_comment>
+    <tika:link>http://www.digitalpreservation.gov/formats/fdd/fdd000317.shtml</tika:link>
+    <magic priority="50">
+      <match value="SIMPLE  =                    T" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.fits"/>
+    <glob pattern="*.fit"/>
+    <glob pattern="*.fts"/>
+  </mime-type>
+
+  <mime-type type="application/font-tdpfr">
+    <glob pattern="*.pfr"/>
+  </mime-type>
+  <mime-type type="application/h224"/>
+  <mime-type type="application/http"/>
+  <mime-type type="application/hyperstudio">
+    <glob pattern="*.stk"/>
+  </mime-type>
+  <mime-type type="application/ibe-key-request+xml"/>
+  <mime-type type="application/ibe-pkg-reply+xml"/>
+  <mime-type type="application/ibe-pp-data"/>
+  <mime-type type="application/iges"/>
+
+  <mime-type type="application/illustrator">
+    <acronym>AI</acronym>
+    <_comment>Adobe Illustrator Artwork</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/Adobe_Illustrator_Artwork</tika:link>
+    <glob pattern="*.ai"/>]
+    <sub-class-of type="application/postscript"/>
+  </mime-type>
+
+  <mime-type type="application/im-iscomposing+xml"/>
+  <mime-type type="application/index"/>
+  <mime-type type="application/index.cmd"/>
+  <mime-type type="application/index.obj"/>
+  <mime-type type="application/index.response"/>
+  <mime-type type="application/index.vnd"/>
+  <mime-type type="application/iotp"/>
+  <mime-type type="application/ipp"/>
+  <mime-type type="application/isup"/>
+
+  <mime-type type="application/java-archive">
+    <_comment>Java Archive</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/.jar</tika:link>
+    <tika:uti>com.sun.java-archive</tika:uti>
+    <sub-class-of type="application/zip"/>
+    <glob pattern="*.jar"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.android.package-archive">
+    <sub-class-of type="application/java-archive"/>
+    <glob pattern="*.apk"/>
+  </mime-type>
+  <mime-type type="application/x-tika-java-enterprise-archive">
+    <sub-class-of type="application/java-archive"/>
+    <glob pattern="*.ear"/>
+  </mime-type>
+  <mime-type type="application/x-tika-java-web-archive">
+    <sub-class-of type="application/java-archive"/>
+    <glob pattern="*.war"/>
+  </mime-type>
+
+  <mime-type type="application/x-tika-unix-dump"/>
+
+  <mime-type type="application/java-serialized-object">
+    <glob pattern="*.ser"/>
+  </mime-type>
+
+  <mime-type type="application/javascript">
+    <alias type="application/x-javascript"/>
+    <alias type="text/javascript"/>
+    <sub-class-of type="text/plain"/>
+    <_comment>JavaScript Source Code</_comment>
+    <glob pattern="*.js"/>
+  </mime-type>
+
+  <mime-type type="application/json">
+    <sub-class-of type="application/javascript"/>
+    <glob pattern="*.json"/>
+  </mime-type>
+
+  <mime-type type="application/java-vm">
+    <_comment>Java Class File</_comment>
+    <alias type="application/x-java-vm"/>
+    <alias type="application/x-java"/>
+    <magic priority="40">
+      <match value="0xcafebabe" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.class"/>
+  </mime-type>
+
+  <mime-type type="application/x-java-jnilib">
+    <_comment>Java Native Library for OSX</_comment>
+    <magic priority="50">
+      <match value="0xcafebabe" type="string" offset="0">
+        <match value="0xfeedface" type="string" offset="4096"/>
+        <match value="0xfeedfacf" type="string" offset="4096"/>
+        <match value="0xcefaedfe" type="string" offset="4096"/>
+        <match value="0xcffaedfe" type="string" offset="4096"/>
+      </match>
+    </magic>
+    <glob pattern="*.jnilib"/>
+  </mime-type>
+
+  <mime-type type="application/kpml-request+xml"/>
+  <mime-type type="application/kpml-response+xml"/>
+  <mime-type type="application/lost+xml">
+    <glob pattern="*.lostxml"/>
+  </mime-type>
+
+  <mime-type type="application/mac-binhex40">
+    <alias type="application/mac-binhex"/>
+    <alias type="application/binhex"/>
+    <magic priority="50">
+      <match value="must\ be\ converted\ with\ BinHex" type="string" offset="11"/>
+    </magic>
+    <glob pattern="*.hqx"/>
+  </mime-type>
+
+  <mime-type type="application/mac-compactpro">
+    <glob pattern="*.cpt"/>
+  </mime-type>
+
+  <mime-type type="application/macwriteii"/>
+  <mime-type type="application/marc">
+    <glob pattern="*.mrc"/>
+  </mime-type>
+  <mime-type type="application/mathematica">
+    <glob pattern="*.ma"/>
+    <glob pattern="*.nb"/>
+    <glob pattern="*.mb"/>
+  </mime-type>
+  <mime-type type="application/mathml+xml">
+    <glob pattern="*.mathml"/>
+  </mime-type>
+  <mime-type type="application/mbms-associated-procedure-description+xml"/>
+  <mime-type type="application/mbms-deregister+xml"/>
+  <mime-type type="application/mbms-envelope+xml"/>
+  <mime-type type="application/mbms-msk+xml"/>
+  <mime-type type="application/mbms-msk-response+xml"/>
+  <mime-type type="application/mbms-protection-description+xml"/>
+  <mime-type type="application/mbms-reception-report+xml"/>
+  <mime-type type="application/mbms-register+xml"/>
+  <mime-type type="application/mbms-register-response+xml"/>
+  <mime-type type="application/mbms-user-service-description+xml"/>
+  <mime-type type="application/mbox">
+    <sub-class-of type="text/plain"/>
+    <glob pattern="*.mbox"/>
+  </mime-type>
+  <mime-type type="application/media_control+xml"/>
+  <mime-type type="application/mediaservercontrol+xml">
+    <glob pattern="*.mscml"/>
+  </mime-type>
+  <mime-type type="application/mikey"/>
+  <mime-type type="application/moss-keys"/>
+  <mime-type type="application/moss-signature"/>
+  <mime-type type="application/mosskey-data"/>
+  <mime-type type="application/mosskey-request"/>
+  <mime-type type="application/mp4">
+    <glob pattern="*.mp4s"/>
+  </mime-type>
+  <mime-type type="application/mpeg4-generic"/>
+  <mime-type type="application/mpeg4-iod"/>
+  <mime-type type="application/mpeg4-iod-xmt"/>
+
+  <!-- http://www.iana.org/assignments/media-types/application/msword -->
+  <mime-type type="application/msword">
+    <!-- Use DefaultDetector / org.apache.tika.parser.microsoft.POIFSContainerDetector for more reliable detection of OLE2 documents -->
+    <alias type="application/vnd.ms-word"/>
+    <_comment>Microsoft Word Document</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/.doc</tika:link>
+    <tika:uti>com.microsoft.word.doc</tika:uti>
+    <magic priority="50">
+      <match value="Microsoft\ Word\ 6.0\ Document" type="string" offset="2080"/>
+      <match value="Documento\ Microsoft\ Word\ 6" type="string" offset="2080"/>
+      <match value="MSWordDoc" type="string" offset="2112"/>
+      <match value="0x31be0000" type="big32" offset="0"/>
+      <match value="PO^Q`" type="string" offset="0"/>
+      <match value="\376\067\0\043" type="string" offset="0"/>
+      <match value="\333\245-\0\0\0" type="string" offset="0"/>
+      <match value="\224\246\056" type="string" offset="0"/>
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="W\x00o\x00r\x00d\x00D\x00o\x00c\x00u\x00m\x00e\x00n\x00t" type="string" offset="1152:4096" />
+      </match>
+    </magic>
+    <glob pattern="*.doc"/>
+    <glob pattern="*.dot"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/msword2">
+    <!-- Pre-OLE2, not a subtype of application/x-tika-msoffice -->
+    <_comment>Microsoft Word 2 Document</_comment>
+    <magic priority="50">
+      <match value="0x9ba5" type="string" />
+      <match value="0xdba5" type="string" />
+    </magic>
+  </mime-type>
+  <mime-type type="application/msword5">
+    <!-- Pre-OLE2, not a subtype of application/x-tika-msoffice -->
+    <_comment>Microsoft Word 5 Document</_comment>
+    <magic priority="50">
+      <match value="0xfe37" type="string" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/mxf">
+    <glob pattern="*.mxf"/>
+  </mime-type>
+  <mime-type type="application/nasdata"/>
+  <mime-type type="application/news-checkgroups"/>
+  <mime-type type="application/news-groupinfo"/>
+  <mime-type type="application/news-transmission"/>
+  <mime-type type="application/nss"/>
+  <mime-type type="application/ocsp-request"/>
+  <mime-type type="application/ocsp-response"/>
+
+  <mime-type type="application/octet-stream">
+    <magic priority="50">
+      <match value="#\ This\ is\ a\ shell\ archive" type="string" offset="10"/>
+      <match value="\037\036" type="string" offset="0"/>
+      <match value="017437" type="host16" offset="0"/>
+      <match value="0x1fff" type="host16" offset="0"/>
+      <match value="\377\037" type="string" offset="0"/>
+      <match value="0145405" type="host16" offset="0"/>
+    </magic>
+    <glob pattern="*.bin"/>
+    <glob pattern="*.dms"/>
+    <glob pattern="*.lha"/>
+    <glob pattern="*.lrf"/>
+    <glob pattern="*.lzh"/>
+    <glob pattern="*.so"/>
+    <glob pattern="*.dist"/>
+    <glob pattern="*.distz"/>
+    <glob pattern="*.pkg"/>
+    <glob pattern="*.bpk"/>
+    <glob pattern="*.dump"/>
+    <glob pattern="*.elc"/>
+    <glob pattern="*.deploy"/>
+  </mime-type>
+
+  <mime-type type="application/oda">
+    <glob pattern="*.oda"/>
+  </mime-type>
+  <mime-type type="application/oebps-package+xml">
+    <glob pattern="*.opf"/>
+  </mime-type>
+
+  <mime-type type="application/ogg">
+    <alias type="application/x-ogg"/>
+    <magic priority="50">
+      <match value="OggS" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.ogx"/>
+  </mime-type>
+  <mime-type type="application/kate">
+    <sub-class-of type="application/ogg"/>
+  </mime-type>
+
+  <mime-type type="application/onenote">
+    <glob pattern="*.onetoc"/>
+    <glob pattern="*.onetoc2"/>
+    <glob pattern="*.onetmp"/>
+    <glob pattern="*.onepkg"/>
+  </mime-type>
+  <mime-type type="application/parityfec"/>
+  <mime-type type="application/patch-ops-error+xml">
+    <glob pattern="*.xer"/>
+  </mime-type>
+
+  <mime-type type="application/pdf">
+    <alias type="application/x-pdf"/>
+    <acronym>PDF</acronym>
+    <_comment>Portable Document Format</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/PDF</tika:link>
+    <tika:link>http://www.adobe.com/devnet/pdf/pdf_reference_archive.html</tika:link>
+    <tika:uti>com.adobe.pdf</tika:uti>
+    <magic priority="50">
+      <match value="%PDF-" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.pdf"/>
+  </mime-type>
+
+  <mime-type type="application/pgp-encrypted">
+    <alias type="application/pgp"/>
+    <glob pattern="*.pgp"/>
+  </mime-type>
+
+  <mime-type type="application/pgp-keys"/>
+
+  <mime-type type="application/pgp-signature">
+    <glob pattern="*.asc"/>
+    <glob pattern="*.sig"/>
+  </mime-type>
+
+  <mime-type type="application/pics-rules">
+    <glob pattern="*.prf"/>
+  </mime-type>
+  <mime-type type="application/pidf+xml"/>
+  <mime-type type="application/pidf-diff+xml"/>
+  <mime-type type="application/pkcs10">
+    <glob pattern="*.p10"/>
+  </mime-type>
+
+  <mime-type type="application/pkcs7-mime">
+    <glob pattern="*.p7m"/>
+    <glob pattern="*.p7c"/>
+  </mime-type>
+
+  <mime-type type="application/pkcs7-signature">
+    <glob pattern="*.p7s"/>
+    <magic priority="50">
+      <match value="-----BEGIN PKCS7" type="string" offset="0"/>
+      <match value="0x3082FFFF06092a864886f70d0107FFa0" type="string"
+              mask="0xFFFF0000FFFFFFFFFFFFFFFFFFFF00FF" offset="0"/>
+      <match value="0x308006092a864886f70d0107FFa0" type="string"
+              mask="0xFFFFFFFFFFFFFFFFFFFFFFFF00FF" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/pkix-cert">
+    <glob pattern="*.cer"/>
+  </mime-type>
+  <mime-type type="application/pkix-crl">
+    <glob pattern="*.crl"/>
+  </mime-type>
+  <mime-type type="application/pkix-pkipath">
+    <glob pattern="*.pkipath"/>
+  </mime-type>
+  <mime-type type="application/pkixcmp">
+    <glob pattern="*.pki"/>
+  </mime-type>
+  <mime-type type="application/pls+xml">
+    <glob pattern="*.pls"/>
+  </mime-type>
+  <mime-type type="application/poc-settings+xml"/>
+
+  <mime-type type="application/postscript">
+    <_comment>PostScript</_comment>
+    <magic priority="50">
+      <match value="%!" type="string" offset="0" />
+      <match value="\004%!" type="string" offset="0" />
+      <!-- Windows format EPS -->
+      <match value="0xc5d0d3c6" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.ps"/>
+    <glob pattern="*.eps"/>
+    <glob pattern="*.epsf"/>
+    <glob pattern="*.epsi"/>
+  </mime-type>
+
+  <mime-type type="application/prs.alvestrand.titrax-sheet"/>
+  <mime-type type="application/prs.cww">
+    <glob pattern="*.cww"/>
+  </mime-type>
+  <mime-type type="application/prs.nprend"/>
+  <mime-type type="application/prs.plucker"/>
+  <mime-type type="application/qsig"/>
+
+  <mime-type type="application/rdf+xml">
+    <root-XML localName="RDF"/>
+    <root-XML localName="RDF" namespaceURI="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>
+    <sub-class-of type="application/xml"/>
+    <acronym>RDF/XML</acronym>
+    <_comment>XML syntax for RDF graphs</_comment>
+    <glob pattern="*.rdf"/>
+    <glob pattern="*.owl"/>
+    <glob pattern="^rdf$" isregex="true"/>
+    <glob pattern="^owl$" isregex="true"/>
+    <glob pattern="*.xmp"/>
+  </mime-type>
+
+  <mime-type type="application/reginfo+xml">
+    <glob pattern="*.rif"/>
+  </mime-type>
+  <mime-type type="application/relax-ng-compact-syntax">
+    <sub-class-of type="text/plain"/>
+    <glob pattern="*.rnc"/>
+  </mime-type>
+  <mime-type type="application/remote-printing"/>
+  <mime-type type="application/resource-lists+xml">
+    <glob pattern="*.rl"/>
+  </mime-type>
+  <mime-type type="application/resource-lists-diff+xml">
+    <glob pattern="*.rld"/>
+  </mime-type>
+  <mime-type type="application/riscos"/>
+  <mime-type type="application/rlmi+xml"/>
+  <mime-type type="application/rls-services+xml">
+    <glob pattern="*.rs"/>
+  </mime-type>
+  <mime-type type="application/rsd+xml">
+    <glob pattern="*.rsd"/>
+  </mime-type>
+
+  <mime-type type="application/rss+xml">
+    <alias type="text/rss"/>
+    <root-XML localName="rss"/>
+    <root-XML namespaceURI="http://purl.org/rss/1.0/"/>
+    <glob pattern="*.rss"/>
+  </mime-type>
+
+  <mime-type type="application/rtf">
+    <_comment>Rich Text Format File</_comment>
+    <alias type="text/rtf"/>
+    <magic priority="50">
+      <match value="{\\rtf" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.rtf"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="application/rtx"/>
+  <mime-type type="application/samlassertion+xml"/>
+  <mime-type type="application/samlmetadata+xml"/>
+  <mime-type type="application/sbml+xml">
+    <glob pattern="*.sbml"/>
+  </mime-type>
+  <mime-type type="application/scvp-cv-request">
+    <glob pattern="*.scq"/>
+  </mime-type>
+  <mime-type type="application/scvp-cv-response">
+    <glob pattern="*.scs"/>
+  </mime-type>
+  <mime-type type="application/scvp-vp-request">
+    <glob pattern="*.spq"/>
+  </mime-type>
+  <mime-type type="application/scvp-vp-response">
+    <glob pattern="*.spp"/>
+  </mime-type>
+  <mime-type type="application/sdp">
+    <glob pattern="*.sdp"/>
+  </mime-type>
+  <mime-type type="application/set-payment"/>
+  <mime-type type="application/set-payment-initiation">
+    <glob pattern="*.setpay"/>
+  </mime-type>
+  <mime-type type="application/set-registration"/>
+  <mime-type type="application/set-registration-initiation">
+    <glob pattern="*.setreg"/>
+  </mime-type>
+  <mime-type type="application/sgml"/>
+  <mime-type type="application/sgml-open-catalog"/>
+  <mime-type type="application/shf+xml">
+    <glob pattern="*.shf"/>
+  </mime-type>
+  <mime-type type="application/sieve"/>
+  <mime-type type="application/simple-filter+xml"/>
+  <mime-type type="application/simple-message-summary"/>
+  <mime-type type="application/simplesymbolcontainer"/>
+  <mime-type type="application/slate"/>
+
+  <mime-type type="application/smil+xml">
+    <alias type="application/smil"/>
+    <_comment>SMIL Multimedia</_comment>
+    <glob pattern="*.smi"/>
+    <glob pattern="*.smil"/>
+    <glob pattern="*.sml"/>
+  </mime-type>
+
+  <mime-type type="application/soap+fastinfoset"/>
+  <mime-type type="application/soap+xml"/>
+
+  <mime-type type="application/sldworks">
+    <_comment>SolidWorks CAD program</_comment>
+    <glob pattern="*.sldprt" />
+    <glob pattern="*.sldasm" />
+    <glob pattern="*.slddrw" />
+    <sub-class-of type="application/x-tika-msoffice" />
+  </mime-type>
+
+  <mime-type type="application/sparql-query">
+    <glob pattern="*.rq"/>
+  </mime-type>
+  <mime-type type="application/sparql-results+xml">
+    <glob pattern="*.srx"/>
+  </mime-type>
+  <mime-type type="application/spirits-event+xml"/>
+  <mime-type type="application/srgs">
+    <glob pattern="*.gram"/>
+  </mime-type>
+  <mime-type type="application/srgs+xml">
+    <glob pattern="*.grxml"/>
+  </mime-type>
+  <mime-type type="application/ssml+xml">
+    <glob pattern="*.ssml"/>
+  </mime-type>
+  <mime-type type="application/timestamp-query"/>
+  <mime-type type="application/timestamp-reply"/>
+  <mime-type type="application/tve-trigger"/>
+  <mime-type type="application/ulpfec"/>
+  <mime-type type="application/vemmi"/>
+  <mime-type type="application/vividence.scriptfile"/>
+  <mime-type type="application/vnd.3gpp.bsf+xml"/>
+  <mime-type type="application/vnd.3gpp.pic-bw-large">
+    <glob pattern="*.plb"/>
+  </mime-type>
+  <mime-type type="application/vnd.3gpp.pic-bw-small">
+    <glob pattern="*.psb"/>
+  </mime-type>
+  <mime-type type="application/vnd.3gpp.pic-bw-var">
+    <glob pattern="*.pvb"/>
+  </mime-type>
+  <mime-type type="application/vnd.3gpp.sms"/>
+  <mime-type type="application/vnd.3gpp2.bcmcsinfo+xml"/>
+  <mime-type type="application/vnd.3gpp2.sms"/>
+  <mime-type type="application/vnd.3gpp2.tcap">
+    <glob pattern="*.tcap"/>
+  </mime-type>
+  <mime-type type="application/vnd.3m.post-it-notes">
+    <glob pattern="*.pwn"/>
+  </mime-type>
+  <mime-type type="application/vnd.accpac.simply.aso">
+    <glob pattern="*.aso"/>
+  </mime-type>
+  <mime-type type="application/vnd.accpac.simply.imp">
+    <glob pattern="*.imp"/>
+  </mime-type>
+  <mime-type type="application/vnd.acucobol">
+    <glob pattern="*.acu"/>
+  </mime-type>
+  <mime-type type="application/vnd.acucorp">
+    <glob pattern="*.atc"/>
+    <glob pattern="*.acutc"/>
+  </mime-type>
+  <mime-type type="application/vnd.adobe.air-application-installer-package+zip">
+    <glob pattern="*.air"/>
+  </mime-type>
+  <mime-type type="application/vnd.adobe.aftereffects.project">
+    <glob pattern="*.aep"/>
+  </mime-type>
+  <mime-type type="application/vnd.adobe.aftereffects.template">
+    <glob pattern="*.aet"/>
+  </mime-type>
+  <mime-type type="application/vnd.adobe.xdp+xml">
+    <glob pattern="*.xdp"/>
+  </mime-type>
+  <mime-type type="application/vnd.adobe.xfdf">
+    <glob pattern="*.xfdf"/>
+  </mime-type>
+  <mime-type type="application/vnd.aether.imp"/>
+  <mime-type type="application/vnd.airzip.filesecure.azf">
+    <glob pattern="*.azf"/>
+  </mime-type>
+  <mime-type type="application/vnd.airzip.filesecure.azs">
+    <glob pattern="*.azs"/>
+  </mime-type>
+  <mime-type type="application/vnd.amazon.ebook">
+    <glob pattern="*.azw"/>
+  </mime-type>
+  <mime-type type="application/vnd.americandynamics.acc">
+    <glob pattern="*.acc"/>
+  </mime-type>
+  <mime-type type="application/vnd.amiga.ami">
+    <glob pattern="*.ami"/>
+  </mime-type>
+  <mime-type type="application/vnd.anser-web-certificate-issue-initiation">
+    <glob pattern="*.cii"/>
+  </mime-type>
+  <mime-type type="application/vnd.anser-web-funds-transfer-initiation">
+    <glob pattern="*.fti"/>
+  </mime-type>
+  <mime-type type="application/vnd.antix.game-component">
+    <glob pattern="*.atx"/>
+  </mime-type>
+  <mime-type type="application/vnd.apple.installer+xml">
+    <glob pattern="*.mpkg"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.apple.iwork">
+    <sub-class-of type="application/zip"/>
+  </mime-type>
+  <mime-type type="application/vnd.apple.keynote">
+    <root-XML localName="presentation" namespaceURI="http://developer.apple.com/namespaces/keynote2" />
+    <sub-class-of type="application/vnd.apple.iwork" />
+    <glob pattern="*.key"/>
+  </mime-type>
+  <mime-type type="application/vnd.apple.pages">
+    <root-XML localName="document" namespaceURI="http://developer.apple.com/namespaces/sl" />
+    <sub-class-of type="application/vnd.apple.iwork" />
+    <glob pattern="*.pages"/>
+  </mime-type>
+  <mime-type type="application/vnd.apple.numbers">
+    <root-XML localName="document" namespaceURI="http://developer.apple.com/namespaces/ls" />
+    <sub-class-of type="application/vnd.apple.iwork" />
+    <glob pattern="*.numbers"/>
+  </mime-type>
+  <mime-type type="application/x-tika-iworks-protected">
+    <sub-class-of type="application/vnd.apple.iwork" />
+    <_comment>Password Protected iWorks File</_comment>
+  </mime-type>
+
+  <mime-type type="application/vnd.arastra.swi">
+    <glob pattern="*.swi"/>
+  </mime-type>
+  <mime-type type="application/vnd.audiograph"/>
+  <mime-type type="application/vnd.autopackage"/>
+  <mime-type type="application/vnd.avistar+xml"/>
+  <mime-type type="application/vnd.blueice.multipass">
+    <glob pattern="*.mpm"/>
+  </mime-type>
+  <mime-type type="application/vnd.bluetooth.ep.oob"/>
+  <mime-type type="application/vnd.bmi">
+    <glob pattern="*.bmi"/>
+  </mime-type>
+  <mime-type type="application/vnd.businessobjects">
+    <glob pattern="*.rep"/>
+  </mime-type>
+  <mime-type type="application/vnd.cab-jscript"/>
+  <mime-type type="application/vnd.canon-cpdl"/>
+  <mime-type type="application/vnd.canon-lips"/>
+  <mime-type type="application/vnd.cendio.thinlinc.clientconf"/>
+  <mime-type type="application/vnd.chemdraw+xml">
+    <glob pattern="*.cdxml"/>
+  </mime-type>
+  <mime-type type="application/vnd.chipnuts.karaoke-mmd">
+    <glob pattern="*.mmd"/>
+  </mime-type>
+  <mime-type type="application/vnd.cinderella">
+    <glob pattern="*.cdy"/>
+  </mime-type>
+  <mime-type type="application/vnd.cirpack.isdn-ext"/>
+  <mime-type type="application/vnd.claymore">
+    <glob pattern="*.cla"/>
+  </mime-type>
+  <mime-type type="application/vnd.clonk.c4group">
+    <glob pattern="*.c4g"/>
+    <glob pattern="*.c4d"/>
+    <glob pattern="*.c4f"/>
+    <glob pattern="*.c4p"/>
+    <glob pattern="*.c4u"/>
+  </mime-type>
+  <mime-type type="application/vnd.commerce-battelle"/>
+  <mime-type type="application/vnd.commonspace">
+    <glob pattern="*.csp"/>
+  </mime-type>
+  <mime-type type="application/vnd.contact.cmsg">
+    <glob pattern="*.cdbcmsg"/>
+  </mime-type>
+  <mime-type type="application/vnd.cosmocaller">
+    <glob pattern="*.cmc"/>
+  </mime-type>
+  <mime-type type="application/vnd.crick.clicker">
+    <glob pattern="*.clkx"/>
+  </mime-type>
+  <mime-type type="application/vnd.crick.clicker.keyboard">
+    <glob pattern="*.clkk"/>
+  </mime-type>
+  <mime-type type="application/vnd.crick.clicker.palette">
+    <glob pattern="*.clkp"/>
+  </mime-type>
+  <mime-type type="application/vnd.crick.clicker.template">
+    <glob pattern="*.clkt"/>
+  </mime-type>
+  <mime-type type="application/vnd.crick.clicker.wordbank">
+    <glob pattern="*.clkw"/>
+  </mime-type>
+  <mime-type type="application/vnd.criticaltools.wbs+xml">
+    <glob pattern="*.wbs"/>
+  </mime-type>
+  <mime-type type="application/vnd.ctc-posml">
+    <glob pattern="*.pml"/>
+  </mime-type>
+  <mime-type type="application/vnd.ctct.ws+xml"/>
+  <mime-type type="application/vnd.cups-pdf"/>
+  <mime-type type="application/vnd.cups-postscript"/>
+  <mime-type type="application/vnd.cups-ppd">
+    <glob pattern="*.ppd"/>
+  </mime-type>
+  <mime-type type="application/vnd.cups-raster"/>
+  <mime-type type="application/vnd.cups-raw"/>
+  <mime-type type="application/vnd.curl.car">
+    <glob pattern="*.car"/>
+  </mime-type>
+  <mime-type type="application/vnd.curl.pcurl">
+    <glob pattern="*.pcurl"/>
+  </mime-type>
+  <mime-type type="application/vnd.cybank"/>
+  <mime-type type="application/vnd.data-vision.rdz">
+    <glob pattern="*.rdz"/>
+  </mime-type>
+  <mime-type type="application/vnd.denovo.fcselayout-link">
+    <glob pattern="*.fe_launch"/>
+  </mime-type>
+  <mime-type type="application/vnd.dir-bi.plate-dl-nosuffix"/>
+  <mime-type type="application/vnd.dna">
+    <glob pattern="*.dna"/>
+  </mime-type>
+  <mime-type type="application/vnd.dolby.mlp">
+    <glob pattern="*.mlp"/>
+  </mime-type>
+  <mime-type type="application/vnd.dolby.mobile.1"/>
+  <mime-type type="application/vnd.dolby.mobile.2"/>
+  <mime-type type="application/vnd.dpgraph">
+    <glob pattern="*.dpg"/>
+  </mime-type>
+  <mime-type type="application/vnd.dreamfactory">
+    <glob pattern="*.dfac"/>
+  </mime-type>
+  <mime-type type="application/vnd.dvb.esgcontainer"/>
+  <mime-type type="application/vnd.dvb.ipdcdftnotifaccess"/>
+  <mime-type type="application/vnd.dvb.ipdcesgaccess"/>
+  <mime-type type="application/vnd.dvb.ipdcroaming"/>
+  <mime-type type="application/vnd.dvb.iptv.alfec-base"/>
+  <mime-type type="application/vnd.dvb.iptv.alfec-enhancement"/>
+  <mime-type type="application/vnd.dvb.notif-aggregate-root+xml"/>
+  <mime-type type="application/vnd.dvb.notif-container+xml"/>
+  <mime-type type="application/vnd.dvb.notif-generic+xml"/>
+  <mime-type type="application/vnd.dvb.notif-ia-msglist+xml"/>
+  <mime-type type="application/vnd.dvb.notif-ia-registration-request+xml"/>
+  <mime-type type="application/vnd.dvb.notif-ia-registration-response+xml"/>
+  <mime-type type="application/vnd.dvb.notif-init+xml"/>
+  <mime-type type="application/vnd.dxr"/>
+  <mime-type type="application/vnd.dynageo">
+    <glob pattern="*.geo"/>
+  </mime-type>
+  <mime-type type="application/vnd.ecdis-update"/>
+  <mime-type type="application/vnd.ecowin.chart">
+    <glob pattern="*.mag"/>
+  </mime-type>
+  <mime-type type="application/vnd.ecowin.filerequest"/>
+  <mime-type type="application/vnd.ecowin.fileupdate"/>
+  <mime-type type="application/vnd.ecowin.series"/>
+  <mime-type type="application/vnd.ecowin.seriesrequest"/>
+  <mime-type type="application/vnd.ecowin.seriesupdate"/>
+  <mime-type type="application/vnd.emclient.accessrequest+xml"/>
+  <mime-type type="application/vnd.enliven">
+    <glob pattern="*.nml"/>
+  </mime-type>
+  <mime-type type="application/vnd.epson.esf">
+    <glob pattern="*.esf"/>
+  </mime-type>
+  <mime-type type="application/vnd.epson.msf">
+    <glob pattern="*.msf"/>
+  </mime-type>
+  <mime-type type="application/vnd.epson.quickanime">
+    <glob pattern="*.qam"/>
+  </mime-type>
+  <mime-type type="application/vnd.epson.salt">
+    <glob pattern="*.slt"/>
+  </mime-type>
+  <mime-type type="application/vnd.epson.ssf">
+    <glob pattern="*.ssf"/>
+  </mime-type>
+  <mime-type type="application/vnd.ericsson.quickcall"/>
+  <mime-type type="application/vnd.eszigno3+xml">
+    <glob pattern="*.es3"/>
+    <glob pattern="*.et3"/>
+  </mime-type>
+  <mime-type type="application/vnd.etsi.aoc+xml"/>
+  <mime-type type="application/vnd.etsi.cug+xml"/>
+  <mime-type type="application/vnd.etsi.iptvcommand+xml"/>
+  <mime-type type="application/vnd.etsi.iptvdiscovery+xml"/>
+  <mime-type type="application/vnd.etsi.iptvprofile+xml"/>
+  <mime-type type="application/vnd.etsi.iptvsad-bc+xml"/>
+  <mime-type type="application/vnd.etsi.iptvsad-cod+xml"/>
+  <mime-type type="application/vnd.etsi.iptvsad-npvr+xml"/>
+  <mime-type type="application/vnd.etsi.iptvueprofile+xml"/>
+  <mime-type type="application/vnd.etsi.mcid+xml"/>
+  <mime-type type="application/vnd.etsi.sci+xml"/>
+  <mime-type type="application/vnd.etsi.simservs+xml"/>
+  <mime-type type="application/vnd.eudora.data"/>
+  <mime-type type="application/vnd.ezpix-album">
+    <glob pattern="*.ez2"/>
+  </mime-type>
+  <mime-type type="application/vnd.ezpix-package">
+    <glob pattern="*.ez3"/>
+  </mime-type>
+  <mime-type type="application/vnd.f-secure.mobile"/>
+  <mime-type type="application/vnd.fdf">
+    <acronym>FDF</acronym>
+    <_comment>Forms Data Format</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/Forms_Data_Format</tika:link>
+    <tika:link>http://www.adobe.com/devnet/acrobat/fdftoolkit.html</tika:link>
+    <tika:uti>com.adobe.fdf</tika:uti>
+    <magic priority="50">
+      <match value="%FDF-" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.fdf"/>
+  </mime-type>
+  <mime-type type="application/vnd.fdsn.mseed">
+    <glob pattern="*.mseed"/>
+  </mime-type>
+  <mime-type type="application/vnd.fdsn.seed">
+    <glob pattern="*.seed"/>
+    <glob pattern="*.dataless"/>
+  </mime-type>
+  <mime-type type="application/vnd.ffsns"/>
+  <mime-type type="application/vnd.fints"/>
+  <mime-type type="application/vnd.flographit">
+    <glob pattern="*.gph"/>
+  </mime-type>
+  <mime-type type="application/vnd.fluxtime.clip">
+    <glob pattern="*.ftc"/>
+  </mime-type>
+  <mime-type type="application/vnd.font-fontforge-sfd"/>
+  <mime-type type="application/vnd.framemaker">
+    <glob pattern="*.fm"/>
+    <glob pattern="*.frame"/>
+    <glob pattern="*.maker"/>
+    <glob pattern="*.book"/>
+  </mime-type>
+  <mime-type type="application/vnd.frogans.fnc">
+    <glob pattern="*.fnc"/>
+  </mime-type>
+  <mime-type type="application/vnd.frogans.ltf">
+    <glob pattern="*.ltf"/>
+  </mime-type>
+  <mime-type type="application/vnd.fsc.weblaunch">
+    <glob pattern="*.fsc"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujitsu.oasys">
+    <glob pattern="*.oas"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujitsu.oasys2">
+    <glob pattern="*.oa2"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujitsu.oasys3">
+    <glob pattern="*.oa3"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujitsu.oasysgp">
+    <glob pattern="*.fg5"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujitsu.oasysprs">
+    <glob pattern="*.bh2"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujixerox.art-ex"/>
+  <mime-type type="application/vnd.fujixerox.art4"/>
+  <mime-type type="application/vnd.fujixerox.hbpl"/>
+  <mime-type type="application/vnd.fujixerox.ddd">
+    <glob pattern="*.ddd"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujixerox.docuworks">
+    <glob pattern="*.xdw"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujixerox.docuworks.binder">
+    <glob pattern="*.xbd"/>
+  </mime-type>
+  <mime-type type="application/vnd.fut-misnet"/>
+  <mime-type type="application/vnd.fuzzysheet">
+    <glob pattern="*.fzs"/>
+  </mime-type>
+  <mime-type type="application/vnd.genomatix.tuxedo">
+    <glob pattern="*.txd"/>
+  </mime-type>
+  <mime-type type="application/vnd.geogebra.file">
+    <glob pattern="*.ggb"/>
+  </mime-type>
+  <mime-type type="application/vnd.geogebra.tool">
+    <glob pattern="*.ggt"/>
+  </mime-type>
+  <mime-type type="application/vnd.geometry-explorer">
+    <glob pattern="*.gex"/>
+    <glob pattern="*.gre"/>
+  </mime-type>
+  <mime-type type="application/vnd.gmx">
+    <glob pattern="*.gmx"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.google-earth.kml+xml">
+    <root-XML localName="kml"/>
+    <root-XML namespaceURI="http://www.opengis.net/kml/2.2" localName="kml"/>
+    <root-XML namespaceURI="http://earth.google.com/kml/2.0" localName="kml"/>
+    <root-XML namespaceURI="http://earth.google.com/kml/2.1" localName="kml"/>
+    <root-XML namespaceURI="http://earth.google.com/kml/2.2" localName="kml"/>
+    <acronym>KML</acronym>
+    <_comment>Keyhole Markup Language</_comment>
+    <glob pattern="*.kml"/>
+    <sub-class-of type="application/xml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.google-earth.kmz">
+    <sub-class-of type="application/zip"/>
+    <glob pattern="*.kmz"/>
+  </mime-type>
+  <mime-type type="application/vnd.grafeq">
+    <glob pattern="*.gqf"/>
+    <glob pattern="*.gqs"/>
+  </mime-type>
+  <mime-type type="application/vnd.gridmp"/>
+  <mime-type type="application/vnd.groove-account">
+    <glob pattern="*.gac"/>
+  </mime-type>
+  <mime-type type="application/vnd.groove-help">
+    <glob pattern="*.ghf"/>
+  </mime-type>
+  <mime-type type="application/vnd.groove-identity-message">
+    <glob pattern="*.gim"/>
+  </mime-type>
+  <mime-type type="application/vnd.groove-injector">
+    <glob pattern="*.grv"/>
+  </mime-type>
+  <mime-type type="application/vnd.groove-tool-message">
+    <glob pattern="*.gtm"/>
+  </mime-type>
+  <mime-type type="application/vnd.groove-tool-template">
+    <glob pattern="*.tpl"/>
+  </mime-type>
+  <mime-type type="application/vnd.groove-vcard">
+    <glob pattern="*.vcg"/>
+  </mime-type>
+  <mime-type type="application/vnd.handheld-entertainment+xml">
+    <glob pattern="*.zmm"/>
+  </mime-type>
+  <mime-type type="application/vnd.hbci">
+    <glob pattern="*.hbci"/>
+  </mime-type>
+  <mime-type type="application/vnd.hcl-bireports"/>
+  <mime-type type="application/vnd.hhe.lesson-player">
+    <glob pattern="*.les"/>
+  </mime-type>
+  <mime-type type="application/vnd.hp-hpgl">
+    <glob pattern="*.hpgl"/>
+  </mime-type>
+  <mime-type type="application/vnd.hp-hpid">
+    <glob pattern="*.hpid"/>
+  </mime-type>
+  <mime-type type="application/vnd.hp-hps">
+    <glob pattern="*.hps"/>
+  </mime-type>
+  <mime-type type="application/vnd.hp-jlyt">
+    <glob pattern="*.jlt"/>
+  </mime-type>
+  <mime-type type="application/vnd.hp-pcl">
+    <glob pattern="*.pcl"/>
+  </mime-type>
+  <mime-type type="application/vnd.hp-pclxl">
+    <glob pattern="*.pclxl"/>
+  </mime-type>
+  <mime-type type="application/vnd.httphone"/>
+  <mime-type type="application/vnd.hydrostatix.sof-data">
+    <glob pattern="*.sfd-hdstx"/>
+  </mime-type>
+  <mime-type type="application/vnd.hzn-3d-crossword">
+    <glob pattern="*.x3d"/>
+  </mime-type>
+  <mime-type type="application/vnd.ibm.afplinedata"/>
+  <mime-type type="application/vnd.ibm.electronic-media"/>
+  <mime-type type="application/vnd.ibm.minipay">
+    <glob pattern="*.mpy"/>
+  </mime-type>
+  <mime-type type="application/vnd.ibm.modcap">
+    <glob pattern="*.afp"/>
+    <glob pattern="*.listafp"/>
+    <glob pattern="*.list3820"/>
+  </mime-type>
+  <mime-type type="application/vnd.ibm.rights-management">
+    <glob pattern="*.irm"/>
+  </mime-type>
+  <mime-type type="application/vnd.ibm.secure-container">
+    <glob pattern="*.sc"/>
+  </mime-type>
+  <mime-type type="application/vnd.iccprofile">
+    <glob pattern="*.icc"/>
+    <glob pattern="*.icm"/>
+  </mime-type>
+  <mime-type type="application/vnd.igloader">
+    <glob pattern="*.igl"/>
+  </mime-type>
+  <mime-type type="application/vnd.immervision-ivp">
+    <glob pattern="*.ivp"/>
+  </mime-type>
+  <mime-type type="application/vnd.immervision-ivu">
+    <glob pattern="*.ivu"/>
+  </mime-type>
+  <mime-type type="application/vnd.informedcontrol.rms+xml"/>
+  <mime-type type="application/vnd.informix-visionary"/>
+  <mime-type type="application/vnd.intercon.formnet">
+    <glob pattern="*.xpw"/>
+    <glob pattern="*.xpx"/>
+  </mime-type>
+  <mime-type type="application/vnd.intertrust.digibox"/>
+  <mime-type type="application/vnd.intertrust.nncp"/>
+  <mime-type type="application/vnd.intu.qbo">
+    <glob pattern="*.qbo"/>
+  </mime-type>
+  <mime-type type="application/vnd.intu.qfx">
+    <glob pattern="*.qfx"/>
+  </mime-type>
+  <mime-type type="application/vnd.iptc.g2.conceptitem+xml"/>
+  <mime-type type="application/vnd.iptc.g2.knowledgeitem+xml"/>
+  <mime-type type="application/vnd.iptc.g2.newsitem+xml"/>
+  <mime-type type="application/vnd.iptc.g2.packageitem+xml"/>
+  <mime-type type="application/vnd.ipunplugged.rcprofile">
+    <glob pattern="*.rcprofile"/>
+  </mime-type>
+  <mime-type type="application/vnd.irepository.package+xml">
+    <glob pattern="*.irp"/>
+  </mime-type>
+  <mime-type type="application/vnd.is-xpr">
+    <glob pattern="*.xpr"/>
+  </mime-type>
+  <mime-type type="application/vnd.jam">
+    <glob pattern="*.jam"/>
+  </mime-type>
+  <mime-type type="application/vnd.japannet-directory-service"/>
+  <mime-type type="application/vnd.japannet-jpnstore-wakeup"/>
+  <mime-type type="application/vnd.japannet-payment-wakeup"/>
+  <mime-type type="application/vnd.japannet-registration"/>
+  <mime-type type="application/vnd.japannet-registration-wakeup"/>
+  <mime-type type="application/vnd.japannet-setstore-wakeup"/>
+  <mime-type type="application/vnd.japannet-verification"/>
+  <mime-type type="application/vnd.japannet-verification-wakeup"/>
+  <mime-type type="application/vnd.jcp.javame.midlet-rms">
+    <glob pattern="*.rms"/>
+  </mime-type>
+  <mime-type type="application/vnd.jisp">
+    <glob pattern="*.jisp"/>
+  </mime-type>
+  <mime-type type="application/vnd.joost.joda-archive">
+    <glob pattern="*.joda"/>
+  </mime-type>
+  <mime-type type="application/vnd.kahootz">
+    <glob pattern="*.ktz"/>
+    <glob pattern="*.ktr"/>
+  </mime-type>
+  <mime-type type="application/vnd.kde.karbon">
+    <glob pattern="*.karbon"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kchart">
+    <alias type="application/x-kchart"/>
+    <_comment>KChart File</_comment>
+    <glob pattern="*.chrt"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kformula">
+    <glob pattern="*.kfo"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kivio">
+    <glob pattern="*.flw"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kontour">
+    <glob pattern="*.kon"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kpresenter">
+    <alias type="application/x-kpresenter"/>
+    <_comment>KPresenter File</_comment>
+    <glob pattern="*.kpr"/>
+    <glob pattern="*.kpt"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kspread">
+    <alias type="application/x-kspread"/>
+    <_comment>KSpread File</_comment>
+    <glob pattern="*.ksp"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kword">
+    <alias type="application/x-kword"/>
+    <_comment>KWord File</_comment>
+    <glob pattern="*.kwd"/>
+    <glob pattern="*.kwt"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kenameaapp">
+    <glob pattern="*.htke"/>
+  </mime-type>
+  <mime-type type="application/vnd.kidspiration">
+    <glob pattern="*.kia"/>
+  </mime-type>
+  <mime-type type="application/vnd.kinar">
+    <glob pattern="*.kne"/>
+    <glob pattern="*.knp"/>
+  </mime-type>
+  <mime-type type="application/vnd.koan">
+    <alias type="application/x-koan"/>
+    <_comment>SSEYO Koan File</_comment>
+    <glob pattern="*.skp"/>
+    <glob pattern="*.skd"/>
+    <glob pattern="*.skt"/>
+    <glob pattern="*.skm"/>
+  </mime-type>
+  <mime-type type="application/vnd.kodak-descriptor">
+    <glob pattern="*.sse"/>
+  </mime-type>
+  <mime-type type="application/vnd.liberty-request+xml"/>
+  <mime-type type="application/vnd.llamagraphics.life-balance.desktop">
+    <glob pattern="*.lbd"/>
+  </mime-type>
+  <mime-type type="application/vnd.llamagraphics.life-balance.exchange+xml">
+    <glob pattern="*.lbe"/>
+  </mime-type>
+  <mime-type type="application/vnd.lotus-1-2-3">
+    <glob pattern="*.123"/>
+  </mime-type>
+  <mime-type type="application/vnd.lotus-approach">
+    <glob pattern="*.apr"/>
+  </mime-type>
+  <mime-type type="application/vnd.lotus-freelance">
+    <glob pattern="*.pre"/>
+  </mime-type>
+  <mime-type type="application/vnd.lotus-notes">
+    <glob pattern="*.nsf"/>
+  </mime-type>
+  <mime-type type="application/vnd.lotus-organizer">
+    <glob pattern="*.org"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.lotus-screencam">
+    <!-- <glob pattern="*.scm"/> - conflicts with text/x-scheme -->
+  </mime-type>
+
+  <mime-type type="application/vnd.lotus-wordpro">
+    <magic priority="50">
+      <match value="WordPro\0" type="string" offset="0" />
+      <match value="WordPro\r\373" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.lwp"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.macports.portpkg">
+    <glob pattern="*.portpkg"/>
+  </mime-type>
+  <mime-type type="application/vnd.marlin.drm.actiontoken+xml"/>
+  <mime-type type="application/vnd.marlin.drm.conftoken+xml"/>
+  <mime-type type="application/vnd.marlin.drm.license+xml"/>
+  <mime-type type="application/vnd.marlin.drm.mdcf"/>
+  <mime-type type="application/vnd.mcd">
+    <glob pattern="*.mcd"/>
+  </mime-type>
+  <mime-type type="application/vnd.medcalcdata">
+    <glob pattern="*.mc1"/>
+  </mime-type>
+  <mime-type type="application/vnd.mediastation.cdkey">
+    <glob pattern="*.cdkey"/>
+  </mime-type>
+  <mime-type type="application/vnd.meridian-slingshot"/>
+  <mime-type type="application/vnd.mfer">
+    <glob pattern="*.mwf"/>
+  </mime-type>
+  <mime-type type="application/vnd.mfmp">
+    <glob pattern="*.mfm"/>
+  </mime-type>
+  <mime-type type="application/vnd.micrografx.flo">
+    <glob pattern="*.flo"/>
+  </mime-type>
+  <mime-type type="application/vnd.micrografx.igx">
+    <glob pattern="*.igx"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.mif">
+    <_comment>FrameMaker Interchange Format</_comment>
+    <alias type="application/x-mif"/>
+    <alias type="application/x-frame"/>
+    <magic priority="50">
+      <match value="\&lt;MakerFile" type="string" offset="0" />
+      <match value="\&lt;MIFFile" type="string" offset="0" />
+      <match value="\&lt;MakerDictionary" type="string" offset="0" />
+      <match value="\&lt;MakerScreenFont" type="string" offset="0" />
+      <match value="\&lt;MML" type="string" offset="0" />
+      <match value="\&lt;Book" type="string" offset="0" />
+      <match value="\&lt;Maker" type="string" offset="0" />
+      <match value="\x3c\x4d\x49\x46\x46\x69\x6c\x65\x20" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.mif"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.mindjet.mindmanager">
+    <_comment>MindManager</_comment>
+    <sub-class-of type="application/zip"/>
+    <glob pattern="*.mmp"/>
+    <glob pattern="*.mmap"/>
+    <glob pattern="*.mmpt"/>
+    <glob pattern="*.mmat"/>
+    <glob pattern="*.mmmp"/>
+    <glob pattern="*.mmas"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.minisoft-hp3000-save"/>
+  <mime-type type="application/vnd.mitsubishi.misty-guard.trustweb"/>
+  <mime-type type="application/vnd.mobius.daf">
+    <glob pattern="*.daf"/>
+  </mime-type>
+  <mime-type type="application/vnd.mobius.dis">
+    <glob pattern="*.dis"/>
+  </mime-type>
+  <mime-type type="application/vnd.mobius.mbk">
+    <glob pattern="*.mbk"/>
+  </mime-type>
+  <mime-type type="application/vnd.mobius.mqy">
+    <glob pattern="*.mqy"/>
+  </mime-type>
+  <mime-type type="application/vnd.mobius.msl">
+    <glob pattern="*.msl"/>
+  </mime-type>
+  <mime-type type="application/vnd.mobius.plc">
+    <glob pattern="*.plc"/>
+  </mime-type>
+  <mime-type type="application/vnd.mobius.txf">
+    <glob pattern="*.txf"/>
+  </mime-type>
+  <mime-type type="application/vnd.mophun.application">
+    <glob pattern="*.mpn"/>
+  </mime-type>
+  <mime-type type="application/vnd.mophun.certificate">
+    <glob pattern="*.mpc"/>
+  </mime-type>
+  <mime-type type="application/vnd.motorola.flexsuite"/>
+  <mime-type type="application/vnd.motorola.flexsuite.adsi"/>
+  <mime-type type="application/vnd.motorola.flexsuite.fis"/>
+  <mime-type type="application/vnd.motorola.flexsuite.gotap"/>
+  <mime-type type="application/vnd.motorola.flexsuite.kmr"/>
+  <mime-type type="application/vnd.motorola.flexsuite.ttc"/>
+  <mime-type type="application/vnd.motorola.flexsuite.wem"/>
+  <mime-type type="application/vnd.motorola.iprm"/>
+  <mime-type type="application/vnd.mozilla.xul+xml">
+    <glob pattern="*.xul"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-artgalry">
+    <glob pattern="*.cil"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-asf"/>
+  <mime-type type="application/vnd.ms-cab-compressed">
+    <glob pattern="*.cab"/>
+  </mime-type>
+
+  <!-- http://www.iana.org/assignments/media-types/application/vnd.ms-excel -->
+  <mime-type type="application/vnd.ms-excel">
+    <!-- Use DefaultDetector / org.apache.tika.parser.microsoft.POIFSContainerDetector for more reliable detection of OLE2 documents -->
+    <alias type="application/msexcel" />
+    <_comment>Microsoft Excel Spreadsheet</_comment>
+    <magic priority="50">
+      <match value="Microsoft\ Excel\ 5.0\ Worksheet" type="string" offset="2080"/>
+      <match value="Foglio\ di\ lavoro\ Microsoft\ Exce" type="string" offset="2080"/>
+      <match value="Biff5" type="string" offset="2114"/>
+      <match value="Biff5" type="string" offset="2121"/>
+      <match value="\x09\x04\x06\x00\x00\x00\x10\x00" type="string" offset="0"/>
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="W\x00o\x00r\x00k\x00b\x00o\x00o\x00k" type="string" offset="1152:4096" />
+      </match>
+    </magic>
+    <glob pattern="*.xls"/>
+    <glob pattern="*.xlm"/>
+    <glob pattern="*.xla"/>
+    <glob pattern="*.xlc"/>
+    <glob pattern="*.xlt"/>
+    <glob pattern="*.xlw"/>
+    <glob pattern="*.xll"/>
+    <glob pattern="*.xld"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-excel.addin.macroenabled.12">
+    <_comment>Office Open XML Workbook Add-in (macro-enabled)</_comment>
+    <glob pattern="*.xlam"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-excel.sheet.macroenabled.12">
+    <_comment>Office Open XML Workbook (macro-enabled)</_comment>
+    <glob pattern="*.xlsm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-excel.sheet.binary.macroenabled.12">
+    <_comment>Microsoft Excel 2007 Binary Spreadsheet</_comment>
+    <glob pattern="*.xlsb"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-fontobject">
+    <glob pattern="*.eot"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-htmlhelp">
+    <glob pattern="*.chm"/>
+    <magic priority="50">
+      <match value="ITSF" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+  <mime-type type="application/vnd.ms-ims">
+    <glob pattern="*.ims"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-lrm">
+    <glob pattern="*.lrm"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-outlook">
+    <_comment>Microsoft Outlook Message</_comment>
+    <glob pattern="*.msg" />
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-outlook-pst">
+    <_comment>Outlook Personal Folders File Format</_comment>
+    <magic priority="50">
+       <match value="!BDN....SM" type="string" offset="0" mask="0xFFFFFFFF00000000FFFF"/>
+    </magic> 
+    <glob pattern="*.pst"/>
+    <glob pattern="*.ost"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-pki.seccat">
+    <glob pattern="*.cat"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-pki.stl">
+    <glob pattern="*.stl"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-playready.initiator+xml"/>
+
+  <!-- http://www.iana.org/assignments/media-types/application/vnd.ms-powerpoint -->
+  <mime-type type="application/vnd.ms-powerpoint">
+    <!-- Use DefaultDetector / org.apache.tika.parser.microsoft.POIFSContainerDetector for more reliable detection of OLE2 documents -->
+    <alias type="application/mspowerpoint"/>
+    <_comment>Microsoft Powerpoint Presentation</_comment>
+    <magic priority="50">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="P\x00o\x00w\x00e\x00r\x00P\x00o\x00i\x00n\x00t\x00 D\x00o\x00c\x00u\x00m\x00e\x00n\x00t" type="string" offset="1152:4096" />
+      </match>
+    </magic>
+    <glob pattern="*.ppt"/>
+    <glob pattern="*.ppz"/>
+    <glob pattern="*.pps"/>
+    <glob pattern="*.pot"/>
+    <glob pattern="*.ppa"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-powerpoint.addin.macroenabled.12">
+    <_comment>Office Open XML Presentation Add-in (macro-enabled)</_comment>
+    <glob pattern="*.ppam"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-powerpoint.presentation.macroenabled.12">
+    <_comment>Office Open XML Presentation (macro-enabled)</_comment>
+    <glob pattern="*.pptm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-powerpoint.slide.macroenabled.12">
+    <glob pattern="*.sldm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-powerpoint.slideshow.macroenabled.12">
+    <_comment>Office Open XML Presentation Slideshow (macro-enabled)</_comment>
+    <glob pattern="*.ppsm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-powerpoint.template.macroenabled.12">
+    <glob pattern="*.potm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-project">
+    <glob pattern="*.mpp"/>
+    <glob pattern="*.mpt"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/x-project">
+    <glob pattern="*.mpx"/>
+    <magic priority="50">
+      <match value="MPX,Microsoft Project for Windows," type="string" offset="0"/>
+    </magic>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-tnef">
+    <alias type="application/ms-tnef" />
+    <magic priority="50">
+      <match value="0x223e9f78" type="little32" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-wmdrm.lic-chlg-req"/>
+  <mime-type type="application/vnd.ms-wmdrm.lic-resp"/>
+  <mime-type type="application/vnd.ms-wmdrm.meter-chlg-req"/>
+  <mime-type type="application/vnd.ms-wmdrm.meter-resp"/>
+
+  <mime-type type="application/vnd.ms-word.document.macroenabled.12">
+    <_comment>Office Open XML Document (macro-enabled)</_comment>
+    <glob pattern="*.docm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-word.template.macroenabled.12">
+    <_comment>Office Open XML Document Template (macro-enabled)</_comment>
+    <glob pattern="*.dotm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-works">
+    <magic priority="50">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="M\x00a\x00t\x00O\x00S\x00T" type="string" offset="1152:4096" />
+      </match>
+    </magic>
+    <glob pattern="*.wps"/>
+    <glob pattern="*.wks"/>
+    <glob pattern="*.wcm"/>
+    <glob pattern="*.wdb"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-wpl">
+    <glob pattern="*.wpl"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-xpsdocument">
+    <alias type="application/oxps"/>
+    <_comment>Open XML Paper Specification</_comment>
+    <glob pattern="*.xps"/>
+    <glob pattern="*.oxps"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+  <mime-type type="application/vnd.mseq">
+    <glob pattern="*.mseq"/>
+  </mime-type>
+  <mime-type type="application/vnd.msign"/>
+  <mime-type type="application/vnd.multiad.creator"/>
+  <mime-type type="application/vnd.multiad.creator.cif"/>
+  <mime-type type="application/vnd.music-niff"/>
+  <mime-type type="application/vnd.musician">
+    <glob pattern="*.mus"/>
+  </mime-type>
+  <mime-type type="application/vnd.muvee.style">
+    <glob pattern="*.msty"/>
+  </mime-type>
+  <mime-type type="application/vnd.ncd.control"/>
+  <mime-type type="application/vnd.ncd.reference"/>
+  <mime-type type="application/vnd.nervana"/>
+  <mime-type type="application/vnd.netfpx"/>
+  <mime-type type="application/vnd.neurolanguage.nlu">
+    <glob pattern="*.nlu"/>
+  </mime-type>
+  <mime-type type="application/vnd.noblenet-directory">
+    <glob pattern="*.nnd"/>
+  </mime-type>
+  <mime-type type="application/vnd.noblenet-sealer">
+    <glob pattern="*.nns"/>
+  </mime-type>
+  <mime-type type="application/vnd.noblenet-web">
+    <glob pattern="*.nnw"/>
+  </mime-type>
+  <mime-type type="application/vnd.nokia.catalogs"/>
+  <mime-type type="application/vnd.nokia.conml+wbxml"/>
+  <mime-type type="application/vnd.nokia.conml+xml"/>
+  <mime-type type="application/vnd.nokia.isds-radio-presets"/>
+  <mime-type type="application/vnd.nokia.iptv.config+xml"/>
+  <mime-type type="application/vnd.nokia.landmark+wbxml"/>
+  <mime-type type="application/vnd.nokia.landmark+xml"/>
+  <mime-type type="application/vnd.nokia.landmarkcollection+xml"/>
+  <mime-type type="application/vnd.nokia.n-gage.ac+xml"/>
+  <mime-type type="application/vnd.nokia.n-gage.data">
+    <glob pattern="*.ngdat"/>
+  </mime-type>
+  <mime-type type="application/vnd.nokia.n-gage.symbian.install">
+    <glob pattern="*.n-gage"/>
+  </mime-type>
+  <mime-type type="application/vnd.nokia.ncd"/>
+  <mime-type type="application/vnd.nokia.pcd+wbxml"/>
+  <mime-type type="application/vnd.nokia.pcd+xml"/>
+  <mime-type type="application/vnd.nokia.radio-preset">
+    <glob pattern="*.rpst"/>
+  </mime-type>
+  <mime-type type="application/vnd.nokia.radio-presets">
+    <glob pattern="*.rpss"/>
+  </mime-type>
+  <mime-type type="application/vnd.novadigm.edm">
+    <glob pattern="*.edm"/>
+  </mime-type>
+  <mime-type type="application/vnd.novadigm.edx">
+    <glob pattern="*.edx"/>
+  </mime-type>
+  <mime-type type="application/vnd.novadigm.ext">
+    <glob pattern="*.ext"/>
+  </mime-type>
+
+  <!-- =================================================================== -->
+  <!-- Open Document Format for Office Applications (OpenDocument) v1.0    -->
+  <!-- http://www.oasis-open.org/specs/index.php#opendocumentv1.0          -->
+  <!-- =================================================================== -->
+
+  <mime-type type="application/vnd.oasis.opendocument.chart">
+    <alias type="application/x-vnd.oasis.opendocument.chart"/>
+    <_comment>OpenDocument v1.0: Chart document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.chart"/>
+      </match>
+    </magic>
+    <glob pattern="*.odc"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.chart-template">
+    <alias type="application/x-vnd.oasis.opendocument.chart-template"/>
+    <_comment>OpenDocument v1.0: Chart document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.chart-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.otc"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.database">
+    <glob pattern="*.odb"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.formula">
+    <alias type="application/x-vnd.oasis.opendocument.formula"/>
+    <_comment>OpenDocument v1.0: Formula document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.formula" />
+      </match>
+    </magic>
+    <glob pattern="*.odf"/>
+    <sub-class-of type="application/zip"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.formula-template">
+    <alias type="application/x-vnd.oasis.opendocument.formula-template"/>
+    <_comment>OpenDocument v1.0: Formula document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.formula-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.odft"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.graphics">
+    <alias type="application/x-vnd.oasis.opendocument.graphics"/>
+    <_comment>OpenDocument v1.0: Graphics document (Drawing)</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.graphics"/>
+      </match>
+    </magic>
+    <glob pattern="*.odg"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.graphics-template">
+    <alias type="application/x-vnd.oasis.opendocument.graphics-template"/>
+    <_comment>OpenDocument v1.0: Graphics document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.graphics-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.otg"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.image">
+    <alias type="application/x-vnd.oasis.opendocument.image"/>
+    <_comment>OpenDocument v1.0: Image document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.image"/>
+      </match>
+    </magic>
+    <glob pattern="*.odi"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.image-template">
+    <alias type="application/x-vnd.oasis.opendocument.image-template"/>
+    <_comment>OpenDocument v1.0: Image document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.image-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.oti"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.presentation">
+    <alias type="application/x-vnd.oasis.opendocument.presentation"/>
+    <_comment>OpenDocument v1.0: Presentation document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.presentation"/>
+      </match>
+    </magic>
+    <glob pattern="*.odp"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.presentation-template">
+    <alias type="application/x-vnd.oasis.opendocument.presentation-template"/>
+    <_comment>OpenDocument v1.0: Presentation document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+              value="mimetypeapplication/vnd.oasis.opendocument.presentation-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.otp"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.spreadsheet">
+    <alias type="application/x-vnd.oasis.opendocument.spreadsheet"/>
+    <_comment>OpenDocument v1.0: Spreadsheet document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.spreadsheet"/>
+      </match>
+    </magic>
+    <glob pattern="*.ods"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.spreadsheet-template">
+    <alias type="application/x-vnd.oasis.opendocument.spreadsheet-template"/>
+    <_comment>OpenDocument v1.0: Spreadsheet document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.spreadsheet-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.ots"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.text">
+    <alias type="application/x-vnd.oasis.opendocument.text"/>
+    <_comment>OpenDocument v1.0: Text document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.text"/>
+      </match>
+    </magic>
+    <glob pattern="*.odt"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.text-master">
+    <alias type="application/x-vnd.oasis.opendocument.text-master"/>
+    <_comment>OpenDocument v1.0: Global Text document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.text-master"/>
+      </match>
+    </magic>
+    <glob pattern="*.otm"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.text-template">
+    <alias type="application/x-vnd.oasis.opendocument.text-template"/>
+    <_comment>OpenDocument v1.0: Text document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+              value="mimetypeapplication/vnd.oasis.opendocument.text-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.ott"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.text-web">
+    <alias type="application/x-vnd.oasis.opendocument.text-web"/>
+    <_comment>OpenDocument v1.0: Text document used as template for HTML documents</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+              value="mimetypeapplication/vnd.oasis.opendocument.text-web"/>
+      </match>
+    </magic>
+    <glob pattern="*.oth"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.obn"/>
+  <mime-type type="application/vnd.olpc-sugar">
+    <glob pattern="*.xo"/>
+  </mime-type>
+  <mime-type type="application/vnd.oma-scws-config"/>
+  <mime-type type="application/vnd.oma-scws-http-request"/>
+  <mime-type type="application/vnd.oma-scws-http-response"/>
+  <mime-type type="application/vnd.oma.bcast.associated-procedure-parameter+xml"/>
+  <mime-type type="application/vnd.oma.bcast.drm-trigger+xml"/>
+  <mime-type type="application/vnd.oma.bcast.imd+xml"/>
+  <mime-type type="application/vnd.oma.bcast.ltkm"/>
+  <mime-type type="application/vnd.oma.bcast.notification+xml"/>
+  <mime-type type="application/vnd.oma.bcast.provisioningtrigger"/>
+  <mime-type type="application/vnd.oma.bcast.sgboot"/>
+  <mime-type type="application/vnd.oma.bcast.sgdd+xml"/>
+  <mime-type type="application/vnd.oma.bcast.sgdu"/>
+  <mime-type type="application/vnd.oma.bcast.simple-symbol-container"/>
+  <mime-type type="application/vnd.oma.bcast.smartcard-trigger+xml"/>
+  <mime-type type="application/vnd.oma.bcast.sprov+xml"/>
+  <mime-type type="application/vnd.oma.bcast.stkm"/>
+  <mime-type type="application/vnd.oma.dcd"/>
+  <mime-type type="application/vnd.oma.dcdc"/>
+  <mime-type type="application/vnd.oma.dd2+xml">
+    <glob pattern="*.dd2"/>
+  </mime-type>
+  <mime-type type="application/vnd.oma.drm.risd+xml"/>
+  <mime-type type="application/vnd.oma.group-usage-list+xml"/>
+  <mime-type type="application/vnd.oma.poc.detailed-progress-report+xml"/>
+  <mime-type type="application/vnd.oma.poc.final-report+xml"/>
+  <mime-type type="application/vnd.oma.poc.groups+xml"/>
+  <mime-type type="application/vnd.oma.poc.invocation-descriptor+xml"/>
+  <mime-type type="application/vnd.oma.poc.optimized-progress-report+xml"/>
+  <mime-type type="application/vnd.oma.xcap-directory+xml"/>
+  <mime-type type="application/vnd.omads-email+xml"/>
+  <mime-type type="application/vnd.omads-file+xml"/>
+  <mime-type type="application/vnd.omads-folder+xml"/>
+  <mime-type type="application/vnd.omaloc-supl-init"/>
+
+  <mime-type type="application/vnd.openofficeorg.extension">
+    <glob pattern="*.oxt"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.presentationml.presentation">
+    <_comment>Office Open XML Presentation</_comment>
+    <glob pattern="*.pptx"/>
+    <glob pattern="*.thmx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.presentationml.slide">
+    <glob pattern="*.sldx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.presentationml.template">
+    <_comment>Office Open XML Presentation Template</_comment>
+    <glob pattern="*.potx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.presentationml.slideshow">
+    <_comment>Office Open XML Presentation Slideshow</_comment>
+    <glob pattern="*.ppsx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
+    <_comment>Office Open XML Workbook</_comment>
+    <glob pattern="*.xlsx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.spreadsheetml.template">
+    <_comment>Office Open XML Workbook Template</_comment>
+    <glob pattern="*.xltx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-excel.template.macroenabled.12">
+    <_comment>Office Open XML Workbook Template (macro-enabled)</_comment>
+    <glob pattern="*.xltm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.wordprocessingml.document">
+    <_comment>Office Open XML Document</_comment>
+    <glob pattern="*.docx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.wordprocessingml.template">
+    <_comment>Office Open XML Document Template</_comment>
+    <glob pattern="*.dotx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.osa.netdeploy"/>
+  <mime-type type="application/vnd.osgi.bundle"/>
+  <mime-type type="application/vnd.osgi.dp">
+    <glob pattern="*.dp"/>
+  </mime-type>
+  <mime-type type="application/vnd.otps.ct-kip+xml"/>
+
+  <mime-type type="application/vnd.palm">
+    <!-- <glob pattern="*.pdb"/> - conflicts with chemical/x-pdb -->
+    <glob pattern="*.pqa"/>
+    <glob pattern="*.oprc"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.paos.xml"/>
+  <mime-type type="application/vnd.pg.format">
+    <glob pattern="*.str"/>
+  </mime-type>
+  <mime-type type="application/vnd.pg.osasli">
+    <glob pattern="*.ei6"/>
+  </mime-type>
+  <mime-type type="application/vnd.piaccess.application-licence"/>
+  <mime-type type="application/vnd.picsel">
+    <glob pattern="*.efif"/>
+  </mime-type>
+  <mime-type type="application/vnd.poc.group-advertisement+xml"/>
+  <mime-type type="application/vnd.pocketlearn">
+    <glob pattern="*.plf"/>
+  </mime-type>
+  <mime-type type="application/vnd.powerbuilder6">
+    <glob pattern="*.pbd"/>
+  </mime-type>
+  <mime-type type="application/vnd.powerbuilder6-s"/>
+  <mime-type type="application/vnd.powerbuilder7"/>
+  <mime-type type="application/vnd.powerbuilder7-s"/>
+  <mime-type type="application/vnd.powerbuilder75"/>
+  <mime-type type="application/vnd.powerbuilder75-s"/>
+  <mime-type type="application/vnd.preminet"/>
+  <mime-type type="application/vnd.previewsystems.box">
+    <glob pattern="*.box"/>
+  </mime-type>
+  <mime-type type="application/vnd.proteus.magazine">
+    <glob pattern="*.mgz"/>
+  </mime-type>
+  <mime-type type="application/vnd.publishare-delta-tree">
+    <glob pattern="*.qps"/>
+  </mime-type>
+  <mime-type type="application/vnd.pvi.ptid1">
+    <glob pattern="*.ptid"/>
+  </mime-type>
+  <mime-type type="application/vnd.pwg-multiplexed"/>
+  <mime-type type="application/vnd.pwg-xhtml-print+xml"/>
+  <mime-type type="application/vnd.qualcomm.brew-app-res"/>
+  <mime-type type="application/vnd.quark.quarkxpress">
+    <glob pattern="*.qxd"/>
+    <glob pattern="*.qxt"/>
+    <glob pattern="*.qwd"/>
+    <glob pattern="*.qwt"/>
+    <glob pattern="*.qxl"/>
+    <glob pattern="*.qxb"/>
+  </mime-type>
+  <mime-type type="application/vnd.rapid"/>
+  <mime-type type="application/vnd.recordare.musicxml">
+    <glob pattern="*.mxl"/>
+  </mime-type>
+  <mime-type type="application/vnd.recordare.musicxml+xml">
+    <glob pattern="*.musicxml"/>
+  </mime-type>
+  <mime-type type="application/vnd.renlearn.rlprint"/>
+  <mime-type type="application/vnd.rim.cod">
+    <glob pattern="*.cod"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.rn-realmedia">
+    <magic priority="50">
+      <match value=".RMF" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.rm"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.route66.link66+xml">
+    <glob pattern="*.link66"/>
+  </mime-type>
+  <mime-type type="application/vnd.ruckus.download"/>
+  <mime-type type="application/vnd.s3sms"/>
+  <mime-type type="application/vnd.sbm.cid"/>
+  <mime-type type="application/vnd.sbm.mid2"/>
+  <mime-type type="application/vnd.scribus"/>
+  <mime-type type="application/vnd.sealed.3df"/>
+  <mime-type type="application/vnd.sealed.csf"/>
+  <mime-type type="application/vnd.sealed.doc"/>
+  <mime-type type="application/vnd.sealed.eml"/>
+  <mime-type type="application/vnd.sealed.mht"/>
+  <mime-type type="application/vnd.sealed.net"/>
+  <mime-type type="application/vnd.sealed.ppt"/>
+  <mime-type type="application/vnd.sealed.tiff"/>
+  <mime-type type="application/vnd.sealed.xls"/>
+  <mime-type type="application/vnd.sealedmedia.softseal.html"/>
+  <mime-type type="application/vnd.sealedmedia.softseal.pdf"/>
+  <mime-type type="application/vnd.seemail">
+    <glob pattern="*.see"/>
+  </mime-type>
+  <mime-type type="application/vnd.sema">
+    <glob pattern="*.sema"/>
+  </mime-type>
+  <mime-type type="application/vnd.semd">
+    <glob pattern="*.semd"/>
+  </mime-type>
+  <mime-type type="application/vnd.semf">
+    <glob pattern="*.semf"/>
+  </mime-type>
+  <mime-type type="application/vnd.shana.informed.formdata">
+    <glob pattern="*.ifm"/>
+  </mime-type>
+  <mime-type type="application/vnd.shana.informed.formtemplate">
+    <glob pattern="*.itp"/>
+  </mime-type>
+  <mime-type type="application/vnd.shana.informed.interchange">
+    <glob pattern="*.iif"/>
+  </mime-type>
+  <mime-type type="application/vnd.shana.informed.package">
+    <glob pattern="*.ipk"/>
+  </mime-type>
+  <mime-type type="application/vnd.simtech-mindmapper">
+    <glob pattern="*.twd"/>
+    <glob pattern="*.twds"/>
+  </mime-type>
+  <mime-type type="application/vnd.smaf">
+    <glob pattern="*.mmf"/>
+  </mime-type>
+  <mime-type type="application/vnd.smart.teacher">
+    <glob pattern="*.teacher"/>
+  </mime-type>
+  <mime-type type="application/vnd.software602.filler.form+xml"/>
+  <mime-type type="application/vnd.software602.filler.form-xml-zip"/>
+  <mime-type type="application/vnd.solent.sdkm+xml">
+    <glob pattern="*.sdkm"/>
+    <glob pattern="*.sdkd"/>
+  </mime-type>
+  <mime-type type="application/vnd.spotfire.dxp">
+    <glob pattern="*.dxp"/>
+  </mime-type>
+  <mime-type type="application/vnd.spotfire.sfs">
+    <glob pattern="*.sfs"/>
+  </mime-type>
+  <mime-type type="application/vnd.sss-cod"/>
+  <mime-type type="application/vnd.sss-dtf"/>
+  <mime-type type="application/vnd.sss-ntf"/>
+
+  <mime-type type="application/vnd.stardivision.calc">
+    <sub-class-of type="application/x-tika-staroffice"/>
+    <magic priority="50">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="StarCalc" type="string" offset="2048:2207" />
+      </match>
+    </magic>
+    <glob pattern="*.sdc"/>
+  </mime-type>
+  <mime-type type="application/vnd.stardivision.draw">
+    <sub-class-of type="application/x-tika-staroffice"/>
+    <magic priority="50">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="StarDraw" type="string" offset="2048:2207" />
+      </match>
+    </magic>
+    <glob pattern="*.sda"/>
+  </mime-type>
+  <mime-type type="application/vnd.stardivision.impress">
+    <sub-class-of type="application/x-tika-staroffice"/>
+    <magic priority="50">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="StarImpress" type="string" offset="2048:2207" />
+      </match>
+    </magic>
+    <glob pattern="*.sdd"/>
+  </mime-type>
+  <mime-type type="application/vnd.stardivision.math">
+    <glob pattern="*.smf"/>
+  </mime-type>
+  <mime-type type="application/vnd.stardivision.writer">
+    <sub-class-of type="application/x-tika-staroffice"/>
+    <magic priority="50">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="StarWriter" type="string" offset="2048:2207" />
+      </match>
+    </magic>
+    <glob pattern="*.sdw"/>
+  </mime-type>
+  <mime-type type="application/x-staroffice-template">
+    <sub-class-of type="application/x-tika-staroffice"/>
+    <glob pattern="*.vor"/>
+  </mime-type>
+  <mime-type type="application/vnd.stardivision.writer-global">
+    <glob pattern="*.sgl"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.street-stream"/>
+  <mime-type type="application/vnd.sun.xml.calc">
+    <glob pattern="*.sxc"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.calc.template">
+    <glob pattern="*.stc"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.draw">
+    <glob pattern="*.sxd"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.draw.template">
+    <glob pattern="*.std"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.impress">
+    <glob pattern="*.sxi"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.impress.template">
+    <glob pattern="*.sti"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.math">
+    <glob pattern="*.sxm"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.sun.xml.writer">
+    <alias type="application/x-vnd.sun.xml.writer"/>
+    <_comment>OpenOffice v1.0: Writer Document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+          value="mimetypeapplication/vnd.sun.xml.writer"/>
+      </match>
+    </magic>
+    <glob pattern="*.sxw"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.sun.xml.writer.global">
+    <glob pattern="*.sxg"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.writer.template">
+    <glob pattern="*.stw"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.wadl+xml"/>
+  <mime-type type="application/vnd.sus-calendar">
+    <glob pattern="*.sus"/>
+    <glob pattern="*.susp"/>
+  </mime-type>
+  <mime-type type="application/vnd.svd">
+    <glob pattern="*.svd"/>
+  </mime-type>
+  <mime-type type="application/vnd.swiftview-ics"/>
+
+  <mime-type type="application/vnd.symbian.install">
+    <magic priority="50">
+      <match value="0x10000419" type="little32" offset="8" />
+    </magic>
+    <glob pattern="*.sis"/>
+    <glob pattern="*.sisx"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.syncml+xml">
+    <glob pattern="*.xsm"/>
+  </mime-type>
+  <mime-type type="application/vnd.syncml.dm+wbxml">
+    <glob pattern="*.bdm"/>
+  </mime-type>
+  <mime-type type="application/vnd.syncml.dm+xml">
+    <glob pattern="*.xdm"/>
+  </mime-type>
+  <mime-type type="application/vnd.syncml.dm.notification"/>
+  <mime-type type="application/vnd.syncml.ds.notification"/>
+  <mime-type type="application/vnd.tao.intent-module-archive">
+    <glob pattern="*.tao"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.tcpdump.pcap">
+    <_comment>TCPDump pcap packet capture</_comment>
+    <magic priority="50">
+      <match value="0xa1b2c3d4" type="big32" offset="0" />
+      <match value="0xd4c3b2a1" type="big32" offset="0" />
+    </magic>
+    <glob pattern="*.pcap"/>
+    <glob pattern="*.cap"/>
+    <glob pattern="*.dmp"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.tmobile-livetv">
+    <glob pattern="*.tmo"/>
+  </mime-type>
+  <mime-type type="application/vnd.trid.tpt">
+    <glob pattern="*.tpt"/>
+  </mime-type>
+  <mime-type type="application/vnd.triscape.mxs">
+    <glob pattern="*.mxs"/>
+  </mime-type>
+  <mime-type type="application/vnd.trueapp">
+    <glob pattern="*.tra"/>
+  </mime-type>
+  <mime-type type="application/vnd.truedoc"/>
+  <mime-type type="application/vnd.ufdl">
+    <glob pattern="*.ufd"/>
+    <glob pattern="*.ufdl"/>
+  </mime-type>
+  <mime-type type="application/vnd.uiq.theme">
+    <glob pattern="*.utz"/>
+  </mime-type>
+  <mime-type type="application/vnd.umajin">
+    <glob pattern="*.umj"/>
+  </mime-type>
+  <mime-type type="application/vnd.unity">
+    <glob pattern="*.unityweb"/>
+  </mime-type>
+  <mime-type type="application/vnd.uoml+xml">
+    <glob pattern="*.uoml"/>
+  </mime-type>
+  <mime-type type="application/vnd.uplanet.alert"/>
+  <mime-type type="application/vnd.uplanet.alert-wbxml"/>
+  <mime-type type="application/vnd.uplanet.bearer-choice"/>
+  <mime-type type="application/vnd.uplanet.bearer-choice-wbxml"/>
+  <mime-type type="application/vnd.uplanet.cacheop"/>
+  <mime-type type="application/vnd.uplanet.cacheop-wbxml"/>
+  <mime-type type="application/vnd.uplanet.channel"/>
+  <mime-type type="application/vnd.uplanet.channel-wbxml"/>
+  <mime-type type="application/vnd.uplanet.list"/>
+  <mime-type type="application/vnd.uplanet.list-wbxml"/>
+  <mime-type type="application/vnd.uplanet.listcmd"/>
+  <mime-type type="application/vnd.uplanet.listcmd-wbxml"/>
+  <mime-type type="application/vnd.uplanet.signal"/>
+  <mime-type type="application/vnd.vcx">
+    <glob pattern="*.vcx"/>
+  </mime-type>
+  <mime-type type="application/vnd.vd-study"/>
+  <mime-type type="application/vnd.vectorworks"/>
+  <mime-type type="application/vnd.vidsoft.vidconference"/>
+
+  <!-- http://www.iana.org/assignments/media-types/application/vnd.visio -->
+  <mime-type type="application/vnd.visio">
+    <_comment>Microsoft Visio Diagram</_comment>
+    <glob pattern="*.vsd"/>
+    <glob pattern="*.vst"/>
+    <glob pattern="*.vss"/>
+    <glob pattern="*.vsw"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.visionary">
+    <glob pattern="*.vis"/>
+  </mime-type>
+  <mime-type type="application/vnd.vividence.scriptfile"/>
+  <mime-type type="application/vnd.vsf">
+    <glob pattern="*.vsf"/>
+  </mime-type>
+  <mime-type type="application/vnd.wap.sic"/>
+  <mime-type type="application/vnd.wap.slc"/>
+
+  <mime-type type="application/vnd.wap.wbxml">
+    <glob pattern="*.wbxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.wap.wmlc">
+    <_comment>Compiled WML Document</_comment>
+    <glob pattern="*.wmlc"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.wap.wmlscriptc">
+    <_comment>Compiled WML Script</_comment>
+    <glob pattern="*.wmlsc"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.webturbo">
+    <glob pattern="*.wtb"/>
+  </mime-type>
+  <mime-type type="application/vnd.wfa.wsc"/>
+  <mime-type type="application/vnd.wmc"/>
+  <mime-type type="application/vnd.wmf.bootstrap"/>
+  <mime-type type="application/vnd.wordperfect">
+    <alias type="application/wordperfect"/>
+    <glob pattern="*.wpd"/>
+  </mime-type>
+  <mime-type type="application/vnd.wqd">
+    <glob pattern="*.wqd"/>
+  </mime-type>
+  <mime-type type="application/vnd.wrq-hp3000-labelled"/>
+  <mime-type type="application/vnd.wt.stf">
+    <glob pattern="*.stf"/>
+  </mime-type>
+  <mime-type type="application/vnd.wv.csp+wbxml"/>
+  <mime-type type="application/vnd.wv.csp+xml"/>
+  <mime-type type="application/vnd.wv.ssp+xml"/>
+  <mime-type type="application/vnd.xara">
+    <glob pattern="*.xar"/>
+  </mime-type>
+  <mime-type type="application/vnd.xfdl">
+    <glob pattern="*.xfdl"/>
+  </mime-type>
+  <mime-type type="application/vnd.xfdl.webform"/>
+  <mime-type type="application/vnd.xmi+xml"/>
+  <mime-type type="application/vnd.xmpie.cpkg"/>
+  <mime-type type="application/vnd.xmpie.dpkg"/>
+  <mime-type type="application/vnd.xmpie.plan"/>
+  <mime-type type="application/vnd.xmpie.ppkg"/>
+  <mime-type type="application/vnd.xmpie.xlim"/>
+  <mime-type type="application/vnd.yamaha.hv-dic">
+    <glob pattern="*.hvd"/>
+  </mime-type>
+  <mime-type type="application/vnd.yamaha.hv-script">
+    <glob pattern="*.hvs"/>
+  </mime-type>
+  <mime-type type="application/vnd.yamaha.hv-voice">
+    <glob pattern="*.hvp"/>
+  </mime-type>
+  <mime-type type="application/vnd.yamaha.openscoreformat">
+    <glob pattern="*.osf"/>
+  </mime-type>
+  <mime-type type="application/vnd.yamaha.openscoreformat.osfpvg+xml">
+    <glob pattern="*.osfpvg"/>
+  </mime-type>
+  <mime-type type="application/vnd.yamaha.smaf-audio">
+    <glob pattern="*.saf"/>
+  </mime-type>
+  <mime-type type="application/vnd.yamaha.smaf-phrase">
+    <glob pattern="*.spf"/>
+  </mime-type>
+  <mime-type type="application/vnd.yellowriver-custom-menu">
+    <glob pattern="*.cmp"/>
+  </mime-type>
+  <mime-type type="application/vnd.zul">
+    <glob pattern="*.zir"/>
+    <glob pattern="*.zirz"/>
+  </mime-type>
+  <mime-type type="application/vnd.zzazz.deck+xml">
+    <glob pattern="*.zaz"/>
+  </mime-type>
+  <mime-type type="application/voicexml+xml">
+    <glob pattern="*.vxml"/>
+  </mime-type>
+  <mime-type type="application/watcherinfo+xml"/>
+  <mime-type type="application/whoispp-query"/>
+  <mime-type type="application/whoispp-response"/>
+  <mime-type type="application/winhlp">
+    <glob pattern="*.hlp"/>
+  </mime-type>
+  <mime-type type="application/wita"/>
+  <mime-type type="application/wordperfect5.1"/>
+  <mime-type type="application/wsdl+xml">
+    <glob pattern="*.wsdl"/>
+  </mime-type>
+  <mime-type type="application/wspolicy+xml">
+    <glob pattern="*.wspolicy"/>
+  </mime-type>
+
+  <mime-type type="application/x-123">
+    <magic priority="50">
+      <match value="0x00001a00" type="big32" offset="0" />
+      <match value="0x00000200" type="big32" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-abiword">
+    <glob pattern="*.abw"/>
+  </mime-type>
+  <mime-type type="application/x-ace-compressed">
+    <glob pattern="*.ace"/>
+  </mime-type>
+
+  <mime-type type="application/x-adobe-indesign">
+    <acronym>INDD</acronym>
+    <_comment>Adobe InDesign document</_comment>
+    <glob pattern="*.indd"/>
+    <magic priority="50">
+      <match value="0x0606edf5d81d46e5bd31efe7fe74b71d" type="string" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-adobe-indesign-interchange">
+    <acronym>INX</acronym>
+    <_comment>Adobe InDesign Interchange format</_comment>
+    <magic priority="50">
+      <match value="&lt;?aid" type="string" offset="0:100"/>
+    </magic>
+    <glob pattern="*.inx"/>
+    <sub-class-of type="application/xml"/>
+  </mime-type>
+
+  <mime-type type="application/x-apple-diskimage">
+    <glob pattern="*.dmg"/>
+    <!-- <glob pattern="*.img"/> too generic -->
+    <!-- <glob pattern="*.smi"/> conflicts with SMIL -->
+  </mime-type>
+
+  <mime-type type="application/x-appleworks">
+    <glob pattern="*.cwk"/>
+  </mime-type>
+
+  <mime-type type="application/x-archive">
+    <alias type="application/x-unix-archive"/>
+    <magic priority="50">
+      <match value="=&lt;ar&gt;" type="string" offset="0"/>
+      <match value="!&lt;arch&gt;\n" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.ar"/>
+    <glob pattern="*.a"/>
+  </mime-type>
+
+  <mime-type type="application/x-arj">
+    <alias type="application/x-arj-compressed"/>
+    <magic priority="50">
+      <match value="0x60ea" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.arj"/>
+  </mime-type>
+
+  <mime-type type="application/x-authorware-bin">
+    <glob pattern="*.aab"/>
+    <glob pattern="*.x32"/>
+    <glob pattern="*.u32"/>
+    <glob pattern="*.vox"/>
+  </mime-type>
+  <mime-type type="application/x-authorware-map">
+    <glob pattern="*.aam"/>
+  </mime-type>
+  <mime-type type="application/x-authorware-seg">
+    <glob pattern="*.aas"/>
+  </mime-type>
+
+  <mime-type type="application/x-bcpio">
+    <glob pattern="*.bcpio"/>
+  </mime-type>
+
+  <mime-type type="application/x-berkeley-db">
+    <magic priority="50">
+      <match value="0x00061561" type="big32" offset="0"/>
+      <match value="0x00061561" type="host32" offset="12"/>
+      <match value="0x00061561" type="big32" offset="12"/>
+      <match value="0x00061561" type="little32" offset="12"/>
+      <match value="0x00053162" type="host32" offset="12"/>
+      <match value="0x00053162" type="big32" offset="12"/>
+      <match value="0x00053162" type="little32" offset="12"/>
+      <match value="0x00042253" type="host32" offset="12"/>
+      <match value="0x00042253" type="big32" offset="12"/>
+      <match value="0x00042253" type="little32" offset="12"/>
+      <match value="0x00040988" type="host32" offset="12"/>
+      <match value="0x00040988" type="little32" offset="12"/>
+      <match value="0x00040988" type="big32" offset="12"/>
+      <match value="0x00053162" type="host32" offset="0"/>
+      <match value="0x00053162" type="big32" offset="0"/>
+      <match value="0x00053162" type="little32" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-bibtex-text-file">
+    <magic priority="50">
+      <match value="%\ BibTeX\ `" type="string" offset="0"/>
+      <match value="%%%\ \ " type="string" offset="73"/>
+      <match value="%\ BibTeX\ standard\ bibliography\ " type="string" offset="0"/>
+      <match value="%%%\ \ @BibTeX-style-file{" type="string" offset="73"/>
+      <match value="@article{" type="string" offset="0"/>
+      <match value="@book{" type="string" offset="0"/>
+      <match value="@inbook{" type="string" offset="0"/>
+      <match value="@incollection{" type="string" offset="0"/>
+      <match value="@inproceedings{" type="string" offset="0"/>
+      <match value="@manual{" type="string" offset="0"/>
+      <match value="@misc{" type="string" offset="0"/>
+      <match value="@preamble{" type="string" offset="0"/>
+      <match value="@phdthesis{" type="string" offset="0"/>
+      <match value="@techreport{" type="string" offset="0"/>
+      <match value="@unpublished{" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.bib"/>
+    <glob pattern="*.bibtex"/>
+  </mime-type>
+
+  <mime-type type="application/x-bittorrent">
+    <magic priority="50">
+      <match value="d8:announce" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.torrent"/>
+  </mime-type>
+
+  <mime-type type="application/x-bplist">
+    <!-- The priority is 60, as .webarchive files often contain
+         (X)HTML content. The bplist magic must trump the XHTML
+         magics further within the file. This must also be
+         independent of the internal ordering of patterns within
+         MimeTypes -->
+    <magic priority="60">
+      <match value="bplist" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-bzip">
+    <magic priority="40">
+      <match value="BZh" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.bz"/>
+    <glob pattern="*.tbz"/>
+  </mime-type>
+
+  <mime-type type="application/x-bzip2">
+    <sub-class-of type="application/x-bzip"/>
+    <_comment>Bzip 2 UNIX Compressed File</_comment>
+    <magic priority="40">
+      <match value="\x42\x5a\x68\x39\x31" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.bz2"/>
+    <glob pattern="*.tbz2"/>
+    <glob pattern="*.boz"/>
+  </mime-type>
+
+  <mime-type type="application/x-cdlink">
+    <_comment>Virtual CD-ROM CD Image File</_comment>
+    <glob pattern="*.vcd"/>
+  </mime-type>
+
+  <mime-type type="application/x-chat">
+    <glob pattern="*.chat"/>
+  </mime-type>
+
+  <mime-type type="application/x-chess-pgn">
+    <glob pattern="*.pgn"/>
+  </mime-type>
+
+  <mime-type type="application/x-chrome-package">
+    <acronym>CRX</acronym>
+    <_comment>Chrome Extension Package</_comment>
+    <tika:link>https://developer.chrome.com/extensions/crx</tika:link>
+    <magic priority="50">
+      <match value="Cr24" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.crx"/>
+  </mime-type>
+
+  <mime-type type="application/x-compress">
+    <magic priority="50">
+      <match value="\037\235" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.z"/>
+  </mime-type>
+
+  <mime-type type="application/x-corelpresentations">
+    <glob pattern="*.shw"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/x-cpio">
+    <_comment>UNIX CPIO Archive</_comment>
+    <magic priority="50">
+      <match value="070707" type="little16" offset="0"/>
+      <match value="070707" type="big16" offset="0"/>
+      <match value="070707" type="string" offset="0"/>
+      <match value="070701" type="string" offset="0"/>
+      <match value="070702" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.cpio"/>
+  </mime-type>
+
+  <mime-type type="application/x-csh">
+    <glob pattern="*.csh"/>
+    <glob pattern="*.tcsh"/>
+  </mime-type>
+
+  <mime-type type="application/x-debian-package">
+    <sub-class-of type="application/x-archive"/>
+    <magic priority="60">
+      <match value="!&lt;arch&gt;\ndebian-binary" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.deb"/>
+    <glob pattern="*.udeb"/>
+  </mime-type>
+
+  <mime-type type="application/x-dex">
+    <acronym>DEX</acronym>
+    <_comment>Dalvik Executable Format</_comment>
+    <tika:link>http://source.android.com/devices/tech/dalvik/dex-format.html</tika:link>
+    <magic priority="50">
+      <match value="dex\n" type="string" offset="0">
+        <match value="\0" type="string" offset="7"/>
+      </match>
+    </magic>
+    <glob pattern="*.dex"/>
+  </mime-type>
+
+  <mime-type type="application/x-director">
+    <_comment>Shockwave Movie</_comment>
+    <glob pattern="*.dir"/>
+    <glob pattern="*.dcr"/>
+    <glob pattern="*.dxr"/>
+    <glob pattern="*.cst"/>
+    <glob pattern="*.cct"/>
+    <glob pattern="*.cxt"/>
+    <glob pattern="*.w3d"/>
+    <glob pattern="*.fgd"/>
+    <glob pattern="*.swa"/>
+  </mime-type>
+
+  <mime-type type="application/x-doom">
+    <glob pattern="*.wad"/>
+  </mime-type>
+  <mime-type type="application/x-dtbncx+xml">
+    <glob pattern="*.ncx"/>
+  </mime-type>
+  <mime-type type="application/x-dtbook+xml">
+    <glob pattern="*.dtb"/>
+  </mime-type>
+  <mime-type type="application/x-dtbresource+xml">
+    <glob pattern="*.res"/>
+  </mime-type>
+
+  <mime-type type="application/x-dvi">
+    <_comment>TeX Device Independent Document</_comment>
+    <magic priority="50">
+      <match value="\367\002" type="string" offset="0"/>
+      <match value="0x02f7" type="little16" offset="0"/>
+      <match value="\x1b\x20\x54\x65\x58\x20\x6f\x75\x74\x70\x75\x74\x20"
+             type="string" offset="14"/>
+    </magic>
+    <glob pattern="*.dvi"/>
+  </mime-type>
+
+  <mime-type type="application/x-elc">
+    <_comment>Emacs Lisp bytecode</_comment>
+    <magic priority="50">
+      <!-- Emacs 18 -->
+      <match value="\012(" type="string" offset="0" />
+      <!-- Emacs 19 -->
+      <match value=";ELC\023\000\000\000" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.elc"/>
+  </mime-type>
+
+  <mime-type type="application/x-elf">
+    <magic priority="50">
+      <match value="\177ELF" type="string" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="message/x-emlx">
+    <magic priority="70">
+      <match value="\nRelay-Version:" type="string" offset="2:9"/>
+      <match value="\n#!\ rnews" type="string" offset="2:9"/>
+      <match value="\nN#!\ rnews" type="string" offset="2:9"/>
+      <match value="\nForward\ to" type="string" offset="2:9"/>
+      <match value="\nPipe\ to" type="string" offset="2:9"/>
+      <match value="\nReturn-Path:" type="string" offset="2:9"/>
+      <match value="\nFrom:" type="string" offset="2:9"/>
+      <match value="\nReceived:" type="string" offset="2:9"/>
+      <match value="\nMessage-ID:" type="string" offset="2:9"/>
+      <match value="\nDate:" type="string" offset="2:9"/>
+    </magic>
+    <glob pattern="*.emlx"/>
+  </mime-type>
+
+  <mime-type type="application/x-killustrator">
+    <_comment>KIllustrator File</_comment>
+    <glob pattern="*.kil"/>
+  </mime-type>
+
+  <mime-type type="application/x-object">
+    <sub-class-of type="application/x-elf"/>
+    <magic priority="50">
+      <match value="\177ELF" type="string" offset="0">
+        <match value="0x0100" type="string" offset="16"/>
+        <match value="0x0001" type="string" offset="16"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-executable">
+    <sub-class-of type="application/x-elf"/>
+    <magic priority="50">
+      <match value="\177ELF" type="string" offset="0">
+        <match value="0x0200" type="string" offset="16"/>
+        <match value="0x0002" type="string" offset="16"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-sharedlib">
+    <sub-class-of type="application/x-elf"/>
+    <magic priority="50">
+      <match value="\177ELF" type="string" offset="0">
+        <match value="0x0300" type="string" offset="16"/>
+        <match value="0x0003" type="string" offset="16"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-coredump">
+    <sub-class-of type="application/x-elf"/>
+    <magic priority="50">
+      <match value="\177ELF" type="string" offset="0">
+        <match value="0x0400" type="string" offset="16"/>
+        <match value="0x0004" type="string" offset="16"/>
+      </match>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-dosexec">
+    <_comment>DOS/Windows executable (EXE)</_comment>
+    <sub-class-of type="application/x-msdownload"/>
+    <glob pattern="*.exe"/>
+  </mime-type>
+
+  <mime-type type="application/x-emf">
+    <acronym>EMF</acronym>
+    <_comment>Extended Metafile</_comment>
+    <glob pattern="*.emf"/>
+    <magic priority="50">
+      <match value="0x01000000" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-filemaker">
+    <acronym>FP7</acronym>
+    <_comment>FileMaker Pro 7</_comment>
+    <magic priority="50">
+      <match value="0xC04842414D37" type="string" offset="14" >
+      <match value="0x4842414D323130314F43543939C102480750726F20372E30C0C0" type="string" offset="525" />
+    </match>
+    </magic>
+    <glob pattern="*.fp7" />
+  </mime-type>
+
+  <mime-type type="application/x-font-bdf">
+    <glob pattern="*.bdf"/>
+  </mime-type>
+  <mime-type type="application/x-font-dos"/>
+  <mime-type type="application/x-font-framemaker"/>
+  <mime-type type="application/x-font-ghostscript">
+    <glob pattern="*.gsf"/>
+  </mime-type>
+  <mime-type type="application/x-font-libgrx"/>
+  <mime-type type="application/x-font-linux-psf">
+    <glob pattern="*.psf"/>
+  </mime-type>
+
+  <mime-type type="application/x-font-otf">
+    <acronym>OTF</acronym>
+    <_comment>OpenType Font</_comment>
+    <glob pattern="*.otf"/>
+  </mime-type>
+
+  <mime-type type="application/x-font-pcf">
+    <glob pattern="*.pcf"/>
+  </mime-type>
+  <mime-type type="application/x-font-snf">
+    <glob pattern="*.snf"/>
+  </mime-type>
+  <mime-type type="application/x-font-speedo"/>
+  <mime-type type="application/x-font-sunos-news"/>
+
+  <mime-type type="application/x-font-ttf">
+    <acronym>TTF</acronym>
+    <_comment>TrueType Font</_comment>
+    <glob pattern="*.ttf"/>
+    <glob pattern="*.ttc"/>
+    <magic priority="40">
+      <match value="0x00010000" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-font-type1">
+    <glob pattern="*.pfa"/>
+    <glob pattern="*.pfb"/>
+    <magic priority="60">
+      <!-- Match for PFB, the binary format -->
+      <match value="\x80\x01\xFF\xFF\x00\x00%!PS-AdobeFont" type="string"
+              mask="0xFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" offset="0"/>
+      <!-- Match for PFA, the text format" -->
+      <match value="%!PS-AdobeFont-1.0" type="string" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-font-adobe-metric">
+    <_comment>Adobe Font Metric</_comment>
+    <glob pattern="*.afm"/>
+    <glob pattern="*.acfm"/>
+    <glob pattern="*.amfm"/>
+    <magic priority="40">
+      <match value="StartFontMetrics" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-font-printer-metric">
+    <_comment>Printer Font Metric</_comment>
+    <glob pattern="*.pfm"/>
+    <magic priority="40">
+      <match value="0x0001FFFF0000436f707972" type="string" offset="0"
+              mask="0xFFFF0000FFFFFFFFFFFFFF" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-font-vfont"/>
+
+  <mime-type type="application/x-foxmail">
+    <_comment>Foxmail Email File</_comment>
+    <magic>
+      <match value="0x1010101010101011111111111153" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-futuresplash">
+    <_comment>Macromedia FutureSplash File</_comment>
+    <glob pattern="*.spl"/>
+  </mime-type>
+
+  <mime-type type="application/x-gnucash">
+    <glob pattern="*.gnucash" />
+  </mime-type>
+
+  <mime-type type="application/x-gnumeric">
+    <alias type="application/x-Gnumeric-spreadsheet"/>
+    <magic priority="50">
+      <match value="=&lt;gmr:Workbook" type="string" offset="39" />
+    </magic>
+    <glob pattern="*.gnumeric"/>
+  </mime-type>
+
+  <mime-type type="application/x-gtar">
+    <_comment>GNU tar Compressed File Archive (GNU Tape Archive)</_comment>
+    <magic priority="50">
+      <!-- GNU tar archive -->
+      <match value="ustar  \0" type="string" offset="257" />
+    </magic>
+    <glob pattern="*.gtar"/>
+    <sub-class-of type="application/x-tar"/>
+  </mime-type>
+
+  <mime-type type="application/gzip">
+    <_comment>Gzip Compressed Archive</_comment>
+    <alias type="application/x-gzip"/>
+    <alias type="application/x-gunzip"/>
+    <alias type="application/gzip-compressed"/>
+    <alias type="application/gzipped"/>
+    <alias type="application/gzip-compressed"/>
+    <alias type="application/x-gzip-compressed"/>
+    <alias type="gzip/document"/>
+    <magic priority="45">
+      <match value="\037\213" type="string" offset="0" />
+      <match value="\x1f\x8b" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.tgz" />
+    <glob pattern="*.gz" />
+    <glob pattern="*-gz" />
+    <glob pattern="*.emz" />
+  </mime-type>
+
+  <mime-type type="application/x-hdf">
+    <_comment>Hierarchical Data Format File</_comment>
+    <magic priority="50">
+      <!-- HDF4 -->
+      <match value="0x0e031301" type="big32" offset="0"/>
+      <!-- HDF5 -->
+      <match value="\211HDF\r\n\032" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.hdf"/>
+    <glob pattern="*.he5"/>
+    <glob pattern="*.h5"/>
+  </mime-type>
+
+  <mime-type type="application/x-hwp">
+    <magic priority="50">
+      <!--
+        TIKA-330: Detection pattern based on signature strings from
+        the hwpfilter/source/hwpfile.cpp file in OpenOffice.org.
+      -->
+      <match value="HWP Document File V" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-ibooks+zip">
+    <sub-class-of type="application/epub+zip" />
+    <acronym>iBooks</acronym>
+    <_comment>Apple iBooks Author publication format</_comment>
+    <magic priority="50">
+      <match value="PK\003\004" type="string" offset="0">
+        <match value="mimetypeapplication/x-ibooks+zip" type="string" offset="30"/>
+      </match>
+    </magic>
+    <glob pattern="*.ibooks"/>
+  </mime-type>
+
+  <mime-type type="application/x-iso9660-image">
+    <acronym>ISO</acronym>
+    <_comment>ISO 9660 CD-ROM filesystem data</_comment>
+    <magic priority="50">
+      <match value="CD001" type="string" offset="32769"/>
+      <match value="CD001" type="string" offset="34817"/>
+      <match value="CD001" type="string" offset="36865"/>
+    </magic>
+    <glob pattern="*.iso"/>
+  </mime-type>
+
+  <mime-type type="application/x-itunes-ipa">
+    <sub-class-of type="application/zip"/>
+    <_comment>Apple iOS IPA AppStore file</_comment>
+    <glob pattern="*.ipa"/>
+  </mime-type>
+
+  <mime-type type="application/x-java-jnlp-file">
+    <glob pattern="*.jnlp"/>
+  </mime-type>
+
+  <mime-type type="application/x-java-pack200">
+    <glob pattern="*.pack"/>
+  </mime-type>
+
+  <mime-type type="application/x-kdelnk">
+    <magic priority="50">
+      <match value="[KDE\ Desktop\ Entry]" type="string" offset="0"/>
+      <match value="#\ KDE\ Config\ File" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-latex">
+    <_comment>LaTeX Source Document</_comment>
+    <magic priority="50">
+      <match value="%\ -*-latex-*-" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.latex"/>
+    <sub-class-of type="application/x-tex"/>
+  </mime-type>
+
+  <mime-type type="application/x-lha">
+    <magic priority="50">
+      <match value="-lzs-" type="string" offset="2"/>
+      <match value="-lh\40-" type="string" offset="2"/>
+      <match value="-lhd-" type="string" offset="2"/>
+      <match value="-lh2-" type="string" offset="2"/>
+      <match value="-lh3-" type="string" offset="2"/>
+      <match value="-lh4-" type="string" offset="2"/>
+      <match value="-lh5-" type="string" offset="2"/>
+      <match value="-lh6-" type="string" offset="2"/>
+      <match value="-lh7-" type="string" offset="2"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-lharc">
+    <magic priority="50">
+      <match value="-lh0-" type="string" offset="2"/>
+      <match value="-lh1-" type="string" offset="2"/>
+      <match value="-lz4-" type="string" offset="2"/>
+      <match value="-lz5-" type="string" offset="2"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-mobipocket-ebook">
+    <glob pattern="*.prc"/>
+    <glob pattern="*.mobi"/>
+  </mime-type>
+  <mime-type type="application/x-ms-application">
+    <glob pattern="*.application"/>
+  </mime-type>
+  <mime-type type="application/x-ms-wmd">
+    <glob pattern="*.wmd"/>
+  </mime-type>
+  <mime-type type="application/x-ms-wmz">
+    <sub-class-of type="application/x-gzip"/>
+    <glob pattern="*.wmz"/>
+  </mime-type>
+  <mime-type type="application/x-ms-xbap">
+    <glob pattern="*.xbap"/>
+  </mime-type>
+  <mime-type type="application/x-msaccess">
+    <glob pattern="*.mdb"/>
+    <magic priority="60">
+      <match value="0x000100005374616e" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-msbinder">
+    <glob pattern="*.obd"/>
+  </mime-type>
+  <mime-type type="application/x-mscardfile">
+    <glob pattern="*.crd"/>
+  </mime-type>
+  <mime-type type="application/x-msclip">
+    <glob pattern="*.clp"/>
+  </mime-type>
+
+  <mime-type type="application/x-msdownload">
+    <glob pattern="*.dll"/>
+    <glob pattern="*.com"/>
+    <glob pattern="*.bat"/>
+    <glob pattern="*.msi"/>
+    <magic priority="50">
+      <match value="MZ" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-msdownload;format=pe">
+    <sub-class-of type="application/x-msdownload"/>
+    <magic priority="55">
+      <!-- Technically the header offset is stored at 0x3c, and isn't a -->
+      <!-- constant, but it's almost always set to start at 0x80 or 0xf0 -->
+      <match value="PE\000\000" type="string" offset="128"/>
+      <match value="PE\000\000" type="string" offset="240"/>
+    </magic>
+  </mime-type>
+  <!-- the PE header should be PEx00x00 then a two byte machine type -->
+  <mime-type type="application/x-msdownload;format=pe32">
+    <sub-class-of type="application/x-msdownload;format=pe"/>
+    <magic priority="60">
+      <match value="PE\000\000" type="string" offset="128">
+         <match value="0x014c" type="little16" offset="132"/>
+      </match>
+      <match value="PE\000\000" type="string" offset="240">
+         <match value="0x014c" type="little16" offset="244"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-msdownload;format=pe64">
+    <sub-class-of type="application/x-msdownload;format=pe"/>
+    <magic priority="60">
+      <match value="PE\000\000" type="string" offset="128">
+         <match value="0x8664" type="little16" offset="132"/>
+      </match>
+      <match value="PE\000\000" type="string" offset="240">
+         <match value="0x8664" type="little16" offset="244"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-msdownload;format=pe-itanium">
+    <sub-class-of type="application/x-msdownload;format=pe"/>
+    <magic priority="60">
+      <match value="PE\000\000" type="string" offset="128">
+         <match value="0x0200" type="little16" offset="132"/>
+      </match>
+      <match value="PE\000\000" type="string" offset="240">
+         <match value="0x0200" type="little16" offset="244"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-msdownload;format=pe-armLE">
+    <sub-class-of type="application/x-msdownload;format=pe"/>
+    <magic priority="60">
+      <match value="pe\000\000" type="string" offset="128">
+         <match value="0x01c0" type="little16" offset="132"/>
+      </match>
+      <match value="pe\000\000" type="string" offset="240">
+         <match value="0x01c0" type="little16" offset="244"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-msdownload;format=pe-arm7">
+    <sub-class-of type="application/x-msdownload;format=pe"/>
+    <magic priority="60">
+      <match value="pe\000\000" type="string" offset="128">
+         <match value="0x01c4" type="little16" offset="132"/>
+      </match>
+      <match value="pe\000\000" type="string" offset="240">
+         <match value="0x01c4" type="little16" offset="244"/>
+      </match>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-msmediaview">
+    <glob pattern="*.mvb"/>
+    <glob pattern="*.m13"/>
+    <glob pattern="*.m14"/>
+  </mime-type>
+  <mime-type type="application/x-msmetafile">
+    <alias type="image/x-wmf"/>
+    <acronym>WMF</acronym>
+    <_comment>Windows Metafile</_comment>
+    <glob pattern="*.wmf"/>
+    <magic priority="50">
+      <match value="0xd7cdc69a0000" type="string" offset="0"/>
+      <match value="0x010009000003" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-msmoney">
+    <glob pattern="*.mny"/>
+    <magic priority="60">
+      <match value="0x000100004D534953414D204461746162617365" type="string" offset="0" />
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-mspublisher">
+    <glob pattern="*.pub"/>
+  </mime-type>
+  <mime-type type="application/x-msschedule">
+    <glob pattern="*.scd"/>
+  </mime-type>
+  <mime-type type="application/x-msterminal">
+    <glob pattern="*.trm"/>
+  </mime-type>
+  <mime-type type="application/x-mswrite">
+    <glob pattern="*.wri"/>
+  </mime-type>
+  <mime-type type="application/x-netcdf">
+    <glob pattern="*.nc"/>
+    <glob pattern="*.cdf"/>
+  </mime-type>
+  <mime-type type="application/x-pkcs12">
+    <glob pattern="*.p12"/>
+    <glob pattern="*.pfx"/>
+  </mime-type>
+  <mime-type type="application/x-pkcs7-certificates">
+    <glob pattern="*.p7b"/>
+    <glob pattern="*.spc"/>
+  </mime-type>
+  <mime-type type="application/x-pkcs7-certreqresp">
+    <glob pattern="*.p7r"/>
+  </mime-type>
+
+  <mime-type type="application/x-prt">
+    <glob pattern="*.prt"/>
+    <magic priority="50">
+      <match value="0M3C" type="string" offset="8" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-quattro-pro">
+    <glob pattern="*.qpw"/>
+    <glob pattern="*.wb1"/>
+    <glob pattern="*.wb2"/>
+    <glob pattern="*.wb3"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/x-rar-compressed">
+    <_comment>RAR archive</_comment>
+    <alias type="application/x-rar"/>
+    <magic priority="50">
+      <match value="Rar!" type="string" offset="0"/>
+      <match value="\x52\x61\x72\x21\x1a" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.rar"/>
+  </mime-type>
+
+  <mime-type type="application/x-roxio-toast">
+    <glob pattern="*.toast"/>
+    <sub-class-of type="application/x-iso9660-image"/>
+  </mime-type>
+
+  <mime-type type="application/x-rpm">
+    <_comment>RedHat Package Manager</_comment>
+    <glob pattern="*.rpm"/>
+    <magic priority="50">
+      <match value="\xed\xab\xee\xdb" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-sas">
+    <_comment>SAS Program</_comment>
+    <glob pattern="*.sas"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+  <mime-type type="application/x-sas-program-data">
+    <_comment>SAS Stored Program (DATA Step)</_comment>
+    <glob pattern="*.ss7"/>
+    <glob pattern="*.sas7bpgm"/>
+  </mime-type>
+  <mime-type type="application/x-sas-audit">
+    <_comment>SAS Audit</_comment>
+    <glob pattern="*.st7"/>
+    <glob pattern="*.sas7baud"/>
+  </mime-type>
+  <mime-type type="application/x-sas-data">
+    <_comment>SAS Data Set</_comment>
+    <glob pattern="*.sd7"/>
+    <glob pattern="*.sas7bdat"/>
+    <magic priority="40">
+      <match value="SAS FILE" type="string" offset="84" />
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-sas-view">
+    <_comment>SAS Data Set View</_comment>
+    <glob pattern="*.sv7"/>
+    <glob pattern="*.sas7bvew"/>
+  </mime-type>
+  <mime-type type="application/x-sas-data-index">
+    <_comment>SAS Data Set Index</_comment>
+    <glob pattern="*.si7"/>
+    <glob pattern="*.sas7bndx"/>
+  </mime-type>
+  <mime-type type="application/x-sas-catalog">
+    <_comment>SAS Catalog</_comment>
+    <glob pattern="*.sc7"/>
+    <glob pattern="*.sas7bcat"/>
+  </mime-type>
+  <mime-type type="application/x-sas-access">
+    <_comment>SAS Access Descriptor</_comment>
+    <glob pattern="*.sa7"/>
+    <glob pattern="*.sas7bacs"/>
+  </mime-type>
+  <mime-type type="application/x-sas-fdb">
+    <_comment>SAS FDB Consolidation Database File</_comment>
+    <glob pattern="*.sf7"/>
+    <glob pattern="*.sas7bfdb"/>
+  </mime-type>
+  <mime-type type="application/x-sas-mddb">
+    <_comment>SAS MDDB Multi-Dimensional Database File</_comment>
+    <glob pattern="*.sm7"/>
+    <glob pattern="*.sas7bmdb"/>
+  </mime-type>
+  <mime-type type="application/x-sas-dmdb">
+    <_comment>SAS DMDB Data Mining Database File</_comment>
+    <glob pattern="*.s7m"/>
+    <glob pattern="*.sas7bdmd"/>
+  </mime-type>
+  <mime-type type="application/x-sas-itemstor">
+    <_comment>SAS Item Store (ItemStor) File</_comment>
+    <glob pattern="*.sr7"/>
+    <glob pattern="*.sas7bitm"/>
+  </mime-type>
+  <mime-type type="application/x-sas-utility">
+    <_comment>SAS Utility</_comment>
+    <glob pattern="*.su7"/>
+    <glob pattern="*.sas7butl"/>
+  </mime-type>
+  <mime-type type="application/x-sas-putility">
+    <_comment>SAS Permanent Utility</_comment>
+    <glob pattern="*.sp7"/>
+    <glob pattern="*.sas7bput"/>
+  </mime-type>
+  <mime-type type="application/x-sas-transport">
+    <_comment>SAS Transport File</_comment>
+    <glob pattern="*.stx"/>
+  </mime-type>
+  <mime-type type="application/x-sas-backup">
+    <_comment>SAS Backup</_comment>
+    <glob pattern="*.sas7bbak"/>
+  </mime-type>
+
+  <mime-type type="application/x-sc">
+    <magic priority="50">
+      <match value="Spreadsheet" type="string" offset="38"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-sh">
+    <_comment>UNIX/LINUX Shell Script</_comment>
+    <magic priority="50">
+      <match value="#!/" type="string" offset="0"/>
+      <match value="#!\ /" type="string" offset="0"/>
+      <match value="#!\t/" type="string" offset="0"/>
+      <match value="eval &quot;exec" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.sh"/>
+    <glob pattern="*.bash"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="application/x-shar">
+    <glob pattern="*.shar"/>
+  </mime-type>
+
+  <mime-type type="application/x-shockwave-flash">
+    <acronym>Flash</acronym>
+    <_comment>Adobe Flash</_comment>
+    <magic priority="50">
+      <match value="FWS" type="string" offset="0"/> <!-- F = Uncompressed -->
+      <match value="CWS" type="string" offset="0"/> <!-- C = Compressed   -->
+    </magic>
+    <glob pattern="*.swf"/>
+  </mime-type>
+
+  <mime-type type="application/x-silverlight-app">
+    <glob pattern="*.xap"/>
+  </mime-type>
+
+  <mime-type type="application/x-stuffit">
+    <magic priority="50">
+      <match value="StuffIt" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.sit"/>
+  </mime-type>
+
+  <mime-type type="application/x-stuffitx">
+    <glob pattern="*.sitx"/>
+  </mime-type>
+  <mime-type type="application/x-sv4cpio">
+    <glob pattern="*.sv4cpio"/>
+  </mime-type>
+  <mime-type type="application/x-sv4crc">
+    <glob pattern="*.sv4crc"/>
+  </mime-type>
+
+  <mime-type type="application/x-tar">
+    <magic priority="40">
+      <!-- POSIX tar archive -->
+      <match value="ustar\0" type="string" offset="257" />
+    </magic>
+    <glob pattern="*.tar"/>
+  </mime-type>
+
+  <mime-type type="application/x-tex">
+    <_comment>TeX Source</_comment>
+    <alias type="text/x-tex"/>
+    <magic priority="50">
+      <match value="\\input" type="string" offset="0"/>
+      <match value="\\section" type="string" offset="0"/>
+      <match value="\\setlength" type="string" offset="0"/>
+      <match value="\\documentstyle" type="string" offset="0"/>
+      <match value="\\chapter" type="string" offset="0"/>
+      <match value="\\documentclass" type="string" offset="0"/>
+      <match value="\\relax" type="string" offset="0"/>
+      <match value="\\contentsline" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.tex"/>
+  </mime-type>
+
+  <mime-type type="application/x-tex-tfm">
+    <glob pattern="*.tfm"/>
+  </mime-type>
+
+  <mime-type type="application/x-texinfo">
+    <alias type="text/x-texinfo" />
+    <magic priority="50">
+      <match value="\\input\ texinfo" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.texinfo"/>
+    <glob pattern="*.texi"/>
+  </mime-type>
+
+  <!-- =================================================================== -->
+  <!-- Microsoft Office binary file formats                                -->
+  <!-- http://www.microsoft.com/interop/docs/OfficeBinaryFormats.mspx      -->
+  <!-- =================================================================== -->
+  <mime-type type="application/x-tika-msoffice">
+    <magic priority="40">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-tika-msoffice-embedded">
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+  <mime-type type="application/x-tika-msoffice-embedded;format=ole10_native">
+    <sub-class-of type="application/x-tika-msoffice-embedded"/>
+    <_comment>OLE10 Native Embedded Document</_comment>
+  </mime-type>
+  <mime-type type="application/x-tika-msoffice-embedded;format=comp_obj">
+    <sub-class-of type="application/x-tika-msoffice-embedded"/>
+    <_comment>CompObj OLE2 Embedded Document</_comment>
+  </mime-type>
+
+  <mime-type type="application/x-tika-msworks-spreadsheet">
+    <glob pattern="*.xlr"/>
+    <sub-class-of type="application/vnd.ms-excel"/>
+    <!-- this has to be highter than the Excel match -->
+    <magic priority="60">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="W\x00k\x00s\x00S\x00S\x00W\x00o\x00r\x00k\x00B\x00o\x00o\x00k" type="string" offset="1152:4096" />
+      </match>
+    </magic>
+  </mime-type>
+
+  <!-- =================================================================== -->
+  <!-- Office Open XML file formats                                        -->
+  <!-- http://www.ecma-international.org/publications/standards/Ecma-376.htm -->
+  <!-- =================================================================== -->
+  <mime-type type="application/x-tika-ooxml">
+    <sub-class-of type="application/zip"/>
+    <magic priority="50">
+      <match value="PK\003\004" type="string" offset="0">
+        <match value="[Content_Types].xml" type="string" offset="30"/>
+      </match>
+    </magic>
+  </mime-type>
+
+  <!-- Note - password protected OOXML files are actually stored in -->
+  <!--  an OLE2 (application/x-tika-msoffice) container -->
+  <mime-type type="application/x-tika-ooxml-protected">
+    <sub-class-of type="application/x-tika-ooxml"/>
+    <_comment>Password Protected OOXML File</_comment>
+  </mime-type>
+
+  <!-- Older StarOffice formats extend up the Microsoft OLE2 format -->
+  <mime-type type="application/x-tika-staroffice">
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/x-uc2-compressed">
+    <magic priority="50">
+      <match value="UC2\x1a" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.uc2"/>
+  </mime-type>
+  <mime-type type="application/x-ustar">
+    <glob pattern="*.ustar"/>
+  </mime-type>
+
+  <mime-type type="application/x-vmdk">
+    <acronym>VMDK</acronym>
+    <_comment>Virtual Disk Format</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/VMDK</tika:link>
+    <glob pattern="*.vmdk"/>
+  </mime-type>
+
+  <mime-type type="application/x-wais-source">
+    <glob pattern="*.src"/>
+  </mime-type>
+  <mime-type type="application/x-webarchive">
+    <sub-class-of type="application/x-bplist"/>
+    <glob pattern="*.webarchive"/>
+  </mime-type>
+  <mime-type type="application/x-x509-ca-cert">
+    <glob pattern="*.der"/>
+    <glob pattern="*.crt"/>
+  </mime-type>
+  <mime-type type="application/x-xfig">
+    <glob pattern="*.fig"/>
+  </mime-type>
+  <mime-type type="application/x-xpinstall">
+    <glob pattern="*.xpi"/>
+  </mime-type>
+
+  <mime-type type="application/x-xmind">
+    <_comment>XMind Pro</_comment>
+    <sub-class-of type="application/zip"/>
+    <glob pattern="*.xmind"/>
+    <!-- .xmap is also used, but that extension is more common elsewhere -->
+<!-- <glob pattern="*.xmap"/> -->
+  </mime-type>
+
+  <mime-type type="application/x-xz">
+    <glob pattern="*.xz"/>
+    <magic priority="50">
+      <match value="\3757zXZ\000" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-zoo">
+    <magic priority="50">
+      <match value="0xfdc4a7dc" type="little32" offset="20"/>
+    </magic>
+    <glob pattern="*.zoo"/>
+  </mime-type>
+
+  <mime-type type="application/x400-bp"/>
+  <mime-type type="application/xcap-att+xml"/>
+  <mime-type type="application/xcap-caps+xml"/>
+  <mime-type type="application/xcap-el+xml"/>
+  <mime-type type="application/xcap-error+xml"/>
+  <mime-type type="application/xcap-ns+xml"/>
+  <mime-type type="application/xcon-conference-info-diff+xml"/>
+  <mime-type type="application/xcon-conference-info+xml"/>
+  <mime-type type="application/xenc+xml">
+    <glob pattern="*.xenc"/>
+  </mime-type>
+
+  <mime-type type="application/xhtml+xml">
+    <magic priority="50">
+      <match value="&lt;html xmlns=" type="string" offset="0:8192"/>
+    </magic>
+    <root-XML namespaceURI="http://www.w3.org/1999/xhtml" localName="html"/>
+    <glob pattern="*.xhtml"/>
+    <glob pattern="*.xht"/>
+  </mime-type>
+
+  <mime-type type="application/xhtml-voice+xml"/>
+
+  <mime-type type="application/xml">
+    <acronym>XML</acronym>
+    <_comment>Extensible Markup Language</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/Xml</tika:link>
+    <tika:uti>public.xml</tika:uti>
+    <alias type="text/xml"/>
+    <alias type="application/x-xml"/>
+    <magic priority="50">
+      <match value="&lt;?xml" type="string" offset="0"/>
+      <match value="&lt;?XML" type="string" offset="0"/>
+      <match value="&lt;!--" type="string" offset="0"/>
+      <!-- UTF-8 BOM -->
+      <match value="0xEFBBBF3C3F786D6C" type="string" offset="0"/>
+      <!-- UTF-16 LE/BE -->
+      <match value="0xFFFE3C003F0078006D006C00" type="string" offset="0"/>
+      <match value="0xFEFF003C003F0078006D006C" type="string" offset="0"/>
+      <!-- TODO: Add matches for the other possible XML encoding schemes -->
+    </magic>
+    <glob pattern="*.xml"/>
+    <glob pattern="*.xsl"/>
+    <glob pattern="*.xsd"/>
+    <sub-class-of type="text/plain" />
+  </mime-type>
+
+  <mime-type type="application/xml-dtd">
+    <_comment>XML Document Type Definition</_comment>
+    <sub-class-of type="text/plain"/>
+    <alias type="text/x-dtd"/>
+    <glob pattern="*.dtd"/>
+  </mime-type>
+
+  <mime-type type="application/xml-external-parsed-entity">
+    <alias type="text/xml-external-parsed-entity"/>
+  </mime-type>
+
+  <mime-type type="application/xmpp+xml"/>
+  <mime-type type="application/xop+xml">
+    <glob pattern="*.xop"/>
+  </mime-type>
+
+ <mime-type type="application/xslfo+xml">
+    <alias type="text/xsl"/>
+    <acronym>XSLFO</acronym>
+    <_comment>XSL Format</_comment>
+    <root-XML localName="root"
+              namespaceURI="http://www.w3.org/1999/XSL/Format"/>
+    <glob pattern="*.xslfo"/>
+    <glob pattern="*.fo"/>
+  </mime-type>
+
+  <mime-type type="application/xslt+xml">
+    <alias type="text/xsl"/>
+    <acronym>XSLT</acronym>
+    <_comment>XSL Transformations</_comment>
+    <root-XML localName="stylesheet"
+              namespaceURI="http://www.w3.org/1999/XSL/Transform"/>
+    <glob pattern="*.xslt"/>
+  </mime-type>
+
+  <mime-type type="application/xspf+xml">
+    <acronym>XSPF</acronym>
+    <_comment>XML Shareable Playlist Format</_comment>
+    <root-XML localName="playlist"
+              namespaceURI="http://xspf.org/ns/0/"/>
+    <glob pattern="*.xspf"/>
+  </mime-type>
+
+  <mime-type type="application/xv+xml">
+    <glob pattern="*.mxml"/>
+    <glob pattern="*.xhvml"/>
+    <glob pattern="*.xvml"/>
+    <glob pattern="*.xvm"/>
+  </mime-type>
+
+  <mime-type type="application/zip">
+    <_comment>Compressed Archive File</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/ZIP_(file_format)</tika:link>
+    <tika:uti>com.pkware.zip-archive</tika:uti>
+    <alias type="application/x-zip-compressed"/>
+    <magic priority="50">
+      <match value="PK\003\004" type="string" offset="0"/>
+      <match value="PK\005\006" type="string" offset="0"/>
+      <match value="PK\x07\x08" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.zip"/>
+  </mime-type>
+
+  <mime-type type="application/x-7z-compressed">
+    <acronym>7zip</acronym>
+    <_comment>7-zip archive</_comment>
+    <magic priority="50">
+      <!-- Magic: '7', 'z', 0xBC, 0xAF, 0x27, 0x1C -->
+      <match value="7z" type="string" offset="0:1" >
+        <match value="0xBCAF271C" type="string" offset="2:5" />
+      </match>
+    </magic>
+    <glob pattern="*.7z" />
+  </mime-type>
+
+  <mime-type type="audio/32kadpcm"/>
+  <mime-type type="audio/3gpp"/>
+  <mime-type type="audio/3gpp2"/>
+  <mime-type type="audio/ac3"/>
+  <mime-type type="audio/adpcm">
+    <glob pattern="*.adp"/>
+  </mime-type>
+
+  <mime-type type="audio/amr">
+    <glob pattern="*.amr"/>
+    <magic priority="40">
+      <!-- Specific match for the original AMR format -->
+      <match value="#!AMR\n" type="string" offset="0"/>
+      <!-- General match for AMR subtypes we don't have entries for -->
+      <match value="#!AMR" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+  <mime-type type="audio/amr-wb">
+    <sub-class-of type="audio/amr"/>
+    <magic priority="50">
+      <match value="#!AMR-WB\n" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+  <mime-type type="audio/amr-wb+">
+    <sub-class-of type="audio/amr"/>
+    <!-- TIKA-1156 sample needed - might be "#!AMR-WB+\n" ? -->
+  </mime-type>
+
+  <mime-type type="audio/asc"/>
+
+  <mime-type type="audio/basic">
+    <_comment>uLaw/AU Audio File</_comment>
+    <magic priority="20">
+      <match value=".snd" type="string" offset="0">
+        <match value="1" type="big32" offset="12"/>
+        <match value="2" type="big32" offset="12"/>
+        <match value="3" type="big32" offset="12"/>
+        <match value="4" type="big32" offset="12"/>
+        <match value="5" type="big32" offset="12"/>
+        <match value="6" type="big32" offset="12"/>
+        <match value="7" type="big32" offset="12"/>
+      </match>
+      <match offset="0" type="string" value="\x2e\x73\x6e\x64\x00\x00\x00"/>
+    </magic>
+    <glob pattern="*.au"/>
+    <glob pattern="*.snd"/>
+  </mime-type>
+
+  <mime-type type="audio/bv16"/>
+  <mime-type type="audio/bv32"/>
+  <mime-type type="audio/clearmode"/>
+  <mime-type type="audio/cn"/>
+  <mime-type type="audio/dat12"/>
+  <mime-type type="audio/dls"/>
+  <mime-type type="audio/dsr-es201108"/>
+  <mime-type type="audio/dsr-es202050"/>
+  <mime-type type="audio/dsr-es202211"/>
+  <mime-type type="audio/dsr-es202212"/>
+  <mime-type type="audio/dvi4"/>
+  <mime-type type="audio/eac3"/>
+  <mime-type type="audio/evrc"/>
+  <mime-type type="audio/evrc-qcp"/>
+  <mime-type type="audio/evrc0"/>
+  <mime-type type="audio/evrc1"/>
+  <mime-type type="audio/evrcb"/>
+  <mime-type type="audio/evrcb0"/>
+  <mime-type type="audio/evrcb1"/>
+  <mime-type type="audio/evrcwb"/>
+  <mime-type type="audio/evrcwb0"/>
+  <mime-type type="audio/evrcwb1"/>
+  <mime-type type="audio/example"/>
+  <mime-type type="audio/g719"/>
+  <mime-type type="audio/g722"/>
+  <mime-type type="audio/g7221"/>
+  <mime-type type="audio/g723"/>
+  <mime-type type="audio/g726-16"/>
+  <mime-type type="audio/g726-24"/>
+  <mime-type type="audio/g726-32"/>
+  <mime-type type="audio/g726-40"/>
+  <mime-type type="audio/g728"/>
+  <mime-type type="audio/g729"/>
+  <mime-type type="audio/g7291"/>
+  <mime-type type="audio/g729d"/>
+  <mime-type type="audio/g729e"/>
+  <mime-type type="audio/gsm"/>
+  <mime-type type="audio/gsm-efr"/>
+  <mime-type type="audio/ilbc"/>
+  <mime-type type="audio/l16"/>
+  <mime-type type="audio/l20"/>
+  <mime-type type="audio/l24"/>
+  <mime-type type="audio/l8"/>
+  <mime-type type="audio/lpc"/>
+
+  <mime-type type="audio/midi">
+    <acronym>MIDI</acronym>
+    <_comment>Musical Instrument Digital Interface</_comment>
+    <magic priority ="20">
+      <match type="string" value="MThd" offset="0"/>
+    </magic>
+    <glob pattern="*.mid"/>
+    <glob pattern="*.midi"/>
+    <glob pattern="*.kar"/>
+    <glob pattern="*.rmi"/>
+  </mime-type>
+
+  <mime-type type="audio/mobile-xmf"/>
+  <mime-type type="audio/mp4">
+    <alias type="audio/x-m4a"/>
+    <alias type="audio/x-mp4a"/>
+    <magic priority="60">
+      <match value="ftypM4A " type="string" offset="4"/>
+      <match value="ftypM4B " type="string" offset="4"/>
+      <match value="ftypF4A " type="string" offset="4"/>
+      <match value="ftypF4B " type="string" offset="4"/>
+    </magic>
+    <glob pattern="*.mp4a"/>
+    <glob pattern="*.m4a"/>
+    <glob pattern="*.m4b"/>
+  </mime-type>
+  <mime-type type="audio/mp4a-latm"/>
+  <mime-type type="audio/mpa"/>
+  <mime-type type="audio/mpa-robust"/>
+
+  <mime-type type="audio/mpeg">
+    <alias type="audio/x-mpeg"/>
+    <acronym>MP3</acronym>
+    <_comment>MPEG-1 Audio Layer 3</_comment>
+    <magic priority="20">
+      <!-- http://mpgedit.org/mpgedit/mpeg_format/MP3Format.html -->
+      <!-- Bit pattern for first two bytes: 11111111 111VVLLC    -->
+      <!-- VV = MPEG Audio Version ID; 10 = V2, 11 = V1          -->
+      <!-- LL = Layer description; 01 = L3, 10 = L2, 11 = L1     -->
+      <!-- C = Protection bit; 0 = CRC, 1 = no CRC               -->
+      <match value="0xfff2" type="string" offset="0"/> <!-- V2, L3, CRC -->
+      <match value="0xfff3" type="string" offset="0"/> <!-- V2, L3      -->
+      <match value="0xfff4" type="string" offset="0"/> <!-- V2, L2, CRC -->
+      <match value="0xfff5" type="string" offset="0"/> <!-- V2, L2      -->
+      <match value="0xfff6" type="string" offset="0"/> <!-- V2, L1, CRC -->
+      <match value="0xfff7" type="string" offset="0"/> <!-- V2, L1      -->
+      <match value="0xfffa" type="string" offset="0"/> <!-- V1, L3, CRC -->
+      <match value="0xfffb" type="string" offset="0"/> <!-- V1, L3      -->
+      <match value="0xfffc" type="string" offset="0"/> <!-- V1, L2, CRC -->
+      <match value="0xfffd" type="string" offset="0"/> <!-- V1, L2      -->
+      <!-- TIKA-417: This is the UTF-16 LE byte order mark! -->
+      <!-- match value="0xfffe" type="string" offset="0"/ --> <!-- V1, L1, CRC -->
+      <match value="0xffff" type="string" offset="0"/> <!-- V1, L1      -->
+      <match value="ID3" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.mpga"/>
+    <glob pattern="*.mp2"/>
+    <glob pattern="*.mp2a"/>
+    <glob pattern="*.mp3"/>
+    <glob pattern="*.m2a"/>
+    <glob pattern="*.m3a"/>
+  </mime-type>
+
+  <mime-type type="audio/mpeg4-generic"/>
+
+  <mime-type type="audio/ogg">
+    <_comment>Ogg Vorbis Audio</_comment>
+    <glob pattern="*.oga"/>
+    <sub-class-of type="application/ogg"/>
+  </mime-type>
+
+  <mime-type type="audio/vorbis">
+    <_comment>Ogg Vorbis Codec Compressed WAV File</_comment>
+    <alias type="application/x-ogg"/>
+    <magic priority="60">
+      <!-- For a single stream file -->
+      <match value="OggS\000.......................\001vorbis" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFFFFFF"
+             offset="0"/>
+      <match value="\x4f\x67\x67\x53\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00"
+             type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.ogg"/>
+    <sub-class-of type="audio/ogg"/>
+  </mime-type>
+
+  <mime-type type="audio/x-oggflac">
+    <_comment>Ogg Packaged Free Lossless Audio Codec</_comment>
+    <alias type="audio/x-ogg-flac"/>
+    <magic priority="60">
+      <!-- For a single stream file -->
+      <match value="OggS\000.......................FLAC" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFF"
+             offset="0"/>
+    </magic>
+    <sub-class-of type="audio/ogg"/>
+  </mime-type>
+
+  <mime-type type="audio/x-oggpcm">
+    <_comment>Ogg Packaged Unompressed WAV File</_comment>
+    <alias type="audio/x-ogg-pcm"/>
+    <magic priority="60">
+      <!-- For a single stream file -->
+      <match value="OggS\000.......................PCM     " type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF"
+             offset="0"/>
+    </magic>
+    <sub-class-of type="audio/ogg"/>
+  </mime-type>
+
+  <mime-type type="audio/opus">
+    <_comment>Ogg Opus Codec Compressed WAV File</_comment>
+    <magic priority="60">
+      <!-- For a single stream file -->
+      <match value="OggS\000.......................OpusHead" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF"
+             offset="0"/>
+    </magic>
+    <glob pattern="*.opus"/>
+    <sub-class-of type="audio/ogg"/>
+  </mime-type>
+
+  <mime-type type="audio/speex">
+    <_comment>Ogg Speex Codec Compressed WAV File</_comment>
+    <alias type="application/x-speex"/>
+    <magic priority="60">
+      <!-- For a single stream file -->
+      <match value="OggS\000.......................Speex   " type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF"
+             offset="0"/>
+    </magic>
+    <glob pattern="*.spx"/>
+    <sub-class-of type="audio/ogg"/>
+  </mime-type>
+
+  <mime-type type="audio/parityfec"/>
+  <mime-type type="audio/pcma"/>
+  <mime-type type="audio/pcma-wb"/>
+  <mime-type type="audio/pcmu-wb"/>
+  <mime-type type="audio/pcmu"/>
+
+  <mime-type type="audio/prs.sid">
+    <magic priority="50">
+      <match value="PSID" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="audio/qcelp"/>
+  <mime-type type="audio/red"/>
+  <mime-type type="audio/rtp-enc-aescm128"/>
+  <mime-type type="audio/rtp-midi"/>
+  <mime-type type="audio/rtx"/>
+  <mime-type type="audio/smv"/>
+  <mime-type type="audio/smv0"/>
+  <mime-type type="audio/smv-qcp"/>
+  <mime-type type="audio/sp-midi"/>
+  <mime-type type="audio/t140c"/>
+  <mime-type type="audio/t38"/>
+  <mime-type type="audio/telephone-event"/>
+  <mime-type type="audio/tone"/>
+  <mime-type type="audio/ulpfec"/>
+  <mime-type type="audio/vdvi"/>
+  <mime-type type="audio/vmr-wb"/>
+  <mime-type type="audio/vnd.3gpp.iufp"/>
+  <mime-type type="audio/vnd.4sb"/>
+  <mime-type type="audio/vnd.audiokoz"/>
+  <mime-type type="audio/vnd.adobe.soundbooth">
+    <glob pattern="*.asnd"/>
+  </mime-type>
+  <mime-type type="audio/vnd.celp"/>
+  <mime-type type="audio/vnd.cisco.nse"/>
+  <mime-type type="audio/vnd.cmles.radio-events"/>
+  <mime-type type="audio/vnd.cns.anp1"/>
+  <mime-type type="audio/vnd.cns.inf1"/>
+  <mime-type type="audio/vnd.digital-winds">
+    <glob pattern="*.eol"/>
+  </mime-type>
+  <mime-type type="audio/vnd.dlna.adts"/>
+  <mime-type type="audio/vnd.dolby.heaac.1"/>
+  <mime-type type="audio/vnd.dolby.heaac.2"/>
+  <mime-type type="audio/vnd.dolby.mlp"/>
+  <mime-type type="audio/vnd.dolby.mps"/>
+  <mime-type type="audio/vnd.dolby.pl2"/>
+  <mime-type type="audio/vnd.dolby.pl2x"/>
+  <mime-type type="audio/vnd.dolby.pl2z"/>
+  <mime-type type="audio/vnd.dts">
+    <glob pattern="*.dts"/>
+  </mime-type>
+  <mime-type type="audio/vnd.dts.hd">
+    <glob pattern="*.dtshd"/>
+  </mime-type>
+  <mime-type type="audio/vnd.everad.plj"/>
+  <mime-type type="audio/vnd.hns.audio"/>
+  <mime-type type="audio/vnd.lucent.voice">
+    <glob pattern="*.lvp"/>
+  </mime-type>
+  <mime-type type="audio/vnd.ms-playready.media.pya">
+    <glob pattern="*.pya"/>
+  </mime-type>
+  <mime-type type="audio/vnd.nokia.mobile-xmf"/>
+  <mime-type type="audio/vnd.nortel.vbk"/>
+  <mime-type type="audio/vnd.nuera.ecelp4800">
+    <glob pattern="*.ecelp4800"/>
+  </mime-type>
+  <mime-type type="audio/vnd.nuera.ecelp7470">
+    <glob pattern="*.ecelp7470"/>
+  </mime-type>
+  <mime-type type="audio/vnd.nuera.ecelp9600">
+    <glob pattern="*.ecelp9600"/>
+  </mime-type>
+  <mime-type type="audio/vnd.octel.sbc"/>
+  <mime-type type="audio/vnd.qcelp"/>
+  <mime-type type="audio/vnd.rhetorex.32kadpcm"/>
+  <mime-type type="audio/vnd.sealedmedia.softseal.mpeg"/>
+  <mime-type type="audio/vnd.vmx.cvsd"/>
+  <mime-type type="audio/vorbis-config"/>
+  <mime-type type="audio/x-aac">
+    <glob pattern="*.aac"/>
+  </mime-type>
+
+  <mime-type type="audio/x-adbcm">
+    <magic priority="20">
+      <match value=".snd" type="string" offset="0">
+        <match value="23" type="big32" offset="12"/>
+      </match>
+    </magic>
+  </mime-type>
+
+  <mime-type type="audio/x-aiff">
+    <alias type="audio/aiff"/>
+    <acronym>AIFF</acronym>
+    <_comment>Audio Interchange File Format</_comment>
+    <magic priority="20">
+      <match value="FORM....AIFF" type="string" offset="0"
+             mask="0xFFFFFFFF00000000FFFFFFFF"/>
+      <match value="FORM....AIFC" type="string" offset="0"
+             mask="0xFFFFFFFF00000000FFFFFFFF"/>
+      <!-- Amiga IFF sound sample, somewhat like the more modern AIFF -->
+      <match value="FORM....8SVX" type="string" offset="0"
+             mask="0xFFFFFFFF00000000FFFFFFFF"/>
+      <match offset="0" type="string" value="\x46\x4f\x52\x4d\x00"/>
+    </magic>
+    <glob pattern="*.aif"/>
+    <glob pattern="*.aiff"/>
+    <glob pattern="*.aifc"/>
+  </mime-type>
+
+  <mime-type type="audio/x-dec-basic">
+    <magic priority="20">
+      <match value="0x0064732E" type="big32" offset="0">
+        <match value="1" type="big32" offset="12"/>
+        <match value="2" type="big32" offset="12"/>
+        <match value="3" type="big32" offset="12"/>
+        <match value="4" type="big32" offset="12"/>
+        <match value="5" type="big32" offset="12"/>
+        <match value="6" type="big32" offset="12"/>
+        <match value="7" type="big32" offset="12"/>
+      </match>
+    </magic>
+  </mime-type>
+
+  <mime-type type="audio/x-dec-adbcm">
+    <magic priority="20">
+      <match value="0x0064732E" type="big32" offset="0">
+        <match value="23" type="big32" offset="12"/>
+      </match>
+    </magic>
+  </mime-type>
+
+  <mime-type type="audio/x-flac">
+    <acronym>FLAC</acronym>
+    <_comment>Free Lossless Audio Codec</_comment>
+    <magic priority="50">
+      <match value="fLaC" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.flac"/>
+  </mime-type>
+
+  <mime-type type="audio/x-mod">
+    <acronym>MOD</acronym>
+    <magic priority="50">
+      <match value="Extended\ Module:" type="string" offset="0"/>
+      <match value="BMOD2STM" type="string" offset="21"/>
+      <match value="M.K." type="string" offset="1080"/>
+      <match value="M!K!" type="string" offset="1080"/>
+      <match value="FLT4" type="string" offset="1080"/>
+      <match value="FLT8" type="string" offset="1080"/>
+      <match value="4CHN" type="string" offset="1080"/>
+      <match value="6CHN" type="string" offset="1080"/>
+      <match value="8CHN" type="string" offset="1080"/>
+      <match value="CD81" type="string" offset="1080"/>
+      <match value="OKTA" type="string" offset="1080"/>
+      <match value="16CN" type="string" offset="1080"/>
+      <match value="32CN" type="string" offset="1080"/>
+      <match value="IMPM" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.mod"/>
+  </mime-type>
+
+  <mime-type type="audio/x-mpegurl">
+    <_comment>MP3 Playlist File</_comment>
+    <magic priority="50">
+     <match offset="0" type="string" value="\x23\x45\x58\x54\x4d\x33\x55\x0d\x0a"/>
+    </magic>
+    <glob pattern="*.m3u"/>
+  </mime-type>
+
+  <mime-type type="audio/x-ms-wax">
+    <glob pattern="*.wax"/>
+  </mime-type>
+  <mime-type type="audio/x-ms-wma">
+    <sub-class-of type="video/x-ms-asf" />
+    <glob pattern="*.wma"/>
+    <magic priority="50">
+       <match value="Windows Media Audio" type="unicodeLE" offset="0:8192" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="audio/x-pn-realaudio">
+    <_comment>Real Audio</_comment>
+    <alias type="audio/x-realaudio" />
+    <magic priority="50">
+      <match value="0x2e7261fd" type="big32" offset="0"/>
+    </magic>
+    <glob pattern="*.ram"/>
+    <glob pattern="*.ra"/>
+  </mime-type>
+
+  <mime-type type="audio/x-pn-realaudio-plugin">
+    <_comment>RealMedia Player Plug-in</_comment>
+    <glob pattern="*.rmp"/>
+    <!-- <glob pattern="*.rpm"/> - conflicts with application/x-rpm -->
+  </mime-type>
+
+  <mime-type type="audio/x-wav">
+    <acronym>WAV</acronym>
+    <magic priority="20">
+      <match value="RIFF....WAVE" type="string" offset="0"
+             mask="0xFFFFFFFF00000000FFFFFFFF"/>
+    </magic>
+    <glob pattern="*.wav"/>
+  </mime-type>
+
+  <mime-type type="chemical/x-cdx">
+    <magic priority="50">
+      <match value="VjCD0100" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.cdx"/>
+  </mime-type>
+  <mime-type type="chemical/x-cif">
+    <glob pattern="*.cif"/>
+  </mime-type>
+  <mime-type type="chemical/x-cmdf">
+    <glob pattern="*.cmdf"/>
+  </mime-type>
+  <mime-type type="chemical/x-cml">
+    <glob pattern="*.cml"/>
+  </mime-type>
+  <mime-type type="chemical/x-csml">
+    <glob pattern="*.csml"/>
+  </mime-type>
+
+  <mime-type type="chemical/x-pdb">
+    <_comment>Brookhaven Protein Databank File</_comment>
+    <glob pattern="*.pdb"/>
+  </mime-type>
+
+  <mime-type type="chemical/x-xyz">
+    <glob pattern="*.xyz"/>
+  </mime-type>
+
+  <mime-type type="image/x-ms-bmp">
+    <alias type="image/bmp"/>
+    <acronym>BMP</acronym>
+    <_comment>Windows bitmap</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/BMP_file_format</tika:link>
+    <tika:uti>com.microsoft.bmp</tika:uti>
+    <magic priority="50">
+      <match value="BM" type="string" offset="0">
+        <match value="0x0100" type="string" offset="26">
+      	  <match value="0x0000" type="string" offset="28"/>
+      	  <match value="0x0100" type="string" offset="28"/>
+      	  <match value="0x0400" type="string" offset="28"/>
+      	  <match value="0x0800" type="string" offset="28"/>
+      	  <match value="0x1000" type="string" offset="28"/>
+      	  <match value="0x1800" type="string" offset="28"/>
+      	  <match value="0x2000" type="string" offset="28"/>
+        </match>
+      </match>
+    </magic>
+    <glob pattern="*.bmp"/>
+    <glob pattern="*.dib"/>
+  </mime-type>
+
+  <mime-type type="image/cgm">
+    <acronym>CGM</acronym>
+    <_comment>Computer Graphics Metafile</_comment>
+    <magic priority="50">
+      <match value="BEGMF" type="string" offset="0"/>
+      <match value="0x0020" mask="0xffe0" type="string" offset="0">
+        <match value="0x10220001" type="string" offset="2:64"/>
+        <match value="0x10220002" type="string" offset="2:64"/>
+        <match value="0x10220003" type="string" offset="2:64"/>
+        <match value="0x10220004" type="string" offset="2:64"/>
+      </match>
+    </magic>
+    <glob pattern="*.cgm"/>
+  </mime-type>
+
+  <mime-type type="image/example"/>
+
+  <mime-type type="image/fits">
+    <sub-class-of type="application/fits"/>
+  </mime-type>
+
+  <mime-type type="image/g3fax">
+    <glob pattern="*.g3"/>
+  </mime-type>
+
+  <mime-type type="image/gif">
+    <acronym>GIF</acronym>
+    <_comment>Graphics Interchange Format</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/Gif</tika:link>
+    <tika:uti>com.compuserve.gif</tika:uti>
+    <magic priority="50">
+      <match value="GIF87a" type="string" offset="0"/>
+      <match value="GIF89a" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.gif"/>
+  </mime-type>
+
+  <mime-type type="image/ief">
+    <glob pattern="*.ief"/>
+  </mime-type>
+
+  <mime-type type="image/jp2">
+    <sub-class-of type="image/x-jp2-container" />
+    <acronym>JP2</acronym>
+    <_comment>JPEG 2000 Part 1 (JP2)</_comment>
+    <magic priority="50">
+      <match value="0x0000000C6A5020200D0A870A" type="string" offset="0">
+        <match value="0x6a703220" type="string" offset="20"/>
+      </match>
+    </magic>
+    <glob pattern="*.jp2"/>
+  </mime-type>
+
+  <mime-type type="image/jpeg">
+    <acronym>JPEG</acronym>
+    <_comment>Joint Photographic Experts Group</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/Jpeg</tika:link>
+    <tika:uti>public.jpeg</tika:uti>
+    <magic priority="50">
+      <!-- FFD8 is the SOI (Start Of Image) marker.              -->
+      <!-- It is followed by another marker that starts with FF. -->
+      <match value="0xffd8ff" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.jpg"/>
+    <glob pattern="*.jpeg"/>
+    <glob pattern="*.jpe"/>
+    <glob pattern="*.jif"/>
+    <glob pattern="*.jfif"/>
+    <glob pattern="*.jfi"/>
+  </mime-type>
+
+  <mime-type type="image/jpm">
+    <alias type="video/jpm"/>
+    <sub-class-of type="image/x-jp2-container" />
+    <acronym>JP2</acronym>
+    <_comment>JPEG 2000 Part 6 (JPM)</_comment>
+    <magic priority="50">
+      <match value="0x0000000C6A5020200D0A870A" type="string" offset="0">
+        <match value="0x6a706d20" type="string" offset="20"/>
+      </match>
+    </magic>
+    <glob pattern="*.jpm"/>
+    <glob pattern="*.jpgm"/>
+  </mime-type>
+
+  <mime-type type="image/jpx">
+    <sub-class-of type="image/x-jp2-container" />
+    <acronym>JP2</acronym>
+    <_comment>JPEG 2000 Part 2 (JPX)</_comment>
+    <magic priority="50">
+      <match value="0x0000000C6A5020200D0A870A" type="string" offset="0">
+        <match value="0x6a707820" type="string" offset="20"/>
+      </match>
+    </magic>
+    <glob pattern="*.jpf"/>
+  </mime-type>
+
+  <mime-type type="image/naplps"/>
+
+  <mime-type type="image/nitf">
+    <alias type="image/ntf"/>
+    <magic priority="50">
+      <match value="NITF01.10" type="string" offset="0"/>
+      <match value="NITF02.000" type="string" offset="0"/>
+      <match value="NITF02.100" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.ntf"/>
+    <glob pattern="*.nitf"/>
+  </mime-type>
+
+  <mime-type type="image/png">
+    <acronym>PNG</acronym>
+    <_comment>Portable Network Graphics</_comment>
+    <magic priority="50">
+      <match value="\x89PNG\x0d\x0a\x1a\x0a" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.png"/>
+  </mime-type>
+
+  <mime-type type="image/prs.btif">
+    <glob pattern="*.btif"/>
+  </mime-type>
+  <mime-type type="image/prs.pti"/>
+
+  <mime-type type="image/svg+xml">
+    <sub-class-of type="application/xml"/>
+    <acronym>SVG</acronym>
+    <_comment>Scalable Vector Graphics</_comment>
+    <root-XML localName="svg" namespaceURI="http://www.w3.org/2000/svg"/>
+    <glob pattern="*.svg"/>
+    <glob pattern="*.svgz"/>
+  </mime-type>
+
+  <mime-type type="image/t38"/>
+
+  <mime-type type="image/tiff">
+    <acronym>TIFF</acronym>
+    <_comment>Tagged Image File Format</_comment>
+    <magic priority="50">
+      <!-- MM.* = Big endian (M=Motorola) and 0x002a in big endian    -->
+      <match value="MM\x00\x2a" type="string" offset="0"/>
+      <!-- II*. = Little endian (I=Intel) and 0x002a in little endian -->
+      <match value="II\x2a\x00" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.tiff"/>
+    <glob pattern="*.tif"/>
+  </mime-type>
+
+  <mime-type type="image/tiff-fx"/>
+
+  <mime-type type="image/vnd.adobe.photoshop">
+    <acronym>PSD</acronym>
+    <_comment>Photoshop Image</_comment>
+    <alias type="image/x-psd"/>
+    <alias type="application/photoshop"/>
+    <magic priority="50">
+      <!-- Version of 0x0001 is PSD -->
+      <match value="8BPS\x00\x01" type="string" offset="0"/>
+      <!-- Version of 0x0002 is PSB -->
+      <match value="8BPS\x00\x02" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.psd"/>
+  </mime-type>
+
+  <mime-type type="image/vnd.adobe.premiere">
+    <glob pattern="*.ppj"/>
+    <root-XML localName="PremiereData"/>
+    <sub-class-of type="application/xml"/>
+  </mime-type>
+
+  <mime-type type="image/vnd.cns.inf2"/>
+  <mime-type type="image/vnd.djvu">
+    <glob pattern="*.djvu"/>
+    <glob pattern="*.djv"/>
+  </mime-type>
+
+  <mime-type type="image/vnd.dwg">
+    <acronym>DWG</acronym>
+    <_comment>AutoCad Drawing</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/.dwg</tika:link>
+    <alias type="image/x-dwg"/>
+    <alias type="application/acad"/>
+    <alias type="application/x-acad"/>
+    <alias type="application/autocad_dwg"/>
+    <alias type="application/dwg"/>
+    <alias type="application/x-dwg"/>
+    <alias type="application/x-autocad"/>
+    <alias type="image/vnd.dwg"/>
+    <alias type="drawing/dwg"/>
+    <glob pattern="*.dwg"/>
+    <magic priority="50">
+      <match value="MC0.0" type="string" offset="0"/>
+      <match value="AC1.2" type="string" offset="0"/>
+      <match value="AC1.40" type="string" offset="0"/>
+      <match value="AC1.50" type="string" offset="0"/>
+      <match value="AC2.10" type="string" offset="0"/>
+      <match value="AC2.21" type="string" offset="0"/>
+      <match value="AC2.22" type="string" offset="0"/>
+      <!-- "AC" followed by four numbers -->
+      <match value="AC0000" type="string" offset="0"
+             mask="0xFFFFF0F0F0F0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="image/vnd.dxf">
+    <acronym>DXF</acronym>
+    <_comment>AutoCAD DXF</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/AutoCAD_DXF</tika:link>
+    <glob pattern="*.dxf"/>
+  </mime-type>
+  <mime-type type="image/vnd.fastbidsheet">
+    <glob pattern="*.fbs"/>
+  </mime-type>
+  <mime-type type="image/vnd.fpx">
+    <glob pattern="*.fpx"/>
+  </mime-type>
+  <mime-type type="image/vnd.fst">
+    <glob pattern="*.fst"/>
+  </mime-type>
+  <mime-type type="image/vnd.fujixerox.edmics-mmr">
+    <glob pattern="*.mmr"/>
+  </mime-type>
+  <mime-type type="image/vnd.fujixerox.edmics-rlc">
+    <glob pattern="*.rlc"/>
+  </mime-type>
+  <mime-type type="image/vnd.globalgraphics.pgb"/>
+
+  <mime-type type="image/vnd.microsoft.icon">
+    <acronym>ICO</acronym>
+    <tika:link>http://en.wikipedia.org/wiki/.ico</tika:link>
+    <tika:uti>com.microsoft.ico</tika:uti>
+    <alias type="image/x-icon" />
+    <magic priority="50">
+      <match value="\102\101\050\000\000\000\056\000\000\000\000\000\000\000"
+             type="string" offset="0"/>
+      <match value="\000\000\001\000" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.ico"/>
+  </mime-type>
+
+  <mime-type type="image/vnd.mix"/>
+  <mime-type type="image/vnd.ms-modi">
+       <glob pattern="*.mdi"/>
+       <_comment>Microsoft Document Imaging</_comment>
+       <magic priority="50">
+         <match value="0x45502A00" type="string" offset="0"/>
+       </magic>
+  </mime-type>
+
+  <mime-type type="image/vnd.net-fpx">
+    <glob pattern="*.npx"/>
+  </mime-type>
+  <mime-type type="image/vnd.radiance"/>
+  <mime-type type="image/vnd.sealed.png"/>
+  <mime-type type="image/vnd.sealedmedia.softseal.gif"/>
+  <mime-type type="image/vnd.sealedmedia.softseal.jpg"/>
+  <mime-type type="image/vnd.svf"/>
+
+  <mime-type type="image/vnd.wap.wbmp">
+    <_comment>Wireless Bitmap File Format</_comment>
+    <glob pattern="*.wbmp"/>
+  </mime-type>
+
+  <mime-type type="image/vnd.xiff">
+    <glob pattern="*.xif"/>
+  </mime-type>
+  <mime-type type="image/x-cmu-raster">
+    <glob pattern="*.ras"/>
+  </mime-type>
+  <mime-type type="image/x-cmx">
+    <glob pattern="*.cmx"/>
+  </mime-type>
+
+  <mime-type type="image/x-freehand">
+    <_comment>FreeHand image</_comment>
+    <magic priority="50">
+      <match value="AGD2" type="string" offset="0"/>
+      <match value="AGD3" type="string" offset="0"/>
+      <match value="AGD4" type="string" offset="0"/>
+      <match value="FreeHand10" type="string" offset="0:24"/>
+      <match value="FreeHand11" type="string" offset="0:24"/>
+      <match value="FreeHand12" type="string" offset="0:24"/>
+    </magic>
+    <glob pattern="*.fh"/>
+    <glob pattern="*.fhc"/>
+    <glob pattern="*.fh4"/>
+    <glob pattern="*.fh40"/>
+    <glob pattern="*.fh5"/>
+    <glob pattern="*.fh50"/>
+    <glob pattern="*.fh7"/>
+    <glob pattern="*.fh8"/>
+    <glob pattern="*.fh9"/>
+    <glob pattern="*.fh10"/>
+    <glob pattern="*.fh11"/>
+    <glob pattern="*.fh12"/>
+    <glob pattern="*.ft7"/>
+    <glob pattern="*.ft8"/>
+    <glob pattern="*.ft9"/>
+    <glob pattern="*.ft10"/>
+    <glob pattern="*.ft11"/>
+    <glob pattern="*.ft12"/>
+  </mime-type>
+
+  <mime-type type="image/x-jp2-codestream">
+    <_comment>JPEG 2000 Codestream</_comment>
+    <magic priority="25">
+      <match value="0xff4fff51" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.j2c"/>
+  </mime-type>
+
+  <mime-type type="image/x-jp2-container">
+    <_comment>JPEG 2000 Container Format</_comment>
+    <magic priority="50">
+      <match value="0x0000000C6A5020200D0A870A" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="image/x-niff">
+    <_comment>Navy Interchange File Format</_comment>
+    <magic priority="50">
+      <match value="IIN1" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="image/x-pcx">
+    <glob pattern="*.pcx"/>
+  </mime-type>
+  <mime-type type="image/x-pict">
+    <_comment>Apple Macintosh QuickDraw/PICT Format</_comment>
+    <magic priority="50">
+      <match value="0x001102FF0C00" type="string" offset="522"/>
+    </magic>
+    <glob pattern="*.pic"/>
+    <glob pattern="*.pct"/>
+    <glob pattern="*.pict"/>
+  </mime-type>
+
+  <mime-type type="image/x-portable-anymap">
+    <acronym>PNM</acronym>
+    <_comment>Portable Any Map</_comment>
+    <glob pattern="*.pnm" />
+  </mime-type>
+
+  <mime-type type="image/x-portable-bitmap">
+    <sub-class-of type="image/x-portable-anymap"/>
+    <acronym>PBM</acronym>
+    <_comment>Portable Bit Map</_comment>
+    <magic priority="50">
+      <match value="P1" type="string" offset="0"/>
+      <match value="P4" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.pbm"/>
+  </mime-type>
+
+  <mime-type type="image/x-portable-graymap">
+    <sub-class-of type="image/x-portable-anymap"/>
+    <acronym>PGM</acronym>
+    <_comment>Portable Graymap Graphic</_comment>
+    <magic priority="50">
+      <match value="P2" type="string" offset="0"/>
+      <match value="P5" type="string" offset="0"/>
+      <match offset="0" type="string" value="\x50\x35\x0a"/>
+    </magic>
+    <glob pattern="*.pgm"/>
+  </mime-type>
+
+  <mime-type type="image/x-portable-pixmap">
+    <sub-class-of type="image/x-portable-anymap"/>
+    <acronym>PXM</acronym>
+    <_comment>UNIX Portable Bitmap Graphic</_comment>
+    <magic priority="50">
+      <match value="P3" type="string" offset="0"/>
+      <match value="P6" type="string" offset="0"/>
+      <match value="P7" type="string" offset="0"/>
+       <match offset="0" type="string" value="\x50\x34\x0a"/>
+    </magic>
+    <glob pattern="*.ppm"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-adobe">
+    <acronym>DNG</acronym>
+    <_comment>Adobe Digital Negative</_comment>
+    <glob pattern="*.dng"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-hasselblad">
+    <_comment>Hasselblad raw image</_comment>
+    <glob pattern="*.3fr"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-fuji">
+    <_comment>Fuji raw image</_comment>
+    <glob pattern="*.raf"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-canon">
+    <_comment>Canon raw image</_comment>
+    <glob pattern="*.crw"/>
+    <glob pattern="*.cr2"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-kodak">
+    <_comment>Kodak raw image</_comment>
+    <glob pattern="*.k25"/>
+    <glob pattern="*.kdc"/>
+    <glob pattern="*.dcs"/>
+    <glob pattern="*.drf"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-minolta">
+    <_comment>Minolta raw image</_comment>
+    <glob pattern="*.mrw"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-nikon">
+    <_comment>Nikon raw image</_comment>
+    <glob pattern="*.nef"/>
+    <glob pattern="*.nrw"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-olympus">
+    <_comment>Olympus raw image</_comment>
+    <glob pattern="*.orf"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-pentax">
+    <_comment>Pentax raw image</_comment>
+    <glob pattern="*.ptx"/>
+    <glob pattern="*.pef"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-sony">
+    <_comment>Sony raw image</_comment>
+    <glob pattern="*.arw"/>
+    <glob pattern="*.srf"/>
+    <glob pattern="*.sr2"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-sigma">
+    <_comment>Sigma raw image</_comment>
+    <glob pattern="*.x3f"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-epson">
+    <_comment>Epson raw image</_comment>
+    <glob pattern="*.erf"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-mamiya">
+    <_comment>Mamiya raw image</_comment>
+    <glob pattern="*.mef"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-leaf">
+    <_comment>Leaf raw image</_comment>
+    <glob pattern="*.mos"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-panasonic">
+    <_comment>Panasonic raw image</_comment>
+    <glob pattern="*.raw"/>
+    <glob pattern="*.rw2"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-phaseone">
+    <_comment>Phase One raw image</_comment>
+    <glob pattern="*.iiq"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-red">
+    <_comment>Red raw image</_comment>
+    <glob pattern="*.r3d"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-imacon">
+    <_comment>Imacon raw image</_comment>
+    <glob pattern="*.fff"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-logitech">
+    <_comment>Logitech raw image</_comment>
+    <glob pattern="*.pxn"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-casio">
+    <_comment>Casio raw image</_comment>
+    <glob pattern="*.bay"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-rawzor">
+    <_comment>Rawzor raw image</_comment>
+    <glob pattern="*.rwz"/>
+  </mime-type>
+
+  <mime-type type="image/x-rgb">
+    <_comment>Silicon Graphics RGB Bitmap</_comment>
+    <magic priority="50">
+      <match offset="0" type="string" value="\x01\xda\x01\x01\x00\x03"/>
+    </magic>
+    <glob pattern="*.rgb"/>
+  </mime-type>
+
+  <mime-type type="image/x-xbitmap">
+    <magic priority="50">
+      <match value="/* XPM" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.xbm"/>
+    <sub-class-of type="text/x-c"/>
+  </mime-type>
+
+  <mime-type type="image/x-xcf">
+    <_comment>GIMP Image File</_comment>
+    <alias type="image/xcf"/>
+    <magic priority="50">
+      <match type="string" value="gimp xcf " offset="0"/>
+    </magic>
+    <glob pattern="*.xcf"/>
+  </mime-type>
+
+  <mime-type type="image/x-xpixmap">
+    <glob pattern="*.xpm"/>
+  </mime-type>
+
+  <mime-type type="image/x-xwindowdump">
+    <_comment>X Windows Dump</_comment>
+    <glob pattern="*.xwd"/>
+  </mime-type>
+
+  <mime-type type="message/cpim"/>
+  <mime-type type="message/delivery-status"/>
+  <mime-type type="message/disposition-notification"/>
+  <mime-type type="message/example"/>
+  <mime-type type="message/external-body"/>
+  <mime-type type="message/global"/>
+  <mime-type type="message/global-delivery-status"/>
+  <mime-type type="message/global-disposition-notification"/>
+  <mime-type type="message/global-headers"/>
+  <mime-type type="message/http"/>
+  <mime-type type="message/imdn+xml"/>
+
+  <mime-type type="message/news">
+    <magic priority="50">
+      <match value="Path:" type="string" offset="0" />
+      <match value="Xref:" type="string" offset="0" />
+      <match value="Article" type="string" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="message/partial"/>
+
+  <mime-type type="message/rfc822">
+    <magic priority="50">
+      <match value="Relay-Version:" type="stringignorecase" offset="0"/>
+      <match value="#!\ rnews" type="string" offset="0"/>
+      <match value="N#!\ rnews" type="string" offset="0"/>
+      <match value="Forward\ to" type="string" offset="0"/>
+      <match value="Pipe\ to" type="string" offset="0"/>
+      <match value="Return-Path:" type="stringignorecase" offset="0"/>
+      <match value="From:" type="stringignorecase" offset="0"/>
+      <match value="Received:" type="stringignorecase" offset="0"/>
+      <match value="Message-ID:" type="stringignorecase" offset="0"/>
+      <match value="Date:" type="string" offset="0"/>
+      <match value="MIME-Version:" type="stringignorecase" offset="0"/>
+      <match value="X-Notes-Item:" type="string" offset="0">
+        <match value="Message-ID:" type="string" offset="0:8192"/>
+      </match>
+    </magic>
+    <glob pattern="*.eml"/>
+    <glob pattern="*.mime"/>
+    <glob pattern="*.mht"/>
+    <glob pattern="*.mhtml"/>
+  </mime-type>
+
+  <mime-type type="message/s-http"/>
+  <mime-type type="message/sip"/>
+  <mime-type type="message/sipfrag"/>
+  <mime-type type="message/tracking-status"/>
+  <mime-type type="message/vnd.si.simp"/>
+
+  <mime-type type="model/example"/>
+
+  <mime-type type="model/iges">
+    <_comment>Initial Graphics Exchange Specification Format</_comment>
+    <glob pattern="*.igs"/>
+    <glob pattern="*.iges"/>
+  </mime-type>
+
+  <mime-type type="model/mesh">
+    <glob pattern="*.msh"/>
+    <glob pattern="*.mesh"/>
+    <glob pattern="*.silo"/>
+  </mime-type>
+
+  <mime-type type="model/vnd.dwf">
+    <glob pattern="*.dwf"/>
+  </mime-type>
+  <mime-type type="model/vnd.dwfx+xps">
+    <_comment>AutoCAD Design Web Format</_comment>
+    <glob pattern="*.dwfx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="model/vnd.flatland.3dml"/>
+  <mime-type type="model/vnd.gdl">
+    <glob pattern="*.gdl"/>
+  </mime-type>
+  <mime-type type="model/vnd.gs-gdl"/>
+  <mime-type type="model/vnd.gs.gdl"/>
+  <mime-type type="model/vnd.gtw">
+    <glob pattern="*.gtw"/>
+  </mime-type>
+  <mime-type type="model/vnd.moml+xml"/>
+  <mime-type type="model/vnd.mts">
+    <glob pattern="*.mts"/>
+  </mime-type>
+  <mime-type type="model/vnd.parasolid.transmit.binary"/>
+  <mime-type type="model/vnd.parasolid.transmit.text"/>
+  <mime-type type="model/vnd.vtu">
+    <glob pattern="*.vtu"/>
+  </mime-type>
+
+  <mime-type type="model/vrml">
+    <glob pattern="*.wrl"/>
+    <glob pattern="*.vrml"/>
+  </mime-type>
+
+  <mime-type type="multipart/alternative"/>
+  <mime-type type="multipart/appledouble"/>
+  <mime-type type="multipart/byteranges"/>
+  <mime-type type="multipart/digest"/>
+  <mime-type type="multipart/encrypted"/>
+  <mime-type type="multipart/example"/>
+  <mime-type type="multipart/form-data"/>
+  <mime-type type="multipart/header-set"/>
+  <mime-type type="multipart/mixed"/>
+  <mime-type type="multipart/parallel"/>
+  <mime-type type="multipart/related"/>
+  <mime-type type="multipart/report"/>
+  <mime-type type="multipart/signed"/>
+  <mime-type type="multipart/voice-message"/>
+
+  <mime-type type="text/x-actionscript">
+    <_comment>ActionScript source code</_comment>
+    <glob pattern="*.as"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-ada">
+    <_comment>Ada source code</_comment>
+    <glob pattern="*.ada"/>
+    <glob pattern="*.adb"/>
+    <glob pattern="*.ads"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-applescript">
+    <_comment>AppleScript source code</_comment>
+    <glob pattern="*.applescript"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/asp">
+    <_comment>Active Server Page</_comment>
+    <glob pattern="*.asp"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/aspdotnet">
+    <_comment>ASP .NET</_comment>
+    <glob pattern="*.aspx"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-aspectj">
+    <_comment>AspectJ source code</_comment>
+    <glob pattern="*.aj"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-assembly">
+    <alias type="text/x-asm"/>
+    <_comment>Assembler source code</_comment>
+    <glob pattern="*.s"/>
+    <glob pattern="*.S"/>
+    <glob pattern="*.asm"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/calendar">
+    <glob pattern="*.ics"/>
+    <glob pattern="*.ifb"/>
+  </mime-type>
+
+  <mime-type type="text/css">
+    <_comment>Cascading Style Sheet</_comment>
+    <glob pattern="*.css"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/csv">
+    <glob pattern="*.csv"/>
+  </mime-type>
+
+  <mime-type type="text/directory"/>
+  <mime-type type="text/dns"/>
+  <mime-type type="text/ecmascript"/>
+  <mime-type type="text/enriched"/>
+  <mime-type type="text/example"/>
+
+  <mime-type type="text/html">
+    <_comment>HyperText Markup Language</_comment>
+    <acronym>HTML</acronym>
+    <tika:uti>public.html</tika:uti>
+     <!-- TIKA-327: if you encounter tags in the HTML
+          with no declared namespace, it's not XHTML, it's just
+          bad HTML, unfortunately.
+     -->
+    <root-XML localName="html"/>
+    <root-XML localName="HTML"/>
+    <root-XML localName="link"/>
+    <root-XML localName="LINK"/>
+    <root-XML localName="body"/>
+    <root-XML localName="BODY"/>
+    <root-XML localName="p"/>
+    <root-XML localName="P"/>
+    <root-XML localName="script"/>
+    <root-XML localName="SCRIPT"/>
+    <root-XML localName="frameset"/>
+    <root-XML localName="FRAMESET"/>
+    <!-- The magic priority needs to be lower than that of -->
+    <!--  files which contain HTML within them, eg mime emails -->
+    <magic priority="40">
+      <match value="&lt;!DOCTYPE HTML" type="string" offset="0:64"/>
+      <match value="&lt;!doctype html" type="string" offset="0:64"/>
+      <match value="&lt;HEAD" type="string" offset="0:64"/>
+      <match value="&lt;head" type="string" offset="0:64"/>
+      <match value="&lt;TITLE" type="string" offset="0:64"/>
+      <match value="&lt;title" type="string" offset="0:64"/>
+      <!-- note on the offset value here: this can only be as big as
+           MimeTypes#getMinLength(). If you set the offset value to larger
+           than that size, the magic will only be compared to up to
+           MimeTypes#getMinLength() bytes.
+       -->
+      <match value="&lt;html" type="string" offset="0:8192"/>
+      <match value="&lt;HTML" type="string" offset="0:64"/>
+      <match value="&lt;BODY" type="string" offset="0"/>
+      <match value="&lt;body" type="string" offset="0"/>
+      <match value="&lt;DIV" type="string" offset="0"/>
+      <match value="&lt;div" type="string" offset="0"/>
+      <match value="&lt;TITLE" type="string" offset="0"/>
+      <match value="&lt;title" type="string" offset="0"/>
+      <match value="&lt;h1" type="string" offset="0"/>
+      <match value="&lt;H1" type="string" offset="0"/>
+      <match value="&lt;!doctype HTML" type="string" offset="0"/>
+      <match value="&lt;!DOCTYPE html" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.html"/>
+    <glob pattern="*.htm"/>
+  </mime-type>
+
+  <mime-type type="text/parityfec"/>
+
+  <mime-type type="text/plain">
+    <magic priority="20">
+      <match value="This is TeX," type="string" offset="0"/>
+      <match value="This is METAFONT," type="string" offset="0"/>
+      <match value="/*" type="string" offset="0"/>
+      <match value="//" type="string" offset="0"/>
+      <match value=";;" type="string" offset="0"/>
+      <!-- UTF-16BE BOM -->
+      <match value="0xfeff" type="string" offset="0"/>
+      <!-- UTF-16LE BOM -->
+      <match value="0xfffe" type="string" offset="0"/>
+      <!-- UTF-8 BOM -->
+      <match value="0xefbbbf" type="string" offset="0"/>
+    </magic>
+
+    <glob pattern="*.txt"/>
+    <glob pattern="*.text"/>
+    <glob pattern="*.conf"/>
+    <glob pattern="*.cfg"/>
+    <glob pattern="*.def"/>
+    <glob pattern="*.list"/>
+    <glob pattern="*.in"/>
+
+    <!-- TIKA-85: http://www.apache.org/dev/svn-eol-style.txt -->
+    <glob pattern="INSTALL"/>
+    <glob pattern="KEYS"/>
+    <glob pattern="Makefile"/>
+    <glob pattern="README"/>
+    <glob pattern="abs-linkmap"/>
+    <glob pattern="abs-menulinks"/>
+    <glob pattern="*.aart"/>
+    <glob pattern="*.ac"/>
+    <glob pattern="*.am"/>
+    <glob pattern="*.classpath"/>
+    <glob pattern="*.cmd"/>
+    <glob pattern="*.config"/>
+    <glob pattern="*.cwiki"/>
+    <glob pattern="*.data"/>
+    <glob pattern="*.dcl"/>
+    <glob pattern="*.egrm"/>
+    <glob pattern="*.ent"/>
+    <glob pattern="*.ft"/>
+    <glob pattern="*.fn"/>
+    <glob pattern="*.fv"/>
+    <glob pattern="*.grm"/>
+    <glob pattern="*.g"/>
+    <glob pattern=".htaccess"/>
+    <glob pattern="*.ihtml"/>
+    <glob pattern="*.jmx"/>
+    <glob pattern="*.junit"/>
+    <glob pattern="*.jx"/>
+    <glob pattern="*.manifest"/>
+    <glob pattern="*.m4"/>
+    <glob pattern="*.mf"/>
+    <glob pattern="*.MF"/>
+    <glob pattern="*.meta"/>
+    <glob pattern="*.n3"/>
+    <glob pattern="*.pen"/>
+    <glob pattern="*.pod"/>
+    <glob pattern="*.pom"/>
+    <glob pattern="*.project"/>
+    <glob pattern="*.properties"/>
+    <glob pattern="*.rng"/>
+    <glob pattern="*.rnx"/>
+    <glob pattern="*.roles"/>
+    <glob pattern="*.tld"/>
+    <glob pattern="*.types"/>
+    <glob pattern="*.vm"/>
+    <glob pattern="*.vsl"/>
+    <glob pattern="*.wsdd"/>
+    <glob pattern="*.xargs"/>
+    <glob pattern="*.xcat"/>
+    <glob pattern="*.xconf"/>
+    <glob pattern="*.xegrm"/>
+    <glob pattern="*.xgrm"/>
+    <glob pattern="*.xlex"/>
+    <glob pattern="*.xlog"/>
+    <glob pattern="*.xmap"/>
+    <glob pattern="*.xroles"/>
+    <glob pattern="*.xsamples"/>
+    <glob pattern="*.xsp"/>
+    <glob pattern="*.xweb"/>
+    <glob pattern="*.xwelcome"/>
+  </mime-type>
+
+  <mime-type type="text/prs.fallenstein.rst"/>
+  <mime-type type="text/prs.lines.tag">
+    <glob pattern="*.dsc"/>
+  </mime-type>
+  <mime-type type="text/red"/>
+  <mime-type type="text/rfc822-headers"/>
+  <mime-type type="text/richtext">
+    <glob pattern="*.rtx"/>
+  </mime-type>
+
+  <mime-type type="text/rtp-enc-aescm128"/>
+  <mime-type type="text/rtx"/>
+  <mime-type type="text/sgml">
+    <glob pattern="*.sgml"/>
+    <glob pattern="*.sgm"/>
+  </mime-type>
+  <mime-type type="text/t140"/>
+  <mime-type type="text/tab-separated-values">
+    <glob pattern="*.tsv"/>
+  </mime-type>
+
+  <mime-type type="text/troff">
+    <_comment>Roff/nroff/troff/groff Unformatted Manual Page (UNIX)</_comment>
+    <alias type="application/x-troff"/>
+    <alias type="application/x-troff-man"/>
+    <alias type="application/x-troff-me"/>
+    <alias type="application/x-troff-ms"/>
+    <magic priority="50">
+      <match value=".\\&quot;" type="string" offset="0"/>
+      <match value="'\\&quot;" type="string" offset="0"/>
+      <match value="'.\\&quot;" type="string" offset="0"/>
+      <match value="\\&quot;" type="string" offset="0"/>
+      <match value="'''" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.t"/>
+    <glob pattern="*.tr"/>
+    <glob pattern="*.roff"/>
+    <glob pattern="*.man"/>
+    <glob pattern="*.me"/>
+    <glob pattern="*.ms"/>
+  </mime-type>
+
+  <mime-type type="text/ulpfec"/>
+  <mime-type type="text/uri-list">
+    <glob pattern="*.uri"/>
+    <glob pattern="*.uris"/>
+    <glob pattern="*.urls"/>
+  </mime-type>
+  <mime-type type="text/vnd.abc"/>
+  <mime-type type="text/vnd.curl">
+    <glob pattern="*.curl"/>
+  </mime-type>
+  <mime-type type="text/vnd.curl.dcurl">
+    <glob pattern="*.dcurl"/>
+  </mime-type>
+  <mime-type type="text/vnd.curl.scurl">
+    <glob pattern="*.scurl"/>
+  </mime-type>
+  <mime-type type="text/vnd.curl.mcurl">
+    <glob pattern="*.mcurl"/>
+  </mime-type>
+  <mime-type type="text/vnd.dmclientscript"/>
+  <mime-type type="text/vnd.esmertec.theme-descriptor"/>
+  <mime-type type="text/vnd.fly">
+    <glob pattern="*.fly"/>
+  </mime-type>
+  <mime-type type="text/vnd.fmi.flexstor">
+    <glob pattern="*.flx"/>
+  </mime-type>
+  <mime-type type="text/vnd.graphviz">
+    <glob pattern="*.gv"/>
+  </mime-type>
+  <mime-type type="text/vnd.in3d.3dml">
+    <glob pattern="*.3dml"/>
+  </mime-type>
+  <mime-type type="text/vnd.in3d.spot">
+    <glob pattern="*.spot"/>
+  </mime-type>
+  <mime-type type="text/vnd.iptc.anpa">
+    <acronym>ANPA</acronym>
+    <_comment>American Newspaper Publishers Association Wire Feeds</_comment>
+    <glob pattern="*.anpa"/>
+    <magic priority="50">
+      <match value="\x16\x16\x01" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+  <mime-type type="text/vnd.iptc.newsml"/>
+  <mime-type type="text/vnd.iptc.nitf"/>
+  <mime-type type="text/vnd.latex-z"/>
+  <mime-type type="text/vnd.motorola.reflex"/>
+  <mime-type type="text/vnd.ms-mediapackage"/>
+  <mime-type type="text/vnd.net2phone.commcenter.command"/>
+  <mime-type type="text/vnd.si.uricatalogue"/>
+  <mime-type type="text/vnd.sun.j2me.app-descriptor">
+    <glob pattern="*.jad"/>
+  </mime-type>
+  <mime-type type="text/vnd.trolltech.linguist"/>
+  <mime-type type="text/vnd.wap.si"/>
+  <mime-type type="text/vnd.wap.sl"/>
+  <mime-type type="text/vnd.wap.wml">
+    <glob pattern="*.wml"/>
+  </mime-type>
+
+  <mime-type type="text/vnd.wap.wmlscript">
+    <_comment>WML Script</_comment>
+    <glob pattern="*.wmls"/>
+  </mime-type>
+
+  <mime-type type="text/x-awk">
+    <_comment>AWK script</_comment>
+    <magic priority="50">
+      <match value="#!/bin/gawk" type="string" offset="0"/>
+      <match value="#! /bin/gawk" type="string" offset="0"/>
+      <match value="#!/usr/bin/gawk" type="string" offset="0"/>
+      <match value="#! /usr/bin/gawk" type="string" offset="0"/>
+      <match value="#!/usr/local/bin/gawk" type="string" offset="0"/>
+      <match value="#! /usr/local/bin/gawk" type="string" offset="0"/>
+      <match value="#!/bin/awk" type="string" offset="0"/>
+      <match value="#! /bin/awk" type="string" offset="0"/>
+      <match value="#!/usr/bin/awk" type="string" offset="0"/>
+      <match value="#! /usr/bin/awk" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.awk"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-basic">
+    <_comment>Basic source code</_comment>
+    <glob pattern="*.bas"/>
+    <glob pattern="*.Bas"/>
+    <glob pattern="*.BAS"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-c++hdr">
+    <_comment>C++ source code header</_comment>
+    <glob pattern="*.hpp"/>
+    <glob pattern="*.hxx"/>
+    <glob pattern="*.hh"/>
+    <glob pattern="*.H"/>
+    <glob pattern="*.h++"/>
+    <glob pattern="*.hp"/>
+    <glob pattern="*.HPP"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-c++src">
+    <_comment>C++ source code</_comment>
+    <glob pattern="*.cpp"/>
+    <glob pattern="*.cxx"/>
+    <glob pattern="*.cc"/>
+    <glob pattern="*.C"/>
+    <glob pattern="*.c++"/>
+    <glob pattern="*.CPP"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-cgi">
+    <_comment>CGI script</_comment>
+    <glob pattern="*.cgi"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-chdr">
+    <_comment>C source code header</_comment>
+    <glob pattern="*.h"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-clojure">
+    <_comment>Clojure source code</_comment>
+    <glob pattern="*.clj"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-coffeescript">
+    <_comment>CoffeeScript source code</_comment>
+    <glob pattern="*.coffee"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-csrc">
+    <alias type="text/x-c"/>
+    <_comment>C source code</_comment>
+    <glob pattern="*.c"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-csharp">
+    <_comment>C# source code</_comment>
+    <glob pattern="*.cs"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-cobol">
+    <_comment>COBOL source code</_comment>
+    <glob pattern="*.cbl"/>
+    <glob pattern="*.Cbl"/>
+    <glob pattern="*.CBL"/>
+    <glob pattern="*.cob"/>
+    <glob pattern="*.Cob"/>
+    <glob pattern="*.COB"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-coldfusion">
+    <_comment>ColdFusion source code</_comment>
+    <glob pattern="*.cfm"/>
+    <glob pattern="*.cfml"/>
+    <glob pattern="*.cfc"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-common-lisp">
+    <_comment>Common Lisp source code</_comment>
+    <glob pattern="*.cl"/>
+    <glob pattern="*.jl"/>
+    <glob pattern="*.lisp"/>
+    <glob pattern="*.lsp"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-diff">
+    <magic priority="50">
+      <match value="diff\ " type="string" offset="0"/>
+      <match value="***\ " type="string" offset="0"/>
+      <match value="Only\ in\ " type="string" offset="0"/>
+      <match value="Common\ subdirectories:\ " type="string" offset="0"/>
+      <match value="Index:" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.diff"/>
+    <glob pattern="*.patch"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-eiffel">
+    <_comment>Eiffel source code</_comment>
+    <glob pattern="*.e"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-emacs-lisp">
+    <_comment>Emacs Lisp source code</_comment>
+    <glob pattern="*.el"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-erlang">
+    <_comment>Erlang source code</_comment>
+    <glob pattern="*.erl"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-expect">
+    <_comment>Expect Script</_comment>
+    <glob pattern="*.exp"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-forth">
+    <_comment>Forth source code</_comment>
+    <glob pattern="*.4th"/>
+    <sub-class-of type="text/plain"/>
+   </mime-type>
+
+  <mime-type type="text/x-fortran">
+    <_comment>Fortran source code</_comment>
+    <glob pattern="*.f"/>
+    <glob pattern="*.F"/>
+    <glob pattern="*.for"/>
+    <glob pattern="*.f77"/>
+    <glob pattern="*.f90"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-go">
+    <_comment>Go source code</_comment>
+    <glob pattern="*.go"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-groovy">
+    <_comment>Groovy source code</_comment>
+    <glob pattern="*.groovy"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-haskell">
+    <_comment>Haskell source code</_comment>
+    <glob pattern="*.hs"/>
+    <glob pattern="*.lhs"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-idl">
+    <_comment>Inteface Definition Language</_comment>
+    <glob pattern="*.idl"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-ini">
+    <_comment>Configuration file</_comment>
+    <glob pattern="*.ini"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-java-source">
+    <_comment>Java source code</_comment>
+    <alias type="text/x-java" />
+    <glob pattern="*.java"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-jsp">
+    <_comment>Java Server Page</_comment>
+    <alias type="application/x-httpd-jsp"/>
+    <sub-class-of type="text/plain"/>
+    <magic priority="50">
+      <match value="&lt;%@" type="string" offset="0"/>
+      <match value="&lt;%--" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.jsp"/>
+  </mime-type>
+
+  <mime-type type="text/x-less">
+    <_comment>LESS source code</_comment>
+    <glob pattern="*.less"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-lex">
+    <_comment>Lex/Flex source code</_comment>
+    <glob pattern="*.l"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-log">
+    <_comment>application log</_comment>
+    <glob pattern="*.log"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-lua">
+    <_comment>Lua source code</_comment>
+    <glob pattern="*.lua"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-ml">
+    <_comment>ML source code</_comment>
+    <glob pattern="*.ml"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-matlab">
+    <_comment>Matlab source code</_comment>
+    <magic priority="50">
+      <match value="function [" type="string" offset="0"/>
+    </magic>
+    <!-- <glob pattern="*.m"/> - conflicts with text/x-objcsrc -->
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-modula">
+    <_comment>Modula source code</_comment>
+    <glob pattern="*.m3"/>
+    <glob pattern="*.i3"/>
+    <glob pattern="*.mg"/>
+    <glob pattern="*.ig"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-objcsrc">
+    <_comment>Objective-C source code</_comment>
+    <glob pattern="*.m"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-ocaml">
+    <_comment>Ocaml source code</_comment>
+    <glob pattern="*.ocaml"/>
+    <glob pattern="*.mli"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-pascal">
+    <_comment>Pascal source code</_comment>
+    <glob pattern="*.p"/>
+    <glob pattern="*.pp"/>
+    <glob pattern="*.pas"/>
+    <glob pattern="*.PAS"/>
+    <glob pattern="*.dpr"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-perl">
+    <_comment>Perl script</_comment>
+    <magic priority="50">
+      <match value="eval \&quot;exec /usr/local/bin/perl" type="string" offset="0"/>
+      <match value="#!/bin/perl" type="string" offset="0"/>
+      <match value="#!/bin/env perl" type="string" offset="0"/>
+      <match value="#!/usr/bin/perl" type="string" offset="0"/>
+      <match value="#!/usr/local/bin/perl" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.pl"/>
+    <glob pattern="*.pm"/>
+    <glob pattern="*.al"/>
+    <glob pattern="*.perl"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-php">
+    <_comment>PHP script</_comment>
+    <magic priority="50">
+      <match value="&lt;?php" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.php"/>
+    <glob pattern="*.php3"/>
+    <glob pattern="*.php4"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-prolog">
+    <_comment>Prolog source code</_comment>
+    <glob pattern="*.pro"/>
+    <!-- <glob pattern="*.pl"/> - conflicts with text/x-perl -->
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-python">
+    <_comment>Python script</_comment>
+    <magic priority="50">
+      <match value="#!/bin/python" type="string" offset="0"/>
+      <match value="#! /bin/python" type="string" offset="0"/>
+      <match value="eval &quot;exec /bin/python" type="string" offset="0"/>
+      <match value="#!/usr/bin/python" type="string" offset="0"/>
+      <match value="#! /usr/bin/python" type="string" offset="0"/>
+      <match value="eval &quot;exec /usr/bin/python" type="string" offset="0"/>
+      <match value="#!/usr/local/bin/python" type="string" offset="0"/>
+      <match value="#! /usr/local/bin/python" type="string" offset="0"/>
+      <match value="eval &quot;exec /usr/local/bin/python" type="string" offset="0"/>
+      <match value="/bin/env python" type="string" offset="1"/>
+    </magic>
+    <glob pattern="*.py"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-rst">
+    <_comment>reStructuredText source code</_comment>
+    <glob pattern="*.rest"/>
+    <glob pattern="*.rst"/>
+    <glob pattern="*.restx"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-rexx">
+    <_comment>Rexx source code</_comment>
+    <glob pattern="*.rexx"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-ruby">
+    <_comment>Ruby source code</_comment>
+    <glob pattern="*.rb"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-scala">
+    <_comment>Scala source code</_comment>
+    <glob pattern="*.scala"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-scheme">
+    <_comment>Scheme source code</_comment>
+    <glob pattern="*.scm"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-sed">
+    <_comment>Sed code</_comment>
+    <glob pattern="*.sed"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-sql">
+    <_comment>SQL code</_comment>
+    <glob pattern="*.sql"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-setext">
+    <glob pattern="*.etx"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-stsrc">
+    <_comment>Smalltalk source code</_comment>
+    <glob pattern="*.st"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-tcl">
+    <alias type="application/x-tcl"/>
+    <_comment>Tcl script</_comment>
+    <glob pattern="*.itk"/>
+    <glob pattern="*.tcl"/>
+    <glob pattern="*.tk"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-uuencode">
+    <glob pattern="*.uu"/>
+  </mime-type>
+
+  <mime-type type="text/x-vbasic">
+    <_comment>Visual basic source code</_comment>
+    <glob pattern="*.cls"/>
+    <glob pattern="*.Cls"/>
+    <glob pattern="*.CLS"/>
+    <glob pattern="*.frm"/>
+    <glob pattern="*.Frm"/>
+    <glob pattern="*.FRM"/>
+    <sub-class-of type="text/x-basic"/>
+  </mime-type>
+
+  <mime-type type="text/x-vbdotnet">
+    <_comment>VB.NET source code</_comment>
+    <glob pattern="*.vb"/>
+    <sub-class-of type="text/x-vbasic"/>
+  </mime-type>
+
+  <mime-type type="text/x-vbscript">
+    <_comment>VBScript source code</_comment>
+    <glob pattern="*.vbs"/>
+    <sub-class-of type="text/x-vbasic"/>
+  </mime-type>
+
+  <mime-type type="text/x-vcalendar">
+    <glob pattern="*.vcs"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-vcard">
+    <glob pattern="*.vcf"/>
+    <sub-class-of type="text/plain"/>
+    <magic priority="50">
+      <match value="BEGIN:VCARD" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="text/x-verilog">
+    <_comment>Verilog source code</_comment>
+    <glob pattern="*.v"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-vhdl">
+    <_comment>VHDL source code</_comment>
+    <glob pattern="*.vhd"/>
+    <glob pattern="*.vhdl"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-web-markdown">
+    <_comment>Markdown source code</_comment>
+    <glob pattern="*.md"/>
+    <glob pattern="*.mdtext"/>
+    <glob pattern="*.mkd"/>
+    <glob pattern="*.markdown"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-yacc">
+    <_comment>Yacc/Bison source code</_comment>
+    <glob pattern="*.y"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-yaml">
+    <_comment>YAML source code</_comment>
+    <glob pattern="*.yaml"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="video/3gpp">
+    <magic priority="60">
+      <match value="ftyp3ge6" type="string" offset="4"/>
+      <match value="ftyp3ge7" type="string" offset="4"/>
+      <match value="ftyp3gg6" type="string" offset="4"/>
+      <match value="ftyp3gp1" type="string" offset="4"/>
+      <match value="ftyp3gp2" type="string" offset="4"/>
+      <match value="ftyp3gp3" type="string" offset="4"/>
+      <match value="ftyp3gp4" type="string" offset="4"/>
+      <match value="ftyp3gp5" type="string" offset="4"/>
+      <match value="ftyp3gp6" type="string" offset="4"/>
+      <match value="ftyp3gs7" type="string" offset="4"/>
+    </magic>
+    <glob pattern="*.3gp"/>
+  </mime-type>
+  <mime-type type="video/3gpp-tt"/>
+  <mime-type type="video/3gpp2">
+    <magic priority="60">
+      <match value="ftyp3g2a" type="string" offset="4"/>
+      <match value="ftyp3g2b" type="string" offset="4"/>
+      <match value="ftyp3g2c" type="string" offset="4"/>
+    </magic>
+    <glob pattern="*.3g2"/>
+  </mime-type>
+  <mime-type type="video/bmpeg"/>
+  <mime-type type="video/bt656"/>
+  <mime-type type="video/celb"/>
+  <mime-type type="video/dv"/>
+  <mime-type type="video/example"/>
+  <mime-type type="video/h261">
+    <glob pattern="*.h261"/>
+  </mime-type>
+  <mime-type type="video/h263">
+    <glob pattern="*.h263"/>
+  </mime-type>
+  <mime-type type="video/h263-1998"/>
+  <mime-type type="video/h263-2000"/>
+  <mime-type type="video/h264">
+    <glob pattern="*.h264"/>
+  </mime-type>
+  <mime-type type="video/jpeg">
+    <glob pattern="*.jpgv"/>
+  </mime-type>
+  <mime-type type="video/jpeg2000"/>
+
+  <mime-type type="video/mj2">
+    <sub-class-of type="image/x-jp2-container" />
+    <acronym>MJ2</acronym>
+    <_comment>JPEG 2000 Part 3 (Motion JPEG, MJ2)</_comment>
+    <magic priority="50">
+      <match value="0x0000000C6A5020200D0A870A" type="string" offset="0">
+        <match value="0x6d6a7032" type="string" offset="20"/>
+      </match>
+    </magic>
+    <glob pattern="*.mj2"/>
+    <glob pattern="*.mjp2"/>
+  </mime-type>
+
+  <mime-type type="video/mp1s"/>
+  <mime-type type="video/mp2p"/>
+  <mime-type type="video/mp2t"/>
+
+  <mime-type type="video/mp4">
+    <magic priority="60">
+      <match value="ftypmp41" type="string" offset="4"/>
+      <match value="ftypmp42" type="string" offset="4"/>
+    </magic>
+    <glob pattern="*.mp4"/>
+    <glob pattern="*.mp4v"/>
+    <glob pattern="*.mpg4"/>
+    <sub-class-of type="video/quicktime" />
+  </mime-type>
+  <mime-type type="video/mp4v-es"/>
+
+  <mime-type type="video/mpeg">
+    <_comment>MPEG Movie Clip</_comment>
+    <magic priority="50">
+      <match value="\000\000\001\263" type="string" offset="0"/>
+      <match value="\000\000\001\272" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.mpeg"/>
+    <glob pattern="*.mpg"/>
+    <glob pattern="*.mpe"/>
+    <glob pattern="*.m1v"/>
+    <glob pattern="*.m2v"/>
+  </mime-type>
+
+  <mime-type type="video/mpeg4-generic"/>
+  <mime-type type="video/mpv"/>
+  <mime-type type="video/nv"/>
+
+  <mime-type type="video/ogg">
+    <_comment>Ogg Vorbis Video</_comment>
+    <glob pattern="*.ogv"/>
+    <sub-class-of type="application/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/theora">
+    <_comment>Ogg Theora Video</_comment>
+    <alias type="video/x-theora"/>
+    <magic priority="60">
+      <!-- Assumes Video stream comes before Audio, may not always -->
+      <match value="OggS\000.......................\x80theora" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFFFFFFFF"
+             offset="0"/>
+    </magic>
+    <sub-class-of type="video/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/x-dirac">
+    <_comment>Ogg Packaged Dirac Video</_comment>
+    <magic priority="60">
+      <match value="OggS\000.......................BBCD" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFF"
+             offset="0"/>
+    </magic>
+    <glob pattern="*.drc"/>
+    <sub-class-of type="video/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/x-ogm">
+    <_comment>Ogg Packaged OGM Video</_comment>
+    <magic priority="60">
+      <!-- Assumes Video stream comes before Audio, may not always -->
+      <match value="OggS\000.......................video" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFFFF"
+             offset="0"/>
+    </magic>
+    <glob pattern="*.ogm"/>
+    <sub-class-of type="video/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/x-ogguvs">
+    <_comment>Ogg Packaged Raw UVS Video</_comment>
+    <alias type="video/x-ogg-uvs"/>
+    <magic priority="60">
+      <match value="OggS\000.......................UVS " type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFF"
+             offset="0"/>
+    </magic>
+    <sub-class-of type="video/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/x-oggyuv">
+    <_comment>Ogg Packaged Raw YUV Video</_comment>
+    <alias type="video/x-ogg-yuv"/>
+    <magic priority="60">
+      <match value="OggS\000.......................\001YUV" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFF"
+             offset="0"/>
+    </magic>
+    <sub-class-of type="video/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/x-oggrgb">
+    <_comment>Ogg Packaged Raw RGB Video</_comment>
+    <alias type="video/x-ogg-rgb"/>
+    <magic priority="60">
+      <match value="OggS\000.......................\001RGB" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFF"
+             offset="0"/>
+    </magic>
+    <sub-class-of type="video/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/parityfec"/>
+  <mime-type type="video/pointer"/>
+
+  <mime-type type="video/quicktime">
+    <magic priority="50">
+      <match value="moov" type="string" offset="4"/>
+      <match value="mdat" type="string" offset="4"/>
+      <!-- General match, specific ftypXXX ones present for subtypes -->
+      <match value="ftyp" type="string" offset="4"/>
+    </magic>
+    <glob pattern="*.qt"/>
+    <glob pattern="*.mov"/>
+  </mime-type>
+
+  <mime-type type="video/raw"/>
+  <mime-type type="video/rtp-enc-aescm128"/>
+  <mime-type type="video/rtx"/>
+  <mime-type type="video/smpte292m"/>
+  <mime-type type="video/ulpfec"/>
+  <mime-type type="video/vc1"/>
+  <mime-type type="video/vnd.cctv"/>
+  <mime-type type="video/vnd.dlna.mpeg-tts"/>
+  <mime-type type="video/vnd.fvt">
+    <glob pattern="*.fvt"/>
+  </mime-type>
+  <mime-type type="video/vnd.hns.video"/>
+  <mime-type type="video/vnd.iptvforum.1dparityfec-1010"/>
+  <mime-type type="video/vnd.iptvforum.1dparityfec-2005"/>
+  <mime-type type="video/vnd.iptvforum.2dparityfec-1010"/>
+  <mime-type type="video/vnd.iptvforum.2dparityfec-2005"/>
+  <mime-type type="video/vnd.iptvforum.ttsavc"/>
+  <mime-type type="video/vnd.iptvforum.ttsmpeg2"/>
+  <mime-type type="video/vnd.motorola.video"/>
+  <mime-type type="video/vnd.motorola.videop"/>
+  <mime-type type="video/vnd.mpegurl">
+    <glob pattern="*.mxu"/>
+    <glob pattern="*.m4u"/>
+  </mime-type>
+  <mime-type type="video/vnd.ms-playready.media.pyv">
+    <glob pattern="*.pyv"/>
+  </mime-type>
+  <mime-type type="video/vnd.nokia.interleaved-multimedia"/>
+  <mime-type type="video/vnd.nokia.videovoip"/>
+  <mime-type type="video/vnd.objectvideo"/>
+  <mime-type type="video/vnd.sealed.mpeg1"/>
+  <mime-type type="video/vnd.sealed.mpeg4"/>
+  <mime-type type="video/vnd.sealed.swf"/>
+  <mime-type type="video/vnd.sealedmedia.softseal.mov"/>
+  <mime-type type="video/vnd.vivo">
+    <glob pattern="*.viv"/>
+  </mime-type>
+  <mime-type type="video/x-f4v">
+    <glob pattern="*.f4v"/>
+  </mime-type>
+
+  <mime-type type="video/x-flc">
+    <glob pattern="*.flc"/>
+  </mime-type>
+
+  <mime-type type="video/x-fli">
+    <glob pattern="*.fli"/>
+  </mime-type>
+
+  <mime-type type="video/x-flv">
+    <magic priority="50">
+      <match value="FLV" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.flv"/>
+  </mime-type>
+
+  <mime-type type="video/x-jng">
+    <magic priority="50">
+      <match value="\x8bJNG" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.jng"/>
+  </mime-type>
+
+  <mime-type type="video/x-m4v">
+    <magic priority="60">
+      <match value="ftypM4V " type="string" offset="4"/>
+      <match value="ftypM4VH" type="string" offset="4"/>
+      <match value="ftypM4VP" type="string" offset="4"/>
+    </magic>
+    <glob pattern="*.m4v"/>
+    <sub-class-of type="video/mp4" />
+  </mime-type>
+
+  <mime-type type="video/x-mng">
+    <magic priority="50">
+      <match value="\x8aMNG" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.mng"/>
+  </mime-type>
+
+  <mime-type type="video/x-ms-asf">
+    <glob pattern="*.asf"/>
+    <glob pattern="*.asx"/>
+    <magic>
+       <match value="0x3026b275" type="big32" offset="0" />
+    </magic>
+  </mime-type>
+  <mime-type type="video/x-ms-wm">
+    <glob pattern="*.wm"/>
+  </mime-type>
+  <mime-type type="video/x-ms-wmv">
+    <sub-class-of type="video/x-ms-asf" />
+    <glob pattern="*.wmv"/>
+    <magic priority="60">
+       <match value="Windows Media Video" type="unicodeLE" offset="0:8192" />
+       <match value="VC-1 Advanced Profile" type="unicodeLE" offset="0:8192" />
+    </magic>
+  </mime-type>
+  <mime-type type="video/x-ms-wmx">
+    <glob pattern="*.wmx"/>
+  </mime-type>
+  <mime-type type="video/x-ms-wvx">
+    <glob pattern="*.wvx"/>
+  </mime-type>
+
+  <mime-type type="video/x-msvideo">
+    <_comment>Audio Video Interleave File</_comment>
+    <alias type="video/avi"/>
+    <alias type="video/msvideo"/>
+    <magic priority="50">
+      <match value="RIFF....AVI " type="string" offset="0"
+             mask="0xFFFFFFFF00000000FFFFFFFF"/>
+      <match offset="8" type="string" value="\x41\x56\x49\x20"/>
+    </magic>
+    <glob pattern="*.avi"/>
+  </mime-type>
+
+  <mime-type type="video/x-sgi-movie">
+    <magic priority="50">
+      <match value="MOVI" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.movie"/>
+  </mime-type>
+
+  <mime-type type="application/x-matroska">
+    <_comment>Matroska Media Container</_comment>
+    <!-- Common magic across all Matroska varients -->
+    <!-- For full detection, we need a custom Detector, see TIKA-1180 -->
+    <magic priority="40">
+      <match value="0x1A45DFA3" type="string" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="video/x-matroska">
+    <sub-class-of type="application/x-matroska"/>
+    <glob pattern="*.mkv" />
+    <!-- Note: The magic value below isn't present in all MKV files -->
+    <magic priority="50">
+      <match value="0x1A45DFA3934282886D6174726F736B61" type="string" offset="0" />
+    </magic>
+  </mime-type>
+  <mime-type type="audio/x-matroska">
+    <sub-class-of type="application/x-matroska"/>
+    <glob pattern="*.mka" />
+  </mime-type>
+
+  <mime-type type="video/webm">
+    <sub-class-of type="application/x-matroska"/>
+    <glob pattern="*.webm" />
+  </mime-type>
+
+  <mime-type type="x-conference/x-cooltalk">
+    <_comment>Cooltalk Audio</_comment>
+    <glob pattern="*.ice"/>
+  </mime-type>
+
+  <mime-type type="application/x-fictionbook+xml">
+      <_comment>FictionBook document</_comment>
+      <sub-class-of type="application/xml"/>
+      <root-XML namespaceURI="http://www.gribuser.ru/xml/fictionbook/2.0" localName="FictionBook"/>
+      <glob pattern="*.fb2"/>
+  </mime-type>
+
+    <mime-type type="text/x-asciidoc">
+    <_comment>Asciidoc source code</_comment>
+    <glob pattern="*.asciidoc"/>
+    <glob pattern="*.adoc"/>
+    <glob pattern="*.ad"/>
+    <glob pattern="*.ad.txt"/>
+    <glob pattern="*.adoc.txt"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-d">
+    <_comment>D source code</_comment>
+    <glob pattern="*.d"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-haml">
+    <_comment>HAML source code</_comment>
+    <glob pattern="*.haml"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-haxe">
+    <_comment>Haxe source code</_comment>
+    <glob pattern="*.hx"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-rsrc">
+    <_comment>R source code</_comment>
+    <glob pattern="*.r"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="application/xquery">
+    <_comment>XQuery source code</_comment>
+    <glob pattern="*.xq"/>
+    <glob pattern="*.xquery"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+</mime-info>
Index: tika-batch/target/test-classes/META-INF/NOTICE
===================================================================
--- tika-batch/target/test-classes/META-INF/NOTICE	(revision 0)
+++ tika-batch/target/test-classes/META-INF/NOTICE	(revision 0)
@@ -0,0 +1,8 @@
+
+Apache Tika batch
+Copyright 2007-2014 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+
Index: tika-batch/target/test-classes/META-INF/LICENSE
===================================================================
--- tika-batch/target/test-classes/META-INF/LICENSE	(revision 0)
+++ tika-batch/target/test-classes/META-INF/LICENSE	(revision 0)
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
Index: tika-batch/target/test-classes/META-INF/DEPENDENCIES
===================================================================
--- tika-batch/target/test-classes/META-INF/DEPENDENCIES	(revision 0)
+++ tika-batch/target/test-classes/META-INF/DEPENDENCIES	(revision 0)
@@ -0,0 +1,131 @@
+// ------------------------------------------------------------------
+// Transitive dependencies of this project determined from the
+// maven pom organized by organization.
+// ------------------------------------------------------------------
+
+Apache Tika batch
+
+
+From: 'an unknown organization'
+  - XMP Library for Java (http://www.adobe.com/devnet/xmp.html) com.adobe.xmp:xmpcore:jar:5.1.2
+    License: The BSD License  (http://www.adobe.com/devnet/xmp/library/eula-xmp-library-java.html)
+  - metadata-extractor (http://code.google.com/p/metadata-extractor/) com.drewnoakes:metadata-extractor:jar:2.6.2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - juniversalchardet (http://juniversalchardet.googlecode.com/) com.googlecode.juniversalchardet:juniversalchardet:jar:1.0.3
+    License: Mozilla Public License 1.1 (MPL 1.1)  (http://www.mozilla.org/MPL/MPL-1.1.html)
+  - ISO Parser (http://code.google.com/p/mp4parser/) com.googlecode.mp4parser:isoparser:jar:1.0.2
+    License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - java-libpst (https://code.google.com/p/java-libpst/) com.pff:java-libpst:jar:0.8.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Boilerpipe -- Boilerplate Removal and Fulltext Extraction from HTML pages (http://code.google.com/p/boilerpipe/) de.l3s.boilerpipe:boilerpipe:jar:1.1.0
+    License: Apache License 2.0 
+  - Unnamed - jdom:jdom:jar:1.0  jdom:jdom:jar:1.0
+
+  - "Java Concurrency in Practice" book annotations (http://jcip.net/) net.jcip:jcip-annotations:jar:1.0
+
+  - jmatio (http://sourceforge.net/projects/jmatio/) net.sourceforge.jmatio:jmatio:jar:1.0
+    License: BSD  (http://www.linfo.org/bsdlicense.html)
+  - AspectJ runtime (http://www.aspectj.org) org.aspectj:aspectjrt:jar:1.8.0
+    License: Eclipse Public License - v 1.0  (http://www.eclipse.org/legal/epl-v10.html)
+  - Bouncy Castle CMS and S/MIME API (http://www.bouncycastle.org/java.html) org.bouncycastle:bcmail-jdk15:jar:1.45
+    License: Bouncy Castle Licence  (http://www.bouncycastle.org/licence.html)
+  - Bouncy Castle Provider (http://www.bouncycastle.org/java.html) org.bouncycastle:bcprov-jdk15:jar:1.45
+    License: Bouncy Castle Licence  (http://www.bouncycastle.org/licence.html)
+  - TagSoup (http://home.ccil.org/~cowan/XML/tagsoup/) org.ccil.cowan.tagsoup:tagsoup:jar:1.2.1
+    License: Apache License 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Ogg and Vorbis for Java, Core (https://github.com/Gagravarr/VorbisJava) org.gagravarr:vorbis-java-core:jar:0.6
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Tika plugin for Ogg, Vorbis and FLAC (https://github.com/Gagravarr/VorbisJava) org.gagravarr:vorbis-java-tika:jar:0.6
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - XZ for Java (http://tukaani.org/xz/java.html) org.tukaani:xz:jar:1.5
+    License: Public Domain 
+
+From: 'Apache Software Foundation' (http://jakarta.apache.org/)
+  - HttpClient (http://jakarta.apache.org/httpcomponents/httpclient-3.x/) commons-httpclient:commons-httpclient:jar:3.1
+    License: Apache License  (http://www.apache.org/licenses/LICENSE-2.0)
+
+From: 'Apache Software Foundation' (http://www.apache.org)
+  - Log4j (http://logging.apache.org/log4j/docs/) log4j:log4j:jar:1.2.14
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'Apache Software Foundation' (http://www.apache.org/)
+  - Apache POI (http://poi.apache.org/) org.apache.poi:poi:jar:3.11-beta2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache POI (http://poi.apache.org/) org.apache.poi:poi-ooxml:jar:3.11-beta2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache POI (http://poi.apache.org/) org.apache.poi:poi-ooxml-schemas:jar:3.11-beta2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache POI (http://poi.apache.org/) org.apache.poi:poi-scratchpad:jar:3.11-beta2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Xerces2 Java Parser (http://xerces.apache.org/xerces2-j/) xerces:xercesImpl:jar:2.8.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Unnamed - xml-apis:xml-apis:jar:1.3.03 (http://xml.apache.org/commons/#external) xml-apis:xml-apis:jar:1.3.03
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'Google, Inc.' (http://www.google.com)
+  - Gson (http://code.google.com/p/google-gson/) com.google.code.gson:gson:jar:1.7.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'ObjectWeb' (http://www.objectweb.org/)
+  - ASM Debug All (http://asm.objectweb.org/asm-debug-all) org.ow2.asm:asm-debug-all:jar:4.1
+    License: BSD  (http://asm.objectweb.org/license.html)
+
+From: 'QOS.ch' (http://www.qos.ch)
+  - SLF4J API Module (http://www.slf4j.org) org.slf4j:slf4j-api:jar:1.5.6
+
+  - SLF4J LOG4J-12 Binding (http://www.slf4j.org) org.slf4j:slf4j-log4j12:jar:1.5.6
+
+
+From: 'Sun Microsystems' (http://java.sun.com/)
+  - ROME, RSS and atOM utilitiEs for Java (https://rome.dev.java.net/) rome:rome:jar:1.0
+
+
+From: 'The Apache Software Foundation' (http://pdfbox.apache.org)
+  - Apache FontBox (http://pdfbox.apache.org/) org.apache.pdfbox:fontbox:bundle:1.8.7
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache JempBox (http://www.apache.org/pdfbox-parent/jempbox) org.apache.pdfbox:jempbox:bundle:1.8.7
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache PDFBox (http://www.apache.org/pdfbox-parent/pdfbox) org.apache.pdfbox:pdfbox:bundle:1.8.7
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'The Apache Software Foundation' (http://www.apache.org)
+  - Apache Tika core (http://tika.apache.org/) org.apache.tika:tika-core:bundle:1.7-SNAPSHOT
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Tika parsers (http://tika.apache.org/) org.apache.tika:tika-parsers:bundle:1.7-SNAPSHOT
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Tika serialization (http://tika.apache.org) org.apache.tika:tika-serialization:jar:1.7-SNAPSHOT
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Tika XMP (http://tika.apache.org/) org.apache.tika:tika-xmp:bundle:1.7-SNAPSHOT
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'The Apache Software Foundation' (http://www.apache.org/)
+  - Commons CLI (http://commons.apache.org/cli/) commons-cli:commons-cli:jar:1.2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Commons Codec (http://commons.apache.org/proper/commons-codec/) commons-codec:commons-codec:jar:1.9
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Commons Logging (http://commons.apache.org/logging) commons-logging:commons-logging:jar:1.1.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Commons Compress (http://commons.apache.org/proper/commons-compress/) org.apache.commons:commons-compress:jar:1.8.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache JAMES Mime4j (Core) (http://james.apache.org/mime4j/apache-mime4j-core) org.apache.james:apache-mime4j-core:jar:0.7.2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache JAMES Mime4j (DOM) (http://james.apache.org/mime4j/apache-mime4j-dom) org.apache.james:apache-mime4j-dom:jar:0.7.2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'UCAR/Unidata' (http://www.ucar.edu/)
+  - NetCDF-Java Library (http://www.unidata.ucar.edu/software/netcdf-java/) edu.ucar:netcdf:jar:4.2.20
+    License: (MIT-style) netCDF C library license  (http://www.unidata.ucar.edu/software/netcdf/copyright.html)
+  - Unidata Common (http://www.unidata.ucar.edu/software/netcdf-java/) edu.ucar:unidataCommon:jar:4.2.20
+    License: (MIT-style) netCDF C library license  (http://www.unidata.ucar.edu/software/netcdf/copyright.html)
+
+From: 'Uwyn' (http://uwyn.com/)
+  - JHighlight (https://jhighlight.dev.java.net/) com.uwyn:jhighlight:jar:1.0
+    License: CDDL, v1.0  (http://www.opensource.org/licenses/cddl1.php)    License: LGPL, v2.1 or later  (http://www.opensource.org/licenses/lgpl-license.php)
+
+From: 'XmlBeans' (http://xmlbeans.apache.org/)
+  - XmlBeans (http://xmlbeans.apache.org) org.apache.xmlbeans:xmlbeans:jar:2.6.0
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+
+
+
Index: tika-batch/target/test-classes/tika-batch-config-evil-test.xml
===================================================================
--- tika-batch/target/test-classes/tika-batch-config-evil-test.xml	(revision 0)
+++ tika-batch/target/test-classes/tika-batch-config-evil-test.xml	(revision 0)
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+
+<tika-batch-config
+        maxAliveTimeSeconds="-1"
+        pauseOnEarlyTerminationMillis="500"
+        staleThresholdMillis="3000"
+        staleCheckPulseMillis="1000"
+        maxStaleConsumers="2"
+        maxQueueSize="10000"
+        numConsumers="3">
+
+    <!--
+        Can also add startDir: this tells the crawler to start indexing a
+        child directory of the srcDir directory.
+    -->
+	<crawler builderClass="org.apache.tika.batch.fs.builders.FSCrawlerBuilder"
+        crawlOrder="sorted"
+        maxConsecWaitMillis="5000"
+        maxFilesToAdd="-1"
+		maxFilesToConsider="-1" 
+		includeFilePat=""
+		excludeFilePat=""
+		maxFileSizeBytes="-1"
+        srcDir="tika-batch/src/test/resources/test-input"
+        />
+
+
+<!--
+    This is an example of a crawler that reads a list of files to be processed from a
+    file.  This assumes that the files in the list are relative to srcDir.
+    <crawler builderClass="org.apache.tika.batch.fs.builders.FSCrawlerBuilder"
+             fileList="files.txt"
+             fileListEncoding="UTF-8"
+             maxFilesToAdd="-1"
+             maxFilesToConsider="-1"
+             includeFilePat="(?i).pdf$"
+             excludeFilePat="(?i).msg$"
+             maxFileSizeBytes="-1"
+             srcDir="input"
+    />
+-->
+	<consumers builderClass="org.apache.tika.batch.fs.builders.BasicTikaFSConsumersBuilder" recursiveParserWrapper="false">
+		<parser class="org.apache.tika.parser.evil.EvilParserFactory" parseRecursively="true"/>
+		<contenthandler builderClass="org.apache.tika.batch.builders.DefaultContentHandlerFactoryBuilder"
+                        basicHandlerType="xml" writeLimit="-1"/>
+		
+		<!-- overwritePolicy: "skip" a file if target file exists, "rename" a target file, "overwrite" -->
+		<outputstream class="FSOutputStreamFactory" handleExisting="skip" targDir="output"
+                encoding="UTF-8" targetSuffix="xml"/>
+	</consumers>
+	
+	<!-- reporter and interrupter are optional -->
+	<reporter builderClass="org.apache.tika.batch.builders.SimpleLogReporterBuilder" sleepMillis="1000" staleThresholdMillis="500000"/>
+	<interrupter builderClass="org.apache.tika.batch.builders.CommandLineInterrupterBuilder"/>
+</tika-batch-config>
\ No newline at end of file
Index: tika-batch/target/test-classes/tika-batch-config-basic-test.xml
===================================================================
--- tika-batch/target/test-classes/tika-batch-config-basic-test.xml	(revision 0)
+++ tika-batch/target/test-classes/tika-batch-config-basic-test.xml	(revision 0)
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+
+<tika-batch-config
+        maxAliveTimeSeconds="-1"
+        pauseOnEarlyTerminationMillis = "500"
+        staleThresholdMillis="300000"
+        staleCheckPulseMillis="1000"
+        maxStaleConsumers="2"
+        maxQueueSize="10000"
+        numConsumers="5">
+
+    <!--
+        Can also add startDir: this tells the crawler to start indexing a
+        child directory of the srcDir directory.
+    -->
+	<crawler builderClass="org.apache.tika.batch.fs.builders.FSCrawlerBuilder"
+		crawlOrder="sorted"
+        maxConsecWaitMillis="5000"
+		maxFilesToAdd="-1" 
+		maxFilesToConsider="-1" 
+		includeFilePat=""
+		excludeFilePat=""
+		maxFileSizeBytes="-1"
+        srcDir="tika-batch/src/test/resources/test-input"
+        />
+
+
+<!--
+    This is an example of a crawler that reads a list of files to be processed from a
+    file.  This assumes that the files in the list are relative to srcDir.
+    <crawler builderClass="org.apache.tika.batch.fs.builders.FSCrawlerBuilder"
+             fileList="files.txt"
+             fileListEncoding="UTF-8"
+             maxFilesToAdd="-1"
+             maxFilesToConsider="-1"
+             includeFilePat="(?i).pdf$"
+             excludeFilePat="(?i).msg$"
+             maxFileSizeBytes="-1"
+             srcDir="input"
+             startDir="input/subdir1"
+    />
+-->
+	<consumers builderClass="org.apache.tika.batch.fs.builders.BasicTikaFSConsumersBuilder" recursiveParserWrapper="false">
+		<parser class="org.apache.tika.batch.AutoDetectParserFactory" parseRecursively="true"/>
+		<contenthandler builderClass="org.apache.tika.batch.builders.DefaultContentHandlerFactoryBuilder"
+                        basicHandlerType="xml" writeLimit="-1"/>
+		
+		<!-- overwritePolicy: "skip" a file if target file exists, "rename" a target file, "overwrite" -->
+		<outputstream class="FSOutputStreamFactory" handleExisting="skip" targDir="output"
+                encoding="UTF-8" targetSuffix="xml"/>
+	</consumers>
+	
+	<!-- reporter and interrupter are optional -->
+	<reporter builderClass="org.apache.tika.batch.builders.SimpleLogReporterBuilder" sleepMillis="1000" staleThresholdMillis="500000"/>
+	<interrupter builderClass="org.apache.tika.batch.builders.CommandLineInterrupterBuilder"/>
+</tika-batch-config>
\ No newline at end of file
Index: tika-batch/target/test-classes/org/apache/tika/batch/fs/BatchDriverTest.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/test-classes/org/apache/tika/batch/fs/BatchDriverTest.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/test-classes/org/apache/tika/batch/fs/StringStreamGobbler.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/test-classes/org/apache/tika/batch/fs/StringStreamGobbler.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/test-classes/org/apache/tika/batch/fs/BatchProcessTest.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/test-classes/org/apache/tika/batch/fs/BatchProcessTest.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/test-classes/org/apache/tika/batch/fs/OutputStreamFactoryTest.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/test-classes/org/apache/tika/batch/fs/OutputStreamFactoryTest.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/test-classes/org/apache/tika/batch/fs/HandlerBuilderTest.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/test-classes/org/apache/tika/batch/fs/HandlerBuilderTest.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/test-classes/org/apache/tika/batch/fs/BatchProcessTest$BatchProcessTestExecutor.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/test-classes/org/apache/tika/batch/fs/BatchProcessTest$BatchProcessTestExecutor.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/test-classes/org/apache/tika/batch/fs/BatchProcessTest$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/test-classes/org/apache/tika/batch/fs/BatchProcessTest$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/test-classes/org/apache/tika/batch/fs/FSBatchTestBase.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/test-classes/org/apache/tika/batch/fs/FSBatchTestBase.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/test-classes/org/apache/tika/batch/fs/strawman/StrawmanTest.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/test-classes/org/apache/tika/batch/fs/strawman/StrawmanTest.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/test-classes/org/apache/tika/batch/fs/BatchProcessTest$StreamStrings.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/test-classes/org/apache/tika/batch/fs/BatchProcessTest$StreamStrings.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/test-classes/org/apache/tika/parser/evil/EvilParser.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/test-classes/org/apache/tika/parser/evil/EvilParser.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/test-classes/org/apache/tika/parser/evil/EvilParserFactory.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/test-classes/org/apache/tika/parser/evil/EvilParserFactory.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/test-classes/log4j.properties
===================================================================
--- tika-batch/target/test-classes/log4j.properties	(revision 0)
+++ tika-batch/target/test-classes/log4j.properties	(revision 0)
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#info,debug, error,fatal ...
+log4j.rootLogger=debug
+
+#console
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+
+# Pattern to output the caller's file name and line number.
+log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
Index: tika-batch/target/test-classes/test-input/basic/test1.txt
===================================================================
--- tika-batch/target/test-classes/test-input/basic/test1.txt	(revision 0)
+++ tika-batch/target/test-classes/test-input/basic/test1.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load1.evil
===================================================================
--- tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load1.evil	(revision 0)
+++ tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load1.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load2.evil
===================================================================
--- tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load2.evil	(revision 0)
+++ tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load2.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load3.evil
===================================================================
--- tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load3.evil	(revision 0)
+++ tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load3.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load4.evil
===================================================================
--- tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load4.evil	(revision 0)
+++ tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load4.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load5.evil
===================================================================
--- tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load5.evil	(revision 0)
+++ tika-batch/target/test-classes/test-input/heavy_heavy_hangs/hang_heavy_load5.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/heavy_heavy_hangs/test1.txt
===================================================================
--- tika-batch/target/test-classes/test-input/heavy_heavy_hangs/test1.txt	(revision 0)
+++ tika-batch/target/test-classes/test-input/heavy_heavy_hangs/test1.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/oom/test2.txt
===================================================================
--- tika-batch/target/test-classes/test-input/oom/test2.txt	(revision 0)
+++ tika-batch/target/test-classes/test-input/oom/test2.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/oom/test3.txt
===================================================================
--- tika-batch/target/test-classes/test-input/oom/test3.txt	(revision 0)
+++ tika-batch/target/test-classes/test-input/oom/test3.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/oom/test4.txt
===================================================================
--- tika-batch/target/test-classes/test-input/oom/test4.txt	(revision 0)
+++ tika-batch/target/test-classes/test-input/oom/test4.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/oom/hang_heavy_load.evil
===================================================================
--- tika-batch/target/test-classes/test-input/oom/hang_heavy_load.evil	(revision 0)
+++ tika-batch/target/test-classes/test-input/oom/hang_heavy_load.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/oom/asleep_10000.evil
===================================================================
--- tika-batch/target/test-classes/test-input/oom/asleep_10000.evil	(revision 0)
+++ tika-batch/target/test-classes/test-input/oom/asleep_10000.evil	(revision 0)
@@ -0,0 +1 @@
+sleep 10000
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/oom/test1b_oom_exception.evil
===================================================================
--- tika-batch/target/test-classes/test-input/oom/test1b_oom_exception.evil	(revision 0)
+++ tika-batch/target/test-classes/test-input/oom/test1b_oom_exception.evil	(revision 0)
@@ -0,0 +1 @@
+oom exception
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/oom/test1.txt
===================================================================
--- tika-batch/target/test-classes/test-input/oom/test1.txt	(revision 0)
+++ tika-batch/target/test-classes/test-input/oom/test1.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/one_heavy_hang/test2.txt
===================================================================
--- tika-batch/target/test-classes/test-input/one_heavy_hang/test2.txt	(revision 0)
+++ tika-batch/target/test-classes/test-input/one_heavy_hang/test2.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/one_heavy_hang/test3.txt
===================================================================
--- tika-batch/target/test-classes/test-input/one_heavy_hang/test3.txt	(revision 0)
+++ tika-batch/target/test-classes/test-input/one_heavy_hang/test3.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/one_heavy_hang/test4.txt
===================================================================
--- tika-batch/target/test-classes/test-input/one_heavy_hang/test4.txt	(revision 0)
+++ tika-batch/target/test-classes/test-input/one_heavy_hang/test4.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/one_heavy_hang/hang_heavy_load1.evil
===================================================================
--- tika-batch/target/test-classes/test-input/one_heavy_hang/hang_heavy_load1.evil	(revision 0)
+++ tika-batch/target/test-classes/test-input/one_heavy_hang/hang_heavy_load1.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/target/test-classes/test-input/one_heavy_hang/test1.txt
===================================================================
--- tika-batch/target/test-classes/test-input/one_heavy_hang/test1.txt	(revision 0)
+++ tika-batch/target/test-classes/test-input/one_heavy_hang/test1.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/target/classes/META-INF/NOTICE
===================================================================
--- tika-batch/target/classes/META-INF/NOTICE	(revision 0)
+++ tika-batch/target/classes/META-INF/NOTICE	(revision 0)
@@ -0,0 +1,8 @@
+
+Apache Tika batch
+Copyright 2007-2014 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+
Index: tika-batch/target/classes/META-INF/LICENSE
===================================================================
--- tika-batch/target/classes/META-INF/LICENSE	(revision 0)
+++ tika-batch/target/classes/META-INF/LICENSE	(revision 0)
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
Index: tika-batch/target/classes/META-INF/DEPENDENCIES
===================================================================
--- tika-batch/target/classes/META-INF/DEPENDENCIES	(revision 0)
+++ tika-batch/target/classes/META-INF/DEPENDENCIES	(revision 0)
@@ -0,0 +1,131 @@
+// ------------------------------------------------------------------
+// Transitive dependencies of this project determined from the
+// maven pom organized by organization.
+// ------------------------------------------------------------------
+
+Apache Tika batch
+
+
+From: 'an unknown organization'
+  - XMP Library for Java (http://www.adobe.com/devnet/xmp.html) com.adobe.xmp:xmpcore:jar:5.1.2
+    License: The BSD License  (http://www.adobe.com/devnet/xmp/library/eula-xmp-library-java.html)
+  - metadata-extractor (http://code.google.com/p/metadata-extractor/) com.drewnoakes:metadata-extractor:jar:2.6.2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - juniversalchardet (http://juniversalchardet.googlecode.com/) com.googlecode.juniversalchardet:juniversalchardet:jar:1.0.3
+    License: Mozilla Public License 1.1 (MPL 1.1)  (http://www.mozilla.org/MPL/MPL-1.1.html)
+  - ISO Parser (http://code.google.com/p/mp4parser/) com.googlecode.mp4parser:isoparser:jar:1.0.2
+    License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - java-libpst (https://code.google.com/p/java-libpst/) com.pff:java-libpst:jar:0.8.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Boilerpipe -- Boilerplate Removal and Fulltext Extraction from HTML pages (http://code.google.com/p/boilerpipe/) de.l3s.boilerpipe:boilerpipe:jar:1.1.0
+    License: Apache License 2.0 
+  - Unnamed - jdom:jdom:jar:1.0  jdom:jdom:jar:1.0
+
+  - "Java Concurrency in Practice" book annotations (http://jcip.net/) net.jcip:jcip-annotations:jar:1.0
+
+  - jmatio (http://sourceforge.net/projects/jmatio/) net.sourceforge.jmatio:jmatio:jar:1.0
+    License: BSD  (http://www.linfo.org/bsdlicense.html)
+  - AspectJ runtime (http://www.aspectj.org) org.aspectj:aspectjrt:jar:1.8.0
+    License: Eclipse Public License - v 1.0  (http://www.eclipse.org/legal/epl-v10.html)
+  - Bouncy Castle CMS and S/MIME API (http://www.bouncycastle.org/java.html) org.bouncycastle:bcmail-jdk15:jar:1.45
+    License: Bouncy Castle Licence  (http://www.bouncycastle.org/licence.html)
+  - Bouncy Castle Provider (http://www.bouncycastle.org/java.html) org.bouncycastle:bcprov-jdk15:jar:1.45
+    License: Bouncy Castle Licence  (http://www.bouncycastle.org/licence.html)
+  - TagSoup (http://home.ccil.org/~cowan/XML/tagsoup/) org.ccil.cowan.tagsoup:tagsoup:jar:1.2.1
+    License: Apache License 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Ogg and Vorbis for Java, Core (https://github.com/Gagravarr/VorbisJava) org.gagravarr:vorbis-java-core:jar:0.6
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Tika plugin for Ogg, Vorbis and FLAC (https://github.com/Gagravarr/VorbisJava) org.gagravarr:vorbis-java-tika:jar:0.6
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - XZ for Java (http://tukaani.org/xz/java.html) org.tukaani:xz:jar:1.5
+    License: Public Domain 
+
+From: 'Apache Software Foundation' (http://jakarta.apache.org/)
+  - HttpClient (http://jakarta.apache.org/httpcomponents/httpclient-3.x/) commons-httpclient:commons-httpclient:jar:3.1
+    License: Apache License  (http://www.apache.org/licenses/LICENSE-2.0)
+
+From: 'Apache Software Foundation' (http://www.apache.org)
+  - Log4j (http://logging.apache.org/log4j/docs/) log4j:log4j:jar:1.2.14
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'Apache Software Foundation' (http://www.apache.org/)
+  - Apache POI (http://poi.apache.org/) org.apache.poi:poi:jar:3.11-beta2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache POI (http://poi.apache.org/) org.apache.poi:poi-ooxml:jar:3.11-beta2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache POI (http://poi.apache.org/) org.apache.poi:poi-ooxml-schemas:jar:3.11-beta2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache POI (http://poi.apache.org/) org.apache.poi:poi-scratchpad:jar:3.11-beta2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Xerces2 Java Parser (http://xerces.apache.org/xerces2-j/) xerces:xercesImpl:jar:2.8.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Unnamed - xml-apis:xml-apis:jar:1.3.03 (http://xml.apache.org/commons/#external) xml-apis:xml-apis:jar:1.3.03
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'Google, Inc.' (http://www.google.com)
+  - Gson (http://code.google.com/p/google-gson/) com.google.code.gson:gson:jar:1.7.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'ObjectWeb' (http://www.objectweb.org/)
+  - ASM Debug All (http://asm.objectweb.org/asm-debug-all) org.ow2.asm:asm-debug-all:jar:4.1
+    License: BSD  (http://asm.objectweb.org/license.html)
+
+From: 'QOS.ch' (http://www.qos.ch)
+  - SLF4J API Module (http://www.slf4j.org) org.slf4j:slf4j-api:jar:1.5.6
+
+  - SLF4J LOG4J-12 Binding (http://www.slf4j.org) org.slf4j:slf4j-log4j12:jar:1.5.6
+
+
+From: 'Sun Microsystems' (http://java.sun.com/)
+  - ROME, RSS and atOM utilitiEs for Java (https://rome.dev.java.net/) rome:rome:jar:1.0
+
+
+From: 'The Apache Software Foundation' (http://pdfbox.apache.org)
+  - Apache FontBox (http://pdfbox.apache.org/) org.apache.pdfbox:fontbox:bundle:1.8.7
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache JempBox (http://www.apache.org/pdfbox-parent/jempbox) org.apache.pdfbox:jempbox:bundle:1.8.7
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache PDFBox (http://www.apache.org/pdfbox-parent/pdfbox) org.apache.pdfbox:pdfbox:bundle:1.8.7
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'The Apache Software Foundation' (http://www.apache.org)
+  - Apache Tika core (http://tika.apache.org/) org.apache.tika:tika-core:bundle:1.7-SNAPSHOT
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Tika parsers (http://tika.apache.org/) org.apache.tika:tika-parsers:bundle:1.7-SNAPSHOT
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Tika serialization (http://tika.apache.org) org.apache.tika:tika-serialization:jar:1.7-SNAPSHOT
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Tika XMP (http://tika.apache.org/) org.apache.tika:tika-xmp:bundle:1.7-SNAPSHOT
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'The Apache Software Foundation' (http://www.apache.org/)
+  - Commons CLI (http://commons.apache.org/cli/) commons-cli:commons-cli:jar:1.2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Commons Codec (http://commons.apache.org/proper/commons-codec/) commons-codec:commons-codec:jar:1.9
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Commons Logging (http://commons.apache.org/logging) commons-logging:commons-logging:jar:1.1.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache Commons Compress (http://commons.apache.org/proper/commons-compress/) org.apache.commons:commons-compress:jar:1.8.1
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache JAMES Mime4j (Core) (http://james.apache.org/mime4j/apache-mime4j-core) org.apache.james:apache-mime4j-core:jar:0.7.2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+  - Apache JAMES Mime4j (DOM) (http://james.apache.org/mime4j/apache-mime4j-dom) org.apache.james:apache-mime4j-dom:jar:0.7.2
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+From: 'UCAR/Unidata' (http://www.ucar.edu/)
+  - NetCDF-Java Library (http://www.unidata.ucar.edu/software/netcdf-java/) edu.ucar:netcdf:jar:4.2.20
+    License: (MIT-style) netCDF C library license  (http://www.unidata.ucar.edu/software/netcdf/copyright.html)
+  - Unidata Common (http://www.unidata.ucar.edu/software/netcdf-java/) edu.ucar:unidataCommon:jar:4.2.20
+    License: (MIT-style) netCDF C library license  (http://www.unidata.ucar.edu/software/netcdf/copyright.html)
+
+From: 'Uwyn' (http://uwyn.com/)
+  - JHighlight (https://jhighlight.dev.java.net/) com.uwyn:jhighlight:jar:1.0
+    License: CDDL, v1.0  (http://www.opensource.org/licenses/cddl1.php)    License: LGPL, v2.1 or later  (http://www.opensource.org/licenses/lgpl-license.php)
+
+From: 'XmlBeans' (http://xmlbeans.apache.org/)
+  - XmlBeans (http://xmlbeans.apache.org) org.apache.xmlbeans:xmlbeans:jar:2.6.0
+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+
+
+
Index: tika-batch/target/classes/META-INF/MANIFEST.MF
===================================================================
--- tika-batch/target/classes/META-INF/MANIFEST.MF	(revision 0)
+++ tika-batch/target/classes/META-INF/MANIFEST.MF	(revision 0)
@@ -0,0 +1,51 @@
+Manifest-Version: 1.0
+Export-Package: org.apache.tika.util;uses:="org.w3c.dom",org.apache.ti
+ ka.batch;uses:="org.apache.tika.parser,org.apache.tika.config,org.apa
+ che.commons.logging,org.apache.log4j,org.apache.tika.util,org.apache.
+ tika.io,org.apache.commons.cli,org.apache.tika.metadata,org.apache.ti
+ ka.extractor",org.apache.tika.batch.builders;uses:="org.apache.tika.b
+ atch,org.w3c.dom,javax.xml.parsers,org.apache.tika.util,org.xml.sax,o
+ rg.apache.tika.sax",org.apache.tika.batch.fs;uses:="org.apache.tika.m
+ etadata,org.apache.tika.parser,org.apache.commons.logging,org.apache.
+ tika.batch,org.apache.tika.config,org.apache.tika.sax,org.xml.sax,org
+ .apache.commons.cli,org.apache.tika.batch.builders,org.apache.tika.io
+ ,org.apache.log4j,org.apache.tika.extractor,org.apache.tika.util,org.
+ apache.tika.metadata.serialization,org.xml.sax.helpers,org.apache.tik
+ a.exception",org.apache.tika.batch.fs.builders;uses:="org.apache.tika
+ .batch,org.apache.tika.batch.fs,org.apache.tika.util,org.apache.tika.
+ batch.builders,org.apache.tika.sax,org.w3c.dom,org.apache.tika.extrac
+ tor",org.apache.tika.batch.fs.strawman;uses:="org.apache.log4j,org.ap
+ ache.tika.io"
+Bundle-ActivationPolicy: lazy
+Implementation-Title: Apache Tika batch
+Built-By: tallison
+Tool: Bnd-1.15.0
+Implementation-Vendor: The Apache Software Foundation
+Implementation-Vendor-Id: org.apache.tika
+Bundle-Activator: org.apache.tika.config.TikaActivator
+Specification-Title: Apache Tika batch
+Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
+Bundle-SymbolicName: org.apache.tika.batch
+Implementation-Version: 1.7-SNAPSHOT
+Specification-Vendor: The Apache Software Foundation
+Bundle-Name: Apache Tika batch
+Created-By: Apache Maven Bundle Plugin
+Bundle-Vendor: The Apache Software Foundation
+Bundle-Version: 1.7.0.SNAPSHOT
+Build-Jdk: 1.7.0_40
+Bnd-LastModified: 1411660315849
+Bundle-ManifestVersion: 2
+Bundle-Description: Apache Tika is a toolkit for detecting and extract
+ ing metadata and    structured text content from various documents us
+ ing existing parser    libraries.
+Specification-Version: 1.7-SNAPSHOT
+Import-Package: javax.xml.parsers,org.apache.commons.cli;version="[1.2
+ ,2)",org.apache.commons.logging,org.apache.log4j,org.apache.tika.conf
+ ig;version="[1.0,2)",org.apache.tika.exception;version="[1.0,2)",org.
+ apache.tika.extractor;version="[1.0,2)",org.apache.tika.io;version="[
+ 1.0,2)",org.apache.tika.metadata;version="[1.0,2)",org.apache.tika.me
+ tadata.serialization,org.apache.tika.parser;version="[1.0,2)",org.apa
+ che.tika.sax;version="[1.0,2)",org.w3c.dom,org.xml.sax,org.xml.sax.he
+ lpers
+Bundle-DocURL: http://tika.apache.org/
+
Index: tika-batch/target/classes/org/apache/tika/batch/IStatusReporter.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/IStatusReporter.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/PoisonFileResource.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/PoisonFileResource.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/IFileProcessorFutureResult.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/IFileProcessorFutureResult.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/BatchProcess$BATCH_CONSTANTS.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/BatchProcess$BATCH_CONSTANTS.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/ParserFactory.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/ParserFactory.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/BatchProcessDriverCLI.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/BatchProcessDriverCLI.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/FileResource.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/FileResource.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/ParallelFileProcessingResult.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/ParallelFileProcessingResult.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/StatusReporterFutureResult.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/StatusReporterFutureResult.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/BatchProcessDriverCLI$StreamWriter.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/BatchProcessDriverCLI$StreamWriter.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/BatchProcessDriverCLI$StreamGobbler.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/BatchProcessDriverCLI$StreamGobbler.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/BatchNoRestartException.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/BatchNoRestartException.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSDirectoryCrawler.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSDirectoryCrawler.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSFileResource.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSFileResource.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSListCrawler.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSListCrawler.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSProperties.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSProperties.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver$RedirectGobbler.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver$RedirectGobbler.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/RecursiveParserWrapperFSConsumer.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/RecursiveParserWrapperFSConsumer.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSOutputStreamFactory.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSOutputStreamFactory.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/BasicTikaFSConsumer.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/BasicTikaFSConsumer.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSUtil$HANDLE_EXISTING.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSUtil$HANDLE_EXISTING.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSBatchProcessCLI.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSBatchProcessCLI.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSConsumersManager.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSConsumersManager.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSDirectoryCrawler$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSDirectoryCrawler$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSDirectoryCrawler$CRAWL_ORDER.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSDirectoryCrawler$CRAWL_ORDER.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/builders/FSCrawlerBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/builders/FSCrawlerBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/builders/BasicTikaFSConsumersBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/builders/BasicTikaFSConsumersBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSUtil.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSUtil.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSDocumentSelector.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSDocumentSelector.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/fs/FSDirectoryCrawler$FileNameComparator.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/fs/FSDirectoryCrawler$FileNameComparator.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/FileStarted.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/FileStarted.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/BatchProcess$StaleFutureResult.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/BatchProcess$StaleFutureResult.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/FileResourceCrawler.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/FileResourceCrawler.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/FileResourceConsumer$STATE.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/FileResourceConsumer$STATE.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/BatchProcessDriverCLI$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/BatchProcessDriverCLI$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/InterrupterFutureResult.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/InterrupterFutureResult.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/BatchProcess.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/BatchProcess.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/SimpleLogStatusReporter.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/SimpleLogStatusReporter.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/BatchProcess$CAUSE_FOR_TERMINATION.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/BatchProcess$CAUSE_FOR_TERMINATION.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/FileConsumerFutureResult.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/FileConsumerFutureResult.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/CommandLineInterrupter.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/CommandLineInterrupter.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/IInterrupter.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/IInterrupter.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/FileResourceCrawlerFutureResult.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/FileResourceCrawlerFutureResult.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/BatchProcess$StaleChecker.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/BatchProcess$StaleChecker.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/FileResourceConsumer.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/FileResourceConsumer.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/OutputStreamFactory.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/OutputStreamFactory.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/builders/DefaultContentHandlerFactoryBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/builders/DefaultContentHandlerFactoryBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/builders/StatusReporterBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/builders/StatusReporterBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/builders/ICrawlerBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/builders/ICrawlerBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/builders/ObjectFromDOMBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/builders/ObjectFromDOMBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/builders/IInterupterBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/builders/IInterupterBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/builders/CommandLineInterrupterBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/builders/CommandLineInterrupterBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/builders/SimpleLogReporterBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/builders/SimpleLogReporterBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/builders/ContentHandlerFactoryBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/builders/ContentHandlerFactoryBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/builders/BatchProcessBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/builders/BatchProcessBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/builders/ObjectFromDOMAndQueueBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/builders/ObjectFromDOMAndQueueBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/builders/ReporterBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/builders/ReporterBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/builders/AbstractConsumersBuilder.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/builders/AbstractConsumersBuilder.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/BatchProcess$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/BatchProcess$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/AutoDetectParserFactory.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/AutoDetectParserFactory.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/batch/ConsumersManager.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/batch/ConsumersManager.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/util/XMLDOMUtil.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/util/XMLDOMUtil.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/util/DurationFormatUtils.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/util/DurationFormatUtils.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/util/PropsUtil.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/util/PropsUtil.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/util/BatchLocalization.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/util/BatchLocalization.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/org/apache/tika/util/ClassLoaderUtil.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tika-batch/target/classes/org/apache/tika/util/ClassLoaderUtil.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tika-batch/target/classes/tika-batch-config.xml
===================================================================
--- tika-batch/target/classes/tika-batch-config.xml	(revision 0)
+++ tika-batch/target/classes/tika-batch-config.xml	(revision 0)
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+
+<tika-batch-config staleThresholdMillis="300000" maxQueueSize="10000" numConsumers="5">
+
+	<crawler class="org.apache.tika.batch.fs.builders.FSCrawlerBuilder"
+		randomCrawl="true" 
+		maxFilesToAdd="-1" 
+		maxFilesToConsider="-1" 
+		includeFilePat="(?i).pdf$"
+		excludeFilePat="(?i).msg$"
+		maxFileSizeBytes="-1"
+        srcDir="input"
+        />
+<!--
+    This is an example of a crawler that reads a list of files to be processed from a
+    file.  This assumes that the files in the list are relative to srcDir.
+    <crawler class="org.apache.tika.batch.fs.builders.FSCrawlerBuilder"
+             fileList="files.txt"
+             fileListEncoding="UTF-8"
+             maxFilesToAdd="-1"
+             maxFilesToConsider="-1"
+             includeFilePat="(?i).pdf$"
+             excludeFilePat="(?i).msg$"
+             maxFileSizeBytes="-1"
+             srcDir="input"
+    />
+-->
+	<consumers class="org.apache.tika.batch.fs.builders.BasicTikaFSConsumersBuilder">
+		<parser class="AutoDetectParserFactory" parseRecursively="true"/>
+		<contenthandler class="org.apache.tika.batch.builders.DefaultContentHandlerFactoryBuilder"
+                        basicHandlerType="xml" writeLimit="-1"/>
+		
+		<!-- overwritePolicy: "skip" a file if target file exists, "rename" a target file, "overwrite" -->
+		<outputstream class="FSOutputStreamFactory" overwritePolicy="rename" targDir="output"
+                encoding="UTF-8"/>
+	</consumers>
+	
+	<!-- reporter and interrupter are optional -->
+	<reporter class="StdOutStatusReporterFactory"/>
+	<interrupter class="Interrupter"/>
+</tika-batch-config>
\ No newline at end of file
Index: tika-batch/src/test/java/org/apache/tika/batch/fs/StringStreamGobbler.java
===================================================================
--- tika-batch/src/test/java/org/apache/tika/batch/fs/StringStreamGobbler.java	(revision 0)
+++ tika-batch/src/test/java/org/apache/tika/batch/fs/StringStreamGobbler.java	(revision 0)
@@ -0,0 +1,71 @@
+package org.apache.tika.batch.fs;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.io.IOUtils;
+import org.apache.tika.util.BatchLocalization;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+
+public class StringStreamGobbler implements Runnable {
+
+        //plagiarized from oap.oodt's StreamGobbler
+        private final BufferedReader reader;
+        private volatile boolean running = true;
+        private final StringBuilder sb = new StringBuilder();
+
+        public StringStreamGobbler(InputStream is){
+
+            try {
+                this.reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(is),
+                        BatchLocalization.getEncoding()));
+            } catch (UnsupportedEncodingException e) {
+                throw new RuntimeException("UnsupportedEncodingException: "+
+                        BatchLocalization.getEncoding());
+            }
+        }
+
+        @Override
+        public void run() {
+            String line = null;
+            try {
+                while ((line = reader.readLine()) != null && this.running) {
+                    sb.append(line);
+                    sb.append("\n");
+                }
+            } catch (IOException e) {
+                //swallow ioe
+            }
+        }
+
+        public void stopGobblingAndDie() {
+            running = false;
+            IOUtils.closeQuietly(reader);
+        }
+
+        @Override
+        public String toString() {
+            return sb.toString();
+    }
+
+}
Index: tika-batch/src/test/java/org/apache/tika/batch/fs/BatchProcessTest.java
===================================================================
--- tika-batch/src/test/java/org/apache/tika/batch/fs/BatchProcessTest.java	(revision 0)
+++ tika-batch/src/test/java/org/apache/tika/batch/fs/BatchProcessTest.java	(revision 0)
@@ -0,0 +1,194 @@
+package org.apache.tika.batch.fs;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+import org.apache.tika.batch.BatchProcess;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.fail;
+import static org.junit.Assert.assertTrue;
+
+public class BatchProcessTest extends FSBatchTestBase {
+
+    @Test(timeout = 15000)
+    public void oneHeavyHangTest() throws Exception {
+        File targDir = getNewTargDir("one_heavy_hang-");
+
+        Map<String, String> args = getDefaultArgs("one_heavy_hang", targDir);
+        BatchProcessTestExecutor ex = new BatchProcessTestExecutor(args);
+        StreamStrings streamStrings = ex.execute();
+
+        assertEquals(5, targDir.listFiles().length);
+        File hvyHang = new File(targDir, "hang_heavy_load1.evil.xml");
+        assertTrue(hvyHang.exists());
+        assertEquals(0, hvyHang.length());
+        assertNotContained(BatchProcess.BATCH_CONSTANTS.BATCH_PROCESS_FATAL_MUST_RESTART.toString(),
+                streamStrings.getErrString());
+    }
+
+
+    @Test(timeout = 15000)
+    public void allHeavyHangsTest() throws Exception {
+        //each of the three threads hits a heavy hang.  The BatchProcess runs into
+        //all stales and shuts down.
+        File targDir = getNewTargDir("allHeavyHangs-");
+        Map<String, String> args = getDefaultArgs("heavy_heavy_hangs", targDir);
+        BatchProcessTestExecutor ex = new BatchProcessTestExecutor(args);
+        StreamStrings streamStrings = ex.execute();
+
+        assertEquals(3, targDir.listFiles().length);
+        for (int i = 1; i < 4; i++) {
+            File hvyHang = new File(targDir, "hang_heavy_load" + i + ".evil.xml");
+            assertTrue(hvyHang.exists());
+            assertEquals(0, hvyHang.length());
+        }
+        assertContains(BatchProcess.BATCH_CONSTANTS.BATCH_PROCESS_FATAL_MUST_RESTART.toString(),
+                streamStrings.getErrString());
+    }
+
+    @Test(timeout = 30000)
+    public void allHeavyHangsTestWithCrazyNumberConsumersTest() throws Exception {
+        File targDir = getNewTargDir("allHeavyHangsCrazyNumberConsumers-");
+        Map<String, String> args = getDefaultArgs("heavy_heavy_hangs", targDir);
+        args.put("numConsumers", "100");
+        BatchProcessTestExecutor ex = new BatchProcessTestExecutor(args);
+        StreamStrings streamStrings = ex.execute();
+        assertEquals(6, targDir.listFiles().length);
+
+        for (int i = 1; i < 6; i++){
+            File hvyHang = new File(targDir, "hang_heavy_load"+i+".evil.xml");
+            assertTrue(hvyHang.exists());
+            assertEquals(0, hvyHang.length());
+        }
+        assertContains(new File(targDir, "test1.txt.xml"), "UTF-8", "This is tika-batch's first test file");
+        assertNotContained(BatchProcess.BATCH_CONSTANTS.BATCH_PROCESS_FATAL_MUST_RESTART.toString(),
+                streamStrings.getErrString());
+    }
+
+    @Test(timeout = 30000)
+    public void allHeavyHangsTestWithStarvedCrawler() throws Exception {
+        //this tests that if all consumers are hung and the crawler is
+        //waiting to add to the queue, there isn't deadlock.  The batchrunner should
+        //shutdown and ask to be restarted.
+        File targDir = getNewTargDir("allHeavyHangsStarvedCrawler-");
+        Map<String, String> args = getDefaultArgs("heavy_heavy_hangs", targDir);
+        args.put("numConsumers", "2");
+        args.put("maxQueueSize", "2");
+        args.put("staleThresholdMillis", "100000000");//make sure that the batch process doesn't stale out
+        BatchProcessTestExecutor ex = new BatchProcessTestExecutor(args);
+        StreamStrings streamStrings = ex.execute();
+
+        assertEquals(2, targDir.listFiles().length);
+
+        for (int i = 1; i < 2; i++){
+            File hvyHang = new File(targDir, "hang_heavy_load"+i+".evil.xml");
+            assertTrue(hvyHang.exists());
+            assertEquals(0, hvyHang.length());
+        }
+        assertContains(BatchProcess.BATCH_CONSTANTS.BATCH_PROCESS_FATAL_MUST_RESTART.toString(),
+                streamStrings.getErrString());
+        assertContains("Crawler timed out", streamStrings.getErrString());
+    }
+
+    @Test(timeout = 15000)
+    public void outOfMemory() throws Exception {
+        //the first consumer should sleep for 10 seconds
+        //the second should be tied up in a heavy hang
+        //the third one should hit the oom after processing test1.txt
+        //no consumers should process test2-4.txt!
+        File targDir = getNewTargDir("oom-");
+
+        Map<String, String> args = getDefaultArgs("oom", targDir);
+        args.put("numConsumers", "3");
+        args.put("staleThresholdMillis", "30000");
+
+        BatchProcessTestExecutor ex = new BatchProcessTestExecutor(args);
+        StreamStrings streamStrings = ex.execute();
+
+        assertEquals(4, targDir.listFiles().length);
+        assertContains(new File(targDir, "test1.txt.xml"), "UTF-8", "This is tika-batch's first test file");
+
+        assertContains(BatchProcess.BATCH_CONSTANTS.BATCH_PROCESS_FATAL_MUST_RESTART.toString(),
+                streamStrings.getErrString());
+    }
+
+
+    private class BatchProcessTestExecutor {
+        private final Map<String, String> args;
+
+        public BatchProcessTestExecutor(Map<String, String> args) {
+            this.args = args;
+        }
+
+        private StreamStrings execute() {
+            Process p = null;
+            try {
+                ProcessBuilder b = getNewBatchRunnerProcess("/tika-batch-config-evil-test.xml", args);
+                p = b.start();
+                StringStreamGobbler errorGobbler = new StringStreamGobbler(p.getErrorStream());
+                StringStreamGobbler outGobbler = new StringStreamGobbler(p.getInputStream());
+                Thread errorThread = new Thread(errorGobbler);
+                Thread outThread = new Thread(outGobbler);
+                errorThread.start();
+                outThread.start();
+                while (true) {
+                    try {
+                        p.exitValue();
+                        break;
+                    } catch (IllegalThreadStateException e) {
+                        //still going;
+                    }
+                }
+                errorGobbler.stopGobblingAndDie();
+                outGobbler.stopGobblingAndDie();
+                errorThread.interrupt();
+                outThread.interrupt();
+                return new StreamStrings(outGobbler.toString(), errorGobbler.toString());
+            } catch (IOException e) {
+                fail();
+            } finally {
+                destroyProcess(p);
+            }
+            return null;
+        }
+
+    }
+
+    private class StreamStrings {
+        private final String outString;
+        private final String errString;
+
+        private StreamStrings(String outString, String errString) {
+            this.outString = outString;
+            this.errString = errString;
+        }
+
+        private String getOutString() {
+            return outString;
+        }
+
+        private String getErrString() {
+            return errString;
+        }
+    }
+}
Index: tika-batch/src/test/java/org/apache/tika/batch/fs/OutputStreamFactoryTest.java
===================================================================
--- tika-batch/src/test/java/org/apache/tika/batch/fs/OutputStreamFactoryTest.java	(revision 0)
+++ tika-batch/src/test/java/org/apache/tika/batch/fs/OutputStreamFactoryTest.java	(revision 0)
@@ -0,0 +1,96 @@
+package org.apache.tika.batch.fs;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.BatchProcess;
+import org.apache.tika.batch.ParallelFileProcessingResult;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.Map;
+
+import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+
+public class OutputStreamFactoryTest extends FSBatchTestBase {
+
+
+    @Test
+    public void testIllegalState() throws Exception {
+        File targDir = getNewTargDir("os-factory-illegal-state-");
+        Map<String, String> args = getDefaultArgs("basic", targDir);
+        BatchProcess runner = getNewBatchRunner("/tika-batch-config-basic-test.xml", args);
+        ParallelFileProcessingResult result = runner.execute();
+        assertEquals(1, targDir.listFiles().length);
+
+        boolean illegalState = false;
+        try{
+            result = runner.execute();
+        } catch (IllegalStateException e) {
+            illegalState = true;
+        }
+        assertTrue(illegalState);
+    }
+
+    @Test
+    public void testSkip() throws Exception {
+        File targDir = getNewTargDir("os-factory-skip-");
+        Map<String, String> args = getDefaultArgs("basic", targDir);
+        args.put("handleExisting", "skip");
+        BatchProcess runner = getNewBatchRunner("/tika-batch-config-basic-test.xml", args);
+        ParallelFileProcessingResult result = runner.execute();
+        assertEquals(1, targDir.listFiles().length);
+
+        runner = getNewBatchRunner("/tika-batch-config-basic-test.xml", args);
+        result = runner.execute();
+        assertEquals(1, targDir.listFiles().length);
+    }
+
+    @Test
+    public void testRename() throws Exception {
+        File targDir = getNewTargDir("os-factory-rename-");
+        Map<String, String> args = getDefaultArgs("basic", targDir);
+
+        args.put("handleExisting", "rename");
+        BatchProcess runner = getNewBatchRunner("/tika-batch-config-basic-test.xml", args);
+        ParallelFileProcessingResult result = runner.execute();
+        assertEquals(1, targDir.listFiles().length);
+
+        runner = getNewBatchRunner("/tika-batch-config-basic-test.xml", args);
+        result = runner.execute();
+        assertEquals(2, targDir.listFiles().length);
+
+        runner = getNewBatchRunner("/tika-batch-config-basic-test.xml", args);
+        result = runner.execute();
+        assertEquals(3, targDir.listFiles().length);
+
+        int hits = 0;
+        for (File f : targDir.listFiles()){
+            String name = f.getName();
+            if (name.equals("test1.txt.xml")) {
+                hits++;
+            } else if (name.equals("test1(1).txt.xml")) {
+                hits++;
+            } else if (name.equals("test1(2).txt.xml")) {
+                hits++;
+            }
+        }
+        assertEquals(3, hits);
+    }
+
+}
Index: tika-batch/src/test/java/org/apache/tika/batch/fs/HandlerBuilderTest.java
===================================================================
--- tika-batch/src/test/java/org/apache/tika/batch/fs/HandlerBuilderTest.java	(revision 0)
+++ tika-batch/src/test/java/org/apache/tika/batch/fs/HandlerBuilderTest.java	(revision 0)
@@ -0,0 +1,118 @@
+package org.apache.tika.batch.fs;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.BatchProcess;
+import org.apache.tika.batch.ParallelFileProcessingResult;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.Map;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class HandlerBuilderTest extends FSBatchTestBase {
+
+    @Test
+    public void testXML() throws Exception {
+
+        File targDir = getNewTargDir("handler-xml-");
+        Map<String, String> args = getDefaultArgs("basic", targDir);
+        args.put("basicHandlerType", "xml");
+        args.put("targetSuffix", "xml");
+
+        BatchProcess runner = getNewBatchRunner("/tika-batch-config-basic-test.xml", args);
+        ParallelFileProcessingResult result = runner.execute();
+        File targFile = new File(targDir, "test1.txt.xml");
+        String resultString = getStringFromFile(targFile, "UTF-8");
+        assertTrue(resultString.contains("<html xmlns=\"http://www.w3.org/1999/xhtml\">"));
+        assertTrue(resultString.contains("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"));
+        assertTrue(resultString.contains("This is tika-batch's first test file"));
+    }
+
+
+    @Test
+    public void testHTML() throws Exception {
+        File targDir = getNewTargDir("handler-html-");
+
+        Map<String, String> args = getDefaultArgs("basic", targDir);
+        args.put("basicHandlerType", "html");
+        args.put("targetSuffix", "html");
+        BatchProcess runner = getNewBatchRunner("/tika-batch-config-basic-test.xml", args);
+        ParallelFileProcessingResult result = runner.execute();
+        File targFile = new File(targDir, "test1.txt.html");
+        String resultString = getStringFromFile(targFile, "UTF-8");
+        assertTrue(resultString.contains("<html xmlns=\"http://www.w3.org/1999/xhtml\">"));
+        assertFalse(resultString.contains("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"));
+        assertTrue(resultString.contains("This is tika-batch's first test file"));
+    }
+
+    @Test
+    public void testText() throws Exception {
+        File targDir = getNewTargDir("handler-txt-");
+
+        Map<String, String> args = getDefaultArgs("basic", targDir);
+        args.put("basicHandlerType", "txt");
+        args.put("targetSuffix", "txt");
+
+        BatchProcess runner = getNewBatchRunner("/tika-batch-config-basic-test.xml", args);
+        ParallelFileProcessingResult result = runner.execute();
+        File targFile = new File(targDir, "test1.txt.txt");
+        String resultString = getStringFromFile(targFile, "UTF-8");
+        assertFalse(resultString.contains("<html xmlns=\"http://www.w3.org/1999/xhtml\">"));
+        assertFalse(resultString.contains("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"));
+        assertTrue(resultString.contains("This is tika-batch's first test file"));
+    }
+
+
+    @Test
+    public void testXMLWithWriteLimit() throws Exception {
+        File targDir = getNewTargDir("handler-xml-write-limit-");
+
+        Map<String, String> args = getDefaultArgs("basic", targDir);
+        args.put("writeLimit", "5");
+
+        BatchProcess runner = getNewBatchRunner("/tika-batch-config-basic-test.xml", args);
+        ParallelFileProcessingResult result = runner.execute();
+
+        File targFile = new File(targDir, "test1.txt.xml");
+        String resultString = getStringFromFile(targFile, "UTF-8");
+        //this is not ideal. How can we change handlers to writeout whatever
+        //they've gotten so far, up to the writeLimit?
+        assertTrue(resultString.equals(""));
+    }
+
+    @Test
+    public void testRecursiveParserWrapper() throws Exception {
+        File targDir = getNewTargDir("handler-recursive-parser");
+
+        Map<String, String> args = getDefaultArgs("basic", targDir);
+        args.put("basicHandlerType", "txt");
+        args.put("targetSuffix", "json");
+        args.put("recursiveParserWrapper", "true");
+
+        BatchProcess runner = getNewBatchRunner("/tika-batch-config-basic-test.xml", args);
+        ParallelFileProcessingResult result = runner.execute();
+        File targFile = new File(targDir, "test1.txt.json");
+        String resultString = getStringFromFile(targFile, "UTF-8");
+        assertTrue(resultString.contains("\"Content-Encoding\":\"ISO-8859-1\""));
+        assertTrue(resultString.contains("tika-batch\\u0027s first test file"));
+    }
+
+}
Index: tika-batch/src/test/java/org/apache/tika/batch/fs/FSBatchTestBase.java
===================================================================
--- tika-batch/src/test/java/org/apache/tika/batch/fs/FSBatchTestBase.java	(revision 0)
+++ tika-batch/src/test/java/org/apache/tika/batch/fs/FSBatchTestBase.java	(revision 0)
@@ -0,0 +1,209 @@
+package org.apache.tika.batch.fs;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.commons.io.FileUtils;
+import org.apache.tika.TikaTest;
+import org.apache.tika.batch.BatchProcess;
+import org.apache.tika.batch.BatchProcessDriverCLI;
+import org.apache.tika.batch.builders.BatchProcessBuilder;
+import org.apache.tika.io.IOUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * This is the base class for file-system batch tests.
+ * <p/>
+ * There are a few areas for improvement in this test suite.
+ * <ol>
+ *     <li>For the heavy load tests, the test cases leave behind files that
+ *     cannot be deleted from within the same jvm.  A thread is still actively writing to an
+ *     OutputStream when tearDown() is called.  The current solution is to create
+ *     the temp dir within the target/tika-batch/test-classes so that they will at least
+ *     be removed during each &quot;clean&quot;</li>
+ *     <li>The &quot;evil&quot; tests are time-based.  This is not
+ *     extremely reliable across different machines with different number/power of cpus.
+ *     </li>
+ * </ol>
+ */
+public abstract class FSBatchTestBase extends TikaTest {
+
+    private static File outputRoot = null;
+    private Process process = null;
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+
+        File testOutput = new File("target/test-classes/test-output");
+        testOutput.mkdirs();
+        outputRoot = File.createTempFile("tika-batch-output-root-", "", testOutput);
+        outputRoot.delete();
+        outputRoot.mkdirs();
+
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        //not ideal, but should be ok for testing
+        //see caveat in TikaCLITest's textExtract
+        try {
+           FileUtils.deleteDirectory(outputRoot);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    protected void destroyProcess(Process p) {
+        if (p == null)
+            return;
+
+        try {
+            p.exitValue();
+        } catch (IllegalThreadStateException e) {
+            p.destroy();
+        }
+    }
+    File getNewTargDir(String subdirPrefix) throws IOException {
+        File targDir = File.createTempFile(subdirPrefix, "", outputRoot);
+        targDir.delete();
+        targDir.mkdirs();
+        return targDir;
+    }
+
+    Map<String, String> getDefaultArgs(String srcSubDir, File targDir) throws Exception {
+        Map<String, String> args = new HashMap<String, String>();
+        args.put("srcDir", "\""+getInputRoot(srcSubDir).getAbsolutePath()+"\"");
+        if (targDir != null) {
+            args.put("targDir", "\""+targDir.getAbsolutePath()+"\"");
+        }
+        return args;
+    }
+
+    String[] getDefaultCommandLineArgsArr(String srcSubDir, File targDir, Map<String, String> commandLine) throws Exception {
+        List<String> args = new ArrayList<String>();
+        //need to include "-" because these are going to the commandline!
+        if (srcSubDir != null) {
+            args.add("-srcDir");
+            args.add(getInputRoot(srcSubDir).getAbsolutePath());
+        }
+        if (targDir != null) {
+            args.add("-targDir");
+            args.add(targDir.getAbsolutePath());
+        }
+        if (commandLine != null) {
+            for (Map.Entry<String, String> e : commandLine.entrySet()) {
+                args.add(e.getKey());
+                args.add(e.getValue());
+            }
+        }
+        return args.toArray(new String[args.size()]);
+    }
+
+
+    File getInputRoot(String subdir) throws Exception {
+        String path = (subdir == null || subdir.length() == 0) ? "/test-input" : "/test-input/"+subdir;
+        File inputRoot = new File(this.getClass().getResource(path).toURI());
+        return inputRoot;
+    }
+
+    BatchProcess getNewBatchRunner(String testConfig,
+                                  Map<String, String> args) throws IOException {
+        InputStream is = this.getClass().getResourceAsStream(testConfig);
+        BatchProcessBuilder b = new BatchProcessBuilder();
+        BatchProcess runner = b.build(is, args);
+
+        IOUtils.closeQuietly(is);
+        return runner;
+    }
+
+    public ProcessBuilder getNewBatchRunnerProcess(String testConfig, Map<String, String> args) {
+        List<String> argList = new ArrayList<String>();
+        for (Map.Entry<String, String> e : args.entrySet()) {
+            argList.add("-"+e.getKey());
+            argList.add(e.getValue());
+        }
+        String[] fullCommandLine = commandLine(testConfig, argList.toArray(new String[argList.size()]));
+        ProcessBuilder builder = new ProcessBuilder(fullCommandLine);
+        return builder;
+    }
+
+    private String[] commandLine(String testConfig, String[] args) {
+        List<String> commandLine = new ArrayList<String>();
+        commandLine.add("java");
+        commandLine.add("-Xmx128m");
+        commandLine.add("-cp");
+        String cp = System.getProperty("java.class.path");
+        //need to test for " " on *nix, can't just add double quotes
+        //across platforms.
+        if (cp.contains(" ")){
+            cp = "\""+cp+"\"";
+        }
+        commandLine.add(cp);
+        commandLine.add("org.apache.tika.batch.fs.FSBatchProcessCLI");
+
+        String configFile = this.getClass().getResource(testConfig).getFile();
+        commandLine.add("-c");
+
+        commandLine.add(configFile);
+
+        for (String s : args) {
+            commandLine.add(s);
+        }
+        return commandLine.toArray(new String[commandLine.size()]);
+    }
+    BatchProcessDriverCLI getNewDriver(String testConfig,
+                                      String[] args) throws Exception {
+        List<String> commandLine = new ArrayList<String>();
+        commandLine.add("java");
+        commandLine.add("-Xmx128m");
+        commandLine.add("-cp");
+        String cp = System.getProperty("java.class.path");
+        //need to test for " " on *nix, can't just add double quotes
+        //across platforms.
+        if (cp.contains(" ")){
+            cp = "\""+cp+"\"";
+        }
+        commandLine.add(cp);
+        commandLine.add("org.apache.tika.batch.fs.FSBatchProcessCLI");
+
+        String configFile = this.getClass().getResource(testConfig).getFile();
+        commandLine.add("-c");
+
+        commandLine.add(configFile);
+
+        for (String s : args) {
+            commandLine.add(s);
+        }
+
+
+        BatchProcessDriverCLI driver = new BatchProcessDriverCLI(
+                commandLine.toArray(new String[commandLine.size()]));
+
+        return driver;
+    }
+
+
+}
Index: tika-batch/src/test/java/org/apache/tika/batch/fs/strawman/StrawmanTest.java
===================================================================
--- tika-batch/src/test/java/org/apache/tika/batch/fs/strawman/StrawmanTest.java	(revision 0)
+++ tika-batch/src/test/java/org/apache/tika/batch/fs/strawman/StrawmanTest.java	(revision 0)
@@ -0,0 +1,28 @@
+package org.apache.tika.batch.fs.strawman;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import org.junit.Test;
+
+public class StrawmanTest {
+    //TODO: actually write some tests!!!
+    @Test
+    public void basicTest() {
+
+
+
+    }
+}
Index: tika-batch/src/test/java/org/apache/tika/batch/fs/BatchDriverTest.java
===================================================================
--- tika-batch/src/test/java/org/apache/tika/batch/fs/BatchDriverTest.java	(revision 0)
+++ tika-batch/src/test/java/org/apache/tika/batch/fs/BatchDriverTest.java	(revision 0)
@@ -0,0 +1,105 @@
+package org.apache.tika.batch.fs;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.BatchProcessDriverCLI;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+
+public class BatchDriverTest extends FSBatchTestBase {
+
+    @Test(timeout = 15000)
+    public void oneHeavyHangTest() throws Exception {
+        //batch runner hits one heavy hang file, keep going
+        File targDir = getNewTargDir("daemon-");
+
+        //make sure target directory is empty!
+        assertEquals(0, targDir.listFiles().length);
+
+        String[] args = getDefaultCommandLineArgsArr("one_heavy_hang", targDir, null);
+        BatchProcessDriverCLI driver = getNewDriver("/tika-batch-config-evil-test.xml", args);
+        driver.execute();
+        assertEquals(0, driver.getNumRestarts());
+        assertFalse(driver.getStoppedSelf());
+        assertEquals(5, targDir.listFiles().length);
+        assertContains(new File(targDir, "test1.txt.xml"), "UTF-8", "first test file");
+
+    }
+
+    @Test(timeout = 15000)
+    public void restartOnFullHangTest() throws Exception {
+        //batch runner hits more heavy hangs than threads; needs to restart
+        File targDir = getNewTargDir("daemon-");
+
+        //make sure target directory is empty!
+        assertEquals(0, targDir.listFiles().length);
+
+        String[] args = getDefaultCommandLineArgsArr("heavy_heavy_hangs", targDir, null);
+        BatchProcessDriverCLI driver = getNewDriver("/tika-batch-config-evil-test.xml", args);
+        driver.execute();
+        //could be one or two depending on timing
+        assertTrue(driver.getNumRestarts() > 0);
+        assertFalse(driver.getStoppedSelf());
+        assertContains(new File(targDir, "test1.txt.xml"), "UTF-8",
+                "first test file");
+    }
+
+    @Test(timeout = 15000)
+    public void restartOnOOMTest() throws Exception {
+        //batch runner hits more heavy hangs than threads; needs to restart
+        File targDir = getNewTargDir("daemon-");
+
+        //make sure target directory is empty!
+        assertEquals(0, targDir.listFiles().length);
+
+        String[] args = getDefaultCommandLineArgsArr("oom", targDir, null);
+        BatchProcessDriverCLI driver = getNewDriver("/tika-batch-config-evil-test.xml", args);
+        driver.execute();
+        assertEquals(1, driver.getNumRestarts());
+        assertFalse(driver.getStoppedSelf());
+        assertContains(new File(targDir, "test4.txt.xml"),
+                "UTF-8", "first test file");
+    }
+
+    @Test(timeout = 30000)
+    public void allHeavyHangsTestWithStarvedCrawler() throws Exception {
+        //this tests that if all consumers are hung and the crawler is
+        //waiting to add to the queue, there isn't deadlock.  The BatchProcess should
+        //just shutdown, and the driver should restart
+        File targDir = getNewTargDir("allHeavyHangsStarvedCrawler-");
+        Map<String, String> args = new HashMap<String,String>();
+        args.put("-numConsumers", "2");
+        args.put("-maxQueueSize", "50");
+        args.put("-maxStaleConsumers", "100");
+        String[] commandLine = getDefaultCommandLineArgsArr("heavy_heavy_hangs", targDir, args);
+        BatchProcessDriverCLI driver = getNewDriver("/tika-batch-config-evil-test.xml", commandLine);
+        driver.execute();
+        assertEquals(2, driver.getNumRestarts());
+        assertFalse(driver.getStoppedSelf());
+        assertContains(new File(targDir, "test1.txt.xml"), "UTF-8",
+                "first test file");
+    }
+}
Index: tika-batch/src/test/java/org/apache/tika/parser/evil/EvilParserFactory.java
===================================================================
--- tika-batch/src/test/java/org/apache/tika/parser/evil/EvilParserFactory.java	(revision 0)
+++ tika-batch/src/test/java/org/apache/tika/parser/evil/EvilParserFactory.java	(revision 0)
@@ -0,0 +1,12 @@
+package org.apache.tika.parser.evil;
+
+import org.apache.tika.batch.ParserFactory;
+import org.apache.tika.config.TikaConfig;
+import org.apache.tika.parser.Parser;
+
+public class EvilParserFactory implements ParserFactory {
+    @Override
+    public Parser getParser(TikaConfig config) {
+        return new EvilParser();
+    }
+}
Index: tika-batch/src/test/java/org/apache/tika/parser/evil/EvilParser.java
===================================================================
--- tika-batch/src/test/java/org/apache/tika/parser/evil/EvilParser.java	(revision 0)
+++ tika-batch/src/test/java/org/apache/tika/parser/evil/EvilParser.java	(revision 0)
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tika.parser.evil;
+
+import org.apache.tika.batch.BatchNoRestartException;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.mime.MediaType;
+import org.apache.tika.parser.AbstractParser;
+import org.apache.tika.parser.ParseContext;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class EvilParser extends AbstractParser {
+    
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    
+    private final static String OOM_STRING = "oom exception";
+    private final static String HANG_HEAVY_STRING = "hang heavy";
+    private final static String HANG_LIGHT_STRING = "hang light";
+    private final static String RUN_TIME_STRING = "run time";
+    private final static String ASSERTION_ERROR_STRING = "assertion error";
+    private final static String NULL_POINTER_STRING = "null pointer";
+    private final static String TIKA_EXCEPTION_STRING = "tika exception";
+    private final static String BATCH_NO_RESTART_STRING = "no restart";
+    
+
+    @Override
+    public Set<MediaType> getSupportedTypes(ParseContext context) {
+        Set<MediaType> types = new HashSet<MediaType>();
+        MediaType type = MediaType.application("evil");
+        types.add(type);
+        return types;
+    }
+
+    @Override
+    public void parse(InputStream stream, ContentHandler handler,
+            Metadata metadata, ParseContext context) throws IOException,
+            SAXException, TikaException {
+        String content = basicAsciiString(stream);
+        Matcher sleepMatcher  = Pattern.compile("sleep (\\d+)").matcher(content);
+        if (sleepMatcher.find()) {
+            String durationString = sleepMatcher.group(1);
+            long duration = 1000;
+            try{
+                duration = Long.parseLong(durationString);
+            } catch (NumberFormatException e) {
+                //not going to happen unless something goes wrong w regex
+            }
+            handle(content, handler, duration);
+        } else if(content.contains(OOM_STRING)) {
+            kabOOM();
+        } else if (content.contains(HANG_HEAVY_STRING)) {
+            hangHeavy();
+        } else if (content.contains(HANG_LIGHT_STRING)) {
+            hangLight();
+        } else if (content.contains(RUN_TIME_STRING)){
+            throw new RuntimeException(RUN_TIME_STRING);
+        } else if (content.contains(ASSERTION_ERROR_STRING)) {
+            throw new AssertionError(ASSERTION_ERROR_STRING);
+        } else if (content.contains(NULL_POINTER_STRING)) {
+            throw new NullPointerException(NULL_POINTER_STRING);
+        } else if (content.contains(TIKA_EXCEPTION_STRING)) {
+            throw new TikaException(TIKA_EXCEPTION_STRING);
+        } else if (content.contains(BATCH_NO_RESTART_STRING)) {
+            throw new BatchNoRestartException("Shouldn't restart");
+        }
+        handle(content, handler, 0);
+
+    }
+
+    private void handle(String content, ContentHandler handler, long sleep) throws SAXException {
+        if (sleep > 0) {
+            try {
+                Thread.sleep(sleep);
+            } catch (InterruptedException e) {
+            }
+        }
+        handler.startDocument();
+        Attributes attrs = new AttributesImpl();
+        handler.startElement("", "body", "body", attrs);
+        handler.startElement("", "p", "p", attrs);
+        char[] charArr = content.toCharArray();
+        handler.characters(charArr, 0, charArr.length);
+        handler.endElement("", "p", "p");
+        handler.endElement("", "body", "body");
+        handler.endDocument();
+
+    }
+
+    private void kabOOM() {
+        List<int[]> ints = new ArrayList<int[]>();
+        
+        while (true) {
+            int[] intArr = new int[32000];
+            ints.add(intArr);
+        }
+    }
+    
+    private void hangHeavy() {
+        while (true) {
+            for (int i = 1; i < Integer.MAX_VALUE; i++) {
+                for (int j = 1; j < Integer.MAX_VALUE; j++) {
+                    double div = (double)i/(double)j;
+                }
+            }
+        }
+    }
+    
+    /**
+     * hang forever but don't require heavy cpu load
+     */
+    private void hangLight() {
+        while (true) {
+            try {
+                Thread.sleep(10000000);
+            } catch (InterruptedException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+    }
+    
+    private String basicAsciiString(InputStream is) throws IOException {
+        StringBuilder sb = new StringBuilder();
+        int c = is.read();
+        while (c != -1){
+            sb.append((char)c);
+            c = is.read();
+        }
+        return sb.toString();
+    }
+
+}
Index: tika-batch/src/test/resources/evil/runtime_exception.evil
===================================================================
--- tika-batch/src/test/resources/evil/runtime_exception.evil	(revision 0)
+++ tika-batch/src/test/resources/evil/runtime_exception.evil	(revision 0)
@@ -0,0 +1 @@
+run time exception
\ No newline at end of file
Index: tika-batch/src/test/resources/evil/hang_light_load.evil
===================================================================
--- tika-batch/src/test/resources/evil/hang_light_load.evil	(revision 0)
+++ tika-batch/src/test/resources/evil/hang_light_load.evil	(revision 0)
@@ -0,0 +1 @@
+hang light load
\ No newline at end of file
Index: tika-batch/src/test/resources/evil/tika_exception.evil
===================================================================
--- tika-batch/src/test/resources/evil/tika_exception.evil	(revision 0)
+++ tika-batch/src/test/resources/evil/tika_exception.evil	(revision 0)
@@ -0,0 +1 @@
+tika exception
\ No newline at end of file
Index: tika-batch/src/test/resources/evil/hang_heavy_load.evil
===================================================================
--- tika-batch/src/test/resources/evil/hang_heavy_load.evil	(revision 0)
+++ tika-batch/src/test/resources/evil/hang_heavy_load.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/src/test/resources/evil/oom_exception.evil
===================================================================
--- tika-batch/src/test/resources/evil/oom_exception.evil	(revision 0)
+++ tika-batch/src/test/resources/evil/oom_exception.evil	(revision 0)
@@ -0,0 +1 @@
+oom exception
\ No newline at end of file
Index: tika-batch/src/test/resources/evil/sleep_2000.evil
===================================================================
--- tika-batch/src/test/resources/evil/sleep_2000.evil	(revision 0)
+++ tika-batch/src/test/resources/evil/sleep_2000.evil	(revision 0)
@@ -0,0 +1 @@
+sleep 2000
\ No newline at end of file
Index: tika-batch/src/test/resources/evil/tika-evil-config.xml
===================================================================
--- tika-batch/src/test/resources/evil/tika-evil-config.xml	(revision 0)
+++ tika-batch/src/test/resources/evil/tika-evil-config.xml	(revision 0)
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+<properties>
+
+    <mimeTypeRepository resource="/evil/tika-evil-mimetypes.xml" magic="false"/>
+
+    <parsers>
+    
+        <parser name="parse-evil" class="org.apache.tika.parser.evil.EvilParser">
+        		<mime>application/evil</mime>
+        </parser>
+
+        <parser name="parse-dcxml" class="org.apache.tika.parser.xml.DcXMLParser">
+                <mime>application/xml</mime>
+        </parser>
+
+        <parser name="parse-office" class="org.apache.tika.parser.microsoft.OfficeParser">
+                <mime>application/x-tika-msoffice</mime>
+                <mime>application/msword</mime>
+                <mime>application/vnd.ms-excel</mime>
+                <mime>application/vnd.ms-powerpoint</mime>
+                <mime>application/vnd.visio</mime>
+                <mime>application/vnd.ms-outlook</mime>
+        </parser>
+
+        <parser name="parse-html" class="org.apache.tika.parser.html.HtmlParser">
+                <mime>text/html</mime>
+                <mime>application/xhtml+xml</mime>
+                <mime>application/x-asp</mime>
+        </parser>
+
+        <parser mame="parse-rtf" class="org.apache.tika.parser.rtf.RTFParser">
+                <mime>application/rtf</mime>
+        </parser>
+
+        <parser name="parse-pdf" class="org.apache.tika.parser.pdf.PDFParser">
+                <mime>application/pdf</mime>
+        </parser>
+
+        <parser name="parse-txt" class="org.apache.tika.parser.txt.TXTParser">
+                <mime>text/plain</mime>
+        </parser>
+
+        <parser name="parse-openoffice" class="org.apache.tika.parser.opendocument.OpenOfficeParser">
+                <mime>application/vnd.sun.xml.writer</mime>
+                <mime>application/vnd.oasis.opendocument.text</mime>
+                <mime>application/vnd.oasis.opendocument.graphics</mime>
+                <mime>application/vnd.oasis.opendocument.presentation</mime>
+                <mime>application/vnd.oasis.opendocument.spreadsheet</mime>
+                <mime>application/vnd.oasis.opendocument.chart</mime>
+                <mime>application/vnd.oasis.opendocument.image</mime>
+                <mime>application/vnd.oasis.opendocument.formula</mime>
+                <mime>application/vnd.oasis.opendocument.text-master</mime>
+                <mime>application/vnd.oasis.opendocument.text-web</mime>
+                <mime>application/vnd.oasis.opendocument.text-template</mime>
+                <mime>application/vnd.oasis.opendocument.graphics-template</mime>
+                <mime>application/vnd.oasis.opendocument.presentation-template</mime>
+                <mime>application/vnd.oasis.opendocument.spreadsheet-template</mime>
+                <mime>application/vnd.oasis.opendocument.chart-template</mime>
+                <mime>application/vnd.oasis.opendocument.image-template</mime>
+                <mime>application/vnd.oasis.opendocument.formula-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.text</mime>
+                <mime>application/x-vnd.oasis.opendocument.graphics</mime>
+                <mime>application/x-vnd.oasis.opendocument.presentation</mime>
+                <mime>application/x-vnd.oasis.opendocument.spreadsheet</mime>
+                <mime>application/x-vnd.oasis.opendocument.chart</mime>
+                <mime>application/x-vnd.oasis.opendocument.image</mime>
+                <mime>application/x-vnd.oasis.opendocument.formula</mime>
+                <mime>application/x-vnd.oasis.opendocument.text-master</mime>
+                <mime>application/x-vnd.oasis.opendocument.text-web</mime>
+                <mime>application/x-vnd.oasis.opendocument.text-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.graphics-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.presentation-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.spreadsheet-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.chart-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.image-template</mime>
+                <mime>application/x-vnd.oasis.opendocument.formula-template</mime>
+        </parser>
+
+        <parser name="parse-image" class="org.apache.tika.parser.image.ImageParser">
+                <mime>image/bmp</mime>
+                <mime>image/gif</mime>
+                <mime>image/jpeg</mime>
+                <mime>image/png</mime>
+                <mime>image/tiff</mime>
+                <mime>image/vnd.wap.wbmp</mime>
+                <mime>image/x-icon</mime>
+                <mime>image/x-psd</mime>
+                <mime>image/x-xcf</mime>
+        </parser>
+
+        <parser name="parse-zip" class="org.apache.tika.parser.pkg.PackageParser">
+                <mime>application/zip</mime>
+        </parser>
+
+        <parser name="parse-tar" class="org.apache.tika.parser.pkg.PackageParser">
+                <mime>application/x-tar</mime>
+        </parser>
+
+        <parser name="parse-gzip" class="org.apache.tika.parser.pkg.CompressorParser">
+                <mime>application/x-gzip</mime>
+        </parser>
+
+        <parser name="parse-bzip2" class="org.apache.tika.parser.pkg.CompressorParser">
+                <mime>application/x-bzip</mime>
+        </parser>
+
+        <parser name="parse-class" class="org.apache.tika.parser.asm.ClassParser">
+                <mime>application/x-tika-java-class</mime>
+        </parser>
+
+        <parser name="parse-mp3" class="org.apache.tika.parser.mp3.Mp3Parser">
+                <mime>audio/mpeg</mime>
+        </parser>
+
+        <parser name="parse-midi" class="org.apache.tika.parser.audio.MidiParser">
+                <mime>application/x-midi</mime>
+                <mime>audio/midi</mime>
+        </parser>
+
+        <parser name="parse-audio" class="org.apache.tika.parser.audio.AudioParser">
+                <mime>audio/basic</mime>
+                <mime>audio/x-wav</mime>
+                <mime>audio/x-aiff</mime>
+        </parser>
+
+    </parsers>
+
+</properties>
Index: tika-batch/src/test/resources/evil/no_problem.txt
===================================================================
--- tika-batch/src/test/resources/evil/no_problem.txt	(revision 0)
+++ tika-batch/src/test/resources/evil/no_problem.txt	(revision 0)
@@ -0,0 +1 @@
+the quick brown fox jumped over the lazy dog.
\ No newline at end of file
Index: tika-batch/src/test/resources/evil/assertion_error.evil
===================================================================
--- tika-batch/src/test/resources/evil/assertion_error.evil	(revision 0)
+++ tika-batch/src/test/resources/evil/assertion_error.evil	(revision 0)
@@ -0,0 +1 @@
+assertion error
\ No newline at end of file
Index: tika-batch/src/test/resources/evil/tika-evil-mimetypes.xml
===================================================================
--- tika-batch/src/test/resources/evil/tika-evil-mimetypes.xml	(revision 0)
+++ tika-batch/src/test/resources/evil/tika-evil-mimetypes.xml	(revision 0)
@@ -0,0 +1,5887 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!--
+  Description: This xml file defines the valid mime types used by Tika.
+  The mime type data within this file is based on information from various
+  sources like Apache Nutch, Apache HTTP Server, the file(1) command, etc.
+
+  Notes:
+   * Tika supports a wider range of match types than Freedesktop does
+   * Glob patterns must be unique, if there's a clash assign to the most
+     popular format
+   * The main mime type should be the canonical one, use aliases for any
+     other widely used forms
+   * Where there's a hierarchy in the types, list it via a parent
+   * Highly specific magic matches get a high priority
+   * General magic matches which could trigger a false-positive need
+     a low one
+   * The priority for containers normally need to be higher than for
+     the things they contain, so they don't accidently get detected
+     as what's in them
+   * For logic too complex to be expressed in a magic match, do the best
+     you can here, then provide a Custom Detector for the rest
+-->
+<mime-info>
+  <mime-type type="application/evil">
+    <glob pattern="*.evil"/>
+  </mime-type>
+  <mime-type type="application/activemessage"/>
+  <mime-type type="application/andrew-inset">
+    <glob pattern="*.ez"/>
+  </mime-type>
+  <mime-type type="application/applefile"/>
+  <mime-type type="application/applixware">
+    <glob pattern="*.aw"/>
+  </mime-type>
+
+  <mime-type type="application/atom+xml">
+    <root-XML localName="feed" namespaceURI="http://purl.org/atom/ns#"/>
+    <root-XML localName="feed" namespaceURI="http://www.w3.org/2005/Atom"/>
+    <glob pattern="*.atom"/>
+  </mime-type>
+
+  <mime-type type="application/atomcat+xml">
+    <glob pattern="*.atomcat"/>
+  </mime-type>
+  <mime-type type="application/atomicmail"/>
+  <mime-type type="application/atomsvc+xml">
+    <glob pattern="*.atomsvc"/>
+  </mime-type>
+  <mime-type type="application/auth-policy+xml"/>
+  <mime-type type="application/batch-smtp"/>
+  <mime-type type="application/beep+xml"/>
+
+  <mime-type type="application/bizagi-modeler">
+    <_comment>BizAgi Process Modeler</_comment>
+    <sub-class-of type="application/zip"/>
+    <glob pattern="*.bpm"/>
+  </mime-type>
+
+  <mime-type type="application/cals-1840"/>
+  <mime-type type="application/ccxml+xml">
+    <glob pattern="*.ccxml"/>
+  </mime-type>
+  <mime-type type="application/cea-2018+xml"/>
+  <mime-type type="application/cellml+xml"/>
+  <mime-type type="application/cnrp+xml"/>
+  <mime-type type="application/commonground"/>
+  <mime-type type="application/conference-info+xml"/>
+  <mime-type type="application/cpl+xml"/>
+  <mime-type type="application/csta+xml"/>
+  <mime-type type="application/cstadata+xml"/>
+  <mime-type type="application/cu-seeme">
+    <glob pattern="*.cu"/>
+  </mime-type>
+  <mime-type type="application/cybercash"/>
+  <mime-type type="application/davmount+xml">
+    <glob pattern="*.davmount"/>
+  </mime-type>
+  <mime-type type="application/dca-rft"/>
+  <mime-type type="application/dec-dx"/>
+  <mime-type type="application/dialog-info+xml"/>
+  <mime-type type="application/dicom"/>
+
+  <mime-type type="application/dita+xml">
+    <sub-class-of type="application/xml"/>
+    <_comment>Darwin Information Typing Architecture</_comment>
+  </mime-type>
+
+  <mime-type type="application/dita+xml;format=map">
+    <sub-class-of type="application/dita+xml"/>
+    <_comment>DITA Map</_comment>
+    <root-XML localName="map"/>
+    <root-XML localName="map" namespaceURI="http://docs.oasis-open.org/namespace"/>
+    <glob pattern="*.ditamap"/>
+  </mime-type>
+  <mime-type type="application/dita+xml;format=topic">
+    <sub-class-of type="application/dita+xml"/>
+    <_comment>DITA Topic</_comment>
+    <root-XML localName="topic"/>
+    <root-XML localName="topic" namespaceURI="http://docs.oasis-open.org/namespace"/>
+    <!-- Topic is the default, Task and Concept are specialisations -->
+    <glob pattern="*.dita"/>
+  </mime-type>
+  <mime-type type="application/dita+xml;format=task">
+    <sub-class-of type="application/dita+xml;format=task"/>
+    <_comment>DITA Task Topic</_comment>
+    <root-XML localName="task"/>
+    <root-XML localName="task" namespaceURI="http://docs.oasis-open.org/namespace"/>
+  </mime-type>
+  <mime-type type="application/dita+xml;format=concept">
+    <sub-class-of type="application/dita+xml;format=topic"/>
+    <_comment>DITA Concept Topic</_comment>
+    <root-XML localName="concept"/>
+    <root-XML localName="concept" namespaceURI="http://docs.oasis-open.org/namespace"/>
+  </mime-type>
+  <mime-type type="application/dita+xml;format=val">
+    <sub-class-of type="application/dita+xml"/>
+    <_comment>DITA Conditional Processing Profile</_comment>
+    <root-XML localName="val"/>
+    <root-XML localName="val" namespaceURI="http://docs.oasis-open.org/namespace"/>
+    <glob pattern="*.ditaval"/>
+  </mime-type>
+
+  <mime-type type="application/dns"/>
+  <mime-type type="application/dvcs"/>
+  <mime-type type="application/ecmascript">
+    <glob pattern="*.ecma"/>
+  </mime-type>
+  <mime-type type="application/edi-consent"/>
+  <mime-type type="application/edi-x12"/>
+  <mime-type type="application/edifact"/>
+  <mime-type type="application/emma+xml">
+    <glob pattern="*.emma"/>
+  </mime-type>
+  <mime-type type="application/epp+xml"/>
+
+  <mime-type type="application/epub+zip">
+    <acronym>EPUB</acronym>
+    <_comment>Electronic Publication</_comment>
+    <magic priority="50">
+      <match value="PK\003\004" type="string" offset="0">
+        <match value="mimetypeapplication/epub+zip" type="string" offset="30"/>
+      </match>
+    </magic>
+    <glob pattern="*.epub"/>
+  </mime-type>
+
+  <mime-type type="application/eshop"/>
+  <mime-type type="application/example"/>
+  <mime-type type="application/fastinfoset"/>
+  <mime-type type="application/fastsoap"/>
+
+  <mime-type type="application/fits">
+    <acronym>FITS</acronym>
+    <_comment>Flexible Image Transport System</_comment>
+    <tika:link>http://www.digitalpreservation.gov/formats/fdd/fdd000317.shtml</tika:link>
+    <magic priority="50">
+      <match value="SIMPLE  =                    T" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.fits"/>
+    <glob pattern="*.fit"/>
+    <glob pattern="*.fts"/>
+  </mime-type>
+
+  <mime-type type="application/font-tdpfr">
+    <glob pattern="*.pfr"/>
+  </mime-type>
+  <mime-type type="application/h224"/>
+  <mime-type type="application/http"/>
+  <mime-type type="application/hyperstudio">
+    <glob pattern="*.stk"/>
+  </mime-type>
+  <mime-type type="application/ibe-key-request+xml"/>
+  <mime-type type="application/ibe-pkg-reply+xml"/>
+  <mime-type type="application/ibe-pp-data"/>
+  <mime-type type="application/iges"/>
+
+  <mime-type type="application/illustrator">
+    <acronym>AI</acronym>
+    <_comment>Adobe Illustrator Artwork</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/Adobe_Illustrator_Artwork</tika:link>
+    <glob pattern="*.ai"/>]
+    <sub-class-of type="application/postscript"/>
+  </mime-type>
+
+  <mime-type type="application/im-iscomposing+xml"/>
+  <mime-type type="application/index"/>
+  <mime-type type="application/index.cmd"/>
+  <mime-type type="application/index.obj"/>
+  <mime-type type="application/index.response"/>
+  <mime-type type="application/index.vnd"/>
+  <mime-type type="application/iotp"/>
+  <mime-type type="application/ipp"/>
+  <mime-type type="application/isup"/>
+
+  <mime-type type="application/java-archive">
+    <_comment>Java Archive</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/.jar</tika:link>
+    <tika:uti>com.sun.java-archive</tika:uti>
+    <sub-class-of type="application/zip"/>
+    <glob pattern="*.jar"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.android.package-archive">
+    <sub-class-of type="application/java-archive"/>
+    <glob pattern="*.apk"/>
+  </mime-type>
+  <mime-type type="application/x-tika-java-enterprise-archive">
+    <sub-class-of type="application/java-archive"/>
+    <glob pattern="*.ear"/>
+  </mime-type>
+  <mime-type type="application/x-tika-java-web-archive">
+    <sub-class-of type="application/java-archive"/>
+    <glob pattern="*.war"/>
+  </mime-type>
+
+  <mime-type type="application/x-tika-unix-dump"/>
+
+  <mime-type type="application/java-serialized-object">
+    <glob pattern="*.ser"/>
+  </mime-type>
+
+  <mime-type type="application/javascript">
+    <alias type="application/x-javascript"/>
+    <alias type="text/javascript"/>
+    <sub-class-of type="text/plain"/>
+    <_comment>JavaScript Source Code</_comment>
+    <glob pattern="*.js"/>
+  </mime-type>
+
+  <mime-type type="application/json">
+    <sub-class-of type="application/javascript"/>
+    <glob pattern="*.json"/>
+  </mime-type>
+
+  <mime-type type="application/java-vm">
+    <_comment>Java Class File</_comment>
+    <alias type="application/x-java-vm"/>
+    <alias type="application/x-java"/>
+    <magic priority="40">
+      <match value="0xcafebabe" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.class"/>
+  </mime-type>
+
+  <mime-type type="application/x-java-jnilib">
+    <_comment>Java Native Library for OSX</_comment>
+    <magic priority="50">
+      <match value="0xcafebabe" type="string" offset="0">
+        <match value="0xfeedface" type="string" offset="4096"/>
+        <match value="0xfeedfacf" type="string" offset="4096"/>
+        <match value="0xcefaedfe" type="string" offset="4096"/>
+        <match value="0xcffaedfe" type="string" offset="4096"/>
+      </match>
+    </magic>
+    <glob pattern="*.jnilib"/>
+  </mime-type>
+
+  <mime-type type="application/kpml-request+xml"/>
+  <mime-type type="application/kpml-response+xml"/>
+  <mime-type type="application/lost+xml">
+    <glob pattern="*.lostxml"/>
+  </mime-type>
+
+  <mime-type type="application/mac-binhex40">
+    <alias type="application/mac-binhex"/>
+    <alias type="application/binhex"/>
+    <magic priority="50">
+      <match value="must\ be\ converted\ with\ BinHex" type="string" offset="11"/>
+    </magic>
+    <glob pattern="*.hqx"/>
+  </mime-type>
+
+  <mime-type type="application/mac-compactpro">
+    <glob pattern="*.cpt"/>
+  </mime-type>
+
+  <mime-type type="application/macwriteii"/>
+  <mime-type type="application/marc">
+    <glob pattern="*.mrc"/>
+  </mime-type>
+  <mime-type type="application/mathematica">
+    <glob pattern="*.ma"/>
+    <glob pattern="*.nb"/>
+    <glob pattern="*.mb"/>
+  </mime-type>
+  <mime-type type="application/mathml+xml">
+    <glob pattern="*.mathml"/>
+  </mime-type>
+  <mime-type type="application/mbms-associated-procedure-description+xml"/>
+  <mime-type type="application/mbms-deregister+xml"/>
+  <mime-type type="application/mbms-envelope+xml"/>
+  <mime-type type="application/mbms-msk+xml"/>
+  <mime-type type="application/mbms-msk-response+xml"/>
+  <mime-type type="application/mbms-protection-description+xml"/>
+  <mime-type type="application/mbms-reception-report+xml"/>
+  <mime-type type="application/mbms-register+xml"/>
+  <mime-type type="application/mbms-register-response+xml"/>
+  <mime-type type="application/mbms-user-service-description+xml"/>
+  <mime-type type="application/mbox">
+    <sub-class-of type="text/plain"/>
+    <glob pattern="*.mbox"/>
+  </mime-type>
+  <mime-type type="application/media_control+xml"/>
+  <mime-type type="application/mediaservercontrol+xml">
+    <glob pattern="*.mscml"/>
+  </mime-type>
+  <mime-type type="application/mikey"/>
+  <mime-type type="application/moss-keys"/>
+  <mime-type type="application/moss-signature"/>
+  <mime-type type="application/mosskey-data"/>
+  <mime-type type="application/mosskey-request"/>
+  <mime-type type="application/mp4">
+    <glob pattern="*.mp4s"/>
+  </mime-type>
+  <mime-type type="application/mpeg4-generic"/>
+  <mime-type type="application/mpeg4-iod"/>
+  <mime-type type="application/mpeg4-iod-xmt"/>
+
+  <!-- http://www.iana.org/assignments/media-types/application/msword -->
+  <mime-type type="application/msword">
+    <!-- Use DefaultDetector / org.apache.tika.parser.microsoft.POIFSContainerDetector for more reliable detection of OLE2 documents -->
+    <alias type="application/vnd.ms-word"/>
+    <_comment>Microsoft Word Document</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/.doc</tika:link>
+    <tika:uti>com.microsoft.word.doc</tika:uti>
+    <magic priority="50">
+      <match value="Microsoft\ Word\ 6.0\ Document" type="string" offset="2080"/>
+      <match value="Documento\ Microsoft\ Word\ 6" type="string" offset="2080"/>
+      <match value="MSWordDoc" type="string" offset="2112"/>
+      <match value="0x31be0000" type="big32" offset="0"/>
+      <match value="PO^Q`" type="string" offset="0"/>
+      <match value="\376\067\0\043" type="string" offset="0"/>
+      <match value="\333\245-\0\0\0" type="string" offset="0"/>
+      <match value="\224\246\056" type="string" offset="0"/>
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="W\x00o\x00r\x00d\x00D\x00o\x00c\x00u\x00m\x00e\x00n\x00t" type="string" offset="1152:4096" />
+      </match>
+    </magic>
+    <glob pattern="*.doc"/>
+    <glob pattern="*.dot"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/msword2">
+    <!-- Pre-OLE2, not a subtype of application/x-tika-msoffice -->
+    <_comment>Microsoft Word 2 Document</_comment>
+    <magic priority="50">
+      <match value="0x9ba5" type="string" />
+      <match value="0xdba5" type="string" />
+    </magic>
+  </mime-type>
+  <mime-type type="application/msword5">
+    <!-- Pre-OLE2, not a subtype of application/x-tika-msoffice -->
+    <_comment>Microsoft Word 5 Document</_comment>
+    <magic priority="50">
+      <match value="0xfe37" type="string" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/mxf">
+    <glob pattern="*.mxf"/>
+  </mime-type>
+  <mime-type type="application/nasdata"/>
+  <mime-type type="application/news-checkgroups"/>
+  <mime-type type="application/news-groupinfo"/>
+  <mime-type type="application/news-transmission"/>
+  <mime-type type="application/nss"/>
+  <mime-type type="application/ocsp-request"/>
+  <mime-type type="application/ocsp-response"/>
+
+  <mime-type type="application/octet-stream">
+    <magic priority="50">
+      <match value="#\ This\ is\ a\ shell\ archive" type="string" offset="10"/>
+      <match value="\037\036" type="string" offset="0"/>
+      <match value="017437" type="host16" offset="0"/>
+      <match value="0x1fff" type="host16" offset="0"/>
+      <match value="\377\037" type="string" offset="0"/>
+      <match value="0145405" type="host16" offset="0"/>
+    </magic>
+    <glob pattern="*.bin"/>
+    <glob pattern="*.dms"/>
+    <glob pattern="*.lha"/>
+    <glob pattern="*.lrf"/>
+    <glob pattern="*.lzh"/>
+    <glob pattern="*.so"/>
+    <glob pattern="*.dist"/>
+    <glob pattern="*.distz"/>
+    <glob pattern="*.pkg"/>
+    <glob pattern="*.bpk"/>
+    <glob pattern="*.dump"/>
+    <glob pattern="*.elc"/>
+    <glob pattern="*.deploy"/>
+  </mime-type>
+
+  <mime-type type="application/oda">
+    <glob pattern="*.oda"/>
+  </mime-type>
+  <mime-type type="application/oebps-package+xml">
+    <glob pattern="*.opf"/>
+  </mime-type>
+
+  <mime-type type="application/ogg">
+    <alias type="application/x-ogg"/>
+    <magic priority="50">
+      <match value="OggS" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.ogx"/>
+  </mime-type>
+  <mime-type type="application/kate">
+    <sub-class-of type="application/ogg"/>
+  </mime-type>
+
+  <mime-type type="application/onenote">
+    <glob pattern="*.onetoc"/>
+    <glob pattern="*.onetoc2"/>
+    <glob pattern="*.onetmp"/>
+    <glob pattern="*.onepkg"/>
+  </mime-type>
+  <mime-type type="application/parityfec"/>
+  <mime-type type="application/patch-ops-error+xml">
+    <glob pattern="*.xer"/>
+  </mime-type>
+
+  <mime-type type="application/pdf">
+    <alias type="application/x-pdf"/>
+    <acronym>PDF</acronym>
+    <_comment>Portable Document Format</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/PDF</tika:link>
+    <tika:link>http://www.adobe.com/devnet/pdf/pdf_reference_archive.html</tika:link>
+    <tika:uti>com.adobe.pdf</tika:uti>
+    <magic priority="50">
+      <match value="%PDF-" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.pdf"/>
+  </mime-type>
+
+  <mime-type type="application/pgp-encrypted">
+    <alias type="application/pgp"/>
+    <glob pattern="*.pgp"/>
+  </mime-type>
+
+  <mime-type type="application/pgp-keys"/>
+
+  <mime-type type="application/pgp-signature">
+    <glob pattern="*.asc"/>
+    <glob pattern="*.sig"/>
+  </mime-type>
+
+  <mime-type type="application/pics-rules">
+    <glob pattern="*.prf"/>
+  </mime-type>
+  <mime-type type="application/pidf+xml"/>
+  <mime-type type="application/pidf-diff+xml"/>
+  <mime-type type="application/pkcs10">
+    <glob pattern="*.p10"/>
+  </mime-type>
+
+  <mime-type type="application/pkcs7-mime">
+    <glob pattern="*.p7m"/>
+    <glob pattern="*.p7c"/>
+  </mime-type>
+
+  <mime-type type="application/pkcs7-signature">
+    <glob pattern="*.p7s"/>
+    <magic priority="50">
+      <match value="-----BEGIN PKCS7" type="string" offset="0"/>
+      <match value="0x3082FFFF06092a864886f70d0107FFa0" type="string"
+              mask="0xFFFF0000FFFFFFFFFFFFFFFFFFFF00FF" offset="0"/>
+      <match value="0x308006092a864886f70d0107FFa0" type="string"
+              mask="0xFFFFFFFFFFFFFFFFFFFFFFFF00FF" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/pkix-cert">
+    <glob pattern="*.cer"/>
+  </mime-type>
+  <mime-type type="application/pkix-crl">
+    <glob pattern="*.crl"/>
+  </mime-type>
+  <mime-type type="application/pkix-pkipath">
+    <glob pattern="*.pkipath"/>
+  </mime-type>
+  <mime-type type="application/pkixcmp">
+    <glob pattern="*.pki"/>
+  </mime-type>
+  <mime-type type="application/pls+xml">
+    <glob pattern="*.pls"/>
+  </mime-type>
+  <mime-type type="application/poc-settings+xml"/>
+
+  <mime-type type="application/postscript">
+    <_comment>PostScript</_comment>
+    <magic priority="50">
+      <match value="%!" type="string" offset="0" />
+      <match value="\004%!" type="string" offset="0" />
+      <!-- Windows format EPS -->
+      <match value="0xc5d0d3c6" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.ps"/>
+    <glob pattern="*.eps"/>
+    <glob pattern="*.epsf"/>
+    <glob pattern="*.epsi"/>
+  </mime-type>
+
+  <mime-type type="application/prs.alvestrand.titrax-sheet"/>
+  <mime-type type="application/prs.cww">
+    <glob pattern="*.cww"/>
+  </mime-type>
+  <mime-type type="application/prs.nprend"/>
+  <mime-type type="application/prs.plucker"/>
+  <mime-type type="application/qsig"/>
+
+  <mime-type type="application/rdf+xml">
+    <root-XML localName="RDF"/>
+    <root-XML localName="RDF" namespaceURI="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>
+    <sub-class-of type="application/xml"/>
+    <acronym>RDF/XML</acronym>
+    <_comment>XML syntax for RDF graphs</_comment>
+    <glob pattern="*.rdf"/>
+    <glob pattern="*.owl"/>
+    <glob pattern="^rdf$" isregex="true"/>
+    <glob pattern="^owl$" isregex="true"/>
+    <glob pattern="*.xmp"/>
+  </mime-type>
+
+  <mime-type type="application/reginfo+xml">
+    <glob pattern="*.rif"/>
+  </mime-type>
+  <mime-type type="application/relax-ng-compact-syntax">
+    <sub-class-of type="text/plain"/>
+    <glob pattern="*.rnc"/>
+  </mime-type>
+  <mime-type type="application/remote-printing"/>
+  <mime-type type="application/resource-lists+xml">
+    <glob pattern="*.rl"/>
+  </mime-type>
+  <mime-type type="application/resource-lists-diff+xml">
+    <glob pattern="*.rld"/>
+  </mime-type>
+  <mime-type type="application/riscos"/>
+  <mime-type type="application/rlmi+xml"/>
+  <mime-type type="application/rls-services+xml">
+    <glob pattern="*.rs"/>
+  </mime-type>
+  <mime-type type="application/rsd+xml">
+    <glob pattern="*.rsd"/>
+  </mime-type>
+
+  <mime-type type="application/rss+xml">
+    <alias type="text/rss"/>
+    <root-XML localName="rss"/>
+    <root-XML namespaceURI="http://purl.org/rss/1.0/"/>
+    <glob pattern="*.rss"/>
+  </mime-type>
+
+  <mime-type type="application/rtf">
+    <_comment>Rich Text Format File</_comment>
+    <alias type="text/rtf"/>
+    <magic priority="50">
+      <match value="{\\rtf" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.rtf"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="application/rtx"/>
+  <mime-type type="application/samlassertion+xml"/>
+  <mime-type type="application/samlmetadata+xml"/>
+  <mime-type type="application/sbml+xml">
+    <glob pattern="*.sbml"/>
+  </mime-type>
+  <mime-type type="application/scvp-cv-request">
+    <glob pattern="*.scq"/>
+  </mime-type>
+  <mime-type type="application/scvp-cv-response">
+    <glob pattern="*.scs"/>
+  </mime-type>
+  <mime-type type="application/scvp-vp-request">
+    <glob pattern="*.spq"/>
+  </mime-type>
+  <mime-type type="application/scvp-vp-response">
+    <glob pattern="*.spp"/>
+  </mime-type>
+  <mime-type type="application/sdp">
+    <glob pattern="*.sdp"/>
+  </mime-type>
+  <mime-type type="application/set-payment"/>
+  <mime-type type="application/set-payment-initiation">
+    <glob pattern="*.setpay"/>
+  </mime-type>
+  <mime-type type="application/set-registration"/>
+  <mime-type type="application/set-registration-initiation">
+    <glob pattern="*.setreg"/>
+  </mime-type>
+  <mime-type type="application/sgml"/>
+  <mime-type type="application/sgml-open-catalog"/>
+  <mime-type type="application/shf+xml">
+    <glob pattern="*.shf"/>
+  </mime-type>
+  <mime-type type="application/sieve"/>
+  <mime-type type="application/simple-filter+xml"/>
+  <mime-type type="application/simple-message-summary"/>
+  <mime-type type="application/simplesymbolcontainer"/>
+  <mime-type type="application/slate"/>
+
+  <mime-type type="application/smil+xml">
+    <alias type="application/smil"/>
+    <_comment>SMIL Multimedia</_comment>
+    <glob pattern="*.smi"/>
+    <glob pattern="*.smil"/>
+    <glob pattern="*.sml"/>
+  </mime-type>
+
+  <mime-type type="application/soap+fastinfoset"/>
+  <mime-type type="application/soap+xml"/>
+
+  <mime-type type="application/sldworks">
+    <_comment>SolidWorks CAD program</_comment>
+    <glob pattern="*.sldprt" />
+    <glob pattern="*.sldasm" />
+    <glob pattern="*.slddrw" />
+    <sub-class-of type="application/x-tika-msoffice" />
+  </mime-type>
+
+  <mime-type type="application/sparql-query">
+    <glob pattern="*.rq"/>
+  </mime-type>
+  <mime-type type="application/sparql-results+xml">
+    <glob pattern="*.srx"/>
+  </mime-type>
+  <mime-type type="application/spirits-event+xml"/>
+  <mime-type type="application/srgs">
+    <glob pattern="*.gram"/>
+  </mime-type>
+  <mime-type type="application/srgs+xml">
+    <glob pattern="*.grxml"/>
+  </mime-type>
+  <mime-type type="application/ssml+xml">
+    <glob pattern="*.ssml"/>
+  </mime-type>
+  <mime-type type="application/timestamp-query"/>
+  <mime-type type="application/timestamp-reply"/>
+  <mime-type type="application/tve-trigger"/>
+  <mime-type type="application/ulpfec"/>
+  <mime-type type="application/vemmi"/>
+  <mime-type type="application/vividence.scriptfile"/>
+  <mime-type type="application/vnd.3gpp.bsf+xml"/>
+  <mime-type type="application/vnd.3gpp.pic-bw-large">
+    <glob pattern="*.plb"/>
+  </mime-type>
+  <mime-type type="application/vnd.3gpp.pic-bw-small">
+    <glob pattern="*.psb"/>
+  </mime-type>
+  <mime-type type="application/vnd.3gpp.pic-bw-var">
+    <glob pattern="*.pvb"/>
+  </mime-type>
+  <mime-type type="application/vnd.3gpp.sms"/>
+  <mime-type type="application/vnd.3gpp2.bcmcsinfo+xml"/>
+  <mime-type type="application/vnd.3gpp2.sms"/>
+  <mime-type type="application/vnd.3gpp2.tcap">
+    <glob pattern="*.tcap"/>
+  </mime-type>
+  <mime-type type="application/vnd.3m.post-it-notes">
+    <glob pattern="*.pwn"/>
+  </mime-type>
+  <mime-type type="application/vnd.accpac.simply.aso">
+    <glob pattern="*.aso"/>
+  </mime-type>
+  <mime-type type="application/vnd.accpac.simply.imp">
+    <glob pattern="*.imp"/>
+  </mime-type>
+  <mime-type type="application/vnd.acucobol">
+    <glob pattern="*.acu"/>
+  </mime-type>
+  <mime-type type="application/vnd.acucorp">
+    <glob pattern="*.atc"/>
+    <glob pattern="*.acutc"/>
+  </mime-type>
+  <mime-type type="application/vnd.adobe.air-application-installer-package+zip">
+    <glob pattern="*.air"/>
+  </mime-type>
+  <mime-type type="application/vnd.adobe.aftereffects.project">
+    <glob pattern="*.aep"/>
+  </mime-type>
+  <mime-type type="application/vnd.adobe.aftereffects.template">
+    <glob pattern="*.aet"/>
+  </mime-type>
+  <mime-type type="application/vnd.adobe.xdp+xml">
+    <glob pattern="*.xdp"/>
+  </mime-type>
+  <mime-type type="application/vnd.adobe.xfdf">
+    <glob pattern="*.xfdf"/>
+  </mime-type>
+  <mime-type type="application/vnd.aether.imp"/>
+  <mime-type type="application/vnd.airzip.filesecure.azf">
+    <glob pattern="*.azf"/>
+  </mime-type>
+  <mime-type type="application/vnd.airzip.filesecure.azs">
+    <glob pattern="*.azs"/>
+  </mime-type>
+  <mime-type type="application/vnd.amazon.ebook">
+    <glob pattern="*.azw"/>
+  </mime-type>
+  <mime-type type="application/vnd.americandynamics.acc">
+    <glob pattern="*.acc"/>
+  </mime-type>
+  <mime-type type="application/vnd.amiga.ami">
+    <glob pattern="*.ami"/>
+  </mime-type>
+  <mime-type type="application/vnd.anser-web-certificate-issue-initiation">
+    <glob pattern="*.cii"/>
+  </mime-type>
+  <mime-type type="application/vnd.anser-web-funds-transfer-initiation">
+    <glob pattern="*.fti"/>
+  </mime-type>
+  <mime-type type="application/vnd.antix.game-component">
+    <glob pattern="*.atx"/>
+  </mime-type>
+  <mime-type type="application/vnd.apple.installer+xml">
+    <glob pattern="*.mpkg"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.apple.iwork">
+    <sub-class-of type="application/zip"/>
+  </mime-type>
+  <mime-type type="application/vnd.apple.keynote">
+    <root-XML localName="presentation" namespaceURI="http://developer.apple.com/namespaces/keynote2" />
+    <sub-class-of type="application/vnd.apple.iwork" />
+    <glob pattern="*.key"/>
+  </mime-type>
+  <mime-type type="application/vnd.apple.pages">
+    <root-XML localName="document" namespaceURI="http://developer.apple.com/namespaces/sl" />
+    <sub-class-of type="application/vnd.apple.iwork" />
+    <glob pattern="*.pages"/>
+  </mime-type>
+  <mime-type type="application/vnd.apple.numbers">
+    <root-XML localName="document" namespaceURI="http://developer.apple.com/namespaces/ls" />
+    <sub-class-of type="application/vnd.apple.iwork" />
+    <glob pattern="*.numbers"/>
+  </mime-type>
+  <mime-type type="application/x-tika-iworks-protected">
+    <sub-class-of type="application/vnd.apple.iwork" />
+    <_comment>Password Protected iWorks File</_comment>
+  </mime-type>
+
+  <mime-type type="application/vnd.arastra.swi">
+    <glob pattern="*.swi"/>
+  </mime-type>
+  <mime-type type="application/vnd.audiograph"/>
+  <mime-type type="application/vnd.autopackage"/>
+  <mime-type type="application/vnd.avistar+xml"/>
+  <mime-type type="application/vnd.blueice.multipass">
+    <glob pattern="*.mpm"/>
+  </mime-type>
+  <mime-type type="application/vnd.bluetooth.ep.oob"/>
+  <mime-type type="application/vnd.bmi">
+    <glob pattern="*.bmi"/>
+  </mime-type>
+  <mime-type type="application/vnd.businessobjects">
+    <glob pattern="*.rep"/>
+  </mime-type>
+  <mime-type type="application/vnd.cab-jscript"/>
+  <mime-type type="application/vnd.canon-cpdl"/>
+  <mime-type type="application/vnd.canon-lips"/>
+  <mime-type type="application/vnd.cendio.thinlinc.clientconf"/>
+  <mime-type type="application/vnd.chemdraw+xml">
+    <glob pattern="*.cdxml"/>
+  </mime-type>
+  <mime-type type="application/vnd.chipnuts.karaoke-mmd">
+    <glob pattern="*.mmd"/>
+  </mime-type>
+  <mime-type type="application/vnd.cinderella">
+    <glob pattern="*.cdy"/>
+  </mime-type>
+  <mime-type type="application/vnd.cirpack.isdn-ext"/>
+  <mime-type type="application/vnd.claymore">
+    <glob pattern="*.cla"/>
+  </mime-type>
+  <mime-type type="application/vnd.clonk.c4group">
+    <glob pattern="*.c4g"/>
+    <glob pattern="*.c4d"/>
+    <glob pattern="*.c4f"/>
+    <glob pattern="*.c4p"/>
+    <glob pattern="*.c4u"/>
+  </mime-type>
+  <mime-type type="application/vnd.commerce-battelle"/>
+  <mime-type type="application/vnd.commonspace">
+    <glob pattern="*.csp"/>
+  </mime-type>
+  <mime-type type="application/vnd.contact.cmsg">
+    <glob pattern="*.cdbcmsg"/>
+  </mime-type>
+  <mime-type type="application/vnd.cosmocaller">
+    <glob pattern="*.cmc"/>
+  </mime-type>
+  <mime-type type="application/vnd.crick.clicker">
+    <glob pattern="*.clkx"/>
+  </mime-type>
+  <mime-type type="application/vnd.crick.clicker.keyboard">
+    <glob pattern="*.clkk"/>
+  </mime-type>
+  <mime-type type="application/vnd.crick.clicker.palette">
+    <glob pattern="*.clkp"/>
+  </mime-type>
+  <mime-type type="application/vnd.crick.clicker.template">
+    <glob pattern="*.clkt"/>
+  </mime-type>
+  <mime-type type="application/vnd.crick.clicker.wordbank">
+    <glob pattern="*.clkw"/>
+  </mime-type>
+  <mime-type type="application/vnd.criticaltools.wbs+xml">
+    <glob pattern="*.wbs"/>
+  </mime-type>
+  <mime-type type="application/vnd.ctc-posml">
+    <glob pattern="*.pml"/>
+  </mime-type>
+  <mime-type type="application/vnd.ctct.ws+xml"/>
+  <mime-type type="application/vnd.cups-pdf"/>
+  <mime-type type="application/vnd.cups-postscript"/>
+  <mime-type type="application/vnd.cups-ppd">
+    <glob pattern="*.ppd"/>
+  </mime-type>
+  <mime-type type="application/vnd.cups-raster"/>
+  <mime-type type="application/vnd.cups-raw"/>
+  <mime-type type="application/vnd.curl.car">
+    <glob pattern="*.car"/>
+  </mime-type>
+  <mime-type type="application/vnd.curl.pcurl">
+    <glob pattern="*.pcurl"/>
+  </mime-type>
+  <mime-type type="application/vnd.cybank"/>
+  <mime-type type="application/vnd.data-vision.rdz">
+    <glob pattern="*.rdz"/>
+  </mime-type>
+  <mime-type type="application/vnd.denovo.fcselayout-link">
+    <glob pattern="*.fe_launch"/>
+  </mime-type>
+  <mime-type type="application/vnd.dir-bi.plate-dl-nosuffix"/>
+  <mime-type type="application/vnd.dna">
+    <glob pattern="*.dna"/>
+  </mime-type>
+  <mime-type type="application/vnd.dolby.mlp">
+    <glob pattern="*.mlp"/>
+  </mime-type>
+  <mime-type type="application/vnd.dolby.mobile.1"/>
+  <mime-type type="application/vnd.dolby.mobile.2"/>
+  <mime-type type="application/vnd.dpgraph">
+    <glob pattern="*.dpg"/>
+  </mime-type>
+  <mime-type type="application/vnd.dreamfactory">
+    <glob pattern="*.dfac"/>
+  </mime-type>
+  <mime-type type="application/vnd.dvb.esgcontainer"/>
+  <mime-type type="application/vnd.dvb.ipdcdftnotifaccess"/>
+  <mime-type type="application/vnd.dvb.ipdcesgaccess"/>
+  <mime-type type="application/vnd.dvb.ipdcroaming"/>
+  <mime-type type="application/vnd.dvb.iptv.alfec-base"/>
+  <mime-type type="application/vnd.dvb.iptv.alfec-enhancement"/>
+  <mime-type type="application/vnd.dvb.notif-aggregate-root+xml"/>
+  <mime-type type="application/vnd.dvb.notif-container+xml"/>
+  <mime-type type="application/vnd.dvb.notif-generic+xml"/>
+  <mime-type type="application/vnd.dvb.notif-ia-msglist+xml"/>
+  <mime-type type="application/vnd.dvb.notif-ia-registration-request+xml"/>
+  <mime-type type="application/vnd.dvb.notif-ia-registration-response+xml"/>
+  <mime-type type="application/vnd.dvb.notif-init+xml"/>
+  <mime-type type="application/vnd.dxr"/>
+  <mime-type type="application/vnd.dynageo">
+    <glob pattern="*.geo"/>
+  </mime-type>
+  <mime-type type="application/vnd.ecdis-update"/>
+  <mime-type type="application/vnd.ecowin.chart">
+    <glob pattern="*.mag"/>
+  </mime-type>
+  <mime-type type="application/vnd.ecowin.filerequest"/>
+  <mime-type type="application/vnd.ecowin.fileupdate"/>
+  <mime-type type="application/vnd.ecowin.series"/>
+  <mime-type type="application/vnd.ecowin.seriesrequest"/>
+  <mime-type type="application/vnd.ecowin.seriesupdate"/>
+  <mime-type type="application/vnd.emclient.accessrequest+xml"/>
+  <mime-type type="application/vnd.enliven">
+    <glob pattern="*.nml"/>
+  </mime-type>
+  <mime-type type="application/vnd.epson.esf">
+    <glob pattern="*.esf"/>
+  </mime-type>
+  <mime-type type="application/vnd.epson.msf">
+    <glob pattern="*.msf"/>
+  </mime-type>
+  <mime-type type="application/vnd.epson.quickanime">
+    <glob pattern="*.qam"/>
+  </mime-type>
+  <mime-type type="application/vnd.epson.salt">
+    <glob pattern="*.slt"/>
+  </mime-type>
+  <mime-type type="application/vnd.epson.ssf">
+    <glob pattern="*.ssf"/>
+  </mime-type>
+  <mime-type type="application/vnd.ericsson.quickcall"/>
+  <mime-type type="application/vnd.eszigno3+xml">
+    <glob pattern="*.es3"/>
+    <glob pattern="*.et3"/>
+  </mime-type>
+  <mime-type type="application/vnd.etsi.aoc+xml"/>
+  <mime-type type="application/vnd.etsi.cug+xml"/>
+  <mime-type type="application/vnd.etsi.iptvcommand+xml"/>
+  <mime-type type="application/vnd.etsi.iptvdiscovery+xml"/>
+  <mime-type type="application/vnd.etsi.iptvprofile+xml"/>
+  <mime-type type="application/vnd.etsi.iptvsad-bc+xml"/>
+  <mime-type type="application/vnd.etsi.iptvsad-cod+xml"/>
+  <mime-type type="application/vnd.etsi.iptvsad-npvr+xml"/>
+  <mime-type type="application/vnd.etsi.iptvueprofile+xml"/>
+  <mime-type type="application/vnd.etsi.mcid+xml"/>
+  <mime-type type="application/vnd.etsi.sci+xml"/>
+  <mime-type type="application/vnd.etsi.simservs+xml"/>
+  <mime-type type="application/vnd.eudora.data"/>
+  <mime-type type="application/vnd.ezpix-album">
+    <glob pattern="*.ez2"/>
+  </mime-type>
+  <mime-type type="application/vnd.ezpix-package">
+    <glob pattern="*.ez3"/>
+  </mime-type>
+  <mime-type type="application/vnd.f-secure.mobile"/>
+  <mime-type type="application/vnd.fdf">
+    <acronym>FDF</acronym>
+    <_comment>Forms Data Format</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/Forms_Data_Format</tika:link>
+    <tika:link>http://www.adobe.com/devnet/acrobat/fdftoolkit.html</tika:link>
+    <tika:uti>com.adobe.fdf</tika:uti>
+    <magic priority="50">
+      <match value="%FDF-" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.fdf"/>
+  </mime-type>
+  <mime-type type="application/vnd.fdsn.mseed">
+    <glob pattern="*.mseed"/>
+  </mime-type>
+  <mime-type type="application/vnd.fdsn.seed">
+    <glob pattern="*.seed"/>
+    <glob pattern="*.dataless"/>
+  </mime-type>
+  <mime-type type="application/vnd.ffsns"/>
+  <mime-type type="application/vnd.fints"/>
+  <mime-type type="application/vnd.flographit">
+    <glob pattern="*.gph"/>
+  </mime-type>
+  <mime-type type="application/vnd.fluxtime.clip">
+    <glob pattern="*.ftc"/>
+  </mime-type>
+  <mime-type type="application/vnd.font-fontforge-sfd"/>
+  <mime-type type="application/vnd.framemaker">
+    <glob pattern="*.fm"/>
+    <glob pattern="*.frame"/>
+    <glob pattern="*.maker"/>
+    <glob pattern="*.book"/>
+  </mime-type>
+  <mime-type type="application/vnd.frogans.fnc">
+    <glob pattern="*.fnc"/>
+  </mime-type>
+  <mime-type type="application/vnd.frogans.ltf">
+    <glob pattern="*.ltf"/>
+  </mime-type>
+  <mime-type type="application/vnd.fsc.weblaunch">
+    <glob pattern="*.fsc"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujitsu.oasys">
+    <glob pattern="*.oas"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujitsu.oasys2">
+    <glob pattern="*.oa2"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujitsu.oasys3">
+    <glob pattern="*.oa3"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujitsu.oasysgp">
+    <glob pattern="*.fg5"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujitsu.oasysprs">
+    <glob pattern="*.bh2"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujixerox.art-ex"/>
+  <mime-type type="application/vnd.fujixerox.art4"/>
+  <mime-type type="application/vnd.fujixerox.hbpl"/>
+  <mime-type type="application/vnd.fujixerox.ddd">
+    <glob pattern="*.ddd"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujixerox.docuworks">
+    <glob pattern="*.xdw"/>
+  </mime-type>
+  <mime-type type="application/vnd.fujixerox.docuworks.binder">
+    <glob pattern="*.xbd"/>
+  </mime-type>
+  <mime-type type="application/vnd.fut-misnet"/>
+  <mime-type type="application/vnd.fuzzysheet">
+    <glob pattern="*.fzs"/>
+  </mime-type>
+  <mime-type type="application/vnd.genomatix.tuxedo">
+    <glob pattern="*.txd"/>
+  </mime-type>
+  <mime-type type="application/vnd.geogebra.file">
+    <glob pattern="*.ggb"/>
+  </mime-type>
+  <mime-type type="application/vnd.geogebra.tool">
+    <glob pattern="*.ggt"/>
+  </mime-type>
+  <mime-type type="application/vnd.geometry-explorer">
+    <glob pattern="*.gex"/>
+    <glob pattern="*.gre"/>
+  </mime-type>
+  <mime-type type="application/vnd.gmx">
+    <glob pattern="*.gmx"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.google-earth.kml+xml">
+    <root-XML localName="kml"/>
+    <root-XML namespaceURI="http://www.opengis.net/kml/2.2" localName="kml"/>
+    <root-XML namespaceURI="http://earth.google.com/kml/2.0" localName="kml"/>
+    <root-XML namespaceURI="http://earth.google.com/kml/2.1" localName="kml"/>
+    <root-XML namespaceURI="http://earth.google.com/kml/2.2" localName="kml"/>
+    <acronym>KML</acronym>
+    <_comment>Keyhole Markup Language</_comment>
+    <glob pattern="*.kml"/>
+    <sub-class-of type="application/xml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.google-earth.kmz">
+    <sub-class-of type="application/zip"/>
+    <glob pattern="*.kmz"/>
+  </mime-type>
+  <mime-type type="application/vnd.grafeq">
+    <glob pattern="*.gqf"/>
+    <glob pattern="*.gqs"/>
+  </mime-type>
+  <mime-type type="application/vnd.gridmp"/>
+  <mime-type type="application/vnd.groove-account">
+    <glob pattern="*.gac"/>
+  </mime-type>
+  <mime-type type="application/vnd.groove-help">
+    <glob pattern="*.ghf"/>
+  </mime-type>
+  <mime-type type="application/vnd.groove-identity-message">
+    <glob pattern="*.gim"/>
+  </mime-type>
+  <mime-type type="application/vnd.groove-injector">
+    <glob pattern="*.grv"/>
+  </mime-type>
+  <mime-type type="application/vnd.groove-tool-message">
+    <glob pattern="*.gtm"/>
+  </mime-type>
+  <mime-type type="application/vnd.groove-tool-template">
+    <glob pattern="*.tpl"/>
+  </mime-type>
+  <mime-type type="application/vnd.groove-vcard">
+    <glob pattern="*.vcg"/>
+  </mime-type>
+  <mime-type type="application/vnd.handheld-entertainment+xml">
+    <glob pattern="*.zmm"/>
+  </mime-type>
+  <mime-type type="application/vnd.hbci">
+    <glob pattern="*.hbci"/>
+  </mime-type>
+  <mime-type type="application/vnd.hcl-bireports"/>
+  <mime-type type="application/vnd.hhe.lesson-player">
+    <glob pattern="*.les"/>
+  </mime-type>
+  <mime-type type="application/vnd.hp-hpgl">
+    <glob pattern="*.hpgl"/>
+  </mime-type>
+  <mime-type type="application/vnd.hp-hpid">
+    <glob pattern="*.hpid"/>
+  </mime-type>
+  <mime-type type="application/vnd.hp-hps">
+    <glob pattern="*.hps"/>
+  </mime-type>
+  <mime-type type="application/vnd.hp-jlyt">
+    <glob pattern="*.jlt"/>
+  </mime-type>
+  <mime-type type="application/vnd.hp-pcl">
+    <glob pattern="*.pcl"/>
+  </mime-type>
+  <mime-type type="application/vnd.hp-pclxl">
+    <glob pattern="*.pclxl"/>
+  </mime-type>
+  <mime-type type="application/vnd.httphone"/>
+  <mime-type type="application/vnd.hydrostatix.sof-data">
+    <glob pattern="*.sfd-hdstx"/>
+  </mime-type>
+  <mime-type type="application/vnd.hzn-3d-crossword">
+    <glob pattern="*.x3d"/>
+  </mime-type>
+  <mime-type type="application/vnd.ibm.afplinedata"/>
+  <mime-type type="application/vnd.ibm.electronic-media"/>
+  <mime-type type="application/vnd.ibm.minipay">
+    <glob pattern="*.mpy"/>
+  </mime-type>
+  <mime-type type="application/vnd.ibm.modcap">
+    <glob pattern="*.afp"/>
+    <glob pattern="*.listafp"/>
+    <glob pattern="*.list3820"/>
+  </mime-type>
+  <mime-type type="application/vnd.ibm.rights-management">
+    <glob pattern="*.irm"/>
+  </mime-type>
+  <mime-type type="application/vnd.ibm.secure-container">
+    <glob pattern="*.sc"/>
+  </mime-type>
+  <mime-type type="application/vnd.iccprofile">
+    <glob pattern="*.icc"/>
+    <glob pattern="*.icm"/>
+  </mime-type>
+  <mime-type type="application/vnd.igloader">
+    <glob pattern="*.igl"/>
+  </mime-type>
+  <mime-type type="application/vnd.immervision-ivp">
+    <glob pattern="*.ivp"/>
+  </mime-type>
+  <mime-type type="application/vnd.immervision-ivu">
+    <glob pattern="*.ivu"/>
+  </mime-type>
+  <mime-type type="application/vnd.informedcontrol.rms+xml"/>
+  <mime-type type="application/vnd.informix-visionary"/>
+  <mime-type type="application/vnd.intercon.formnet">
+    <glob pattern="*.xpw"/>
+    <glob pattern="*.xpx"/>
+  </mime-type>
+  <mime-type type="application/vnd.intertrust.digibox"/>
+  <mime-type type="application/vnd.intertrust.nncp"/>
+  <mime-type type="application/vnd.intu.qbo">
+    <glob pattern="*.qbo"/>
+  </mime-type>
+  <mime-type type="application/vnd.intu.qfx">
+    <glob pattern="*.qfx"/>
+  </mime-type>
+  <mime-type type="application/vnd.iptc.g2.conceptitem+xml"/>
+  <mime-type type="application/vnd.iptc.g2.knowledgeitem+xml"/>
+  <mime-type type="application/vnd.iptc.g2.newsitem+xml"/>
+  <mime-type type="application/vnd.iptc.g2.packageitem+xml"/>
+  <mime-type type="application/vnd.ipunplugged.rcprofile">
+    <glob pattern="*.rcprofile"/>
+  </mime-type>
+  <mime-type type="application/vnd.irepository.package+xml">
+    <glob pattern="*.irp"/>
+  </mime-type>
+  <mime-type type="application/vnd.is-xpr">
+    <glob pattern="*.xpr"/>
+  </mime-type>
+  <mime-type type="application/vnd.jam">
+    <glob pattern="*.jam"/>
+  </mime-type>
+  <mime-type type="application/vnd.japannet-directory-service"/>
+  <mime-type type="application/vnd.japannet-jpnstore-wakeup"/>
+  <mime-type type="application/vnd.japannet-payment-wakeup"/>
+  <mime-type type="application/vnd.japannet-registration"/>
+  <mime-type type="application/vnd.japannet-registration-wakeup"/>
+  <mime-type type="application/vnd.japannet-setstore-wakeup"/>
+  <mime-type type="application/vnd.japannet-verification"/>
+  <mime-type type="application/vnd.japannet-verification-wakeup"/>
+  <mime-type type="application/vnd.jcp.javame.midlet-rms">
+    <glob pattern="*.rms"/>
+  </mime-type>
+  <mime-type type="application/vnd.jisp">
+    <glob pattern="*.jisp"/>
+  </mime-type>
+  <mime-type type="application/vnd.joost.joda-archive">
+    <glob pattern="*.joda"/>
+  </mime-type>
+  <mime-type type="application/vnd.kahootz">
+    <glob pattern="*.ktz"/>
+    <glob pattern="*.ktr"/>
+  </mime-type>
+  <mime-type type="application/vnd.kde.karbon">
+    <glob pattern="*.karbon"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kchart">
+    <alias type="application/x-kchart"/>
+    <_comment>KChart File</_comment>
+    <glob pattern="*.chrt"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kformula">
+    <glob pattern="*.kfo"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kivio">
+    <glob pattern="*.flw"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kontour">
+    <glob pattern="*.kon"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kpresenter">
+    <alias type="application/x-kpresenter"/>
+    <_comment>KPresenter File</_comment>
+    <glob pattern="*.kpr"/>
+    <glob pattern="*.kpt"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kspread">
+    <alias type="application/x-kspread"/>
+    <_comment>KSpread File</_comment>
+    <glob pattern="*.ksp"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kde.kword">
+    <alias type="application/x-kword"/>
+    <_comment>KWord File</_comment>
+    <glob pattern="*.kwd"/>
+    <glob pattern="*.kwt"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.kenameaapp">
+    <glob pattern="*.htke"/>
+  </mime-type>
+  <mime-type type="application/vnd.kidspiration">
+    <glob pattern="*.kia"/>
+  </mime-type>
+  <mime-type type="application/vnd.kinar">
+    <glob pattern="*.kne"/>
+    <glob pattern="*.knp"/>
+  </mime-type>
+  <mime-type type="application/vnd.koan">
+    <alias type="application/x-koan"/>
+    <_comment>SSEYO Koan File</_comment>
+    <glob pattern="*.skp"/>
+    <glob pattern="*.skd"/>
+    <glob pattern="*.skt"/>
+    <glob pattern="*.skm"/>
+  </mime-type>
+  <mime-type type="application/vnd.kodak-descriptor">
+    <glob pattern="*.sse"/>
+  </mime-type>
+  <mime-type type="application/vnd.liberty-request+xml"/>
+  <mime-type type="application/vnd.llamagraphics.life-balance.desktop">
+    <glob pattern="*.lbd"/>
+  </mime-type>
+  <mime-type type="application/vnd.llamagraphics.life-balance.exchange+xml">
+    <glob pattern="*.lbe"/>
+  </mime-type>
+  <mime-type type="application/vnd.lotus-1-2-3">
+    <glob pattern="*.123"/>
+  </mime-type>
+  <mime-type type="application/vnd.lotus-approach">
+    <glob pattern="*.apr"/>
+  </mime-type>
+  <mime-type type="application/vnd.lotus-freelance">
+    <glob pattern="*.pre"/>
+  </mime-type>
+  <mime-type type="application/vnd.lotus-notes">
+    <glob pattern="*.nsf"/>
+  </mime-type>
+  <mime-type type="application/vnd.lotus-organizer">
+    <glob pattern="*.org"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.lotus-screencam">
+    <!-- <glob pattern="*.scm"/> - conflicts with text/x-scheme -->
+  </mime-type>
+
+  <mime-type type="application/vnd.lotus-wordpro">
+    <magic priority="50">
+      <match value="WordPro\0" type="string" offset="0" />
+      <match value="WordPro\r\373" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.lwp"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.macports.portpkg">
+    <glob pattern="*.portpkg"/>
+  </mime-type>
+  <mime-type type="application/vnd.marlin.drm.actiontoken+xml"/>
+  <mime-type type="application/vnd.marlin.drm.conftoken+xml"/>
+  <mime-type type="application/vnd.marlin.drm.license+xml"/>
+  <mime-type type="application/vnd.marlin.drm.mdcf"/>
+  <mime-type type="application/vnd.mcd">
+    <glob pattern="*.mcd"/>
+  </mime-type>
+  <mime-type type="application/vnd.medcalcdata">
+    <glob pattern="*.mc1"/>
+  </mime-type>
+  <mime-type type="application/vnd.mediastation.cdkey">
+    <glob pattern="*.cdkey"/>
+  </mime-type>
+  <mime-type type="application/vnd.meridian-slingshot"/>
+  <mime-type type="application/vnd.mfer">
+    <glob pattern="*.mwf"/>
+  </mime-type>
+  <mime-type type="application/vnd.mfmp">
+    <glob pattern="*.mfm"/>
+  </mime-type>
+  <mime-type type="application/vnd.micrografx.flo">
+    <glob pattern="*.flo"/>
+  </mime-type>
+  <mime-type type="application/vnd.micrografx.igx">
+    <glob pattern="*.igx"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.mif">
+    <_comment>FrameMaker Interchange Format</_comment>
+    <alias type="application/x-mif"/>
+    <alias type="application/x-frame"/>
+    <magic priority="50">
+      <match value="\&lt;MakerFile" type="string" offset="0" />
+      <match value="\&lt;MIFFile" type="string" offset="0" />
+      <match value="\&lt;MakerDictionary" type="string" offset="0" />
+      <match value="\&lt;MakerScreenFont" type="string" offset="0" />
+      <match value="\&lt;MML" type="string" offset="0" />
+      <match value="\&lt;Book" type="string" offset="0" />
+      <match value="\&lt;Maker" type="string" offset="0" />
+      <match value="\x3c\x4d\x49\x46\x46\x69\x6c\x65\x20" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.mif"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.mindjet.mindmanager">
+    <_comment>MindManager</_comment>
+    <sub-class-of type="application/zip"/>
+    <glob pattern="*.mmp"/>
+    <glob pattern="*.mmap"/>
+    <glob pattern="*.mmpt"/>
+    <glob pattern="*.mmat"/>
+    <glob pattern="*.mmmp"/>
+    <glob pattern="*.mmas"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.minisoft-hp3000-save"/>
+  <mime-type type="application/vnd.mitsubishi.misty-guard.trustweb"/>
+  <mime-type type="application/vnd.mobius.daf">
+    <glob pattern="*.daf"/>
+  </mime-type>
+  <mime-type type="application/vnd.mobius.dis">
+    <glob pattern="*.dis"/>
+  </mime-type>
+  <mime-type type="application/vnd.mobius.mbk">
+    <glob pattern="*.mbk"/>
+  </mime-type>
+  <mime-type type="application/vnd.mobius.mqy">
+    <glob pattern="*.mqy"/>
+  </mime-type>
+  <mime-type type="application/vnd.mobius.msl">
+    <glob pattern="*.msl"/>
+  </mime-type>
+  <mime-type type="application/vnd.mobius.plc">
+    <glob pattern="*.plc"/>
+  </mime-type>
+  <mime-type type="application/vnd.mobius.txf">
+    <glob pattern="*.txf"/>
+  </mime-type>
+  <mime-type type="application/vnd.mophun.application">
+    <glob pattern="*.mpn"/>
+  </mime-type>
+  <mime-type type="application/vnd.mophun.certificate">
+    <glob pattern="*.mpc"/>
+  </mime-type>
+  <mime-type type="application/vnd.motorola.flexsuite"/>
+  <mime-type type="application/vnd.motorola.flexsuite.adsi"/>
+  <mime-type type="application/vnd.motorola.flexsuite.fis"/>
+  <mime-type type="application/vnd.motorola.flexsuite.gotap"/>
+  <mime-type type="application/vnd.motorola.flexsuite.kmr"/>
+  <mime-type type="application/vnd.motorola.flexsuite.ttc"/>
+  <mime-type type="application/vnd.motorola.flexsuite.wem"/>
+  <mime-type type="application/vnd.motorola.iprm"/>
+  <mime-type type="application/vnd.mozilla.xul+xml">
+    <glob pattern="*.xul"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-artgalry">
+    <glob pattern="*.cil"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-asf"/>
+  <mime-type type="application/vnd.ms-cab-compressed">
+    <glob pattern="*.cab"/>
+  </mime-type>
+
+  <!-- http://www.iana.org/assignments/media-types/application/vnd.ms-excel -->
+  <mime-type type="application/vnd.ms-excel">
+    <!-- Use DefaultDetector / org.apache.tika.parser.microsoft.POIFSContainerDetector for more reliable detection of OLE2 documents -->
+    <alias type="application/msexcel" />
+    <_comment>Microsoft Excel Spreadsheet</_comment>
+    <magic priority="50">
+      <match value="Microsoft\ Excel\ 5.0\ Worksheet" type="string" offset="2080"/>
+      <match value="Foglio\ di\ lavoro\ Microsoft\ Exce" type="string" offset="2080"/>
+      <match value="Biff5" type="string" offset="2114"/>
+      <match value="Biff5" type="string" offset="2121"/>
+      <match value="\x09\x04\x06\x00\x00\x00\x10\x00" type="string" offset="0"/>
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="W\x00o\x00r\x00k\x00b\x00o\x00o\x00k" type="string" offset="1152:4096" />
+      </match>
+    </magic>
+    <glob pattern="*.xls"/>
+    <glob pattern="*.xlm"/>
+    <glob pattern="*.xla"/>
+    <glob pattern="*.xlc"/>
+    <glob pattern="*.xlt"/>
+    <glob pattern="*.xlw"/>
+    <glob pattern="*.xll"/>
+    <glob pattern="*.xld"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-excel.addin.macroenabled.12">
+    <_comment>Office Open XML Workbook Add-in (macro-enabled)</_comment>
+    <glob pattern="*.xlam"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-excel.sheet.macroenabled.12">
+    <_comment>Office Open XML Workbook (macro-enabled)</_comment>
+    <glob pattern="*.xlsm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-excel.sheet.binary.macroenabled.12">
+    <_comment>Microsoft Excel 2007 Binary Spreadsheet</_comment>
+    <glob pattern="*.xlsb"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-fontobject">
+    <glob pattern="*.eot"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-htmlhelp">
+    <glob pattern="*.chm"/>
+    <magic priority="50">
+      <match value="ITSF" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+  <mime-type type="application/vnd.ms-ims">
+    <glob pattern="*.ims"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-lrm">
+    <glob pattern="*.lrm"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-outlook">
+    <_comment>Microsoft Outlook Message</_comment>
+    <glob pattern="*.msg" />
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-outlook-pst">
+    <_comment>Outlook Personal Folders File Format</_comment>
+    <magic priority="50">
+       <match value="!BDN....SM" type="string" offset="0" mask="0xFFFFFFFF00000000FFFF"/>
+    </magic> 
+    <glob pattern="*.pst"/>
+    <glob pattern="*.ost"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-pki.seccat">
+    <glob pattern="*.cat"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-pki.stl">
+    <glob pattern="*.stl"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-playready.initiator+xml"/>
+
+  <!-- http://www.iana.org/assignments/media-types/application/vnd.ms-powerpoint -->
+  <mime-type type="application/vnd.ms-powerpoint">
+    <!-- Use DefaultDetector / org.apache.tika.parser.microsoft.POIFSContainerDetector for more reliable detection of OLE2 documents -->
+    <alias type="application/mspowerpoint"/>
+    <_comment>Microsoft Powerpoint Presentation</_comment>
+    <magic priority="50">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="P\x00o\x00w\x00e\x00r\x00P\x00o\x00i\x00n\x00t\x00 D\x00o\x00c\x00u\x00m\x00e\x00n\x00t" type="string" offset="1152:4096" />
+      </match>
+    </magic>
+    <glob pattern="*.ppt"/>
+    <glob pattern="*.ppz"/>
+    <glob pattern="*.pps"/>
+    <glob pattern="*.pot"/>
+    <glob pattern="*.ppa"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-powerpoint.addin.macroenabled.12">
+    <_comment>Office Open XML Presentation Add-in (macro-enabled)</_comment>
+    <glob pattern="*.ppam"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-powerpoint.presentation.macroenabled.12">
+    <_comment>Office Open XML Presentation (macro-enabled)</_comment>
+    <glob pattern="*.pptm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-powerpoint.slide.macroenabled.12">
+    <glob pattern="*.sldm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-powerpoint.slideshow.macroenabled.12">
+    <_comment>Office Open XML Presentation Slideshow (macro-enabled)</_comment>
+    <glob pattern="*.ppsm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-powerpoint.template.macroenabled.12">
+    <glob pattern="*.potm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-project">
+    <glob pattern="*.mpp"/>
+    <glob pattern="*.mpt"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/x-project">
+    <glob pattern="*.mpx"/>
+    <magic priority="50">
+      <match value="MPX,Microsoft Project for Windows," type="string" offset="0"/>
+    </magic>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-tnef">
+    <alias type="application/ms-tnef" />
+    <magic priority="50">
+      <match value="0x223e9f78" type="little32" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-wmdrm.lic-chlg-req"/>
+  <mime-type type="application/vnd.ms-wmdrm.lic-resp"/>
+  <mime-type type="application/vnd.ms-wmdrm.meter-chlg-req"/>
+  <mime-type type="application/vnd.ms-wmdrm.meter-resp"/>
+
+  <mime-type type="application/vnd.ms-word.document.macroenabled.12">
+    <_comment>Office Open XML Document (macro-enabled)</_comment>
+    <glob pattern="*.docm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-word.template.macroenabled.12">
+    <_comment>Office Open XML Document Template (macro-enabled)</_comment>
+    <glob pattern="*.dotm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-works">
+    <magic priority="50">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="M\x00a\x00t\x00O\x00S\x00T" type="string" offset="1152:4096" />
+      </match>
+    </magic>
+    <glob pattern="*.wps"/>
+    <glob pattern="*.wks"/>
+    <glob pattern="*.wcm"/>
+    <glob pattern="*.wdb"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-wpl">
+    <glob pattern="*.wpl"/>
+  </mime-type>
+  <mime-type type="application/vnd.ms-xpsdocument">
+    <alias type="application/oxps"/>
+    <_comment>Open XML Paper Specification</_comment>
+    <glob pattern="*.xps"/>
+    <glob pattern="*.oxps"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+  <mime-type type="application/vnd.mseq">
+    <glob pattern="*.mseq"/>
+  </mime-type>
+  <mime-type type="application/vnd.msign"/>
+  <mime-type type="application/vnd.multiad.creator"/>
+  <mime-type type="application/vnd.multiad.creator.cif"/>
+  <mime-type type="application/vnd.music-niff"/>
+  <mime-type type="application/vnd.musician">
+    <glob pattern="*.mus"/>
+  </mime-type>
+  <mime-type type="application/vnd.muvee.style">
+    <glob pattern="*.msty"/>
+  </mime-type>
+  <mime-type type="application/vnd.ncd.control"/>
+  <mime-type type="application/vnd.ncd.reference"/>
+  <mime-type type="application/vnd.nervana"/>
+  <mime-type type="application/vnd.netfpx"/>
+  <mime-type type="application/vnd.neurolanguage.nlu">
+    <glob pattern="*.nlu"/>
+  </mime-type>
+  <mime-type type="application/vnd.noblenet-directory">
+    <glob pattern="*.nnd"/>
+  </mime-type>
+  <mime-type type="application/vnd.noblenet-sealer">
+    <glob pattern="*.nns"/>
+  </mime-type>
+  <mime-type type="application/vnd.noblenet-web">
+    <glob pattern="*.nnw"/>
+  </mime-type>
+  <mime-type type="application/vnd.nokia.catalogs"/>
+  <mime-type type="application/vnd.nokia.conml+wbxml"/>
+  <mime-type type="application/vnd.nokia.conml+xml"/>
+  <mime-type type="application/vnd.nokia.isds-radio-presets"/>
+  <mime-type type="application/vnd.nokia.iptv.config+xml"/>
+  <mime-type type="application/vnd.nokia.landmark+wbxml"/>
+  <mime-type type="application/vnd.nokia.landmark+xml"/>
+  <mime-type type="application/vnd.nokia.landmarkcollection+xml"/>
+  <mime-type type="application/vnd.nokia.n-gage.ac+xml"/>
+  <mime-type type="application/vnd.nokia.n-gage.data">
+    <glob pattern="*.ngdat"/>
+  </mime-type>
+  <mime-type type="application/vnd.nokia.n-gage.symbian.install">
+    <glob pattern="*.n-gage"/>
+  </mime-type>
+  <mime-type type="application/vnd.nokia.ncd"/>
+  <mime-type type="application/vnd.nokia.pcd+wbxml"/>
+  <mime-type type="application/vnd.nokia.pcd+xml"/>
+  <mime-type type="application/vnd.nokia.radio-preset">
+    <glob pattern="*.rpst"/>
+  </mime-type>
+  <mime-type type="application/vnd.nokia.radio-presets">
+    <glob pattern="*.rpss"/>
+  </mime-type>
+  <mime-type type="application/vnd.novadigm.edm">
+    <glob pattern="*.edm"/>
+  </mime-type>
+  <mime-type type="application/vnd.novadigm.edx">
+    <glob pattern="*.edx"/>
+  </mime-type>
+  <mime-type type="application/vnd.novadigm.ext">
+    <glob pattern="*.ext"/>
+  </mime-type>
+
+  <!-- =================================================================== -->
+  <!-- Open Document Format for Office Applications (OpenDocument) v1.0    -->
+  <!-- http://www.oasis-open.org/specs/index.php#opendocumentv1.0          -->
+  <!-- =================================================================== -->
+
+  <mime-type type="application/vnd.oasis.opendocument.chart">
+    <alias type="application/x-vnd.oasis.opendocument.chart"/>
+    <_comment>OpenDocument v1.0: Chart document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.chart"/>
+      </match>
+    </magic>
+    <glob pattern="*.odc"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.chart-template">
+    <alias type="application/x-vnd.oasis.opendocument.chart-template"/>
+    <_comment>OpenDocument v1.0: Chart document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.chart-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.otc"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.database">
+    <glob pattern="*.odb"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.formula">
+    <alias type="application/x-vnd.oasis.opendocument.formula"/>
+    <_comment>OpenDocument v1.0: Formula document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.formula" />
+      </match>
+    </magic>
+    <glob pattern="*.odf"/>
+    <sub-class-of type="application/zip"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.formula-template">
+    <alias type="application/x-vnd.oasis.opendocument.formula-template"/>
+    <_comment>OpenDocument v1.0: Formula document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.formula-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.odft"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.graphics">
+    <alias type="application/x-vnd.oasis.opendocument.graphics"/>
+    <_comment>OpenDocument v1.0: Graphics document (Drawing)</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.graphics"/>
+      </match>
+    </magic>
+    <glob pattern="*.odg"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.graphics-template">
+    <alias type="application/x-vnd.oasis.opendocument.graphics-template"/>
+    <_comment>OpenDocument v1.0: Graphics document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.graphics-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.otg"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.image">
+    <alias type="application/x-vnd.oasis.opendocument.image"/>
+    <_comment>OpenDocument v1.0: Image document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.image"/>
+      </match>
+    </magic>
+    <glob pattern="*.odi"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.image-template">
+    <alias type="application/x-vnd.oasis.opendocument.image-template"/>
+    <_comment>OpenDocument v1.0: Image document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.image-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.oti"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.presentation">
+    <alias type="application/x-vnd.oasis.opendocument.presentation"/>
+    <_comment>OpenDocument v1.0: Presentation document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.presentation"/>
+      </match>
+    </magic>
+    <glob pattern="*.odp"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.presentation-template">
+    <alias type="application/x-vnd.oasis.opendocument.presentation-template"/>
+    <_comment>OpenDocument v1.0: Presentation document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+              value="mimetypeapplication/vnd.oasis.opendocument.presentation-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.otp"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.spreadsheet">
+    <alias type="application/x-vnd.oasis.opendocument.spreadsheet"/>
+    <_comment>OpenDocument v1.0: Spreadsheet document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.spreadsheet"/>
+      </match>
+    </magic>
+    <glob pattern="*.ods"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.spreadsheet-template">
+    <alias type="application/x-vnd.oasis.opendocument.spreadsheet-template"/>
+    <_comment>OpenDocument v1.0: Spreadsheet document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.spreadsheet-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.ots"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.text">
+    <alias type="application/x-vnd.oasis.opendocument.text"/>
+    <_comment>OpenDocument v1.0: Text document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.text"/>
+      </match>
+    </magic>
+    <glob pattern="*.odt"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.text-master">
+    <alias type="application/x-vnd.oasis.opendocument.text-master"/>
+    <_comment>OpenDocument v1.0: Global Text document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+               value="mimetypeapplication/vnd.oasis.opendocument.text-master"/>
+      </match>
+    </magic>
+    <glob pattern="*.otm"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.text-template">
+    <alias type="application/x-vnd.oasis.opendocument.text-template"/>
+    <_comment>OpenDocument v1.0: Text document used as template</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+              value="mimetypeapplication/vnd.oasis.opendocument.text-template"/>
+      </match>
+    </magic>
+    <glob pattern="*.ott"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.text-web">
+    <alias type="application/x-vnd.oasis.opendocument.text-web"/>
+    <_comment>OpenDocument v1.0: Text document used as template for HTML documents</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+              value="mimetypeapplication/vnd.oasis.opendocument.text-web"/>
+      </match>
+    </magic>
+    <glob pattern="*.oth"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.obn"/>
+  <mime-type type="application/vnd.olpc-sugar">
+    <glob pattern="*.xo"/>
+  </mime-type>
+  <mime-type type="application/vnd.oma-scws-config"/>
+  <mime-type type="application/vnd.oma-scws-http-request"/>
+  <mime-type type="application/vnd.oma-scws-http-response"/>
+  <mime-type type="application/vnd.oma.bcast.associated-procedure-parameter+xml"/>
+  <mime-type type="application/vnd.oma.bcast.drm-trigger+xml"/>
+  <mime-type type="application/vnd.oma.bcast.imd+xml"/>
+  <mime-type type="application/vnd.oma.bcast.ltkm"/>
+  <mime-type type="application/vnd.oma.bcast.notification+xml"/>
+  <mime-type type="application/vnd.oma.bcast.provisioningtrigger"/>
+  <mime-type type="application/vnd.oma.bcast.sgboot"/>
+  <mime-type type="application/vnd.oma.bcast.sgdd+xml"/>
+  <mime-type type="application/vnd.oma.bcast.sgdu"/>
+  <mime-type type="application/vnd.oma.bcast.simple-symbol-container"/>
+  <mime-type type="application/vnd.oma.bcast.smartcard-trigger+xml"/>
+  <mime-type type="application/vnd.oma.bcast.sprov+xml"/>
+  <mime-type type="application/vnd.oma.bcast.stkm"/>
+  <mime-type type="application/vnd.oma.dcd"/>
+  <mime-type type="application/vnd.oma.dcdc"/>
+  <mime-type type="application/vnd.oma.dd2+xml">
+    <glob pattern="*.dd2"/>
+  </mime-type>
+  <mime-type type="application/vnd.oma.drm.risd+xml"/>
+  <mime-type type="application/vnd.oma.group-usage-list+xml"/>
+  <mime-type type="application/vnd.oma.poc.detailed-progress-report+xml"/>
+  <mime-type type="application/vnd.oma.poc.final-report+xml"/>
+  <mime-type type="application/vnd.oma.poc.groups+xml"/>
+  <mime-type type="application/vnd.oma.poc.invocation-descriptor+xml"/>
+  <mime-type type="application/vnd.oma.poc.optimized-progress-report+xml"/>
+  <mime-type type="application/vnd.oma.xcap-directory+xml"/>
+  <mime-type type="application/vnd.omads-email+xml"/>
+  <mime-type type="application/vnd.omads-file+xml"/>
+  <mime-type type="application/vnd.omads-folder+xml"/>
+  <mime-type type="application/vnd.omaloc-supl-init"/>
+
+  <mime-type type="application/vnd.openofficeorg.extension">
+    <glob pattern="*.oxt"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.presentationml.presentation">
+    <_comment>Office Open XML Presentation</_comment>
+    <glob pattern="*.pptx"/>
+    <glob pattern="*.thmx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.presentationml.slide">
+    <glob pattern="*.sldx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.presentationml.template">
+    <_comment>Office Open XML Presentation Template</_comment>
+    <glob pattern="*.potx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.presentationml.slideshow">
+    <_comment>Office Open XML Presentation Slideshow</_comment>
+    <glob pattern="*.ppsx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
+    <_comment>Office Open XML Workbook</_comment>
+    <glob pattern="*.xlsx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.spreadsheetml.template">
+    <_comment>Office Open XML Workbook Template</_comment>
+    <glob pattern="*.xltx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.ms-excel.template.macroenabled.12">
+    <_comment>Office Open XML Workbook Template (macro-enabled)</_comment>
+    <glob pattern="*.xltm"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.wordprocessingml.document">
+    <_comment>Office Open XML Document</_comment>
+    <glob pattern="*.docx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.openxmlformats-officedocument.wordprocessingml.template">
+    <_comment>Office Open XML Document Template</_comment>
+    <glob pattern="*.dotx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.osa.netdeploy"/>
+  <mime-type type="application/vnd.osgi.bundle"/>
+  <mime-type type="application/vnd.osgi.dp">
+    <glob pattern="*.dp"/>
+  </mime-type>
+  <mime-type type="application/vnd.otps.ct-kip+xml"/>
+
+  <mime-type type="application/vnd.palm">
+    <!-- <glob pattern="*.pdb"/> - conflicts with chemical/x-pdb -->
+    <glob pattern="*.pqa"/>
+    <glob pattern="*.oprc"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.paos.xml"/>
+  <mime-type type="application/vnd.pg.format">
+    <glob pattern="*.str"/>
+  </mime-type>
+  <mime-type type="application/vnd.pg.osasli">
+    <glob pattern="*.ei6"/>
+  </mime-type>
+  <mime-type type="application/vnd.piaccess.application-licence"/>
+  <mime-type type="application/vnd.picsel">
+    <glob pattern="*.efif"/>
+  </mime-type>
+  <mime-type type="application/vnd.poc.group-advertisement+xml"/>
+  <mime-type type="application/vnd.pocketlearn">
+    <glob pattern="*.plf"/>
+  </mime-type>
+  <mime-type type="application/vnd.powerbuilder6">
+    <glob pattern="*.pbd"/>
+  </mime-type>
+  <mime-type type="application/vnd.powerbuilder6-s"/>
+  <mime-type type="application/vnd.powerbuilder7"/>
+  <mime-type type="application/vnd.powerbuilder7-s"/>
+  <mime-type type="application/vnd.powerbuilder75"/>
+  <mime-type type="application/vnd.powerbuilder75-s"/>
+  <mime-type type="application/vnd.preminet"/>
+  <mime-type type="application/vnd.previewsystems.box">
+    <glob pattern="*.box"/>
+  </mime-type>
+  <mime-type type="application/vnd.proteus.magazine">
+    <glob pattern="*.mgz"/>
+  </mime-type>
+  <mime-type type="application/vnd.publishare-delta-tree">
+    <glob pattern="*.qps"/>
+  </mime-type>
+  <mime-type type="application/vnd.pvi.ptid1">
+    <glob pattern="*.ptid"/>
+  </mime-type>
+  <mime-type type="application/vnd.pwg-multiplexed"/>
+  <mime-type type="application/vnd.pwg-xhtml-print+xml"/>
+  <mime-type type="application/vnd.qualcomm.brew-app-res"/>
+  <mime-type type="application/vnd.quark.quarkxpress">
+    <glob pattern="*.qxd"/>
+    <glob pattern="*.qxt"/>
+    <glob pattern="*.qwd"/>
+    <glob pattern="*.qwt"/>
+    <glob pattern="*.qxl"/>
+    <glob pattern="*.qxb"/>
+  </mime-type>
+  <mime-type type="application/vnd.rapid"/>
+  <mime-type type="application/vnd.recordare.musicxml">
+    <glob pattern="*.mxl"/>
+  </mime-type>
+  <mime-type type="application/vnd.recordare.musicxml+xml">
+    <glob pattern="*.musicxml"/>
+  </mime-type>
+  <mime-type type="application/vnd.renlearn.rlprint"/>
+  <mime-type type="application/vnd.rim.cod">
+    <glob pattern="*.cod"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.rn-realmedia">
+    <magic priority="50">
+      <match value=".RMF" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.rm"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.route66.link66+xml">
+    <glob pattern="*.link66"/>
+  </mime-type>
+  <mime-type type="application/vnd.ruckus.download"/>
+  <mime-type type="application/vnd.s3sms"/>
+  <mime-type type="application/vnd.sbm.cid"/>
+  <mime-type type="application/vnd.sbm.mid2"/>
+  <mime-type type="application/vnd.scribus"/>
+  <mime-type type="application/vnd.sealed.3df"/>
+  <mime-type type="application/vnd.sealed.csf"/>
+  <mime-type type="application/vnd.sealed.doc"/>
+  <mime-type type="application/vnd.sealed.eml"/>
+  <mime-type type="application/vnd.sealed.mht"/>
+  <mime-type type="application/vnd.sealed.net"/>
+  <mime-type type="application/vnd.sealed.ppt"/>
+  <mime-type type="application/vnd.sealed.tiff"/>
+  <mime-type type="application/vnd.sealed.xls"/>
+  <mime-type type="application/vnd.sealedmedia.softseal.html"/>
+  <mime-type type="application/vnd.sealedmedia.softseal.pdf"/>
+  <mime-type type="application/vnd.seemail">
+    <glob pattern="*.see"/>
+  </mime-type>
+  <mime-type type="application/vnd.sema">
+    <glob pattern="*.sema"/>
+  </mime-type>
+  <mime-type type="application/vnd.semd">
+    <glob pattern="*.semd"/>
+  </mime-type>
+  <mime-type type="application/vnd.semf">
+    <glob pattern="*.semf"/>
+  </mime-type>
+  <mime-type type="application/vnd.shana.informed.formdata">
+    <glob pattern="*.ifm"/>
+  </mime-type>
+  <mime-type type="application/vnd.shana.informed.formtemplate">
+    <glob pattern="*.itp"/>
+  </mime-type>
+  <mime-type type="application/vnd.shana.informed.interchange">
+    <glob pattern="*.iif"/>
+  </mime-type>
+  <mime-type type="application/vnd.shana.informed.package">
+    <glob pattern="*.ipk"/>
+  </mime-type>
+  <mime-type type="application/vnd.simtech-mindmapper">
+    <glob pattern="*.twd"/>
+    <glob pattern="*.twds"/>
+  </mime-type>
+  <mime-type type="application/vnd.smaf">
+    <glob pattern="*.mmf"/>
+  </mime-type>
+  <mime-type type="application/vnd.smart.teacher">
+    <glob pattern="*.teacher"/>
+  </mime-type>
+  <mime-type type="application/vnd.software602.filler.form+xml"/>
+  <mime-type type="application/vnd.software602.filler.form-xml-zip"/>
+  <mime-type type="application/vnd.solent.sdkm+xml">
+    <glob pattern="*.sdkm"/>
+    <glob pattern="*.sdkd"/>
+  </mime-type>
+  <mime-type type="application/vnd.spotfire.dxp">
+    <glob pattern="*.dxp"/>
+  </mime-type>
+  <mime-type type="application/vnd.spotfire.sfs">
+    <glob pattern="*.sfs"/>
+  </mime-type>
+  <mime-type type="application/vnd.sss-cod"/>
+  <mime-type type="application/vnd.sss-dtf"/>
+  <mime-type type="application/vnd.sss-ntf"/>
+
+  <mime-type type="application/vnd.stardivision.calc">
+    <sub-class-of type="application/x-tika-staroffice"/>
+    <magic priority="50">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="StarCalc" type="string" offset="2048:2207" />
+      </match>
+    </magic>
+    <glob pattern="*.sdc"/>
+  </mime-type>
+  <mime-type type="application/vnd.stardivision.draw">
+    <sub-class-of type="application/x-tika-staroffice"/>
+    <magic priority="50">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="StarDraw" type="string" offset="2048:2207" />
+      </match>
+    </magic>
+    <glob pattern="*.sda"/>
+  </mime-type>
+  <mime-type type="application/vnd.stardivision.impress">
+    <sub-class-of type="application/x-tika-staroffice"/>
+    <magic priority="50">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="StarImpress" type="string" offset="2048:2207" />
+      </match>
+    </magic>
+    <glob pattern="*.sdd"/>
+  </mime-type>
+  <mime-type type="application/vnd.stardivision.math">
+    <glob pattern="*.smf"/>
+  </mime-type>
+  <mime-type type="application/vnd.stardivision.writer">
+    <sub-class-of type="application/x-tika-staroffice"/>
+    <magic priority="50">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="StarWriter" type="string" offset="2048:2207" />
+      </match>
+    </magic>
+    <glob pattern="*.sdw"/>
+  </mime-type>
+  <mime-type type="application/x-staroffice-template">
+    <sub-class-of type="application/x-tika-staroffice"/>
+    <glob pattern="*.vor"/>
+  </mime-type>
+  <mime-type type="application/vnd.stardivision.writer-global">
+    <glob pattern="*.sgl"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.street-stream"/>
+  <mime-type type="application/vnd.sun.xml.calc">
+    <glob pattern="*.sxc"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.calc.template">
+    <glob pattern="*.stc"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.draw">
+    <glob pattern="*.sxd"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.draw.template">
+    <glob pattern="*.std"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.impress">
+    <glob pattern="*.sxi"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.impress.template">
+    <glob pattern="*.sti"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.math">
+    <glob pattern="*.sxm"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.sun.xml.writer">
+    <alias type="application/x-vnd.sun.xml.writer"/>
+    <_comment>OpenOffice v1.0: Writer Document</_comment>
+    <magic>
+      <match type="string" offset="0" value="PK">
+        <match type="string" offset="30"
+          value="mimetypeapplication/vnd.sun.xml.writer"/>
+      </match>
+    </magic>
+    <glob pattern="*.sxw"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.sun.xml.writer.global">
+    <glob pattern="*.sxg"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.xml.writer.template">
+    <glob pattern="*.stw"/>
+  </mime-type>
+  <mime-type type="application/vnd.sun.wadl+xml"/>
+  <mime-type type="application/vnd.sus-calendar">
+    <glob pattern="*.sus"/>
+    <glob pattern="*.susp"/>
+  </mime-type>
+  <mime-type type="application/vnd.svd">
+    <glob pattern="*.svd"/>
+  </mime-type>
+  <mime-type type="application/vnd.swiftview-ics"/>
+
+  <mime-type type="application/vnd.symbian.install">
+    <magic priority="50">
+      <match value="0x10000419" type="little32" offset="8" />
+    </magic>
+    <glob pattern="*.sis"/>
+    <glob pattern="*.sisx"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.syncml+xml">
+    <glob pattern="*.xsm"/>
+  </mime-type>
+  <mime-type type="application/vnd.syncml.dm+wbxml">
+    <glob pattern="*.bdm"/>
+  </mime-type>
+  <mime-type type="application/vnd.syncml.dm+xml">
+    <glob pattern="*.xdm"/>
+  </mime-type>
+  <mime-type type="application/vnd.syncml.dm.notification"/>
+  <mime-type type="application/vnd.syncml.ds.notification"/>
+  <mime-type type="application/vnd.tao.intent-module-archive">
+    <glob pattern="*.tao"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.tcpdump.pcap">
+    <_comment>TCPDump pcap packet capture</_comment>
+    <magic priority="50">
+      <match value="0xa1b2c3d4" type="big32" offset="0" />
+      <match value="0xd4c3b2a1" type="big32" offset="0" />
+    </magic>
+    <glob pattern="*.pcap"/>
+    <glob pattern="*.cap"/>
+    <glob pattern="*.dmp"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.tmobile-livetv">
+    <glob pattern="*.tmo"/>
+  </mime-type>
+  <mime-type type="application/vnd.trid.tpt">
+    <glob pattern="*.tpt"/>
+  </mime-type>
+  <mime-type type="application/vnd.triscape.mxs">
+    <glob pattern="*.mxs"/>
+  </mime-type>
+  <mime-type type="application/vnd.trueapp">
+    <glob pattern="*.tra"/>
+  </mime-type>
+  <mime-type type="application/vnd.truedoc"/>
+  <mime-type type="application/vnd.ufdl">
+    <glob pattern="*.ufd"/>
+    <glob pattern="*.ufdl"/>
+  </mime-type>
+  <mime-type type="application/vnd.uiq.theme">
+    <glob pattern="*.utz"/>
+  </mime-type>
+  <mime-type type="application/vnd.umajin">
+    <glob pattern="*.umj"/>
+  </mime-type>
+  <mime-type type="application/vnd.unity">
+    <glob pattern="*.unityweb"/>
+  </mime-type>
+  <mime-type type="application/vnd.uoml+xml">
+    <glob pattern="*.uoml"/>
+  </mime-type>
+  <mime-type type="application/vnd.uplanet.alert"/>
+  <mime-type type="application/vnd.uplanet.alert-wbxml"/>
+  <mime-type type="application/vnd.uplanet.bearer-choice"/>
+  <mime-type type="application/vnd.uplanet.bearer-choice-wbxml"/>
+  <mime-type type="application/vnd.uplanet.cacheop"/>
+  <mime-type type="application/vnd.uplanet.cacheop-wbxml"/>
+  <mime-type type="application/vnd.uplanet.channel"/>
+  <mime-type type="application/vnd.uplanet.channel-wbxml"/>
+  <mime-type type="application/vnd.uplanet.list"/>
+  <mime-type type="application/vnd.uplanet.list-wbxml"/>
+  <mime-type type="application/vnd.uplanet.listcmd"/>
+  <mime-type type="application/vnd.uplanet.listcmd-wbxml"/>
+  <mime-type type="application/vnd.uplanet.signal"/>
+  <mime-type type="application/vnd.vcx">
+    <glob pattern="*.vcx"/>
+  </mime-type>
+  <mime-type type="application/vnd.vd-study"/>
+  <mime-type type="application/vnd.vectorworks"/>
+  <mime-type type="application/vnd.vidsoft.vidconference"/>
+
+  <!-- http://www.iana.org/assignments/media-types/application/vnd.visio -->
+  <mime-type type="application/vnd.visio">
+    <_comment>Microsoft Visio Diagram</_comment>
+    <glob pattern="*.vsd"/>
+    <glob pattern="*.vst"/>
+    <glob pattern="*.vss"/>
+    <glob pattern="*.vsw"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.visionary">
+    <glob pattern="*.vis"/>
+  </mime-type>
+  <mime-type type="application/vnd.vividence.scriptfile"/>
+  <mime-type type="application/vnd.vsf">
+    <glob pattern="*.vsf"/>
+  </mime-type>
+  <mime-type type="application/vnd.wap.sic"/>
+  <mime-type type="application/vnd.wap.slc"/>
+
+  <mime-type type="application/vnd.wap.wbxml">
+    <glob pattern="*.wbxml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.wap.wmlc">
+    <_comment>Compiled WML Document</_comment>
+    <glob pattern="*.wmlc"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.wap.wmlscriptc">
+    <_comment>Compiled WML Script</_comment>
+    <glob pattern="*.wmlsc"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.webturbo">
+    <glob pattern="*.wtb"/>
+  </mime-type>
+  <mime-type type="application/vnd.wfa.wsc"/>
+  <mime-type type="application/vnd.wmc"/>
+  <mime-type type="application/vnd.wmf.bootstrap"/>
+  <mime-type type="application/vnd.wordperfect">
+    <alias type="application/wordperfect"/>
+    <glob pattern="*.wpd"/>
+  </mime-type>
+  <mime-type type="application/vnd.wqd">
+    <glob pattern="*.wqd"/>
+  </mime-type>
+  <mime-type type="application/vnd.wrq-hp3000-labelled"/>
+  <mime-type type="application/vnd.wt.stf">
+    <glob pattern="*.stf"/>
+  </mime-type>
+  <mime-type type="application/vnd.wv.csp+wbxml"/>
+  <mime-type type="application/vnd.wv.csp+xml"/>
+  <mime-type type="application/vnd.wv.ssp+xml"/>
+  <mime-type type="application/vnd.xara">
+    <glob pattern="*.xar"/>
+  </mime-type>
+  <mime-type type="application/vnd.xfdl">
+    <glob pattern="*.xfdl"/>
+  </mime-type>
+  <mime-type type="application/vnd.xfdl.webform"/>
+  <mime-type type="application/vnd.xmi+xml"/>
+  <mime-type type="application/vnd.xmpie.cpkg"/>
+  <mime-type type="application/vnd.xmpie.dpkg"/>
+  <mime-type type="application/vnd.xmpie.plan"/>
+  <mime-type type="application/vnd.xmpie.ppkg"/>
+  <mime-type type="application/vnd.xmpie.xlim"/>
+  <mime-type type="application/vnd.yamaha.hv-dic">
+    <glob pattern="*.hvd"/>
+  </mime-type>
+  <mime-type type="application/vnd.yamaha.hv-script">
+    <glob pattern="*.hvs"/>
+  </mime-type>
+  <mime-type type="application/vnd.yamaha.hv-voice">
+    <glob pattern="*.hvp"/>
+  </mime-type>
+  <mime-type type="application/vnd.yamaha.openscoreformat">
+    <glob pattern="*.osf"/>
+  </mime-type>
+  <mime-type type="application/vnd.yamaha.openscoreformat.osfpvg+xml">
+    <glob pattern="*.osfpvg"/>
+  </mime-type>
+  <mime-type type="application/vnd.yamaha.smaf-audio">
+    <glob pattern="*.saf"/>
+  </mime-type>
+  <mime-type type="application/vnd.yamaha.smaf-phrase">
+    <glob pattern="*.spf"/>
+  </mime-type>
+  <mime-type type="application/vnd.yellowriver-custom-menu">
+    <glob pattern="*.cmp"/>
+  </mime-type>
+  <mime-type type="application/vnd.zul">
+    <glob pattern="*.zir"/>
+    <glob pattern="*.zirz"/>
+  </mime-type>
+  <mime-type type="application/vnd.zzazz.deck+xml">
+    <glob pattern="*.zaz"/>
+  </mime-type>
+  <mime-type type="application/voicexml+xml">
+    <glob pattern="*.vxml"/>
+  </mime-type>
+  <mime-type type="application/watcherinfo+xml"/>
+  <mime-type type="application/whoispp-query"/>
+  <mime-type type="application/whoispp-response"/>
+  <mime-type type="application/winhlp">
+    <glob pattern="*.hlp"/>
+  </mime-type>
+  <mime-type type="application/wita"/>
+  <mime-type type="application/wordperfect5.1"/>
+  <mime-type type="application/wsdl+xml">
+    <glob pattern="*.wsdl"/>
+  </mime-type>
+  <mime-type type="application/wspolicy+xml">
+    <glob pattern="*.wspolicy"/>
+  </mime-type>
+
+  <mime-type type="application/x-123">
+    <magic priority="50">
+      <match value="0x00001a00" type="big32" offset="0" />
+      <match value="0x00000200" type="big32" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-abiword">
+    <glob pattern="*.abw"/>
+  </mime-type>
+  <mime-type type="application/x-ace-compressed">
+    <glob pattern="*.ace"/>
+  </mime-type>
+
+  <mime-type type="application/x-adobe-indesign">
+    <acronym>INDD</acronym>
+    <_comment>Adobe InDesign document</_comment>
+    <glob pattern="*.indd"/>
+    <magic priority="50">
+      <match value="0x0606edf5d81d46e5bd31efe7fe74b71d" type="string" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-adobe-indesign-interchange">
+    <acronym>INX</acronym>
+    <_comment>Adobe InDesign Interchange format</_comment>
+    <magic priority="50">
+      <match value="&lt;?aid" type="string" offset="0:100"/>
+    </magic>
+    <glob pattern="*.inx"/>
+    <sub-class-of type="application/xml"/>
+  </mime-type>
+
+  <mime-type type="application/x-apple-diskimage">
+    <glob pattern="*.dmg"/>
+    <!-- <glob pattern="*.img"/> too generic -->
+    <!-- <glob pattern="*.smi"/> conflicts with SMIL -->
+  </mime-type>
+
+  <mime-type type="application/x-appleworks">
+    <glob pattern="*.cwk"/>
+  </mime-type>
+
+  <mime-type type="application/x-archive">
+    <alias type="application/x-unix-archive"/>
+    <magic priority="50">
+      <match value="=&lt;ar&gt;" type="string" offset="0"/>
+      <match value="!&lt;arch&gt;\n" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.ar"/>
+    <glob pattern="*.a"/>
+  </mime-type>
+
+  <mime-type type="application/x-arj">
+    <alias type="application/x-arj-compressed"/>
+    <magic priority="50">
+      <match value="0x60ea" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.arj"/>
+  </mime-type>
+
+  <mime-type type="application/x-authorware-bin">
+    <glob pattern="*.aab"/>
+    <glob pattern="*.x32"/>
+    <glob pattern="*.u32"/>
+    <glob pattern="*.vox"/>
+  </mime-type>
+  <mime-type type="application/x-authorware-map">
+    <glob pattern="*.aam"/>
+  </mime-type>
+  <mime-type type="application/x-authorware-seg">
+    <glob pattern="*.aas"/>
+  </mime-type>
+
+  <mime-type type="application/x-bcpio">
+    <glob pattern="*.bcpio"/>
+  </mime-type>
+
+  <mime-type type="application/x-berkeley-db">
+    <magic priority="50">
+      <match value="0x00061561" type="big32" offset="0"/>
+      <match value="0x00061561" type="host32" offset="12"/>
+      <match value="0x00061561" type="big32" offset="12"/>
+      <match value="0x00061561" type="little32" offset="12"/>
+      <match value="0x00053162" type="host32" offset="12"/>
+      <match value="0x00053162" type="big32" offset="12"/>
+      <match value="0x00053162" type="little32" offset="12"/>
+      <match value="0x00042253" type="host32" offset="12"/>
+      <match value="0x00042253" type="big32" offset="12"/>
+      <match value="0x00042253" type="little32" offset="12"/>
+      <match value="0x00040988" type="host32" offset="12"/>
+      <match value="0x00040988" type="little32" offset="12"/>
+      <match value="0x00040988" type="big32" offset="12"/>
+      <match value="0x00053162" type="host32" offset="0"/>
+      <match value="0x00053162" type="big32" offset="0"/>
+      <match value="0x00053162" type="little32" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-bibtex-text-file">
+    <magic priority="50">
+      <match value="%\ BibTeX\ `" type="string" offset="0"/>
+      <match value="%%%\ \ " type="string" offset="73"/>
+      <match value="%\ BibTeX\ standard\ bibliography\ " type="string" offset="0"/>
+      <match value="%%%\ \ @BibTeX-style-file{" type="string" offset="73"/>
+      <match value="@article{" type="string" offset="0"/>
+      <match value="@book{" type="string" offset="0"/>
+      <match value="@inbook{" type="string" offset="0"/>
+      <match value="@incollection{" type="string" offset="0"/>
+      <match value="@inproceedings{" type="string" offset="0"/>
+      <match value="@manual{" type="string" offset="0"/>
+      <match value="@misc{" type="string" offset="0"/>
+      <match value="@preamble{" type="string" offset="0"/>
+      <match value="@phdthesis{" type="string" offset="0"/>
+      <match value="@techreport{" type="string" offset="0"/>
+      <match value="@unpublished{" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.bib"/>
+    <glob pattern="*.bibtex"/>
+  </mime-type>
+
+  <mime-type type="application/x-bittorrent">
+    <magic priority="50">
+      <match value="d8:announce" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.torrent"/>
+  </mime-type>
+
+  <mime-type type="application/x-bplist">
+    <!-- The priority is 60, as .webarchive files often contain
+         (X)HTML content. The bplist magic must trump the XHTML
+         magics further within the file. This must also be
+         independent of the internal ordering of patterns within
+         MimeTypes -->
+    <magic priority="60">
+      <match value="bplist" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-bzip">
+    <magic priority="40">
+      <match value="BZh" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.bz"/>
+    <glob pattern="*.tbz"/>
+  </mime-type>
+
+  <mime-type type="application/x-bzip2">
+    <sub-class-of type="application/x-bzip"/>
+    <_comment>Bzip 2 UNIX Compressed File</_comment>
+    <magic priority="40">
+      <match value="\x42\x5a\x68\x39\x31" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.bz2"/>
+    <glob pattern="*.tbz2"/>
+    <glob pattern="*.boz"/>
+  </mime-type>
+
+  <mime-type type="application/x-cdlink">
+    <_comment>Virtual CD-ROM CD Image File</_comment>
+    <glob pattern="*.vcd"/>
+  </mime-type>
+
+  <mime-type type="application/x-chat">
+    <glob pattern="*.chat"/>
+  </mime-type>
+
+  <mime-type type="application/x-chess-pgn">
+    <glob pattern="*.pgn"/>
+  </mime-type>
+
+  <mime-type type="application/x-chrome-package">
+    <acronym>CRX</acronym>
+    <_comment>Chrome Extension Package</_comment>
+    <tika:link>https://developer.chrome.com/extensions/crx</tika:link>
+    <magic priority="50">
+      <match value="Cr24" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.crx"/>
+  </mime-type>
+
+  <mime-type type="application/x-compress">
+    <magic priority="50">
+      <match value="\037\235" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.z"/>
+  </mime-type>
+
+  <mime-type type="application/x-corelpresentations">
+    <glob pattern="*.shw"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/x-cpio">
+    <_comment>UNIX CPIO Archive</_comment>
+    <magic priority="50">
+      <match value="070707" type="little16" offset="0"/>
+      <match value="070707" type="big16" offset="0"/>
+      <match value="070707" type="string" offset="0"/>
+      <match value="070701" type="string" offset="0"/>
+      <match value="070702" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.cpio"/>
+  </mime-type>
+
+  <mime-type type="application/x-csh">
+    <glob pattern="*.csh"/>
+    <glob pattern="*.tcsh"/>
+  </mime-type>
+
+  <mime-type type="application/x-debian-package">
+    <sub-class-of type="application/x-archive"/>
+    <magic priority="60">
+      <match value="!&lt;arch&gt;\ndebian-binary" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.deb"/>
+    <glob pattern="*.udeb"/>
+  </mime-type>
+
+  <mime-type type="application/x-dex">
+    <acronym>DEX</acronym>
+    <_comment>Dalvik Executable Format</_comment>
+    <tika:link>http://source.android.com/devices/tech/dalvik/dex-format.html</tika:link>
+    <magic priority="50">
+      <match value="dex\n" type="string" offset="0">
+        <match value="\0" type="string" offset="7"/>
+      </match>
+    </magic>
+    <glob pattern="*.dex"/>
+  </mime-type>
+
+  <mime-type type="application/x-director">
+    <_comment>Shockwave Movie</_comment>
+    <glob pattern="*.dir"/>
+    <glob pattern="*.dcr"/>
+    <glob pattern="*.dxr"/>
+    <glob pattern="*.cst"/>
+    <glob pattern="*.cct"/>
+    <glob pattern="*.cxt"/>
+    <glob pattern="*.w3d"/>
+    <glob pattern="*.fgd"/>
+    <glob pattern="*.swa"/>
+  </mime-type>
+
+  <mime-type type="application/x-doom">
+    <glob pattern="*.wad"/>
+  </mime-type>
+  <mime-type type="application/x-dtbncx+xml">
+    <glob pattern="*.ncx"/>
+  </mime-type>
+  <mime-type type="application/x-dtbook+xml">
+    <glob pattern="*.dtb"/>
+  </mime-type>
+  <mime-type type="application/x-dtbresource+xml">
+    <glob pattern="*.res"/>
+  </mime-type>
+
+  <mime-type type="application/x-dvi">
+    <_comment>TeX Device Independent Document</_comment>
+    <magic priority="50">
+      <match value="\367\002" type="string" offset="0"/>
+      <match value="0x02f7" type="little16" offset="0"/>
+      <match value="\x1b\x20\x54\x65\x58\x20\x6f\x75\x74\x70\x75\x74\x20"
+             type="string" offset="14"/>
+    </magic>
+    <glob pattern="*.dvi"/>
+  </mime-type>
+
+  <mime-type type="application/x-elc">
+    <_comment>Emacs Lisp bytecode</_comment>
+    <magic priority="50">
+      <!-- Emacs 18 -->
+      <match value="\012(" type="string" offset="0" />
+      <!-- Emacs 19 -->
+      <match value=";ELC\023\000\000\000" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.elc"/>
+  </mime-type>
+
+  <mime-type type="application/x-elf">
+    <magic priority="50">
+      <match value="\177ELF" type="string" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="message/x-emlx">
+    <magic priority="70">
+      <match value="\nRelay-Version:" type="string" offset="2:9"/>
+      <match value="\n#!\ rnews" type="string" offset="2:9"/>
+      <match value="\nN#!\ rnews" type="string" offset="2:9"/>
+      <match value="\nForward\ to" type="string" offset="2:9"/>
+      <match value="\nPipe\ to" type="string" offset="2:9"/>
+      <match value="\nReturn-Path:" type="string" offset="2:9"/>
+      <match value="\nFrom:" type="string" offset="2:9"/>
+      <match value="\nReceived:" type="string" offset="2:9"/>
+      <match value="\nMessage-ID:" type="string" offset="2:9"/>
+      <match value="\nDate:" type="string" offset="2:9"/>
+    </magic>
+    <glob pattern="*.emlx"/>
+  </mime-type>
+
+  <mime-type type="application/x-killustrator">
+    <_comment>KIllustrator File</_comment>
+    <glob pattern="*.kil"/>
+  </mime-type>
+
+  <mime-type type="application/x-object">
+    <sub-class-of type="application/x-elf"/>
+    <magic priority="50">
+      <match value="\177ELF" type="string" offset="0">
+        <match value="0x0100" type="string" offset="16"/>
+        <match value="0x0001" type="string" offset="16"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-executable">
+    <sub-class-of type="application/x-elf"/>
+    <magic priority="50">
+      <match value="\177ELF" type="string" offset="0">
+        <match value="0x0200" type="string" offset="16"/>
+        <match value="0x0002" type="string" offset="16"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-sharedlib">
+    <sub-class-of type="application/x-elf"/>
+    <magic priority="50">
+      <match value="\177ELF" type="string" offset="0">
+        <match value="0x0300" type="string" offset="16"/>
+        <match value="0x0003" type="string" offset="16"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-coredump">
+    <sub-class-of type="application/x-elf"/>
+    <magic priority="50">
+      <match value="\177ELF" type="string" offset="0">
+        <match value="0x0400" type="string" offset="16"/>
+        <match value="0x0004" type="string" offset="16"/>
+      </match>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-dosexec">
+    <_comment>DOS/Windows executable (EXE)</_comment>
+    <sub-class-of type="application/x-msdownload"/>
+    <glob pattern="*.exe"/>
+  </mime-type>
+
+  <mime-type type="application/x-emf">
+    <acronym>EMF</acronym>
+    <_comment>Extended Metafile</_comment>
+    <glob pattern="*.emf"/>
+    <magic priority="50">
+      <match value="0x01000000" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-filemaker">
+    <acronym>FP7</acronym>
+    <_comment>FileMaker Pro 7</_comment>
+    <magic priority="50">
+      <match value="0xC04842414D37" type="string" offset="14" >
+      <match value="0x4842414D323130314F43543939C102480750726F20372E30C0C0" type="string" offset="525" />
+    </match>
+    </magic>
+    <glob pattern="*.fp7" />
+  </mime-type>
+
+  <mime-type type="application/x-font-bdf">
+    <glob pattern="*.bdf"/>
+  </mime-type>
+  <mime-type type="application/x-font-dos"/>
+  <mime-type type="application/x-font-framemaker"/>
+  <mime-type type="application/x-font-ghostscript">
+    <glob pattern="*.gsf"/>
+  </mime-type>
+  <mime-type type="application/x-font-libgrx"/>
+  <mime-type type="application/x-font-linux-psf">
+    <glob pattern="*.psf"/>
+  </mime-type>
+
+  <mime-type type="application/x-font-otf">
+    <acronym>OTF</acronym>
+    <_comment>OpenType Font</_comment>
+    <glob pattern="*.otf"/>
+  </mime-type>
+
+  <mime-type type="application/x-font-pcf">
+    <glob pattern="*.pcf"/>
+  </mime-type>
+  <mime-type type="application/x-font-snf">
+    <glob pattern="*.snf"/>
+  </mime-type>
+  <mime-type type="application/x-font-speedo"/>
+  <mime-type type="application/x-font-sunos-news"/>
+
+  <mime-type type="application/x-font-ttf">
+    <acronym>TTF</acronym>
+    <_comment>TrueType Font</_comment>
+    <glob pattern="*.ttf"/>
+    <glob pattern="*.ttc"/>
+    <magic priority="40">
+      <match value="0x00010000" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-font-type1">
+    <glob pattern="*.pfa"/>
+    <glob pattern="*.pfb"/>
+    <magic priority="60">
+      <!-- Match for PFB, the binary format -->
+      <match value="\x80\x01\xFF\xFF\x00\x00%!PS-AdobeFont" type="string"
+              mask="0xFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" offset="0"/>
+      <!-- Match for PFA, the text format" -->
+      <match value="%!PS-AdobeFont-1.0" type="string" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-font-adobe-metric">
+    <_comment>Adobe Font Metric</_comment>
+    <glob pattern="*.afm"/>
+    <glob pattern="*.acfm"/>
+    <glob pattern="*.amfm"/>
+    <magic priority="40">
+      <match value="StartFontMetrics" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-font-printer-metric">
+    <_comment>Printer Font Metric</_comment>
+    <glob pattern="*.pfm"/>
+    <magic priority="40">
+      <match value="0x0001FFFF0000436f707972" type="string" offset="0"
+              mask="0xFFFF0000FFFFFFFFFFFFFF" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-font-vfont"/>
+
+  <mime-type type="application/x-foxmail">
+    <_comment>Foxmail Email File</_comment>
+    <magic>
+      <match value="0x1010101010101011111111111153" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-futuresplash">
+    <_comment>Macromedia FutureSplash File</_comment>
+    <glob pattern="*.spl"/>
+  </mime-type>
+
+  <mime-type type="application/x-gnucash">
+    <glob pattern="*.gnucash" />
+  </mime-type>
+
+  <mime-type type="application/x-gnumeric">
+    <alias type="application/x-Gnumeric-spreadsheet"/>
+    <magic priority="50">
+      <match value="=&lt;gmr:Workbook" type="string" offset="39" />
+    </magic>
+    <glob pattern="*.gnumeric"/>
+  </mime-type>
+
+  <mime-type type="application/x-gtar">
+    <_comment>GNU tar Compressed File Archive (GNU Tape Archive)</_comment>
+    <magic priority="50">
+      <!-- GNU tar archive -->
+      <match value="ustar  \0" type="string" offset="257" />
+    </magic>
+    <glob pattern="*.gtar"/>
+    <sub-class-of type="application/x-tar"/>
+  </mime-type>
+
+  <mime-type type="application/gzip">
+    <_comment>Gzip Compressed Archive</_comment>
+    <alias type="application/x-gzip"/>
+    <alias type="application/x-gunzip"/>
+    <alias type="application/gzip-compressed"/>
+    <alias type="application/gzipped"/>
+    <alias type="application/gzip-compressed"/>
+    <alias type="application/x-gzip-compressed"/>
+    <alias type="gzip/document"/>
+    <magic priority="45">
+      <match value="\037\213" type="string" offset="0" />
+      <match value="\x1f\x8b" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.tgz" />
+    <glob pattern="*.gz" />
+    <glob pattern="*-gz" />
+    <glob pattern="*.emz" />
+  </mime-type>
+
+  <mime-type type="application/x-hdf">
+    <_comment>Hierarchical Data Format File</_comment>
+    <magic priority="50">
+      <!-- HDF4 -->
+      <match value="0x0e031301" type="big32" offset="0"/>
+      <!-- HDF5 -->
+      <match value="\211HDF\r\n\032" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.hdf"/>
+    <glob pattern="*.he5"/>
+    <glob pattern="*.h5"/>
+  </mime-type>
+
+  <mime-type type="application/x-hwp">
+    <magic priority="50">
+      <!--
+        TIKA-330: Detection pattern based on signature strings from
+        the hwpfilter/source/hwpfile.cpp file in OpenOffice.org.
+      -->
+      <match value="HWP Document File V" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-ibooks+zip">
+    <sub-class-of type="application/epub+zip" />
+    <acronym>iBooks</acronym>
+    <_comment>Apple iBooks Author publication format</_comment>
+    <magic priority="50">
+      <match value="PK\003\004" type="string" offset="0">
+        <match value="mimetypeapplication/x-ibooks+zip" type="string" offset="30"/>
+      </match>
+    </magic>
+    <glob pattern="*.ibooks"/>
+  </mime-type>
+
+  <mime-type type="application/x-iso9660-image">
+    <acronym>ISO</acronym>
+    <_comment>ISO 9660 CD-ROM filesystem data</_comment>
+    <magic priority="50">
+      <match value="CD001" type="string" offset="32769"/>
+      <match value="CD001" type="string" offset="34817"/>
+      <match value="CD001" type="string" offset="36865"/>
+    </magic>
+    <glob pattern="*.iso"/>
+  </mime-type>
+
+  <mime-type type="application/x-itunes-ipa">
+    <sub-class-of type="application/zip"/>
+    <_comment>Apple iOS IPA AppStore file</_comment>
+    <glob pattern="*.ipa"/>
+  </mime-type>
+
+  <mime-type type="application/x-java-jnlp-file">
+    <glob pattern="*.jnlp"/>
+  </mime-type>
+
+  <mime-type type="application/x-java-pack200">
+    <glob pattern="*.pack"/>
+  </mime-type>
+
+  <mime-type type="application/x-kdelnk">
+    <magic priority="50">
+      <match value="[KDE\ Desktop\ Entry]" type="string" offset="0"/>
+      <match value="#\ KDE\ Config\ File" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-latex">
+    <_comment>LaTeX Source Document</_comment>
+    <magic priority="50">
+      <match value="%\ -*-latex-*-" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.latex"/>
+    <sub-class-of type="application/x-tex"/>
+  </mime-type>
+
+  <mime-type type="application/x-lha">
+    <magic priority="50">
+      <match value="-lzs-" type="string" offset="2"/>
+      <match value="-lh\40-" type="string" offset="2"/>
+      <match value="-lhd-" type="string" offset="2"/>
+      <match value="-lh2-" type="string" offset="2"/>
+      <match value="-lh3-" type="string" offset="2"/>
+      <match value="-lh4-" type="string" offset="2"/>
+      <match value="-lh5-" type="string" offset="2"/>
+      <match value="-lh6-" type="string" offset="2"/>
+      <match value="-lh7-" type="string" offset="2"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-lharc">
+    <magic priority="50">
+      <match value="-lh0-" type="string" offset="2"/>
+      <match value="-lh1-" type="string" offset="2"/>
+      <match value="-lz4-" type="string" offset="2"/>
+      <match value="-lz5-" type="string" offset="2"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-mobipocket-ebook">
+    <glob pattern="*.prc"/>
+    <glob pattern="*.mobi"/>
+  </mime-type>
+  <mime-type type="application/x-ms-application">
+    <glob pattern="*.application"/>
+  </mime-type>
+  <mime-type type="application/x-ms-wmd">
+    <glob pattern="*.wmd"/>
+  </mime-type>
+  <mime-type type="application/x-ms-wmz">
+    <sub-class-of type="application/x-gzip"/>
+    <glob pattern="*.wmz"/>
+  </mime-type>
+  <mime-type type="application/x-ms-xbap">
+    <glob pattern="*.xbap"/>
+  </mime-type>
+  <mime-type type="application/x-msaccess">
+    <glob pattern="*.mdb"/>
+    <magic priority="60">
+      <match value="0x000100005374616e" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-msbinder">
+    <glob pattern="*.obd"/>
+  </mime-type>
+  <mime-type type="application/x-mscardfile">
+    <glob pattern="*.crd"/>
+  </mime-type>
+  <mime-type type="application/x-msclip">
+    <glob pattern="*.clp"/>
+  </mime-type>
+
+  <mime-type type="application/x-msdownload">
+    <glob pattern="*.dll"/>
+    <glob pattern="*.com"/>
+    <glob pattern="*.bat"/>
+    <glob pattern="*.msi"/>
+    <magic priority="50">
+      <match value="MZ" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-msdownload;format=pe">
+    <sub-class-of type="application/x-msdownload"/>
+    <magic priority="55">
+      <!-- Technically the header offset is stored at 0x3c, and isn't a -->
+      <!-- constant, but it's almost always set to start at 0x80 or 0xf0 -->
+      <match value="PE\000\000" type="string" offset="128"/>
+      <match value="PE\000\000" type="string" offset="240"/>
+    </magic>
+  </mime-type>
+  <!-- the PE header should be PEx00x00 then a two byte machine type -->
+  <mime-type type="application/x-msdownload;format=pe32">
+    <sub-class-of type="application/x-msdownload;format=pe"/>
+    <magic priority="60">
+      <match value="PE\000\000" type="string" offset="128">
+         <match value="0x014c" type="little16" offset="132"/>
+      </match>
+      <match value="PE\000\000" type="string" offset="240">
+         <match value="0x014c" type="little16" offset="244"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-msdownload;format=pe64">
+    <sub-class-of type="application/x-msdownload;format=pe"/>
+    <magic priority="60">
+      <match value="PE\000\000" type="string" offset="128">
+         <match value="0x8664" type="little16" offset="132"/>
+      </match>
+      <match value="PE\000\000" type="string" offset="240">
+         <match value="0x8664" type="little16" offset="244"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-msdownload;format=pe-itanium">
+    <sub-class-of type="application/x-msdownload;format=pe"/>
+    <magic priority="60">
+      <match value="PE\000\000" type="string" offset="128">
+         <match value="0x0200" type="little16" offset="132"/>
+      </match>
+      <match value="PE\000\000" type="string" offset="240">
+         <match value="0x0200" type="little16" offset="244"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-msdownload;format=pe-armLE">
+    <sub-class-of type="application/x-msdownload;format=pe"/>
+    <magic priority="60">
+      <match value="pe\000\000" type="string" offset="128">
+         <match value="0x01c0" type="little16" offset="132"/>
+      </match>
+      <match value="pe\000\000" type="string" offset="240">
+         <match value="0x01c0" type="little16" offset="244"/>
+      </match>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-msdownload;format=pe-arm7">
+    <sub-class-of type="application/x-msdownload;format=pe"/>
+    <magic priority="60">
+      <match value="pe\000\000" type="string" offset="128">
+         <match value="0x01c4" type="little16" offset="132"/>
+      </match>
+      <match value="pe\000\000" type="string" offset="240">
+         <match value="0x01c4" type="little16" offset="244"/>
+      </match>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-msmediaview">
+    <glob pattern="*.mvb"/>
+    <glob pattern="*.m13"/>
+    <glob pattern="*.m14"/>
+  </mime-type>
+  <mime-type type="application/x-msmetafile">
+    <alias type="image/x-wmf"/>
+    <acronym>WMF</acronym>
+    <_comment>Windows Metafile</_comment>
+    <glob pattern="*.wmf"/>
+    <magic priority="50">
+      <match value="0xd7cdc69a0000" type="string" offset="0"/>
+      <match value="0x010009000003" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-msmoney">
+    <glob pattern="*.mny"/>
+    <magic priority="60">
+      <match value="0x000100004D534953414D204461746162617365" type="string" offset="0" />
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-mspublisher">
+    <glob pattern="*.pub"/>
+  </mime-type>
+  <mime-type type="application/x-msschedule">
+    <glob pattern="*.scd"/>
+  </mime-type>
+  <mime-type type="application/x-msterminal">
+    <glob pattern="*.trm"/>
+  </mime-type>
+  <mime-type type="application/x-mswrite">
+    <glob pattern="*.wri"/>
+  </mime-type>
+  <mime-type type="application/x-netcdf">
+    <glob pattern="*.nc"/>
+    <glob pattern="*.cdf"/>
+  </mime-type>
+  <mime-type type="application/x-pkcs12">
+    <glob pattern="*.p12"/>
+    <glob pattern="*.pfx"/>
+  </mime-type>
+  <mime-type type="application/x-pkcs7-certificates">
+    <glob pattern="*.p7b"/>
+    <glob pattern="*.spc"/>
+  </mime-type>
+  <mime-type type="application/x-pkcs7-certreqresp">
+    <glob pattern="*.p7r"/>
+  </mime-type>
+
+  <mime-type type="application/x-prt">
+    <glob pattern="*.prt"/>
+    <magic priority="50">
+      <match value="0M3C" type="string" offset="8" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-quattro-pro">
+    <glob pattern="*.qpw"/>
+    <glob pattern="*.wb1"/>
+    <glob pattern="*.wb2"/>
+    <glob pattern="*.wb3"/>
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/x-rar-compressed">
+    <_comment>RAR archive</_comment>
+    <alias type="application/x-rar"/>
+    <magic priority="50">
+      <match value="Rar!" type="string" offset="0"/>
+      <match value="\x52\x61\x72\x21\x1a" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.rar"/>
+  </mime-type>
+
+  <mime-type type="application/x-roxio-toast">
+    <glob pattern="*.toast"/>
+    <sub-class-of type="application/x-iso9660-image"/>
+  </mime-type>
+
+  <mime-type type="application/x-rpm">
+    <_comment>RedHat Package Manager</_comment>
+    <glob pattern="*.rpm"/>
+    <magic priority="50">
+      <match value="\xed\xab\xee\xdb" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-sas">
+    <_comment>SAS Program</_comment>
+    <glob pattern="*.sas"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+  <mime-type type="application/x-sas-program-data">
+    <_comment>SAS Stored Program (DATA Step)</_comment>
+    <glob pattern="*.ss7"/>
+    <glob pattern="*.sas7bpgm"/>
+  </mime-type>
+  <mime-type type="application/x-sas-audit">
+    <_comment>SAS Audit</_comment>
+    <glob pattern="*.st7"/>
+    <glob pattern="*.sas7baud"/>
+  </mime-type>
+  <mime-type type="application/x-sas-data">
+    <_comment>SAS Data Set</_comment>
+    <glob pattern="*.sd7"/>
+    <glob pattern="*.sas7bdat"/>
+    <magic priority="40">
+      <match value="SAS FILE" type="string" offset="84" />
+    </magic>
+  </mime-type>
+  <mime-type type="application/x-sas-view">
+    <_comment>SAS Data Set View</_comment>
+    <glob pattern="*.sv7"/>
+    <glob pattern="*.sas7bvew"/>
+  </mime-type>
+  <mime-type type="application/x-sas-data-index">
+    <_comment>SAS Data Set Index</_comment>
+    <glob pattern="*.si7"/>
+    <glob pattern="*.sas7bndx"/>
+  </mime-type>
+  <mime-type type="application/x-sas-catalog">
+    <_comment>SAS Catalog</_comment>
+    <glob pattern="*.sc7"/>
+    <glob pattern="*.sas7bcat"/>
+  </mime-type>
+  <mime-type type="application/x-sas-access">
+    <_comment>SAS Access Descriptor</_comment>
+    <glob pattern="*.sa7"/>
+    <glob pattern="*.sas7bacs"/>
+  </mime-type>
+  <mime-type type="application/x-sas-fdb">
+    <_comment>SAS FDB Consolidation Database File</_comment>
+    <glob pattern="*.sf7"/>
+    <glob pattern="*.sas7bfdb"/>
+  </mime-type>
+  <mime-type type="application/x-sas-mddb">
+    <_comment>SAS MDDB Multi-Dimensional Database File</_comment>
+    <glob pattern="*.sm7"/>
+    <glob pattern="*.sas7bmdb"/>
+  </mime-type>
+  <mime-type type="application/x-sas-dmdb">
+    <_comment>SAS DMDB Data Mining Database File</_comment>
+    <glob pattern="*.s7m"/>
+    <glob pattern="*.sas7bdmd"/>
+  </mime-type>
+  <mime-type type="application/x-sas-itemstor">
+    <_comment>SAS Item Store (ItemStor) File</_comment>
+    <glob pattern="*.sr7"/>
+    <glob pattern="*.sas7bitm"/>
+  </mime-type>
+  <mime-type type="application/x-sas-utility">
+    <_comment>SAS Utility</_comment>
+    <glob pattern="*.su7"/>
+    <glob pattern="*.sas7butl"/>
+  </mime-type>
+  <mime-type type="application/x-sas-putility">
+    <_comment>SAS Permanent Utility</_comment>
+    <glob pattern="*.sp7"/>
+    <glob pattern="*.sas7bput"/>
+  </mime-type>
+  <mime-type type="application/x-sas-transport">
+    <_comment>SAS Transport File</_comment>
+    <glob pattern="*.stx"/>
+  </mime-type>
+  <mime-type type="application/x-sas-backup">
+    <_comment>SAS Backup</_comment>
+    <glob pattern="*.sas7bbak"/>
+  </mime-type>
+
+  <mime-type type="application/x-sc">
+    <magic priority="50">
+      <match value="Spreadsheet" type="string" offset="38"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-sh">
+    <_comment>UNIX/LINUX Shell Script</_comment>
+    <magic priority="50">
+      <match value="#!/" type="string" offset="0"/>
+      <match value="#!\ /" type="string" offset="0"/>
+      <match value="#!\t/" type="string" offset="0"/>
+      <match value="eval &quot;exec" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.sh"/>
+    <glob pattern="*.bash"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="application/x-shar">
+    <glob pattern="*.shar"/>
+  </mime-type>
+
+  <mime-type type="application/x-shockwave-flash">
+    <acronym>Flash</acronym>
+    <_comment>Adobe Flash</_comment>
+    <magic priority="50">
+      <match value="FWS" type="string" offset="0"/> <!-- F = Uncompressed -->
+      <match value="CWS" type="string" offset="0"/> <!-- C = Compressed   -->
+    </magic>
+    <glob pattern="*.swf"/>
+  </mime-type>
+
+  <mime-type type="application/x-silverlight-app">
+    <glob pattern="*.xap"/>
+  </mime-type>
+
+  <mime-type type="application/x-stuffit">
+    <magic priority="50">
+      <match value="StuffIt" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.sit"/>
+  </mime-type>
+
+  <mime-type type="application/x-stuffitx">
+    <glob pattern="*.sitx"/>
+  </mime-type>
+  <mime-type type="application/x-sv4cpio">
+    <glob pattern="*.sv4cpio"/>
+  </mime-type>
+  <mime-type type="application/x-sv4crc">
+    <glob pattern="*.sv4crc"/>
+  </mime-type>
+
+  <mime-type type="application/x-tar">
+    <magic priority="40">
+      <!-- POSIX tar archive -->
+      <match value="ustar\0" type="string" offset="257" />
+    </magic>
+    <glob pattern="*.tar"/>
+  </mime-type>
+
+  <mime-type type="application/x-tex">
+    <_comment>TeX Source</_comment>
+    <alias type="text/x-tex"/>
+    <magic priority="50">
+      <match value="\\input" type="string" offset="0"/>
+      <match value="\\section" type="string" offset="0"/>
+      <match value="\\setlength" type="string" offset="0"/>
+      <match value="\\documentstyle" type="string" offset="0"/>
+      <match value="\\chapter" type="string" offset="0"/>
+      <match value="\\documentclass" type="string" offset="0"/>
+      <match value="\\relax" type="string" offset="0"/>
+      <match value="\\contentsline" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.tex"/>
+  </mime-type>
+
+  <mime-type type="application/x-tex-tfm">
+    <glob pattern="*.tfm"/>
+  </mime-type>
+
+  <mime-type type="application/x-texinfo">
+    <alias type="text/x-texinfo" />
+    <magic priority="50">
+      <match value="\\input\ texinfo" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.texinfo"/>
+    <glob pattern="*.texi"/>
+  </mime-type>
+
+  <!-- =================================================================== -->
+  <!-- Microsoft Office binary file formats                                -->
+  <!-- http://www.microsoft.com/interop/docs/OfficeBinaryFormats.mspx      -->
+  <!-- =================================================================== -->
+  <mime-type type="application/x-tika-msoffice">
+    <magic priority="40">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-tika-msoffice-embedded">
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+  <mime-type type="application/x-tika-msoffice-embedded;format=ole10_native">
+    <sub-class-of type="application/x-tika-msoffice-embedded"/>
+    <_comment>OLE10 Native Embedded Document</_comment>
+  </mime-type>
+  <mime-type type="application/x-tika-msoffice-embedded;format=comp_obj">
+    <sub-class-of type="application/x-tika-msoffice-embedded"/>
+    <_comment>CompObj OLE2 Embedded Document</_comment>
+  </mime-type>
+
+  <mime-type type="application/x-tika-msworks-spreadsheet">
+    <glob pattern="*.xlr"/>
+    <sub-class-of type="application/vnd.ms-excel"/>
+    <!-- this has to be highter than the Excel match -->
+    <magic priority="60">
+      <match value="0xd0cf11e0a1b11ae1" type="string" offset="0:8">
+         <match value="W\x00k\x00s\x00S\x00S\x00W\x00o\x00r\x00k\x00B\x00o\x00o\x00k" type="string" offset="1152:4096" />
+      </match>
+    </magic>
+  </mime-type>
+
+  <!-- =================================================================== -->
+  <!-- Office Open XML file formats                                        -->
+  <!-- http://www.ecma-international.org/publications/standards/Ecma-376.htm -->
+  <!-- =================================================================== -->
+  <mime-type type="application/x-tika-ooxml">
+    <sub-class-of type="application/zip"/>
+    <magic priority="50">
+      <match value="PK\003\004" type="string" offset="0">
+        <match value="[Content_Types].xml" type="string" offset="30"/>
+      </match>
+    </magic>
+  </mime-type>
+
+  <!-- Note - password protected OOXML files are actually stored in -->
+  <!--  an OLE2 (application/x-tika-msoffice) container -->
+  <mime-type type="application/x-tika-ooxml-protected">
+    <sub-class-of type="application/x-tika-ooxml"/>
+    <_comment>Password Protected OOXML File</_comment>
+  </mime-type>
+
+  <!-- Older StarOffice formats extend up the Microsoft OLE2 format -->
+  <mime-type type="application/x-tika-staroffice">
+    <sub-class-of type="application/x-tika-msoffice"/>
+  </mime-type>
+
+  <mime-type type="application/x-uc2-compressed">
+    <magic priority="50">
+      <match value="UC2\x1a" type="string" offset="0" />
+    </magic>
+    <glob pattern="*.uc2"/>
+  </mime-type>
+  <mime-type type="application/x-ustar">
+    <glob pattern="*.ustar"/>
+  </mime-type>
+
+  <mime-type type="application/x-vmdk">
+    <acronym>VMDK</acronym>
+    <_comment>Virtual Disk Format</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/VMDK</tika:link>
+    <glob pattern="*.vmdk"/>
+  </mime-type>
+
+  <mime-type type="application/x-wais-source">
+    <glob pattern="*.src"/>
+  </mime-type>
+  <mime-type type="application/x-webarchive">
+    <sub-class-of type="application/x-bplist"/>
+    <glob pattern="*.webarchive"/>
+  </mime-type>
+  <mime-type type="application/x-x509-ca-cert">
+    <glob pattern="*.der"/>
+    <glob pattern="*.crt"/>
+  </mime-type>
+  <mime-type type="application/x-xfig">
+    <glob pattern="*.fig"/>
+  </mime-type>
+  <mime-type type="application/x-xpinstall">
+    <glob pattern="*.xpi"/>
+  </mime-type>
+
+  <mime-type type="application/x-xmind">
+    <_comment>XMind Pro</_comment>
+    <sub-class-of type="application/zip"/>
+    <glob pattern="*.xmind"/>
+    <!-- .xmap is also used, but that extension is more common elsewhere -->
+<!-- <glob pattern="*.xmap"/> -->
+  </mime-type>
+
+  <mime-type type="application/x-xz">
+    <glob pattern="*.xz"/>
+    <magic priority="50">
+      <match value="\3757zXZ\000" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="application/x-zoo">
+    <magic priority="50">
+      <match value="0xfdc4a7dc" type="little32" offset="20"/>
+    </magic>
+    <glob pattern="*.zoo"/>
+  </mime-type>
+
+  <mime-type type="application/x400-bp"/>
+  <mime-type type="application/xcap-att+xml"/>
+  <mime-type type="application/xcap-caps+xml"/>
+  <mime-type type="application/xcap-el+xml"/>
+  <mime-type type="application/xcap-error+xml"/>
+  <mime-type type="application/xcap-ns+xml"/>
+  <mime-type type="application/xcon-conference-info-diff+xml"/>
+  <mime-type type="application/xcon-conference-info+xml"/>
+  <mime-type type="application/xenc+xml">
+    <glob pattern="*.xenc"/>
+  </mime-type>
+
+  <mime-type type="application/xhtml+xml">
+    <magic priority="50">
+      <match value="&lt;html xmlns=" type="string" offset="0:8192"/>
+    </magic>
+    <root-XML namespaceURI="http://www.w3.org/1999/xhtml" localName="html"/>
+    <glob pattern="*.xhtml"/>
+    <glob pattern="*.xht"/>
+  </mime-type>
+
+  <mime-type type="application/xhtml-voice+xml"/>
+
+  <mime-type type="application/xml">
+    <acronym>XML</acronym>
+    <_comment>Extensible Markup Language</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/Xml</tika:link>
+    <tika:uti>public.xml</tika:uti>
+    <alias type="text/xml"/>
+    <alias type="application/x-xml"/>
+    <magic priority="50">
+      <match value="&lt;?xml" type="string" offset="0"/>
+      <match value="&lt;?XML" type="string" offset="0"/>
+      <match value="&lt;!--" type="string" offset="0"/>
+      <!-- UTF-8 BOM -->
+      <match value="0xEFBBBF3C3F786D6C" type="string" offset="0"/>
+      <!-- UTF-16 LE/BE -->
+      <match value="0xFFFE3C003F0078006D006C00" type="string" offset="0"/>
+      <match value="0xFEFF003C003F0078006D006C" type="string" offset="0"/>
+      <!-- TODO: Add matches for the other possible XML encoding schemes -->
+    </magic>
+    <glob pattern="*.xml"/>
+    <glob pattern="*.xsl"/>
+    <glob pattern="*.xsd"/>
+    <sub-class-of type="text/plain" />
+  </mime-type>
+
+  <mime-type type="application/xml-dtd">
+    <_comment>XML Document Type Definition</_comment>
+    <sub-class-of type="text/plain"/>
+    <alias type="text/x-dtd"/>
+    <glob pattern="*.dtd"/>
+  </mime-type>
+
+  <mime-type type="application/xml-external-parsed-entity">
+    <alias type="text/xml-external-parsed-entity"/>
+  </mime-type>
+
+  <mime-type type="application/xmpp+xml"/>
+  <mime-type type="application/xop+xml">
+    <glob pattern="*.xop"/>
+  </mime-type>
+
+ <mime-type type="application/xslfo+xml">
+    <alias type="text/xsl"/>
+    <acronym>XSLFO</acronym>
+    <_comment>XSL Format</_comment>
+    <root-XML localName="root"
+              namespaceURI="http://www.w3.org/1999/XSL/Format"/>
+    <glob pattern="*.xslfo"/>
+    <glob pattern="*.fo"/>
+  </mime-type>
+
+  <mime-type type="application/xslt+xml">
+    <alias type="text/xsl"/>
+    <acronym>XSLT</acronym>
+    <_comment>XSL Transformations</_comment>
+    <root-XML localName="stylesheet"
+              namespaceURI="http://www.w3.org/1999/XSL/Transform"/>
+    <glob pattern="*.xslt"/>
+  </mime-type>
+
+  <mime-type type="application/xspf+xml">
+    <acronym>XSPF</acronym>
+    <_comment>XML Shareable Playlist Format</_comment>
+    <root-XML localName="playlist"
+              namespaceURI="http://xspf.org/ns/0/"/>
+    <glob pattern="*.xspf"/>
+  </mime-type>
+
+  <mime-type type="application/xv+xml">
+    <glob pattern="*.mxml"/>
+    <glob pattern="*.xhvml"/>
+    <glob pattern="*.xvml"/>
+    <glob pattern="*.xvm"/>
+  </mime-type>
+
+  <mime-type type="application/zip">
+    <_comment>Compressed Archive File</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/ZIP_(file_format)</tika:link>
+    <tika:uti>com.pkware.zip-archive</tika:uti>
+    <alias type="application/x-zip-compressed"/>
+    <magic priority="50">
+      <match value="PK\003\004" type="string" offset="0"/>
+      <match value="PK\005\006" type="string" offset="0"/>
+      <match value="PK\x07\x08" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.zip"/>
+  </mime-type>
+
+  <mime-type type="application/x-7z-compressed">
+    <acronym>7zip</acronym>
+    <_comment>7-zip archive</_comment>
+    <magic priority="50">
+      <!-- Magic: '7', 'z', 0xBC, 0xAF, 0x27, 0x1C -->
+      <match value="7z" type="string" offset="0:1" >
+        <match value="0xBCAF271C" type="string" offset="2:5" />
+      </match>
+    </magic>
+    <glob pattern="*.7z" />
+  </mime-type>
+
+  <mime-type type="audio/32kadpcm"/>
+  <mime-type type="audio/3gpp"/>
+  <mime-type type="audio/3gpp2"/>
+  <mime-type type="audio/ac3"/>
+  <mime-type type="audio/adpcm">
+    <glob pattern="*.adp"/>
+  </mime-type>
+
+  <mime-type type="audio/amr">
+    <glob pattern="*.amr"/>
+    <magic priority="40">
+      <!-- Specific match for the original AMR format -->
+      <match value="#!AMR\n" type="string" offset="0"/>
+      <!-- General match for AMR subtypes we don't have entries for -->
+      <match value="#!AMR" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+  <mime-type type="audio/amr-wb">
+    <sub-class-of type="audio/amr"/>
+    <magic priority="50">
+      <match value="#!AMR-WB\n" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+  <mime-type type="audio/amr-wb+">
+    <sub-class-of type="audio/amr"/>
+    <!-- TIKA-1156 sample needed - might be "#!AMR-WB+\n" ? -->
+  </mime-type>
+
+  <mime-type type="audio/asc"/>
+
+  <mime-type type="audio/basic">
+    <_comment>uLaw/AU Audio File</_comment>
+    <magic priority="20">
+      <match value=".snd" type="string" offset="0">
+        <match value="1" type="big32" offset="12"/>
+        <match value="2" type="big32" offset="12"/>
+        <match value="3" type="big32" offset="12"/>
+        <match value="4" type="big32" offset="12"/>
+        <match value="5" type="big32" offset="12"/>
+        <match value="6" type="big32" offset="12"/>
+        <match value="7" type="big32" offset="12"/>
+      </match>
+      <match offset="0" type="string" value="\x2e\x73\x6e\x64\x00\x00\x00"/>
+    </magic>
+    <glob pattern="*.au"/>
+    <glob pattern="*.snd"/>
+  </mime-type>
+
+  <mime-type type="audio/bv16"/>
+  <mime-type type="audio/bv32"/>
+  <mime-type type="audio/clearmode"/>
+  <mime-type type="audio/cn"/>
+  <mime-type type="audio/dat12"/>
+  <mime-type type="audio/dls"/>
+  <mime-type type="audio/dsr-es201108"/>
+  <mime-type type="audio/dsr-es202050"/>
+  <mime-type type="audio/dsr-es202211"/>
+  <mime-type type="audio/dsr-es202212"/>
+  <mime-type type="audio/dvi4"/>
+  <mime-type type="audio/eac3"/>
+  <mime-type type="audio/evrc"/>
+  <mime-type type="audio/evrc-qcp"/>
+  <mime-type type="audio/evrc0"/>
+  <mime-type type="audio/evrc1"/>
+  <mime-type type="audio/evrcb"/>
+  <mime-type type="audio/evrcb0"/>
+  <mime-type type="audio/evrcb1"/>
+  <mime-type type="audio/evrcwb"/>
+  <mime-type type="audio/evrcwb0"/>
+  <mime-type type="audio/evrcwb1"/>
+  <mime-type type="audio/example"/>
+  <mime-type type="audio/g719"/>
+  <mime-type type="audio/g722"/>
+  <mime-type type="audio/g7221"/>
+  <mime-type type="audio/g723"/>
+  <mime-type type="audio/g726-16"/>
+  <mime-type type="audio/g726-24"/>
+  <mime-type type="audio/g726-32"/>
+  <mime-type type="audio/g726-40"/>
+  <mime-type type="audio/g728"/>
+  <mime-type type="audio/g729"/>
+  <mime-type type="audio/g7291"/>
+  <mime-type type="audio/g729d"/>
+  <mime-type type="audio/g729e"/>
+  <mime-type type="audio/gsm"/>
+  <mime-type type="audio/gsm-efr"/>
+  <mime-type type="audio/ilbc"/>
+  <mime-type type="audio/l16"/>
+  <mime-type type="audio/l20"/>
+  <mime-type type="audio/l24"/>
+  <mime-type type="audio/l8"/>
+  <mime-type type="audio/lpc"/>
+
+  <mime-type type="audio/midi">
+    <acronym>MIDI</acronym>
+    <_comment>Musical Instrument Digital Interface</_comment>
+    <magic priority ="20">
+      <match type="string" value="MThd" offset="0"/>
+    </magic>
+    <glob pattern="*.mid"/>
+    <glob pattern="*.midi"/>
+    <glob pattern="*.kar"/>
+    <glob pattern="*.rmi"/>
+  </mime-type>
+
+  <mime-type type="audio/mobile-xmf"/>
+  <mime-type type="audio/mp4">
+    <alias type="audio/x-m4a"/>
+    <alias type="audio/x-mp4a"/>
+    <magic priority="60">
+      <match value="ftypM4A " type="string" offset="4"/>
+      <match value="ftypM4B " type="string" offset="4"/>
+      <match value="ftypF4A " type="string" offset="4"/>
+      <match value="ftypF4B " type="string" offset="4"/>
+    </magic>
+    <glob pattern="*.mp4a"/>
+    <glob pattern="*.m4a"/>
+    <glob pattern="*.m4b"/>
+  </mime-type>
+  <mime-type type="audio/mp4a-latm"/>
+  <mime-type type="audio/mpa"/>
+  <mime-type type="audio/mpa-robust"/>
+
+  <mime-type type="audio/mpeg">
+    <alias type="audio/x-mpeg"/>
+    <acronym>MP3</acronym>
+    <_comment>MPEG-1 Audio Layer 3</_comment>
+    <magic priority="20">
+      <!-- http://mpgedit.org/mpgedit/mpeg_format/MP3Format.html -->
+      <!-- Bit pattern for first two bytes: 11111111 111VVLLC    -->
+      <!-- VV = MPEG Audio Version ID; 10 = V2, 11 = V1          -->
+      <!-- LL = Layer description; 01 = L3, 10 = L2, 11 = L1     -->
+      <!-- C = Protection bit; 0 = CRC, 1 = no CRC               -->
+      <match value="0xfff2" type="string" offset="0"/> <!-- V2, L3, CRC -->
+      <match value="0xfff3" type="string" offset="0"/> <!-- V2, L3      -->
+      <match value="0xfff4" type="string" offset="0"/> <!-- V2, L2, CRC -->
+      <match value="0xfff5" type="string" offset="0"/> <!-- V2, L2      -->
+      <match value="0xfff6" type="string" offset="0"/> <!-- V2, L1, CRC -->
+      <match value="0xfff7" type="string" offset="0"/> <!-- V2, L1      -->
+      <match value="0xfffa" type="string" offset="0"/> <!-- V1, L3, CRC -->
+      <match value="0xfffb" type="string" offset="0"/> <!-- V1, L3      -->
+      <match value="0xfffc" type="string" offset="0"/> <!-- V1, L2, CRC -->
+      <match value="0xfffd" type="string" offset="0"/> <!-- V1, L2      -->
+      <!-- TIKA-417: This is the UTF-16 LE byte order mark! -->
+      <!-- match value="0xfffe" type="string" offset="0"/ --> <!-- V1, L1, CRC -->
+      <match value="0xffff" type="string" offset="0"/> <!-- V1, L1      -->
+      <match value="ID3" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.mpga"/>
+    <glob pattern="*.mp2"/>
+    <glob pattern="*.mp2a"/>
+    <glob pattern="*.mp3"/>
+    <glob pattern="*.m2a"/>
+    <glob pattern="*.m3a"/>
+  </mime-type>
+
+  <mime-type type="audio/mpeg4-generic"/>
+
+  <mime-type type="audio/ogg">
+    <_comment>Ogg Vorbis Audio</_comment>
+    <glob pattern="*.oga"/>
+    <sub-class-of type="application/ogg"/>
+  </mime-type>
+
+  <mime-type type="audio/vorbis">
+    <_comment>Ogg Vorbis Codec Compressed WAV File</_comment>
+    <alias type="application/x-ogg"/>
+    <magic priority="60">
+      <!-- For a single stream file -->
+      <match value="OggS\000.......................\001vorbis" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFFFFFF"
+             offset="0"/>
+      <match value="\x4f\x67\x67\x53\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00"
+             type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.ogg"/>
+    <sub-class-of type="audio/ogg"/>
+  </mime-type>
+
+  <mime-type type="audio/x-oggflac">
+    <_comment>Ogg Packaged Free Lossless Audio Codec</_comment>
+    <alias type="audio/x-ogg-flac"/>
+    <magic priority="60">
+      <!-- For a single stream file -->
+      <match value="OggS\000.......................FLAC" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFF"
+             offset="0"/>
+    </magic>
+    <sub-class-of type="audio/ogg"/>
+  </mime-type>
+
+  <mime-type type="audio/x-oggpcm">
+    <_comment>Ogg Packaged Unompressed WAV File</_comment>
+    <alias type="audio/x-ogg-pcm"/>
+    <magic priority="60">
+      <!-- For a single stream file -->
+      <match value="OggS\000.......................PCM     " type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF"
+             offset="0"/>
+    </magic>
+    <sub-class-of type="audio/ogg"/>
+  </mime-type>
+
+  <mime-type type="audio/opus">
+    <_comment>Ogg Opus Codec Compressed WAV File</_comment>
+    <magic priority="60">
+      <!-- For a single stream file -->
+      <match value="OggS\000.......................OpusHead" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF"
+             offset="0"/>
+    </magic>
+    <glob pattern="*.opus"/>
+    <sub-class-of type="audio/ogg"/>
+  </mime-type>
+
+  <mime-type type="audio/speex">
+    <_comment>Ogg Speex Codec Compressed WAV File</_comment>
+    <alias type="application/x-speex"/>
+    <magic priority="60">
+      <!-- For a single stream file -->
+      <match value="OggS\000.......................Speex   " type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF"
+             offset="0"/>
+    </magic>
+    <glob pattern="*.spx"/>
+    <sub-class-of type="audio/ogg"/>
+  </mime-type>
+
+  <mime-type type="audio/parityfec"/>
+  <mime-type type="audio/pcma"/>
+  <mime-type type="audio/pcma-wb"/>
+  <mime-type type="audio/pcmu-wb"/>
+  <mime-type type="audio/pcmu"/>
+
+  <mime-type type="audio/prs.sid">
+    <magic priority="50">
+      <match value="PSID" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="audio/qcelp"/>
+  <mime-type type="audio/red"/>
+  <mime-type type="audio/rtp-enc-aescm128"/>
+  <mime-type type="audio/rtp-midi"/>
+  <mime-type type="audio/rtx"/>
+  <mime-type type="audio/smv"/>
+  <mime-type type="audio/smv0"/>
+  <mime-type type="audio/smv-qcp"/>
+  <mime-type type="audio/sp-midi"/>
+  <mime-type type="audio/t140c"/>
+  <mime-type type="audio/t38"/>
+  <mime-type type="audio/telephone-event"/>
+  <mime-type type="audio/tone"/>
+  <mime-type type="audio/ulpfec"/>
+  <mime-type type="audio/vdvi"/>
+  <mime-type type="audio/vmr-wb"/>
+  <mime-type type="audio/vnd.3gpp.iufp"/>
+  <mime-type type="audio/vnd.4sb"/>
+  <mime-type type="audio/vnd.audiokoz"/>
+  <mime-type type="audio/vnd.adobe.soundbooth">
+    <glob pattern="*.asnd"/>
+  </mime-type>
+  <mime-type type="audio/vnd.celp"/>
+  <mime-type type="audio/vnd.cisco.nse"/>
+  <mime-type type="audio/vnd.cmles.radio-events"/>
+  <mime-type type="audio/vnd.cns.anp1"/>
+  <mime-type type="audio/vnd.cns.inf1"/>
+  <mime-type type="audio/vnd.digital-winds">
+    <glob pattern="*.eol"/>
+  </mime-type>
+  <mime-type type="audio/vnd.dlna.adts"/>
+  <mime-type type="audio/vnd.dolby.heaac.1"/>
+  <mime-type type="audio/vnd.dolby.heaac.2"/>
+  <mime-type type="audio/vnd.dolby.mlp"/>
+  <mime-type type="audio/vnd.dolby.mps"/>
+  <mime-type type="audio/vnd.dolby.pl2"/>
+  <mime-type type="audio/vnd.dolby.pl2x"/>
+  <mime-type type="audio/vnd.dolby.pl2z"/>
+  <mime-type type="audio/vnd.dts">
+    <glob pattern="*.dts"/>
+  </mime-type>
+  <mime-type type="audio/vnd.dts.hd">
+    <glob pattern="*.dtshd"/>
+  </mime-type>
+  <mime-type type="audio/vnd.everad.plj"/>
+  <mime-type type="audio/vnd.hns.audio"/>
+  <mime-type type="audio/vnd.lucent.voice">
+    <glob pattern="*.lvp"/>
+  </mime-type>
+  <mime-type type="audio/vnd.ms-playready.media.pya">
+    <glob pattern="*.pya"/>
+  </mime-type>
+  <mime-type type="audio/vnd.nokia.mobile-xmf"/>
+  <mime-type type="audio/vnd.nortel.vbk"/>
+  <mime-type type="audio/vnd.nuera.ecelp4800">
+    <glob pattern="*.ecelp4800"/>
+  </mime-type>
+  <mime-type type="audio/vnd.nuera.ecelp7470">
+    <glob pattern="*.ecelp7470"/>
+  </mime-type>
+  <mime-type type="audio/vnd.nuera.ecelp9600">
+    <glob pattern="*.ecelp9600"/>
+  </mime-type>
+  <mime-type type="audio/vnd.octel.sbc"/>
+  <mime-type type="audio/vnd.qcelp"/>
+  <mime-type type="audio/vnd.rhetorex.32kadpcm"/>
+  <mime-type type="audio/vnd.sealedmedia.softseal.mpeg"/>
+  <mime-type type="audio/vnd.vmx.cvsd"/>
+  <mime-type type="audio/vorbis-config"/>
+  <mime-type type="audio/x-aac">
+    <glob pattern="*.aac"/>
+  </mime-type>
+
+  <mime-type type="audio/x-adbcm">
+    <magic priority="20">
+      <match value=".snd" type="string" offset="0">
+        <match value="23" type="big32" offset="12"/>
+      </match>
+    </magic>
+  </mime-type>
+
+  <mime-type type="audio/x-aiff">
+    <alias type="audio/aiff"/>
+    <acronym>AIFF</acronym>
+    <_comment>Audio Interchange File Format</_comment>
+    <magic priority="20">
+      <match value="FORM....AIFF" type="string" offset="0"
+             mask="0xFFFFFFFF00000000FFFFFFFF"/>
+      <match value="FORM....AIFC" type="string" offset="0"
+             mask="0xFFFFFFFF00000000FFFFFFFF"/>
+      <!-- Amiga IFF sound sample, somewhat like the more modern AIFF -->
+      <match value="FORM....8SVX" type="string" offset="0"
+             mask="0xFFFFFFFF00000000FFFFFFFF"/>
+      <match offset="0" type="string" value="\x46\x4f\x52\x4d\x00"/>
+    </magic>
+    <glob pattern="*.aif"/>
+    <glob pattern="*.aiff"/>
+    <glob pattern="*.aifc"/>
+  </mime-type>
+
+  <mime-type type="audio/x-dec-basic">
+    <magic priority="20">
+      <match value="0x0064732E" type="big32" offset="0">
+        <match value="1" type="big32" offset="12"/>
+        <match value="2" type="big32" offset="12"/>
+        <match value="3" type="big32" offset="12"/>
+        <match value="4" type="big32" offset="12"/>
+        <match value="5" type="big32" offset="12"/>
+        <match value="6" type="big32" offset="12"/>
+        <match value="7" type="big32" offset="12"/>
+      </match>
+    </magic>
+  </mime-type>
+
+  <mime-type type="audio/x-dec-adbcm">
+    <magic priority="20">
+      <match value="0x0064732E" type="big32" offset="0">
+        <match value="23" type="big32" offset="12"/>
+      </match>
+    </magic>
+  </mime-type>
+
+  <mime-type type="audio/x-flac">
+    <acronym>FLAC</acronym>
+    <_comment>Free Lossless Audio Codec</_comment>
+    <magic priority="50">
+      <match value="fLaC" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.flac"/>
+  </mime-type>
+
+  <mime-type type="audio/x-mod">
+    <acronym>MOD</acronym>
+    <magic priority="50">
+      <match value="Extended\ Module:" type="string" offset="0"/>
+      <match value="BMOD2STM" type="string" offset="21"/>
+      <match value="M.K." type="string" offset="1080"/>
+      <match value="M!K!" type="string" offset="1080"/>
+      <match value="FLT4" type="string" offset="1080"/>
+      <match value="FLT8" type="string" offset="1080"/>
+      <match value="4CHN" type="string" offset="1080"/>
+      <match value="6CHN" type="string" offset="1080"/>
+      <match value="8CHN" type="string" offset="1080"/>
+      <match value="CD81" type="string" offset="1080"/>
+      <match value="OKTA" type="string" offset="1080"/>
+      <match value="16CN" type="string" offset="1080"/>
+      <match value="32CN" type="string" offset="1080"/>
+      <match value="IMPM" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.mod"/>
+  </mime-type>
+
+  <mime-type type="audio/x-mpegurl">
+    <_comment>MP3 Playlist File</_comment>
+    <magic priority="50">
+     <match offset="0" type="string" value="\x23\x45\x58\x54\x4d\x33\x55\x0d\x0a"/>
+    </magic>
+    <glob pattern="*.m3u"/>
+  </mime-type>
+
+  <mime-type type="audio/x-ms-wax">
+    <glob pattern="*.wax"/>
+  </mime-type>
+  <mime-type type="audio/x-ms-wma">
+    <sub-class-of type="video/x-ms-asf" />
+    <glob pattern="*.wma"/>
+    <magic priority="50">
+       <match value="Windows Media Audio" type="unicodeLE" offset="0:8192" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="audio/x-pn-realaudio">
+    <_comment>Real Audio</_comment>
+    <alias type="audio/x-realaudio" />
+    <magic priority="50">
+      <match value="0x2e7261fd" type="big32" offset="0"/>
+    </magic>
+    <glob pattern="*.ram"/>
+    <glob pattern="*.ra"/>
+  </mime-type>
+
+  <mime-type type="audio/x-pn-realaudio-plugin">
+    <_comment>RealMedia Player Plug-in</_comment>
+    <glob pattern="*.rmp"/>
+    <!-- <glob pattern="*.rpm"/> - conflicts with application/x-rpm -->
+  </mime-type>
+
+  <mime-type type="audio/x-wav">
+    <acronym>WAV</acronym>
+    <magic priority="20">
+      <match value="RIFF....WAVE" type="string" offset="0"
+             mask="0xFFFFFFFF00000000FFFFFFFF"/>
+    </magic>
+    <glob pattern="*.wav"/>
+  </mime-type>
+
+  <mime-type type="chemical/x-cdx">
+    <magic priority="50">
+      <match value="VjCD0100" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.cdx"/>
+  </mime-type>
+  <mime-type type="chemical/x-cif">
+    <glob pattern="*.cif"/>
+  </mime-type>
+  <mime-type type="chemical/x-cmdf">
+    <glob pattern="*.cmdf"/>
+  </mime-type>
+  <mime-type type="chemical/x-cml">
+    <glob pattern="*.cml"/>
+  </mime-type>
+  <mime-type type="chemical/x-csml">
+    <glob pattern="*.csml"/>
+  </mime-type>
+
+  <mime-type type="chemical/x-pdb">
+    <_comment>Brookhaven Protein Databank File</_comment>
+    <glob pattern="*.pdb"/>
+  </mime-type>
+
+  <mime-type type="chemical/x-xyz">
+    <glob pattern="*.xyz"/>
+  </mime-type>
+
+  <mime-type type="image/x-ms-bmp">
+    <alias type="image/bmp"/>
+    <acronym>BMP</acronym>
+    <_comment>Windows bitmap</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/BMP_file_format</tika:link>
+    <tika:uti>com.microsoft.bmp</tika:uti>
+    <magic priority="50">
+      <match value="BM" type="string" offset="0">
+        <match value="0x0100" type="string" offset="26">
+      	  <match value="0x0000" type="string" offset="28"/>
+      	  <match value="0x0100" type="string" offset="28"/>
+      	  <match value="0x0400" type="string" offset="28"/>
+      	  <match value="0x0800" type="string" offset="28"/>
+      	  <match value="0x1000" type="string" offset="28"/>
+      	  <match value="0x1800" type="string" offset="28"/>
+      	  <match value="0x2000" type="string" offset="28"/>
+        </match>
+      </match>
+    </magic>
+    <glob pattern="*.bmp"/>
+    <glob pattern="*.dib"/>
+  </mime-type>
+
+  <mime-type type="image/cgm">
+    <acronym>CGM</acronym>
+    <_comment>Computer Graphics Metafile</_comment>
+    <magic priority="50">
+      <match value="BEGMF" type="string" offset="0"/>
+      <match value="0x0020" mask="0xffe0" type="string" offset="0">
+        <match value="0x10220001" type="string" offset="2:64"/>
+        <match value="0x10220002" type="string" offset="2:64"/>
+        <match value="0x10220003" type="string" offset="2:64"/>
+        <match value="0x10220004" type="string" offset="2:64"/>
+      </match>
+    </magic>
+    <glob pattern="*.cgm"/>
+  </mime-type>
+
+  <mime-type type="image/example"/>
+
+  <mime-type type="image/fits">
+    <sub-class-of type="application/fits"/>
+  </mime-type>
+
+  <mime-type type="image/g3fax">
+    <glob pattern="*.g3"/>
+  </mime-type>
+
+  <mime-type type="image/gif">
+    <acronym>GIF</acronym>
+    <_comment>Graphics Interchange Format</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/Gif</tika:link>
+    <tika:uti>com.compuserve.gif</tika:uti>
+    <magic priority="50">
+      <match value="GIF87a" type="string" offset="0"/>
+      <match value="GIF89a" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.gif"/>
+  </mime-type>
+
+  <mime-type type="image/ief">
+    <glob pattern="*.ief"/>
+  </mime-type>
+
+  <mime-type type="image/jp2">
+    <sub-class-of type="image/x-jp2-container" />
+    <acronym>JP2</acronym>
+    <_comment>JPEG 2000 Part 1 (JP2)</_comment>
+    <magic priority="50">
+      <match value="0x0000000C6A5020200D0A870A" type="string" offset="0">
+        <match value="0x6a703220" type="string" offset="20"/>
+      </match>
+    </magic>
+    <glob pattern="*.jp2"/>
+  </mime-type>
+
+  <mime-type type="image/jpeg">
+    <acronym>JPEG</acronym>
+    <_comment>Joint Photographic Experts Group</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/Jpeg</tika:link>
+    <tika:uti>public.jpeg</tika:uti>
+    <magic priority="50">
+      <!-- FFD8 is the SOI (Start Of Image) marker.              -->
+      <!-- It is followed by another marker that starts with FF. -->
+      <match value="0xffd8ff" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.jpg"/>
+    <glob pattern="*.jpeg"/>
+    <glob pattern="*.jpe"/>
+    <glob pattern="*.jif"/>
+    <glob pattern="*.jfif"/>
+    <glob pattern="*.jfi"/>
+  </mime-type>
+
+  <mime-type type="image/jpm">
+    <alias type="video/jpm"/>
+    <sub-class-of type="image/x-jp2-container" />
+    <acronym>JP2</acronym>
+    <_comment>JPEG 2000 Part 6 (JPM)</_comment>
+    <magic priority="50">
+      <match value="0x0000000C6A5020200D0A870A" type="string" offset="0">
+        <match value="0x6a706d20" type="string" offset="20"/>
+      </match>
+    </magic>
+    <glob pattern="*.jpm"/>
+    <glob pattern="*.jpgm"/>
+  </mime-type>
+
+  <mime-type type="image/jpx">
+    <sub-class-of type="image/x-jp2-container" />
+    <acronym>JP2</acronym>
+    <_comment>JPEG 2000 Part 2 (JPX)</_comment>
+    <magic priority="50">
+      <match value="0x0000000C6A5020200D0A870A" type="string" offset="0">
+        <match value="0x6a707820" type="string" offset="20"/>
+      </match>
+    </magic>
+    <glob pattern="*.jpf"/>
+  </mime-type>
+
+  <mime-type type="image/naplps"/>
+
+  <mime-type type="image/nitf">
+    <alias type="image/ntf"/>
+    <magic priority="50">
+      <match value="NITF01.10" type="string" offset="0"/>
+      <match value="NITF02.000" type="string" offset="0"/>
+      <match value="NITF02.100" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.ntf"/>
+    <glob pattern="*.nitf"/>
+  </mime-type>
+
+  <mime-type type="image/png">
+    <acronym>PNG</acronym>
+    <_comment>Portable Network Graphics</_comment>
+    <magic priority="50">
+      <match value="\x89PNG\x0d\x0a\x1a\x0a" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.png"/>
+  </mime-type>
+
+  <mime-type type="image/prs.btif">
+    <glob pattern="*.btif"/>
+  </mime-type>
+  <mime-type type="image/prs.pti"/>
+
+  <mime-type type="image/svg+xml">
+    <sub-class-of type="application/xml"/>
+    <acronym>SVG</acronym>
+    <_comment>Scalable Vector Graphics</_comment>
+    <root-XML localName="svg" namespaceURI="http://www.w3.org/2000/svg"/>
+    <glob pattern="*.svg"/>
+    <glob pattern="*.svgz"/>
+  </mime-type>
+
+  <mime-type type="image/t38"/>
+
+  <mime-type type="image/tiff">
+    <acronym>TIFF</acronym>
+    <_comment>Tagged Image File Format</_comment>
+    <magic priority="50">
+      <!-- MM.* = Big endian (M=Motorola) and 0x002a in big endian    -->
+      <match value="MM\x00\x2a" type="string" offset="0"/>
+      <!-- II*. = Little endian (I=Intel) and 0x002a in little endian -->
+      <match value="II\x2a\x00" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.tiff"/>
+    <glob pattern="*.tif"/>
+  </mime-type>
+
+  <mime-type type="image/tiff-fx"/>
+
+  <mime-type type="image/vnd.adobe.photoshop">
+    <acronym>PSD</acronym>
+    <_comment>Photoshop Image</_comment>
+    <alias type="image/x-psd"/>
+    <alias type="application/photoshop"/>
+    <magic priority="50">
+      <!-- Version of 0x0001 is PSD -->
+      <match value="8BPS\x00\x01" type="string" offset="0"/>
+      <!-- Version of 0x0002 is PSB -->
+      <match value="8BPS\x00\x02" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.psd"/>
+  </mime-type>
+
+  <mime-type type="image/vnd.adobe.premiere">
+    <glob pattern="*.ppj"/>
+    <root-XML localName="PremiereData"/>
+    <sub-class-of type="application/xml"/>
+  </mime-type>
+
+  <mime-type type="image/vnd.cns.inf2"/>
+  <mime-type type="image/vnd.djvu">
+    <glob pattern="*.djvu"/>
+    <glob pattern="*.djv"/>
+  </mime-type>
+
+  <mime-type type="image/vnd.dwg">
+    <acronym>DWG</acronym>
+    <_comment>AutoCad Drawing</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/.dwg</tika:link>
+    <alias type="image/x-dwg"/>
+    <alias type="application/acad"/>
+    <alias type="application/x-acad"/>
+    <alias type="application/autocad_dwg"/>
+    <alias type="application/dwg"/>
+    <alias type="application/x-dwg"/>
+    <alias type="application/x-autocad"/>
+    <alias type="image/vnd.dwg"/>
+    <alias type="drawing/dwg"/>
+    <glob pattern="*.dwg"/>
+    <magic priority="50">
+      <match value="MC0.0" type="string" offset="0"/>
+      <match value="AC1.2" type="string" offset="0"/>
+      <match value="AC1.40" type="string" offset="0"/>
+      <match value="AC1.50" type="string" offset="0"/>
+      <match value="AC2.10" type="string" offset="0"/>
+      <match value="AC2.21" type="string" offset="0"/>
+      <match value="AC2.22" type="string" offset="0"/>
+      <!-- "AC" followed by four numbers -->
+      <match value="AC0000" type="string" offset="0"
+             mask="0xFFFFF0F0F0F0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="image/vnd.dxf">
+    <acronym>DXF</acronym>
+    <_comment>AutoCAD DXF</_comment>
+    <tika:link>http://en.wikipedia.org/wiki/AutoCAD_DXF</tika:link>
+    <glob pattern="*.dxf"/>
+  </mime-type>
+  <mime-type type="image/vnd.fastbidsheet">
+    <glob pattern="*.fbs"/>
+  </mime-type>
+  <mime-type type="image/vnd.fpx">
+    <glob pattern="*.fpx"/>
+  </mime-type>
+  <mime-type type="image/vnd.fst">
+    <glob pattern="*.fst"/>
+  </mime-type>
+  <mime-type type="image/vnd.fujixerox.edmics-mmr">
+    <glob pattern="*.mmr"/>
+  </mime-type>
+  <mime-type type="image/vnd.fujixerox.edmics-rlc">
+    <glob pattern="*.rlc"/>
+  </mime-type>
+  <mime-type type="image/vnd.globalgraphics.pgb"/>
+
+  <mime-type type="image/vnd.microsoft.icon">
+    <acronym>ICO</acronym>
+    <tika:link>http://en.wikipedia.org/wiki/.ico</tika:link>
+    <tika:uti>com.microsoft.ico</tika:uti>
+    <alias type="image/x-icon" />
+    <magic priority="50">
+      <match value="\102\101\050\000\000\000\056\000\000\000\000\000\000\000"
+             type="string" offset="0"/>
+      <match value="\000\000\001\000" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.ico"/>
+  </mime-type>
+
+  <mime-type type="image/vnd.mix"/>
+  <mime-type type="image/vnd.ms-modi">
+       <glob pattern="*.mdi"/>
+       <_comment>Microsoft Document Imaging</_comment>
+       <magic priority="50">
+         <match value="0x45502A00" type="string" offset="0"/>
+       </magic>
+  </mime-type>
+
+  <mime-type type="image/vnd.net-fpx">
+    <glob pattern="*.npx"/>
+  </mime-type>
+  <mime-type type="image/vnd.radiance"/>
+  <mime-type type="image/vnd.sealed.png"/>
+  <mime-type type="image/vnd.sealedmedia.softseal.gif"/>
+  <mime-type type="image/vnd.sealedmedia.softseal.jpg"/>
+  <mime-type type="image/vnd.svf"/>
+
+  <mime-type type="image/vnd.wap.wbmp">
+    <_comment>Wireless Bitmap File Format</_comment>
+    <glob pattern="*.wbmp"/>
+  </mime-type>
+
+  <mime-type type="image/vnd.xiff">
+    <glob pattern="*.xif"/>
+  </mime-type>
+  <mime-type type="image/x-cmu-raster">
+    <glob pattern="*.ras"/>
+  </mime-type>
+  <mime-type type="image/x-cmx">
+    <glob pattern="*.cmx"/>
+  </mime-type>
+
+  <mime-type type="image/x-freehand">
+    <_comment>FreeHand image</_comment>
+    <magic priority="50">
+      <match value="AGD2" type="string" offset="0"/>
+      <match value="AGD3" type="string" offset="0"/>
+      <match value="AGD4" type="string" offset="0"/>
+      <match value="FreeHand10" type="string" offset="0:24"/>
+      <match value="FreeHand11" type="string" offset="0:24"/>
+      <match value="FreeHand12" type="string" offset="0:24"/>
+    </magic>
+    <glob pattern="*.fh"/>
+    <glob pattern="*.fhc"/>
+    <glob pattern="*.fh4"/>
+    <glob pattern="*.fh40"/>
+    <glob pattern="*.fh5"/>
+    <glob pattern="*.fh50"/>
+    <glob pattern="*.fh7"/>
+    <glob pattern="*.fh8"/>
+    <glob pattern="*.fh9"/>
+    <glob pattern="*.fh10"/>
+    <glob pattern="*.fh11"/>
+    <glob pattern="*.fh12"/>
+    <glob pattern="*.ft7"/>
+    <glob pattern="*.ft8"/>
+    <glob pattern="*.ft9"/>
+    <glob pattern="*.ft10"/>
+    <glob pattern="*.ft11"/>
+    <glob pattern="*.ft12"/>
+  </mime-type>
+
+  <mime-type type="image/x-jp2-codestream">
+    <_comment>JPEG 2000 Codestream</_comment>
+    <magic priority="25">
+      <match value="0xff4fff51" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.j2c"/>
+  </mime-type>
+
+  <mime-type type="image/x-jp2-container">
+    <_comment>JPEG 2000 Container Format</_comment>
+    <magic priority="50">
+      <match value="0x0000000C6A5020200D0A870A" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="image/x-niff">
+    <_comment>Navy Interchange File Format</_comment>
+    <magic priority="50">
+      <match value="IIN1" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="image/x-pcx">
+    <glob pattern="*.pcx"/>
+  </mime-type>
+  <mime-type type="image/x-pict">
+    <_comment>Apple Macintosh QuickDraw/PICT Format</_comment>
+    <magic priority="50">
+      <match value="0x001102FF0C00" type="string" offset="522"/>
+    </magic>
+    <glob pattern="*.pic"/>
+    <glob pattern="*.pct"/>
+    <glob pattern="*.pict"/>
+  </mime-type>
+
+  <mime-type type="image/x-portable-anymap">
+    <acronym>PNM</acronym>
+    <_comment>Portable Any Map</_comment>
+    <glob pattern="*.pnm" />
+  </mime-type>
+
+  <mime-type type="image/x-portable-bitmap">
+    <sub-class-of type="image/x-portable-anymap"/>
+    <acronym>PBM</acronym>
+    <_comment>Portable Bit Map</_comment>
+    <magic priority="50">
+      <match value="P1" type="string" offset="0"/>
+      <match value="P4" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.pbm"/>
+  </mime-type>
+
+  <mime-type type="image/x-portable-graymap">
+    <sub-class-of type="image/x-portable-anymap"/>
+    <acronym>PGM</acronym>
+    <_comment>Portable Graymap Graphic</_comment>
+    <magic priority="50">
+      <match value="P2" type="string" offset="0"/>
+      <match value="P5" type="string" offset="0"/>
+      <match offset="0" type="string" value="\x50\x35\x0a"/>
+    </magic>
+    <glob pattern="*.pgm"/>
+  </mime-type>
+
+  <mime-type type="image/x-portable-pixmap">
+    <sub-class-of type="image/x-portable-anymap"/>
+    <acronym>PXM</acronym>
+    <_comment>UNIX Portable Bitmap Graphic</_comment>
+    <magic priority="50">
+      <match value="P3" type="string" offset="0"/>
+      <match value="P6" type="string" offset="0"/>
+      <match value="P7" type="string" offset="0"/>
+       <match offset="0" type="string" value="\x50\x34\x0a"/>
+    </magic>
+    <glob pattern="*.ppm"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-adobe">
+    <acronym>DNG</acronym>
+    <_comment>Adobe Digital Negative</_comment>
+    <glob pattern="*.dng"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-hasselblad">
+    <_comment>Hasselblad raw image</_comment>
+    <glob pattern="*.3fr"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-fuji">
+    <_comment>Fuji raw image</_comment>
+    <glob pattern="*.raf"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-canon">
+    <_comment>Canon raw image</_comment>
+    <glob pattern="*.crw"/>
+    <glob pattern="*.cr2"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-kodak">
+    <_comment>Kodak raw image</_comment>
+    <glob pattern="*.k25"/>
+    <glob pattern="*.kdc"/>
+    <glob pattern="*.dcs"/>
+    <glob pattern="*.drf"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-minolta">
+    <_comment>Minolta raw image</_comment>
+    <glob pattern="*.mrw"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-nikon">
+    <_comment>Nikon raw image</_comment>
+    <glob pattern="*.nef"/>
+    <glob pattern="*.nrw"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-olympus">
+    <_comment>Olympus raw image</_comment>
+    <glob pattern="*.orf"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-pentax">
+    <_comment>Pentax raw image</_comment>
+    <glob pattern="*.ptx"/>
+    <glob pattern="*.pef"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-sony">
+    <_comment>Sony raw image</_comment>
+    <glob pattern="*.arw"/>
+    <glob pattern="*.srf"/>
+    <glob pattern="*.sr2"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-sigma">
+    <_comment>Sigma raw image</_comment>
+    <glob pattern="*.x3f"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-epson">
+    <_comment>Epson raw image</_comment>
+    <glob pattern="*.erf"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-mamiya">
+    <_comment>Mamiya raw image</_comment>
+    <glob pattern="*.mef"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-leaf">
+    <_comment>Leaf raw image</_comment>
+    <glob pattern="*.mos"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-panasonic">
+    <_comment>Panasonic raw image</_comment>
+    <glob pattern="*.raw"/>
+    <glob pattern="*.rw2"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-phaseone">
+    <_comment>Phase One raw image</_comment>
+    <glob pattern="*.iiq"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-red">
+    <_comment>Red raw image</_comment>
+    <glob pattern="*.r3d"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-imacon">
+    <_comment>Imacon raw image</_comment>
+    <glob pattern="*.fff"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-logitech">
+    <_comment>Logitech raw image</_comment>
+    <glob pattern="*.pxn"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-casio">
+    <_comment>Casio raw image</_comment>
+    <glob pattern="*.bay"/>
+  </mime-type>
+
+  <mime-type type="image/x-raw-rawzor">
+    <_comment>Rawzor raw image</_comment>
+    <glob pattern="*.rwz"/>
+  </mime-type>
+
+  <mime-type type="image/x-rgb">
+    <_comment>Silicon Graphics RGB Bitmap</_comment>
+    <magic priority="50">
+      <match offset="0" type="string" value="\x01\xda\x01\x01\x00\x03"/>
+    </magic>
+    <glob pattern="*.rgb"/>
+  </mime-type>
+
+  <mime-type type="image/x-xbitmap">
+    <magic priority="50">
+      <match value="/* XPM" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.xbm"/>
+    <sub-class-of type="text/x-c"/>
+  </mime-type>
+
+  <mime-type type="image/x-xcf">
+    <_comment>GIMP Image File</_comment>
+    <alias type="image/xcf"/>
+    <magic priority="50">
+      <match type="string" value="gimp xcf " offset="0"/>
+    </magic>
+    <glob pattern="*.xcf"/>
+  </mime-type>
+
+  <mime-type type="image/x-xpixmap">
+    <glob pattern="*.xpm"/>
+  </mime-type>
+
+  <mime-type type="image/x-xwindowdump">
+    <_comment>X Windows Dump</_comment>
+    <glob pattern="*.xwd"/>
+  </mime-type>
+
+  <mime-type type="message/cpim"/>
+  <mime-type type="message/delivery-status"/>
+  <mime-type type="message/disposition-notification"/>
+  <mime-type type="message/example"/>
+  <mime-type type="message/external-body"/>
+  <mime-type type="message/global"/>
+  <mime-type type="message/global-delivery-status"/>
+  <mime-type type="message/global-disposition-notification"/>
+  <mime-type type="message/global-headers"/>
+  <mime-type type="message/http"/>
+  <mime-type type="message/imdn+xml"/>
+
+  <mime-type type="message/news">
+    <magic priority="50">
+      <match value="Path:" type="string" offset="0" />
+      <match value="Xref:" type="string" offset="0" />
+      <match value="Article" type="string" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="message/partial"/>
+
+  <mime-type type="message/rfc822">
+    <magic priority="50">
+      <match value="Relay-Version:" type="stringignorecase" offset="0"/>
+      <match value="#!\ rnews" type="string" offset="0"/>
+      <match value="N#!\ rnews" type="string" offset="0"/>
+      <match value="Forward\ to" type="string" offset="0"/>
+      <match value="Pipe\ to" type="string" offset="0"/>
+      <match value="Return-Path:" type="stringignorecase" offset="0"/>
+      <match value="From:" type="stringignorecase" offset="0"/>
+      <match value="Received:" type="stringignorecase" offset="0"/>
+      <match value="Message-ID:" type="stringignorecase" offset="0"/>
+      <match value="Date:" type="string" offset="0"/>
+      <match value="MIME-Version:" type="stringignorecase" offset="0"/>
+      <match value="X-Notes-Item:" type="string" offset="0">
+        <match value="Message-ID:" type="string" offset="0:8192"/>
+      </match>
+    </magic>
+    <glob pattern="*.eml"/>
+    <glob pattern="*.mime"/>
+    <glob pattern="*.mht"/>
+    <glob pattern="*.mhtml"/>
+  </mime-type>
+
+  <mime-type type="message/s-http"/>
+  <mime-type type="message/sip"/>
+  <mime-type type="message/sipfrag"/>
+  <mime-type type="message/tracking-status"/>
+  <mime-type type="message/vnd.si.simp"/>
+
+  <mime-type type="model/example"/>
+
+  <mime-type type="model/iges">
+    <_comment>Initial Graphics Exchange Specification Format</_comment>
+    <glob pattern="*.igs"/>
+    <glob pattern="*.iges"/>
+  </mime-type>
+
+  <mime-type type="model/mesh">
+    <glob pattern="*.msh"/>
+    <glob pattern="*.mesh"/>
+    <glob pattern="*.silo"/>
+  </mime-type>
+
+  <mime-type type="model/vnd.dwf">
+    <glob pattern="*.dwf"/>
+  </mime-type>
+  <mime-type type="model/vnd.dwfx+xps">
+    <_comment>AutoCAD Design Web Format</_comment>
+    <glob pattern="*.dwfx"/>
+    <sub-class-of type="application/x-tika-ooxml"/>
+  </mime-type>
+
+  <mime-type type="model/vnd.flatland.3dml"/>
+  <mime-type type="model/vnd.gdl">
+    <glob pattern="*.gdl"/>
+  </mime-type>
+  <mime-type type="model/vnd.gs-gdl"/>
+  <mime-type type="model/vnd.gs.gdl"/>
+  <mime-type type="model/vnd.gtw">
+    <glob pattern="*.gtw"/>
+  </mime-type>
+  <mime-type type="model/vnd.moml+xml"/>
+  <mime-type type="model/vnd.mts">
+    <glob pattern="*.mts"/>
+  </mime-type>
+  <mime-type type="model/vnd.parasolid.transmit.binary"/>
+  <mime-type type="model/vnd.parasolid.transmit.text"/>
+  <mime-type type="model/vnd.vtu">
+    <glob pattern="*.vtu"/>
+  </mime-type>
+
+  <mime-type type="model/vrml">
+    <glob pattern="*.wrl"/>
+    <glob pattern="*.vrml"/>
+  </mime-type>
+
+  <mime-type type="multipart/alternative"/>
+  <mime-type type="multipart/appledouble"/>
+  <mime-type type="multipart/byteranges"/>
+  <mime-type type="multipart/digest"/>
+  <mime-type type="multipart/encrypted"/>
+  <mime-type type="multipart/example"/>
+  <mime-type type="multipart/form-data"/>
+  <mime-type type="multipart/header-set"/>
+  <mime-type type="multipart/mixed"/>
+  <mime-type type="multipart/parallel"/>
+  <mime-type type="multipart/related"/>
+  <mime-type type="multipart/report"/>
+  <mime-type type="multipart/signed"/>
+  <mime-type type="multipart/voice-message"/>
+
+  <mime-type type="text/x-actionscript">
+    <_comment>ActionScript source code</_comment>
+    <glob pattern="*.as"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-ada">
+    <_comment>Ada source code</_comment>
+    <glob pattern="*.ada"/>
+    <glob pattern="*.adb"/>
+    <glob pattern="*.ads"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-applescript">
+    <_comment>AppleScript source code</_comment>
+    <glob pattern="*.applescript"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/asp">
+    <_comment>Active Server Page</_comment>
+    <glob pattern="*.asp"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/aspdotnet">
+    <_comment>ASP .NET</_comment>
+    <glob pattern="*.aspx"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-aspectj">
+    <_comment>AspectJ source code</_comment>
+    <glob pattern="*.aj"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-assembly">
+    <alias type="text/x-asm"/>
+    <_comment>Assembler source code</_comment>
+    <glob pattern="*.s"/>
+    <glob pattern="*.S"/>
+    <glob pattern="*.asm"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/calendar">
+    <glob pattern="*.ics"/>
+    <glob pattern="*.ifb"/>
+  </mime-type>
+
+  <mime-type type="text/css">
+    <_comment>Cascading Style Sheet</_comment>
+    <glob pattern="*.css"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/csv">
+    <glob pattern="*.csv"/>
+  </mime-type>
+
+  <mime-type type="text/directory"/>
+  <mime-type type="text/dns"/>
+  <mime-type type="text/ecmascript"/>
+  <mime-type type="text/enriched"/>
+  <mime-type type="text/example"/>
+
+  <mime-type type="text/html">
+    <_comment>HyperText Markup Language</_comment>
+    <acronym>HTML</acronym>
+    <tika:uti>public.html</tika:uti>
+     <!-- TIKA-327: if you encounter tags in the HTML
+          with no declared namespace, it's not XHTML, it's just
+          bad HTML, unfortunately.
+     -->
+    <root-XML localName="html"/>
+    <root-XML localName="HTML"/>
+    <root-XML localName="link"/>
+    <root-XML localName="LINK"/>
+    <root-XML localName="body"/>
+    <root-XML localName="BODY"/>
+    <root-XML localName="p"/>
+    <root-XML localName="P"/>
+    <root-XML localName="script"/>
+    <root-XML localName="SCRIPT"/>
+    <root-XML localName="frameset"/>
+    <root-XML localName="FRAMESET"/>
+    <!-- The magic priority needs to be lower than that of -->
+    <!--  files which contain HTML within them, eg mime emails -->
+    <magic priority="40">
+      <match value="&lt;!DOCTYPE HTML" type="string" offset="0:64"/>
+      <match value="&lt;!doctype html" type="string" offset="0:64"/>
+      <match value="&lt;HEAD" type="string" offset="0:64"/>
+      <match value="&lt;head" type="string" offset="0:64"/>
+      <match value="&lt;TITLE" type="string" offset="0:64"/>
+      <match value="&lt;title" type="string" offset="0:64"/>
+      <!-- note on the offset value here: this can only be as big as
+           MimeTypes#getMinLength(). If you set the offset value to larger
+           than that size, the magic will only be compared to up to
+           MimeTypes#getMinLength() bytes.
+       -->
+      <match value="&lt;html" type="string" offset="0:8192"/>
+      <match value="&lt;HTML" type="string" offset="0:64"/>
+      <match value="&lt;BODY" type="string" offset="0"/>
+      <match value="&lt;body" type="string" offset="0"/>
+      <match value="&lt;DIV" type="string" offset="0"/>
+      <match value="&lt;div" type="string" offset="0"/>
+      <match value="&lt;TITLE" type="string" offset="0"/>
+      <match value="&lt;title" type="string" offset="0"/>
+      <match value="&lt;h1" type="string" offset="0"/>
+      <match value="&lt;H1" type="string" offset="0"/>
+      <match value="&lt;!doctype HTML" type="string" offset="0"/>
+      <match value="&lt;!DOCTYPE html" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.html"/>
+    <glob pattern="*.htm"/>
+  </mime-type>
+
+  <mime-type type="text/parityfec"/>
+
+  <mime-type type="text/plain">
+    <magic priority="20">
+      <match value="This is TeX," type="string" offset="0"/>
+      <match value="This is METAFONT," type="string" offset="0"/>
+      <match value="/*" type="string" offset="0"/>
+      <match value="//" type="string" offset="0"/>
+      <match value=";;" type="string" offset="0"/>
+      <!-- UTF-16BE BOM -->
+      <match value="0xfeff" type="string" offset="0"/>
+      <!-- UTF-16LE BOM -->
+      <match value="0xfffe" type="string" offset="0"/>
+      <!-- UTF-8 BOM -->
+      <match value="0xefbbbf" type="string" offset="0"/>
+    </magic>
+
+    <glob pattern="*.txt"/>
+    <glob pattern="*.text"/>
+    <glob pattern="*.conf"/>
+    <glob pattern="*.cfg"/>
+    <glob pattern="*.def"/>
+    <glob pattern="*.list"/>
+    <glob pattern="*.in"/>
+
+    <!-- TIKA-85: http://www.apache.org/dev/svn-eol-style.txt -->
+    <glob pattern="INSTALL"/>
+    <glob pattern="KEYS"/>
+    <glob pattern="Makefile"/>
+    <glob pattern="README"/>
+    <glob pattern="abs-linkmap"/>
+    <glob pattern="abs-menulinks"/>
+    <glob pattern="*.aart"/>
+    <glob pattern="*.ac"/>
+    <glob pattern="*.am"/>
+    <glob pattern="*.classpath"/>
+    <glob pattern="*.cmd"/>
+    <glob pattern="*.config"/>
+    <glob pattern="*.cwiki"/>
+    <glob pattern="*.data"/>
+    <glob pattern="*.dcl"/>
+    <glob pattern="*.egrm"/>
+    <glob pattern="*.ent"/>
+    <glob pattern="*.ft"/>
+    <glob pattern="*.fn"/>
+    <glob pattern="*.fv"/>
+    <glob pattern="*.grm"/>
+    <glob pattern="*.g"/>
+    <glob pattern=".htaccess"/>
+    <glob pattern="*.ihtml"/>
+    <glob pattern="*.jmx"/>
+    <glob pattern="*.junit"/>
+    <glob pattern="*.jx"/>
+    <glob pattern="*.manifest"/>
+    <glob pattern="*.m4"/>
+    <glob pattern="*.mf"/>
+    <glob pattern="*.MF"/>
+    <glob pattern="*.meta"/>
+    <glob pattern="*.n3"/>
+    <glob pattern="*.pen"/>
+    <glob pattern="*.pod"/>
+    <glob pattern="*.pom"/>
+    <glob pattern="*.project"/>
+    <glob pattern="*.properties"/>
+    <glob pattern="*.rng"/>
+    <glob pattern="*.rnx"/>
+    <glob pattern="*.roles"/>
+    <glob pattern="*.tld"/>
+    <glob pattern="*.types"/>
+    <glob pattern="*.vm"/>
+    <glob pattern="*.vsl"/>
+    <glob pattern="*.wsdd"/>
+    <glob pattern="*.xargs"/>
+    <glob pattern="*.xcat"/>
+    <glob pattern="*.xconf"/>
+    <glob pattern="*.xegrm"/>
+    <glob pattern="*.xgrm"/>
+    <glob pattern="*.xlex"/>
+    <glob pattern="*.xlog"/>
+    <glob pattern="*.xmap"/>
+    <glob pattern="*.xroles"/>
+    <glob pattern="*.xsamples"/>
+    <glob pattern="*.xsp"/>
+    <glob pattern="*.xweb"/>
+    <glob pattern="*.xwelcome"/>
+  </mime-type>
+
+  <mime-type type="text/prs.fallenstein.rst"/>
+  <mime-type type="text/prs.lines.tag">
+    <glob pattern="*.dsc"/>
+  </mime-type>
+  <mime-type type="text/red"/>
+  <mime-type type="text/rfc822-headers"/>
+  <mime-type type="text/richtext">
+    <glob pattern="*.rtx"/>
+  </mime-type>
+
+  <mime-type type="text/rtp-enc-aescm128"/>
+  <mime-type type="text/rtx"/>
+  <mime-type type="text/sgml">
+    <glob pattern="*.sgml"/>
+    <glob pattern="*.sgm"/>
+  </mime-type>
+  <mime-type type="text/t140"/>
+  <mime-type type="text/tab-separated-values">
+    <glob pattern="*.tsv"/>
+  </mime-type>
+
+  <mime-type type="text/troff">
+    <_comment>Roff/nroff/troff/groff Unformatted Manual Page (UNIX)</_comment>
+    <alias type="application/x-troff"/>
+    <alias type="application/x-troff-man"/>
+    <alias type="application/x-troff-me"/>
+    <alias type="application/x-troff-ms"/>
+    <magic priority="50">
+      <match value=".\\&quot;" type="string" offset="0"/>
+      <match value="'\\&quot;" type="string" offset="0"/>
+      <match value="'.\\&quot;" type="string" offset="0"/>
+      <match value="\\&quot;" type="string" offset="0"/>
+      <match value="'''" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.t"/>
+    <glob pattern="*.tr"/>
+    <glob pattern="*.roff"/>
+    <glob pattern="*.man"/>
+    <glob pattern="*.me"/>
+    <glob pattern="*.ms"/>
+  </mime-type>
+
+  <mime-type type="text/ulpfec"/>
+  <mime-type type="text/uri-list">
+    <glob pattern="*.uri"/>
+    <glob pattern="*.uris"/>
+    <glob pattern="*.urls"/>
+  </mime-type>
+  <mime-type type="text/vnd.abc"/>
+  <mime-type type="text/vnd.curl">
+    <glob pattern="*.curl"/>
+  </mime-type>
+  <mime-type type="text/vnd.curl.dcurl">
+    <glob pattern="*.dcurl"/>
+  </mime-type>
+  <mime-type type="text/vnd.curl.scurl">
+    <glob pattern="*.scurl"/>
+  </mime-type>
+  <mime-type type="text/vnd.curl.mcurl">
+    <glob pattern="*.mcurl"/>
+  </mime-type>
+  <mime-type type="text/vnd.dmclientscript"/>
+  <mime-type type="text/vnd.esmertec.theme-descriptor"/>
+  <mime-type type="text/vnd.fly">
+    <glob pattern="*.fly"/>
+  </mime-type>
+  <mime-type type="text/vnd.fmi.flexstor">
+    <glob pattern="*.flx"/>
+  </mime-type>
+  <mime-type type="text/vnd.graphviz">
+    <glob pattern="*.gv"/>
+  </mime-type>
+  <mime-type type="text/vnd.in3d.3dml">
+    <glob pattern="*.3dml"/>
+  </mime-type>
+  <mime-type type="text/vnd.in3d.spot">
+    <glob pattern="*.spot"/>
+  </mime-type>
+  <mime-type type="text/vnd.iptc.anpa">
+    <acronym>ANPA</acronym>
+    <_comment>American Newspaper Publishers Association Wire Feeds</_comment>
+    <glob pattern="*.anpa"/>
+    <magic priority="50">
+      <match value="\x16\x16\x01" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+  <mime-type type="text/vnd.iptc.newsml"/>
+  <mime-type type="text/vnd.iptc.nitf"/>
+  <mime-type type="text/vnd.latex-z"/>
+  <mime-type type="text/vnd.motorola.reflex"/>
+  <mime-type type="text/vnd.ms-mediapackage"/>
+  <mime-type type="text/vnd.net2phone.commcenter.command"/>
+  <mime-type type="text/vnd.si.uricatalogue"/>
+  <mime-type type="text/vnd.sun.j2me.app-descriptor">
+    <glob pattern="*.jad"/>
+  </mime-type>
+  <mime-type type="text/vnd.trolltech.linguist"/>
+  <mime-type type="text/vnd.wap.si"/>
+  <mime-type type="text/vnd.wap.sl"/>
+  <mime-type type="text/vnd.wap.wml">
+    <glob pattern="*.wml"/>
+  </mime-type>
+
+  <mime-type type="text/vnd.wap.wmlscript">
+    <_comment>WML Script</_comment>
+    <glob pattern="*.wmls"/>
+  </mime-type>
+
+  <mime-type type="text/x-awk">
+    <_comment>AWK script</_comment>
+    <magic priority="50">
+      <match value="#!/bin/gawk" type="string" offset="0"/>
+      <match value="#! /bin/gawk" type="string" offset="0"/>
+      <match value="#!/usr/bin/gawk" type="string" offset="0"/>
+      <match value="#! /usr/bin/gawk" type="string" offset="0"/>
+      <match value="#!/usr/local/bin/gawk" type="string" offset="0"/>
+      <match value="#! /usr/local/bin/gawk" type="string" offset="0"/>
+      <match value="#!/bin/awk" type="string" offset="0"/>
+      <match value="#! /bin/awk" type="string" offset="0"/>
+      <match value="#!/usr/bin/awk" type="string" offset="0"/>
+      <match value="#! /usr/bin/awk" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.awk"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-basic">
+    <_comment>Basic source code</_comment>
+    <glob pattern="*.bas"/>
+    <glob pattern="*.Bas"/>
+    <glob pattern="*.BAS"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-c++hdr">
+    <_comment>C++ source code header</_comment>
+    <glob pattern="*.hpp"/>
+    <glob pattern="*.hxx"/>
+    <glob pattern="*.hh"/>
+    <glob pattern="*.H"/>
+    <glob pattern="*.h++"/>
+    <glob pattern="*.hp"/>
+    <glob pattern="*.HPP"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-c++src">
+    <_comment>C++ source code</_comment>
+    <glob pattern="*.cpp"/>
+    <glob pattern="*.cxx"/>
+    <glob pattern="*.cc"/>
+    <glob pattern="*.C"/>
+    <glob pattern="*.c++"/>
+    <glob pattern="*.CPP"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-cgi">
+    <_comment>CGI script</_comment>
+    <glob pattern="*.cgi"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-chdr">
+    <_comment>C source code header</_comment>
+    <glob pattern="*.h"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-clojure">
+    <_comment>Clojure source code</_comment>
+    <glob pattern="*.clj"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-coffeescript">
+    <_comment>CoffeeScript source code</_comment>
+    <glob pattern="*.coffee"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-csrc">
+    <alias type="text/x-c"/>
+    <_comment>C source code</_comment>
+    <glob pattern="*.c"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-csharp">
+    <_comment>C# source code</_comment>
+    <glob pattern="*.cs"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-cobol">
+    <_comment>COBOL source code</_comment>
+    <glob pattern="*.cbl"/>
+    <glob pattern="*.Cbl"/>
+    <glob pattern="*.CBL"/>
+    <glob pattern="*.cob"/>
+    <glob pattern="*.Cob"/>
+    <glob pattern="*.COB"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-coldfusion">
+    <_comment>ColdFusion source code</_comment>
+    <glob pattern="*.cfm"/>
+    <glob pattern="*.cfml"/>
+    <glob pattern="*.cfc"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-common-lisp">
+    <_comment>Common Lisp source code</_comment>
+    <glob pattern="*.cl"/>
+    <glob pattern="*.jl"/>
+    <glob pattern="*.lisp"/>
+    <glob pattern="*.lsp"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-diff">
+    <magic priority="50">
+      <match value="diff\ " type="string" offset="0"/>
+      <match value="***\ " type="string" offset="0"/>
+      <match value="Only\ in\ " type="string" offset="0"/>
+      <match value="Common\ subdirectories:\ " type="string" offset="0"/>
+      <match value="Index:" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.diff"/>
+    <glob pattern="*.patch"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-eiffel">
+    <_comment>Eiffel source code</_comment>
+    <glob pattern="*.e"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-emacs-lisp">
+    <_comment>Emacs Lisp source code</_comment>
+    <glob pattern="*.el"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-erlang">
+    <_comment>Erlang source code</_comment>
+    <glob pattern="*.erl"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-expect">
+    <_comment>Expect Script</_comment>
+    <glob pattern="*.exp"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-forth">
+    <_comment>Forth source code</_comment>
+    <glob pattern="*.4th"/>
+    <sub-class-of type="text/plain"/>
+   </mime-type>
+
+  <mime-type type="text/x-fortran">
+    <_comment>Fortran source code</_comment>
+    <glob pattern="*.f"/>
+    <glob pattern="*.F"/>
+    <glob pattern="*.for"/>
+    <glob pattern="*.f77"/>
+    <glob pattern="*.f90"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-go">
+    <_comment>Go source code</_comment>
+    <glob pattern="*.go"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-groovy">
+    <_comment>Groovy source code</_comment>
+    <glob pattern="*.groovy"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-haskell">
+    <_comment>Haskell source code</_comment>
+    <glob pattern="*.hs"/>
+    <glob pattern="*.lhs"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-idl">
+    <_comment>Inteface Definition Language</_comment>
+    <glob pattern="*.idl"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-ini">
+    <_comment>Configuration file</_comment>
+    <glob pattern="*.ini"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-java-source">
+    <_comment>Java source code</_comment>
+    <alias type="text/x-java" />
+    <glob pattern="*.java"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-jsp">
+    <_comment>Java Server Page</_comment>
+    <alias type="application/x-httpd-jsp"/>
+    <sub-class-of type="text/plain"/>
+    <magic priority="50">
+      <match value="&lt;%@" type="string" offset="0"/>
+      <match value="&lt;%--" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.jsp"/>
+  </mime-type>
+
+  <mime-type type="text/x-less">
+    <_comment>LESS source code</_comment>
+    <glob pattern="*.less"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-lex">
+    <_comment>Lex/Flex source code</_comment>
+    <glob pattern="*.l"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-log">
+    <_comment>application log</_comment>
+    <glob pattern="*.log"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-lua">
+    <_comment>Lua source code</_comment>
+    <glob pattern="*.lua"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-ml">
+    <_comment>ML source code</_comment>
+    <glob pattern="*.ml"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-matlab">
+    <_comment>Matlab source code</_comment>
+    <magic priority="50">
+      <match value="function [" type="string" offset="0"/>
+    </magic>
+    <!-- <glob pattern="*.m"/> - conflicts with text/x-objcsrc -->
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-modula">
+    <_comment>Modula source code</_comment>
+    <glob pattern="*.m3"/>
+    <glob pattern="*.i3"/>
+    <glob pattern="*.mg"/>
+    <glob pattern="*.ig"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-objcsrc">
+    <_comment>Objective-C source code</_comment>
+    <glob pattern="*.m"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-ocaml">
+    <_comment>Ocaml source code</_comment>
+    <glob pattern="*.ocaml"/>
+    <glob pattern="*.mli"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-pascal">
+    <_comment>Pascal source code</_comment>
+    <glob pattern="*.p"/>
+    <glob pattern="*.pp"/>
+    <glob pattern="*.pas"/>
+    <glob pattern="*.PAS"/>
+    <glob pattern="*.dpr"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-perl">
+    <_comment>Perl script</_comment>
+    <magic priority="50">
+      <match value="eval \&quot;exec /usr/local/bin/perl" type="string" offset="0"/>
+      <match value="#!/bin/perl" type="string" offset="0"/>
+      <match value="#!/bin/env perl" type="string" offset="0"/>
+      <match value="#!/usr/bin/perl" type="string" offset="0"/>
+      <match value="#!/usr/local/bin/perl" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.pl"/>
+    <glob pattern="*.pm"/>
+    <glob pattern="*.al"/>
+    <glob pattern="*.perl"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-php">
+    <_comment>PHP script</_comment>
+    <magic priority="50">
+      <match value="&lt;?php" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.php"/>
+    <glob pattern="*.php3"/>
+    <glob pattern="*.php4"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-prolog">
+    <_comment>Prolog source code</_comment>
+    <glob pattern="*.pro"/>
+    <!-- <glob pattern="*.pl"/> - conflicts with text/x-perl -->
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-python">
+    <_comment>Python script</_comment>
+    <magic priority="50">
+      <match value="#!/bin/python" type="string" offset="0"/>
+      <match value="#! /bin/python" type="string" offset="0"/>
+      <match value="eval &quot;exec /bin/python" type="string" offset="0"/>
+      <match value="#!/usr/bin/python" type="string" offset="0"/>
+      <match value="#! /usr/bin/python" type="string" offset="0"/>
+      <match value="eval &quot;exec /usr/bin/python" type="string" offset="0"/>
+      <match value="#!/usr/local/bin/python" type="string" offset="0"/>
+      <match value="#! /usr/local/bin/python" type="string" offset="0"/>
+      <match value="eval &quot;exec /usr/local/bin/python" type="string" offset="0"/>
+      <match value="/bin/env python" type="string" offset="1"/>
+    </magic>
+    <glob pattern="*.py"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-rst">
+    <_comment>reStructuredText source code</_comment>
+    <glob pattern="*.rest"/>
+    <glob pattern="*.rst"/>
+    <glob pattern="*.restx"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-rexx">
+    <_comment>Rexx source code</_comment>
+    <glob pattern="*.rexx"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-ruby">
+    <_comment>Ruby source code</_comment>
+    <glob pattern="*.rb"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-scala">
+    <_comment>Scala source code</_comment>
+    <glob pattern="*.scala"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-scheme">
+    <_comment>Scheme source code</_comment>
+    <glob pattern="*.scm"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-sed">
+    <_comment>Sed code</_comment>
+    <glob pattern="*.sed"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-sql">
+    <_comment>SQL code</_comment>
+    <glob pattern="*.sql"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-setext">
+    <glob pattern="*.etx"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-stsrc">
+    <_comment>Smalltalk source code</_comment>
+    <glob pattern="*.st"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-tcl">
+    <alias type="application/x-tcl"/>
+    <_comment>Tcl script</_comment>
+    <glob pattern="*.itk"/>
+    <glob pattern="*.tcl"/>
+    <glob pattern="*.tk"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-uuencode">
+    <glob pattern="*.uu"/>
+  </mime-type>
+
+  <mime-type type="text/x-vbasic">
+    <_comment>Visual basic source code</_comment>
+    <glob pattern="*.cls"/>
+    <glob pattern="*.Cls"/>
+    <glob pattern="*.CLS"/>
+    <glob pattern="*.frm"/>
+    <glob pattern="*.Frm"/>
+    <glob pattern="*.FRM"/>
+    <sub-class-of type="text/x-basic"/>
+  </mime-type>
+
+  <mime-type type="text/x-vbdotnet">
+    <_comment>VB.NET source code</_comment>
+    <glob pattern="*.vb"/>
+    <sub-class-of type="text/x-vbasic"/>
+  </mime-type>
+
+  <mime-type type="text/x-vbscript">
+    <_comment>VBScript source code</_comment>
+    <glob pattern="*.vbs"/>
+    <sub-class-of type="text/x-vbasic"/>
+  </mime-type>
+
+  <mime-type type="text/x-vcalendar">
+    <glob pattern="*.vcs"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-vcard">
+    <glob pattern="*.vcf"/>
+    <sub-class-of type="text/plain"/>
+    <magic priority="50">
+      <match value="BEGIN:VCARD" type="string" offset="0"/>
+    </magic>
+  </mime-type>
+
+  <mime-type type="text/x-verilog">
+    <_comment>Verilog source code</_comment>
+    <glob pattern="*.v"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-vhdl">
+    <_comment>VHDL source code</_comment>
+    <glob pattern="*.vhd"/>
+    <glob pattern="*.vhdl"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-web-markdown">
+    <_comment>Markdown source code</_comment>
+    <glob pattern="*.md"/>
+    <glob pattern="*.mdtext"/>
+    <glob pattern="*.mkd"/>
+    <glob pattern="*.markdown"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-yacc">
+    <_comment>Yacc/Bison source code</_comment>
+    <glob pattern="*.y"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-yaml">
+    <_comment>YAML source code</_comment>
+    <glob pattern="*.yaml"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="video/3gpp">
+    <magic priority="60">
+      <match value="ftyp3ge6" type="string" offset="4"/>
+      <match value="ftyp3ge7" type="string" offset="4"/>
+      <match value="ftyp3gg6" type="string" offset="4"/>
+      <match value="ftyp3gp1" type="string" offset="4"/>
+      <match value="ftyp3gp2" type="string" offset="4"/>
+      <match value="ftyp3gp3" type="string" offset="4"/>
+      <match value="ftyp3gp4" type="string" offset="4"/>
+      <match value="ftyp3gp5" type="string" offset="4"/>
+      <match value="ftyp3gp6" type="string" offset="4"/>
+      <match value="ftyp3gs7" type="string" offset="4"/>
+    </magic>
+    <glob pattern="*.3gp"/>
+  </mime-type>
+  <mime-type type="video/3gpp-tt"/>
+  <mime-type type="video/3gpp2">
+    <magic priority="60">
+      <match value="ftyp3g2a" type="string" offset="4"/>
+      <match value="ftyp3g2b" type="string" offset="4"/>
+      <match value="ftyp3g2c" type="string" offset="4"/>
+    </magic>
+    <glob pattern="*.3g2"/>
+  </mime-type>
+  <mime-type type="video/bmpeg"/>
+  <mime-type type="video/bt656"/>
+  <mime-type type="video/celb"/>
+  <mime-type type="video/dv"/>
+  <mime-type type="video/example"/>
+  <mime-type type="video/h261">
+    <glob pattern="*.h261"/>
+  </mime-type>
+  <mime-type type="video/h263">
+    <glob pattern="*.h263"/>
+  </mime-type>
+  <mime-type type="video/h263-1998"/>
+  <mime-type type="video/h263-2000"/>
+  <mime-type type="video/h264">
+    <glob pattern="*.h264"/>
+  </mime-type>
+  <mime-type type="video/jpeg">
+    <glob pattern="*.jpgv"/>
+  </mime-type>
+  <mime-type type="video/jpeg2000"/>
+
+  <mime-type type="video/mj2">
+    <sub-class-of type="image/x-jp2-container" />
+    <acronym>MJ2</acronym>
+    <_comment>JPEG 2000 Part 3 (Motion JPEG, MJ2)</_comment>
+    <magic priority="50">
+      <match value="0x0000000C6A5020200D0A870A" type="string" offset="0">
+        <match value="0x6d6a7032" type="string" offset="20"/>
+      </match>
+    </magic>
+    <glob pattern="*.mj2"/>
+    <glob pattern="*.mjp2"/>
+  </mime-type>
+
+  <mime-type type="video/mp1s"/>
+  <mime-type type="video/mp2p"/>
+  <mime-type type="video/mp2t"/>
+
+  <mime-type type="video/mp4">
+    <magic priority="60">
+      <match value="ftypmp41" type="string" offset="4"/>
+      <match value="ftypmp42" type="string" offset="4"/>
+    </magic>
+    <glob pattern="*.mp4"/>
+    <glob pattern="*.mp4v"/>
+    <glob pattern="*.mpg4"/>
+    <sub-class-of type="video/quicktime" />
+  </mime-type>
+  <mime-type type="video/mp4v-es"/>
+
+  <mime-type type="video/mpeg">
+    <_comment>MPEG Movie Clip</_comment>
+    <magic priority="50">
+      <match value="\000\000\001\263" type="string" offset="0"/>
+      <match value="\000\000\001\272" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.mpeg"/>
+    <glob pattern="*.mpg"/>
+    <glob pattern="*.mpe"/>
+    <glob pattern="*.m1v"/>
+    <glob pattern="*.m2v"/>
+  </mime-type>
+
+  <mime-type type="video/mpeg4-generic"/>
+  <mime-type type="video/mpv"/>
+  <mime-type type="video/nv"/>
+
+  <mime-type type="video/ogg">
+    <_comment>Ogg Vorbis Video</_comment>
+    <glob pattern="*.ogv"/>
+    <sub-class-of type="application/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/theora">
+    <_comment>Ogg Theora Video</_comment>
+    <alias type="video/x-theora"/>
+    <magic priority="60">
+      <!-- Assumes Video stream comes before Audio, may not always -->
+      <match value="OggS\000.......................\x80theora" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFFFFFFFF"
+             offset="0"/>
+    </magic>
+    <sub-class-of type="video/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/x-dirac">
+    <_comment>Ogg Packaged Dirac Video</_comment>
+    <magic priority="60">
+      <match value="OggS\000.......................BBCD" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFF"
+             offset="0"/>
+    </magic>
+    <glob pattern="*.drc"/>
+    <sub-class-of type="video/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/x-ogm">
+    <_comment>Ogg Packaged OGM Video</_comment>
+    <magic priority="60">
+      <!-- Assumes Video stream comes before Audio, may not always -->
+      <match value="OggS\000.......................video" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFFFF"
+             offset="0"/>
+    </magic>
+    <glob pattern="*.ogm"/>
+    <sub-class-of type="video/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/x-ogguvs">
+    <_comment>Ogg Packaged Raw UVS Video</_comment>
+    <alias type="video/x-ogg-uvs"/>
+    <magic priority="60">
+      <match value="OggS\000.......................UVS " type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFF"
+             offset="0"/>
+    </magic>
+    <sub-class-of type="video/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/x-oggyuv">
+    <_comment>Ogg Packaged Raw YUV Video</_comment>
+    <alias type="video/x-ogg-yuv"/>
+    <magic priority="60">
+      <match value="OggS\000.......................\001YUV" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFF"
+             offset="0"/>
+    </magic>
+    <sub-class-of type="video/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/x-oggrgb">
+    <_comment>Ogg Packaged Raw RGB Video</_comment>
+    <alias type="video/x-ogg-rgb"/>
+    <magic priority="60">
+      <match value="OggS\000.......................\001RGB" type="string"
+             mask="0xFFFFFFFF00000000000000000000000000000000000000000000000000FFFFFFFF"
+             offset="0"/>
+    </magic>
+    <sub-class-of type="video/ogg"/>
+  </mime-type>
+
+  <mime-type type="video/parityfec"/>
+  <mime-type type="video/pointer"/>
+
+  <mime-type type="video/quicktime">
+    <magic priority="50">
+      <match value="moov" type="string" offset="4"/>
+      <match value="mdat" type="string" offset="4"/>
+      <!-- General match, specific ftypXXX ones present for subtypes -->
+      <match value="ftyp" type="string" offset="4"/>
+    </magic>
+    <glob pattern="*.qt"/>
+    <glob pattern="*.mov"/>
+  </mime-type>
+
+  <mime-type type="video/raw"/>
+  <mime-type type="video/rtp-enc-aescm128"/>
+  <mime-type type="video/rtx"/>
+  <mime-type type="video/smpte292m"/>
+  <mime-type type="video/ulpfec"/>
+  <mime-type type="video/vc1"/>
+  <mime-type type="video/vnd.cctv"/>
+  <mime-type type="video/vnd.dlna.mpeg-tts"/>
+  <mime-type type="video/vnd.fvt">
+    <glob pattern="*.fvt"/>
+  </mime-type>
+  <mime-type type="video/vnd.hns.video"/>
+  <mime-type type="video/vnd.iptvforum.1dparityfec-1010"/>
+  <mime-type type="video/vnd.iptvforum.1dparityfec-2005"/>
+  <mime-type type="video/vnd.iptvforum.2dparityfec-1010"/>
+  <mime-type type="video/vnd.iptvforum.2dparityfec-2005"/>
+  <mime-type type="video/vnd.iptvforum.ttsavc"/>
+  <mime-type type="video/vnd.iptvforum.ttsmpeg2"/>
+  <mime-type type="video/vnd.motorola.video"/>
+  <mime-type type="video/vnd.motorola.videop"/>
+  <mime-type type="video/vnd.mpegurl">
+    <glob pattern="*.mxu"/>
+    <glob pattern="*.m4u"/>
+  </mime-type>
+  <mime-type type="video/vnd.ms-playready.media.pyv">
+    <glob pattern="*.pyv"/>
+  </mime-type>
+  <mime-type type="video/vnd.nokia.interleaved-multimedia"/>
+  <mime-type type="video/vnd.nokia.videovoip"/>
+  <mime-type type="video/vnd.objectvideo"/>
+  <mime-type type="video/vnd.sealed.mpeg1"/>
+  <mime-type type="video/vnd.sealed.mpeg4"/>
+  <mime-type type="video/vnd.sealed.swf"/>
+  <mime-type type="video/vnd.sealedmedia.softseal.mov"/>
+  <mime-type type="video/vnd.vivo">
+    <glob pattern="*.viv"/>
+  </mime-type>
+  <mime-type type="video/x-f4v">
+    <glob pattern="*.f4v"/>
+  </mime-type>
+
+  <mime-type type="video/x-flc">
+    <glob pattern="*.flc"/>
+  </mime-type>
+
+  <mime-type type="video/x-fli">
+    <glob pattern="*.fli"/>
+  </mime-type>
+
+  <mime-type type="video/x-flv">
+    <magic priority="50">
+      <match value="FLV" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.flv"/>
+  </mime-type>
+
+  <mime-type type="video/x-jng">
+    <magic priority="50">
+      <match value="\x8bJNG" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.jng"/>
+  </mime-type>
+
+  <mime-type type="video/x-m4v">
+    <magic priority="60">
+      <match value="ftypM4V " type="string" offset="4"/>
+      <match value="ftypM4VH" type="string" offset="4"/>
+      <match value="ftypM4VP" type="string" offset="4"/>
+    </magic>
+    <glob pattern="*.m4v"/>
+    <sub-class-of type="video/mp4" />
+  </mime-type>
+
+  <mime-type type="video/x-mng">
+    <magic priority="50">
+      <match value="\x8aMNG" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.mng"/>
+  </mime-type>
+
+  <mime-type type="video/x-ms-asf">
+    <glob pattern="*.asf"/>
+    <glob pattern="*.asx"/>
+    <magic>
+       <match value="0x3026b275" type="big32" offset="0" />
+    </magic>
+  </mime-type>
+  <mime-type type="video/x-ms-wm">
+    <glob pattern="*.wm"/>
+  </mime-type>
+  <mime-type type="video/x-ms-wmv">
+    <sub-class-of type="video/x-ms-asf" />
+    <glob pattern="*.wmv"/>
+    <magic priority="60">
+       <match value="Windows Media Video" type="unicodeLE" offset="0:8192" />
+       <match value="VC-1 Advanced Profile" type="unicodeLE" offset="0:8192" />
+    </magic>
+  </mime-type>
+  <mime-type type="video/x-ms-wmx">
+    <glob pattern="*.wmx"/>
+  </mime-type>
+  <mime-type type="video/x-ms-wvx">
+    <glob pattern="*.wvx"/>
+  </mime-type>
+
+  <mime-type type="video/x-msvideo">
+    <_comment>Audio Video Interleave File</_comment>
+    <alias type="video/avi"/>
+    <alias type="video/msvideo"/>
+    <magic priority="50">
+      <match value="RIFF....AVI " type="string" offset="0"
+             mask="0xFFFFFFFF00000000FFFFFFFF"/>
+      <match offset="8" type="string" value="\x41\x56\x49\x20"/>
+    </magic>
+    <glob pattern="*.avi"/>
+  </mime-type>
+
+  <mime-type type="video/x-sgi-movie">
+    <magic priority="50">
+      <match value="MOVI" type="string" offset="0"/>
+    </magic>
+    <glob pattern="*.movie"/>
+  </mime-type>
+
+  <mime-type type="application/x-matroska">
+    <_comment>Matroska Media Container</_comment>
+    <!-- Common magic across all Matroska varients -->
+    <!-- For full detection, we need a custom Detector, see TIKA-1180 -->
+    <magic priority="40">
+      <match value="0x1A45DFA3" type="string" offset="0" />
+    </magic>
+  </mime-type>
+
+  <mime-type type="video/x-matroska">
+    <sub-class-of type="application/x-matroska"/>
+    <glob pattern="*.mkv" />
+    <!-- Note: The magic value below isn't present in all MKV files -->
+    <magic priority="50">
+      <match value="0x1A45DFA3934282886D6174726F736B61" type="string" offset="0" />
+    </magic>
+  </mime-type>
+  <mime-type type="audio/x-matroska">
+    <sub-class-of type="application/x-matroska"/>
+    <glob pattern="*.mka" />
+  </mime-type>
+
+  <mime-type type="video/webm">
+    <sub-class-of type="application/x-matroska"/>
+    <glob pattern="*.webm" />
+  </mime-type>
+
+  <mime-type type="x-conference/x-cooltalk">
+    <_comment>Cooltalk Audio</_comment>
+    <glob pattern="*.ice"/>
+  </mime-type>
+
+  <mime-type type="application/x-fictionbook+xml">
+      <_comment>FictionBook document</_comment>
+      <sub-class-of type="application/xml"/>
+      <root-XML namespaceURI="http://www.gribuser.ru/xml/fictionbook/2.0" localName="FictionBook"/>
+      <glob pattern="*.fb2"/>
+  </mime-type>
+
+    <mime-type type="text/x-asciidoc">
+    <_comment>Asciidoc source code</_comment>
+    <glob pattern="*.asciidoc"/>
+    <glob pattern="*.adoc"/>
+    <glob pattern="*.ad"/>
+    <glob pattern="*.ad.txt"/>
+    <glob pattern="*.adoc.txt"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-d">
+    <_comment>D source code</_comment>
+    <glob pattern="*.d"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-haml">
+    <_comment>HAML source code</_comment>
+    <glob pattern="*.haml"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-haxe">
+    <_comment>Haxe source code</_comment>
+    <glob pattern="*.hx"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="text/x-rsrc">
+    <_comment>R source code</_comment>
+    <glob pattern="*.r"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+  <mime-type type="application/xquery">
+    <_comment>XQuery source code</_comment>
+    <glob pattern="*.xq"/>
+    <glob pattern="*.xquery"/>
+    <sub-class-of type="text/plain"/>
+  </mime-type>
+
+</mime-info>
Index: tika-batch/src/test/resources/tika-batch-config-evil-test.xml
===================================================================
--- tika-batch/src/test/resources/tika-batch-config-evil-test.xml	(revision 0)
+++ tika-batch/src/test/resources/tika-batch-config-evil-test.xml	(revision 0)
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+
+<tika-batch-config
+        maxAliveTimeSeconds="-1"
+        pauseOnEarlyTerminationMillis="500"
+        staleThresholdMillis="3000"
+        staleCheckPulseMillis="1000"
+        maxStaleConsumers="2"
+        maxQueueSize="10000"
+        numConsumers="3">
+
+    <!--
+        Can also add startDir: this tells the crawler to start indexing a
+        child directory of the srcDir directory.
+    -->
+	<crawler builderClass="org.apache.tika.batch.fs.builders.FSCrawlerBuilder"
+        crawlOrder="sorted"
+        maxConsecWaitMillis="5000"
+        maxFilesToAdd="-1"
+		maxFilesToConsider="-1" 
+		includeFilePat=""
+		excludeFilePat=""
+		maxFileSizeBytes="-1"
+        srcDir="tika-batch/src/test/resources/test-input"
+        />
+
+
+<!--
+    This is an example of a crawler that reads a list of files to be processed from a
+    file.  This assumes that the files in the list are relative to srcDir.
+    <crawler builderClass="org.apache.tika.batch.fs.builders.FSCrawlerBuilder"
+             fileList="files.txt"
+             fileListEncoding="UTF-8"
+             maxFilesToAdd="-1"
+             maxFilesToConsider="-1"
+             includeFilePat="(?i).pdf$"
+             excludeFilePat="(?i).msg$"
+             maxFileSizeBytes="-1"
+             srcDir="input"
+    />
+-->
+	<consumers builderClass="org.apache.tika.batch.fs.builders.BasicTikaFSConsumersBuilder" recursiveParserWrapper="false">
+		<parser class="org.apache.tika.parser.evil.EvilParserFactory" parseRecursively="true"/>
+		<contenthandler builderClass="org.apache.tika.batch.builders.DefaultContentHandlerFactoryBuilder"
+                        basicHandlerType="xml" writeLimit="-1"/>
+		
+		<!-- overwritePolicy: "skip" a file if target file exists, "rename" a target file, "overwrite" -->
+		<outputstream class="FSOutputStreamFactory" handleExisting="skip" targDir="output"
+                encoding="UTF-8" targetSuffix="xml"/>
+	</consumers>
+	
+	<!-- reporter and interrupter are optional -->
+	<reporter builderClass="org.apache.tika.batch.builders.SimpleLogReporterBuilder" sleepMillis="1000" staleThresholdMillis="500000"/>
+	<interrupter builderClass="org.apache.tika.batch.builders.CommandLineInterrupterBuilder"/>
+</tika-batch-config>
\ No newline at end of file
Index: tika-batch/src/test/resources/tika-batch-config-basic-test.xml
===================================================================
--- tika-batch/src/test/resources/tika-batch-config-basic-test.xml	(revision 0)
+++ tika-batch/src/test/resources/tika-batch-config-basic-test.xml	(revision 0)
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+
+<tika-batch-config
+        maxAliveTimeSeconds="-1"
+        pauseOnEarlyTerminationMillis = "500"
+        staleThresholdMillis="300000"
+        staleCheckPulseMillis="1000"
+        maxStaleConsumers="2"
+        maxQueueSize="10000"
+        numConsumers="5">
+
+    <!--
+        Can also add startDir: this tells the crawler to start indexing a
+        child directory of the srcDir directory.
+    -->
+	<crawler builderClass="org.apache.tika.batch.fs.builders.FSCrawlerBuilder"
+		crawlOrder="sorted"
+        maxConsecWaitMillis="5000"
+		maxFilesToAdd="-1" 
+		maxFilesToConsider="-1" 
+		includeFilePat=""
+		excludeFilePat=""
+		maxFileSizeBytes="-1"
+        srcDir="tika-batch/src/test/resources/test-input"
+        />
+
+
+<!--
+    This is an example of a crawler that reads a list of files to be processed from a
+    file.  This assumes that the files in the list are relative to srcDir.
+    <crawler builderClass="org.apache.tika.batch.fs.builders.FSCrawlerBuilder"
+             fileList="files.txt"
+             fileListEncoding="UTF-8"
+             maxFilesToAdd="-1"
+             maxFilesToConsider="-1"
+             includeFilePat="(?i).pdf$"
+             excludeFilePat="(?i).msg$"
+             maxFileSizeBytes="-1"
+             srcDir="input"
+             startDir="input/subdir1"
+    />
+-->
+	<consumers builderClass="org.apache.tika.batch.fs.builders.BasicTikaFSConsumersBuilder" recursiveParserWrapper="false">
+		<parser class="org.apache.tika.batch.AutoDetectParserFactory" parseRecursively="true"/>
+		<contenthandler builderClass="org.apache.tika.batch.builders.DefaultContentHandlerFactoryBuilder"
+                        basicHandlerType="xml" writeLimit="-1"/>
+		
+		<!-- overwritePolicy: "skip" a file if target file exists, "rename" a target file, "overwrite" -->
+		<outputstream class="FSOutputStreamFactory" handleExisting="skip" targDir="output"
+                encoding="UTF-8" targetSuffix="xml"/>
+	</consumers>
+	
+	<!-- reporter and interrupter are optional -->
+	<reporter builderClass="org.apache.tika.batch.builders.SimpleLogReporterBuilder" sleepMillis="1000" staleThresholdMillis="500000"/>
+	<interrupter builderClass="org.apache.tika.batch.builders.CommandLineInterrupterBuilder"/>
+</tika-batch-config>
\ No newline at end of file
Index: tika-batch/src/test/resources/log4j.properties
===================================================================
--- tika-batch/src/test/resources/log4j.properties	(revision 0)
+++ tika-batch/src/test/resources/log4j.properties	(revision 0)
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#info,debug, error,fatal ...
+log4j.rootLogger=debug
+
+#console
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+
+# Pattern to output the caller's file name and line number.
+log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
Index: tika-batch/src/test/resources/test-input/basic/test1.txt
===================================================================
--- tika-batch/src/test/resources/test-input/basic/test1.txt	(revision 0)
+++ tika-batch/src/test/resources/test-input/basic/test1.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load1.evil
===================================================================
--- tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load1.evil	(revision 0)
+++ tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load1.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load2.evil
===================================================================
--- tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load2.evil	(revision 0)
+++ tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load2.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load3.evil
===================================================================
--- tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load3.evil	(revision 0)
+++ tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load3.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load4.evil
===================================================================
--- tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load4.evil	(revision 0)
+++ tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load4.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load5.evil
===================================================================
--- tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load5.evil	(revision 0)
+++ tika-batch/src/test/resources/test-input/heavy_heavy_hangs/hang_heavy_load5.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/heavy_heavy_hangs/test1.txt
===================================================================
--- tika-batch/src/test/resources/test-input/heavy_heavy_hangs/test1.txt	(revision 0)
+++ tika-batch/src/test/resources/test-input/heavy_heavy_hangs/test1.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/oom/test2.txt
===================================================================
--- tika-batch/src/test/resources/test-input/oom/test2.txt	(revision 0)
+++ tika-batch/src/test/resources/test-input/oom/test2.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/oom/test3.txt
===================================================================
--- tika-batch/src/test/resources/test-input/oom/test3.txt	(revision 0)
+++ tika-batch/src/test/resources/test-input/oom/test3.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/oom/test4.txt
===================================================================
--- tika-batch/src/test/resources/test-input/oom/test4.txt	(revision 0)
+++ tika-batch/src/test/resources/test-input/oom/test4.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/oom/hang_heavy_load.evil
===================================================================
--- tika-batch/src/test/resources/test-input/oom/hang_heavy_load.evil	(revision 0)
+++ tika-batch/src/test/resources/test-input/oom/hang_heavy_load.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/oom/asleep_10000.evil
===================================================================
--- tika-batch/src/test/resources/test-input/oom/asleep_10000.evil	(revision 0)
+++ tika-batch/src/test/resources/test-input/oom/asleep_10000.evil	(revision 0)
@@ -0,0 +1 @@
+sleep 10000
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/oom/test1b_oom_exception.evil
===================================================================
--- tika-batch/src/test/resources/test-input/oom/test1b_oom_exception.evil	(revision 0)
+++ tika-batch/src/test/resources/test-input/oom/test1b_oom_exception.evil	(revision 0)
@@ -0,0 +1 @@
+oom exception
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/oom/test1.txt
===================================================================
--- tika-batch/src/test/resources/test-input/oom/test1.txt	(revision 0)
+++ tika-batch/src/test/resources/test-input/oom/test1.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/one_heavy_hang/test2.txt
===================================================================
--- tika-batch/src/test/resources/test-input/one_heavy_hang/test2.txt	(revision 0)
+++ tika-batch/src/test/resources/test-input/one_heavy_hang/test2.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/one_heavy_hang/test3.txt
===================================================================
--- tika-batch/src/test/resources/test-input/one_heavy_hang/test3.txt	(revision 0)
+++ tika-batch/src/test/resources/test-input/one_heavy_hang/test3.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/one_heavy_hang/test4.txt
===================================================================
--- tika-batch/src/test/resources/test-input/one_heavy_hang/test4.txt	(revision 0)
+++ tika-batch/src/test/resources/test-input/one_heavy_hang/test4.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/one_heavy_hang/hang_heavy_load1.evil
===================================================================
--- tika-batch/src/test/resources/test-input/one_heavy_hang/hang_heavy_load1.evil	(revision 0)
+++ tika-batch/src/test/resources/test-input/one_heavy_hang/hang_heavy_load1.evil	(revision 0)
@@ -0,0 +1 @@
+hang heavy load
\ No newline at end of file
Index: tika-batch/src/test/resources/test-input/one_heavy_hang/test1.txt
===================================================================
--- tika-batch/src/test/resources/test-input/one_heavy_hang/test1.txt	(revision 0)
+++ tika-batch/src/test/resources/test-input/one_heavy_hang/test1.txt	(revision 0)
@@ -0,0 +1 @@
+This is tika-batch's first test file.
\ No newline at end of file
Index: tika-batch/src/main/java/org/apache/tika/batch/StatusReporterFutureResult.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/StatusReporterFutureResult.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/StatusReporterFutureResult.java	(revision 0)
@@ -0,0 +1,23 @@
+package org.apache.tika.batch;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Empty class for what a StatusReporter returns when it finishes.
+ */
+public class StatusReporterFutureResult implements IFileProcessorFutureResult {
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/FileResourceCrawlerFutureResult.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/FileResourceCrawlerFutureResult.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/FileResourceCrawlerFutureResult.java	(revision 0)
@@ -0,0 +1,37 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+class FileResourceCrawlerFutureResult implements IFileProcessorFutureResult {
+
+  private final int considered;
+  private final int added;
+  
+  protected FileResourceCrawlerFutureResult(int considered, int added) {
+    this.considered = considered;
+    this.added = added;
+  }
+  
+  protected int getConsidered() {
+    return considered;
+  }
+  
+  protected int getAdded() {
+    return added;
+  }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/BatchNoRestartException.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/BatchNoRestartException.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/BatchNoRestartException.java	(revision 0)
@@ -0,0 +1,33 @@
+package org.apache.tika.batch;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * FileResourceConsumers should throw this if something
+ * terrible has happened and the BatchProcess should shutdown
+ * and not be restarted.
+ */
+public class BatchNoRestartException extends RuntimeException {
+
+    public BatchNoRestartException() {
+        super();
+    }
+
+    public BatchNoRestartException(String message) {
+        super(message);
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/FileResourceConsumer.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/FileResourceConsumer.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/FileResourceConsumer.java	(revision 0)
@@ -0,0 +1,308 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.log4j.Logger;
+
+import java.io.Closeable;
+import java.io.Flushable;
+import java.io.IOException;
+import java.util.Date;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+
+/**
+ * This is a base class for file consumers. The
+ * goal of this class is to abstract out the multithreading
+ * and recordkeeping components.
+ * <p/>
+ */
+public abstract class FileResourceConsumer implements Callable<IFileProcessorFutureResult> {
+
+
+
+
+    private static enum STATE {
+        NOT_YET_STARTED,
+        ACTIVELY_CONSUMING,
+        SWALLOWED_POISON,
+        THREAD_INTERRUPTED,
+        EXCEEDED_MAX_CONSEC_WAIT_MILLIS,
+        RETIRED,
+        GONE_STALE,
+        CONSUMER_EXCEPTION,
+        CONSUMER_ERROR,
+        COMPLETED
+    }
+    private static AtomicInteger numConsumers = new AtomicInteger(-1);
+    private static Logger logger = Logger.getLogger(FileResourceConsumer.class);
+
+    private long maxConsecWaitInMillis = 10*60*1000;// 10 minutes
+
+    private final ArrayBlockingQueue<FileResource> fileQueue;
+
+    private final int consumerId;
+
+    //used to lock checks on state to prevent
+    private final Object lock = new Object();
+
+    //this records the file that is currently
+    //being processed.  It is null if no file is currently being processed.
+    //no need for volatile because of lock for checkForStales
+    private FileStarted currentFile = null;
+
+    //total number of files consumed; volatile so that reporter
+    //sees the latest
+    private volatile int numResourcesConsumed = 0;
+
+    //total number of exceptions that were handled by subclasses;
+    //volatile so that reporter sees the latest
+    private volatile int numHandledExceptions = 0;
+
+    //after this has been set to ACTIVELY_CONSUMING,
+    //this should only be set by setEndedState.
+    private volatile STATE currentState = STATE.NOT_YET_STARTED;
+
+    public FileResourceConsumer(ArrayBlockingQueue<FileResource> fileQueue) {
+        this.fileQueue = fileQueue;
+        consumerId = numConsumers.incrementAndGet();
+    }
+
+    public IFileProcessorFutureResult call() {
+        currentState = STATE.ACTIVELY_CONSUMING;
+
+        try {
+            FileResource fileResource = getNextFileResource();
+            while (fileResource != null) {
+                logger.debug("file consumer is about to process: " + fileResource.getResourceId());
+                boolean consumed = _processFileResource(fileResource);
+                logger.debug("file consumer has finished processing: " + fileResource.getResourceId());
+
+                if (consumed) {
+                    numResourcesConsumed++;
+                }
+                fileResource = getNextFileResource();
+            }
+        } catch (InterruptedException e) {
+            setEndedState(STATE.THREAD_INTERRUPTED);
+        }
+
+        setEndedState(STATE.COMPLETED);
+        return new FileConsumerFutureResult(currentFile, numResourcesConsumed);
+    }
+
+
+    /**
+     * Main piece of code that needs to be implemented.  Clients
+     * are responsible for closing streams and handling the exceptions
+     * that they'd like to handle.
+     * <p/>
+     * Unchecked throwables can be thrown past this, of course.  When an unchecked
+     * throwable is thrown, this logs the error, and then rethrows the exception.
+     * Clients/subclasses should make sure to catch and handle everything they can.
+     * <p/>
+     * The design goal is that the whole process should close up and shutdown soon after
+     * an unchecked exception or error is thrown.
+     * <p/>
+     * Make sure to call {@link #incrementHandledExceptions()} appropriately in
+     * your implementation of this method.
+     * <p/>
+     *
+     * @param fileResource
+     * @return whether or not a file was successfully processed
+     */
+    public abstract boolean processFileResource(FileResource fileResource);
+
+
+    /**
+     * Make sure to call this appropriately!
+     */
+    protected void incrementHandledExceptions() {
+        numHandledExceptions++;
+    }
+
+
+    public boolean isStillActive() {
+        return (! Thread.currentThread().isInterrupted() &&
+                (currentState == STATE.NOT_YET_STARTED ||
+                currentState == STATE.ACTIVELY_CONSUMING));
+    }
+
+    private boolean _processFileResource(FileResource fileResource) {
+        currentFile = new FileStarted(fileResource.getResourceId());
+        boolean consumed = false;
+        try {
+            consumed = processFileResource(fileResource);
+        } catch (RuntimeException e) {
+            setEndedState(STATE.CONSUMER_EXCEPTION);
+            throw e;
+        } catch (Error e) {
+            setEndedState(STATE.CONSUMER_ERROR);
+            throw e;
+        }
+        //if anything is thrown from processFileResource, then the fileStarted
+        //will remain what it was right before the exception was thrown.
+        currentFile = null;
+        return consumed;
+    }
+
+    /**
+     * This politely asks the consumer to shutdown.
+     * Before processing another file, the consumer will check to see
+     * if it has been asked to terminate.
+     * <p>
+     * This offers another method for politely requesting
+     * that a FileResourceConsumer stop processing
+     * besides passing it {@link org.apache.tika.batch.PoisonFileResource}.
+     *
+     */
+    public void pleaseRetire() {
+        setEndedState(STATE.RETIRED);
+    }
+
+    /**
+     * Returns the name and start time of a file that is currently being processed.
+     * If no file is currently being processed, this will return null.
+     *
+     * @return FileStarted or null
+     */
+    public FileStarted getCurrentFile() {
+        return currentFile;
+    }
+
+    public int getNumResourcesConsumed() {
+        return numResourcesConsumed;
+    }
+
+    public int getNumHandledExceptions() {
+        return numHandledExceptions;
+    }
+
+    /**
+     * Checks to see if the currentFile being processed (if there is one)
+     * has gone stale (still being worked on after staleThresholdMillis).
+     * <p>
+     * If the consumer has gone stale, this will return the currentFile and
+     * set the state to GONE_STALE.
+     * <p>
+     * If the consumer was already staled out earlier or
+     * is not processing a file or has been working on a file
+     * for less than #staleThresholdMills, then this will return null.
+     * <p>
+     * @param staleThresholdMillis
+     * @return null or the file started that triggered the stale condition
+     */
+    public FileStarted checkForStaleMillis(long staleThresholdMillis) {
+        //if it isn't actually running, don't bother obtaining lock
+        if (currentState != STATE.ACTIVELY_CONSUMING) {
+            return null;
+        }
+        synchronized(lock) {
+            //check again once the lock has been obtained
+            if (currentState != STATE.ACTIVELY_CONSUMING) {
+                return null;
+            }
+            FileStarted tmp = currentFile;
+            if (tmp == null) {
+                return null;
+            }
+            if (tmp.getElapsedMillis() > staleThresholdMillis) {
+                setEndedState(STATE.GONE_STALE);
+                return tmp;
+            }
+        }
+        return null;
+    }
+
+    private FileResource getNextFileResource() throws InterruptedException {
+        FileResource fileResource = null;
+        long start = new Date().getTime();
+        while (fileResource == null) {
+            //check to see if thread is interrupted before polling
+            if (Thread.currentThread().isInterrupted()) {
+                setEndedState(STATE.THREAD_INTERRUPTED);
+                logger.debug("Consumer thread was interrupted.");
+                break;
+            }
+
+            synchronized(lock) {
+                //need to lock here to prevent race condition with other threads setting state
+                if (currentState != STATE.ACTIVELY_CONSUMING) {
+                    logger.debug("Consumer already closed because of: "+ currentState.toString());
+                    break;
+                }
+            }
+            fileResource = fileQueue.poll(1L, TimeUnit.SECONDS);
+            if (fileResource != null) {
+                if (fileResource instanceof PoisonFileResource) {
+                    setEndedState(STATE.SWALLOWED_POISON);
+                    fileResource = null;
+                }
+                break;
+            }
+            logger.debug(consumerId + " is waiting for file and the queue size is: " + fileQueue.size());
+
+            long elapsed = new Date().getTime() - start;
+            if (maxConsecWaitInMillis > 0 && elapsed > maxConsecWaitInMillis) {
+                setEndedState(STATE.EXCEEDED_MAX_CONSEC_WAIT_MILLIS);
+                break;
+            }
+        }
+        return fileResource;
+    }
+
+    protected void close(Closeable closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (IOException e){
+                logger.error(e.getMessage());
+            }
+        }
+        closeable = null;
+    }
+
+    protected void flushAndClose(Closeable closeable) {
+        if (closeable == null) {
+            return;
+        }
+        if (closeable instanceof Flushable){
+            try {
+                ((Flushable)closeable).flush();
+            } catch (IOException e) {
+                logger.error(e.getMessage());
+            }
+        }
+        close(closeable);
+    }
+
+    //do not overwrite a finished state.  This should
+    //represent the initial cause; all subsequent calls
+    //to set will be ignored!!!
+    private void setEndedState(STATE cause) {
+        synchronized(lock) {
+            if (currentState == STATE.NOT_YET_STARTED ||
+                    currentState == STATE.ACTIVELY_CONSUMING) {
+                currentState = cause;
+            }
+        }
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/OutputStreamFactory.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/OutputStreamFactory.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/OutputStreamFactory.java	(revision 0)
@@ -0,0 +1,29 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.metadata.Metadata;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public interface OutputStreamFactory {
+  
+  public OutputStream getOutputStream(Metadata metadata) throws IOException;
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/AutoDetectParserFactory.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/AutoDetectParserFactory.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/AutoDetectParserFactory.java	(revision 0)
@@ -0,0 +1,34 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.config.TikaConfig;
+import org.apache.tika.parser.AutoDetectParser;
+import org.apache.tika.parser.Parser;
+
+/**
+ * Simple class for AutoDetectParser
+ */
+public class AutoDetectParserFactory implements ParserFactory {
+
+  @Override
+  public Parser getParser(TikaConfig config) {
+    return new AutoDetectParser(config);
+  }
+  
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/FileStarted.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/FileStarted.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/FileStarted.java	(revision 0)
@@ -0,0 +1,116 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.Date;
+
+/**
+ * Simple class to record the time when a FileResource's processing started.
+ */
+class FileStarted {
+
+    private final String resourceId;
+    private final long started;
+
+    /**
+     * Initializes a new FileStarted class with {@link #resourceId}
+     * and sets {@link #started} as new Date().getTime().
+     *
+     * @param resourceId
+     */
+    public FileStarted(String resourceId) {
+        this(resourceId, new Date().getTime());
+    }
+
+    public FileStarted(String resourceId, long started) {
+        this.resourceId = resourceId;
+        this.started = started;
+    }
+
+
+    /**
+     * @return id of resource
+     */
+    public String getResourceId() {
+        return resourceId;
+    }
+
+    /**
+     * @return time at which processing on this file started
+     */
+    public long getStarted() {
+        return started;
+    }
+
+    /**
+     * @return elapsed milliseconds this the start of processing of this
+     * file resource
+     */
+    public long getElapsedMillis() {
+        long now = new Date().getTime();
+        return now - started;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result
+                + ((resourceId == null) ? 0 : resourceId.hashCode());
+        result = prime * result + (int) (started ^ (started >>> 32));
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (!(obj instanceof FileStarted)) {
+            return false;
+        }
+        FileStarted other = (FileStarted) obj;
+        if (resourceId == null) {
+            if (other.resourceId != null) {
+                return false;
+            }
+        } else if (!resourceId.equals(other.resourceId)) {
+            return false;
+        }
+        if (started != other.started) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("FileStarted [resourceId=");
+        builder.append(resourceId);
+        builder.append(", started=");
+        builder.append(started);
+        builder.append("]");
+        return builder.toString();
+    }
+
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/FileResourceCrawler.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/FileResourceCrawler.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/FileResourceCrawler.java	(revision 0)
@@ -0,0 +1,224 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.log4j.Logger;
+import org.apache.tika.extractor.DocumentSelector;
+import org.apache.tika.metadata.Metadata;
+
+import java.util.Date;
+import java.util.Iterator;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+
+public abstract class FileResourceCrawler implements Callable<IFileProcessorFutureResult> {
+
+    private volatile boolean hasCompletedCrawling = false;
+    private volatile boolean isActive = true;
+    private volatile boolean timedOut = false;
+
+    //how long to pause if can't add to queue
+    private static final long PAUSE_INCREMENT_MILLIS = 1000;
+
+    protected static Logger logger = Logger.getLogger(FileResourceCrawler.class.toString());
+
+    private int maxFilesToAdd = -1;
+    private int maxFilesToConsider = -1;
+
+    private final ArrayBlockingQueue<FileResource> queue;
+    private final int numConsumers;
+
+
+    private long maxConsecWaitInMillis = 300000;//300,000ms = 5 minutes
+    private DocumentSelector documentSelector = null;
+
+    //number of files added to queue
+    private int added = 0;
+    //number of files considered including those that were rejected by documentSelector
+    private int considered = 0;
+
+    /**
+     * @param queue        shared queue
+     * @param numConsumers number of consumers (needs to know how many poisons to add when done)
+     */
+    public FileResourceCrawler(ArrayBlockingQueue<FileResource> queue, int numConsumers) {
+        this.queue = queue;
+        this.numConsumers = numConsumers;
+    }
+
+    public abstract void start() throws InterruptedException;
+
+    public FileResourceCrawlerFutureResult call() {
+        try {
+            start();
+        } catch (InterruptedException e) {
+            //this can be triggered by shutdownNow in BatchProcess
+            logger.info("InterruptedException in FileCrawler: " + e.getMessage());
+        } catch (Exception e) {
+            logger.error("Exception in FileCrawler: " + e.getMessage());
+        } finally {
+            isActive = false;
+        }
+
+        try {
+            shutdown();
+        } catch (InterruptedException e) {
+            //swallow
+        }
+
+        return new FileResourceCrawlerFutureResult(considered, added);
+    }
+
+    protected boolean tryToAdd(FileResource fileResource) throws InterruptedException {
+
+        if (maxFilesToAdd > -1 && added >= maxFilesToAdd) {
+            shutdown();
+        }
+
+        boolean isAdded = false;
+        if (select(fileResource.getMetadata())) {
+            long totalConsecutiveWait = 0;
+            while (queue.offer(fileResource, 1L, TimeUnit.SECONDS) == false) {
+
+                logger.info("FileResourceCrawler is pausing.  Queue is full: " + queue.size());
+                Thread.sleep(PAUSE_INCREMENT_MILLIS);
+                totalConsecutiveWait += PAUSE_INCREMENT_MILLIS;
+                if (maxConsecWaitInMillis > -1 && totalConsecutiveWait > maxConsecWaitInMillis) {
+                    timedOut = true;
+                    logger.error("Crawler had to wait longer than max consecutive wait time.");
+                    throw new InterruptedException("FileResourceCrawler had to wait longer than max consecutive wait time.");
+                }
+                if (Thread.currentThread().isInterrupted()) {
+                    logger.info("FileResourceCrawler shutting down because of interrupted thread.");
+                    throw new InterruptedException("FileResourceCrawler interrupted.");
+                }
+            }
+            isAdded = true;
+            added++;
+        } else {
+            logger.debug("crawler did not select: "+fileResource.getResourceId());
+        }
+        considered++;
+        return isAdded;
+    }
+
+    private void shutdown() throws InterruptedException {
+
+        if (hasCompletedCrawling == true) {
+            return;
+        }
+        int i = 0;
+        long start = new Date().getTime();
+        while (queue.offer(new PoisonFileResource(), 1L, TimeUnit.SECONDS) != false) {
+            long elapsed = new Date().getTime() - start;
+            if (maxConsecWaitInMillis > -1 && elapsed > maxConsecWaitInMillis) {
+                logger.error("Crawler timed out while trying to add poison");
+                throw new InterruptedException("FileResourceCrawler timed out while trying to shutdown.");
+            }
+            if (i++ >= numConsumers) {
+                break;
+            }
+
+        }
+        hasCompletedCrawling = true;
+    }
+
+    /**
+     * If the crawler stops for any reason, it is no longer active.
+     *
+     * @return whether crawler is active or not
+     */
+    public boolean isActive() {
+        return isActive;
+    }
+
+    public void setMaxConsecWaitInMillis(long maxConsecWaitInMillis) {
+        this.maxConsecWaitInMillis = maxConsecWaitInMillis;
+    }
+    public void setDocumentSelector(DocumentSelector documentSelector) {
+        this.documentSelector = documentSelector;
+    }
+
+    public int getConsidered() {
+        return considered;
+    }
+
+    protected boolean select(Metadata m) {
+        return documentSelector.select(m);
+    }
+
+    /**
+     * Maximum number of files to add.  If {@link #maxFilesToAdd} < 0 (default),
+     * then this crawler will add all documents.
+     *
+     * @param maxFilesToAdd
+     */
+    public void setMaxFilesToAdd(int maxFilesToAdd) {
+        this.maxFilesToAdd = maxFilesToAdd;
+    }
+
+
+    /**
+     * Maximum number of files to consider.  A file is considered
+     * whether or not the DocumentSelector selects a document.
+     * <p/>
+     * If {@link #maxFilesToConsider} < 0 (default), then this crawler
+     * will add all documents.
+     *
+     * @param maxFilesToConsider
+     */
+    public void setMaxFilesToConsider(int maxFilesToConsider) {
+        this.maxFilesToConsider = maxFilesToConsider;
+    }
+
+    /**
+     * Use sparingly.  This synchronizes on the queue!
+     * @return whether this queue contains any non-poison file resources
+     */
+    public boolean isQueueEmpty() {
+        int size= 0;
+        synchronized(queue) {
+            Iterator<FileResource> it = queue.iterator();
+            while (it.hasNext()) {
+                if (it.next() instanceof PoisonFileResource) {
+                } else {
+                    size++;
+                }
+            }
+        }
+        return size == 0;
+    }
+
+    /**
+     * Returns whether the crawler timed out while trying to add a resource
+     * to the queue.
+     * <p/>
+     * If the crawler timed out while trying to add poison, this is not
+     * set to true.
+     *
+     * @return
+     */
+    public boolean wasTimedOut() {
+        return timedOut;
+    }
+
+    public int getAdded() {
+        return added;
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/ConsumersManager.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/ConsumersManager.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/ConsumersManager.java	(revision 0)
@@ -0,0 +1,45 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.List;
+
+/**
+ * Simple interface around a collection of consumers that allows
+ * for initializing and shutting shared resources (e.g. db connection, index, writer, etc.)
+ */
+public interface ConsumersManager {
+    /**
+     * Get the consumers
+     * @return consumers
+     */
+    public List<FileResourceConsumer> getConsumers();
+
+    /**
+     * This is called by BatchProcess before submitting the threads
+     */
+    public void init();
+
+    /**
+     * This is called by BatchProcess immediately before closing.
+     * Beware! Some of the consumers may have hung or may not
+     * have completed.
+     */
+    public void shutdown();
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/InterrupterFutureResult.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/InterrupterFutureResult.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/InterrupterFutureResult.java	(revision 0)
@@ -0,0 +1,22 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class InterrupterFutureResult implements IFileProcessorFutureResult {
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/IStatusReporter.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/IStatusReporter.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/IStatusReporter.java	(revision 0)
@@ -0,0 +1,24 @@
+package org.apache.tika.batch;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.concurrent.Callable;
+
+
+public interface IStatusReporter extends Callable<IFileProcessorFutureResult> {
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/PoisonFileResource.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/PoisonFileResource.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/PoisonFileResource.java	(revision 0)
@@ -0,0 +1,54 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.metadata.Metadata;
+
+import java.io.InputStream;
+
+/**
+ * Sentinel class for the crawler to add to the queue to let
+ * the consumers know that they should shutdown.
+ */
+class PoisonFileResource implements FileResource {
+  
+  /**
+   * always returns null
+   */
+  @Override
+  public Metadata getMetadata() {
+    return null;
+  }
+
+  /**
+   * always returns null
+   */
+  @Override
+  public InputStream openInputStream() {
+    return null;
+  }
+
+  /**
+   * always returns null
+   */
+  @Override
+  public String getResourceId() {
+    return null;
+  }
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/BatchProcess.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/BatchProcess.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/BatchProcess.java	(revision 0)
@@ -0,0 +1,450 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CompletionService;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorCompletionService;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * This is the main processor class for a single process.
+ * <p/>
+ * It requires a {@link FileResourceCrawler} and {@link FileResourceConsumer}s, and it can also
+ * support a {@link SimpleLogStatusReporter} and an {@link CommandLineInterrupter}.
+ * <p/>
+ * This is designed to shutdown if there are too many stale processors (runaway parser)
+ * or an OutOfMemoryError. Consider using {@link BatchProcessDriverCLI}
+ * for more robust handling of these types of errors.
+ */
+public class BatchProcess {
+
+    public enum BATCH_CONSTANTS {
+        BATCH_PROCESS_EXCEEDED_MAX_ALIVE_TIME,
+        BATCH_PROCESS_FATAL_MUST_RESTART
+    }
+
+    private enum CAUSE_FOR_TERMINATION {
+        COMPLETED_NORMALLY,
+        CONSUMER_EXCEPTION_NO_RESTART,
+        CONSUMER_EXCEPTION,
+        CRAWLER_TIMED_OUT,
+        TOO_MANY_STALES,
+        USER_INTERRUPTION,
+        BATCH_PROCESS_ALIVE_TOO_LONG,
+    }
+
+    private static final Log logger = LogFactory.getLog(BatchProcess.class);
+
+    // If a file hasn't been processed in this amount of time,
+    // report it to the console. When the directory crawler has stopped, the thread will
+    // be terminated and the file name will be logged
+    private long staleThresholdMillis = 5 * 60 * 1000; // 5 minutes
+
+    private long staleCheckPulseMillis = 2 * 60 * 1000; //2 minutes
+    //if there was an early termination via the Interrupter
+    //or because of an uncaught runtime throwable, pause
+    //this long before shutting down to allow parsers to finish
+    private long pauseOnEarlyTerminationMillis = 30000; //30 seconds
+
+    //maximum time that this process should stay alive
+    //to avoid potential memory leaks, not a bad idea to shutdown
+    //every hour or so.
+    private int maxAliveTimeSeconds = -1;
+
+    private final FileResourceCrawler fileResourceCrawler;
+
+    private final ConsumersManager consumersManager;
+
+    private final IStatusReporter reporter;
+
+    private final IInterrupter interrupter;
+
+    private final ArrayBlockingQueue<FileStarted> stales;
+
+    private boolean alreadyExecuted = false;
+
+    private final int maxStaleConsumers;
+
+    public BatchProcess(FileResourceCrawler fileResourceCrawler,
+                        ConsumersManager consumersManager,
+                        IStatusReporter reporter,
+                        IInterrupter interrupter, int maxStaleConsumers) {
+        this.fileResourceCrawler = fileResourceCrawler;
+        this.consumersManager = consumersManager;
+        this.reporter = reporter;
+        this.interrupter = interrupter;
+        this.maxStaleConsumers = (maxStaleConsumers > -1) ? maxStaleConsumers : 0;
+        stales = new ArrayBlockingQueue<FileStarted>(consumersManager.getConsumers().size());
+    }
+
+    public ParallelFileProcessingResult execute()
+            throws InterruptedException {
+        if (alreadyExecuted == true) {
+            throw new IllegalStateException("Can only execute BatchRunner once.");
+        }
+        long start = new Date().getTime();
+        logger.info("BatchProcess starting up");
+
+        consumersManager.init();
+        alreadyExecuted = true;
+        long started = new Date().getTime();
+        int considered = 0;
+        int added = 0;
+        int processed = 0;
+        int numConsumers = consumersManager.getConsumers().size();
+        // fileResourceCrawler, statusReporter, the Interrupter, staleChecker
+        int numNonConsumers = 4;
+
+        ExecutorService ex = Executors.newFixedThreadPool(numConsumers
+                + numNonConsumers);
+
+        CompletionService<IFileProcessorFutureResult> completionService =
+                new ExecutorCompletionService<IFileProcessorFutureResult>(
+                        ex);
+        StaleChecker staleChecker = new StaleChecker();
+        completionService.submit(interrupter);
+        completionService.submit(fileResourceCrawler);
+        completionService.submit(reporter);
+        completionService.submit(staleChecker);
+
+
+        for (FileResourceConsumer consumer : consumersManager.getConsumers()) {
+            completionService.submit(consumer);
+        }
+
+        int removed = 0;
+        int consumersRemoved = 0;
+        int crawlerRemoved = 0;
+
+        CAUSE_FOR_TERMINATION causeForTermination = null;
+        while (true) {
+            try {
+                Future<IFileProcessorFutureResult> futureResult =
+                        completionService.poll(1, TimeUnit.SECONDS);
+
+                if (futureResult != null) {
+                    removed++;
+                    IFileProcessorFutureResult result = futureResult.get();
+                    if (result instanceof FileConsumerFutureResult) {
+                        consumersRemoved++;
+                        processed += ((FileConsumerFutureResult) result).getFilesProcessed();
+                    } else if (result instanceof FileResourceCrawlerFutureResult) {
+                        crawlerRemoved++;
+                        added += ((FileResourceCrawlerFutureResult) result).getAdded();
+                        considered += ((FileResourceCrawlerFutureResult) result).getConsidered();
+                        if (fileResourceCrawler.wasTimedOut()) {
+                            causeForTermination = CAUSE_FOR_TERMINATION.CRAWLER_TIMED_OUT;
+                            break;
+                        }
+                    } else if (result instanceof InterrupterFutureResult) {
+                        causeForTermination = CAUSE_FOR_TERMINATION.USER_INTERRUPTION;
+                        break;
+                    } else if (result instanceof StaleFutureResult) {
+                        causeForTermination = CAUSE_FOR_TERMINATION.TOO_MANY_STALES;
+                        break;
+                    } //only thing left should be StatusReporterResult
+                }
+
+                if (consumersRemoved >= numConsumers) {
+                    causeForTermination = CAUSE_FOR_TERMINATION.COMPLETED_NORMALLY;
+                    break;
+                }
+                if (aliveTooLong(started)) {
+                    causeForTermination = CAUSE_FOR_TERMINATION.BATCH_PROCESS_ALIVE_TOO_LONG;
+                    break;
+                }
+            } catch (Throwable e) {
+                if (isNonRestart(e)) {
+                    causeForTermination = CAUSE_FOR_TERMINATION.CONSUMER_EXCEPTION_NO_RESTART;
+                } else {
+                    causeForTermination = CAUSE_FOR_TERMINATION.CONSUMER_EXCEPTION;
+                }
+                e.printStackTrace();
+                logger.fatal("Execution exception " + e.getMessage());
+                break;
+            }
+        }
+
+
+        //Step 1, try a gentle shutdown.
+        //This just prevents un-"called" threads from being started
+        ex.shutdown();
+
+        //Step 2, ask consumers to retire politely.
+        //most should have by now under normal circumstances
+        for (FileResourceConsumer consumer : consumersManager.getConsumers()) {
+            consumer.pleaseRetire();
+        }
+
+        //if there are any active/non-stale consumers, await termination
+        if (countActiveConsumers() > 0) {
+            if (causeForTermination != null) {
+                logger.trace("About to awaitTermination: " + pauseOnEarlyTerminationMillis);
+                ex.awaitTermination(pauseOnEarlyTerminationMillis, TimeUnit.MILLISECONDS);
+            } else {
+                ex.awaitTermination(1, TimeUnit.SECONDS);
+            }
+        }
+
+        //Step 3: Gloves come off.  We've tried to ask kindly before.
+        //Now it is time shut down. This could corrupt
+        //nio channels via thread interrupts!  Hopefully, everything
+        //has shut down by now.
+        logger.trace("About to shutdownNow()");
+        List<Runnable> neverCalled = ex.shutdownNow();
+        logger.trace("TERMINATED " + ex.isTerminated() + " : "
+                + consumersRemoved + " : " + crawlerRemoved);
+
+        int end = numConsumers + numNonConsumers - removed - neverCalled.size();
+
+        for (int t = 0; t < end; t++) {
+            Future<IFileProcessorFutureResult> future = null;
+            future = completionService.poll(10, TimeUnit.MILLISECONDS);
+
+            logger.trace("In while future==null loop in final shutdown loop");
+            if (future == null) {
+                break;
+            }
+            try {
+                IFileProcessorFutureResult result = future.get();
+                if (result instanceof FileConsumerFutureResult) {
+                    FileConsumerFutureResult consumerResult = (FileConsumerFutureResult) result;
+                    processed += consumerResult.getFilesProcessed();
+                    FileStarted fileStarted = consumerResult.getFileStarted();
+                    if (fileStarted != null
+                            && fileStarted.getElapsedMillis() > staleThresholdMillis) {
+                        logger.warn(fileStarted.getResourceId()
+                                + "\t caused a file processor to hang or crash. You may need to remove "
+                                + "this file from your input set and rerun.");
+                    }
+                } else if (result instanceof FileResourceCrawlerFutureResult) {
+                    FileResourceCrawlerFutureResult crawlerResult = (FileResourceCrawlerFutureResult) result;
+                    considered += crawlerResult.getConsidered();
+                    added += crawlerResult.getAdded();
+                } //else ...we don't care about anything else stopping at this point
+            } catch (ExecutionException e) {
+                logger.error("Execution exception trying to shutdown after shutdownNow:" + e.getMessage());
+            } catch (InterruptedException e) {
+                logger.error("Interrupted exception trying to shutdown after shutdownNow:" + e.getMessage());
+            }
+        }
+        //do we need to restart?
+        String restartMsg = null;
+        if (causeForTermination == CAUSE_FOR_TERMINATION.USER_INTERRUPTION
+                || causeForTermination == CAUSE_FOR_TERMINATION.CONSUMER_EXCEPTION_NO_RESTART) {
+            //do not restart!!!
+        } else if (causeForTermination == CAUSE_FOR_TERMINATION.CONSUMER_EXCEPTION) {
+            restartMsg = "Uncaught consumer throwable";
+        } else if (causeForTermination == CAUSE_FOR_TERMINATION.TOO_MANY_STALES) {
+            if (areResourcesPotentiallyRemaining()) {
+                restartMsg = "Staled out with resources remaining";
+            }
+        } else if (causeForTermination == CAUSE_FOR_TERMINATION.BATCH_PROCESS_ALIVE_TOO_LONG) {
+            restartMsg = BATCH_CONSTANTS.BATCH_PROCESS_EXCEEDED_MAX_ALIVE_TIME.toString();
+        } else if (causeForTermination == CAUSE_FOR_TERMINATION.CRAWLER_TIMED_OUT) {
+            restartMsg = "Crawler timed out.";
+        } else if (crawlerRemoved == 0) {
+            restartMsg = "Crawler did not complete.";
+        } else if (fileResourceCrawler.wasTimedOut()) {
+            restartMsg = "Crawler was timed out.";
+        } else if (fileResourceCrawler.isActive()) {
+            restartMsg = "Crawler is still active.";
+        } else if (! fileResourceCrawler.isQueueEmpty()) {
+            restartMsg = "Resources still exist for processing";
+        }
+
+
+        int exitStatus = handleRestartMsg(restartMsg);
+
+        //need to re-check, report, remove stale consumers
+        staleChecker.checkForStaleConsumers();
+
+        for (FileStarted fs : stales) {
+            logger.error("A parser was still working on " + fs.getResourceId() +
+                    " for " + fs.getElapsedMillis() + " milliseconds after it started." +
+                    " This exceeds the maxStaleMillis parameter");
+        }
+        logger.info("ConsumersManager is shutting down");
+        consumersManager.shutdown();
+        logger.info("BatchProcess is shutting down");
+
+        double elapsed = ((double) new Date().getTime() - (double) start) / 1000.0;
+        return new
+            ParallelFileProcessingResult(considered, added, processed,
+                elapsed, exitStatus, causeForTermination.toString());
+
+    }
+
+    private boolean isNonRestart(Throwable e) {
+        if (e instanceof BatchNoRestartException) {
+            return true;
+        }
+        Throwable cause = e.getCause();
+        if (cause != null) {
+            return isNonRestart(cause);
+        }
+        return false;
+    }
+
+    private int handleRestartMsg(String restartMsg) {
+        if (restartMsg != null) {
+            if (restartMsg.equals(BATCH_CONSTANTS.BATCH_PROCESS_EXCEEDED_MAX_ALIVE_TIME.toString())) {
+                logger.info(restartMsg);
+            } else {
+                logger.fatal(restartMsg);
+            }
+            //must send to err to communicate with potential driver
+            System.err.println(
+                    BATCH_CONSTANTS.BATCH_PROCESS_FATAL_MUST_RESTART.toString() +
+                            " >> " + restartMsg);
+            System.err.flush();
+            return 1;
+        }
+        return 0;
+    }
+
+    //could new FileResources be consumed from the Queue?
+    //Because of race conditions, this can return a true
+    //when the real answer is false.
+    //This should never return false, though, if the answer is true!
+    private boolean areResourcesPotentiallyRemaining() {
+        if (fileResourceCrawler.isActive()) {
+            return true;
+        }
+        if (!fileResourceCrawler.isQueueEmpty()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean aliveTooLong(long started) {
+        if (maxAliveTimeSeconds < 0) {
+            return false;
+        }
+        double elapsedSeconds = (double) (new Date().getTime() - started) / (double) 1000;
+        if (elapsedSeconds > (double) maxAliveTimeSeconds) {
+            return true;
+        }
+        return false;
+    }
+
+    //snapshot of non-retired consumers; actual number may be smaller by the time
+    //this returns a value!
+    private int countActiveConsumers() {
+        int active = 0;
+        for (FileResourceConsumer consumer : consumersManager.getConsumers()) {
+            if (consumer.isStillActive()) {
+                active++;
+            }
+        }
+        return active;
+    }
+
+    /**
+     * If there is an early termination via an interrupt or too many stale consumers
+     * or because a consumer or other Runnable threw a Throwable, pause this long
+     * before killing the consumers and other threads.
+     *
+     * @param pauseOnEarlyTerminationMillis
+     */
+    public void setPauseOnEarlyTerminationMillis(long pauseOnEarlyTerminationMillis) {
+        this.pauseOnEarlyTerminationMillis = pauseOnEarlyTerminationMillis;
+    }
+
+    /**
+     * The amount of time allowed before a consumer is determined to be stale.
+     *
+     * @param staleThresholdMillis
+     */
+    public void setStaleThresholdMillis(long staleThresholdMillis) {
+        this.staleThresholdMillis = staleThresholdMillis;
+    }
+
+    public void setStaleCheckPulseMillis(long staleCheckPulseMillis) {
+        this.staleCheckPulseMillis = staleCheckPulseMillis;
+    }
+
+    /**
+     * The maximum amount of time that this process can be alive.  To avoid
+     * memory leaks, it is sometimes beneficial to shutdown (and restart) the
+     * process periodically.
+     * <p/>
+     * If the value is < 0, the process will run until completion, interruption or exception.
+     *
+     * @param maxAliveTimeSeconds maximum amount of time in seconds to remain alive
+     */
+    public void setMaxAliveTimeSeconds(int maxAliveTimeSeconds) {
+        this.maxAliveTimeSeconds = maxAliveTimeSeconds;
+    }
+
+    private class StaleChecker implements Callable<IFileProcessorFutureResult> {
+
+        @Override
+        public StaleFutureResult call() throws Exception {
+            while (stales.size() <= maxStaleConsumers) {
+                try {
+                    Thread.sleep(staleCheckPulseMillis);
+                } catch (InterruptedException e) {
+                    logger.debug("interrupted ex in stalechecker");
+                    break;
+                    //just stop.
+                }
+                checkForStaleConsumers();
+                if (countActiveConsumers() == 0) {
+                    logger.error("No activeConsumers in StaleChecker");
+                    break;
+                }
+            }
+            logger.debug("Stale checker quitting: " + stales.size());
+            return new StaleFutureResult(stales.size());
+        }
+
+        private void checkForStaleConsumers() {
+            for (FileResourceConsumer consumer : consumersManager.getConsumers()) {
+                FileStarted fs = consumer.checkForStaleMillis(staleThresholdMillis);
+                if (fs != null) {
+                    stales.add(fs);
+                }
+            }
+        }
+    }
+
+    private class StaleFutureResult implements IFileProcessorFutureResult {
+        private final int staleCount;
+
+        private StaleFutureResult(final int staleCount) {
+            this.staleCount = staleCount;
+        }
+
+        protected int getStaleCount() {
+            return staleCount;
+        }
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/SimpleLogStatusReporter.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/SimpleLogStatusReporter.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/SimpleLogStatusReporter.java	(revision 0)
@@ -0,0 +1,213 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.tika.util.BatchLocalization;
+import org.apache.tika.util.DurationFormatUtils;
+
+import java.text.NumberFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * Basic class to use for reporting status from both the crawler and the consumers.
+ * This wakes up roughly every {@link #sleepMillis} and log.info's a status report.
+ */
+
+public class SimpleLogStatusReporter implements IStatusReporter {
+
+    private final Log logger = LogFactory.getLog(SimpleLogStatusReporter.class);
+
+    //require references to these so that the
+    //StatusReporter can query them when it wakes up
+    private final ConsumersManager consumersManager;
+    private final FileResourceCrawler crawler;
+
+    //local time that the StatusReporter started
+    private final long start;
+    //how long to sleep between reporting intervals
+    private long sleepMillis = 1000;
+
+    //how long before considering a parse "stale" (potentially hung forever)
+    private long staleThresholdMillis = 100000;
+
+    /**
+     * Initialize with the crawler and consumers
+     *
+     * @param crawler   crawler to ping at intervals
+     * @param consumersManager consumers to ping at intervals
+     */
+    public SimpleLogStatusReporter(FileResourceCrawler crawler, ConsumersManager consumersManager) {
+        this.consumersManager = consumersManager;
+        this.crawler = crawler;
+        start = new Date().getTime();
+    }
+
+    /**
+     * Override for different behavior.
+     * <p/>
+     * This reports the string at the info level to this class' logger.
+     *
+     * @param s
+     */
+    protected void report(String s) {
+        logger.info(s);
+    }
+
+    /**
+     * Startup the reporter.
+     */
+    public IFileProcessorFutureResult call() {
+        NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.US);
+        try {
+            while (true) {
+                Thread.sleep(sleepMillis);
+                int cnt = getRoughCountConsumed();
+                int exceptions = getRoughCountExceptions();
+                long elapsed = new Date().getTime() - start;
+                double elapsedSecs = (double) elapsed / (double) 1000;
+                int avg = (elapsedSecs > 5 || cnt > 100) ? (int) ((double) cnt / elapsedSecs) : -1;
+
+                String elapsedString = DurationFormatUtils.formatMillis(new Date().getTime() - start);
+                String docsPerSec = avg > -1 ? String.format(BatchLocalization.getLocale(),
+                        " (%s docs per sec)",
+                        numberFormat.format(avg)) : "";
+                String msg =
+                        String.format(
+                                BatchLocalization.getLocale(),
+                                "Processed %s documents in %s%s.",
+                                numberFormat.format(cnt), elapsedString, docsPerSec);
+                report(msg);
+                if (exceptions == 1){
+                    msg = "There has been one handled exception.";
+                } else {
+                    msg =
+                            String.format(BatchLocalization.getLocale(),
+                                    "There have been %s handled exceptions.",
+                                    numberFormat.format(exceptions));
+                }
+                report(msg);
+
+                reportStale();
+
+                int stillAlive = getStillAlive();
+                if (stillAlive == 1) {
+                    msg = "There is one file processor still active.";
+                } else {
+                    msg = "There are " + numberFormat.format(stillAlive) + " file processors still active.";
+                }
+                report(msg);
+
+                int crawled = crawler.getConsidered();
+                int added = crawler.getAdded();
+                if (crawled == 1) {
+                    msg = "The directory crawler has considered 1 file,";
+                } else {
+                    msg = "The directory crawler has considered " +
+                            numberFormat.format(crawled) + " files, ";
+                }
+                if (added == 1) {
+                    msg += "and it has added 1 file.";
+                } else {
+                    msg += "and it has added " +
+                            numberFormat.format(crawler.getAdded()) + " files.";
+                }
+                msg += "\n";
+                report(msg);
+
+                if (! crawler.isActive()) {
+                    msg = "The directory crawler has completed its crawl.\n";
+                    report(msg);
+                }
+            }
+        } catch (InterruptedException e) {
+
+        }
+        return new StatusReporterFutureResult();
+    }
+
+
+    /**
+     * Set the amount of time to sleep between reports.
+     * @param sleepMillis
+     */
+    public void setSleepMillis(long sleepMillis) {
+        this.sleepMillis = sleepMillis;
+    }
+
+    /**
+     * Set the amount of time in milliseconds to use as the threshold for determining
+     * a stale parse.
+     *
+     * @param staleThresholdMillis
+     */
+    public void setStaleThresholdMillis(long staleThresholdMillis) {
+        this.staleThresholdMillis = staleThresholdMillis;
+    }
+
+
+    private void reportStale() {
+        for (FileResourceConsumer consumer : consumersManager.getConsumers()) {
+            FileStarted fs = consumer.getCurrentFile();
+            if (fs == null) {
+                continue;
+            }
+            long elapsed = fs.getElapsedMillis();
+            if (elapsed > staleThresholdMillis) {
+                String elapsedString = Double.toString((double) elapsed / (double) 1000);
+                report("A thread has been working on " + fs.getResourceId() +
+                        " for " + elapsedString + " seconds.");
+            }
+        }
+    }
+
+    /*
+     * This returns a rough (unsynchronized) count of resources consumed.
+     */
+    private int getRoughCountConsumed() {
+        int ret = 0;
+        for (FileResourceConsumer consumer : consumersManager.getConsumers()) {
+            ret += consumer.getNumResourcesConsumed();
+        }
+        return ret;
+    }
+
+    private int getStillAlive() {
+        int ret = 0;
+        for (FileResourceConsumer consumer : consumersManager.getConsumers()) {
+            if ( consumer.isStillActive()) {
+                ret++;
+            }
+        }
+        return ret;
+    }
+
+    /**
+     * This returns a rough (unsynchronized) count of caught/handled exceptions.
+     * @return
+     */
+    public int getRoughCountExceptions() {
+        int ret = 0;
+        for (FileResourceConsumer consumer : consumersManager.getConsumers()) {
+            ret += consumer.getNumHandledExceptions();
+        }
+        return ret;
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/IFileProcessorFutureResult.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/IFileProcessorFutureResult.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/IFileProcessorFutureResult.java	(revision 0)
@@ -0,0 +1,26 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * stub interface to allow for different result types from different processors
+ *
+ */
+public interface IFileProcessorFutureResult {
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/ParserFactory.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/ParserFactory.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/ParserFactory.java	(revision 0)
@@ -0,0 +1,27 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.config.TikaConfig;
+import org.apache.tika.parser.Parser;
+
+public interface ParserFactory {
+  
+  public Parser getParser(TikaConfig config);
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/BatchProcessDriverCLI.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/BatchProcessDriverCLI.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/BatchProcessDriverCLI.java	(revision 0)
@@ -0,0 +1,246 @@
+package org.apache.tika.batch;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.commons.cli.Options;
+import org.apache.log4j.Logger;
+import org.apache.tika.io.IOUtils;
+import org.apache.tika.util.BatchLocalization;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.util.Locale;
+
+public class BatchProcessDriverCLI {
+
+    private static Logger logger = Logger.getLogger(BatchProcessDriverCLI.class);
+
+    private int maxProcessRestarts = -1;
+    private long pulseMillis = 1000;
+
+    private boolean mustRestartProcess = false;
+    private boolean mustStopSelf = false;
+    private Process process = null;
+
+    private StreamGobbler errorGobbler = null;
+    private StreamGobbler outGobbler = null;
+    private StreamWriter stdinWriter = null;
+
+    private final String[] commandLine;
+    private int numRestarts = 0;
+
+    private Options options = null;
+
+    public BatchProcessDriverCLI(String[] commandLine){
+        this.commandLine = commandLine;
+    }
+
+    public void execute() throws Exception {
+        start();
+        while (mustStopSelf == false) {
+            int exit = Integer.MIN_VALUE;
+            boolean hasExited = false;
+            try {
+                exit = process.exitValue();
+                hasExited = true;
+                stop();
+            } catch (IllegalThreadStateException e) {
+                //hasn't exited
+            }
+            //Even if the process has exited,
+            //wait just a little bit to make sure that
+            //mustRestart hasn't been set to true
+            try {
+                Thread.sleep(pulseMillis);
+            } catch (InterruptedException e) {
+                //swallow
+            }
+            if (hasExited && exit == 0 && ! mustRestartProcess) {
+                break;
+            }
+            if ((hasExited && exit != 0) || mustRestartProcess) {
+                restart();
+            }
+        }
+        if (mustStopSelf) {
+            shutdownNow();
+        }
+    }
+
+    private void shutdownNow() {
+        for (int i = 0; i < 10; i++) {
+            try {
+                int exit = process.exitValue();
+                stop();
+                return;
+            } catch (IllegalThreadStateException e) {
+                //hasn't exited
+            }
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                //swallow
+            }
+        }
+        logger.error("Process didn't stop after 10 seconds after shutdown. " +
+                "I am forcefully killing it.");
+        stop();
+
+    }
+
+    public int getNumRestarts() {
+        return numRestarts;
+    }
+
+    public boolean getStoppedSelf() {
+        return mustStopSelf;
+    }
+
+    private boolean restart() throws Exception {
+        if (maxProcessRestarts > -1 && numRestarts >= maxProcessRestarts) {
+            logger.warn("Exceeded the maximum number of process restarts. Driver is shutting down now.");
+            stop();
+            return false;
+        }
+        logger.warn("Must restart process ("+numRestarts+" restarts so far).");
+        stop();
+        start();
+        numRestarts++;
+        return true;
+    }
+
+    private void stop() {
+        if (process != null) {
+            process.destroy();
+        }
+        mustRestartProcess = false;
+        errorGobbler.stopGobblingAndDie();
+        outGobbler.stopGobblingAndDie();
+        stdinWriter.stopGobblingAndDie();
+    }
+
+    private void start() throws Exception {
+        ProcessBuilder builder = new ProcessBuilder(commandLine);
+        builder.directory(new File("."));
+        process = builder.start();
+        errorGobbler = new StreamGobbler(process.getErrorStream());
+        new Thread(errorGobbler).start();
+
+        outGobbler = new StreamGobbler(process.getInputStream());
+        new Thread(outGobbler).start();
+
+        stdinWriter = new StreamWriter(System.in, process.getOutputStream());
+        new Thread(stdinWriter).start();
+
+    }
+
+
+    /**
+     * Class that transfers anything sent to stdin to the process driver
+     * to the stdin of the BatchProcess.  This allows for a graceful interrupt.
+     */
+    private class StreamWriter implements Runnable {
+        private BufferedReader reader;
+        private Writer writer;
+        private boolean running = true;
+
+        private StreamWriter(InputStream is, OutputStream os) {
+            try {
+                this.reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(is),
+                        BatchLocalization.getEncoding()));
+                this.writer = new OutputStreamWriter(os, BatchLocalization.getEncoding());
+            } catch (UnsupportedEncodingException e) {
+                throw new RuntimeException("Unsupported encoding:" +
+                        BatchLocalization.getEncoding());
+            }
+        }
+
+        @Override
+        public void run() {
+            String line = null;
+            try {
+                while ((line = reader.readLine()) != null && this.running) {
+                    writer.write(String.format(Locale.ENGLISH, "%s%n", line));
+                    writer.flush();
+                    mustStopSelf = true;
+                    break;
+                }
+            } catch (IOException e) {
+                //swallow ioe
+            }
+        }
+        private void stopGobblingAndDie() {
+            running = false;
+        }
+
+
+    }
+
+    private class StreamGobbler implements Runnable {
+        //plagiarized from oap.oodt's StreamGobbler
+        private final BufferedReader reader;
+        private boolean running = true;
+
+        private StreamGobbler(InputStream is){
+
+            try {
+                this.reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(is),
+                        BatchLocalization.getEncoding()));
+            } catch (UnsupportedEncodingException e) {
+                throw new RuntimeException("UnsupportedEncodingException: "+
+                        BatchLocalization.getEncoding());
+            }
+        }
+
+        @Override
+        public void run() {
+            String line = null;
+            try {
+                while ((line = reader.readLine()) != null && this.running) {
+                    if (line.startsWith(BatchProcess.BATCH_CONSTANTS.BATCH_PROCESS_FATAL_MUST_RESTART.toString())) {
+                        mustRestartProcess = true;
+                    }
+                    logger.info("BatchProcess: "+line);
+                }
+            } catch (IOException e) {
+                //swallow ioe
+            }
+        }
+
+        private void stopGobblingAndDie() {
+            running = false;
+            IOUtils.closeQuietly(reader);
+        }
+    }
+
+
+    public static void main(String[] args) throws Exception {
+
+        BatchProcessDriverCLI runner = new BatchProcessDriverCLI(args);
+        runner.execute();
+        System.out.println("FSBatchProcessDriver has gracefully completed");
+        System.exit(0);
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/FileConsumerFutureResult.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/FileConsumerFutureResult.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/FileConsumerFutureResult.java	(revision 0)
@@ -0,0 +1,37 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+class FileConsumerFutureResult implements IFileProcessorFutureResult {
+
+  private final FileStarted fileStarted;
+  private final int filesProcessed;
+  
+  public FileConsumerFutureResult(FileStarted fs, int filesProcessed) {
+    this.fileStarted = fs;
+    this.filesProcessed = filesProcessed;
+  }
+  
+  public FileStarted getFileStarted() {
+    return fileStarted;
+  }
+  
+  public int getFilesProcessed() {
+    return filesProcessed;
+  }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/FileResource.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/FileResource.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/FileResource.java	(revision 0)
@@ -0,0 +1,68 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.Property;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+
+/**
+ * This is a basic interface to handle a logical "file".  
+ * This should enable code-agnostic handling of files from different 
+ * sources: file system, database, etc.
+ *
+ */
+public interface FileResource {
+
+  //The literal lowercased extension of a file.  This may or may not
+  //have any relationship to the actual type of the file.
+  public static final Property FILE_EXTENSION = Property.internalText("tika:file_ext");
+
+  /**
+   * This is only used in logging to identify which file
+   * may have caused problems.  While it is probably best
+   * to use unique ids for the sake of debugging, it is not 
+   * necessary that the ids be unique.  This id
+   * is never used as a hashkey by the batch processors, for example.
+   * 
+   * @return an id for a FileResource
+   */
+  public String getResourceId();
+  
+  /**
+   * This gets the metadata available before the parsing of the file.
+   * This will typically be "external" metadata: file name,
+   * file size, file location, data stream, etc.  That is, things
+   * that are known about the file from outside information, not
+   * file-internal metadata.
+   * 
+   * @return Metadata
+   */
+  public Metadata getMetadata();
+  
+  /**
+   * 
+   * @return an InputStream for the FileResource
+   * @throws java.io.IOException
+   */
+  public InputStream openInputStream() throws IOException;
+  
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/BasicTikaFSConsumer.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/BasicTikaFSConsumer.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/BasicTikaFSConsumer.java	(revision 0)
@@ -0,0 +1,143 @@
+package org.apache.tika.batch.fs;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.tika.batch.BatchNoRestartException;
+import org.apache.tika.batch.FileResource;
+import org.apache.tika.batch.FileResourceConsumer;
+import org.apache.tika.batch.OutputStreamFactory;
+import org.apache.tika.batch.ParserFactory;
+import org.apache.tika.config.TikaConfig;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.Parser;
+import org.apache.tika.sax.ContentHandlerFactory;
+import org.xml.sax.ContentHandler;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.concurrent.ArrayBlockingQueue;
+
+/**
+ * Basic FileResourceConsumer that reads files from an input
+ * directory and writes content to the output directory.
+ * <p>
+ * This catches all exceptions and errors and then logs them.
+ * This will re-throw errors.
+ *
+ */
+public class BasicTikaFSConsumer extends FileResourceConsumer {
+
+    Log log = LogFactory.getLog(BasicTikaFSConsumer.class);
+
+
+    private boolean parseRecursively = true;
+    private final ParserFactory parserFactory;
+    private final ContentHandlerFactory contentHandlerFactory;
+    private final OutputStreamFactory fsOSFactory;
+    private String outputEncoding = "UTF-8";
+
+
+    public BasicTikaFSConsumer(ArrayBlockingQueue<FileResource> queue,
+                               ParserFactory parserFactory,
+                               ContentHandlerFactory contentHandlerFactory,
+                               OutputStreamFactory fsOSFactory) {
+        super(queue);
+        this.parserFactory = parserFactory;
+        this.contentHandlerFactory = contentHandlerFactory;
+        this.fsOSFactory = fsOSFactory;
+    }
+
+    @Override
+    public boolean processFileResource(FileResource fileResource) {
+
+        Parser parser = parserFactory.getParser(TikaConfig.getDefaultConfig());
+        ParseContext context = new ParseContext();
+        if (parseRecursively == true) {
+            context.set(Parser.class, parser);
+        }
+
+        OutputStream os = null;
+        try {
+            os = fsOSFactory.getOutputStream(fileResource.getMetadata());
+        } catch (IOException e) {
+            log.fatal(e.getMessage());
+            flushAndClose(os);
+            throw new BatchNoRestartException("IOException trying to open output stream for "+
+                    fileResource.getResourceId() + " :: " + e.getMessage());
+        }
+        //os can be null if fsOSFactory is set to skip processing a file if the target
+        //file already exists
+        if (os == null) {
+            log.debug("Skipping: " + fileResource.getMetadata().get(FSProperties.FS_ABSOLUTE_PATH));
+            return false;
+        }
+        InputStream is = null;
+        try {
+            is = fileResource.openInputStream();
+        } catch (IOException e) {
+            incrementHandledExceptions();
+            log.error(e.getMessage());
+            flushAndClose(os);
+            return false;
+        }
+
+        ContentHandler handler;
+        try {
+            handler = contentHandlerFactory.getNewContentHandler(os, getOutputEncoding());
+        } catch (UnsupportedEncodingException e) {
+            close(is);
+            flushAndClose(os);
+            throw new RuntimeException(e.getMessage());
+        }
+
+        //now actually call parse!
+        Throwable thrown = null;
+        try {
+            parser.parse(is, handler,
+                    fileResource.getMetadata(), context);
+        } catch (Throwable t) {
+            log.error(t.getMessage());
+            thrown = t;
+        } finally {
+            close(is);
+            flushAndClose(os);
+        }
+
+        if (thrown != null) {
+            if (thrown instanceof Error) {
+                throw (Error)thrown;
+            } else {
+                incrementHandledExceptions();
+            }
+            return false;
+        }
+        return true;
+    }
+
+    public String getOutputEncoding() {
+        return outputEncoding;
+    }
+
+    public void setOutputEncoding(String outputEncoding) {
+        this.outputEncoding = outputEncoding;
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/FSFileResource.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/FSFileResource.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/FSFileResource.java	(revision 0)
@@ -0,0 +1,99 @@
+package org.apache.tika.batch.fs;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.FileResource;
+import org.apache.tika.io.TikaInputStream;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.util.BatchLocalization;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * FileSystem(FS)Resource wraps a file name.
+ * <p/>
+ * This class automatically sets the following keys in Metadata:
+ * <ul>
+ *     <li>Metadata.RESOURCE_NAME_KEY (file name)</li>
+ *     <li>Metadata.CONTENT_LENGTH</li>
+ *     <li>FSProperties.FS_ABSOLUTE_PATH</li>
+ *     <li>FileResource.FILE_EXTENSION</li>
+ * </ul>,
+ */
+public class FSFileResource implements FileResource {
+
+    private final File fullPath;
+    private final Metadata metadata;
+
+    public FSFileResource(File srcRoot, File fullPath) {
+        this.fullPath = fullPath;
+        this.metadata = new Metadata();
+        //child path must actually be a child
+        assert(FSUtil.checkThisIsAncestorOfThat(srcRoot, fullPath));
+        String relativePath = fullPath.getAbsolutePath().substring(srcRoot.getAbsolutePath().length()+1);
+
+        //need to set these now so that the filter can determine
+        //whether or not to crawl this file
+        metadata.set(Metadata.RESOURCE_NAME_KEY, fullPath.getName());
+        metadata.set(Metadata.CONTENT_LENGTH, Long.toString(fullPath.length()));
+        metadata.set(FSProperties.FS_ABSOLUTE_PATH, fullPath.getAbsolutePath());
+        metadata.set(FSProperties.FS_REL_PATH, relativePath);
+        metadata.set(FileResource.FILE_EXTENSION, getExtension(fullPath));
+    }
+
+    /**
+     * Simple extension extractor that takes whatever comes after the
+     * last period in the path.  It returns a lowercased version of that.
+     * <p/>
+     * If there is no period, it returns an empty string.
+     *
+     * @param fullPath
+     * @return
+     */
+    private String getExtension(File fullPath) {
+        String p = fullPath.getName();
+        int i = p.lastIndexOf(".");
+        if (i > -1) {
+            return p.substring(i + 1).toLowerCase(BatchLocalization.getLocale());
+        }
+        return "";
+    }
+
+    /**
+     *
+     * @return file's absolutePath
+     */
+    @Override
+    public String getResourceId() {
+        return fullPath.getAbsolutePath();
+    }
+
+    @Override
+    public Metadata getMetadata() {
+        return metadata;
+    }
+
+    @Override
+    public InputStream openInputStream() throws IOException {
+        //no need to include Metadata because we already set the
+        //same information in the initializer
+        return TikaInputStream.get(fullPath);
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/FSBatchProcessCLI.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/FSBatchProcessCLI.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/FSBatchProcessCLI.java	(revision 0)
@@ -0,0 +1,101 @@
+package org.apache.tika.batch.fs;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.GnuParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.tika.batch.BatchProcess;
+import org.apache.tika.batch.ParallelFileProcessingResult;
+import org.apache.tika.batch.builders.BatchProcessBuilder;
+import org.apache.tika.io.IOUtils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+public class FSBatchProcessCLI {
+    public static String FINISHED_STRING = "Main thread in TikaFSBatchCLI has finished processing.";
+
+    public Options getOptions() {
+        Options options = new Options();
+        options.addOption("c", "config", true, "xml config file");
+        options.addOption("randomCrawl", false, "crawl files randomly");
+        options.addOption("numConsumers", true, "how many consumer threads to use (default=number of processors-1)");
+        options.addOption("maxFileSizeBytes", true, "if an input file is larger than this, skip it.");
+        options.addOption("maxStaleConsumers", true, "maximum number of stale consumers to allow before shutdown");
+        options.addOption("maxQueueSize", true, "maximum size of the FileResource queue");
+        options.addOption("fileList", true, "list of files to process (files relative to srcDir)");
+        options.addOption("fileListEncoding", true, "encoding for fileList");
+        options.addOption("srcDir", "sourceDirectory", true, "source directory (must be specified!)");
+        options.addOption("startDir", "startDirectory", true, "start directory (default: srcDir). Must be a child of or equal to srcDir");
+        options.addOption("targDir", "targetDirectory", true, "target directory (must be specified!)");
+        options.addOption("recursiveParserWrapper", false, "use the recursive parser wrapper or not (default = false)");
+        options.addOption("handleExisting", false, "if a target file already exists, do you want to: overwrite, rename or skip");
+        options.addOption("basicHandlerType", true, "what type of content handler: xml, text, html, body");
+        options.addOption("targetSuffix", true, "suffix to add to the end of the target file name");
+        options.addOption("staleThresholdMillis", true, "how long to wait before determining that a consumer has gone stale");
+        options.addOption("?", "help", false, "this help message");
+        return options;
+    }
+
+    public static void main(String[] args) throws Exception {
+        Options options = new FSBatchProcessCLI().getOptions();
+
+        CommandLineParser cliParser = new GnuParser();
+        CommandLine line = cliParser.parse(options, args);
+
+        if (line.hasOption("help")) {
+            HelpFormatter helpFormatter = new HelpFormatter();
+            helpFormatter.printHelp("tika filesystem batch", options);
+            System.exit(-1);
+        }
+
+        Map<String, String> mapArgs = new HashMap<String, String>();
+        for (Option option : line.getOptions()) {
+            String v = option.getValue();
+            if (v == null || v.equals("")) {
+                v = "true";
+            }
+            mapArgs.put(option.getOpt(), v);
+        }
+        String configFilePath = line.getOptionValue("c");
+        InputStream is = null;
+        if (configFilePath != null) {
+            File configFile = new File(configFilePath);
+            is = new FileInputStream(configFile);
+        }
+        if (is == null) {
+            throw new RuntimeException("Must specify a configuration file: -c");
+        }
+        BatchProcessBuilder b = new BatchProcessBuilder();
+        BatchProcess process = b.build(is, mapArgs);
+        IOUtils.closeQuietly(is);
+        ParallelFileProcessingResult result = process.execute();
+        System.out.println(FINISHED_STRING);
+        System.out.println("\n");
+        System.out.println(result.toString());
+        System.exit(result.getExitStatus());
+    }
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/FSConsumersManager.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/FSConsumersManager.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/FSConsumersManager.java	(revision 0)
@@ -0,0 +1,49 @@
+package org.apache.tika.batch.fs;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.ConsumersManager;
+import org.apache.tika.batch.FileResourceConsumer;
+
+import java.util.Collections;
+import java.util.List;
+
+public class FSConsumersManager implements ConsumersManager {
+
+    private final List<FileResourceConsumer> consumers;
+
+    public FSConsumersManager(List<FileResourceConsumer> consumers) {
+        this.consumers = Collections.unmodifiableList(consumers);
+    }
+
+    @Override
+    public List<FileResourceConsumer> getConsumers() {
+        return consumers;
+    }
+
+    @Override
+    public void init() {
+        //noop
+    }
+
+    @Override
+    public void shutdown() {
+        //noop
+    }
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/FSListCrawler.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/FSListCrawler.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/FSListCrawler.java	(revision 0)
@@ -0,0 +1,80 @@
+package org.apache.tika.batch.fs;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.FileResource;
+import org.apache.tika.batch.FileResourceCrawler;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.util.concurrent.ArrayBlockingQueue;
+
+/**
+ * Class that "crawls" a list of files.
+ */
+public class FSListCrawler extends FileResourceCrawler {
+
+    private final BufferedReader reader;
+    private final File root;
+
+    public FSListCrawler(ArrayBlockingQueue<FileResource> fileQueue,
+                         int numConsumers, File root, File list, String encoding)
+            throws FileNotFoundException, UnsupportedEncodingException {
+        super(fileQueue, numConsumers);
+        reader = new BufferedReader(new InputStreamReader(new FileInputStream(list), encoding));
+        this.root = root;
+
+    }
+
+    public void start() throws InterruptedException {
+        String line = nextLine();
+
+        while (line != null) {
+            if (Thread.currentThread().isInterrupted()) {
+                throw new InterruptedException("file adder interrupted");
+            }
+            File f = new File(root, line);
+            if (! f.exists()) {
+                super.logger.warn("File doesn't exist:"+f.getAbsolutePath());
+                line = nextLine();
+                continue;
+            }
+            if (f.isDirectory()) {
+                super.logger.warn("File is a directory:"+f.getAbsolutePath());
+                line = nextLine();
+                continue;
+            }
+            tryToAdd(new FSFileResource(root, f));
+            line = nextLine();
+        }
+    }
+
+    private String nextLine() {
+        String line = null;
+        try {
+            line = reader.readLine();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return line;
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/FSProperties.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/FSProperties.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/FSProperties.java	(revision 0)
@@ -0,0 +1,17 @@
+package org.apache.tika.batch.fs;
+
+import org.apache.tika.metadata.Property;
+
+public class FSProperties {
+    private final static String TIKA_BATCH_FS_NAMESPACE = "tika_batch_fs";
+
+    /**
+     * File's absolute path
+     */
+    public final static Property FS_ABSOLUTE_PATH = Property.internalText(TIKA_BATCH_FS_NAMESPACE+":absolute_path");
+
+    /**
+     * File's relative path (including file name) from a given source root
+     */
+    public final static Property FS_REL_PATH = Property.internalText(TIKA_BATCH_FS_NAMESPACE+":relative_path");
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/FSUtil.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/FSUtil.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/FSUtil.java	(revision 0)
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tika.batch.fs;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.UUID;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Utility class to handle some common issues when
+ * reading from and writing to a file system (FS).
+ */
+public class FSUtil {
+
+    public static boolean checkThisIsAncestorOfThat(File ancestor, File child) {
+        int ancLen = ancestor.getAbsolutePath().length();
+        int childLen = child.getAbsolutePath().length();
+        if (childLen <= ancLen) {
+            return false;
+        }
+
+        String childBase = child.getAbsolutePath().substring(0, ancLen);
+        return childBase.equals(ancestor.getAbsolutePath());
+
+    }
+
+    public static boolean checkThisIsAncestorOfOrSameAsThat(File ancestor, File child) {
+        if (ancestor.equals(child)) {
+            return true;
+        }
+        return checkThisIsAncestorOfThat(ancestor, child);
+    }
+
+    public enum HANDLE_EXISTING {
+        OVERWRITE,
+        RENAME,
+        SKIP
+    }
+
+    ;
+
+    private final static Pattern FILE_NAME_PATTERN =
+            Pattern.compile("\\A(.*?)(?:\\((\\d+)\\))?\\.([^\\.]+)\\Z");
+
+    /**
+     * Given a target root and an initial relative path,
+     * return the target file according to the HANDLE_EXISTING strategy
+     * <p/>
+     * In the most basic use case, given a root directory "input",
+     * a file's relative path "dir1/dir2/fileA.docx", and a target directory
+     * "output", the target file would be "output/dir1/dir2/fileA.docx."
+     * <p/>
+     * If HANDLE_EXISTING is set to OVERWRITE, this will not check to see if the target already exists,
+     * and the returned file could overwrite an existing file!!!
+     * <p/>
+     * If HANDLE_EXISTING is set to RENAME, this will try to increment a counter at the end of
+     * the file name (fileA(2).docx) until there is a file name that doesn't exist.
+     * <p/>
+     * This will return null if handleExisting == HANDLE_EXISTING.SKIP and
+     * the candidate file already exists.
+     * <p/>
+     * This will throw an IOException if HANDLE_EXISTING is set to
+     * RENAME, and a candidate cannot target file cannot be found
+     * after trying to increment the file count (e.g. fileA(2).docx) 10000 times
+     * and then after trying 20,000 UUIDs.
+     *
+     * @param targetRoot
+     * @param initialRelativePath
+     * @param handleExisting
+     * @param suffix suffix to add to files, can be null
+     * @return
+     * @throws java.io.IOException
+     */
+    public static File getTargetFile(File targetRoot, String initialRelativePath,
+                                     HANDLE_EXISTING handleExisting, String suffix) throws IOException {
+        String localSuffix = (suffix == null) ? "" : suffix;
+        File cand = new File(targetRoot, initialRelativePath+"."+localSuffix);
+        if (cand.isFile()) {
+            if (handleExisting.equals(HANDLE_EXISTING.OVERWRITE)) {
+                return cand;
+            } else if (handleExisting.equals(HANDLE_EXISTING.SKIP)) {
+                return null;
+            }
+        }
+
+        //if we're here, the target file exists, and
+        //we must find a new name for it.
+
+        //groups for "testfile(1).txt":
+        //group(1) is "testfile"
+        //group(2) is 1
+        //group(3) is "txt"
+        //Note: group(2) can be null
+        int cnt = 0;
+        String fNameBase = null;
+        String fNameExt = "";
+        //this doesn't include the addition of the localSuffix
+        File candOnly = new File(targetRoot, initialRelativePath);
+        Matcher m = FILE_NAME_PATTERN.matcher(candOnly.getName());
+        if (m.find()) {
+            fNameBase = m.group(1);
+
+            if (m.group(2) != null) {
+                try {
+                    cnt = Integer.parseInt(m.group(2));
+                } catch (NumberFormatException e) {
+                    //swallow
+                }
+            }
+            if (m.group(3) != null) {
+                fNameExt = m.group(3);
+            }
+        }
+
+        File targetParent = cand.getParentFile();
+        while (fNameBase != null && cand.isFile() && ++cnt < 10000) {
+            String candFileName = fNameBase + "(" + cnt + ")." + fNameExt+"."+localSuffix;
+            cand = new File(targetParent, candFileName);
+        }
+        //reset count to 0 and try 20000 times
+        cnt = 0;
+        while (cand.isFile() && cnt++ < 20000) {
+            UUID uid = UUID.randomUUID();
+            cand = new File(targetParent, uid.toString() + fNameExt+"."+localSuffix);
+        }
+
+        if (cand.isFile()) {
+            throw new IOException("Couldn't find candidate target file after trying " +
+                    "very, very hard");
+        }
+        return cand;
+    }
+
+}
\ No newline at end of file
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/FSDocumentSelector.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/FSDocumentSelector.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/FSDocumentSelector.java	(revision 0)
@@ -0,0 +1,78 @@
+package org.apache.tika.batch.fs;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.extractor.DocumentSelector;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.util.PropsUtil;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Selector that chooses files based on their file name
+ * and their size, as determined by Metadata.RESOURCE_NAME_KEY and Metadata.CONTENT_LENGTH.
+ * <p/>
+ * The {@link #excludeFileName} pattern is applied first (if it isn't null).
+ * Then the {@link #includeFileName} pattern is applied (if it isn't null),
+ * and finally, the size limit is applied if it is above 0.
+ */
+public class FSDocumentSelector implements DocumentSelector {
+
+    //can be null!
+    private final Pattern includeFileName;
+
+    //can be null!
+    private final Pattern excludeFileName;
+    private final long maxFileSizeBytes;
+
+    public FSDocumentSelector(Pattern includeFileName, Pattern excludeFileName, long maxFileSizeBytes) {
+        this.includeFileName = includeFileName;
+        this.excludeFileName = excludeFileName;
+        this.maxFileSizeBytes = maxFileSizeBytes;
+    }
+
+    @Override
+    public boolean select(Metadata metadata) {
+        String fName = metadata.get(Metadata.RESOURCE_NAME_KEY);
+        long sz = PropsUtil.getLong(metadata.get(Metadata.CONTENT_LENGTH), -1);
+
+        if (excludeFileName != null && fName != null) {
+            Matcher m = excludeFileName.matcher(fName);
+            if (m.find()) {
+                return false;
+            }
+        }
+
+        if (includeFileName != null && fName != null) {
+            Matcher m = includeFileName.matcher(fName);
+            if (m.find()) {
+                return true;
+            } else {
+                return false;
+            }
+        }
+        if (maxFileSizeBytes > 0 && sz > 0) {
+            if (sz > maxFileSizeBytes) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/builders/FSCrawlerBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/builders/FSCrawlerBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/builders/FSCrawlerBuilder.java	(revision 0)
@@ -0,0 +1,128 @@
+package org.apache.tika.batch.fs.builders;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+import org.apache.tika.batch.FileResource;
+import org.apache.tika.batch.FileResourceCrawler;
+import org.apache.tika.batch.builders.BatchProcessBuilder;
+import org.apache.tika.batch.builders.ICrawlerBuilder;
+import org.apache.tika.batch.fs.FSDirectoryCrawler;
+import org.apache.tika.batch.fs.FSDocumentSelector;
+import org.apache.tika.extractor.DocumentSelector;
+import org.apache.tika.util.PropsUtil;
+import org.apache.tika.util.XMLDOMUtil;
+import org.w3c.dom.Node;
+
+import java.io.File;
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.regex.Pattern;
+
+/**
+ * Builds either an FSDirectoryCrawler or an FSListCrawler.
+ */
+public class FSCrawlerBuilder implements ICrawlerBuilder {
+
+    private final static String MAX_CONSEC_WAIT_MILLIS = "maxConsecWaitMillis";
+    private final static String MAX_FILES_TO_ADD_ATTR = "maxFilesToAdd";
+    private final static String MAX_FILES_TO_CONSIDER_ATTR = "maxFilesToConsider";
+
+
+    private final static String CRAWL_ORDER = "crawlOrder";
+    private final static String SRC_DIR_ATTR = "srcDir";
+    private final static String SRC_START_DIR_ATTR = "startDir";
+    private final static String MAX_FILE_SIZE_BYTES_ATTR = "maxFileSizeBytes";
+
+
+    private final static String INCLUDE_FILE_PAT_ATTR = "includeFilePat";
+    private final static String EXCLUDE_FILE_PAT_ATTR = "excludeFilePat";
+
+    @Override
+    public FileResourceCrawler build(Node node, Map<String, String> runtimeAttributes,
+                                     ArrayBlockingQueue<FileResource> queue) {
+
+        Map<String, String> attributes = XMLDOMUtil.mapifyAttrs(node, runtimeAttributes);
+
+        int numConsumers = BatchProcessBuilder.getNumConsumers(runtimeAttributes);
+
+        File srcDir = PropsUtil.getFile(attributes.get(SRC_DIR_ATTR), new File("input"));
+        FileResourceCrawler crawler = null;
+        if (attributes.containsKey("fileList")) {
+            String randomCrawlString = attributes.get(CRAWL_ORDER);
+
+            if (randomCrawlString != null) {
+                //TODO: change to logger warn or throw RuntimeException?
+                System.err.println("randomCrawl attribute is ignored by FSListCrawler");
+            }
+            File fileList = PropsUtil.getFile(attributes.get("fileList"), null);
+            String encoding = PropsUtil.getString(attributes.get("fileListEncoding"), "UTF-8");
+            try {
+                crawler = new org.apache.tika.batch.fs.FSListCrawler(queue, numConsumers, srcDir, fileList, encoding);
+            } catch (java.io.FileNotFoundException e) {
+                throw new RuntimeException("fileList file not found for FSListCrawler: " + fileList.getAbsolutePath());
+            } catch (java.io.UnsupportedEncodingException e) {
+                throw new RuntimeException("fileList encoding not supported: "+encoding);
+            }
+        } else {
+            FSDirectoryCrawler.CRAWL_ORDER crawlOrder = getCrawlOrder(attributes.get(CRAWL_ORDER));
+            File startDir = PropsUtil.getFile(attributes.get(SRC_START_DIR_ATTR), null);
+            if (startDir == null) {
+                crawler = new FSDirectoryCrawler(queue, numConsumers, srcDir, crawlOrder);
+            } else {
+                crawler = new FSDirectoryCrawler(queue, numConsumers, srcDir, startDir, crawlOrder);
+            }
+        }
+
+        crawler.setMaxFilesToConsider(PropsUtil.getInt(attributes.get(MAX_FILES_TO_CONSIDER_ATTR), -1));
+        crawler.setMaxFilesToAdd(PropsUtil.getInt(attributes.get(MAX_FILES_TO_ADD_ATTR), -1));
+
+        DocumentSelector selector = buildSelector(attributes);
+        if (selector != null) {
+            crawler.setDocumentSelector(selector);
+        }
+
+        crawler.setMaxConsecWaitInMillis(PropsUtil.getLong(attributes.get(MAX_CONSEC_WAIT_MILLIS), 300000));//5 minutes
+        return crawler;
+    }
+
+    private FSDirectoryCrawler.CRAWL_ORDER getCrawlOrder(String s) {
+        if (s == null || s.trim().length() == 0) {
+            return FSDirectoryCrawler.CRAWL_ORDER.OS_ORDER;
+        } else if (s.toLowerCase().contains("rand")) {
+            return FSDirectoryCrawler.CRAWL_ORDER.RANDOM;
+        } else if (s.toLowerCase().contains("sort")) {
+            return FSDirectoryCrawler.CRAWL_ORDER.SORTED;
+        } else {
+            return FSDirectoryCrawler.CRAWL_ORDER.OS_ORDER;
+        }
+    }
+
+    private DocumentSelector buildSelector(Map<String, String> attributes) {
+        String includeString = attributes.get(INCLUDE_FILE_PAT_ATTR);
+        String excludeString = attributes.get(EXCLUDE_FILE_PAT_ATTR);
+        long maxFileSize = PropsUtil.getLong(attributes.get(MAX_FILE_SIZE_BYTES_ATTR), -1);
+        Pattern includePat = (includeString != null && includeString.length() > 0) ? Pattern.compile(includeString) : null;
+        Pattern excludePat = (excludeString != null && excludeString.length() > 0) ? Pattern.compile(excludeString) : null;
+
+        return new FSDocumentSelector(includePat, excludePat, maxFileSize);
+
+    }
+
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/builders/BasicTikaFSConsumersBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/builders/BasicTikaFSConsumersBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/builders/BasicTikaFSConsumersBuilder.java	(revision 0)
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tika.batch.fs.builders;
+
+import org.apache.tika.batch.ConsumersManager;
+import org.apache.tika.batch.FileResource;
+import org.apache.tika.batch.FileResourceConsumer;
+import org.apache.tika.batch.OutputStreamFactory;
+import org.apache.tika.batch.ParserFactory;
+import org.apache.tika.batch.builders.AbstractConsumersBuilder;
+import org.apache.tika.batch.builders.BatchProcessBuilder;
+import org.apache.tika.batch.builders.ContentHandlerFactoryBuilder;
+import org.apache.tika.batch.fs.BasicTikaFSConsumer;
+import org.apache.tika.batch.fs.FSConsumersManager;
+import org.apache.tika.batch.fs.FSOutputStreamFactory;
+import org.apache.tika.batch.fs.FSUtil;
+import org.apache.tika.batch.fs.RecursiveParserWrapperFSConsumer;
+import org.apache.tika.sax.ContentHandlerFactory;
+import org.apache.tika.util.ClassLoaderUtil;
+import org.apache.tika.util.PropsUtil;
+import org.apache.tika.util.XMLDOMUtil;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.io.File;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+
+public class BasicTikaFSConsumersBuilder extends AbstractConsumersBuilder {
+
+    @Override
+    public ConsumersManager build(Node node, Map<String, String> runtimeAttributes,
+                                            ArrayBlockingQueue<FileResource> queue) {
+
+        //figure out if we're building a recursiveParserWrapper
+        boolean recursiveParserWrapper = false;
+        String recursiveParserWrapperString = runtimeAttributes.get("recursiveParserWrapper");
+        if (recursiveParserWrapperString != null){
+            recursiveParserWrapper = PropsUtil.getBoolean(recursiveParserWrapperString, recursiveParserWrapper);
+        } else {
+            Node recursiveParserWrapperNode = node.getAttributes().getNamedItem("recursiveParserWrapper");
+            if (recursiveParserWrapperNode != null) {
+                recursiveParserWrapper = PropsUtil.getBoolean(recursiveParserWrapperNode.getNodeValue(), recursiveParserWrapper);
+            }
+        }
+
+        List<FileResourceConsumer> consumers = new LinkedList<FileResourceConsumer>();
+        int numConsumers = BatchProcessBuilder.getNumConsumers(runtimeAttributes);
+
+        NodeList nodeList = node.getChildNodes();
+        Node contentHandlerFactoryNode = null;
+        Node parserFactoryNode = null;
+        Node outputStreamFactoryNode = null;
+
+        for (int i = 0; i < nodeList.getLength(); i++){
+            Node child = nodeList.item(i);
+            String cn = child.getNodeName();
+            if (cn.equals("parser")){
+                parserFactoryNode = child;
+            } else if (cn.equals("contenthandler")) {
+                contentHandlerFactoryNode = child;
+            } else if (cn.equals("outputstream")) {
+                outputStreamFactoryNode = child;
+            }
+        }
+
+        if (contentHandlerFactoryNode == null || parserFactoryNode == null
+                || outputStreamFactoryNode == null) {
+            throw new RuntimeException("You must specify a ContentHandlerFactory, "+
+                    "a ParserFactory and an OutputStreamFactory");
+        }
+        ContentHandlerFactory contentHandlerFactory = getContentHandlerFactory(contentHandlerFactoryNode, runtimeAttributes);
+        ParserFactory parserFactory = getParserFactory(parserFactoryNode, runtimeAttributes);
+        OutputStreamFactory outputStreamFactory = getOutputStreamFactory(outputStreamFactoryNode, runtimeAttributes);
+
+        if (recursiveParserWrapper) {
+            for (int i = 0; i < numConsumers; i++) {
+                FileResourceConsumer c = new RecursiveParserWrapperFSConsumer(queue,
+                        parserFactory, contentHandlerFactory, outputStreamFactory);
+                consumers.add(c);
+            }
+        } else {
+            for (int i = 0; i < numConsumers; i++) {
+                FileResourceConsumer c = new BasicTikaFSConsumer(queue,
+                        parserFactory, contentHandlerFactory, outputStreamFactory);
+                consumers.add(c);
+            }
+        }
+        return new FSConsumersManager(consumers);
+    }
+
+
+    private ContentHandlerFactory getContentHandlerFactory(Node node, Map<String, String> runtimeAttributes) {
+
+        Map<String, String> localAttrs = XMLDOMUtil.mapifyAttrs(node, runtimeAttributes);
+        String className = localAttrs.get("builderClass");
+        if (className == null) {
+            throw new RuntimeException("Must specify builderClass for contentHandler");
+        }
+        ContentHandlerFactoryBuilder builder = ClassLoaderUtil.buildClass(ContentHandlerFactoryBuilder.class, className);
+        return builder.build(node, runtimeAttributes);
+    }
+
+    private ParserFactory getParserFactory(Node node, Map<String, String> runtimeAttributes) {
+        //TODO: add ability to set TikaConfig file path
+        Map<String, String> localAttrs = XMLDOMUtil.mapifyAttrs(node, runtimeAttributes);
+        String className = localAttrs.get("class");
+        return ClassLoaderUtil.buildClass(ParserFactory.class, className);
+    }
+
+    private OutputStreamFactory getOutputStreamFactory(Node node, Map<String, String> runtimeAttributes) {
+        Map<String, String> attrs = XMLDOMUtil.mapifyAttrs(node, runtimeAttributes);
+
+        File targDir = PropsUtil.getFile(attrs.get("targDir"), null);
+        FSUtil.HANDLE_EXISTING handleExisting = null;
+        String handleExistingString = attrs.get("handleExisting");
+        if (handleExistingString == null) {
+            handleExistingException();        }
+        if (handleExistingString.equals("overwrite")){
+            handleExisting = FSUtil.HANDLE_EXISTING.OVERWRITE;
+        } else if (handleExistingString.equals("rename")) {
+            handleExisting = FSUtil.HANDLE_EXISTING.RENAME;
+        } else if (handleExistingString.equals("skip")) {
+            handleExisting = FSUtil.HANDLE_EXISTING.SKIP;
+        } else {
+            handleExistingException();
+        }
+
+        String suffix = attrs.get("targetSuffix");
+
+        FSOutputStreamFactory factory = new FSOutputStreamFactory(targDir, handleExisting, suffix);
+        return factory;
+    }
+
+    private void handleExistingException() {
+        throw new RuntimeException("Must specify handleExisting in FSOutputStreamFactory; values include: overwrite, rename, skip");
+    }
+
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/RecursiveParserWrapperFSConsumer.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/RecursiveParserWrapperFSConsumer.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/RecursiveParserWrapperFSConsumer.java	(revision 0)
@@ -0,0 +1,180 @@
+package org.apache.tika.batch.fs;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.tika.batch.BatchNoRestartException;
+import org.apache.tika.batch.FileResource;
+import org.apache.tika.batch.FileResourceConsumer;
+import org.apache.tika.batch.OutputStreamFactory;
+import org.apache.tika.batch.ParserFactory;
+import org.apache.tika.config.TikaConfig;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.serialization.JsonMetadataList;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.Parser;
+import org.apache.tika.parser.RecursiveParserWrapper;
+import org.apache.tika.sax.ContentHandlerFactory;
+import org.xml.sax.helpers.DefaultHandler;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.ArrayBlockingQueue;
+
+/**
+ * Basic FileResourceConsumer that reads files from an input
+ * directory and writes content to the output directory.
+ * <p/>
+ * This tries to catch most of the common exceptions and log them as errors.
+ */
+public class RecursiveParserWrapperFSConsumer extends FileResourceConsumer {
+
+    Log log = LogFactory.getLog(RecursiveParserWrapperFSConsumer.class);
+
+
+    private final ParserFactory parserFactory;
+    private final ContentHandlerFactory contentHandlerFactory;
+    private final OutputStreamFactory fsOSFactory;
+    private String outputEncoding = "UTF-8";
+
+
+    public RecursiveParserWrapperFSConsumer(ArrayBlockingQueue<FileResource> queue,
+                                            ParserFactory parserFactory,
+                                            ContentHandlerFactory contentHandlerFactory,
+                                            OutputStreamFactory fsOSFactory) {
+        super(queue);
+        this.parserFactory = parserFactory;
+        this.contentHandlerFactory = contentHandlerFactory;
+        this.fsOSFactory = fsOSFactory;
+    }
+
+    @Override
+    public boolean processFileResource(FileResource fileResource) {
+
+        Parser wrapped = parserFactory.getParser(TikaConfig.getDefaultConfig());
+        RecursiveParserWrapper parser = new RecursiveParserWrapper(wrapped, contentHandlerFactory);
+        ParseContext context = new ParseContext();
+
+//        if (parseRecursively == true) {
+        context.set(Parser.class, parser);
+//        }
+
+        //try to open outputstream first
+        OutputStream os = null;
+        try {
+            os = fsOSFactory.getOutputStream(fileResource.getMetadata());
+        } catch (IOException e) {
+            log.fatal(e.getMessage());
+            throw new BatchNoRestartException("IOException trying to open output stream for "+
+                    fileResource.getResourceId() + " :: " + e.getMessage());
+        }
+        //os can be null if fsOSFactory is set to skip processing a file and the target
+        //file already exists
+        if (os == null) {
+            log.debug("Skipping: " + fileResource.getMetadata().get(FSProperties.FS_ABSOLUTE_PATH));
+            return false;
+        }
+        String absolutePath = fileResource.getMetadata().get(FSProperties.FS_ABSOLUTE_PATH);
+
+        //try to open the inputstream before the parse.
+        //if the parse hangs or throws a nasty exception, at least there will
+        //be a zero byte file there so that the batchrunner can skip that problematic
+        //file during the next run.
+        InputStream is = null;
+        try {
+            is = fileResource.openInputStream();
+        } catch (IOException e) {
+            log.error(e.getMessage());
+            incrementHandledExceptions();
+            flushAndClose(os);
+            return false;
+        }
+
+        Throwable thrown = null;
+        List<Metadata> metadataList = null;
+        try {
+            parser.parse(is, new DefaultHandler(),
+                    fileResource.getMetadata(), context);
+            metadataList = parser.getMetadata();
+        } catch (Throwable t) {
+            thrown = t;
+            if (t instanceof Error) {
+                log.fatal(absolutePath + "\t" + t.getMessage());
+            } else {
+                log.error(absolutePath + "\t" + t.getMessage());
+            }
+            if (metadataList == null) {
+                metadataList = new LinkedList<Metadata>();
+            }
+            Metadata m = null;
+            if (metadataList.size() > 0) {
+                m = metadataList.remove(0);
+            } else {
+                m = fileResource.getMetadata();
+            }
+            StringWriter stringWriter = new StringWriter();
+            PrintWriter w = new PrintWriter(stringWriter);
+            t.printStackTrace(w);
+            m.add(RecursiveParserWrapper.PARSE_EXCEPTION, stringWriter.toString());
+            metadataList.add(0, m);
+        } finally {
+            close(is);
+        }
+
+        Writer writer = null;
+
+        try {
+            writer = new OutputStreamWriter(os, getOutputEncoding());
+            JsonMetadataList.toJson(metadataList, writer);
+        } catch (IOException e) {
+            log.error(absolutePath + "\t" + e.getMessage());
+        } catch (TikaException e) {
+            log.error(absolutePath + "\t" + e.getMessage());
+        } finally {
+            flushAndClose(writer);
+        }
+
+        if (thrown != null) {
+            if (thrown instanceof Error) {
+                throw (Error) thrown;
+            } else {
+                incrementHandledExceptions();
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    public String getOutputEncoding() {
+        return outputEncoding;
+    }
+
+    public void setOutputEncoding(String outputEncoding) {
+        this.outputEncoding = outputEncoding;
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/strawman/StrawManTikaAppDriver.java	(revision 0)
@@ -0,0 +1,215 @@
+package org.apache.tika.batch.fs.strawman;
+
+
+import org.apache.log4j.Logger;
+import org.apache.tika.io.IOUtils;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorCompletionService;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Simple single-threaded class that calls tika-app against every file in a directory.
+ *
+ * This is exceedingly robust.  One file per process.
+ *
+ * However, you can use this to compare performance against tika-batch fs code.
+ *
+ *
+ */
+public class StrawManTikaAppDriver implements Callable<Integer> {
+
+    private static AtomicInteger threadCount = new AtomicInteger(0);
+    private final int totalThreads;
+    private final int threadNum;
+    private int rootLen = -1;
+    private File srcDir = null;
+    private File targDir = null;
+    private String[] args = null;
+    private Logger logger = Logger.getLogger(StrawManTikaAppDriver.class);
+
+
+    public StrawManTikaAppDriver(File srcDir, File targDir, int totalThreads, String[] args) {
+        rootLen = srcDir.getAbsolutePath().length()+1;
+        this.srcDir = srcDir;
+        this.targDir = targDir;
+        this.args = args;
+        threadNum = threadCount.getAndIncrement();
+        this.totalThreads = totalThreads;
+    }
+
+
+    private int processDirectory(File srcDir) {
+        int processed = 0;
+        for (File f : srcDir.listFiles()) {
+            List<File> childDirs = new ArrayList<File>();
+            if (f.isDirectory()) {
+                childDirs.add(f);
+            } else {
+                processed += processFile(f);
+            }
+            for (File dir : childDirs) {
+                processed += processDirectory(dir);
+
+            }
+        }
+        return processed;
+    }
+
+    private int processFile(File f) {
+        if (totalThreads > 1) {
+            int hashCode = f.getAbsolutePath().hashCode();
+            if (Math.abs(hashCode % totalThreads) != threadNum) {
+                return 0;
+            }
+        }
+        File targFile = new File(targDir, f.getAbsolutePath().substring(rootLen)+".txt");
+        targFile.getAbsoluteFile().getParentFile().mkdirs();
+        if (! targFile.getParentFile().exists()) {
+            logger.fatal("parent directory for "+ targFile + " was not made!");
+            throw new RuntimeException("couldn't make parent file for " + targFile);
+        }
+        List<String> commandLine = new ArrayList<String>();
+        for (int i = 0; i < args.length; i++) {
+            commandLine.add(args[i]);
+        }
+        commandLine.add("-t");
+        commandLine.add("\""+f.getAbsolutePath()+"\"");
+        ProcessBuilder builder = new ProcessBuilder(commandLine.toArray(new String[commandLine.size()]));
+        logger.info("about to process: "+f.getAbsolutePath());
+        Process proc = null;
+        RedirectGobbler gobbler = null;
+        Thread gobblerThread = null;
+        try {
+            OutputStream os = new FileOutputStream(targFile);
+            proc = builder.start();
+            gobbler = new RedirectGobbler(proc.getInputStream(), os);
+            gobblerThread = new Thread(gobbler);
+            gobblerThread.start();
+        } catch (IOException e) {
+            logger.error(e.getMessage());
+            return 0;
+        }
+
+        boolean finished = false;
+        long totalTime = 180000;//3 minutes
+        long pulse = 100;
+        for (int i = 0; i < totalTime; i += pulse) {
+            try {
+                Thread.currentThread().sleep(pulse);
+            } catch (InterruptedException e) {
+                //swallow
+            }
+            try {
+                int exit = proc.exitValue();
+                finished = true;
+                break;
+            } catch (IllegalThreadStateException e) {
+                //swallow
+            }
+        }
+        if (!finished) {
+            logger.warn("Had to kill process working on: " + f.getAbsolutePath());
+            proc.destroy();
+        }
+        gobbler.close();
+        gobblerThread.interrupt();
+        return 1;
+    }
+
+
+    @Override
+    public Integer call() throws Exception {
+        long start = new Date().getTime();
+
+        int processed = processDirectory(srcDir);
+        double elapsedSecs = ((double)new Date().getTime()-(double)start)/(double)1000;
+        logger.info("Finished processing " + processed + " files in " + elapsedSecs + " seconds.");
+        return new Integer(processed);
+    }
+
+    private class RedirectGobbler implements Runnable {
+        private OutputStream os = null;
+        private InputStream is = null;
+
+        private RedirectGobbler(InputStream is, OutputStream os) {
+            this.is = is;
+            this.os = os;
+        }
+        private void gobble(InputStream is) {
+        }
+        private void close() {
+            if (os != null) {
+                try {
+                    os.flush();
+                } catch (IOException e) {
+                    logger.error("can't flush");
+                }
+                try {
+                    os.close();
+                    is.close();
+                } catch (IOException e) {
+                    logger.error("can't close");
+                }
+            }
+        }
+
+        @Override
+        public void run() {
+            try {
+                IOUtils.copy(is, os);
+            } catch (IOException e) {
+                logger.error("IOException while gobbling");
+            }
+        }
+    }
+    public static void main(String[] args) {
+        long start = new Date().getTime();
+        File srcDir = new File(args[0]);
+        File targDir = new File(args[1]);
+        int totalThreads = Integer.parseInt(args[2]);
+
+        List<String> commandLine = new ArrayList<String>();
+        for (int i = 3; i < args.length; i++) {
+            commandLine.add(args[i]);
+        }
+        totalThreads = (totalThreads < 1) ? 1 : totalThreads;
+        ExecutorService ex = Executors.newFixedThreadPool(totalThreads);
+        ExecutorCompletionService<Integer> completionService =
+                new ExecutorCompletionService<Integer>(ex);
+
+        for (int i = 0; i < totalThreads; i++) {
+            StrawManTikaAppDriver driver =
+                    new StrawManTikaAppDriver(srcDir, targDir, totalThreads, commandLine.toArray(new String[commandLine.size()]));
+            completionService.submit(driver);
+        }
+
+        int totalFilesProcessed = 0;
+        for (int i = 0; i < totalThreads; i++) {
+            try {
+                Future<Integer> future = completionService.take();
+                if (future != null) {
+                    totalFilesProcessed += future.get();
+                }
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            } catch (ExecutionException e) {
+                e.printStackTrace();
+            }
+        }
+        double elapsedSeconds = (double)(new Date().getTime()-start)/(double)1000;
+        System.out.println("Processed "+totalFilesProcessed + " in " + elapsedSeconds + " seconds");
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/FSDirectoryCrawler.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/FSDirectoryCrawler.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/FSDirectoryCrawler.java	(revision 0)
@@ -0,0 +1,141 @@
+package org.apache.tika.batch.fs;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.FileResource;
+import org.apache.tika.batch.FileResourceCrawler;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.concurrent.ArrayBlockingQueue;
+
+public class FSDirectoryCrawler extends FileResourceCrawler {
+
+    public enum CRAWL_ORDER
+    {
+        SORTED, //alphabetical order; necessary for cross-platform unit tests
+        RANDOM, //Shuffle
+        OS_ORDER //OS chooses
+    };
+    private final File root;
+    private final File startDirectory;
+    private final Comparator fileComparator = new FileNameComparator();
+    private CRAWL_ORDER crawlOrder;
+
+    public FSDirectoryCrawler(ArrayBlockingQueue<FileResource> fileQueue,
+                              int numConsumers, File root, CRAWL_ORDER crawlOrder) {
+        super(fileQueue, numConsumers);
+        this.root = root;
+        this.startDirectory = root;
+        this.crawlOrder = crawlOrder;
+    }
+
+    public FSDirectoryCrawler(ArrayBlockingQueue<FileResource> fileQueue,
+                              int numConsumers, File root, File startDirectory,
+                              CRAWL_ORDER crawlOrder) {
+        super(fileQueue, numConsumers);
+        this.root = root;
+        this.startDirectory = startDirectory;
+        this.crawlOrder = crawlOrder;
+        assert(FSUtil.checkThisIsAncestorOfOrSameAsThat(root, startDirectory));
+    }
+
+    public void start() throws InterruptedException {
+        addFiles(root);
+    }
+
+    private void addFiles(File directory) throws InterruptedException {
+
+        if (directory == null ||
+                !directory.isDirectory() || !directory.canRead()) {
+            super.logger.warn("FSFileAdder can't read this directory: " + directory.getAbsolutePath());
+            return;
+        }
+
+        List<File> directories = new ArrayList<File>();
+        File[] fileArr = directory.listFiles();
+        if (fileArr == null) {
+            super.logger.info("Empty directory: " + directory.getAbsolutePath());
+            return;
+        }
+
+        List<File> files = new ArrayList<File>(Arrays.asList(fileArr));
+
+        if (crawlOrder == CRAWL_ORDER.RANDOM) {
+            Collections.shuffle(files);
+        } else if (crawlOrder == CRAWL_ORDER.SORTED) {
+            Collections.sort(files, fileComparator);
+        }
+
+        int numFiles = 0;
+        for (File f : files) {
+            if (Thread.currentThread().isInterrupted()) {
+                throw new InterruptedException("file adder interrupted");
+            }
+
+            if (f.isFile()) {
+                numFiles++;
+                if (numFiles == 1) {
+                    handleFirstFileInDirectory(f);
+                }
+            }
+            if (f.isDirectory()) {
+                directories.add(f);
+                continue;
+            }
+            boolean added = tryToAdd(new FSFileResource(root, f));
+            logger.debug("trying to add: "+f.getAbsolutePath() + " : " + added);
+
+        }
+
+        for (File f : directories) {
+            addFiles(f);
+        }
+        return;
+    }
+
+    /**
+     * Override this if you have any special handling
+     * for the first actual file that the crawler comes across
+     * in a directory.  For example, it might be handy to call
+     * mkdirs() on a target directory if your FileResourceConsumers
+     * are writing to a file.
+     *
+     * @param f
+     */
+    public void handleFirstFileInDirectory(File f) {
+        //no-op
+    }
+
+    //simple lexical order for the file name, we don't really care about localization.
+    //we do want this, though, because file.compareTo behaves differently
+    //on different OS's.
+    private class FileNameComparator implements Comparator<File> {
+
+        @Override
+        public int compare(File f1, File f2) {
+            if (f1 == null || f2 == null) {
+                return 0;
+            }
+            return f1.getName().compareTo(f2.getName());
+        }
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/fs/FSOutputStreamFactory.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/fs/FSOutputStreamFactory.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/fs/FSOutputStreamFactory.java	(revision 0)
@@ -0,0 +1,72 @@
+package org.apache.tika.batch.fs;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.OutputStreamFactory;
+import org.apache.tika.metadata.Metadata;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class FSOutputStreamFactory implements OutputStreamFactory {
+
+    private final FSUtil.HANDLE_EXISTING handleExisting;
+    private final File targetRoot;
+    private final String suffix;
+
+    public FSOutputStreamFactory(File targetRoot, FSUtil.HANDLE_EXISTING handleExisting, String suffix) {
+        this.handleExisting = handleExisting;
+        this.targetRoot = targetRoot.getAbsoluteFile();
+        this.suffix = suffix;
+    }
+
+    /**
+     * This tries to create a file based on the {@link org.apache.tika.batch.fs.FSUtil.HANDLE_EXISTING}
+     * value that was passed in during initialization.
+     * <p>
+     * If {@link #handleExisting} is set to "SKIP" and the target file already exists,
+     * this will return null.
+     * <p>
+     * If a target file can be found, this will try to mkdirs for that target file.
+     * If mkdirs() fails, this will throw an IOException.
+     * <p>
+     * Finally, this will open an output stream for the appropriate target file.
+     * @param metadata must have a value set for FSMetadataProperties.FS_ABSOLUTE_PATH or
+     *                 else NullPointerException will be thrown!
+     * @return
+     * @throws IOException, NullPointerException
+     */
+    @Override
+    public OutputStream getOutputStream(Metadata metadata) throws IOException {
+        String initialRelativePath = metadata.get(FSProperties.FS_REL_PATH);
+        File targetFile = FSUtil.getTargetFile(targetRoot, initialRelativePath, handleExisting, suffix);
+        if (targetFile == null) {
+            return null;
+        }
+        if (! targetFile.getParentFile().isDirectory()) {
+            boolean success = targetFile.getParentFile().mkdirs();
+            //with multithreading, it is possible that the parent file was created between
+            //the test and the attempt to .mkdirs(); mkdirs() returns false if the dirs already exist
+            if (! success && ! targetFile.getParentFile().isDirectory()) {
+                throw new IOException("Couldn't create parent directory for:"+targetFile.getAbsolutePath());
+            }
+        }
+        return new FileOutputStream(targetFile);
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/ParallelFileProcessingResult.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/ParallelFileProcessingResult.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/ParallelFileProcessingResult.java	(revision 0)
@@ -0,0 +1,99 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class ParallelFileProcessingResult {
+    private final int considered;
+    private final int added;
+    private final int consumed;
+    private final double secondsElapsed;
+    private final int exitStatus;
+    private final String causeForTermination;
+
+    public ParallelFileProcessingResult(int considered, int added, int consumed, double secondsElapsed,
+                                        int exitStatus,
+                                        String causeForTermination) {
+        this.considered = considered;
+        this.added = added;
+        this.consumed = consumed;
+        this.secondsElapsed = secondsElapsed;
+        this.exitStatus = exitStatus;
+        this.causeForTermination = causeForTermination;
+    }
+
+    /**
+     * Returns the number of file resources considered.
+     * If a filter causes the crawler to ignore a number of resources,
+     * this number could be higher than that returned by {@link #getConsumed()}.
+     *
+     * @return number of file resources considered
+     */
+    public int getConsidered() {
+        return considered;
+    }
+
+    /**
+     * @return number of resources added to the queue
+     */
+    public int getAdded() {
+        return added;
+    }
+
+    /**
+     * @return number of resources that were tried to be consumed.  There
+     * may have been an exception.
+     */
+    public int getConsumed() {
+        return consumed;
+    }
+
+    /**
+     * @return whether the {@link BatchProcess} was interrupted
+     * by an {@link CommandLineInterrupter}.
+     */
+    public String getCauseForTermination() {
+        return causeForTermination;
+    }
+
+    /**
+     * @returns seconds elapsed since the start of the batch processing.
+     */
+    public double secondsElapsed() {
+        return secondsElapsed;
+    }
+
+    /**
+     *
+     * @return intendedExitStatus
+     */
+    public int getExitStatus() {
+        return exitStatus;
+    }
+
+    @Override
+    public String toString() {
+        return "ParallelFileProcessingResult{" +
+                "considered=" + considered +
+                ", added=" + added +
+                ", consumed=" + consumed +
+                ", secondsElapsed=" + secondsElapsed +
+                ", exitStatus=" + exitStatus +
+                ", causeForTermination='" + causeForTermination + '\'' +
+                '}';
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/builders/ICrawlerBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/builders/ICrawlerBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/builders/ICrawlerBuilder.java	(revision 0)
@@ -0,0 +1,32 @@
+package org.apache.tika.batch.builders;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.FileResource;
+import org.apache.tika.batch.FileResourceCrawler;
+import org.w3c.dom.Node;
+
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+
+public interface ICrawlerBuilder extends ObjectFromDOMAndQueueBuilder<FileResourceCrawler>{
+  
+  public FileResourceCrawler build(Node node, Map<String, String> attributes,
+                                   ArrayBlockingQueue<FileResource> queue);
+  
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/builders/ObjectFromDOMBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/builders/ObjectFromDOMBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/builders/ObjectFromDOMBuilder.java	(revision 0)
@@ -0,0 +1,15 @@
+package org.apache.tika.batch.builders;
+
+
+import org.w3c.dom.Node;
+
+import java.util.Map;
+
+/**
+ * Interface for things that build objects from a DOM Node and a map of runtime attributes
+ * @param <T>
+ */
+public interface ObjectFromDOMBuilder<T> {
+
+    public T build(Node node, Map<String, String> runtimeAttributes);
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/builders/IInterupterBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/builders/IInterupterBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/builders/IInterupterBuilder.java	(revision 0)
@@ -0,0 +1,27 @@
+package org.apache.tika.batch.builders;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.IInterrupter;
+import org.w3c.dom.Node;
+
+import java.util.Map;
+
+public interface IInterupterBuilder {
+    public IInterrupter build(Node n, Map<String, String> commandlineArguments);
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/builders/CommandLineInterrupterBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/builders/CommandLineInterrupterBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/builders/CommandLineInterrupterBuilder.java	(revision 0)
@@ -0,0 +1,32 @@
+package org.apache.tika.batch.builders;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.CommandLineInterrupter;
+import org.apache.tika.batch.IInterrupter;
+import org.w3c.dom.Node;
+
+import java.util.Map;
+
+public class CommandLineInterrupterBuilder implements IInterupterBuilder {
+
+    @Override
+    public IInterrupter build(Node n, Map<String, String> commandlineArguments) {
+        return new CommandLineInterrupter();
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/builders/SimpleLogReporterBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/builders/SimpleLogReporterBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/builders/SimpleLogReporterBuilder.java	(revision 0)
@@ -0,0 +1,43 @@
+package org.apache.tika.batch.builders;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.ConsumersManager;
+import org.apache.tika.batch.FileResourceCrawler;
+import org.apache.tika.batch.SimpleLogStatusReporter;
+import org.apache.tika.util.PropsUtil;
+import org.apache.tika.util.XMLDOMUtil;
+import org.w3c.dom.Node;
+
+import java.util.Map;
+
+public class SimpleLogReporterBuilder implements StatusReporterBuilder {
+
+    @Override
+    public SimpleLogStatusReporter build(FileResourceCrawler crawler, ConsumersManager consumersManager,
+                                Node n, Map<String, String> commandlineArguments) {
+
+        Map<String, String> attributes = XMLDOMUtil.mapifyAttrs(n, commandlineArguments);
+        long sleepMillis = PropsUtil.getLong(attributes.get("sleepMillis"), 1000);
+        long staleThresholdMillis = PropsUtil.getLong(attributes.get("staleThresholdMillis"), 500000);
+        SimpleLogStatusReporter reporter = new SimpleLogStatusReporter(crawler, consumersManager);
+        reporter.setSleepMillis(sleepMillis);
+        reporter.setStaleThresholdMillis(staleThresholdMillis);
+        return reporter;
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/builders/BatchProcessBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/builders/BatchProcessBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/builders/BatchProcessBuilder.java	(revision 0)
@@ -0,0 +1,290 @@
+package org.apache.tika.batch.builders;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.BatchProcess;
+import org.apache.tika.batch.ConsumersManager;
+import org.apache.tika.batch.FileResource;
+import org.apache.tika.batch.FileResourceCrawler;
+import org.apache.tika.batch.IInterrupter;
+import org.apache.tika.batch.IStatusReporter;
+import org.apache.tika.util.ClassLoaderUtil;
+import org.apache.tika.util.XMLDOMUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+
+
+public class BatchProcessBuilder {
+
+    public final static int DEFAULT_MAX_QUEUE_SIZE = 1000;
+    public final static String MAX_QUEUE_SIZE_KEY = "maxQueueSize";
+    public final static String NUM_CONSUMERS_KEY = "numConsumers";
+
+    /**
+     * Builds a FileResourceBatchProcessor from runtime arguments and a
+     * input stream of a configuration file.  With the exception of the QueueBuilder,
+     * the builders choose how to adjudicate between
+     * runtime arguments and the elements in the configuration file.
+     * <p/>
+     * This does not close the InputStream!
+     * @param is inputStream
+     * @param runtimeAttributes incoming runtime attributes
+     * @return batch process
+     * @throws IOException
+     */
+    public BatchProcess build(InputStream is, Map<String,String> runtimeAttributes) throws IOException {
+        Document doc = null;
+        DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
+        DocumentBuilder docBuilder = null;
+        try {
+            docBuilder = fact.newDocumentBuilder();
+            doc = docBuilder.parse(is);
+        } catch (ParserConfigurationException e) {
+            throw new IOException(e);
+        } catch (SAXException e) {
+            throw new IOException(e);
+        }
+        Node docElement = doc.getDocumentElement();
+        return build(docElement, runtimeAttributes);
+    }
+
+    /**
+     * Builds a FileResourceBatchProcessor from runtime arguments and a
+     * document node of a configuration file.  With the exception of the QueueBuilder,
+     * the builders choose how to adjudicate between
+     * runtime arguments and the elements in the configuration file.
+     *
+     * @param docElement   document element of the xml config file
+     * @param incomingRuntimeAttributes runtime arguments
+     * @return FileResourceBatchProcessor
+     */
+    public BatchProcess build(Node docElement, Map<String, String> incomingRuntimeAttributes) {
+
+        //key components
+        long staleThresholdMillis = XMLDOMUtil.getLong("staleThresholdMillis",
+                incomingRuntimeAttributes, docElement);
+        long staleCheckPulseMillis = XMLDOMUtil.getLong("staleCheckPulseMillis",
+                incomingRuntimeAttributes, docElement);
+        long pauseOnEarlyTerminationMillis = XMLDOMUtil.getLong("pauseOnEarlyTerminationMillis",
+                incomingRuntimeAttributes, docElement);
+        int maxStaleConsumers = XMLDOMUtil.getInt("maxStaleConsumers",
+                incomingRuntimeAttributes, docElement);
+        int maxAliveTimeSeconds = XMLDOMUtil.getInt("maxAliveTimeSeconds",
+                incomingRuntimeAttributes, docElement);
+        FileResourceCrawler crawler = null;
+        ConsumersManager consumersManager = null;
+        IStatusReporter reporter = null;
+        IInterrupter interrupter = null;
+
+        /*
+         * TODO: This is a bit smelly.  NumConsumers needs to be used by the crawler
+         * and the consumers.  This copies the incomingRuntimeAttributes and then
+         * supplies the numConsumers from the commandline (if it exists) or from the config file
+         * At least this creates an unmodifiable defensive copy of incomingRuntimeAttributes...
+         */
+        Map<String, String> runtimeAttributes = setNumConsumersInRuntimeAttributes(docElement, incomingRuntimeAttributes);
+
+        //build queue
+        ArrayBlockingQueue<FileResource> queue = buildQueue(docElement, runtimeAttributes);
+
+        NodeList children = docElement.getChildNodes();
+        Map<String, Node> keyNodes = new HashMap<String, Node>();
+        for (int i = 0; i < children.getLength(); i++) {
+            Node child = children.item(i);
+            if (child.getNodeType() != Node.ELEMENT_NODE) {
+                continue;
+            }
+            String nodeName = child.getNodeName();
+            keyNodes.put(nodeName, child);
+        }
+        //build consumers
+        consumersManager = buildConsumersManager(keyNodes.get("consumers"), runtimeAttributes, queue);
+
+        //build crawler
+        crawler = buildCrawler(queue, keyNodes.get("crawler"), runtimeAttributes);
+
+        reporter = buildReporter(crawler, consumersManager, keyNodes.get("reporter"), runtimeAttributes);
+
+        interrupter = buildInterrupter(keyNodes.get("interrupter"), runtimeAttributes);
+
+        BatchProcess proc = new BatchProcess(
+                crawler, consumersManager, reporter, interrupter, maxStaleConsumers);
+
+        if (staleThresholdMillis > -1) {
+            proc.setStaleThresholdMillis(staleThresholdMillis);
+        }
+
+        if (pauseOnEarlyTerminationMillis > -1) {
+            proc.setPauseOnEarlyTerminationMillis(pauseOnEarlyTerminationMillis);
+        }
+
+        if (staleCheckPulseMillis > -1) {
+            proc.setStaleCheckPulseMillis(staleCheckPulseMillis);
+        }
+        proc.setMaxAliveTimeSeconds(maxAliveTimeSeconds);
+        return proc;
+    }
+
+    private IInterrupter buildInterrupter(Node node, Map<String, String> runtimeAttributes) {
+        Map<String, String> attrs = XMLDOMUtil.mapifyAttrs(node, runtimeAttributes);
+        String className = attrs.get("builderClass");
+        if (className == null) {
+            throw new RuntimeException("Need to specify class name in interrupter element");
+        }
+        IInterupterBuilder builder = ClassLoaderUtil.buildClass(IInterupterBuilder.class, className);
+
+        return builder.build(node, runtimeAttributes);
+
+    }
+
+    private IStatusReporter buildReporter(FileResourceCrawler crawler, ConsumersManager consumersManager,
+                                          Node node, Map<String, String> runtimeAttributes) {
+
+        Map<String, String> attrs = XMLDOMUtil.mapifyAttrs(node, runtimeAttributes);
+        String className = attrs.get("builderClass");
+        if (className == null) {
+            throw new RuntimeException("Need to specify class name in reporter element");
+        }
+        StatusReporterBuilder builder = ClassLoaderUtil.buildClass(StatusReporterBuilder.class, className);
+
+        return builder.build(crawler, consumersManager, node, runtimeAttributes);
+
+    }
+
+    /**
+     * numConsumers is needed by both the crawler and the consumers. This utility method
+     * is to be used to extract the number of consumers from a map of String key value pairs.
+     * @param attrs
+     * @return
+     */
+    public static int getNumConsumers(Map<String, String> attrs) {
+        String nString = attrs.get(BatchProcessBuilder.NUM_CONSUMERS_KEY);
+        if (nString == null || nString.equals("default")) {
+            return AbstractConsumersBuilder.getDefaultNumConsumers();
+        }
+        int n = -1;
+        try {
+            n = Integer.parseInt(nString);
+        } catch (NumberFormatException e) {
+            //swallow
+        }
+        if (n < 1) {
+            n = AbstractConsumersBuilder.getDefaultNumConsumers();
+        }
+        return n;
+    }
+
+    private Map<String, String> setNumConsumersInRuntimeAttributes(Node docElement, Map<String, String> incomingRuntimeAttributes) {
+        Map<String, String> runtimeAttributes = new HashMap<String, String>();
+
+        for(Map.Entry<String, String> e : incomingRuntimeAttributes.entrySet()) {
+            runtimeAttributes.put(e.getKey(), e.getValue());
+        }
+
+        //if this is set at runtime use that value
+        if (runtimeAttributes.containsKey(NUM_CONSUMERS_KEY)){
+            return Collections.unmodifiableMap(runtimeAttributes);
+        }
+        Node ncNode = docElement.getAttributes().getNamedItem("numConsumers");
+        int numConsumers = -1;
+        String numConsumersString = ncNode.getNodeValue();
+        try {
+            numConsumers = Integer.parseInt(numConsumersString);
+        } catch (NumberFormatException e) {
+            //swallow and just use numConsumers
+        }
+        //TODO: should we have a max range check?
+        if (numConsumers < 1) {
+            numConsumers = AbstractConsumersBuilder.getDefaultNumConsumers();
+        }
+        runtimeAttributes.put(NUM_CONSUMERS_KEY, Integer.toString(numConsumers));
+        return Collections.unmodifiableMap(runtimeAttributes);
+    }
+
+    //tries to get maxQueueSize from main element
+    private ArrayBlockingQueue<FileResource> buildQueue(Node docElement,
+                                                        Map<String, String> runtimeAttributes) {
+        int maxQueueSize = DEFAULT_MAX_QUEUE_SIZE;
+        String szString = runtimeAttributes.get(MAX_QUEUE_SIZE_KEY);
+
+        if (szString == null) {
+            Node szNode = docElement.getAttributes().getNamedItem(MAX_QUEUE_SIZE_KEY);
+            if (szNode != null) {
+                szString = szNode.getNodeValue();
+            }
+        }
+
+        try {
+            maxQueueSize = Integer.parseInt(szString);
+        } catch (NumberFormatException e) {
+            //swallow
+        }
+
+        if (maxQueueSize < 0) {
+            maxQueueSize = DEFAULT_MAX_QUEUE_SIZE;
+        }
+
+        return new ArrayBlockingQueue<FileResource>(maxQueueSize);
+    }
+
+    private ConsumersManager buildConsumersManager(Node node,
+                Map<String, String> runtimeAttributes, ArrayBlockingQueue<FileResource> queue) {
+
+        Map<String, String> attrs = XMLDOMUtil.mapifyAttrs(node, runtimeAttributes);
+        String className = attrs.get("builderClass");
+        if (className == null) {
+            throw new RuntimeException("Need to specify class name in consumers element");
+        }
+        AbstractConsumersBuilder builder = ClassLoaderUtil.buildClass(AbstractConsumersBuilder.class, className);
+
+        return builder.build(node, runtimeAttributes, queue);
+    }
+
+
+    private FileResourceCrawler buildCrawler(ArrayBlockingQueue<FileResource> queue,
+                                             Node node, Map<String, String> runtimeAttributes) {
+        Map<String, String> attrs = XMLDOMUtil.mapifyAttrs(node, runtimeAttributes);
+        String className = attrs.get("builderClass");
+        if (className == null) {
+            throw new RuntimeException("Need to specify class name in crawler element");
+        }
+
+        ICrawlerBuilder builder = ClassLoaderUtil.buildClass(ICrawlerBuilder.class, className);
+        FileResourceCrawler crawler = builder.build(node, runtimeAttributes, queue);
+
+
+        return crawler;
+    }
+
+
+
+
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/builders/ContentHandlerFactoryBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/builders/ContentHandlerFactoryBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/builders/ContentHandlerFactoryBuilder.java	(revision 0)
@@ -0,0 +1,29 @@
+package org.apache.tika.batch.builders;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.sax.ContentHandlerFactory;
+import org.w3c.dom.Node;
+
+import java.util.Map;
+
+public interface ContentHandlerFactoryBuilder extends ObjectFromDOMBuilder<ContentHandlerFactory> {
+
+  public ContentHandlerFactory build(Node node, Map<String, String> attributes);
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/builders/ReporterBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/builders/ReporterBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/builders/ReporterBuilder.java	(revision 0)
@@ -0,0 +1,30 @@
+package org.apache.tika.batch.builders;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.SimpleLogStatusReporter;
+import org.w3c.dom.Node;
+
+import java.util.Map;
+
+/**
+ * Interface for reporter builders
+ */
+public interface ReporterBuilder extends ObjectFromDOMBuilder<SimpleLogStatusReporter> {
+    public SimpleLogStatusReporter build(Node n, Map<String, String> runtimeAttributes);
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/builders/ObjectFromDOMAndQueueBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/builders/ObjectFromDOMAndQueueBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/builders/ObjectFromDOMAndQueueBuilder.java	(revision 0)
@@ -0,0 +1,20 @@
+package org.apache.tika.batch.builders;
+
+
+import org.apache.tika.batch.FileResource;
+import org.w3c.dom.Node;
+
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+
+/**
+ * Same as {@link org.apache.tika.batch.builders.ObjectFromDOMAndQueueBuilder},
+ * but this is for objects that require access to the common queue.
+ * @param <T>
+ */
+public interface ObjectFromDOMAndQueueBuilder<T> {
+
+    public T build(Node node, Map<String, String> runtimeAttributes,
+                   ArrayBlockingQueue<FileResource> resourceQueue);
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/builders/AbstractConsumersBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/builders/AbstractConsumersBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/builders/AbstractConsumersBuilder.java	(revision 0)
@@ -0,0 +1,38 @@
+package org.apache.tika.batch.builders;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.ConsumersManager;
+import org.apache.tika.batch.FileResource;
+import org.w3c.dom.Node;
+
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+
+public abstract class AbstractConsumersBuilder {
+
+  public static int getDefaultNumConsumers(){
+    int n = Runtime.getRuntime().availableProcessors()-1;
+    return (n < 1) ? 1 : n;
+  }
+
+  public abstract ConsumersManager build(Node node, Map<String, String> runtimeAttributes,
+    ArrayBlockingQueue<FileResource> queue);
+
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/builders/DefaultContentHandlerFactoryBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/builders/DefaultContentHandlerFactoryBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/builders/DefaultContentHandlerFactoryBuilder.java	(revision 0)
@@ -0,0 +1,76 @@
+package org.apache.tika.batch.builders;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.sax.BasicContentHandlerFactory;
+import org.apache.tika.sax.ContentHandlerFactory;
+import org.apache.tika.util.BatchLocalization;
+import org.apache.tika.util.XMLDOMUtil;
+import org.w3c.dom.Node;
+
+import java.util.Map;
+
+/**
+ * Builds BasicContentHandler with type defined by attribute "basicHandlerType"
+ * with possible values: xml, html, text, body, ignore.
+ * Default is text.
+ * <p>
+ * Sets the writeLimit to the value of "writeLimit.
+ * Default is -1;
+ */
+public class DefaultContentHandlerFactoryBuilder implements ContentHandlerFactoryBuilder {
+
+    @Override
+    public ContentHandlerFactory build(Node node, Map<String, String> runtimeAttributes) {
+        Map<String, String> attributes = XMLDOMUtil.mapifyAttrs(node, runtimeAttributes);
+        BasicContentHandlerFactory.HANDLER_TYPE type = null;
+        String handlerTypeString = attributes.get("basicHandlerType");
+        if (handlerTypeString == null) {
+            handlerTypeString = "text";
+        }
+        handlerTypeString = handlerTypeString.toLowerCase(BatchLocalization.getLocale());
+        if (handlerTypeString.equals("xml")) {
+            type = BasicContentHandlerFactory.HANDLER_TYPE.XML;
+        } else if (handlerTypeString.equals("text")) {
+            type = BasicContentHandlerFactory.HANDLER_TYPE.TEXT;
+        } else if (handlerTypeString.equals("txt")) {
+            type = BasicContentHandlerFactory.HANDLER_TYPE.TEXT;
+        } else if (handlerTypeString.equals("html")) {
+            type = BasicContentHandlerFactory.HANDLER_TYPE.HTML;
+        } else if (handlerTypeString.equals("body")) {
+            type = BasicContentHandlerFactory.HANDLER_TYPE.BODY;
+        } else if (handlerTypeString.equals("ignore")) {
+            type = BasicContentHandlerFactory.HANDLER_TYPE.IGNORE;
+        } else {
+            type = BasicContentHandlerFactory.HANDLER_TYPE.TEXT;
+        }
+        int writeLimit = -1;
+        String writeLimitString = attributes.get("writeLimit");
+        if (writeLimitString != null) {
+            try {
+                writeLimit = Integer.parseInt(attributes.get("writeLimit"));
+            } catch (NumberFormatException e) {
+                //swallow and default to -1
+                //TODO: should we throw a RuntimeException?
+            }
+        }
+        return new BasicContentHandlerFactory(type, writeLimit);
+    }
+
+
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/builders/StatusReporterBuilder.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/builders/StatusReporterBuilder.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/builders/StatusReporterBuilder.java	(revision 0)
@@ -0,0 +1,33 @@
+package org.apache.tika.batch.builders;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.tika.batch.ConsumersManager;
+import org.apache.tika.batch.FileResourceConsumer;
+import org.apache.tika.batch.FileResourceCrawler;
+import org.apache.tika.batch.SimpleLogStatusReporter;
+import org.w3c.dom.Node;
+
+import java.util.List;
+import java.util.Map;
+
+public interface StatusReporterBuilder {
+
+    public SimpleLogStatusReporter build(FileResourceCrawler crawler, ConsumersManager consumers,
+                                Node n, Map<String, String> commandlineArguments);
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/CommandLineInterrupter.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/CommandLineInterrupter.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/CommandLineInterrupter.java	(revision 0)
@@ -0,0 +1,51 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+
+/**
+ * Class that waits for input on System.in.  If the user enters a keystroke on 
+ * System.in, this will send a signal to the FileResourceRunner to shutdown gracefully.
+ *
+ */
+public class CommandLineInterrupter implements IInterrupter {
+  
+	public IFileProcessorFutureResult call(){
+		try{
+			BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
+			while (true){
+				if (reader.ready()){
+					String line = reader.readLine();
+					break;
+				} else {
+					Thread.sleep(1000);
+				}
+			}
+		} catch (InterruptedException e){
+		    //canceller was interrupted
+		} catch (IOException e){
+            //TODO: log?
+			//e.printStackTrace();
+		}
+		return new InterrupterFutureResult();
+	}
+}
Index: tika-batch/src/main/java/org/apache/tika/batch/IInterrupter.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/batch/IInterrupter.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/batch/IInterrupter.java	(revision 0)
@@ -0,0 +1,23 @@
+package org.apache.tika.batch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.concurrent.Callable;
+
+public interface IInterrupter extends Callable<IFileProcessorFutureResult> {
+}
Index: tika-batch/src/main/java/org/apache/tika/util/DurationFormatUtils.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/util/DurationFormatUtils.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/util/DurationFormatUtils.java	(revision 0)
@@ -0,0 +1,62 @@
+package org.apache.tika.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Functionality and naming conventions (roughly) copied from org.apache.commons.lang3
+ * so that we didn't have to add another dependency.
+ *
+ */
+public class DurationFormatUtils {
+
+  public static String formatMillis(long duration) {
+      duration = Math.abs(duration);
+      StringBuilder sb = new StringBuilder();
+      int secs = (int) (duration / 1000) % 60 ;
+      int mins = (int) ((duration / (1000*60)) % 60);
+      int hrs   = (int) ((duration / (1000*60*60)) % 24);
+      int days   = (int) ((duration / (1000*60*60*24)) % 7);
+      
+      //sb.append(millis + " milliseconds");
+      addUnitString(sb, days, "day");
+      addUnitString(sb, hrs, "hour");
+      addUnitString(sb, mins, "minute");
+      addUnitString(sb, secs, "second");
+      if (duration < 1000){
+         addUnitString(sb, duration, "millisecond");
+      }
+      
+      return sb.toString();
+   }
+   
+   private static void addUnitString(StringBuilder sb, long unit, String unitString){
+    
+      if (sb.length() > 0){
+         sb.append(", ");
+      }
+      if (unit == 1){
+         sb.append("1 ");
+         sb.append(unitString);
+      } else if (unit > 1){
+         sb.append(unit);
+         sb.append(" ");
+         sb.append(unitString);
+         sb.append("s");
+      }
+   } 
+}
Index: tika-batch/src/main/java/org/apache/tika/util/PropsUtil.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/util/PropsUtil.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/util/PropsUtil.java	(revision 0)
@@ -0,0 +1,87 @@
+package org.apache.tika.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.File;
+
+/**
+ * Utility class to handle properties.  If the value is null,
+ * then the defaultMissing value will be returned.
+ */
+public class PropsUtil {
+
+    public static boolean getBoolean(String v, boolean defaultMissing) {
+        if (v == null || v.length() == 0) {
+            return defaultMissing;
+        }
+        if (v.toLowerCase(BatchLocalization.getLocale()).equals("true")) {
+            return true;
+        }
+        if (v.toLowerCase(BatchLocalization.getLocale()).equals("false")) {
+            return false;
+        }
+        return defaultMissing;
+    }
+
+    public static int getInt(String v, int defaultMissing) {
+        if (v == null || v.length() == 0) {
+            return defaultMissing;
+        }
+        try {
+            return Integer.parseInt(v);
+        } catch (NumberFormatException e) {
+
+        }
+        return defaultMissing;
+    }
+
+    public static long getLong(String v, long defaultMissing) {
+        if (v == null || v.length() == 0) {
+            return defaultMissing;
+        }
+        try {
+            return Long.parseLong(v);
+        } catch (NumberFormatException e) {
+
+        }
+        return defaultMissing;
+    }
+
+
+    public static File getFile(String v, File defaultMissing) {
+        if (v == null || v.length() == 0) {
+            return defaultMissing;
+        }
+        //trim initial and final " if they exist
+        if (v.startsWith("\"")) {
+            v = v.substring(1);
+        }
+        if (v.endsWith("\"")) {
+            v = v.substring(0, v.length()-1);
+        }
+
+        return new File(v);
+    }
+
+    public static String getString(String v, String defaultMissing) {
+        if (v == null) {
+            return defaultMissing;
+        }
+        return v;
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/util/ClassLoaderUtil.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/util/ClassLoaderUtil.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/util/ClassLoaderUtil.java	(revision 0)
@@ -0,0 +1,41 @@
+package org.apache.tika.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+public class ClassLoaderUtil {
+
+    @SuppressWarnings("unchecked")
+    public static <T> T buildClass(Class<T> iface, String className) {
+
+        ClassLoader loader = ClassLoader.getSystemClassLoader();
+        Class<?> clazz;
+        try {
+            clazz = loader.loadClass(className);
+            if (iface.isAssignableFrom(clazz)) {
+                return (T) clazz.newInstance();
+            }
+            throw new IllegalArgumentException(iface.toString() + " is not assignable from " + className);
+        } catch (ClassNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (InstantiationException e) {
+            throw new RuntimeException(e);
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/util/BatchLocalization.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/util/BatchLocalization.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/util/BatchLocalization.java	(revision 0)
@@ -0,0 +1,35 @@
+package org.apache.tika.util;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.Locale;
+
+/**
+ * Simple class to handle localization issues.
+ * We should probably push these into TikaConfig and propagate
+ * changes throughout code base.
+ */
+public class BatchLocalization {
+
+    public static Locale getLocale() {
+        return Locale.ENGLISH;
+    }
+
+    public static String getEncoding() {
+        return "UTF-8";
+    }
+}
Index: tika-batch/src/main/java/org/apache/tika/util/XMLDOMUtil.java
===================================================================
--- tika-batch/src/main/java/org/apache/tika/util/XMLDOMUtil.java	(revision 0)
+++ tika-batch/src/main/java/org/apache/tika/util/XMLDOMUtil.java	(revision 0)
@@ -0,0 +1,109 @@
+package org.apache.tika.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class XMLDOMUtil {
+
+    /**
+     * This grabs the attributes from a dom node and overwrites those values with those
+     * specified by the overwrite map.
+     *
+     * @param node
+     * @param overwrite
+     * @return
+     */
+    public static Map<String, String> mapifyAttrs(Node node, Map<String, String> overwrite) {
+        Map<String, String> map = new HashMap<String, String>();
+        NamedNodeMap nnMap = node.getAttributes();
+        for (int i = 0; i < nnMap.getLength(); i++) {
+            Node attr = nnMap.item(i);
+            map.put(attr.getNodeName(), attr.getNodeValue());
+        }
+        if (overwrite != null) {
+            for (Map.Entry<String, String> e : overwrite.entrySet()) {
+                map.put(e.getKey(), e.getValue());
+            }
+        }
+        return map;
+    }
+
+
+    /**
+     * Get an int value.  Try the runtime attributes first and then back off to
+     * the document element.  Throw a RuntimeException if the attribute is not
+     * found or if the value is not parseable as an int.
+     *
+     * @param attrName attribute name to find
+     * @param runtimeAttributes runtime attributes
+     * @param docElement correct element that should have specified attribute
+     * @return specified int value
+     */
+    public static int getInt(String attrName, Map<String, String> runtimeAttributes, Node docElement) {
+        String stringValue = getStringValue(attrName, runtimeAttributes, docElement);
+        if (stringValue != null) {
+            try {
+                return Integer.parseInt(stringValue);
+            } catch (NumberFormatException e) {
+                //swallow
+            }
+        }
+        throw new RuntimeException("Need to specify a parseable int value in -- "
+                +attrName+" -- in commandline or in config file!");
+    }
+
+
+    /**
+     * Get a long value.  Try the runtime attributes first and then back off to
+     * the document element.  Throw a RuntimeException if the attribute is not
+     * found or if the value is not parseable as a long.
+     *
+     * @param attrName attribute name to find
+     * @param runtimeAttributes runtime attributes
+     * @param docElement correct element that should have specified attribute
+     * @return specified long value
+     */
+    public static long getLong(String attrName, Map<String, String> runtimeAttributes, Node docElement) {
+        String stringValue = getStringValue(attrName, runtimeAttributes, docElement);
+        if (stringValue != null) {
+            try {
+                return Long.parseLong(stringValue);
+            } catch (NumberFormatException e) {
+                //swallow
+            }
+        }
+        throw new RuntimeException("Need to specify a \"long\" value in -- "
+                +attrName+" -- in commandline or in config file!");
+    }
+
+    private static String getStringValue(String attrName, Map<String, String> runtimeAttributes, Node docElement) {
+        String stringValue = runtimeAttributes.get(attrName);
+        if (stringValue == null) {
+            Node staleNode = docElement.getAttributes().getNamedItem(attrName);
+            if (staleNode != null) {
+                stringValue = staleNode.getNodeValue();
+            }
+        }
+        return stringValue;
+    }
+}
Index: tika-batch/src/main/resources/tika-batch-config.xml
===================================================================
--- tika-batch/src/main/resources/tika-batch-config.xml	(revision 0)
+++ tika-batch/src/main/resources/tika-batch-config.xml	(revision 0)
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+
+<tika-batch-config staleThresholdMillis="300000" maxQueueSize="10000" numConsumers="5">
+
+	<crawler class="org.apache.tika.batch.fs.builders.FSCrawlerBuilder"
+		randomCrawl="true" 
+		maxFilesToAdd="-1" 
+		maxFilesToConsider="-1" 
+		includeFilePat="(?i).pdf$"
+		excludeFilePat="(?i).msg$"
+		maxFileSizeBytes="-1"
+        srcDir="input"
+        />
+<!--
+    This is an example of a crawler that reads a list of files to be processed from a
+    file.  This assumes that the files in the list are relative to srcDir.
+    <crawler class="org.apache.tika.batch.fs.builders.FSCrawlerBuilder"
+             fileList="files.txt"
+             fileListEncoding="UTF-8"
+             maxFilesToAdd="-1"
+             maxFilesToConsider="-1"
+             includeFilePat="(?i).pdf$"
+             excludeFilePat="(?i).msg$"
+             maxFileSizeBytes="-1"
+             srcDir="input"
+    />
+-->
+	<consumers class="org.apache.tika.batch.fs.builders.BasicTikaFSConsumersBuilder">
+		<parser class="AutoDetectParserFactory" parseRecursively="true"/>
+		<contenthandler class="org.apache.tika.batch.builders.DefaultContentHandlerFactoryBuilder"
+                        basicHandlerType="xml" writeLimit="-1"/>
+		
+		<!-- overwritePolicy: "skip" a file if target file exists, "rename" a target file, "overwrite" -->
+		<outputstream class="FSOutputStreamFactory" overwritePolicy="rename" targDir="output"
+                encoding="UTF-8"/>
+	</consumers>
+	
+	<!-- reporter and interrupter are optional -->
+	<reporter class="StdOutStatusReporterFactory"/>
+	<interrupter class="Interrupter"/>
+</tika-batch-config>
\ No newline at end of file
Index: tika-batch/pom.xml
===================================================================
--- tika-batch/pom.xml	(revision 0)
+++ tika-batch/pom.xml	(revision 0)
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+    <properties>
+        <cli.version>1.2</cli.version> <!--sync version with tika-server or move to parent? -->
+    </properties>
+
+    <parent>
+        <groupId>org.apache.tika</groupId>
+        <artifactId>tika-parent</artifactId>
+        <version>1.7-SNAPSHOT</version>
+        <relativePath>../tika-parent/pom.xml</relativePath>
+    </parent>
+
+    <artifactId>tika-batch</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Tika batch</name>
+    <url>http://tika.apache.org/</url>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-parsers</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-serialization</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-xmp</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <version>1.5.6</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>1.7.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-cli</groupId>
+            <artifactId>commons-cli</artifactId>
+            <version>${cli.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tika</groupId>
+            <artifactId>tika-parsers</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <scope>test</scope>
+            <version>2.1</version>
+        </dependency>
+
+
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-DocURL>${project.url}</Bundle-DocURL>
+                        <Bundle-Activator>
+                            org.apache.tika.config.TikaActivator
+                        </Bundle-Activator>
+                        <Bundle-ActivationPolicy>lazy</Bundle-ActivationPolicy>
+                    </instructions>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>src/test/resources/org/apache/tika/**</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>test-jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-failsafe-plugin</artifactId>
+                <version>2.10</version>
+                <configuration>
+                    <additionalClasspathElements>
+                        <additionalClasspathElement>
+                            ${project.build.directory}/${project.build.finalName}.jar
+                        </additionalClasspathElement>
+                    </additionalClasspathElements>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>integration-test</goal>
+                            <goal>verify</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+
+
+    <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org</url>
+    </organization>
+    <scm>
+        <url>http://svn.apache.org/viewvc/tika/trunk/tika-batch</url>
+        <connection>scm:svn:http://svn.apache.org/repos/asf/tika/trunk/tika-batch</connection>
+        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/tika/trunk/tika-batch</developerConnection>
+    </scm>
+    <issueManagement>
+        <system>JIRA</system>
+        <url>https://issues.apache.org/jira/browse/TIKA</url>
+    </issueManagement>
+    <ciManagement>
+        <system>Jenkins</system>
+        <url>https://builds.apache.org/job/Tika-trunk/</url>
+    </ciManagement>
+
+
+</project>
\ No newline at end of file
