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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>Continuum</title>

  <link rel="stylesheet" type="text/css" href="continuum_files/tigris.css" media="screen">
  <link rel="stylesheet" type="text/css" href="continuum_files/print.css" media="print">

  <script src="continuum_files/tigris.js" type="text/javascript"></script></head>

<body onload="focus()" class="composite">

<div id="banner">
  <table border="1" cellpadding="8" cellspacing="0" width="100%">
    <tbody><tr>
      <td>
        <a href="http://www.apache.org/">
          Your company logo here
        </a>
      </td>
      <td>
        <a href="http://maven.apache.org/continuum">
          <img src="continuum_files/continuum_logo_75.gif" alt="Continuum" align="right" border="0">
        </a>
      </td>
    </tr>
    </tbody></table>
</div>

<div id="breadcrumbs">
  <div style="float: right">
    <a href="http://maven.apache.org/continuum">Continuum</a> |
    <a href="http://maven.apache.org/">Maven</a> |
    <a href="http://www.apache.org/">Apache</a>
  </div>

  <div>
    Logged in as: <b>Brett Porter</b> | <a href="userProfile.html">Profile</a> | <a href="login.html">Log out</a>
  </div>
</div>

<table id="main" border="0" cellpadding="4" cellspacing="0" width="100%">
<tbody><tr valign="top">
<td id="leftcol" width="30%">
  <div id="navcolum">
    <div id="projectmenu" class="toolgroup">
      <div class="label">Continuum</div>

      <div class="body">
        <div><a href="index.html">Show Projects</a></div>

        <div><a href="schedule.html">View Build Schedule</a></div>
      </div>
    </div>

    <div id="projecttools" class="toolgroup">
      <div class="label">Add Project</div>

      <div class="body">
        <div><a href="addMaven2Project.html">Maven 2.0+ Project</a></div>

        <div><a href="addMaven1Project.html">Maven 1.x Project</a></div>

        <div><a href="addAntProject.html">Ant Project</a></div>

        <div><a href="addShellProject.html">Shell Project</a></div>
      </div>
    </div>

    <div id="projectimport" class="toolgroup">
      <div class="label">Import Project</div>

      <div class="body">
        <div>
          <a href="addCruiseControlProject.html">CruiseControl</a>
        </div>
      </div>
    </div>

    <div id="admin" class="toolgroup">
      <div class="label">Administration</div>

      <div class="body">
        <div>
          <a href="profiles.html">Profiles</a>
        </div>

        <div>
          <a href="schedules.html">Schedules</a>
        </div>

        <div>
          <a href="configuration.html">Configuration</a>
        </div>

        <div>
          <a href="users.html">Users</a>
        </div>
      </div>
    </div>
  </div>
</td>
<td>
  <div id="bodycol">


    <div class="app">
      <div id="h3">
        <h3>Profiles</h3>
        <table border="1" cellspacing="2" cellpadding="3" width="100%">
          <tr>
            <th>Name</th>
            <th>Type</th>
            <th>Description</th>
            <th width="10%">&nbsp;</th>
          </tr>
          <tr class="b">
            <td><a href="viewProfile.html">Maven 2.0 Default</a></td>
            <td>Maven 2.0</td>
            <td>Default profile for Maven 2.0 projects that uses the M2_HOME and JAVA_HOME environment variables</td>
            <td><a href="editProfile.html">Edit</a> | <a href="#">Delete</a></td>
          </tr>
          <tr class="b" style="color: silver;">
            <td><a href="viewProfile.html">JDK 1.3, Clean checkout</a> <strong>(disabled)</strong></td>
            <td>Maven 2.0</td>
            <td>JDK 1.3</td>
            <td><a href="editProfile.html">Edit</a> | <a href="#">Delete</a></td>
          </tr>
        </table>
        <div class="functnbar3">
          <table>
            <tr>
              <td>
                <form method="post" action="editProfile.html">
                  <select>
                    <option selected="selected">Maven 2.0</option>
                    <option>Maven 1.x</option>
                    <option>Ant</option>
                    <option>Generic</option>
                  </select>
                  <input type="hidden" name="action" value="cam"/>
                  <input type="hidden" name="cid" value="checkoutProject"/>
                  <input type="hidden" name="id" value="43"/>
                  <input type="submit" name="add-build-def" value="Add"/>
                </form>
              </td>
            </tr>
          </table>
        </div>
      </div>
    </div>

  </div>
</td>
</tr>
</tbody></table>

<div id="footer">
  <table border="0" cellpadding="4" cellspacing="0">
    <tbody><tr>
      <td>
        Continuum &#169; 2005 Apache Software Foundation
      </td>
    </tr>
    </tbody></table>
</div>

</body></html>