Add live TLS certificate probing and improve restart error handling.

Configure CertificateCheckUrl per container for curl-like TLS checks, classify Sonic permission errors, and extend setup wizard for container management.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-03 13:16:21 +02:00
co-authored by Cursor
parent d20e0df618
commit 58b7826162
1430 changed files with 358394 additions and 71 deletions
@@ -0,0 +1,405 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.5.0_19) on Fri Aug 12 11:25:16 EDT 2011 -->
<TITLE>
XASession (Management Application API)
</TITLE>
<META NAME="keywords" CONTENT="javax.jms.XASession interface">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
parent.document.title="XASession (Management Application API)";
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="XASession.html#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
Sonic Management API</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="XAQueueSession.html" title="interface in javax.jms"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="XATopicConnection.html" title="interface in javax.jms"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../index.html@javax%252Fjms%252FXASession.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="XASession.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="XASession.html#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="XASession.html#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== -->
<H2>
<FONT SIZE="-1">
javax.jms</FONT>
<BR>
Interface XASession</H2>
<DL>
<DT><B>All Superinterfaces:</B> <DD>java.lang.Runnable, <A HREF="Session.html" title="interface in javax.jms">Session</A></DD>
</DL>
<DL>
<DT><B>All Known Subinterfaces:</B> <DD><A HREF="XAQueueSession.html" title="interface in javax.jms">XAQueueSession</A>, <A HREF="XATopicSession.html" title="interface in javax.jms">XATopicSession</A></DD>
</DL>
<HR>
<DL>
<DT><PRE>public interface <B>XASession</B><DT>extends <A HREF="Session.html" title="interface in javax.jms">Session</A></DL>
</PRE>
<P>
The <CODE>XASession</CODE> interface extends the capability of
<CODE>Session</CODE> by adding access to a JMS provider's support for the
Java Transaction API (JTA) (optional). This support takes the form of a
<CODE>javax.transaction.xa.XAResource</CODE> object. The functionality of
this object closely resembles that defined by the standard X/Open XA
Resource interface.
<P>An application server controls the transactional assignment of an
<CODE>XASession</CODE> by obtaining its <CODE>XAResource</CODE>. It uses
the <CODE>XAResource</CODE> to assign the session to a transaction, prepare
and commit work on the transaction, and so on.
<P>An <CODE>XAResource</CODE> provides some fairly sophisticated facilities
for interleaving work on multiple transactions, recovering a list of
transactions in progress, and so on. A JTA aware JMS provider must fully
implement this functionality. This could be done by using the services
of a database that supports XA, or a JMS provider may choose to implement
this functionality from scratch.
<P>A client of the application server is given what it thinks is a
regular JMS <CODE>Session</CODE>. Behind the scenes, the application server
controls the transaction management of the underlying
<CODE>XASession</CODE>.
<P>The <CODE>XASession</CODE> interface is optional. JMS providers
are not required to support this interface. This interface is for
use by JMS providers to support transactional environments.
Client programs are strongly encouraged to use the transactional support
available in their environment, rather than use these XA
interfaces directly.
<P>
<P>
<DL>
<DT><B>See Also:</B><DD><A HREF="Session.html" title="interface in javax.jms"><CODE>Session</CODE></A></DL>
<HR>
<P>
<!-- =========== FIELD SUMMARY =========== -->
<A NAME="field_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Field Summary</B></FONT></TH>
</TR>
</TABLE>
&nbsp;<A NAME="fields_inherited_from_class_javax.jms.Session"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Fields inherited from interface javax.jms.<A HREF="Session.html" title="interface in javax.jms">Session</A></B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><A HREF="Session.html#AUTO_ACKNOWLEDGE">AUTO_ACKNOWLEDGE</A>, <A HREF="Session.html#CLIENT_ACKNOWLEDGE">CLIENT_ACKNOWLEDGE</A>, <A HREF="Session.html#DUPS_OK_ACKNOWLEDGE">DUPS_OK_ACKNOWLEDGE</A>, <A HREF="Session.html#SESSION_TRANSACTED">SESSION_TRANSACTED</A></CODE></TD>
</TR>
</TABLE>
&nbsp;
<!-- ========== METHOD SUMMARY =========== -->
<A NAME="method_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Method Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="XASession.html#commit()">commit</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Throws a <CODE>TransactionInProgressException</CODE>, since it should
not be called for an <CODE>XASession</CODE> object.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="Session.html" title="interface in javax.jms">Session</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="XASession.html#getSession()">getSession</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Gets the session associated with this <CODE>XASession</CODE>.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;boolean</CODE></FONT></TD>
<TD><CODE><B><A HREF="XASession.html#getTransacted()">getTransacted</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Indicates whether the session is in transacted mode.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;javax.transaction.xa.XAResource</CODE></FONT></TD>
<TD><CODE><B><A HREF="XASession.html#getXAResource()">getXAResource</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Returns an XA resource to the caller.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="XASession.html#rollback()">rollback</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Throws a <CODE>TransactionInProgressException</CODE>, since it should
not be called for an <CODE>XASession</CODE> object.</TD>
</TR>
</TABLE>
&nbsp;<A NAME="methods_inherited_from_class_javax.jms.Session"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Methods inherited from interface javax.jms.<A HREF="Session.html" title="interface in javax.jms">Session</A></B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><A HREF="Session.html#close()">close</A>, <A HREF="Session.html#createBrowser(javax.jms.Queue)">createBrowser</A>, <A HREF="Session.html#createBrowser(javax.jms.Queue, java.lang.String)">createBrowser</A>, <A HREF="Session.html#createBytesMessage()">createBytesMessage</A>, <A HREF="Session.html#createConsumer(javax.jms.Destination)">createConsumer</A>, <A HREF="Session.html#createConsumer(javax.jms.Destination, java.lang.String)">createConsumer</A>, <A HREF="Session.html#createConsumer(javax.jms.Destination, java.lang.String, boolean)">createConsumer</A>, <A HREF="Session.html#createDurableSubscriber(javax.jms.Topic, java.lang.String)">createDurableSubscriber</A>, <A HREF="Session.html#createDurableSubscriber(javax.jms.Topic, java.lang.String, java.lang.String, boolean)">createDurableSubscriber</A>, <A HREF="Session.html#createMapMessage()">createMapMessage</A>, <A HREF="Session.html#createMessage()">createMessage</A>, <A HREF="Session.html#createObjectMessage()">createObjectMessage</A>, <A HREF="Session.html#createObjectMessage(java.io.Serializable)">createObjectMessage</A>, <A HREF="Session.html#createProducer(javax.jms.Destination)">createProducer</A>, <A HREF="Session.html#createQueue(java.lang.String)">createQueue</A>, <A HREF="Session.html#createStreamMessage()">createStreamMessage</A>, <A HREF="Session.html#createTemporaryQueue()">createTemporaryQueue</A>, <A HREF="Session.html#createTemporaryTopic()">createTemporaryTopic</A>, <A HREF="Session.html#createTextMessage()">createTextMessage</A>, <A HREF="Session.html#createTextMessage(java.lang.String)">createTextMessage</A>, <A HREF="Session.html#createTopic(java.lang.String)">createTopic</A>, <A HREF="Session.html#getAcknowledgeMode()">getAcknowledgeMode</A>, <A HREF="Session.html#getMessageListener()">getMessageListener</A>, <A HREF="Session.html#recover()">recover</A>, <A HREF="Session.html#run()">run</A>, <A HREF="Session.html#setMessageListener(javax.jms.MessageListener)">setMessageListener</A>, <A HREF="Session.html#unsubscribe(java.lang.String)">unsubscribe</A></CODE></TD>
</TR>
</TABLE>
&nbsp;
<P>
<!-- ============ METHOD DETAIL ========== -->
<A NAME="method_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Method Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="commit()"><!-- --></A><H3>
commit</H3>
<PRE>
void <B>commit</B>()
throws <A HREF="JMSException.html" title="class in javax.jms">JMSException</A></PRE>
<DL>
<DD>Throws a <CODE>TransactionInProgressException</CODE>, since it should
not be called for an <CODE>XASession</CODE> object.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="Session.html#commit()">commit</A></CODE> in interface <CODE><A HREF="Session.html" title="interface in javax.jms">Session</A></CODE></DL>
</DD>
<DD><DL>
<DT><B>Throws:</B>
<DD><CODE><A HREF="TransactionInProgressException.html" title="class in javax.jms">TransactionInProgressException</A></CODE> - if the method is called on
an <CODE>XASession</CODE>.
<DD><CODE><A HREF="JMSException.html" title="class in javax.jms">JMSException</A></CODE> - if the JMS provider fails to commit the
transaction due to some internal error.
<DD><CODE><A HREF="TransactionRolledBackException.html" title="class in javax.jms">TransactionRolledBackException</A></CODE> - if the transaction
is rolled back due to some internal error
during commit.
<DD><CODE><A HREF="IllegalStateException.html" title="class in javax.jms">IllegalStateException</A></CODE> - if the method is not called by a
transacted session.</DL>
</DD>
</DL>
<HR>
<A NAME="getSession()"><!-- --></A><H3>
getSession</H3>
<PRE>
<A HREF="Session.html" title="interface in javax.jms">Session</A> <B>getSession</B>()
throws <A HREF="JMSException.html" title="class in javax.jms">JMSException</A></PRE>
<DL>
<DD>Gets the session associated with this <CODE>XASession</CODE>.
<P>
<DD><DL>
</DL>
</DD>
<DD><DL>
<DT><B>Returns:</B><DD>the session object
<DT><B>Throws:</B>
<DD><CODE><A HREF="JMSException.html" title="class in javax.jms">JMSException</A></CODE> - if an internal error occurs.<DT><B>Since:</B></DT>
<DD>1.1</DD>
</DL>
</DD>
</DL>
<HR>
<A NAME="getTransacted()"><!-- --></A><H3>
getTransacted</H3>
<PRE>
boolean <B>getTransacted</B>()
throws <A HREF="JMSException.html" title="class in javax.jms">JMSException</A></PRE>
<DL>
<DD>Indicates whether the session is in transacted mode.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="Session.html#getTransacted()">getTransacted</A></CODE> in interface <CODE><A HREF="Session.html" title="interface in javax.jms">Session</A></CODE></DL>
</DD>
<DD><DL>
<DT><B>Returns:</B><DD>true
<DT><B>Throws:</B>
<DD><CODE><A HREF="JMSException.html" title="class in javax.jms">JMSException</A></CODE> - if the JMS provider fails to return the
transaction mode due to some internal error.</DL>
</DD>
</DL>
<HR>
<A NAME="getXAResource()"><!-- --></A><H3>
getXAResource</H3>
<PRE>
javax.transaction.xa.XAResource <B>getXAResource</B>()</PRE>
<DL>
<DD>Returns an XA resource to the caller.
<P>
<DD><DL>
</DL>
</DD>
<DD><DL>
<DT><B>Returns:</B><DD>an XA resource to the caller</DL>
</DD>
</DL>
<HR>
<A NAME="rollback()"><!-- --></A><H3>
rollback</H3>
<PRE>
void <B>rollback</B>()
throws <A HREF="JMSException.html" title="class in javax.jms">JMSException</A></PRE>
<DL>
<DD>Throws a <CODE>TransactionInProgressException</CODE>, since it should
not be called for an <CODE>XASession</CODE> object.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="Session.html#rollback()">rollback</A></CODE> in interface <CODE><A HREF="Session.html" title="interface in javax.jms">Session</A></CODE></DL>
</DD>
<DD><DL>
<DT><B>Throws:</B>
<DD><CODE><A HREF="TransactionInProgressException.html" title="class in javax.jms">TransactionInProgressException</A></CODE> - if the method is called on
an <CODE>XASession</CODE>.
<DD><CODE><A HREF="JMSException.html" title="class in javax.jms">JMSException</A></CODE> - if the JMS provider fails to roll back the
transaction due to some internal error.
<DD><CODE><A HREF="IllegalStateException.html" title="class in javax.jms">IllegalStateException</A></CODE> - if the method is not called by a
transacted session.</DL>
</DD>
</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="XASession.html#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
Sonic Management API</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="XAQueueSession.html" title="interface in javax.jms"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="XATopicConnection.html" title="interface in javax.jms"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../index.html@javax%252Fjms%252FXASession.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="XASession.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="XASession.html#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="XASession.html#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
<font size="-1">Copyright &copy; 2001-2011
<a href="http://www.progress.com" target="_top"> Progress Software Corporation</a>. All Rights Reserved.
<br>HTML formatted on 12-Aug-2011.</font>
</BODY>
</HTML>