<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 5.5.2655.35">
<TITLE>RE: [jdom-interest] B9-rc1: inputstreams, or readers: Invalidencoding   name &quot;KSC5601&quot;</TITLE>
</HEAD>
<BODY>

<P><FONT SIZE=2>It is amazing how complicated things become when you say exactly the opposite of what you mean.</FONT>
</P>

<P><FONT SIZE=2>It seems that I have confused things horribly.</FONT>
</P>

<P><FONT SIZE=2>Using a file INPUTSTREAM it FAILS,</FONT>
<BR><FONT SIZE=2>Using a file READER, it PASSES.</FONT>
</P>

<P><FONT SIZE=2>Rolf</FONT>
</P>

<P><FONT SIZE=2>-----Original Message-----</FONT>
<BR><FONT SIZE=2>From: Jason Hunter [<A HREF="mailto:jhunter@acm.org">mailto:jhunter@acm.org</A>]</FONT>
<BR><FONT SIZE=2>Sent: Friday, April 18, 2003 2:09 PM</FONT>
<BR><FONT SIZE=2>To: Alex Rosen</FONT>
<BR><FONT SIZE=2>Cc: rlear@algorithmics.com; jdom-interest@jdom.org</FONT>
<BR><FONT SIZE=2>Subject: Re: [jdom-interest] B9-rc1: inputstreams, or readers:</FONT>
<BR><FONT SIZE=2>Invalidencoding name &quot;KSC5601&quot;</FONT>
</P>
<BR>

<P><FONT SIZE=2>&nbsp;&nbsp;&nbsp; /**</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; * &lt;p&gt;</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; * This builds a document from the supplied</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; Reader.&nbsp; It's the programmer's responsibility to make sure</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; the reader matches the encoding of the file.&nbsp; It's always safer</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; to use an InputStream rather than a Reader, if it's available.</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; * &lt;/p&gt;</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; *</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; * @param characterStream &lt;code&gt;Reader&lt;/code&gt; to read from.</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; * @return &lt;code&gt;Document&lt;/code&gt; - resultant Document object.</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; * @throws JDOMException when errors occur in parsing.</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; * @throws IOException when an I/O error prevents a document</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from being fully parsed.</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp; */</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp; public Document build(Reader characterStream)</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws JDOMException, IOException {</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return build(new InputSource(characterStream));</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp; }</FONT>
</P>

<P><FONT SIZE=2>-jh-</FONT>
</P>

