<!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.
  -->
<!-- Brooklyn SHA-1: GIT_SHA_1 -->
<html>
<head>
    <meta charset="UTF-8">
    <title>Brooklyn API Docs</title>
    <link rel="icon" type="image/x-icon" href="/favicon.ico" sizes="16x16"/>
    <link href='../swagger-ui/css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
    <link href='../swagger-ui/css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
    <link href='../swagger-ui/css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
    <link href='../swagger-ui/css/reset.css' media='print' rel='stylesheet' type='text/css'/>
    <link href='../swagger-ui/css/print.css' media='print' rel='stylesheet' type='text/css'/>
    <link href='../swagger-ui/css/style.css' media='print' rel='stylesheet' type='text/css'/>
    <link rel="stylesheet" href="../css/styles.css">
    <link rel="stylesheet" href="../css/brooklyn.css">

    <script src='../swagger-ui/lib/jquery-1.8.0.min.js' type='text/javascript'></script>
    <script src='../swagger-ui/lib/jquery.wiggle.min.js' type='text/javascript'></script>
    <script src='../swagger-ui/lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
    <script src='../swagger-ui/lib/handlebars-2.0.0.js' type='text/javascript'></script>
    <script src='../swagger-ui/lib/underscore-min.js' type='text/javascript'></script>
    <script src='../swagger-ui/lib/backbone-min.js' type='text/javascript'></script>
    <script src='../swagger-ui/lib/swagger-ui.min.js' type='text/javascript'></script>
    <script src='../swagger-ui/lib/marked.js' type='text/javascript'></script>
    <script src='../js/libs/require.js' type='text/javascript'></script>
    <script src='../js/libs/bootstrap.js' type='text/javascript'></script>

    <script type="text/javascript">
        $(function () {
            window.swaggerUi = new SwaggerUi({
                url: "/v1/apidoc/swagger.json",
                dom_id: "swagger-ui-container",
                supportHeaderParams: false,
                supportedSubmitMethods: ['get', 'post', 'put', 'delete'],
                onComplete: function (swaggerApi, swaggerUi) {
                    log("Brooklyn swagger api doc loaded");
                    // add CSRF token as header
                    var ca = document.cookie.split(';');
                    for (var i=0; i<ca.length; i++) {
                        var c = ca[i];
                        while (c.charAt(0)==' ') c = c.substring(1);
                        if (c.toLowerCase().indexOf('csrf-token') != -1) {
                            var parts = c.split('=');
                            swaggerApi.clientAuthorizations.add('X-CSRF-TOKEN', new SwaggerClient.ApiKeyAuthorization('X-CSRF-TOKEN', parts[1], 'header'));
                        }
                    }
                },
                onFailure: function (data) {
                    log("Unable to Load SwaggerUI");
                },
                docExpansion: "none",
                apisSorter: "alpha",
                showRequestHeaders: false
            });
            window.swaggerUi.load();

            function log() {
                if ('console' in window) {
                    console.log.apply(console, arguments);
                }
            }
        });
    </script>
    <style>
        #validator {
            display: none;
        }
    </style>
</head>
<body>
<div class="navbar navbar-fixed-top">
    <div class="navbar-inner">
        <div class="userName-top"><span id="user"></span> | <a href="../../logout.html" id="logout-link">Log out</a></div>
        <div class="container">
            <a class="logo" href="#" title="Brooklyn, Version 0.11.0"><!-- Logo added via CSS --></a> <!-- BROOKLYN_VERSION -->
            <div class="menubar-top">
                <ul class="nav">
                    <li><a href="../../#v1/home" class="nav1 nav1_home">Home</a></li>
                    <li><a href="../../#v1/editor/" class="nav1 nav1_editor">Composer</a></li>
                    <li><a href="../../#v1/applications" class="nav1 nav1_apps">Applications</a></li>
                    <li><a href="../../#v1/catalog" class="nav1 nav1_catalog">Catalog</a></li>
                    <li class="dropdown">
                        <a href="#" class="nav1 nav1_script dropdown-toggle active" data-toggle="dropdown">Script</a>
                        <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
                            <li><a href="swagger-ui.html" class="nav1 nav1_apidoc">REST API</a></li>
                            <li><a href="../../#v1/script/groovy" class="nav1 nav1_groovy">Groovy</a></li>
                        </ul>
                    </li>
                    <li><a href="/#v1/help" class="nav1 nav1_help"><b>?</b></a></li>
                </ul>
            </div>
        </div>
    </div>
</div>
<div class="swagger-section">
<div id="message-bar" class="swagger-ui-wrap" data-sw-translate>&nbsp;</div>
<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
</div>
</body>
</html>
