{% assign current_page_segments = page.dir | split: "/" | where_exp: "element","element != ''" %}
{% assign rel_path_to_root = "" %}
{% for i in (1..current_page_segments.size) %}
  {% assign rel_path_to_root = rel_path_to_root | append: "../" %}
{% endfor %}

<!DOCTYPE html>
<html class="no-js">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">

        <title>{{ page.title }} - Spark {{site.SPARK_VERSION_SHORT}} Documentation</title>
        {% if page.description %}
          <meta name="description" content="{{page.description | replace: 'SPARK_VERSION_SHORT', site.SPARK_VERSION_SHORT}}">
        {% endif %}

        {% if page.redirect %}
          <meta http-equiv="refresh" content="0; url={{page.redirect}}">
          <link rel="canonical" href="{{page.redirect}}" />
        {% endif %}


        <link rel="stylesheet" href="{{ rel_path_to_root }}css/bootstrap.min.css">
        <link rel="preconnect" href="https://fonts.googleapis.com">
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
        <link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&Courier+Prime:wght@400;700&display=swap" rel="stylesheet">
        <link href="{{ rel_path_to_root }}css/custom.css" rel="stylesheet">
        <script src="{{ rel_path_to_root}}js/vendor/modernizr-2.6.1-respond-1.1.0.min.js"></script>

        <link rel="stylesheet" href="{{ rel_path_to_root }}css/pygments-default.css">
        <link rel="stylesheet" href="{{ rel_path_to_root }}css/docsearch.min.css" />
        <link rel="stylesheet" href="{{ rel_path_to_root }}css/docsearch.css">

        {% production %}
        <!-- Matomo -->
        <script>
            var _paq = window._paq = window._paq || [];
            /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
            _paq.push(["disableCookies"]);
            _paq.push(['trackPageView']);
            _paq.push(['enableLinkTracking']);
            (function() {
              var u="https://analytics.apache.org/";
              _paq.push(['setTrackerUrl', u+'matomo.php']);
              _paq.push(['setSiteId', '40']);
              var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
              g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
            })();
        </script>
        <!-- End Matomo Code -->
        {% endproduction %}

    </head>
    <body class="global">
        <!-- This code is taken from http://twitter.github.com/bootstrap/examples/hero.html -->
        <nav class="navbar navbar-expand-lg navbar-dark p-0 px-4 fixed-top" style="background: #1d6890;" id="topbar">
            <div class="navbar-brand"><a href="{{ rel_path_to_root }}index.html">
                <img src="https://spark.apache.org/images/spark-logo-rev.svg" width="141" height="72"/></a><span class="version">{{site.SPARK_VERSION_SHORT}}</span>
            </div>
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse"
                    data-bs-target="#navbarCollapse" aria-controls="navbarCollapse"
                    aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarCollapse">
                <ul class="navbar-nav me-auto">
                    <li class="nav-item"><a href="{{ rel_path_to_root }}index.html" class="nav-link">Overview</a></li>

                    <li class="nav-item dropdown">
                        <a href="#" class="nav-link dropdown-toggle" id="navbarQuickStart" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Programming Guides</a>
                        <div class="dropdown-menu" aria-labelledby="navbarQuickStart">
                            <a class="dropdown-item" href="{{ rel_path_to_root }}quick-start.html">Quick Start</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}rdd-programming-guide.html">RDDs, Accumulators, Broadcasts Vars</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}sql-programming-guide.html">SQL, DataFrames, and Datasets</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}streaming/index.html">Structured Streaming</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}streaming-programming-guide.html">Spark Streaming (DStreams)</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}ml-guide.html">MLlib (Machine Learning)</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}graphx-programming-guide.html">GraphX (Graph Processing)</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}sparkr.html">SparkR (R on Spark)</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}api/python/getting_started/index.html">PySpark (Python on Spark)</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}declarative-pipelines-programming-guide.html">Declarative Pipelines</a>
                        </div>
                    </li>

                    <li class="nav-item dropdown">
                        <a href="#" class="nav-link dropdown-toggle" id="navbarAPIDocs" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">API Docs</a>
                        <div class="dropdown-menu" aria-labelledby="navbarAPIDocs">
                            <a class="dropdown-item" href="{{ rel_path_to_root }}api/python/index.html">Python</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}api/scala/org/apache/spark/index.html">Scala</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}api/java/index.html">Java</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}api/R/index.html">R</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}api/sql/index.html">SQL, Built-in Functions</a>
                        </div>
                    </li>

                    <li class="nav-item dropdown">
                        <a href="#" class="nav-link dropdown-toggle" id="navbarDeploying" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Deploying</a>
                        <div class="dropdown-menu" aria-labelledby="navbarDeploying">
                            <a class="dropdown-item" href="{{ rel_path_to_root }}cluster-overview.html">Overview</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}submitting-applications.html">Submitting Applications</a>
                            <div class="dropdown-divider"></div>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}spark-standalone.html">Spark Standalone</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}running-on-yarn.html">YARN</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}running-on-kubernetes.html">Kubernetes</a>
                        </div>
                    </li>

                    <li class="nav-item dropdown">
                        <a href="#" class="nav-link dropdown-toggle" id="navbarMore" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">More</a>
                        <div class="dropdown-menu" aria-labelledby="navbarMore">
                            <a class="dropdown-item" href="{{ rel_path_to_root }}configuration.html">Configuration</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}monitoring.html">Monitoring</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}tuning.html">Tuning Guide</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}job-scheduling.html">Job Scheduling</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}security.html">Security</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}hardware-provisioning.html">Hardware Provisioning</a>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}migration-guide.html">Migration Guide</a>
                            <div class="dropdown-divider"></div>
                            <a class="dropdown-item" href="{{ rel_path_to_root }}building-spark.html">Building Spark</a>
                            <a class="dropdown-item" href="https://spark.apache.org/contributing.html">Contributing to Spark</a>
                            <a class="dropdown-item" href="https://spark.apache.org/third-party-projects.html">Third Party Projects</a>
                        </div>
                    </li>

                    <li class="nav-item">
                        <input type="text" id="docsearch-input" placeholder="Search the docs…">
                    </li>
                </ul>
                <!--<span class="navbar-text navbar-right"><span class="version-text">v{{site.SPARK_VERSION_SHORT}}</span></span>-->
            </div>
        </nav>

        {% if page.url == "/" %}
            <section class="hero-banner position-relative">
            <div class="container position-relative">
                <div class="row">
                  <h1 style="max-width: 680px;">Apache Spark - A Unified engine for large-scale data analytics</h1>
                </div>
                <div class="content mr-3">
                  Apache Spark is a unified analytics engine for large-scale data processing.
                  It provides high-level APIs in Java, Scala, Python and R,
                  and an optimized engine that supports general execution graphs.
                  It also supports a rich set of higher-level tools including
                  <a href="{{ rel_path_to_root }}sql-programming-guide.html">Spark SQL</a> for SQL and structured data processing,
                  <a href="{{ rel_path_to_root }}api/python/getting_started/quickstart_ps.html">pandas API on Spark</a> for pandas workloads,
                  <a href="{{ rel_path_to_root }}ml-guide.html">MLlib</a> for machine learning,
                  <a href="{{ rel_path_to_root }}graphx-programming-guide.html">GraphX</a> for graph processing,
                   and <a href="{{ rel_path_to_root }}streaming/index.html">Structured Streaming</a>
                   for incremental computation and stream processing.
                </div>
            </div>
          </section>

        {% endif %}

        <div class="container">
            {% if page.url contains "/ml" or page.url contains "/sql" or page.url contains "/streaming/" or page.url contains "migration-guide.html" %}
                {% if page.url contains "migration-guide.html" %}
                    {% include nav-left-wrapper-migration.html nav-migration=site.data.menu-migration %}
                {% elsif page.url contains "/ml" %}
                    {% include nav-left-wrapper-ml.html nav-mllib=site.data.menu-mllib nav-ml=site.data.menu-ml %}
                {% elsif page.url contains "/streaming/" %}
                    {% include nav-left-wrapper-streaming.html nav-streaming=site.data.menu-streaming %}
                {% else %}
                    {% include nav-left-wrapper-sql.html nav-sql=site.data.menu-sql %}
                {% endif %}
                <input id="nav-trigger" class="nav-trigger" checked type="checkbox">
                <label for="nav-trigger"></label>
                <div class="content-with-sidebar mr-3" id="content">
                    {% if page.displayTitle %}
                        <h1 class="title">{{ page.displayTitle }}</h1>
                    {% else %}
                        <h1 class="title">{{ page.title }}</h1>
                    {% endif %}

                    {{ content }}

                </div>
            {% else %}
                <div class="content mr-3" id="content">
                    {% if page.url != "/" %}
                        {% if page.displayTitle %}
                            <h1 class="title">{{ page.displayTitle }}</h1>
                        {% else %}
                            <h1 class="title">{{ page.title }}</h1>
                        {% endif %}
                    {% endif %}
                    {{ content }}
                </div>
            {% endif %}
             <!-- /container -->
        </div>

        <script src="{{ rel_path_to_root }}js/vendor/jquery.min.js"></script>
        <script src="{{ rel_path_to_root }}js/vendor/bootstrap.bundle.min.js"></script>

        <script src="{{ rel_path_to_root }}js/vendor/anchor.min.js"></script>
        <script src="{{ rel_path_to_root}}js/main.js"></script>

        <script type="text/javascript" src="{{ rel_path_to_root }}js/vendor/docsearch.min.js"></script>
        <script type="text/javascript">
            // DocSearch is entirely free and automated. DocSearch is built in two parts:
            // 1. a crawler which we run on our own infrastructure every 24 hours. It follows every link
            //    in your website and extract content from every page it traverses. It then pushes this
            //    content to an Algolia index.
            // 2. a JavaScript snippet to be inserted in your website that will bind this Algolia index
            //    to your search input and display its results in a dropdown UI. If you want to find more
            //    details on how works DocSearch, check the docs of DocSearch.
            {{site.DOCSEARCH_SCRIPT}}
        </script>

        <!-- MathJax Section -->
        <script type="text/x-mathjax-config">
            MathJax.Hub.Config({
                TeX: { equationNumbers: { autoNumber: "AMS" } }
            });
        </script>
        <script>
            // Note that we load MathJax this way to work with local file (file://), HTTP and HTTPS.
            // We could use "//cdn.mathjax...", but that won't support "file://".
            (function(d, script) {
                script = d.createElement('script');
                script.type = 'text/javascript';
                script.async = true;
                script.onload = function(){
                    MathJax.Hub.Config({
                        tex2jax: {
                            inlineMath: [ ["$", "$"], ["\\\\(","\\\\)"] ],
                            displayMath: [ ["$$","$$"], ["\\[", "\\]"] ],
                            processEscapes: true,
                            skipTags: ['script', 'noscript', 'style', 'textarea', 'pre']
                        }
                    });
                };
                script.src = ('https:' == document.location.protocol ? 'https://' : 'http://') +
                    'cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js' +
                    '?config=TeX-AMS-MML_HTMLorMML';
                d.getElementsByTagName('head')[0].appendChild(script);
            }(document));
        </script>
    </body>
</html>
