# file generated using the following command (open the link in browser for up-to-date version with html links)
# lynx -dump http://www.google.com/intl/en/help/terms_maps_earth.html

  Google Maps/Earth Terms of Service

   By downloading, installing, or using the Google Earth software,
   accessing or using the Google Maps service (together, the "Products" or
   "Services"), or accessing or using any of the content available within
   the Products, you agree to be bound by the following: (1) the [1]Google
   Terms of Service (the "Universal Terms"); (2) the terms found on our
   [2]Legal Notices page (the "Legal Notices"); and (3) the additional
   terms and conditions set forth below (the "Additional Terms"). Before
   you continue, you should read each of these three documents, as
   together they form a binding agreement between you and Google regarding
   your use of the Products. Collectively, the Universal Terms, the Legal
   Notices, and the Additional Terms are referred to as the "Terms".
   As a condition of downloading, accessing, or using the Products, you
   also agree to the terms of the [3]Google Privacy Policy.
   1. Use of the Products. Google grants you a non-exclusive,
   non-transferable license to access the Google Maps service, to download
   and use the Google Earth software and service, and to access the
   Content (as defined below) within the Products and according to the
   Terms.
   2. Restrictions on Use. Unless you have received prior written
   authorization from Google (or, as applicable, from the provider of
   particular Content), you must not:
   (a) access or use the Products or any Content through any technology or
   means other than those provided in the Products, or through other
   explicitly authorized means Google may designate (such as through the
   [4]Google Maps/Google Earth APIs);
   (b) copy, translate, modify, or make derivative works of the Content or
   any part thereof;
   (c) redistribute, sublicense, rent, publish, sell, assign, lease,
   market, transfer, or otherwise make the Products or Content available
   to third parties;
   (d) reverse engineer, decompile or otherwise attempt to extract the
   source code of the Service or any part thereof, unless this is
   expressly permitted or required by applicable law;
   (e) use the Products in a manner that gives you or any other person
   access to mass downloads or bulk feeds of any Content, including but
   not limited to numerical latitude or longitude coordinates, imagery,
   and visible map data;
   (f) delete, obscure, or in any manner alter any warning, notice
   (including but not limited to any copyright or other proprietary rights
   notice), or link that appears in the Products or the Content; or
   (g) use the Service or Content with any products, systems, or
   applications for or in connection with (i) real time navigation or
   route guidance, including but not limited to turn-by-turn route
   guidance that is synchronized to the position of a user's
   sensor-enabled device; or (ii) any systems or functions for automatic
   or autonomous control of vehicle behavior.
   3. Appropriate Conduct; Compliance with Law and Google Policies. You
   agree that you are responsible for your own conduct and content while
   using the Products, and for any consequences thereof. You agree to use
   the Products only for purposes that are legal, proper and in accordance
   with the Terms and any applicable policies or guidelines Google may
   make available. By way of example, and not as a limitation, you agree
   that when using the Products or the Content, you will not:
   (a) defame, abuse, harass, stalk, threaten or otherwise violate the
   legal rights (such as rights of privacy and publicity) of others;
   (b) upload, post, email, transmit or otherwise make available any
   inappropriate, defamatory, obscene, or unlawful content;
   (c) upload, post, transmit or otherwise make available any content that
   infringes any patent, trademark, copyright, trade secret or other
   proprietary right of any party, unless you are the owner of the rights,
   or have the permission of the owner or other legal justification to use
   such content;
   (d) upload, post, email, transmit or otherwise make available messages
   that promote pyramid schemes, chain letters, or disruptive commercial
   messages or advertisements;
   (e) upload, post, email, transmit or otherwise make available any other
   content, message, or communication prohibited by applicable law, the
   Terms or any applicable Product policies or guidelines;
   (f) download any file posted by another that you know, or reasonably
   should know, cannot be legally distributed in such manner;
   (g) impersonate another person or entity, or falsify or delete any
   author attributions or proprietary designations or labels of the origin
   or source of Content, software or other material;
   (h) restrict or inhibit any other user from using and enjoying the
   Products or Google services;
   (i) interfere with or disrupt Google services or servers or networks
   connected to Google services, or disobey any requirements, procedures,
   policies or regulations of networks connected to Google services;
   (j) use any robot, spider, site search/retrieval application, or other
   device to retrieve or index any portion of the Google services or
   Content, or collect information about users for any unauthorized
   purpose;
   (k) submit content that falsely expresses or implies that such content
   is sponsored or endorsed by Google;
   (l) create user accounts by automated means or under false or
   fraudulent pretenses;
   (m) promote or provide instructional information about illegal
   activities;
   (n) promote physical harm or injury against any group or individual; or
   (o) transmit any viruses, worms, defects, Trojan horses, or any items
   of a destructive nature.
   4. Content in the Products. Google Maps and Google Earth allow you to
   access and view a variety of content, including but not limited to
   photographic imagery, map and terrain data, business listings, reviews,
   traffic, and other related information provided by Google, its
   licensors, and its users (the "Content"). Additionally, you may choose
   to access other third party content made available in the Products
   through Google services such as Google Gadgets. You understand and
   agree to the following:
   (a) Map data, traffic, directions, and related Content are provided for
   planning purposes only. You may find that weather conditions,
   construction projects, closures, or other events may cause road
   conditions or directions to differ from the map results. You should
   exercise judgment in your use of this Content.
   (b) By using the Products, you do not receive any, and Google and/or
   its licensors and users retain all ownership rights in the Content. You
   may not use, access or allow others to use or access the Content in any
   manner not permitted under the Terms, unless you have been specifically
   permitted to do so by Google or by the owner of that Content, in a
   separate agreement.
   (c) Certain Content is provided under [5]license from third parties,
   including but not limited to Tele Atlas B.V. ("Tele Atlas"), and is
   subject to copyright and other intellectual property rights owned by or
   licensed to Tele Atlas and/or such third parties. You may be held
   liable for any unauthorized copying or disclosure of this Content. Your
   use of Tele Atlas Content, including but not limited to printing or use
   in marketing or promotional materials, is subject to additional
   restrictions located in the [6]Legal Notices page.
   5. Additional Terms for Google Earth.
   (a) Export Restrictions. The Google Earth software is subject to United
   States export controls. By using the Google Earth software, you agree
   to use the software only for purposes that are legal, proper and in
   accordance with these Terms. Specifically, you agree to comply with all
   applicable export and reexport control laws and regulations, including
   the Export Administration Regulations ("EAR") maintained by the U.S.
   Department of Commerce, and trade and economic sanctions maintained by
   the Treasury Department's Office of Foreign Assets Control.
   (b) Automatic Updates. The Google Earth software may communicate with
   Google servers from time to time to check for available updates to the
   software, such as bug fixes, patches, enhanced functions, missing
   plug-ins and new versions (collectively, "Updates"). By installing the
   Google Earth software, you agree to automatically request and receive
   Updates.
   6. DISCLAIMER OF WARRANTIES AND LIMITATIONS ON LIABILITY.
   (a) GOOGLE AND ITS LICENSORS (INCLUDING BUT NOT LIMITED TO TELE ATLAS
   AND ITS SUPPLIERS) MAKE NO REPRESENTATIONS OR WARRANTIES REGARDING THE
   ACCURACY OR COMPLETENESS OF ANY CONTENT OR THE PRODUCTS.
   (b) SUBJECT TO SECTION 14.1 OF THE GOOGLE UNIVERSAL TERMS, GOOGLE AND
   ITS LICENSORS (INCLUDING BUT NOT LIMITED TO TELE ATLAS AND ITS
   SUPPLIERS) DISCLAIM ALL WARRANTIES IN CONNECTION WITH THE CONTENT AND
   THE PRODUCTS, AND WILL NOT BE LIABLE FOR ANY DAMAGE OR LOSS RESULTING
   FROM YOUR USE OF THE CONTENT OR THE PRODUCTS.
   7. U.S. Government Restricted Rights. If the Products are being used or
   accessed by or on behalf of the United States government, such use is
   subject to additional terms located in the "Government End Users"
   section of our [7]Legal Notices page.

References

   1. http://www.google.com/terms_of_service.html
   2. http://www.google.com/intl/en-us/help/legalnotices_maps.html
   3. http://www.google.com/privacypolicy.html
   4. http://code.google.com/apis/maps/terms.html
   5. http://www.google.com/intl/en-us/help/legalnotices_maps.html
   6. http://www.google.com/intl/en-us/help/legalnotices_maps.html
   7. http://www.google.com/intl/en-us/help/legalnotices_maps.html
