<!DOCTYPE html>
<!-- Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at .
http://www.apache.org/licenses/LICENSE-2.0 . Unless required by
applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
OR CONDITIONS OF ANY KIND, either express or implied. See the License
for the specific language governing permissions and limitations under
the License. -->
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" id="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=0.5">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    
    <!-- Left empty on purpose!-->
    <title></title>

    <!-- Bootstrap -->
    
    <link href="css/bootstrap.min.css" rel="stylesheet" media="all">
    <link href="css/scaffolding.css" rel="stylesheet" media="all">
    <link href="css/modal.css" rel="stylesheet" media="all">
    <link href="css/spinner.css" rel="stylesheet" media="all">
    <link rel="alternate" href="/api/static.lua"/>
    <link rel="stylesheet" href="//cdn.jsdelivr.net/font-hack/2.013/css/hack.min.css">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
  <body onload="prime_list_index();">
    <div style="text-align: center; margin: 10px auto;">
    <img src="images/logo.png" style="width: 320px;"/><br/>
    <h2>Mail Archives</h2>
    <h4>Pick a list domain to start browsing emails:</h4>
    </div>
    <div id="list_picker" style="margin: 0 auto;">
      
        <ul id="list_picker_ul">
          
        </ul>
    </div>
    <div id="list_index"style="margin: 0 auto;">
        <div id="list_index_child" style="margin: 0 auto; max-width: 400px;">
          
        </div>
      </div>
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>
    <script src="js/config.js"></script>
    <script src="js/wordcloud.js"></script>
    <script src="js/weburl.js"></script>
    <script src="js/d3.min.js"></script>
    <script src="js/ponymail.js"></script>
    <div id="splash" class="splash fade-in"> &nbsp; </div>
    <div style="clear: both;"></div>
    
  </body>
</html>
