   =========================================================================
   ==      NOTICE file for use with the Apache License, Version 2.0,      ==
   =========================================================================
   
   Apache JAMES Mime4j
   Copyright 2004-2009 The Apache Software Foundation
   
   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).
   
   This product may include/use software, JUnit (http://www.junit.org/),
   developed by Kent Beck, Erich Gamma, and David Saff
   License: Common Public License Version 1.0
   (http://www.opensource.org/licenses/cpl.php)
