<!--

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.

-->
<form action="" method="post">
  <h2>Create New Database</h2>
  <fieldset>
    <p class="help">
      Please enter the name of the database. Note that only lowercase
      characters (<tt>a-z</tt>), digits (<tt>0-9</tt>), or any of the
      characters <tt>_</tt>, <tt>$</tt>, <tt>(</tt>, <tt>)</tt>, <tt>+</tt>,
      <tt>-</tt>, and <tt>/</tt> are allowed.
    </p>
    <table summary=""><tbody><tr>
      <th><label>Database Name:</label></th>
      <td><input type="text" name="name" size="24"></td>
    </tr></table>
  </fieldset>
  <div class="buttons">
    <button type="submit">Create</button>
    <button type="button" class="cancel">Cancel</button>
  </div>
</form>