<P><FONT SIZE=2>Alex Rosen wrote:</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; When you use an InputStream, the parser can read the encoding name from</FONT>
<BR><FONT SIZE=2>&gt; the XML file and set up its own Reader with the right encoding.</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; When you use a Reader, it's your responsibility to set it up. Which</FONT>
<BR><FONT SIZE=2>&gt; would mean in this case that you'd need to read the encoding name out of</FONT>
<BR><FONT SIZE=2>&gt; the file yourself, instead of letting the parser do it for you. So, if</FONT>
<BR><FONT SIZE=2>&gt; at all possible, you should use an InputStream not a Reader. (I could've</FONT>
<BR><FONT SIZE=2>&gt; sworn that the JavaDoc mentioned this but I don't see it.)</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; Alex</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt;&gt;&gt; Rolf Lear &lt;rlear@algorithmics.com&gt; 4/17/2003 9:32:33 AM &gt;&gt;&gt;</FONT>
<BR><FONT SIZE=2>&gt; My point is that the data passes XML SAXBuilder IF it is processed as</FONT>
<BR><FONT SIZE=2>&gt; an</FONT>
<BR><FONT SIZE=2>&gt; Input Stream, but fails as a Reader.</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; The encoding is processed &quot;just fine&quot; when the data is processed as a</FONT>
<BR><FONT SIZE=2>&gt; Reader</FONT>
<BR><FONT SIZE=2>&gt; InputSource, but fails as an InputStream.</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; As I say, I am unsure of where this is a bug, or even IF this is a bug,</FONT>
<BR><FONT SIZE=2>&gt; but</FONT>
<BR><FONT SIZE=2>&gt; it certainly is suspicious.</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; Attached is the Zipped XMLDocument which fails &quot;well-formedness&quot; as a</FONT>
<BR><FONT SIZE=2>&gt; ByteStream, but passes as a Reader.</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; Here is my test code:</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; ==============================</FONT>
<BR><FONT SIZE=2>&gt; import java.io.FileInputStream;</FONT>
<BR><FONT SIZE=2>&gt; import java.io.FileReader;</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; import org.jdom.input.SAXBuilder;</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; public class MainParse {</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new SAXBuilder().build(new FileInputStream(args[0]));</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;PASSED: Processed file as an input</FONT>
<BR><FONT SIZE=2>&gt; stream.&quot;);</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;FAILED: Processed file as an input</FONT>
<BR><FONT SIZE=2>&gt; stream.&quot;);</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new SAXBuilder().build(new FileReader(args[0]));</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;PASSED: Processed file as a Reader.&quot;);</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;FAILED: Processed file as a Reader.&quot;);</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; }</FONT>
<BR><FONT SIZE=2>&gt; ==================================</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; and this is my output from the command:</FONT>
<BR><FONT SIZE=2>&gt; java -cp .:/lib/jaxen-jdom.jar:./lib/jdom.jar:./lib/xerces.jar</FONT>
<BR><FONT SIZE=2>&gt; MainParse</FONT>
<BR><FONT SIZE=2>&gt; mydoc_raw.xml</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; FAILED: Processed file as an input stream.</FONT>
<BR><FONT SIZE=2>&gt; org.jdom.input.JDOMParseException: Error on line 1: Invalid encoding</FONT>
<BR><FONT SIZE=2>&gt; name</FONT>
<BR><FONT SIZE=2>&gt; &quot;KSC5601&quot;.</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.jdom.input.SAXBuilder.build(SAXBuilder.java:381)</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.jdom.input.SAXBuilder.build(SAXBuilder.java:684)</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at MainParse.main(MainParse.java:23)</FONT>
<BR><FONT SIZE=2>&gt; Caused by: org.xml.sax.SAXParseException: Invalid encoding name</FONT>
<BR><FONT SIZE=2>&gt; &quot;KSC5601&quot;.</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown</FONT>
<BR><FONT SIZE=2>&gt; Source)</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.jdom.input.SAXBuilder.build(SAXBuilder.java:370)</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... 2 more</FONT>
<BR><FONT SIZE=2>&gt; Caused by: org.xml.sax.SAXParseException: Invalid encoding name</FONT>
<BR><FONT SIZE=2>&gt; &quot;KSC5601&quot;.</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown</FONT>
<BR><FONT SIZE=2>&gt; Source)</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.jdom.input.SAXBuilder.build(SAXBuilder.java:370)</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.jdom.input.SAXBuilder.build(SAXBuilder.java:684)</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at MainParse.main(MainParse.java:23)</FONT>
<BR><FONT SIZE=2>&gt; Caused by: org.xml.sax.SAXParseException: Invalid encoding name</FONT>
<BR><FONT SIZE=2>&gt; &quot;KSC5601&quot;.</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown</FONT>
<BR><FONT SIZE=2>&gt; Source)</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.jdom.input.SAXBuilder.build(SAXBuilder.java:370)</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.jdom.input.SAXBuilder.build(SAXBuilder.java:684)</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at MainParse.main(MainParse.java:23)</FONT>
<BR><FONT SIZE=2>&gt; PASSED: Processed file as an input stream.</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; Rolf</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; -----Original Message-----</FONT>
<BR><FONT SIZE=2>&gt; From: Jason Hunter [<A HREF="mailto:jhunter@acm.org">mailto:jhunter@acm.org</A>]</FONT>
<BR><FONT SIZE=2>&gt; Sent: Wednesday, April 16, 2003 6:48 PM</FONT>
<BR><FONT SIZE=2>&gt; To: Rolf Lear</FONT>
<BR><FONT SIZE=2>&gt; Cc: Jdom-Interest (E-mail)</FONT>
<BR><FONT SIZE=2>&gt; Subject: Re: [jdom-interest] B9-rc1: inputstreams, or readers: Invalid</FONT>
<BR><FONT SIZE=2>&gt; encoding name &quot;KSC5601&quot;</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; It may be that the encoding name isn't known to XML but may be known</FONT>
<BR><FONT SIZE=2>&gt; to</FONT>
<BR><FONT SIZE=2>&gt; Java.&nbsp; There's a Xerces feature to tell it to respect Java names for</FONT>
<BR><FONT SIZE=2>&gt; encodings.&nbsp; Try that.</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; -jh-</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; Rolf Lear wrote:</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; I have been trying to find/fix performance issues in JDom, and was</FONT>
<BR><FONT SIZE=2>&gt; &gt; playing around with the Verifier.</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; To test the effect of changes to the Verifier, I first load an XML</FONT>
<BR><FONT SIZE=2>&gt; &gt; Document in to memory, then parse it using SAXbuilder.build.</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; To test wierd XML, I found this:</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; <A HREF="http://ropas.kaist.ac.kr/viewcvs/viewcvs.cgi/*checkout*/n/nXml/testdata/docu" TARGET="_blank">http://ropas.kaist.ac.kr/viewcvs/viewcvs.cgi/*checkout*/n/nXml/testdata/docu</A></FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; ment/mydoc_raw.xml?rev=HEAD&amp;content-type=text/xml</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; which is partially Korean.</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; First, remove the Doctype declaration in the document.</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; My program does the following (See the code at the end).</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; It loads the file up as an array of bytes.</FONT>
<BR><FONT SIZE=2>&gt; &gt; It loads the file up as an array of Char.</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; It parses each through SAXBuilder.build using an inputstream on the</FONT>
<BR><FONT SIZE=2>&gt; &gt; bytes, and a reader on the chars.</FONT>
<BR><FONT SIZE=2>&gt; &gt; InputSource source = new InputSource(new</FONT>
<BR><FONT SIZE=2>&gt; &gt; ByteArrayInputStream(bytedata));</FONT>
<BR><FONT SIZE=2>&gt; &gt; and</FONT>
<BR><FONT SIZE=2>&gt; &gt; InputSource source = new InputSource(new CharArrayReader(chardata));</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; Now, parsing the Reader passes, and the InputStream fails with:</FONT>
<BR><FONT SIZE=2>&gt; &gt; Invalid encoding name &quot;KSC5601&quot; (in Xerces).</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; org.jdom.input.JDOMParseException: Error on line 1: Invalid encoding</FONT>
<BR><FONT SIZE=2>&gt; &gt; name &quot;KSC5601&quot;.</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.jdom.input.SAXBuilder.build(SAXBuilder.java:381)</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at MainTest.main(MainTest.java:77)</FONT>
<BR><FONT SIZE=2>&gt; &gt; Caused by: org.xml.sax.SAXParseException: Invalid encoding name</FONT>
<BR><FONT SIZE=2>&gt; &gt; &quot;KSC5601&quot;.</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown</FONT>
<BR><FONT SIZE=2>&gt; &gt; Source)</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.jdom.input.SAXBuilder.build(SAXBuilder.java:370)</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... 1 more</FONT>
<BR><FONT SIZE=2>&gt; &gt; Caused by: org.xml.sax.SAXParseException: Invalid encoding name</FONT>
<BR><FONT SIZE=2>&gt; &gt; &quot;KSC5601&quot;.</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown</FONT>
<BR><FONT SIZE=2>&gt; &gt; Source)</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.jdom.input.SAXBuilder.build(SAXBuilder.java:370)</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at MainTest.main(MainTest.java:77)</FONT>
<BR><FONT SIZE=2>&gt; &gt; Caused by: org.xml.sax.SAXParseException: Invalid encoding name</FONT>
<BR><FONT SIZE=2>&gt; &gt; &quot;KSC5601&quot;.</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown</FONT>
<BR><FONT SIZE=2>&gt; &gt; Source)</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.jdom.input.SAXBuilder.build(SAXBuilder.java:370)</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at MainTest.main(MainTest.java:77)</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; Now I am the first to admit that my Unicode,charset knowledge is</FONT>
<BR><FONT SIZE=2>&gt; &gt; really flakey, so any suggestions as to whether this is a bug in my</FONT>
<BR><FONT SIZE=2>&gt; &gt; code, JDOM, or Xerces is welcome.</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; Rolf</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; ======================================================</FONT>
<BR><FONT SIZE=2>&gt; &gt; /*package default.*/</FONT>
<BR><FONT SIZE=2>&gt; &gt; import java.io.ByteArrayInputStream;</FONT>
<BR><FONT SIZE=2>&gt; &gt; import java.io.CharArrayReader;</FONT>
<BR><FONT SIZE=2>&gt; &gt; import java.io.File;</FONT>
<BR><FONT SIZE=2>&gt; &gt; import java.io.FileInputStream;</FONT>
<BR><FONT SIZE=2>&gt; &gt; import java.io.FileReader;</FONT>
<BR><FONT SIZE=2>&gt; &gt; import java.io.IOException;</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; import org.jdom.JDOMException;</FONT>
<BR><FONT SIZE=2>&gt; &gt; import org.jdom.input.SAXBuilder;</FONT>
<BR><FONT SIZE=2>&gt; &gt; import org.xml.sax.InputSource;</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; public class MainTest {</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; private static byte[] loadedFileBytes(String filename) throws</FONT>
<BR><FONT SIZE=2>&gt; &gt; IOException {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File file = new File(filename);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] buffer = new byte[(int)file.length()];</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream fis = new FileInputStream(file);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int got = 0;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int size = buffer.length;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (got = 0; got &lt; size; ) {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int read = fis.read(buffer, got, size - got);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (read &gt;= 0) {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; got += read;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IOException (&quot;do not expect end of file</FONT>
<BR><FONT SIZE=2>&gt; &gt; before &quot; + size + &quot; bytes, but got it at &quot; + got + &quot; bytes.&quot;);</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fis.read() != -1) {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IOException (&quot;Thought we read to end of file,</FONT>
<BR><FONT SIZE=2>&gt; &gt; but there is still more.....&quot;);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return buffer;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; private static char[] loadedFileChars(String filename) throws</FONT>
<BR><FONT SIZE=2>&gt; &gt; IOException {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File file = new File(filename);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileReader fr = new FileReader(file);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb = new StringBuffer();</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int read = 0;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char[] buffer = new char[1024*4];</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((read = fr.read(buffer)) &gt;= 0) {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(buffer, 0, read);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sb.toString().toCharArray();</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws</FONT>
<BR><FONT SIZE=2>&gt; &gt; ClassNotFoundException, IOException {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long start = System.currentTimeMillis();</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName(&quot;org.jdom.Verifier&quot;).getDeclaredMethods();</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long load = System.currentTimeMillis() - start;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;Loaded Verifier Class: &quot; + load +</FONT>
<BR><FONT SIZE=2>&gt; &quot;ms.&quot;);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iterations = new Integer(args[0]).intValue();</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXBuilder builder = new SAXBuilder(false);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 1; i &lt; args.length; i++) {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start = System.currentTimeMillis();</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] bytedata = loadedFileBytes(args[i]);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char[] chardata = loadedFileChars(args[i]);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; load = System.currentTimeMillis() - start;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;Loaded Data in File '&quot; + args[i] +</FONT>
<BR><FONT SIZE=2>&gt; &quot;'</FONT>
<BR><FONT SIZE=2>&gt; &gt; in &quot; + load + &quot;ms. &quot; + (bytedata.length / 1024) + &quot;KB. &quot; +</FONT>
<BR><FONT SIZE=2>&gt; &gt; (chardata.length / 1024) + &quot; KChars About to SAXBuild&quot;);</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; iterations; j++) {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputSource source = new InputSource(new</FONT>
<BR><FONT SIZE=2>&gt; &gt; ByteArrayInputStream(bytedata));</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start = System.currentTimeMillis();</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; builder.build(source);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; load = System.currentTimeMillis() - start;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;SAXBuilder built document '&quot;</FONT>
<BR><FONT SIZE=2>&gt; +</FONT>
<BR><FONT SIZE=2>&gt; &gt; args[i] + &quot;' (BYTES) iteration &quot; + j + &quot; in &quot; + load + &quot;ms.&quot;);</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (JDOMException e) {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException ioe) {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioe.printStackTrace();</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; iterations; j++) {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputSource source = new InputSource(new</FONT>
<BR><FONT SIZE=2>&gt; &gt; CharArrayReader(chardata));</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start = System.currentTimeMillis();</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; builder.build(source);</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; load = System.currentTimeMillis() - start;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;SAXBuilder built document '&quot;</FONT>
<BR><FONT SIZE=2>&gt; +</FONT>
<BR><FONT SIZE=2>&gt; &gt; args[i] + &quot;' (CHARS) iteration &quot; + j + &quot; in &quot; + load + &quot;ms.&quot;);</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (JDOMException e) {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException ioe) {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioe.printStackTrace();</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt; }</FONT>
<BR><FONT SIZE=2>&gt; &gt;</FONT>
<BR><FONT SIZE=2>&gt; ============================================================================</FONT>
<BR><FONT SIZE=2>&gt; =======</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; _______________________________________________</FONT>
<BR><FONT SIZE=2>&gt; To control your jdom-interest membership:</FONT>
<BR><FONT SIZE=2>&gt; <A HREF="http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@yourhost.com" TARGET="_blank">http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@yourhost.com</A></FONT>
</P>

</BODY>
</HTML>