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

<p>The source repository for weinre is maintained at Apache.  See the
archives information on the <a href="Installing.html">Installing</a>
page for more information on downloading a source archive.

<p>If you'd prefer to obtain the source via git, you can use one of the
following repos:

<ul>
<li>Apache repo: <td><a href="https://git-wip-us.apache.org/repos/asf/incubator-cordova-weinre.git">https://git-wip-us.apache.org/repos/asf/incubator-cordova-weinre.git</a>
<li>GitHub repo: <td><a href="https://github.com/apache/incubator-cordova-weinre">https://github.com/apache/incubator-cordova-weinre</a>
</ul>

<p>The Apache repo is the canonical repo. The url can be used in a web
browser, or as the argument of a <tt>git clone</tt> command.

<p>The GitHub repo is a clone of the Apache repo, and automatically shadowed
at some regular interval.  The url is the web view of the repo, from 
which you can obtain a url to use with <tt>git clone</tt>.

<p>See the file 
<tt><a href="https://git-wip-us.apache.org/repos/asf?p=incubator-cordova-weinre.git;a=blob;f=README.md;hb=HEAD">README.md<a/></tt> 
in the top-most directory of the source distribution for more instructions on
how to perform a build.  A <a href="https://github.com/apache/incubator-cordova-weinre/blob/master/README.md">markdown-processed version of the README file
is available on GitHub</a>.
