<?php
/**
 * Copyright (c) 2015, 2018 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *   Eric Poirier (Eclipse Foundation)
 *   Christopher Guindon (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */
?>
<div id="maincontent">
  <div id="midcolumn">
    <h1><?php print $pageTitle ?></h1>
    <p>April 5, 2019</p>

    <h3>Terms and Conditions of Use for the Eclipse Foundation Web Site and Related Services</h3>

    <p>As used herein, the term &ldquo;you&rdquo; means the individual accessing this Web site,
    as well as any person or entity which has granted to such individual the authority to enter
    into this agreement on its behalf. By accessing, browsing, or using this Web site,
    you acknowledge that you have read, understand, and agree to be bound by these terms.</p>

    <p>This Web site and related services are made available by the Eclipse Foundation. All software,
    documentation, information and/or other materials provided on and through this Web site
    (&quot;Content&quot;) and all of the related services offered by the Eclipse Foundation may be
    used solely under the following terms and conditions (&quot;Terms of Use&quot;).</p>

    <p>This Web site may contain other proprietary notices and copyright information, the terms of
    which must be observed and followed. The Content on this Web site may contain technical
    inaccuracies or typographical errors and may be changed or updated without notice. The
    Eclipse Foundation may also make improvements and/or changes to the Content at any time
    without notice.</p>

    <p>Neither the Eclipse Foundation nor its members (&quot;Members&quot;) assume any responsibility
    regarding the accuracy of the Content and use of the Content is at the recipient&rsquo;s own risk.
    Neither the Eclipse Foundation nor its Members provide any assurances that any reported problems
    with any Content will be resolved. Except as otherwise expressly stated herein or in another applicable
    license, by providing the Content, neither the Eclipse Foundation nor the Members grant any licenses
    to any copyrights, patents or any other intellectual property rights in the Content.</p>

    <p>The Eclipse Foundation and the Members do not want to receive confidential information from you
    through this Web site and related services. Please note that any information or material sent to The
    Eclipse Foundation or the Members will be deemed NOT to be confidential and will be
    publicly available.</p>

    <p>You are prohibited from posting, transmitting, or storing to or from this Web site or to any
    service offered by the Eclipse Foundation any unlawful, threatening, libelous, defamatory, obscene,
    scandalous, inflammatory, pornographic, or profane material, or any other material that could give
     rise to any civil or criminal liability under the law.</p>

    <p>If you believe that Content residing or accessible on or through this Web site or any UDS
    infringes a copyright, please send a notice of copyright infringement to our designated agent
    pursuant to the procedures set forth here:
    <a href="https://www.eclipse.org/legal/copyright.php">https://www.eclipse.org/legal/copyright.php</a></p>

    <h3>User Data Services (&quot;UDS&quot;)</h3>

    <p>As a service to you, Eclipse.org services or Eclipse software may offer functionality whereby
    you can store or share certain information on Eclipse Foundation&rsquo;s computer systems, so that
    it is accessible to you from various devices that you use. Examples include, but are not limited to,
    Eclipse IoT sandbox servers, the User Storage Service, and the Automated Error Reporting Initiative.
    PLEASE BE AWARE THAT ALL INFORMATION THAT YOU STORE OR SHARE WITH ECLIPSE WILL BE PUBLICLY ACCESSIBLE
    ON THE INTERNET IN UNENCRYPTED FORM AND WITHOUT ANY ACCESS RESTRICTIONS. Do not store or share passwords,
    any personally identifiable information, any confidential business information, or anything else that
    you do not want to be generally and publicly available. By using this functionality, any information
    that you store or share (the &ldquo;Stored Information&rdquo;) will be subject to
    the <a href="https://creativecommons.org/publicdomain/zero/1.0/legalcode">CC0 1.0 Creative Commons</a>
    license, where, for purposes of that license, the Stored Information shall constitute the &ldquo;Work&rdquo;
    and you shall be the &ldquo;Affirmer&rdquo;. What that means is that anybody who accesses your information
    on the Internet has a worldwide, unrestricted, royalty free, irrevocable, perpetual, non-exclusive license
    to use, make, reproduce, prepare derivative works of, publicly display, publicly perform, transmit, sell,
    distribute, sublicense or otherwise transfer the Stored Information without any obligation to you,
    including any obligation of attribution.</p>

    <p>Eclipse reserves the right to discontinue these services at any time or to remove any specific Stored
    Information from owned or controlled computer systems at any time, and Eclipse does not commit to making
    Stored Information available at all times in the future.</p>

    <h3>Licenses</h3>

    <p>Except for Content available through the UDS, and except as otherwise stated herein, the Content
    provided on this Web site is provided under the terms and conditions of the
    <a href="https://www.eclipse.org/legal/epl/notice.php">Eclipse Foundation Software User Agreement</a>
    and those additional terms, conditions and notices referenced therein.</p>

    <p>If Content is licensed to you under the terms and conditions of a version of the Eclipse Public
    License (&quot;<a href="https://www.eclipse.org/legal/epl-2.0">EPL</a>&quot;), with respect to such
    Content, the term &ldquo;Contributions&rdquo; as used herein shall have the meaning provided in the EPL,
    and any such Contributions uploaded, submitted, or otherwise made available by you to the Eclipse Foundation
    and/or the Members and/or users of this Web site shall be governed by the terms and conditions of the EPL
    and can be made available to others under the terms of the EPL.</p>

    <p>If Content is licensed to you under license terms and conditions other than the EPL
    (&quot;Other License&quot;) with respect to such Content the term &ldquo;Contributions &ldquo; as used
    herein shall mean any modifications, enhancements and/or other code and/or documentation related to such
    Content uploaded, submitted, or otherwise made available by you to the Eclipse Foundation and/or the Members
    and/or users of this Web site, and such Contributions shall be subject to and governed by the terms and
    conditions of the Other License. In addition, with regard to such Contributions, you agree to provide the
    Contributions under the terms and conditions of the EPL, provided however that the Eclipse Foundation shall
    have the right to reject any Contributions if the acceptance by the Eclipse Foundation would be in any way
    inconsistent with the Eclipse Foundation&#39;s Intellectual Property Policy.</p>

    <p>In addition to the licenses granted above, you grant a non-exclusive, worldwide, perpetual, royalty-free
    license of all necessary rights under your copyright in and to your Contributions
    (the &ldquo;Specification Grant&rdquo;): (a) for the Eclipse Foundation (and its contributors
    solely as a part of Eclipse Foundation projects) to create, reproduce, prepare derivative works of,
    publicly display, publicly perform, distribute and sublicense specifications subject to the terms of
    the then-current <a href="/legal/efsl.php">Eclipse Foundation Specification License</a>, based on or derived from the Specification
    Content (as defined below) and (b) for recipients of such specifications to create, reproduce, and distribute
    implementations thereof based on the portion of your Contributions or material derived from them in the
    specifications, subject to the terms of the then-current <a href="/legal/efsl.php">Eclipse Foundation Specification License</a>.</p>

    <p>&ldquo;Specification Content&rdquo; is the collection of interface definitions for the application or
    user interfaces (&ldquo;Interfaces&rdquo;) provided by the work to which your Contribution was made,
    descriptions of the structure and semantic behavior of those Interfaces, and data formats and protocols
    associated with those Interfaces, all of which as are reasonably necessary to enable the development of
    independent implementations of those Interfaces. For the sake of clarity, Specification Content does not
    include implementation detail of how the Eclipse project code or your Contribution implements the Interfaces
    in the Specification and the Specification Grant provide above would not cover such additional material.</p>

    <p>To the extent you submit or otherwise make available to an Eclipse Foundation Specification Project
    (as that term is defined by the Intellectual Property Policy) any ideas, concepts, methods or other
    information, you agree that you will not assert, based on such submissions, any intellectual property
    rights that are essential to any implementation of the submission, against the Eclipse Foundation,
    its contributors, or its licensees, with respect to any implementation of such Specification (as that
    term is defined by the Eclipse Foundation Specification Process). To further clarify, such submissions
    include, but are not limited to, submissions made to any public communications channel such as an email
    list, forum, or bug report.</p>

    <p>To the extent you wish to upload, submit, or otherwise make Non-Code Content (as defined below) available
    to the Eclipse Foundation and/or the Members and/or users of this Web site, you may make that material
    available under the terms and conditions of the EPL or any other license stipulated for that purpose at
    <a href="https://www.eclipse.org/legal/">www.eclipse.org/legal</a>. Non-Code Content is Content for which
    you own or control all rights, and which is not program code intended to be submitted to a Project
    (or documentation related to such code) and which is not Stored Information. For example, Non-Code
    Content would include white papers, dissertations, articles or other literary works, power point
    presentations, encyclopedias, anthologies, wikis, blogs, diagrams, drawings, sketches, photos or
    other images, audio content, video content and audiovisual materials.</p>

    <p>For all other software, information and other material including, without limitation, ideas, concepts,
    know-how and techniques, uploaded, submitted or otherwise made available to The Eclipse Foundation, the
    Members, and/or users of this Website, (collectively &quot;Material&quot;), if the paragraphs above are
    inapplicable, and if the Material is not Stored Information, you grant (or warrant that the owner of such
    rights has expressly granted) a license under either the applicable Project License(s) (as that term is
    defined in the Eclipse Intellectual Property Policy), or, if no such Project License(s) is applicable,
    you grant (or warrant that the owner of such rights has expressly granted) the Eclipse Foundation, the
    Members and the users of this Web-site a worldwide, unrestricted, royalty free, fully paid up, irrevocable,
    perpetual, non-exclusive license to use, make, reproduce, prepare derivative works of, publicly display,
    publicly perform, transmit, sell, distribute, sublicense or otherwise transfer such Materials, and/or
    derivative works thereof, and authorize third parties to do any, some or all of the foregoing including,
    but not limited to, sublicensing others to do any some or all of the foregoing indefinitely.</p>

    <p>You represent and warrant that to your knowledge, you have sufficient rights in the Materials
    to grant the foregoing rights and licenses.</p>

    <p>All logos and trademarks contained on this Web site are and remain the property of their
    respective owners. No licenses or other rights in or to such logos and/or trademarks
    are granted to you.</p>

    <p>You can learn more about the
    <a href="https://www.eclipse.org/legal/privacy.php">Eclipse.org privacy practices</a> on the Web.</p>

    <h3>Disclaimers</h3>

    <p>The Eclipse Foundation and the Members make no representations whatsoever about any other Web
    site that you may access through this Web site. When you access a non-Eclipse Foundation Web site,
    even one that may contain the organization&rsquo;s name or mark, please understand that it is
    independent from the Eclipse Foundation, and that the Eclipse Foundation and the Members have no
    control over the content on such Web site. In addition, a link to a non-Eclipse Foundation Web
    site does not mean that the Eclipse Foundation or the Members endorse or accept any responsibility
    for the content, or the use, of such Web site. It is up to you to take precautions to ensure that
    whatever you select for your use is free of such items as viruses, worms, Trojan horses and other
    items of a destructive nature.</p>

    <p>IN NO EVENT WILL THE ECLIPSE FOUNDATION AND/OR THE MEMBERS BE LIABLE TO YOU (AN INDIVIDUAL OR ENTITY)
    OR ANY OTHER INDIVIDUAL OR ENTITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, PUNITIVE, SPECIAL OR CONSEQUENTIAL
    DAMAGES RELATED TO ANY USE OF THIS WEB SITE, THE CONTENT, STORED INFORMATION, OR ANY OTHER HYPER LINKED
    WEB SITE, INCLUDING, WITHOUT LIMITATION, ANY LOST PROFITS, LOST SALES, LOST REVENUE, LOSS OF GOODWILL,
    BUSINESS INTERRUPTION, LOSS OF PROGRAMS OR OTHER DATA ON YOUR OR OUR INFORMATION HANDLING SYSTEMS OR
    OTHERWISE, EVEN IF THE ECLIPSE FOUNDATION OR THE MEMBERS ARE EXPRESSLY ADVISED OR AWARE OF THE POSSIBILITY
    OF SUCH DAMAGES OR LOSSES.</p>

    <p>ALL CONTENT IS PROVIDED BY THE ECLIPSE FOUNDATION AND/OR THE MEMBERS ON AN &quot;AS IS&quot; BASIS ONLY.
    THE ECLIPSE FOUNDATION AND THE MEMBERS PROVIDE NO REPRESENTATIONS, CONDITIONS AND/OR WARRANTIES, EXPRESS OR
    IMPLIED, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE,
    MERCHANTABILITY AND NONINFRINGEMENT. THE ECLIPSE FOUNDATION MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
    SECURITY OF ANY INOFRMATION OR CONTENT STORED WITH THE ECLIPSE FOUNDATION.</p>

    <p>The Eclipse Foundation and the Members reserve the right to investigate complaints or reported violations
    of these Terms of Use and to take any action they deem appropriate including, without limitation, reporting
    any suspected unlawful activity to law enforcement officials, regulators, or other third parties and
    disclosing any information necessary or appropriate to such persons or entities relating to user profiles,
    e-mail addresses, usage history, posted materials, IP addresses and traffic information.</p>

    <p>The Eclipse Foundation and the Members reserve the right to seek all remedies available at law and in
    equity for violations of these Terms of Use, including but not limited to the right to block access
    from a particular Internet address to this Web site.</p>

  </div>
  <div id="rightcolumn">
    <div class="sideitem">
      <h6>Related Links</h6>
      <ul>
        <li><a href="index.php">Legal resources</a></li>
        <li><a href="guidetolegaldoc.php">Guide to legal documents</a></li>
      </ul>
    </div>
  </div>
</div>