This license applies to all parts of Dart that are not externally
maintained libraries. The external maintained libraries used by
Dart are:

7-Zip - in third_party/7zip
JSCRE - in runtime/third_party/jscre
Ant - in third_party/apache_ant
args4j - in third_party/args4j
bzip2 - in third_party/bzip2
Commons IO - in third_party/commons-io
Commons Lang in third_party/commons-lang
dromaeo - in samples/third_party/dromaeo
Eclipse - in third_party/eclipse
gsutil - in third_party/gsutil
Guava - in third_party/guava
hamcrest - in third_party/hamcrest
Httplib2 - in samples/third_party/httplib2
JSON - in third_party/json
JUnit - in third_party/junit
NSS - in third_party/nss and third_party/net_nss
Oauth - in samples/third_party/oauth2client
SQLite - in third_party/sqlite
weberknecht - in third_party/weberknecht
zlib - in third_party/zlib
fest - in third_party/fest
mockito - in third_party/mockito

The libraries may have their own licenses; we recommend you read them,
as their terms may differ from the terms below.

Copyright 2012, the Dart project authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.
    * Neither the name of Google Inc. nor the names of its
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
