<%--
  ~ 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.
  --%>

<%@ page contentType="text/html;charset=iso-8859-1" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <jsp:include page="/WEB-INF/include/httpbase.jsp"/>
    <title>Axis2 :: Internal server error</title>
    <link href="axis2-web/css/axis-style.css" rel="stylesheet" type="text/css">
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  </head>

  <body>
    <table summary="header table" style="width: 100%">
      <tr>
        <td align="left"><img src="axis2-web/images/asf-logo.gif" alt="Apache Software Foundation Logo"></td>
        <td align="right"><img src="axis2-web/images/axis_l.jpg" alt="AXIS Logo"></td>
      </tr>
    </table>
    <table summary="main content table" style="width: 100%">
      <tr>
        <td>
          <h1>Internal server error</h1>
          <br>
          <br>
          <br>
          <br>
        </td>
      </tr>
      <tr><td style="align: center"><a href="axis2-web/index.jsp">home</a></td></tr>
    </table>
    <hr>
    <table summary="footer table" style="width: 100%">
      <tr><td>
        <table summary="embedded footer table">
          <tr><td><hr></td></tr>
          <tr>
            <td style="align: center">Copyright &#169; 1999-2021, The Apache Software Foundation<br>Licensed under the <a
              href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</td>
          </tr>
        </table>
      </td>
        <td>&nbsp;</td>
      </tr>
    </table>
  </body>
</html>
