<?php
/**
 * Copyright (c) 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) - Initial implementation
 *
 * SPDX-License-Identifier: EPL-2.0
 */
?>
<h1><?php print $pageTitle; ?></h1>
<p>Copyright (c) 2018, Eclipse Foundation, Inc. and its licensors.</p>
<p>Redistribution and use in binary form is permitted provided that the following conditions are
  met:</p>
<ol>
  <li>Use of the Technology Compatibility Kit accompanying this license ( the &ldquo;TCK&rdquo;) and
    its documentation is permitted solely for the purpose of testing compatibility of an
    implementation (the &ldquo;Product&rdquo;) of a specification (the &ldquo;Specification&rdquo;)
    made available by the Eclipse Foundation, Inc. (&ldquo;Eclipse&rdquo;).</li>
  <li>Only those modifications expressly permitted by the TCK and its documentation are permitted.
    Except in these limited circumstances, no modifications to the TCK are permitted under this
    license.</li>
  <li>A Product will be deemed to be &ldquo;compatible&rdquo; with the Specification if it fully and
    completely meets and satisfies all requirements of the TCK.&nbsp;</li>
  <li>Before any claim of compatibility (or any similar claim suggesting compatibility) is made
    based on the TCK, the testing party must:
    <ol style="list-style-type: lower-alpha">
      <li>use the TCK to demonstrate that the Product fully and completely meets and satisfies all
        requirements of the TCK;&nbsp;</li>
      <li>make TCK test results showing full and complete satisfaction of all requirements of the
        TCK publicly available on the testing party&rsquo;s website and send a link to such test
        results to Eclipse at <a href="mailto:tck@eclipse.org">tck@eclipse.org;</a> and
      </li>
      <li>comply with any requirements stated in the Specification with regard to subsetting,
        supersetting, modifying or extending the Specification in any Product claimed to be
        compatible with the Specification.</li>
    </ol>
  </li>
  <li>The test results must be continuously available and the link must be live for at least as long
    as the Product is available in the marketplace.</li>
  <li>The TCK may not be used as a basis for any statements of partial compatibility. The TCK may
    only be used as a basis for true, factual statements of full compatibility of Products that
    fully meet and satisfy all requirements of the TCK.&nbsp;</li>
  <li>A determination that a Product is compatible with the TCK does not, in itself, give rise to
    the right to use any name, mark, logo associated with the TCK, Eclipse, or Eclipse&rsquo;s
    contributors or licensors.</li>
  <li>Upon the request of Eclipse, a tester will retract any statements of compatibility (or any
    similar claim suggesting compatibility) which Eclipse reasonably determines to be false or
    misleading or in violation of the terms of this license.</li>
  <li>Redistribution of the TCK must be under this Eclipse Foundation Technology Compatibility Kit
    License and 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.</li>
  <li>Neither the name, trademarks or logos of Eclipse, nor the names, trademarks or logos of its
    contributors or licensors may be used to endorse or promote products tested with this software
    without specific prior written permission.</li>
  <li>The source code for the TCK accompanying this license is available from Eclipse.</li>
</ol>
<p>TO THE EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED ON AN &ldquo;AS IS&rdquo;
  BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
  LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON- INFRINGEMENT, MERCHANTABILITY OR FITNESS
  FOR A PARTICULAR PURPOSE. TO THE EXTENT PERMITTED BY APPLICABLE LAW, NEITHER THE COPYRIGHT OWNER
  OR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE
  EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
