You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ea...@apache.org on 2016/02/18 19:04:46 UTC

[01/19] qpid-dispatch git commit: removed 3rd party libraries

Repository: qpid-dispatch
Updated Branches:
  refs/heads/master 4c35796c4 -> 06c2538af


removed 3rd party libraries


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/58143c84
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/58143c84
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/58143c84

Branch: refs/heads/master
Commit: 58143c84e340eca3ea67ea97a4a74b9d6418fc2c
Parents: 4c35796
Author: Ernest Allen <ea...@redhat.com>
Authored: Thu Feb 18 12:58:40 2016 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Thu Feb 18 12:58:40 2016 -0500

----------------------------------------------------------------------
 console/stand-alone/index.html | 125 ++++++++++++++++++++++++++++++++++++
 1 file changed, 125 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/58143c84/console/stand-alone/index.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/index.html b/console/stand-alone/index.html
new file mode 100644
index 0000000..63bf162
--- /dev/null
+++ b/console/stand-alone/index.html
@@ -0,0 +1,125 @@
+<!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>
+
+<head>
+
+    <meta charset="utf-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+    <title>Qpid Dispatch Console</title>
+
+    <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.tipsy/1.0.2/jquery.tipsy.css" type="text/css"/>
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-grid/3.0.7/ui-grid.css" type="text/css"/>
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.fancytree/2.15.0/skin-win8/ui.fancytree.css" type="text/css">
+
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
+
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.min.css">
+
+
+    <link rel="stylesheet" href="plugin/css/site-base.css" type="text/css"/>
+    <link rel="stylesheet" href="plugin/css/plugin.css" type="text/css"/>
+    <link rel="stylesheet" href="plugin/css/qdrTopology.css" type="text/css"/>
+    <link rel="stylesheet" href="https://cdn.rawgit.com/mohsen1/json-formatter/master/dist/json-formatter.min.css" type="text/css"/>
+
+</head>
+
+<body ng-app="QDR">
+
+<div id="core" ng-controller="QDR.Core">
+    <div id="alerts">
+        <uib-alert ng-repeat="alert in alerts" type="{{alert.type}}">{{alert.msg}}</uib-alert>
+    </div>
+    <div id="main-nav" class="navbar navbar-fixed-top" ng-controller="QDR.MainController">
+        <div class="navbar-inner main-nav-lower">
+            <div class="container">
+                <div class="pull-left">
+                    <ul class="nav">
+                        <li ng-repeat="nav in topLevelTabs track by $index"
+                            ng-class="{active : !nav.isActive()}"
+                            ng-show="nav.isValid()">
+                            <a ng-href="{{nav.href}}" title="{{nav.title}}" data-placement="bottom" ng-bind="nav.content">
+                            </a>
+                        </li>
+                    </ul>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div id="main-body" >
+        <div id="main" class="container-fluid ng-cloak qdr">
+            <div>
+                <ul class="nav nav-tabs connected" ng-controller="QDR.NavBarController">
+                    <li ng-repeat="link in breadcrumbs" ng-show="isValid(link)" ng-class='{active : isActive(link.href), "pull-right" : isRight(link), haschart: hasChart(link)}'>
+                        <a ng-href="{{link.href}}{{hash}}" ng-bind-html="link.content | to_trusted"></a>
+                    </li>
+                </ul>
+                <div class="row-fluid">
+                    <div ng-view></div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+    <script src="http://d3js.org/d3.v3.min.js"></script>
+    <script src="http://d3js.org/queue.v1.min.js"></script>
+    <script src="http://d3js.org/topojson.v0.min.js"></script>
+
+    <script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>
+
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
+
+    <script src="https://code.angularjs.org/1.4.8/angular.js"></script>
+    <script src="https://code.angularjs.org/1.4.8/angular-resource.js"></script>
+    <script src="https://code.angularjs.org/1.4.8/angular-route.js"></script>
+    <script src="https://code.angularjs.org/1.4.8/angular-animate.js"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/1.1.0/ui-bootstrap-tpls.min.js"></script>
+    <script src="https://cdn.rawgit.com/jaz303/tipsy/master/src/javascripts/jquery.tipsy.js"></script>
+    <script src="https://cdn.rawgit.com/angular-ui/ui-slider/master/src/slider.js"></script>
+    <script src="https://cdn.rawgit.com/mohsen1/json-formatter/master/dist/json-formatter.min.js"></script>
+
+    <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-grid/3.0.7/ui-grid.js"></script>
+
+    <script type="text/javascript" src="plugin/js/qdrPlugin.js"></script>
+    <script type="text/javascript" src="plugin/js/qdrOverview.js"></script>
+    <script type="text/javascript" src="plugin/js/navbar.js"></script>
+    <script type="text/javascript" src="plugin/js/qdrList.js"></script>
+    <script type="text/javascript" src="plugin/js/qdrCharts.js"></script>
+    <script type="text/javascript" src="plugin/js/qdrSchema.js"></script>
+    <script type="text/javascript" src="plugin/js/qdrService.js"></script>
+    <script type="text/javascript" src="plugin/js/qdrChartService.js"></script>
+    <script type="text/javascript" src="plugin/js/qdrTopology.js"></script>
+    <script type="text/javascript" src="plugin/js/qdrSettings.js"></script>
+
+    <script type="text/javascript" src="plugin/lib/rhea.js"></script>
+
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.fancytree/2.15.0/jquery.fancytree.js" type="text/javascript"></script>
+
+    <script type="text/javascript">
+        angular.element(document.getElementsByTagName('head')).append(angular.element('<base href="' + window.location.pathname + '" />'));
+  </script>
+</body>
+</html>
+


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[08/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/css/site-base.css
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/css/site-base.css b/console/stand-alone/plugin/css/site-base.css
new file mode 100644
index 0000000..23141ec
--- /dev/null
+++ b/console/stand-alone/plugin/css/site-base.css
@@ -0,0 +1,4482 @@
+/*
+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.
+*/
+* {
+  outline: none;
+}
+a:focus {
+  outline: none;
+}
+.navbar .brand {
+  font-size: 18px;
+}
+
+.brand > img {
+  height: 11px;
+  width: auto;
+}
+
+.property-name {
+  white-space: nowrap;
+}
+
+small table tbody tr td.property-name {
+  font-weight: bold;
+  text-align: right;
+}
+
+#log-panel {
+  position: fixed;
+  top: -5px;
+  left: 30px;
+  right: 30px;
+  bottom: 50%;
+  z-index: 10000;
+  background: inherit;
+  transition: bottom 1s ease-in-out;
+}
+
+#log-panel > div {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+
+#log-panel #log-panel-statements {
+  margin-left: 0;
+  margin-bottom: 0;
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 20px;
+  overflow-y: auto;
+}
+
+#log-panel-statements li {
+  margin-left: 3px;
+  margin-right: 3px;
+  transition: background .25s ease-in-out;
+}
+
+#log-panel-statements li pre {
+  border-radius: 0;
+  font-size: 11px;
+}
+
+#log-panel-statements li:hover {
+  background: #111111;
+}
+
+#log-panel-statements li.DEBUG {
+  color: dodgerblue;
+}
+
+#log-panel-statements li.INFO {
+  color: white;
+}
+
+#log-panel-statements li.WARN {
+  color: yellow;
+}
+
+#log-panel-statements li.ERROR {
+  color: red;
+}
+
+#log-panel #close {
+  text-align: center;
+  position: absolute;
+  height: 20px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  box-shadow: 0 1px 13px rgba(0, 0, 0, 0.1) inset;
+  opacity: 1;
+}
+
+#log-panel #copy {
+  position: absolute;
+  right: 23px;
+  bottom: 26px;
+  background: inherit;
+  transition: opacity 1s ease-in-out;
+  opacity: 0.4;
+  cursor: pointer;
+}
+
+#log-panel #copy:hover {
+  opacity: 1;
+}
+
+div.log-stack-trace p {
+  line-height: 14px;
+  margin-bottom: 2px;
+}
+
+#canvas {
+  display: inline-block;
+}
+.fill {
+  min-height: 100%;
+  height: 100%;
+}
+/* sub tab tweaks */
+body div div ul.nav {
+  margin-bottom: 5px;
+  border-bottom: none;
+}
+
+#tree-ctrl {
+  position: relative;
+  top: -3px;
+}
+
+#tree-ctrl > li > a {
+  display: block;
+  padding-left: 5px;
+  padding-right: 5px;
+  /* padding: 5px; */
+}
+
+ul.dynatree-container {
+  background: inherit;
+}
+ul.dynatree-container li {
+  background: inherit;
+}
+/* Chart stuff */
+#charts {
+  display: block;
+  overflow: hidden;
+  margin: 5px auto;
+  position: relative;
+  padding-bottom: 35px;
+}
+.group {
+  margin-bottom: 1em;
+}
+.axis {
+  font: 10px sans-serif;
+  pointer-events: none;
+  z-index: 2;
+}
+.axis.text {
+  -webkit-transition: fill-opacity 250ms linear;
+}
+.axis path {
+  display: none;
+}
+.axis line {
+  stroke: #000;
+  shape-rendering: crispEdges;
+}
+.axis.top {
+  position: relative;
+  top: 0;
+  padding: 0;
+}
+.axis.bottom {
+  position: absolute;
+  bottom: 0px;
+  padding: 0;
+}
+.horizon {
+  overflow: hidden;
+  position: relative;
+}
+.horizon:last-child {
+  border-bottom: none;
+}
+.horizon + .horizon {
+  border-top: none;
+}
+.horizon canvas {
+  display: block;
+}
+.horizon .title,
+.horizon .value {
+  bottom: 0;
+  line-height: 30px;
+  margin: 0 6px;
+  position: absolute;
+  white-space: nowrap;
+}
+.horizon .title {
+  left: 0;
+}
+.horizon .value {
+  right: 0;
+}
+.line {
+  opacity: .2;
+  z-index: 2;
+}
+
+td {
+  padding-right: 20px;
+}
+
+.expandable {
+  padding: 3px;
+}
+
+.expandable > .title {
+  cursor: pointer;
+}
+
+i.expandable-indicator {
+  font-family: FontAwesome;
+  font-weight: normal;
+  font-style: normal;
+  display: inline-block;
+  text-decoration: inherit;
+}
+
+.expandable-body form fieldset legend {
+  font-size: inherit;
+  margin-bottom: 0px;
+}
+
+.expandable.opened i.expandable-indicator:before {
+  font-family: FontAwesome;
+  content: "\f078" !important;
+}
+
+.expandable.closed i.expandable-indicator:before {
+  font-family: FontAwesome;
+  content: "\f054";
+}
+
+.expandable.opened i.expandable-indicator.folder:before {
+  font-family: FontAwesome;
+  content: "\F07C" !important;
+}
+
+.expandable.closed i.expandable-indicator.folder:before {
+  font-family: FontAwesome;
+  content: "\F07B";
+}
+
+.expandable.opened .expandable-body {
+  display: inline-block;
+  margin-bottom: 3px;
+}
+
+.expandable.closed .expandable-body {
+  display: none;
+}
+
+span.dynatree-icon {
+  position: relative;
+  top: -2px;
+  font-size: 17px;
+}
+
+span:not(.dynatree-has-children) .dynatree-icon:before {
+  font-family: FontAwesome;
+  content: "\f013";
+}
+
+ul.inline,
+ol.inline {
+  margin-left: 0;
+  list-style: none;
+}
+
+ul.inline > li,
+ol.inline > li {
+  display: inline-block;
+  padding-right: 2px;
+  padding-left: 2px;
+}
+
+.tab {
+  display: block;
+  margin-left: 1em;
+}
+
+.red {
+  color: red !important;
+}
+
+.orange {
+  color: orange !important;
+}
+
+.yellow {
+  color: yellow !important;
+}
+
+.green {
+  color: green !important;
+}
+
+.background-green {
+  color: white;
+  background-color: #51a351;
+}
+
+.background-light-green {
+  color: white;
+  background-color: #5ab15a;
+}
+
+.blue {
+  color: dodgerblue !important;
+}
+
+.background-blue {
+  color: white;
+  background-color: #006dcc;
+}
+
+.icon1point5x {
+  font-size: 1.5em;
+}
+
+.centered,
+.align-center {
+  margin-left: auto !important;
+  margin-right: auto !important;
+  text-align: center;
+}
+
+.align-right {
+  text-align: right;
+}
+
+.align-left {
+  text-align: left;
+}
+
+.inline {
+  display: inline;
+}
+
+.inline-block,
+.list-row-select,
+.list-row-contents,
+.list-row-contents > .ngCellText {
+  display: inline-block;
+}
+
+.list-row {
+  height: 30px;
+  white-space: nowrap;
+}
+
+.list-row .ngCellText {
+  padding: 0;
+  vertical-align: middle;
+}
+
+.list-row-select,
+.list-row-contents {
+  height: 100%;
+  vertical-align: middle;
+}
+
+.list-row-select > input {
+  vertical-align: middle;
+}
+
+.no-bottom-margin {
+  margin-bottom: 0 !important;
+}
+
+.no-bottom-margin .control-group {
+  margin-bottom: 4px;
+}
+
+.bottom-margin {
+  margin-bottom: 20px;
+}
+
+li.attr-column {
+  width: 1em;
+}
+
+.editor-autoresize .CodeMirror {
+  height: auto;
+}
+
+.well.editor-autoresize {
+  padding: 0px;
+}
+
+.well.editor-autoresize .CodeMirror {
+  margin-bottom: 0px;
+  border: none;
+}
+
+.editor-autoresize .CodeMirror .CodeMirror-scroll {
+  overflow-y: hidden;
+  overflow-x: auto;
+}
+
+.gridster ul#widgets {
+  list-style-type: none;
+}
+
+.gridster ul#widgets .gs_w {
+  padding: 0px;
+  overflow: hidden;
+  position: relative;
+}
+
+.gridster ul#widgets .preview-holder {
+  transition-property: opacity;
+  transition-duration: 500ms;
+  padding: 1px;
+}
+
+.widget-area {
+  position: relative;
+  height: 100%;
+  width: 100%;
+}
+
+.widget-title {
+  margin: 0;
+  padding-left: 5px;
+  padding-right: 5px;
+  z-index: 6000;
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+}
+
+.widget-title:hover {
+  cursor: move;
+}
+
+.widget-title > .row-fluid > .pull-right > i {
+  cursor: pointer;
+  opacity: .25;
+}
+
+.widget-title > .row-fluid > .pull-right > i:hover {
+  transition: opacity 0.25s ease-in-out;
+  -moz-transition: opacity 0.25s ease-in-out;
+  -webkit-transition: opacity 0.25s ease-in-out;
+  opacity: 1;
+}
+
+.widget-body {
+  position: absolute;
+  top: 20px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+
+.height-controls > a {
+  float: left;
+  display: block;
+  opacity: .1;
+  text-decoration: none;
+}
+
+.width-controls > a {
+  float: left;
+  display: block;
+  opacity: .1;
+  text-decoration: none;
+}
+
+.width-controls > a:hover {
+  opacity: .9;
+  text-decoration: none;
+}
+
+.height-controls > a:hover {
+  opacity: .9;
+  text-decoration: none;
+}
+
+.width-controls {
+  font-size: 32px;
+  z-index: 50;
+  position: absolute;
+  width: 1.5em;
+  height: 3em;
+  display: block;
+  right: 5px;
+  top: 43%;
+}
+
+.height-controls {
+  font-size: 32px;
+  z-index: 50;
+  position: absolute;
+  display: block;
+  width: 3em;
+  height: 1.5em;
+  left: 41%;
+  bottom: 5px;
+}
+
+editable-property {
+  position: relative;
+}
+
+.ep.editing {
+  position: absolute;
+  top: -10px;
+  padding: 0;
+  z-index: 10000;
+  border: 1px solid #cecdcd;
+  white-space: nowrap;
+}
+
+/*
+.widget-title > div > div .ep[ng-show=editing] {
+  top: -1px;
+}
+
+table .ep.editing {
+  top: 12px;
+}
+  */
+.ep.editing > form > fieldset > i {
+  position: relative;
+  top: 2px;
+}
+
+.ep > i {
+  cursor: pointer;
+  opacity: .25;
+  transition: opacity 0.25s ease-in-out;
+  -moz-transition: opacity 0.25s ease-in-out;
+  -webkit-transition: opacity 0.25s ease-in-out;
+}
+
+.ep > form > fieldset > input {
+  border: 0;
+}
+
+.ep > i:hover {
+  opacity: 1;
+}
+
+.ep form fieldset i {
+  cursor: pointer;
+  padding-left: 5px;
+}
+
+.ep form.no-bottom-margin {
+  margin: 0;
+}
+
+.ngTotalSelectContainer {
+  margin: 0px;
+}
+
+.ngTopPanel {
+  background: inherit;
+}
+
+.ngGrid {
+  background: inherit;
+}
+
+.ngViewport {
+  margin-left: 0px;
+  margin-right: 0px;
+}
+
+#widgets li div div div div form fieldset div input {
+  display: none;
+}
+#widgets li div div div div div#attributesGrid div div div div.ngHeaderCell {
+  border: none;
+}
+#widgets li div div div div div#attributesGrid div div div div.ngCell {
+  border: none;
+}
+#widgets li div div div div div#attributesGrid div.ngTopPanel {
+  border: none;
+}
+#widgets li div div div div div#attributesGrid div.ngTopPanel div.ngGroupPanel {
+  border: none;
+}
+#widgets li div div div div div#attributesGrid div.ngFooterPanel {
+  border: none;
+  display: none;
+}
+.ngFooterPanel {
+  border-top: none;
+}
+.ngRow .ngCell:last-child {
+  border-right: none;
+}
+.ngRow:last-child {
+  border-bottom: none;
+}
+.ngFooterTotalItems span:first-child {
+  margin-right: .5em;
+}
+
+.ACTIVE:before {
+  font-family: FontAwesome;
+  content: "\f087";
+  font-style: normal;
+  color: #777777;
+}
+
+.RESOLVED:before {
+  font-family: FontAwesome;
+  content: "\f0ad";
+  font-style: normal;
+}
+
+.STARTING:before {
+  font-family: FontAwesome;
+  content: "\f021";
+  font-style: normal;
+}
+
+.STARTING {
+  -moz-animation: spin 2s infinite linear;
+  -o-animation: spin 2s infinite linear;
+  -webkit-animation: spin 2s infinite linear;
+  animation: spin 2s infinite linear;
+}
+
+.STOPPING:before {
+  font-family: FontAwesome;
+  content: "\f021";
+  font-style: normal;
+}
+
+.STOPPING {
+  -moz-animation: spin 2s infinite linear;
+  -o-animation: spin 2s infinite linear;
+  -webkit-animation: spin 2s infinite linear;
+  animation: spin 2s infinite linear;
+}
+
+.UNINSTALLED:before {
+  font-family: FontAwesome;
+  content: "\f014";
+  font-style: normal;
+}
+
+.INSTALLED:before {
+  font-family: FontAwesome;
+  content: "\f06b";
+  font-style: normal;
+}
+
+.table-bordered {
+  border: none;
+  border-radius: 0px;
+}
+
+.table-bordered thead:first-child tr:first-child th:first-child,
+.table-bordered tbody:first-child tr:first-child td:first-child {
+  border-radius: 0px;
+  border-left: none;
+}
+
+.table-bordered th,
+.table-bordered td {
+  border-left: none;
+  border-top: none;
+}
+
+.table-bordered th:last-child,
+.table-bordered td:last-child {
+  border-left: none;
+  border-top: none;
+  border-right: none;
+}
+
+table.table thead .sorting {
+  background: inherit;
+}
+
+table.table thead .sorting_asc:after {
+  background: url('../img/datatable/sort_asc.png') no-repeat top center;
+}
+
+table.table thead .sorting_desc:after {
+  background: url('../img/datatable/sort_desc.png') no-repeat top center;
+}
+
+.dataTables_filter label {
+  margin-bottom: 0px;
+}
+
+.dataTables_filter label input {
+  padding-right: 14px;
+  padding-right: 4px \9;
+  padding-left: 14px;
+  padding-left: 4px \9;
+  margin-bottom: 0;
+}
+
+.nav {
+  margin-bottom: 10px;
+}
+
+.navbar-fixed-top {
+  margin-bottom: 0px;
+}
+
+#main > div > ul.nav,
+ng-include > .nav.nav-tabs {
+  margin-bottom: 10px;
+  min-width: 120px;
+}
+
+#main > div > ul.nav > li, 
+ng-include > .nav.nav-tabs > li {
+  margin-top: 3px;
+  margin-bottom: 3px;
+}
+
+.navbar .btn-navbar span:after {
+  font-family: FontAwesome;
+  content: "\f0de";
+  margin-left: 7px;
+}
+
+.navbar .btn-navbar.collapsed span:after {
+  font-family: FontAwesome;
+  content: "\f0dd";
+  margin-left: 7px;
+}
+
+#main > div > ul.nav,
+ng-include > .nav.nav-tabs {
+  padding-left: 3px;
+  padding-right: 3px;
+}
+
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  margin-right: 0px;
+}
+
+div#main div ul.nav li a,
+div#main div ul.nav li span {
+  padding-bottom: 2px;
+  padding-top: 2px;
+}
+
+div#main div ul.nav li a:hover {
+  padding-bottom: 2px;
+  padding-top: 2px;
+}
+
+#main div div div section .tabbable .nav.nav-tabs {
+  margin-top: 0px;
+  margin-bottom: 10px;
+  min-width: 120px;
+}
+
+#main > div > div > div > .nav.nav-tabs:not(.connected),
+.span12 > .nav.nav-tabs:not(.connected) {
+  margin-top: 5px;
+}
+
+.span12 > .nav.nav-tabs:not(.connected),
+.span12 > .nav.nav-tabs > li {
+  margin: 3px;
+}
+
+.logbar {
+  z-index: 40;
+  position: fixed;
+  width: 87%;
+  top: 70px;
+  left: 5%;
+  padding-left: 20px;
+  padding-right: 20px;
+}
+
+.logbar-container {
+  margin-top: 10px;
+  margin-bottom: 5px;
+}
+
+.logbar-container .control-group {
+  margin-bottom: 5px;
+}
+
+.log-main {
+  margin-top: 55px;
+}
+
+.log-filter {
+  margin-right: 30px;
+}
+
+.ui-resizeable-handle {
+  display: none;
+}
+
+.ui-resizable-se {
+  height: 10px;
+  width: 10px;
+  margin-right: 5px;
+  margin-bottom: 5px;
+  font-size: 32px;
+  z-index: 50;
+  position: absolute;
+  display: block;
+  right: 0px;
+  bottom: 0px;
+  cursor: se-resize;
+}
+
+.no-log {
+  margin-top: 55px;
+}
+
+.control i {
+  cursor: pointer;
+}
+
+td.details {
+  padding: 0px;
+  border: none;
+  margin: 0px;
+  height: 0px;
+}
+
+.innerDetails {
+  padding: 5px;
+  white-space: normal;
+  display: none;
+}
+
+table.dataTable {
+  table-layout: fixed;
+}
+
+table.dataTable tbody tr td {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.wiki.logbar-container {
+  margin-top: 5px;
+  margin-bottom: 5px;
+}
+
+.wiki.logbar-container > .nav.nav-tabs {
+  margin-top: 0px;
+  margin-bottom: 0px;
+}
+
+.wiki.logbar-container .pull-right {
+  margin-top: 1px;
+}
+
+.wiki-fixed {
+  margin-top: 45px;
+}
+
+.wiki-fixed .pane {
+  top: 120px;
+}
+
+.help-sidebar li {
+  padding-left: 2px;
+  padding-right: 2px;
+}
+
+.help-sidebar li a {
+  padding-left: 3px;
+  padding-right: 3px;
+}
+
+.help-sidebar li:first-child {
+  margin-top: 0px !important;
+  padding-top: 20px;
+}
+
+.help-display p {
+  text-align: justify;
+}
+
+.help-display h5 {
+  margin-top: 2em;
+}
+
+.help-display h6 {
+  margin-top: 2em;
+}
+
+.form-data {
+  display: inline-block;
+  margin: 5px;
+}
+
+input[type="checkbox"].hawtio-checkbox {
+  margin-top: 10px;
+}
+
+.bundle-list {
+  width: 100%;
+}
+
+.bundle-item {
+  position: relative;
+  display: inline-block;
+  width: 300px;
+  margin-bottom: 1px;
+}
+
+.bundle-item-details table {
+  min-height: 0;
+}
+
+.bundle-item-details {
+  height: 0;
+  display: inline-block;
+  z-index: 15;
+}
+
+.bundle-item > a {
+  display: block;
+  z-index: 5;
+}
+
+.bundle-item > a:hover {
+  text-decoration: none;
+}
+
+.bundle-item a span {
+  display: block;
+  padding: 8px;
+  font-weight: normal;
+  z-index: 6;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+
+.bundle-item a span.badge {
+  margin-left: 7px;
+}
+
+.bundle-item a span.badge::before {
+  padding: 0px;
+  float: left;
+  position: relative;
+  top: 4px;
+  left: -8px;
+  display: block;
+  content: ' ';
+  height: 6px;
+  width: 6px;
+  z-index: 10;
+}
+
+.bundle-item a.toggle-action {
+  position: absolute;
+  display: block;
+  width: 16px;
+  height: 16px;
+  margin: 0;
+  padding: 0;
+  right: 12px;
+  top: 6px;
+  opacity: 0.2;
+  transition: all 500ms ease-in-out;
+  font-size: 18px;
+}
+
+.bundle-item a.toggle-action .icon-power-off {
+  color: orange;
+}
+
+.bundle-item a.toggle-action .icon-play-circle {
+  color: green;
+}
+
+.bundle-item a.toggle-action:hover {
+  opacity: 1;
+  text-decoration: none;
+}
+
+.bundle-list {
+  margin-bottom: 2em;
+}
+
+div.hawtio-form-tabs div.tab-content {
+  padding-top: 15px;
+  padding: 10px;
+}
+
+.hawtio-form fieldset legend {
+  margin-bottom: 0;
+  border-bottom: none;
+  font-size: 15px;
+}
+
+.spacer {
+  display: inline-block;
+  margin-bottom: 10px;
+}
+
+div.hawtio-form-tabs ul.nav-tabs {
+  margin-bottom: 0px !important;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li {
+  margin-bottom: -1px !important;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li.active:first-child {
+  margin-left: 0px;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li.active {
+  margin-right: 1px;
+  margin-left: 2px;
+  box-shadow: 0 -10px 10px -10px rgba(0, 0, 0, 0.1) !important;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li.active a {
+  font-weight: bold;
+}
+
+.popover-inner .popover-title {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.popover {
+  width: auto;
+}
+
+li.stacktrace {
+  line-height: 10px;
+}
+
+.control-button {
+  width: 14px;
+}
+
+.ngViewport:focus {
+  outline: none;
+}
+
+.wikiGridStyle {
+  height: 350px;
+}
+
+/** Animations */
+.wave-enter-setup,
+.wave-leave-setup {
+  transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
+}
+
+.wave-enter-setup {
+  position: absolute;
+  left: -100%;
+}
+
+.wave-enter-start {
+  left: 0;
+}
+
+.wave-leave-setup {
+  position: absolute;
+  left: 0;
+}
+
+.wave-leave-start {
+  left: 100%;
+}
+
+/* slideout directive stuff */
+.slideout {
+  position: fixed;
+  z-index: 3000;
+  width: 75%;
+}
+
+.slideout > .slideout-title {
+  min-height: 22px;
+  font-size: 20px;
+  padding: 15px;
+}
+
+.slideout > .slideout-content {
+  position: relative;
+  min-height: 93%;
+  max-height: 93%;
+  overflow: auto;
+  -webkit-transform: translateZ(0);
+}
+
+.slideout-title span {
+  width: 97%;
+  display: inline-block;
+  text-align: left;
+}
+
+.slideout.left > .slideout-content {
+  left: 0;
+  top: 0;
+  margin-right: 2px;
+  margin-left: 0px;
+}
+
+.slideout.right > .slideout-content {
+  left: 2px;
+  top: 0;
+  margin-left: 2px;
+  margin-right: 0px;
+}
+
+.slideout > .slideout-content > .slideout-body {
+  margin: 5px;
+  height: 100%;  
+}
+
+.slideout.right {
+  left: 100%;
+}
+
+.slideout.left {
+  left: -75%;
+}
+
+.slideout .slideout-title a {
+  display: inline-block;
+}
+
+.slideout .slideout-title a:hover {
+  text-decoration: none;
+}
+
+.slideout.right .slideout-title a {
+  margin-left: 5px;
+  float: left;
+}
+
+.out {
+  transition: left 1s, right 1s ease-in-out;
+}
+
+.slideout.left .slideout-title a {
+  margin-right: 5px;
+  float: right;
+}
+
+.slideout.right.out {
+  left: 25%;
+}
+
+.slideout.left.out {
+  left: 0%;
+}
+
+.column-filter {
+  width: 94%;
+  margin-bottom: 10px !important;
+}
+
+.color-picker {
+  display: inline-block;
+  position: relative;
+  margin: 0px;
+  line-height: 0px;
+}
+
+.color-picker .wrapper {
+  display: inline-block;
+  padding: 2px;
+  line-height: 0;
+}
+
+.selected-color {
+  width: 1em;
+  height: 1em;
+  padding: 4px;
+  transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
+  display: inline-block;
+  cursor: pointer;
+}
+
+.color-picker-popout {
+  transition: opacity 0.25s ease-in-out;
+  position: absolute;
+  top: 0px;
+  overflow: hidden;
+  padding: 0px;
+  line-height: 0;
+  margin: 0px;
+  width: 0px;
+  opacity: 0;
+}
+
+.popout-open {
+  padding: 1px;
+  width: auto;
+  opacity: 1;
+}
+
+.color-picker div table tr td div {
+  width: 1em;
+  height: 1em;
+  padding: 3px;
+  transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
+}
+
+.color-picker div table tr td {
+  padding-right: 5px;
+}
+
+.color-picker div table tr td:last-child {
+  padding-right: 0px;
+}
+
+.modal-body div form fieldset div.spacer {
+  display: inherit;
+  margin-bottom: inherit;
+}
+
+.mouse-pointer {
+  cursor: pointer;
+}
+
+.clickable {
+  cursor: pointer;
+  opacity: 0.6;
+  transition: opacity .5s;
+  text-decoration: none;
+}
+
+.clickable,
+.clickable:before {
+  width: 16px;
+  height: 16px;
+  line-height: 16px;
+}
+
+.clickable.no-fade {
+  transition: none;
+  opacity: 1;
+}
+
+.clickable:hover {
+  opacity: 1;
+  text-decoration: none;
+}
+
+.hawtio-pager {
+  overflow: auto;
+  display: inline-block;
+}
+
+.hawtio-pager label {
+  min-height: 100%;
+  vertical-align: middle;
+  margin-right: 5px;
+  display: inline-block;
+}
+
+.fabric-view {
+  position: relative;
+  min-width: 928px;
+}
+
+.columns {
+  position: absolute;
+  bottom: 0;
+  top: 0;
+  left: 0;
+  right: 0;
+  padding-left: 300px;
+  padding-right: 304px;
+  padding-bottom: 0px;
+  padding-top: 0px;
+}
+
+.column {
+  float: left;
+  position: relative;
+  margin-top: 0px;
+  margin-bottom: 0;
+  height: 100%;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+
+.columns #center {
+  width: 100%;
+  padding: 0 5px;
+  margin-right: 8px;
+}
+
+.columns #left {
+  width: 280px;
+  padding: 0 5px;
+  margin-left: -100%;
+  right: 315px;
+}
+
+.columns #right {
+  width: 270px;
+  padding: 0 5px;
+  margin-right: -330px;
+}
+
+.canvas {
+  height: 91%;
+}
+
+.container-section {
+  height: 90%;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+
+.profile-section {
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+
+.box.ui-draggable-dragging {
+  width: 274px;
+  transition: none;
+}
+
+.box.selected .box-right i {
+  text-shadow: none;
+}
+
+.contained {
+  display: inline-block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  position: relative;
+  white-space: nowrap;
+}
+
+h2 > .contained {
+  top: 5px;
+}
+
+h4 > .contained {
+  top: 4px;
+}
+
+.dropdown-toggle > .contained,
+.breadcrumb-link > .contained {
+  top: 2px;
+  line-height: 15px;
+}
+
+/* these widths are totally arbitrary */
+.c-narrow {
+  max-width: 5em;
+}
+
+.c-medium {
+  max-width: 10em;
+}
+
+.c-wide {
+  max-width: 15em;
+}
+
+.c-wide2 {
+  max-width: 20em;
+}
+
+.c-wide3 {
+  max-width: 25em;
+  min-width: 10em;
+}
+
+.c-max {
+  width: 100%;
+}
+
+.fabric-page-header > .profile-summary-wide {
+  margin-left: 10px;
+  line-height: 22px;
+}
+
+.profile-selector-name > .contained {
+  top: 8px;
+}
+
+.box {
+  cursor: pointer;
+  height: 50px;
+  overflow: hidden;
+  padding: 0;
+  margin: 0;
+  position: relative;
+  text-overflow: ellipsis;
+  transition: all 0.2s ease 0s;
+  white-space: nowrap;
+  line-height: 22px;
+  vertical-align: middle;
+}
+
+.box > .box-left,
+.box > .box-right,
+.box > .box-middle {
+  display: inline-block;
+  position: absolute;
+  vertical-align: middle;
+  top: 0;
+  bottom: 0;
+  padding-top: 10px;
+}
+
+.box > .box-left {
+  left: 11px;
+}
+
+.box > .box-right {
+  right: 11px;
+}
+
+.box > .box-middle {
+  right: 60px;
+}
+
+.box > .box-left > div,
+.box > .box-right > div,
+.box > .box-middle > div {
+
+}
+
+.box > .box-left > div > div,
+.box > .box-right > div > div,
+.box > .box-middle > div > div {
+  vertical-align: middle;
+  display: inline-block;
+  margin-left: 4px;
+  margin-right: 4px;
+}
+
+
+.box > .box-left > div > div .contained,
+.box > .box-left > div > div > span,
+.box > .box-right > div > div .contained,
+.box > .box-middle > div > div .contained {
+  vertical-align: middle;
+}
+
+
+.box > .box-left > .profile-select {
+  display: inline-block;
+  top: 9px;
+  max-width: 210px;
+  width: 210px;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.box input[type='checkbox'] {
+  margin-top: 5px;
+  display: inline;
+}
+
+.box .active-profile a.invisible {
+  visibility: none;
+}
+
+.box .active-profile div {
+  display: inline;
+}
+
+.box .active-profile {
+  position: absolute;
+  display: inline-block;
+  top: 10px;
+  left: 12px;
+  right: 0px;
+}
+
+.box .active-profile [class^='icon-circle'] {
+  top: 0;
+}
+
+.box-middle ul.inline li {
+  opacity: 0.5;
+  transition: opacity 0.5s;
+}
+
+.box-middle ul.inline li:hover{
+  opacity: 1;
+}
+
+.section-header {
+  padding: 5px 7px;
+}
+
+.selection-controls {
+  display: inline-block;
+}
+
+.section-title {
+  margin-left: 10px;
+  display: inline-block;
+}
+
+.section-controls {
+  display: inline-block;
+  float: right;
+}
+
+#center .section-header .section-controls {
+  position: relative;
+  top: 7px;
+  left: -2px;
+}
+
+.page-padded .section-header .section-controls {
+  position: relative;
+  top: 6px;
+  left: -3px;
+}
+
+.page-padded .section-header .selection-controls {
+  position: relative;
+  top: 1px;
+}
+
+.section-controls > a,
+.section-controls > span > span > span > span > span > .hawtio-dropdown {
+  margin-left: 12px;
+  margin-right: 12px;
+  cursor: pointer;
+}
+
+.section-controls > a:hover,
+.section-controls > span:hover {
+  text-decoration: none;
+}
+
+.section-controls > a.nav-danger {
+  color: IndianRed !important;
+}
+
+.section-controls > a.nav-danger:hover {
+  text-shadow: rgba(205, 92, 92, 0.6) 0 0 20px !important;
+}
+
+.page-padded .section-header .section-filter {
+  margin-top: 0px;
+}
+
+.section-filter {
+  position: relative;
+  display: inline-block;
+  margin-left: 12px;
+}
+
+.active-profile-filter > .section-filter {
+  margin-top: 5px;
+}
+
+#center > .section-header > .section-filter {
+  margin-top: 0px;
+}
+
+#right > .section-header > .section-filter {
+  margin-left: 8px;
+}
+
+#right > .canvas {
+  height: 80%;
+}
+
+.section-filter .icon-remove {
+  position: absolute;
+  top: 7px;
+  right: 9px;
+}
+
+.features-toolbar {
+  position: relative;
+  margin-bottom: 0.5em;
+}
+
+.version-section > .canvas > div > .box {
+  line-height: inherit;
+}
+
+.version-section select {
+  width: 100%;
+  margin-top: 5px;
+  margin-bottom: 5px;
+}
+
+span.remove {
+  float: right;
+}
+
+span.deleting {
+  text-decoration: line-through;
+}
+
+td.deleting {
+  background-color: IndianRed !important;
+}
+
+td.adding {
+  background-color: Aquamarine !important;
+}
+
+.no-match-filter {
+  display: none;
+}
+
+.file-upload div form fieldset .input-prepend .btn {
+  float: left;
+}
+
+@-moz-document url-prefix() {
+  /* hack to get the add button to line up correctly in FF */
+  .input-prepend .btn {
+    padding-top: 5px;
+    padding-bottom: 5px;
+  }
+}
+
+.input-prepend .progress {
+  position: relative;
+  left: 1px;
+  top: 0px;
+  min-height: 30px;
+  width: 160px;
+}
+
+.login-wrapper {
+  position: absolute;
+  left: 0;
+  top: 350px;
+  padding-top: 2px;
+  padding-bottom: 2px;
+  padding-left: 0;
+  padding-right: 0;
+  line-height: 0;
+  width: 100%;
+}
+
+.login-wrapper form {
+  margin-bottom: 0px;
+  padding-top: 67px;
+  padding-bottom: 7px;
+  padding-right: 40px;
+  padding-left: 40px;
+}
+
+.login-wrapper form fieldset {
+  width: 413px;
+}
+
+.login-form form fieldset .control-group {
+  margin-bottom: 15px;
+  margin-left: 5px;
+}
+
+.login-form form fieldset .control-group button[type='submit'] {
+  float: right;
+}
+
+.login-logo {
+  display: block;
+  position: absolute;
+  letter-spacing: 5px;
+  padding: 10px;
+  font-size: 20px;
+  left: 233px;
+  top: 9px;
+}
+
+.login-logo > img {
+  height: 30px;
+}
+
+/** highlight required fields which have no focus */
+input.ng-invalid,
+textarea.ng-invalid,
+select.ng-invalid {
+  border-color: #e5e971;
+  -webkit-box-shadow: 0 0 6px #eff898;
+  -moz-box-shadow: 0 0 6px #eff898;
+  box-shadow: 0 0 6px #eff898;
+}
+
+/** Use bigger and darker border on checkboxes as its hard to see since they already have a shadow */
+input[type="checkbox"].ng-invalid {
+  -webkit-box-shadow: 0 0 12px #e5e971;
+  -moz-box-shadow: 0 0 12px #e5e971;
+  box-shadow: 0 0 12px #e5e971;
+}
+
+.container-profile-settings {
+  min-width: 360px;
+}
+
+.container-settings {
+  min-width: 360px;
+}
+
+.bold {
+  font-weight: bold;
+}
+
+.container-settings dd .ep {
+  display: inline-block;
+  top: -5px;
+}
+
+.deployment-pane h3 {
+  margin-top: 0px;
+}
+
+.deployment-pane ul li i {
+  display: inline-block;
+  white-space: nowrap;
+}
+
+.deployment-pane ul li {
+  white-space: nowrap;
+  padding: 7px;
+}
+
+.deployment-pane ul li editable-property {
+  display: inline-block;
+}
+
+.deployment-pane ul li .ep {
+  display: inline-block;
+}
+
+.container-settings dd input[type=radio] {
+  display: inline-block;
+}
+
+.fabric-page-header .span4 h1,
+.fabric-page-header .span4 h2 {
+  line-height: inherit;
+}
+
+.fabric-page-header h2.inline-block {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.create-container-body {
+  margin-top: 10px;
+}
+
+.log-stack-trace > dd {
+  margin-left: 0;
+}
+
+.log-message > dd > div {
+  margin-top: 10px;
+}
+
+.log-stack-trace > dd > ul {
+  margin-top: 10px;
+}
+
+.log-stack-trace > dd > ul > li {
+  line-height: 12px;
+}
+
+.log-stack-trace > dd > ul > li > div.stack-line > a {
+  font-weight: bold;
+}
+
+pre.stack-line {
+  padding: 0;
+  margin: 0;
+  line-height: 14px;
+}
+
+div.stack-line {
+  white-space: pre-wrap;
+  word-break: break-all;
+  word-wrap: break-word;
+  line-height: 14px;
+}
+
+#container-create-form {
+  margin-bottom: 14px;
+}
+
+#container-create-form .control-group {
+  margin-bottom: 0px;
+}
+
+h1.ajaxError {
+  font-size: 16px;
+}
+
+h2.ajaxError {
+  font-size: 14px;
+}
+
+h3.ajaxError,
+h4.ajaxError {
+  font-size: 12px;
+}
+
+.directive-example {
+  padding: 10px;
+  margin: 10px;
+}
+
+div#main div ul.nav li a.nav-primary.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+
+div#main div ul.nav li a.nav-primary {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #006dcc;
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #0044cc;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+div#main div ul.nav li a.nav-primary:hover,
+div#main div ul.nav li a.nav-primary:active,
+div#main div ul.nav li a.nav-primary.active,
+div#main div ul.nav li a.nav-primary.disabled,
+div#main div ul.nav li a.nav-primary[disabled] {
+  color: #ffffff;
+  background-color: #0044cc;
+  *background-color: #003bb3;
+}
+
+div#main div ul.nav li a.nav-primary:active,
+div#main div ul.nav li a.nav-primary.active {
+  background-color: #003399 \9;
+}
+
+.nav.nav-tabs li a[disabled] {
+  cursor: not-allowed;
+  opacity: 0.3;
+}
+
+.caret:before {
+  font-family: 'FontAwesome';
+  border: 0;
+  content: "\f078";
+  font-size: 11px;
+  display: block;
+  position: relative;
+  top: -9px;
+  left: 0;
+}
+
+.dropdown.perspective-selector .caret:before {
+  top: -7px;
+}
+
+.caret {
+  border: none;
+  width: 9px;
+}
+
+div#main div ul.nav li a.nav-primary .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.main-nav-upper .container:before {
+  display: none;
+}
+
+.main-nav-upper .container:after {
+  display: none;
+}
+
+.main-nav-upper .container {
+  width: auto;
+  line-height: 23px;
+  vertical-align: auto;
+}
+
+.main-nav-upper .icon-desktop:before {
+  position:relative;
+  top: 1px;
+}
+
+.main-nav-lower .container:before {
+  display: none;
+}
+
+.main-nav-lower .container:after {
+  display: none;
+}
+
+.main-nav-lower .container {
+  width: 100%;
+}
+
+.overflow > .dropdown-toggle:not(.open) + .dropdown-menu {
+  border: none;
+}
+
+.main-nav-lower .container ul.nav {
+  width: 100%;
+}
+
+.navbar-inner {
+  height: auto;
+  min-height: 0;
+}
+
+.main-nav-upper {
+  height: 28px;
+  min-height: 28px;
+  font-size: 11px;
+}
+
+.main-nav-upper .brand {
+  font-size: 13px;
+  margin-left: 0px;
+  padding: 0px;
+  font-weight: normal;
+  margin-left: 20px;
+}
+
+.main-nav-upper .nav li a {
+  padding-top: 2px;
+  padding-bottom: 5px;
+}
+
+#main-nav {
+  max-height: 70px;
+}
+
+#main {
+  margin-top: 70px !important;
+}
+
+dd.file-list {
+  margin-left: 0;
+}
+
+.file-list-toolbar .nav .caption {
+  font-weight: bold;
+  padding-top: 5px;
+  padding-bottom: 5px;
+  padding-left: 0 !important;
+}
+
+.file-icon {
+  padding: 0;
+  margin: 0;
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  margin-right: 6px;
+}
+
+.file-icon i {
+  width: 16px;
+  height: 16px;
+  font-size: 17px;
+  position: relative;
+  left: 2px;
+  top: 2px;
+}
+
+.file-icon img {
+  width: 16px;
+  height: 16px;
+}
+
+.page-padded {
+  padding-left: 20px;
+  padding-right: 20px;
+}
+
+.fabric-page-header .span4 h2 i {
+  margin-right: 13px;
+}
+
+.controller-section-widget {
+  padding: 3px;
+}
+
+.container-dashboard-controls {
+  position: relative;
+  z-index: 10;
+}
+
+.container-dashboard-controls .pull-right .btn {
+  opacity: 0.5;
+  transition: opacity 1s;
+}
+
+.container-dashboard-controls .pull-right .btn:hover {
+  opacity: 0.9;
+}
+
+.container-dashboard-status-table {
+  position: relative;
+  top: -34px;
+  display: table;
+  max-width: 278px;
+  z-index: 9;
+}
+
+.container-status-dashboard {
+  text-align: center;
+  display: table-cell;
+  min-width: 144px;
+}
+
+.container-status-dashboard i {
+  position: relative;
+  left: 0px;
+  font-size: 133px;
+}
+
+.status-icon {
+  display: inline-block;
+  text-decoration: none;
+  color: inherit;
+}
+
+.status-icon:hover {
+  text-decoration: none;
+}
+
+.dashboard-service-list {
+  display: table-cell;
+  min-width: 139px;
+  vertical-align: middle;
+}
+
+.container-dashboard-profile-controls {
+  width: 100%;
+  text-align: center;
+  margin-bottom: 5px;
+}
+
+.no-list {
+  list-style-type: none;
+}
+
+.profile-selector-item {
+  display: table;
+}
+
+.profile-selector-checkbox {
+  display: table-cell;
+  padding-right: 5px;
+}
+
+.profile-selector-name {
+  display: table-cell;
+  position: relative;
+  width: 100%;
+}
+
+.profile-info {
+  position: absolute;
+  right: 3px;
+}
+
+.profile-list ul {
+  margin-left: 0;
+  margin-bottom: 0;
+}
+
+.profile-list ul li .expandable .expandable-body {
+  margin-left: 16px;
+}
+
+/** fabric active profiles */
+.active-profile-titles {
+  position: relative;
+  display: inline-block;
+  width: 100%;
+  height: 40px;
+}
+
+.active-profile-list .expandable {
+  padding: 0;
+}
+
+.active-profile-titles.section-header {
+  padding: 0;
+}
+
+.active-profile-titles div:not(.active-profile-filter) {
+  display: inline-block;
+  font-weight: bold;
+  top: 10px;
+}
+
+.active-profile-row {
+  position: relative;
+  display: inline-block;
+  width: 100%;
+  line-height: 22px;
+  height: 22px;
+}
+
+.active-profile-row div {
+  display: inline-block;
+}
+
+.active-profile-list .expandable .expandable-body {
+  width: 100%;
+}
+
+.active-profile-list .expandable .expandable-body ul li .box {
+  background: inherit;
+}
+
+.active-profile-list .expandable .expandable-body ul li .child-container {
+  margin-left: 0;
+}
+
+.active-profile-expander {
+  position: absolute;
+  left: 0;
+}
+
+.active-profile-requirements {
+  position: absolute;
+  right: 75px;
+}
+
+.active-profile-requirements-title {
+  position: absolute;
+  right: 75px;
+}
+
+.active-profile-create {
+  position: absolute;
+  right: 210px;
+}
+
+.active-profile-count {
+  position: absolute;
+  right: 0px;
+}
+
+.active-profile-count-title {
+  padding: 5px;
+  text-align: right;
+  font-weight: bold;
+}
+
+.active-profile-titles .section-controls {
+  position: absolute;
+  top: 10px !important;
+  right: 10px;
+}
+
+.active-profile-titles .section-controls a {
+  font-weight: normal;
+}
+
+
+.active-profile-name {
+  position: absolute;
+  left: 35px;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  right: 95px;
+}
+
+.active-profile-icon {
+  position: absolute;
+  top: 1px;
+  left: 15px;
+  color: green !important;
+}
+
+.active-profile-icon i {
+  font-size: 17px;
+}
+
+.active-profile-filter {
+  position: absolute;
+  left: 0px;
+  top: -10px;
+}
+
+.active-profile-main {
+  min-width: 754px;
+}
+
+.active-profile-count a .icon-plus {
+  position: relative;
+  top: 1px;
+}
+
+.active-profile-count a:hover {
+  text-decoration: none;
+}
+
+/** fabric brokers page */
+.mq-titles {
+  position: relative;
+  display: inline-block;
+  width: 100%;
+  height: 40px;
+}
+
+.mq-titles.section-header {
+  padding: 0;
+}
+
+.mq-titles .section-controls {
+  position: absolute;
+  top: 9px !important;
+  right: 0px;
+}
+
+.mq-titles .section-controls a {
+  font-weight: normal;
+}
+
+.mq-profile-icon {
+  color: green !important;
+}
+
+.mq-profile-list, .mq-broker-list, .mq-container-list {
+  margin-left: 15px;
+}
+
+i.mq-master {
+  color: orange;
+}
+
+.mq-broker-rectangle, .mq-container-rectangle {
+  position: relative;
+
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+
+  margin-left: 5px;
+  margin-right: 5px;
+  margin-bottom: 5px;
+  margin-top: 5px;
+
+  border-left-width: 10px;
+  border-right-width: 10px;
+  border-top-width: 10px;
+
+  *zoom: 1;
+  padding: 4px 12px;
+  margin-bottom: 0;
+  font-size: 14px;
+  line-height: 20px;
+  *line-height: 20px;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+}
+
+.mq-page {
+  position: relative;
+}
+
+.mq-page .hero-unit {
+  position: absolute;
+  top: 53px;
+  left: 10px;
+  right: 10px;
+}
+
+.mq-groups {
+  position: absolute;
+  top: 42px;
+  left: 19px;
+  right: 10px;
+}
+
+.mq-group-rectangle:first-child {
+  margin-top: 10px;
+}
+
+.mq-group-rectangle {
+  position: relative;
+  margin-left: 0;
+  margin-right: 10px;
+  margin-bottom: 10px;
+  margin-top: 0;
+}
+
+.mq-group-rectangle-label .mq-group-name {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  position: absolute;
+  top: 61px;
+  left: 4px;
+  right: 0;
+}
+
+.mq-group-rectangle-label a {
+  position: absolute;
+  top: 5px;
+  right: 5px;
+}
+
+.mq-group-rectangle-label {
+  position: relative;
+  top: 7px;
+  display: inline-block;
+  min-width: 150px;
+  max-width: 150px;
+  min-height: 150px;
+}
+
+.mq-profiles {
+  position: absolute;
+  min-height: 185px;
+  left: 150px;
+  right: 0;
+  display: inline-block;
+  overflow-x: auto;
+}
+
+.mq-profiles .mq-profile-canvas {
+  overflow: auto;
+}
+
+.mq-profile-rectangle {
+  display: inline-block;
+  height: 150px;
+  margin: 0;
+  margin-top: 5px;
+  margin-left: 10px;
+  padding-left: 4px;
+  padding-right: 4px;
+  padding-top: 4px;
+}
+
+.mq-profile-rectangle-label {
+  position: relative;
+  top: 2px;
+}
+
+.mq-profile-name {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  margin-right: 48px;
+  max-width: 300px;
+  display: block;
+}
+
+.mq-profile-rectangle-label .mq-profile-create-broker {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+
+.mq-profile-canvas {
+  display: inline-block;
+}
+
+.mq-broker-area {
+  position: relative;
+  top: 11px;
+  text-align: center;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.mq-container-rectangle {
+  margin-top: 2px;
+  width: 20px;
+}
+
+.mq-container-row {
+  display: block;
+  margin-top: 8px;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.mq-broker-rectangle {
+  height: 88px;
+}
+
+.mq-group-rectangle-label, .mq-profile-rectangle-label, .mq-broker-rectangle-label, .mq-container-rectangle-label {
+  white-space:nowrap;
+}
+
+/** dashboard */
+.dashboard-link-row {
+  width: 100%;
+  position: relative;
+}
+
+a.dashboard-link {
+  line-height: 15px;
+  font-weight: normal;
+}
+
+a.dashboard-link:hover {
+  text-decoration: none;
+}
+
+.dashboard-link {
+  position: absolute;
+  top: 15px;
+  right: 76px;
+  z-index: 500;
+}
+
+.container-list-main {
+  min-width: 592px;
+}
+
+.widget-title > .row-fluid {
+  position: relative;
+}
+
+.widget-title > .row-fluid > .pull-left {
+  position: absolute;
+  right: 16px;
+  left: 0;
+}
+
+.widget-title > .row-fluid > .pull-left > .ep > div {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.container-detail-profiles {
+  position: relative;
+  margin-top: 2px;
+}
+
+.container-detail-profile-buttons {
+  position: absolute;
+  right: 0;
+  z-index: 50;
+}
+
+#dialog-body div .profile-list {
+  max-height: 327px;
+  overflow-y: auto;
+}
+
+@media (max-width: 979px) {
+  .navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner {
+    padding: 0;
+  }
+
+  .navbar-fixed-top, .navbar-fixed-bottom {
+    position: fixed;
+  }
+
+}
+
+.header-list li {
+  vertical-align: top;
+  height: 30px;
+}
+
+.header-list li div {
+  height: 30px;
+}
+
+.provision-list {
+  margin-left: 0px;
+}
+
+.provision-list ul {
+  margin-left: 0px;
+}
+
+.provision-list ul li {
+  list-style-type: none;
+  padding: 7px;
+}
+
+ul.zebra-list {
+  margin-left: 0;
+}
+
+.zebra-list li {
+  padding: 7px;
+}
+
+ul.zebra-list > li {
+  list-style-type: none;
+}
+
+ol.zebra-list {
+  counter-reset:li;
+  margin-left: 0;
+  padding-left: 0;
+}
+
+ol.zebra-list > li {
+  position: relative;
+  list-style-type: none;
+}
+
+ol.zebra-list > li:before {
+  content: counter(li);
+  counter-increment: li;
+  padding: 7px;
+  font-weight: bold;
+}
+
+.pointer {
+  cursor: pointer;
+}
+
+.container-profile-settings span.folder-title {
+  font-weight: bold;
+}
+li.profile-selector-folder span.folder-title:hover, li.profile div.profile-selector-name>span>span:hover {
+  color: #005580;
+}
+.widget-body div div .wiki-fixed {
+  margin: 3px;
+}
+
+.loading {
+  position: relative;
+  top: 140px;
+}
+
+.loading p {
+  margin-top: 20px;
+  font-weight: bold;
+  font-size: 20px;
+}
+
+.add-link {
+  position: absolute;
+  right: 20px;
+  top: 130px;
+  width: 22px;
+  height: 19px;
+  text-align: center;
+}
+
+.log-table > li {
+  position: relative;
+  list-style-type: none;
+  min-height: 32px;
+  max-width: 100%;
+  padding: 0;
+}
+
+.log-table .table-head div div {
+  font-weight: bold;
+  text-align: center !important;
+  direction: ltr !important;
+}
+
+.log-table .table-head div div:nth-child(4) {
+  font-weight: bold;
+  left: 247px;
+  width: 326px;
+  text-align: center !important;
+  direction: ltr !important;
+}
+
+.log-table > li > div > div {
+  position: absolute;
+  display: inline-block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  font-size: 12px;
+  min-height: 28px;
+  overflow-x: hidden;
+  padding: 3px;
+  padding-top: 6px;
+  width: auto;
+}
+
+.log-table {
+  margin: 0;
+}
+
+.log-table > .table-row {
+  cursor: pointer;
+}
+
+.log-table > .table-row.selected:before {
+  z-index: 39;
+  position: absolute;
+  top: 6px;
+  font-family: FontAwesome;
+  content: "\f054";
+  font-size: 20px;
+  color: green;
+}
+
+.log-table > li > div > div:nth-child(1):not(.stack-line) {
+  left: 0;
+  width: 11px;
+  z-index: 5;
+}
+
+.log-table > li > div > div:nth-child(2) {
+  left: 18px;
+  width: 180px;
+  z-index: 5;
+}
+
+.log-table > li > div > div:nth-child(3) {
+  left: 190px;
+  width: 60px;
+  z-index: 5;
+  text-align: center;
+}
+
+.log-table > li > div > div:nth-child(4) {
+  padding-right: 5px;
+  text-align: right;
+  direction: rtl;
+  z-index: 3;
+  left: 0;
+  width: 573px;
+}
+
+.log-table > li > div > div:nth-child(5) {
+  left: 580px;
+  right: 0;
+  padding-left: 5px;
+}
+
+.log-table > li > div > div:nth-child(6) {
+  position: static;
+  margin-top: 43px;
+  white-space: normal;
+  display: block;
+}
+
+.log-info-panel {
+  z-index: 60;
+  position: fixed;
+  right: 7em;
+  top: 150px;
+  bottom: 5em;
+  padding: 0;
+  overflow: hidden;
+  min-height: 500px;
+  min-width: 800px;
+}
+
+@media(max-width: 1085px) {
+  .log-info-panel {
+    left: 5px;
+    right: 5px;
+    max-width: inherit;
+    min-width: 500px;
+  }
+}
+
+.log-info-panel >.log-info-panel-frame {
+  position: relative;
+  height: 100%;
+  width: 100%;
+  margin: 10px;
+}
+
+.log-info-panel > .log-info-panel-frame > .log-info-panel-header {
+  position: absolute;
+  top: 0;
+  height: 80px;
+  left: 5px;
+  right: 50px;
+  white-space: nowrap;
+}
+
+.log-info-panel-header > span {
+  margin-left: 7px;
+  position: relative;
+  top: 2px;
+  overflow: hidden;
+}
+
+.log-info-panel-frame > .log-info-panel-body {
+  position: absolute;
+  overflow: auto;
+  left: 5px;
+  right: 27px;
+  top: 80px;
+  bottom: 15px;
+  padding-top: 10px;
+  padding-left: 5px;
+  padding-right: 5px;
+}
+
+.log-info-panel-body > .row-fluid {
+  margin-bottom: 10px;
+}
+
+.log-info-panel > .log-info-panel-frame > .log-info-panel-body > .row-fluid > span {
+  margin-right: 7px;
+  white-space: nowrap;
+}
+
+.log-table-dashboard {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+
+.ex-node-container {
+  position: relative;
+  width: 100%;
+  height: 696px;
+}
+
+.ex-node {
+  position: absolute;
+  width: 150px;
+  height: 90px;
+  text-align: center;
+  padding-top: 60px;
+}
+
+.dozer-mapping-node {
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px;
+  padding: 20px;
+}
+
+.dozer-mappings li {
+  list-style-type: none;
+}
+
+.dozer-mappings ul {
+  margin-left: 50px;
+}
+
+.dozer-mappings span {
+  width: 500px;
+}
+
+.wiki-file-list-up:hover {
+  text-decoration: none;
+
+}
+
+.fabric-page-header.features {
+  margin-top: 10px;
+}
+
+.fabric-page-header > * {
+  line-height: 38px;
+}
+
+.profile-selector-name a:hover {
+  text-decoration: none;
+}
+
+.file-name:hover {
+  text-decoration: none;
+}
+
+i.expandable-indicator.folder {
+  font-size: 17px;
+}
+
+.switches li {
+  width: 215px;
+}
+
+.switch-light.switch-ios {
+  width: 100px;
+}
+
+.switch-container {
+  position: static;
+  padding-top: 5px;
+  width: 215px;
+  height: 45px;
+}
+
+[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] {
+
+}
+
+[class^="dynatree-folder icon-"]:before, [class*=" dynatree-folder icon-"]:before {
+  font-size: 17px;
+  margin-left: 18px;
+}
+
+
+[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] .dynatree-connector {
+  display: none;
+}
+
+[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] .dynatree-icon {
+  display: none;
+}
+
+.main-nav-lower .container ul .dropdown.overflow {
+  margin-right: 25px;
+}
+
+.dropdown-menu.right {
+  left: auto;
+  right: 0;
+}
+
+.dropdown-menu.right:before {
+  left:auto !important;
+  right: 9px;
+}
+
+.dropdown-menu.right:after {
+  left:auto !important;
+  right: 10px;
+}
+
+@media(max-width: 1134px) {
+  .profile-details > [class^="span"] {
+    width: 100%;
+    float: inherit;
+    display: block;
+    margin-left: 2px;
+    margin-right: 2px;
+  }
+}
+
+/* Start 800x600 Optimzations */
+@media(max-width: 849px) {
+
+  .page-padded {
+    padding-left: 5px;
+    padding-right: 5px;
+  }
+
+  .wiki-fixed {
+    margin-left: 0 !important;
+    margin-right: 0 !important;
+  }
+
+  .wiki-fixed .row-fluid .span9 {
+    margin-left: 9px;
+  }
+
+  .container-details > [class*=" offset"] {
+    display: none;
+  }
+
+  .container-details > .span4.offset1 {
+    width: 100%;
+    float: inherit;
+    display: block;
+    margin-left: 2px;
+    margin-right: 2px;
+  }
+
+  .container-details > .span5.offset1 {
+    width: 100%;
+    float: inherit;
+    display: block;
+    margin-left: 2px;
+    margin-right: 2px;
+  }
+
+  .create-container-body > [class^="span"] {
+    width: 100%;
+    float: inherit;
+    display: block;
+    margin-left: 2px;
+    margin-right: 2px;
+  }
+
+  .create-container-body > [class^="span"]:first-child {
+    margin-bottom: 15px;
+  }
+
+  .features-toolbar .pull-left {
+    margin-bottom: 10px;
+  }
+
+  .edit-feature-lists > [class^="span"] {
+    width: 49%;
+    float: inherit;
+    display: inline-block;
+    margin-left: 0;
+    margin-right: 0;
+  }
+
+}
+/* End 800x600 optimizations */
+
+/*
+ * jquery.tocify.css 1.8.0
+ * Author: @gregfranko
+ */
+/* The Table of Contents container element */
+.tocify {
+  /* top works for the wiki, may need customization
+     elsewhere */
+  top: 120px;
+  width: 232px;
+  padding-left: 1em;
+  padding-right: 1em;
+  overflow-y: auto;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  position: fixed;
+  bottom: 5px;
+  z-index: 20;
+}
+
+.tocify h2,
+.tocify h3 {
+  white-space: normal;
+}
+
+.toc-container {
+  position: relative;
+  width: 100%;
+}
+
+.toc-content {
+  position: absolute;
+  left: 290px;
+  right: 0;
+}
+
+.tocify ul {
+  margin-left: 0px;
+}
+
+.tocify li {
+  list-style-type: none;
+  display: block;
+}
+
+.tocify li a {
+  display: block;
+  padding: 3px;
+  transition: background,border .25s ease-in-out;
+}
+
+.tocify li a:hover {
+  text-decoration: none;
+}
+
+.tocify li a.active {
+  font-weight: bolder;
+}
+
+/* Makes the font smaller for all subheader elements. */
+.tocify-subheader li {
+  font-size: 12px;
+}
+
+/* Further indents second level subheader elements. */
+.tocify-subheader .tocify-subheader {
+  text-indent: 30px;
+}
+
+/* Further indents third level subheader elements. You can continue this pattern if you have more nested elements. */
+.tocify-subheader .tocify-subheader .tocify-subheader {
+  text-indent: 40px;
+}
+
+@media(max-width: 700px) {
+  .tocify {
+    position: static;
+    width: auto;
+    margin-bottom: 1em;
+  }
+
+  .toc-content {
+    position: static;
+    left: auto;
+  }
+}
+
+fs-donut svg g text.value {
+  font-size: 40px;
+}
+
+fs-donut svg g text.units {
+  font-size: 20px;
+}
+
+.health-displays {
+  width: 100%;
+}
+
+.panel {
+  position: fixed;
+}
+
+.panel.bottom {
+  bottom: 0;
+}
+
+.deploy {
+  right: 0;
+}
+
+.profile-list-item:after {
+  content: ", ";
+}
+
+.profile-list-item:last-child:after {
+  content: " ";
+}
+
+.health-displays .health-display,
+.column-box,
+.column-box-variable,
+.column-box-square,
+.column-box-half-screen {
+  position: relative;
+  display: inline-block;
+  width: 300px;
+  height: 300px;
+  margin-left: 0;
+  margin-right: 0;
+  margin-bottom: 10px;
+  overflow: hidden;
+  vertical-align: top;
+}
+
+.column-box {
+  height: auto;
+  min-height: 175px;
+  width: 500px;
+}
+
+.wiki-icon-view {
+  min-height: 200px;
+}
+
+.wiki-icon-view .column-box {
+  min-height: 0;
+  margin-bottom: 25px;
+}
+
+.column-box-half-screen {
+  width: 50%;
+  min-width: auto;
+  height: auto;
+}
+
+.column-box-square {
+  height: 32px;
+  width: 32px;
+  line-height: 28px;
+  vertical-align: middle;
+  text-align: center;
+}
+
+.column-box-variable {
+  height: auto;
+  min-height: 175px;
+  width: auto;
+  min-width: 175px;
+  max-width: 500px;
+}
+
+.column-box-variable > h3 {
+  margin-bottom: 0;
+}
+
+.column-box .file-icon > * {
+  width: 100%;
+  height: auto;
+}
+
+.location-box {
+  margin: 12px;
+}
+
+.column-box-square > i {
+  font-size: 24px;
+  height: 24px;
+  vertical-align: middle;
+}
+
+.container-groups .column-box {
+  height: 125px;
+  width: auto;
+}
+
+.container-header-version,
+.container-header-version + hr {
+  margin-bottom: 0;
+}
+
+.container-header-version + hr {
+  margin-top: 0;
+}
+
+.container-groups .container-group-header {
+  border-bottom: none;
+}
+
+.column-row {
+  float: left;
+}
+
+.column-box-selected .column-box-header {
+  font-size: 150%;
+  font-weight: bold;
+}
+
+.column-box-icons > .span1 {
+  text-align: center;
+  vertical-align: middle;
+  width: 32px;
+}
+
+.column-box-icons i, 
+.column-box-icons img {
+  font-size: 32px;
+  width: 32px;
+}
+
+.ok-container > i {
+  font-size: 32px;
+  color: #a4a4a4;
+}
+
+.column-box > div {
+  position: relative;
+  height: 100%;
+  margin: 10px;
+}
+
+.column-box h3 {
+  text-overflow: ellipsis;
+  line-height: normal;
+  margin-bottom: 0;
+}
+
+.bottom-anchored {
+  position: absolute;
+  bottom: 0;
+  margin-top: -3em;
+}
+
+.label-list > li > .badge {
+  margin-top: 3px;
+  margin-bottom: 3px;
+}
+
+.label-list > .inline-block > .badge {
+  margin-left: 3px;
+  margin-right: 3px;
+}
+
+.health-details {
+  top: 0;
+  bottom: 0;
+  z-index: 40;
+}
+
+.health-status {
+  padding: 0;
+  position: absolute;
+  bottom: 0;
+  overflow: hidden;
+  left: 0;
+  right: 0;
+  z-index: 20;
+}
+
+.health-message-wrap {
+  margin: 0;
+  padding: 0;
+  width: 100%;
+  height: 100%;
+}
+
+.health-message {
+  display: block;
+  margin: 10px;
+}
+
+.health-details-toggle {
+  position: absolute;
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  right: 2px;
+  top: 0px;
+}
+
+.health-details-wrap {
+  width: 300px;
+  height: 300px;
+  overflow-y: auto;
+  overflow-x: hidden;
+}
+
+.health-details-wrap a {
+  color: #d4d4d4;
+}
+
+.health-details-wrap dl {
+  margin-top: 5px;
+  margin-bottom: 2px;
+  margin-left: 0;
+}
+
+.health-details-wrap table {
+  max-width: 300px;
+}
+
+.health-details-wrap table tr td {
+  vertical-align: middle;
+}
+
+.health-details-wrap table tr td:first-child {
+  font-weight: bold;
+  text-align: right;
+  padding-right: 5px;
+}
+
+.health-details-wrap table tr td:last-child {
+  padding-left: 5px;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+}
+
+.health-display-title {
+  padding-top: 18px;
+  font-size: 30px;
+  width: 100%;
+  height: 40px;
+  margin-top: 10px;
+  margin-bottom: 10px;
+  font-weight: bold;
+  text-align: center;
+}
+
+.health-display-title.ok {
+  background-color: lightgreen;
+}
+
+.health-display-title.warning {
+  background-color: darkorange;
+}
+
+.health-displays .health-display .health-chart {
+  width: 300px;
+  height: 300px;
+}
+
+.create-column {
+  vertical-align: top;
+  display: inline-block;
+  width: 445px;
+  margin-bottom: 10px;
+}
+
+#create-form {
+  max-width: 422px;
+}
+
+/* hack to work around strange tabset behavior */
+tabset > .tabbable > ul {
+  display: none;
+}
+/* end hack */
+
+tabset > .tabbable > .tab-content > .nav.nav-tabs > li {
+  cursor: pointer;
+}
+
+tabset > .tabbable > .tab-content > .nav.nav-tabs > li.active {
+  cursor: pointer;
+}
+
+tabset > .tabbable > .tab-content > .nav.nav-tabs > li.disabled {
+  opacity: 0.3;
+}
+
+.toast.toast-warning * {
+  color: black;
+}
+
+.hawtio-toc .panel-title {
+  padding: 0;
+  margin-top: 20px;
+  margin-bottom: 20px;
+}
+
+.hawtio-toc .panel-title a {
+  display: block;
+  text-align: center;
+  padding: 10px;
+}
+
+._jsPlumb_endpoint {
+  z-index: 25;
+}
+
+.panes {
+  position: relative;
+  display: block;
+  min-height: 100%;
+}
+
+.panes > .left-pane {
+  position: absolute;
+  left: 0;
+  right: 285px;
+  height: 100%;
+}
+
+.panes > .right-pane {
+  position: absolute;
+  right: 0;
+  width: 275px;
+  height: 100%;
+}
+
+.camel-viewport {
+  overflow: auto;
+  height: 100%;
+}
+
+.camel-canvas-endpoint svg circle {
+  fill: #346789;
+}
+
+.camel-props {
+  position: relative;
+  height: 100%;
+}
+
+.camel-props > .button-bar {
+  left: 0;
+  right: 0;
+  display: block;
+  position: absolute;
+}
+
+.button-bar > .centered > form {
+  margin-bottom: 10px;
+}
+
+.camel-props > .prop-viewport {
+  overflow-y: auto;
+  overflow-x: visible;
+  position: absolute;
+  bottom: 0;
+  top: 80px;
+  width: 100%;
+}
+
+.camel-props form > fieldset > legend {
+  font-size: medium;
+  font-weight: bold;
+  margin: 0;
+  line-height: 12px;
+  padding: 3px;
+}
+
+.endpoint-control > label {
+  font-size: medium;
+  font-weight: bold;
+  margin: 0;
+  line-height: 12px;
+  padding: 3px;
+}
+
+.endpoint-props > p {
+  font-size: medium;
+  font-weight: bold;
+  margin: 0;
+  margin-bottom: 25px;
+  line-height: 12px;
+  padding: 3px;
+}
+
+.endpoint-control > .controls {
+  margin-top: 15px;
+}
+
+.camel-props form fieldset .control-label {
+  float: none;
+  width: auto;
+  text-align: left;
+}
+
+.camel-props form fieldset .controls {
+  margin-left: auto;
+}
+
+.camel-props form fieldset .controls .input-xxlarge {
+  width: auto;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.camel-props form fieldset div[hawtio-form-array] > div > div > div > .controls.pull-right {
+  float: none;
+}
+
+.welcome {
+  margin-left: 5em;
+  margin-right: 5em;
+}
+
+input.ng-invalid-pattern {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+  -moz-box-shadow: 0 0 6px #f8b9b7;
+  box-shadow: 0 0 6px #f8b9b7;
+}
+
+input.ng-invalid-pattern:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+  -moz-box-shadow: 0 0 6px #f8b9b7;
+  box-shadow: 0 0 6px #f8b9b7;
+}
+
+.threads.logbar > .logbar-container {
+  margin-top: 2px;
+  margin-bottom: 5px;
+}
+
+.state-panel > ul > li:not(:first-child) > span {
+  margin-left: 15px;
+}
+
+.state-panel > ul > li.active {
+  font-weight: bold;
+}
+
+.runnable {
+  color: green;
+}
+
+.timed-waiting {
+  color: orange;
+}
+
+.waiting,
+.darkgray {
+  color: darkgray;
+}
+
+.blocked {
+  color: red;
+}
+
+strong.new,
+.lightgreen {
+  color: lightgreen;
+}
+
+.terminated,
+.darkred {
+  color: darkred;
+}
+
+.thread-state-indicator {
+  width: 100%;
+  height: 100%;
+  padding-top: 5px;
+}
+
+.monitor-indicator {
+  font-size: 10px;
+  padding: 4px;
+  margin: 5px;
+}
+
+.monitor-indicator.button {
+  cursor: pointer;
+}
+
+.monitor-indicator.true {
+  background: #1cd11d;
+  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 1px rgba(34, 203, 1, 0.49);
+}
+
+.monitor-indicator.false {
+  background: #737373;
+  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5);
+}
+
+.table-header {
+  color: black;
+  position: relative;
+}
+
+.table-header > .indicator:after {
+  font-family: 'FontAwesome';
+  position: absolute;
+  right: 5px;
+}
+
+.table-header.asc > .indicator:after {
+  content: "\f077";
+}
+
+.table-header.desc > .indicator:after {
+  content: "\f078";
+}
+
+.camel-tree > ul.nav {
+  margin-bottom: 3px !important;
+}
+
+.camel-tree > .section-filter {
+  margin: 0 0 8px;
+  display: block;
+}
+
+.table > thead > tr > th {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+th > .indicator:before {
+  display: inline-block;
+  content: "\00a0";
+  margin-left: 12px;
+}
+
+.simple-table-checkbox, 
+.simple-table-checkbox > input {
+  vertical-align: middle;
+  margin: 0;
+  width: 16px;
+  line-height: 16px;
+  max-width: 16px;
+}
+
+
+.table td,
+.table th {
+  vertical-align: middle;
+}
+
+.ngCellText .icon-replication-controller {
+  width: 32px;
+}
+
+.repository-browser-toolbar > .btn {
+  margin-bottom: 10px;
+}
+
+.bundle-list-toolbar {
+  vertical-align: top;
+}
+
+.bundle-list-toolbar > .pull-left > *,
+.bundle-list-toolbar > .pull-right > * {
+  display: inline-block;
+}
+
+.bundle-list-toolbar > div > input,
+.bundle-list-toolbar > div > div > input {
+  margin-bottom: 10px;
+}
+
+.bundle-list-toolbar > div > label,
+.bundle-list-toolbar > div > strong {
+  position: relative;
+  top: -3px;
+}
+
+.bundle-list-toolbar > div > .input-append {
+  position: relative;
+  left: 3px;
+  top: -9px;
+}
+
+.connect-column {
+  display: inline-block;
+  vertical-align: top;
+  width: 550px;
+}
+
+.icon-spacer:before {
+  content: '\00a0';
+  width: 11px;
+}
+
+.dropdown-menu {
+  padding-top: 0;
+  padding-bottom: 0;
+  margin-top: 0;
+  top: 100%;
+  left: 0;
+  right: 0;
+  border-radius: 0;
+}
+
+.main-nav-upper .dropdown-menu {
+  border-top: none;
+  margin-top: -1;
+  border-radius: 0;
+}
+
+.main-nav-lower .dropdown-menu {
+  border-top: none;
+}
+
+.dropdown-menu > li > a {
+  cursor: pointer;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+
+.dropdown.perspective-selector > .dropdown-menu {
+  min-width: 160px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.dropdown.perspective-selector .dropdown-menu > div {
+  display: block;
+}
+
+.dropdown.perspective-selector .dropdown-menu > div > p,
+.hawtio-dropdown p {
+  font-size: smaller;
+  padding-left: 3px;
+  padding-right: 3px;
+  margin-bottom: 0;
+}
+
+.nav .hawtio-dropdown {
+  margin-top: 2px;
+}
+
+.dropdown.perspective-selector .dropdown-menu > div > ul {
+  margin-top: 0;
+}
+
+.dropdown.perspective-selector .dropdown-menu > div > ul > li.clear-recent > a {
+  padding: 3px 5px;
+}
+
+.dropdown-menu > li:hover > a {
+  text-shadow:0px 0px 1px white;
+}
+
+.dropdown-menu:before {
+  display: none !important;
+}
+
+.dropdown-menu:after {
+  display: none !important;
+}
+
+.nav.nav-tabs li .hawtio-dropdown .dropdown-menu {
+  margin-top: 4px;
+  border-top: none;
+}
+
+span.hawtio-dropdown {
+  position: relative;
+  display: block;
+  cursor: pointer;
+}
+
+span.hawtio-dropdown .dropdown-menu {
+  width: auto;
+}
+
+.btn .hawtio-dropdown > .caret {
+  width: 7px;
+}
+
+.btn .hawtio-dropdown > .dropdown-menu {
+  left: -10px;
+  margin-top: 5px;
+  text-align: left;
+}
+
+.submenu-caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+}
+
+.submenu-caret:before {
+  font-family: 'FontAwesome';
+  border: 0;
+  content: "\f054";
+  font-size: 11px;
+  display: block;
+}
+
+.hawtio-dropdown > ul > li {
+  padding: 3px;
+  padding-left: 5px;
+}
+
+.hawtio-dropdown > ul > li > .menu-item {
+  position: relative;
+  display: block;
+}
+
+.hawtio-dropdown > .submenu-caret:before,
+.hawtio-dropdown > ul > li > .menu-item > .submenu-caret:before {
+  position: absolute;
+  top: 0;
+  right: -2px;
+}
+
+.dropdown-menu .sub-menu {
+  position: absolute;
+  left: 195px;
+  top: -8px;
+}
+
+.hawtio-breadcrumb > li {
+  display: inline-block;
+}
+
+.dropdown-menu .dropdown .caret {
+  display: none;
+}
+
+.hawtio-breadcrumb .caret {
+  border: 0;
+  width: 17px;
+  margin-right: 2px;
+  margin-left: 0;
+}
+
+.hawtio-breadcrumb .caret:before {
+  font-family: 'FontAwesome';
+  content: "\F105";
+  font-size: 40px;
+  top: -9px;
+}
+/*
+.modal {
+  z-index: 5000;
+  width: 660px;
+  margin: -250px 0 0 -320px;
+}
+.modal-backdrop {
+  z-index: 4090;
+}
+*/
+.scrollable-section {
+  overflow-x: hidden;
+  overflow-y: auto;
+  max-height: 260px;
+}
+
+.component {
+  opacity: 0.8;
+  filter: alpha(opacity = 80);
+}
+
+.window,
+.node > rect {
+  stroke-width: 2px;
+  stroke: #346789;
+  fill: url(#rect-gradient);
+  border: 2px solid #346789;
+  z-index: 20;
+  position: absolute;
+  font-size: 0.8em;
+  filter: alpha(opacity = 80);
+  cursor: move;
+
+  box-shadow: 2px 2px 19px #e0e0e0;
+  -o-box-shadow: 2px 2px 19px #e0e0e0;
+  -webkit-box-shadow: 2px 2px 19px #e0e0e0;
+  -moz-box-shadow: 2px 2px 19px #e0e0e0;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  background-color: lightgrey;
+  fill: lightgrey;
+}
+
+.window,
+.node.selected > rect {
+    stroke-width: 2px;
+    stroke-dasharray: 10,5;
+    stroke: red;
+}
+
+.window-inner {
+  position: relative;
+  border-radius: 2px;
+}
+
+.window-inner {
+  padding: 6px;
+}
+
+.window-inner.from,
+.node > .from {
+  background-color: lightsteelblue;
+  fill: lightsteelblue;
+}
+
+.window-inner.choice,
+.node > .choice {
+  background-color: lightblue;
+  fill: lightblue;
+}
+
+.window-inner.when,
+.node > .when {
+  background-color: lightgreen;
+  fill: lightgreen;
+}
+
+.window-inner.otherwise,
+.node > .otherwise {
+  background-color: lightgreen;
+  fill: lightgreen;
+}
+
+.window-inner.to,
+.node > .to {
+  background-color: lightsteelblue;
+  fill: lightsteelblue;
+}
+
+.window-inner.log,
+.node > .log {
+  background-color: lightcyan;
+  fill: lightcyan;
+}
+
+.window-inner.setBody,
+.node > .setBody {
+  background-color: #d3d3d3;
+  fill: #d3d3d3;
+}
+
+.window-inner.onException,
+.node > .onException {
+  background-color: lightpink;
+  fill: lightpink;
+}
+
+.window-inner.delay,
+.node > .delay {
+  background-color: lightgrey;
+  fill: lightgrey;
+}
+
+.window-inner.bean,
+.node > .bean {
+  background-color: mediumaquamarine;
+  fill: mediumaquamarine;
+}
+
+.window-inner > * {
+  vertical-align: middle;
+}
+
+.window-inner > span {
+  max-width: 15em;
+  display: inline-block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+
+.window:hover {
+  border-color: #5d94a6;
+  background-color: #ffffa0;
+}
+
+.window:hover > .window-inner {
+  background: inherit;
+}
+
+.window.selected {
+  background-color: #f0f0a0;
+}
+
+.window.selected > .window-inner {
+  background: inherit;
+}
+
+img.nodeIcon {
+  width: 24px !important;
+  height: 24px !important;
+  cursor: crosshair;
+  margin-right: 10px;
+}
+
+img.nodeIcon:hover {
+  opacity: 0.6;
+  box-shadow: 2px 2px 19px #a0a0a0;
+  background-color: #a0a0a0;
+}
+
+.l1 {
+  font-size: 13px;
+}
+
+._jsPlumb_connector {
+  z-index: 4;
+}
+
+._jsPlumb_overlay {
+  z-index: 6;
+}
+
+.hl {
+  border: 3px solid red;
+}
+
+.strong {
+  font-weight: bold;
+}
+
+.discovery > li {
+  position: relative;
+}
+
+.discovery > li > div {
+  vertical-align: middle;
+}
+
+.discovery > li > div:first-child {
+  margin-right: 10px;
+}
+
+.discovery > li > div:last-child,
+.discovery > li > .lock {
+  position: absolute;
+  width: 32px;
+  height: 32px;
+  margin: auto;
+  top: 0;
+  bottom: 0;
+  right: 10px;
+}
+
+.discovery > li > .lock {
+  right: 42px;
+}
+
+.discovery > li > div:last-child > div.connect-button {
+  width: 32px;
+  height: 32px;
+}
+
+.discovery > li > div:last-child > div > i,
+.discovery > li > .lock > i {
+  font-size: 32px;
+  cursor: pointer;
+}
+
+.discovery > li > .lock > i {
+  cursor: inherit;
+}
+
+.discovery > li > div:first-child > img {
+  vertical-align: middle;
+  width: 64px;
+  max-height: 64px;
+}
+
+.auth-form {
+  white-space: nowrap;
+}
+
+.auth-form > form > input {
+  margin-bottom: 0;
+}
+
+.slideout-body .btn-group,
+.btn-group[hawtio-pager] {
+  line-height: normal;
+}
+
+@media print {
+  #main-nav,
+  #log-panel {
+    display: none !important;
+    height: 0 !important;
+  }
+
+  .wiki-grid {
+    display: none;
+  }
+
+  .wiki-fixed {
+    margin-top: 0 !important;
+  }
+
+  .wiki-fixed > .row-fluid > .span3 {
+    display: none;
+  }
+
+  .wiki-fixed > .row-fluid > .span9 {
+    width: 100%;
+  }
+
+  .instance-name {
+    display: none !important;
+  }
+
+  .logbar-container > .nav {
+    display: none !important;
+    height: 0 !important;
+  }
+
+}
+
+.prefs {
+  height: 100%;
+  margin: 0;
+}
+
+.prefs > div {
+  height: 100%;
+  margin: 0;
+}
+
+.slideout-body .prefs {
+  overflow: hidden;
+  margin: 0;
+}
+
+.slideout-body .prefs .tabbable {
+  position: relative;
+  height: 100%;
+  margin: 0;
+}
+
+.pref-slideout > div > div > div {
+  height: 100%;
+  margin: 0;
+}
+
+.pref-slideout .slideout-body {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0px;
+  right: 0;
+  overflow: none !important;
+  margin: 0 !important;
+}
+
+.slideout-body .prefs .nav.nav-tabs {
+  top: 5px;
+  bottom: 5px;
+  left: 0;
+  width: 130px;
+  position: absolute;
+  margin: 0;
+  overflow-y: auto;
+}
+
+.slideout-body .prefs .nav.nav-tabs:after,
+.slideout-body .prefs .nav.nav-tabs:before {
+  display: none;
+}
+
+.slideout-body .prefs .nav.nav-tabs li {
+  display: block;
+  float: none;
+}
+
+.slideout-body .prefs .tab-content {
+  position: absolute;
+  overflow: auto;
+  top: 5px;
+  left: 140px;
+  right: 15px;
+  bottom: 5px;
+  margin: 0;
+}
+
+.help-header .without-text,
+.about-header .without-text {
+  position: relative;
+  top: -4px;
+  vertical-align: middle;    
+  height: 48px;
+}
+
+.help-header .with-text,
+.about-header .with-text {
+  position: relative;
+  top: -4px;
+  vertical-align: middle;
+  height: 48px;
+}
+
+.service-list > li {
+  list-style-type: none;
+  display: inline-block;
+  margin-left: 3px;
+  margin-right: 3px;
+  vertical-align: middle;
+}
+
+.container-type {
+  width: 16px;
+}
+
+.container-status > i:before,
+.container-type i:before,
+.container-type img {
+  vertical-align: middle;
+  font-size: 16px;
+  height: 16px;
+  width: auto;
+  line-height: 16px;
+}
+
+.container-type img.girthy {
+  height: auto;
+  width: 16px;
+}
+
+.app-logo {
+  width: 64px;
+  margin-right: 10px;
+}
+
+.app-logo img,
+.app-logo i {
+  vertical-align: middle;
+  font-size: 64px;
+  height: 64px;
+  width: auto;
+  line-height: 64px;
+}
+
+.app-logo img.girthy {
+  height: auto;
+  width: 64px;
+}
+
+.service-list i:before,
+.service-list img {
+  height: 16px;
+  width: auto;
+  font-size: 16px;
+  vertical-align: middle;
+}
+
+.service-list img.girthy {
+  height: auto;
+  width: 16px;
+}
+
+.perspective-selector img {
+  width: auto;
+  height: 16px;
+  vertical-align: top;
+}
+
+.operation-row {
+  position: relative;
+  height: 30px;
+  vertical-align: middle;
+}
+
+.operation-row.can-invoke {
+  cursor: pointer;
+}
+
+.operation-row.cant-invoke {
+  cursor: not-allowed;
+}
+
+.operation-row > * {
+  display: inline-block;
+  height: 100%;
+  line-height: 30px;
+}
+
+.operation-actions {
+  position: absolute;
+  right: 6px;
+  top: 4px;
+}
+
+.help-block:empty {
+  margin-top: 10px;
+}
+
+ul.dynatree-container {
+  overflow: visible;
+}
+
+.pane {
+  position: fixed;
+  bottom: 0;
+  top: 70px;
+  height: auto;
+  width: 300px;
+}
+
+.pane > .pane-wrapper {
+  position: relative;
+  height: 100%;
+  width: 100%;
+  overflow: hidden;
+}
+
+.pane-viewport {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  overflow: auto;
+  margin-right: 10px;
+}
+
+.pane-content {
+  width: auto;
+  height: auto;
+}
+
+.pane-bar {
+  position: absolute;
+  top: 0;
+  right: 0;
+  width: 5px;
+  cursor: ew-resize;
+  height: 100%;
+}
+
+.pane-content {
+  float: none;
+  position: static;
+}
+
+.pane.left {
+  left: 0;
+  z-index: 39;
+}
+
+.pane.left .pane-viewport {
+  margin-left: 10px;
+  right: 5px;
+  margin-right: 0;
+}
+
+.pane.left .pane-bar {
+  right: 0;
+}
+
+.pane.right {
+  right: 0;
+}
+
+.pane.right .pane-viewport {
+  margin-left: 10px;
+  margin-right: 5px;
+  right: 5px;
+}
+
+.pane.right .pane-bar {
+  left: 0;
+}
+
+.pane-header-wrapper {
+  margin-left: 10px;
+  margin-right: 10px;
+}
+
+.tree-header {
+  position: relative;
+  height: 26px;
+}
+
+.fabric-app-view-header {
+  height: auto;
+}
+
+.fabric-app-view-header > * {
+  line-height: 12px;
+}
+
+.fabric-app-view-header .alert {
+  margin-bottom: 0;
+}
+
+.fabric-app-view-header .row-fluid:last-child {
+  padding-bottom: 8px;
+}
+
+.tree-header > .left,
+.tree-header > .right {
+  position: absolute;
+  top: 3px;
+  bottom: 6px;
+  vertical-align: middle;
+  line-height: 10px;
+}
+
+.tree-header > .left {
+  left: 0;
+}
+
+.tree-header > .right {
+  right: 10px;
+}
+
+.camel.tree-header {
+  height: 42px;
+}
+
+.camel.tree-header > .left {
+  right: 94px;
+}
+
+.camel.tree-header > .left,
+.camel.tree-header > .right {
+  top: 6px;
+  line-height: 30px;
+}
+
+
+.camel.tree-header > .left > .section-filter {
+  width: 100%;
+}
+
+.camel.tree-header > .left > .section-filter > .search-query {
+  width: 100%;
+  margin-bottom: 10px;
+}
+
+.camel.tree-header > .left > .section-filter > .icon-remove {
+  right: -16px;
+}
+
+.attributes-wrapper {
+  width: 100%;
+  overflow: auto;
+}
+
+.separator {
+  padding-top: 4px;
+  display: inline-block;
+}
+
+.grid-block,
+.health-display {
+  border: 1px solid #00f;
+}
+
+.widget-title {
+  border-bottom: 1px solid #00f;
+}
+
+.container-group-header {
+  vertical-align: middle;
+  line-height: 18px;
+  font-weight: bold;
+  padding: 4px;
+  margin-top: 10px;
+}
+
+.search-query.has-text {
+  background: #55ddff;
+  color: #333333;
+}
+
+.dataTables_filter input {
+    border-radius: 15px
+}
+
+.config-admin-form .form-horizontal .control-label {
+    width: 260px;
+}
+.config-admin-form .form-horizontal .controls {
+    margin-left: 280px;
+}
+
+.new-config-name-form {
+    margin-top: 30px;
+}
+
+.td-fixed-width-150 {
+  white-space: normal;
+  width: 150px;
+}
+
+.pod-label {
+  margin-right: 1em;
+}
+
+td > ul {
+  margin-bottom: 0px;
+}
+
+td > .zebra-list > li {
+  padding: 2px;
+}
+
+ul.nav select {
+  margin-bottom: 0px;
+  height: 25px;
+}
+
+/* ENTESB-2249: fixing bootstrap forms with tooltips */
+.form-horizontal input + div + .help-block,
+.form-horizontal select + div + .help-block,
+.form-horizontal textarea + div + .help-block {
+  margin-top: 10px;
+}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/data/places1.json
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/data/places1.json b/console/stand-alone/plugin/data/places1.json
new file mode 100644
index 0000000..d1942c8
--- /dev/null
+++ b/console/stand-alone/plugin/data/places1.json
@@ -0,0 +1,13 @@
+{
+"type": "FeatureCollection",
+                                                                                
+"features": [
+{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Boston", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Boston", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 1.000000, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "Massachusetts", "ISO_A2": "US", "NOTE": null, "LATITUDE": 42.329960, "LONGITUDE": -71.070014, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 4467000, "POP_MIN": 589141, "POP_OTHER": 2238083, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 4930956.000000, "MEGANAME": "Boston", "LS_NAME": "Boston", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2338688.000000, "MAX_POP20": 2663082.000000, "MAX_POP50": 4880817.000000, "MAX_POP300": 4880817.000000, "MAX_POP310": 4880817.000000, "MAX_NATSCA": 300.000000, "MIN_AREAKM": 1365.000000, "MAX_AREAKM": 3880.000000, "MIN_AR
 EAMI": 527.000000, "MAX_AREAMI": 1498.000000, "MIN_PERKM": 1077.000000, "MAX_PERKM": 3538.000000, "MIN_PERMI": 669.000000, "MAX_PERMI": 2199.000000, "MIN_BBXMIN": -71.675000, "MAX_BBXMIN": -71.433881, "MIN_BBXMAX": -70.658333, "MAX_BBXMAX": -70.658333, "MIN_BBYMIN": 41.533333, "MAX_BBYMIN": 42.008333, "MIN_BBYMAX": 42.554143, "MAX_BBYMAX": 43.075000, "MEAN_BBXC": -71.177127, "MEAN_BBYC": 42.277571, "COMPARE": 0, "GN_ASCII": "Boston", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 0.000000, "GN_POP": 589141.000000, "ELEVATION": 13.000000, "GTOPO30": 11.000000, "TIMEZONE": "America\/New_York", "GEONAMESNO": "GeoNames match general.", "UN_FID": 527, "UN_ADM0": "United States of America", "UN_LAT": 42.370000, "UN_LONG": -71.100000, "POP1950": 2551.000000, "POP1955": 2680.000000, "POP1960": 2818.000000, "POP1965": 3000.000000, "POP1970": 3187.000000, "POP1975": 3233.000000, "POP1980": 3281.000000, "POP1985": 3349.000000, "POP1990": 3428.000000, "POP1995": 3726.000000, "POP2000": 
 4049.000000, "POP2005": 4364.000000, "POP2010": 4467.000000, "POP2015": 4597.000000, "POP2020": 4774.000000, "POP2025": 4919.000000, "POP2050": 5032.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -71.071959532186838, 42.331906001702293 ] } },
+{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital alt", "NAME": "Tel Aviv-Yafo", "NAMEPAR": null, "NAMEALT": "Tel Aviv-Jaffa", "DIFFASCII": 0, "NAMEASCII": "Tel Aviv-Yafo", "ADM0CAP": 0.000000, "CAPALT": 1.000000, "CAPIN": "While Jerulsale", "WORLDCITY": 0.000000, "MEGACITY": 1, "SOV0NAME": "Israel", "SOV_A3": "IS1", "ADM0NAME": "Israel", "ADM0_A3": "ISR", "ADM1NAME": "Tel Aviv", "ISO_A2": "IL", "NOTE": null, "LATITUDE": 32.079991, "LONGITUDE": 34.770012, "CHANGED": 4.000000, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 3112000, "POP_MIN": 378358, "POP_OTHER": 2306851, "RANK_MAX": 12, "RANK_MIN": 10, "GEONAMEID": 293394.000000, "MEGANAME": "Tel Aviv-Yafo", "LS_NAME": "Tel Aviv-Yafo", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2324568.000000, "MAX_POP20": 2324568.000000, "MAX_POP50": 2324568.000000, "MAX_POP300": 0.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 50.000000, "MIN_AREAKM": 436.000000, "MAX_A
 REAKM": 436.000000, "MIN_AREAMI": 168.000000, "MAX_AREAMI": 168.000000, "MIN_PERKM": 386.000000, "MAX_PERKM": 386.000000, "MIN_PERMI": 240.000000, "MAX_PERMI": 240.000000, "MIN_BBXMIN": 34.716667, "MAX_BBXMIN": 34.716667, "MIN_BBXMAX": 34.958333, "MAX_BBXMAX": 34.958333, "MIN_BBYMIN": 31.850000, "MAX_BBYMIN": 31.850000, "MIN_BBYMAX": 32.208333, "MAX_BBYMAX": 32.208333, "MEAN_BBXC": 34.836735, "MEAN_BBYC": 32.030266, "COMPARE": 0, "GN_ASCII": "Tel Aviv-Yafo", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 5.000000, "GN_POP": 378358.000000, "ELEVATION": 0.000000, "GTOPO30": -9999.000000, "TIMEZONE": "Asia\/Jerusalem", "GEONAMESNO": "GeoNames match general.", "UN_FID": 304, "UN_ADM0": "Israel", "UN_LAT": 32.040000, "UN_LONG": 34.760000, "POP1950": 418.000000, "POP1955": 556.000000, "POP1960": 738.000000, "POP1965": 882.000000, "POP1970": 1029.000000, "POP1975": 1206.000000, "POP1980": 1416.000000, "POP1985": 1681.000000, "POP1990": 2026.000000, "POP1995": 2442.000000, "POP2000":
  2752.000000, "POP2005": 3012.000000, "POP2010": 3112.000000, "POP2015": 3256.000000, "POP2020": 3453.000000, "POP2025": 3600.000000, "POP2050": 3726.000000, "CITYALT": "Tel Aviv-Jaffa" }, "geometry": { "type": "Point", "coordinates": [ 34.768065899551743, 32.081937333041651 ] } },
+{ "type": "Feature", "properties": { "SCALERANK": 7, "NATSCALE": 20, "LABELRANK": 7, "FEATURECLA": "Admin-1 capital", "NAME": "Brno", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Brno", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 0.000000, "MEGACITY": 0, "SOV0NAME": "Czech Republic", "SOV_A3": "CZE", "ADM0NAME": "Czech Republic", "ADM0_A3": "CZE", "ADM1NAME": "Kraj Vysocina", "ISO_A2": "CZ", "NOTE": null, "LATITUDE": 49.200393, "LONGITUDE": 16.609983, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 388277, "POP_MIN": 369559, "POP_OTHER": 380022, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 3078610.000000, "MEGANAME": null, "LS_NAME": "Brno", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 388277.000000, "MAX_POP20": 388277.000000, "MAX_POP50": 0.000000, "MAX_POP300": 0.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 20.000000, "MIN_AREAKM": 141.000000, "MAX_AREAKM": 141.000000, "MIN_AREAMI": 54.000000, "MAX_AREAMI": 54.000000, "MI
 N_PERKM": 149.000000, "MAX_PERKM": 149.000000, "MIN_PERMI": 92.000000, "MAX_PERMI": 92.000000, "MIN_BBXMIN": 16.483333, "MAX_BBXMIN": 16.483333, "MIN_BBXMAX": 16.708333, "MAX_BBXMAX": 16.708333, "MIN_BBYMIN": 49.116667, "MAX_BBYMIN": 49.116667, "MIN_BBYMAX": 49.300000, "MAX_BBYMAX": 49.300000, "MEAN_BBXC": 16.601967, "MEAN_BBYC": 49.196167, "COMPARE": 0, "GN_ASCII": "Brno", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 78.000000, "GN_POP": 369559.000000, "ELEVATION": 0.000000, "GTOPO30": 226.000000, "TIMEZONE": "Europe\/Prague", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_ADM0": null, "UN_LAT": 0.000000, "UN_LONG": 0.000000, "POP1950": 0.000000, "POP1955": 0.000000, "POP1960": 0.000000, "POP1965": 0.000000, "POP1970": 0.000000, "POP1975": 0.000000, "POP1980": 0.000000, "POP1985": 0.000000, "POP1990": 0.000000, "POP1995": 0.000000, "POP2000": 0.000000, "POP2005": 0.000000, "POP2010": 0.000000, "POP2015": 0.000000, "POP2020": 0.000000, "POP2025": 0.000000, "POP2
 050": 0.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ 16.60998327501909, 49.200393492726221 ] } },
+{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 2, "FEATURECLA": "Admin-1 capital", "NAME": "Toronto", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Toronto", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 1.000000, "MEGACITY": 1, "SOV0NAME": "Canada", "SOV_A3": "CAN", "ADM0NAME": "Canada", "ADM0_A3": "CAN", "ADM1NAME": "Ontario", "ISO_A2": "CA", "NOTE": null, "LATITUDE": 43.699980, "LONGITUDE": -79.420021, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 5213000, "POP_MIN": 3934421, "POP_OTHER": 3749229, "RANK_MAX": 13, "RANK_MIN": 12, "GEONAMEID": 6167865.000000, "MEGANAME": "Toronto", "LS_NAME": "Toronto", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 3934421.000000, "MAX_POP20": 4377344.000000, "MAX_POP50": 5190755.000000, "MAX_POP300": 5190755.000000, "MAX_POP310": 5190755.000000, "MAX_NATSCA": 300.000000, "MIN_AREAKM": 1432.000000, "MAX_AREAKM": 2286.000000, "MIN_AREAMI": 553.000000, "MAX_AR
 EAMI": 883.000000, "MIN_PERKM": 464.000000, "MAX_PERKM": 1161.000000, "MIN_PERMI": 289.000000, "MAX_PERMI": 721.000000, "MIN_BBXMIN": -80.008333, "MAX_BBXMIN": -79.806554, "MIN_BBXMAX": -79.130272, "MAX_BBXMAX": -78.608333, "MIN_BBYMIN": 43.141667, "MAX_BBYMIN": 43.475000, "MIN_BBYMAX": 44.090162, "MAX_BBYMAX": 44.125000, "MEAN_BBXC": -79.464213, "MEAN_BBYC": 43.712937, "COMPARE": 0, "GN_ASCII": "Toronto", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 8.000000, "GN_POP": 4612191.000000, "ELEVATION": 0.000000, "GTOPO30": 173.000000, "TIMEZONE": "America\/Toronto", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 14, "UN_ADM0": "Canada", "UN_LAT": 43.720000, "UN_LONG": -79.410000, "POP1950": 1068.000000, "POP1955": 1365.000000, "POP1960": 1744.000000, "POP1965": 2093.000000, "POP1970": 2535.000000, "POP1975": 2770.000000, "POP1980": 3008.000000, "POP1985": 3355.000000, "POP1990": 3807.000000, "POP1995": 4197.000000, "POP2000": 4607.000000, "POP2005": 5
 035.000000, "POP2010": 5213.000000, "POP2015": 5447.000000, "POP2020": 5687.000000, "POP2025": 5827.000000, "POP2050": 5946.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -79.421966652988431, 43.701925736408441 ] } },
+{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Admin-0 capital", "NAME": "Beijing", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Beijing", "ADM0CAP": 1.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 1.000000, "MEGACITY": 1, "SOV0NAME": "China", "SOV_A3": "CHN", "ADM0NAME": "China", "ADM0_A3": "CHN", "ADM1NAME": "Beijing", "ISO_A2": "CN", "NOTE": null, "LATITUDE": 39.928892, "LONGITUDE": 116.388286, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 11106000, "POP_MIN": 7480601, "POP_OTHER": 9033231, "RANK_MAX": 14, "RANK_MIN": 13, "GEONAMEID": 1816670.000000, "MEGANAME": "Beijing", "LS_NAME": "Beijing", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 10190861.000000, "MAX_POP20": 11120470.000000, "MAX_POP50": 16510327.000000, "MAX_POP300": 23647944.000000, "MAX_POP310": 137121250.000000, "MAX_NATSCA": 300.000000, "MIN_AREAKM": 2512.000000, "MAX_AREAKM": 118844.000000, "MIN_AREAMI": 970.000000, 
 "MAX_AREAMI": 45886.000000, "MIN_PERKM": 1837.000000, "MAX_PERKM": 93615.000000, "MIN_PERMI": 1141.000000, "MAX_PERMI": 58169.000000, "MIN_BBXMIN": 111.441667, "MAX_BBXMIN": 116.058333, "MIN_BBXMAX": 117.208333, "MAX_BBXMAX": 117.325000, "MIN_BBYMIN": 31.883333, "MAX_BBYMIN": 39.658333, "MIN_BBYMAX": 40.433333, "MAX_BBYMAX": 40.466667, "MEAN_BBXC": 115.929521, "MEAN_BBYC": 38.837783, "COMPARE": 0, "GN_ASCII": "Beijing", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 22.000000, "GN_POP": 7480601.000000, "ELEVATION": 0.000000, "GTOPO30": 63.000000, "TIMEZONE": "Asia\/Harbin", "GEONAMESNO": "GeoNames match general.", "UN_FID": 24, "UN_ADM0": "China", "UN_LAT": 39.900000, "UN_LONG": 116.380000, "POP1950": 4331.000000, "POP1955": 4628.000000, "POP1960": 4945.000000, "POP1965": 5284.000000, "POP1970": 5646.000000, "POP1975": 6034.000000, "POP1980": 6448.000000, "POP1985": 6890.000000, "POP1990": 7362.000000, "POP1995": 8486.000000, "POP2000": 9782.000000, "POP2005": 10717.000000, 
 "POP2010": 11106.000000, "POP2015": 11741.000000, "POP2020": 12842.000000, "POP2025": 13807.000000, "POP2050": 14545.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ 116.386339825659434, 39.930838089909059 ] } },
+{ "type": "Feature", "properties": { "SCALERANK": 4, "NATSCALE": 50, "LABELRANK": 1, "FEATURECLA": "Populated place", "NAME": "Ashburn", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Ashburn", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 0.000000, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "Maryland", "ISO_A2": "US", "NOTE": null, "LATITUDE": 39.299990, "LONGITUDE": -76.619985, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 2255000, "POP_MIN": 610892, "POP_OTHER": 1689307, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 4347778.000000, "MEGANAME": "Ashburn", "LS_NAME": "Ashburn", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1776808.000000, "MAX_POP20": 1912760.000000, "MAX_POP50": 1912760.000000, "MAX_POP300": 0.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 50.000000, "MIN_AREAKM": 1079.000000, "MAX_AREAKM": 1256.000000, "MIN_AREAMI": 417.0000
 00, "MAX_AREAMI": 485.000000, "MIN_PERKM": 645.000000, "MAX_PERKM": 832.000000, "MIN_PERMI": 401.000000, "MAX_PERMI": 517.000000, "MIN_BBXMIN": -76.934897, "MAX_BBXMIN": -76.934897, "MIN_BBXMAX": -76.400000, "MAX_BBXMAX": -76.400000, "MIN_BBYMIN": 38.975000, "MAX_BBYMIN": 39.075599, "MIN_BBYMAX": 39.533333, "MAX_BBYMAX": 39.533333, "MEAN_BBXC": -76.655503, "MEAN_BBYC": 39.269123, "COMPARE": 0, "GN_ASCII": "Ashburn", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0.000000, "GN_POP": 610892.000000, "ELEVATION": 10.000000, "GTOPO30": 2.000000, "TIMEZONE": "America\/New_York", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 526, "UN_ADM0": "United States of America", "UN_LAT": 39.320000, "UN_LONG": -76.610000, "POP1950": 1168.000000, "POP1955": 1290.000000, "POP1960": 1422.000000, "POP1965": 1486.000000, "POP1970": 1555.000000, "POP1975": 1650.000000, "POP1980": 1749.000000, "POP1985": 1797.000000, "POP1990": 1849.000000, "POP1995": 1962.000000, "POP2000
 ": 2083.000000, "POP2005": 2207.000000, "POP2010": 2255.000000, "POP2015": 2322.000000, "POP2020": 2422.000000, "POP2025": 2508.000000, "POP2050": 2578.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -76.621930845685483, 39.301935908916732 ] } },
+{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Raleigh", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Raleigh", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 0.000000, "MEGACITY": 0, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "North Carolina", "ISO_A2": "US", "NOTE": null, "LATITUDE": 35.818781, "LONGITUDE": -78.644693, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 1163515, "POP_MIN": 416468, "POP_OTHER": 656353, "RANK_MAX": 12, "RANK_MIN": 10, "GEONAMEID": 4487042.000000, "MEGANAME": null, "LS_NAME": "Raleigh", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 672592.000000, "MAX_POP20": 686323.000000, "MAX_POP50": 686323.000000, "MAX_POP300": 686323.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 100.000000, "MIN_AREAKM": 665.000000, "MAX_AREAKM": 691.000000, "MIN_AREAMI": 257.00
 0000, "MAX_AREAMI": 267.000000, "MIN_PERKM": 520.000000, "MAX_PERKM": 553.000000, "MIN_PERMI": 323.000000, "MAX_PERMI": 344.000000, "MIN_BBXMIN": -78.916667, "MAX_BBXMIN": -78.903728, "MIN_BBXMAX": -78.458333, "MAX_BBXMAX": -78.458333, "MIN_BBYMIN": 35.625000, "MAX_BBYMIN": 35.625000, "MIN_BBYMAX": 36.000000, "MAX_BBYMAX": 36.000000, "MEAN_BBXC": -78.682861, "MEAN_BBYC": 35.811316, "COMPARE": 0, "GN_ASCII": "Raleigh", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 0.000000, "GN_POP": 276093.000000, "ELEVATION": 96.000000, "GTOPO30": 91.000000, "TIMEZONE": "America\/New_York", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_ADM0": null, "UN_LAT": 0.000000, "UN_LONG": 0.000000, "POP1950": 0.000000, "POP1955": 0.000000, "POP1960": 0.000000, "POP1965": 0.000000, "POP1970": 0.000000, "POP1975": 0.000000, "POP1980": 0.000000, "POP1985": 0.000000, "POP1990": 0.000000, "POP1995": 0.000000, "POP2000": 0.000000, "POP2005": 0.000000, "POP2010": 0.000000, "POP2015": 0.000000, 
 "POP2020": 0.000000, "POP2025": 0.000000, "POP2050": 0.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -78.644693442484481, 35.818781350745724 ] } }
+]
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[10/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/lib/rhea.js
----------------------------------------------------------------------
diff --git a/console/plugin/lib/rhea.js b/console/plugin/lib/rhea.js
deleted file mode 100644
index fa323a3..0000000
--- a/console/plugin/lib/rhea.js
+++ /dev/null
@@ -1,7716 +0,0 @@
-require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-(function (process,Buffer){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed 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.
- */
-'use strict';
-
-var frames = require('./frames.js');
-var log = require('./log.js');
-var sasl = require('./sasl.js');
-var types = require('./types.js');
-var util = require('./util.js');
-var EndpointState = require('./endpoint.js');
-var Session = require('./session.js');
-var Transport = require('./transport.js');
-
-var net = require("net");
-var tls = require("tls");
-var EventEmitter = require('events').EventEmitter;
-
-var AMQP_PROTOCOL_ID = 0x00;
-var TLS_PROTOCOL_ID = 0x02;
-
-function get_socket_id(socket) {
-    if (socket.get_id_string) return socket.get_id_string();
-    return socket.localAddress + ':' + socket.localPort + ' -> ' + socket.remoteAddress + ':' + socket.remotePort;
-};
-
-function session_per_connection(conn) {
-    var ssn = null;
-    return {
-        'get_session' : function () {
-            if (!ssn) {
-                ssn = conn.create_session();
-                ssn.begin();
-            }
-            return ssn;
-        }
-    };
-};
-
-function restrict(count, f) {
-    if (count) {
-        var current = count;
-        var reset;
-        return function (successful_attempts) {
-            if (reset !== successful_attempts) {
-                current = count;
-                reset = successful_attempts;
-            }
-            if (current--) return f(successful_attempts);
-            else return -1;
-        };
-    } else {
-        return f;
-    }
-}
-
-function backoff(initial, max) {
-    var delay = initial;
-    var reset;
-    return function (successful_attempts) {
-        if (reset !== successful_attempts) {
-            delay = initial;
-            reset = successful_attempts;
-        }
-        var current = delay;
-        var next = delay*2;
-        delay = max > next ? next : max;
-        return current;
-    };
-}
-
-function get_connect_fn(options) {
-    if (options.transport === undefined || options.transport === 'tcp') {
-        return net.connect;
-    } else if (options.transport === 'tls' || options.transport === 'ssl') {
-        return tls.connect;
-    } else {
-        throw Error('Unrecognised transport: ' + options.transport);
-    }
-}
-
-function connection_details(options) {
-    var details = {};
-    details.connect = options.connect ? options.connect : get_connect_fn(options);
-    details.host = options.host ? options.host : 'localhost';
-    details.port = options.port ? options.port : 5672;
-    details.options = options;
-    return details;
-};
-
-var conn_counter = 1;
-
-var Connection = function (options, container) {
-    this.options = {};
-    if (options) {
-        for (var k in options) {
-            this.options[k] = options[k];
-        }
-    }
-    this.container = container;
-    if (!this.options.id) {
-        this.options.id = 'connection-' + conn_counter++;
-    }
-    if (!this.options.container_id) {
-        this.options.container_id = container ? container.id : util.generate_uuid();
-    }
-    if (!this.options.connection_details) {
-        var self = this;
-        this.options.connection_details = function() { return connection_details(self.options); };
-    }
-    var reconnect = this.get_option('reconnect', true);
-    if (typeof reconnect === 'boolean' && reconnect) {
-        var initial = this.get_option('initial_reconnect_delay', 100);
-        var max = this.get_option('max_reconnect_delay', 60000);
-        this.options.reconnect = restrict(this.get_option('reconnect_limit'), backoff(initial, max));
-    } else if (typeof reconnect === 'number') {
-        var fixed = this.options.reconnect
-        this.options.reconnect = restrict(this.get_option('reconnect_limit'), function () { return fixed; });
-    }
-    this.registered = false;
-    this.state = new EndpointState();
-    this.local_channel_map = {};
-    this.remote_channel_map = {};
-    this.local = {};
-    this.remote = {};
-    this.local.open = frames.open(this.options);
-    this.local.close = frames.close({});
-    this.session_policy = session_per_connection(this);
-    this.amqp_transport = new Transport(this.options.id, AMQP_PROTOCOL_ID, frames.TYPE_AMQP, this);
-    this.sasl_transport = undefined;
-    this.transport = this.amqp_transport;
-    this.conn_established_counter = 0;
-    this.heartbeat_out = undefined;
-    this.heartbeat_in = undefined;
-    this.abort_idle = false;
-    this.socket_ready = false;
-};
-
-Connection.prototype = Object.create(EventEmitter.prototype);
-Connection.prototype.constructor = Connection;
-Connection.prototype.dispatch = function(name, context) {
-    log.events('Connection got event: ' + name);
-    if (this.listeners(name).length) {
-        EventEmitter.prototype.emit.apply(this, arguments);
-        return true;
-    } else if (this.container) {
-        return this.container.dispatch.apply(this.container, arguments);
-    }
-};
-
-Connection.prototype.reset = function() {
-    if (this.abort_idle) {
-        this.abort_idle = false;
-        this.local.close.error = undefined;
-        this.state = new EndpointState();
-        this.state.open();
-    }
-
-    //reset transport
-    this.amqp_transport = new Transport(this.options.id, AMQP_PROTOCOL_ID, frames.TYPE_AMQP, this);
-    this.sasl_transport = undefined;
-    this.transport = this.amqp_transport;
-
-    //reset remote endpoint state
-    this.state.disconnected();
-    this.remote = {};
-    //reset sessions:
-    this.remote_channel_map = {};
-    for (var k in this.local_channel_map) {
-        this.local_channel_map[k].reset();
-    }
-    this.socket_ready = false;
-}
-
-Connection.prototype.connect = function () {
-    this.is_server = false;
-    this._connect(this.options.connection_details(this.conn_established_counter));
-    this.open();
-    return this;
-};
-Connection.prototype.reconnect = function () {
-    log.reconnect('reconnecting...');
-    this.reset();
-    this._connect(this.options.connection_details(this.conn_established_counter));
-    process.nextTick(this._process.bind(this));
-    return this;
-};
-
-Connection.prototype._connect = function (details) {
-    if (details.connect) {
-        this.init(details.connect(details.port, details.host, details.options, this.connected.bind(this)));
-    } else {
-        this.init(get_connect_fn(details)(details.port, details.host, details.options, this.connected.bind(this)));
-    }
-    return this;
-};
-
-Connection.prototype.accept = function (socket) {
-    this.is_server = true;
-    log.io('[' + this.id + '] client accepted: '+ get_socket_id(socket));
-    this.socket_ready = true;
-    return this.init(socket);
-};
-
-Connection.prototype.init = function (socket) {
-    this.socket = socket;
-    this.socket.on('data', this.input.bind(this));
-    this.socket.on('error', this.error.bind(this));
-    this.socket.on('end', this.eof.bind(this));
-
-    if (this.is_server) {
-        var mechs;
-        if (this.container && Object.getOwnPropertyNames(this.container.sasl_server_mechanisms).length) {
-            mechs = this.container.sasl_server_mechanisms;
-        }
-        if (this.socket.encrypted && this.socket.authorized && this.get_option('enable_sasl_external', false)) {
-            mechs = sasl.server_add_external(mechs ? util.clone(mechs) : {});
-        }
-        if (mechs) {
-            this.sasl_transport = new sasl.Server(this, mechs);
-        }
-    } else {
-        var mechanisms = this.get_option('sasl_mechanisms');
-        if (!mechanisms) {
-            var username = this.get_option('username');
-            var password = this.get_option('password');
-            if (username) {
-                mechanisms = sasl.client_mechanisms();
-                if (password) mechanisms.enable_plain(username, password);
-                else mechanisms.enable_anonymous(username);
-            }
-        }
-        if (this.socket.encrypted && this.options.cert && this.get_option('enable_sasl_external', false)) {
-            if (!mechanisms) mechanisms = sasl.client_mechanisms();
-            mechanisms.enable_external();
-        }
-
-        if (mechanisms) {
-            this.sasl_transport = new sasl.Client(this, mechanisms);
-        }
-    }
-    this.transport = this.sasl_transport ? this.sasl_transport : this.amqp_transport;
-    return this;
-};
-
-Connection.prototype.attach_sender = function (options) {
-    return this.session_policy.get_session().attach_sender(options);
-};
-Connection.prototype.open_sender = Connection.prototype.attach_sender;//alias
-
-Connection.prototype.attach_receiver = function (options) {
-    return this.session_policy.get_session().attach_receiver(options);
-};
-Connection.prototype.open_receiver = Connection.prototype.attach_receiver;//alias
-
-Connection.prototype.get_option = function (name, default_value) {
-    if (this.options[name] !== undefined) return this.options[name];
-    else if (this.container) return this.container.get_option(name, default_value);
-    else return default_value;
-};
-
-Connection.prototype.connected = function () {
-    this.socket_ready = true;
-    this.conn_established_counter++;
-    log.io('[' + this.options.id + '] connected ' + get_socket_id(this.socket));
-    this.output();
-};
-Connection.prototype.sasl_failed = function (text) {
-    this.transport_error = {condition:'amqp:unauthorized-access', description:text};
-    this._handle_error();
-}
-
-Connection.prototype._handle_error = function () {
-    var error = this.get_error();
-    if (error) {
-        //TODO: invoke connection_close regardless of whether connection_error is handled
-        //TODO: example for error handling
-        if (!this.dispatch('connection_error', this._context())) {
-            if (!this.dispatch('connection_close', this._context())) {
-                console.log('error: ' + JSON.stringify(error));
-            }
-        }
-        return true;
-    } else {
-        return false;
-    }
-}
-
-Connection.prototype.get_error = function () {
-    if (this.transport_error) return this.transport_error;
-    if (this.remote.close && this.remote.close.error) return this.remote.close.error;
-    return undefined;
-}
-
-Connection.prototype.output = function () {
-    if (this.socket && this.socket_ready) {
-        if (this.heartbeat_out) clearTimeout(this.heartbeat_out);
-        this.transport.write(this.socket);
-        if (((this.is_closed() && this.state.has_settled()) || this.abort_idle || this.transport_error) && !this.transport.has_writes_pending()) {
-            this.socket.end();
-        } else if (this.is_open() && this.remote.open.idle_time_out) {
-            this.heartbeat_out = setTimeout(this._write_frame.bind(this), this.remote.open.idle_time_out / 2);
-        }
-    }
-};
-
-Connection.prototype.input = function (buff) {
-    if (this.heartbeat_in) clearTimeout(this.heartbeat_in);
-    log.io('[' + this.options.id + '] read ' + buff.length + ' bytes');
-    var buffer;
-    if (this.previous_input) {
-        buffer = Buffer.concat([this.previous_input, buff], this.previous_input.length + buff.length);
-        this.previous_input = null;
-    } else {
-        buffer = buff;
-    }
-    var read = this.transport.read(buffer, this);
-    if (read < buffer.length) {
-        this.previous_input = buffer.slice(read);
-    }
-    if (this.local.open.idle_time_out) this.heartbeat_in = setTimeout(this.idle.bind(this), this.local.open.idle_time_out);
-    if (this.transport.has_writes_pending()) this.output();
-};
-
-Connection.prototype.idle = function () {
-    if (this.is_open()) {
-        this.abort_idle = true;
-        this.local.close.error = {condition:'amqp:resource-limit-exceeded', description:'max idle time exceeded'};
-        this.close();
-    }
-};
-
-Connection.prototype.error = function (e) {
-    console.log('[' + this.options.id + '] error: ' + e);
-    this._disconnected();
-};
-
-Connection.prototype.eof = function (e) {
-    this._disconnected();
-};
-
-Connection.prototype._disconnected = function () {
-    if (!this.is_closed()) {
-        if (!this.dispatch('disconnected', this._context())) {
-            console.log('[' + this.options.id + '] disconnected');
-        }
-        if (!this.is_server && !this.transport_error && this.options.reconnect) {
-            var delay = this.options.reconnect(this.conn_established_counter);
-            if (delay >= 0) {
-                log.reconnect('Scheduled reconnect in ' + delay + 'ms');
-                setTimeout(this.reconnect.bind(this), delay);
-            }
-        }
-    }
-};
-
-Connection.prototype.open = function () {
-    if (this.state.open()) {
-        this._register();
-    }
-};
-Connection.prototype.close = function () {
-    if (this.state.close()) {
-        this._register();
-    }
-};
-
-Connection.prototype.is_open = function () {
-    return this.state.is_open();
-};
-
-Connection.prototype.is_closed = function () {
-    return this.state.is_closed();
-};
-
-Connection.prototype.create_session = function () {
-    var i = 0;
-    while (this.local_channel_map[i]) i++;
-    var session = new Session(this, i);
-    this.local_channel_map[i] = session;
-    return session;
-}
-
-Connection.prototype.on_open = function (frame) {
-    if (this.state.remote_opened()) {
-        this.remote.open = frame.performative;
-        this.open();
-        this.dispatch('connection_open', this._context());
-    } else {
-        throw Error('Open already received');
-    }
-};
-
-Connection.prototype.on_close = function (frame) {
-    if (this.state.remote_closed()) {
-        this.remote.close = frame.performative;
-        this.close();
-        if (this.remote.close.error) {
-            this._handle_error();
-        } else {
-            this.dispatch('connection_close', this._context());
-        }
-        if (this.heartbeat_out) clearTimeout(this.heartbeat_out);
-    } else {
-        throw Error('Close already received');
-    }
-};
-
-Connection.prototype._register = function () {
-    if (!this.registered) {
-        this.registered = true;
-        process.nextTick(this._process.bind(this));
-    }
-};
-
-Connection.prototype._process = function () {
-    this.registered = false;
-    do {
-        if (this.state.need_open()) {
-            this._write_open();
-        }
-        for (var k in this.local_channel_map) {
-            this.local_channel_map[k]._process();
-        }
-        if (this.state.need_close()) {
-            this._write_close();
-        }
-    } while (!this.state.has_settled());
-};
-
-Connection.prototype._write_frame = function (channel, frame, payload) {
-    this.amqp_transport.encode(frames.amqp_frame(channel, frame, payload));
-    this.output();
-};
-
-Connection.prototype._write_open = function () {
-    this._write_frame(0, this.local.open.described());
-};
-
-Connection.prototype._write_close = function () {
-    this._write_frame(0, this.local.close.described());
-};
-
-Connection.prototype.on_begin = function (frame) {
-    var session;
-    if (frame.performative.remote_channel === null || frame.performative.remote_channel === undefined) {
-        //peer initiated
-        session = this.create_session();
-        session.local.begin.remote_channel = frame.channel;
-    } else {
-        session = this.local_channel_map[frame.performative.remote_channel];
-        if (!session) throw Error('Invalid value for remote channel ' + frame.performative.remote_channel);
-    }
-    session.on_begin(frame);
-    this.remote_channel_map[frame.channel] = session;
-};
-
-Connection.prototype.get_peer_certificate = function() {
-    if (this.socket && this.socket.getPeerCertificate) {
-        return this.socket.getPeerCertificate();
-    } else {
-        return undefined;
-    }
-};
-
-Connection.prototype._context = function (c) {
-    var context = c ? c : {};
-    context.connection = this;
-    if (this.container) context.container = this.container;
-    return context;
-};
-
-function delegate_to_session(name) {
-    Connection.prototype['on_' + name] = function (frame) {
-        var session = this.remote_channel_map[frame.channel];
-        if (!session) {
-            throw Error(name + ' received on invalid channel ' + frame.channel);
-        }
-        session['on_' + name](frame);
-    };
-};
-
-delegate_to_session('end');
-delegate_to_session('attach');
-delegate_to_session('detach');
-delegate_to_session('transfer');
-delegate_to_session('disposition');
-delegate_to_session('flow');
-
-module.exports = Connection
-
-}).call(this,require('_process'),require("buffer").Buffer)
-},{"./endpoint.js":2,"./frames.js":3,"./log.js":5,"./sasl.js":8,"./session.js":9,"./transport.js":11,"./types.js":12,"./util.js":13,"_process":24,"buffer":19,"events":23,"net":18,"tls":18}],2:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed 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.
- */
-'use strict';
-
-var EndpointState = function () {
-    this.init();
-};
-
-EndpointState.prototype.init = function () {
-    this.local_open = false;
-    this.remote_open = false;
-    this.open_requests = 0;
-    this.close_requests = 0;
-    this.initialised = false;
-};
-
-EndpointState.prototype.open = function () {
-    this.initialised = true;
-    if (!this.local_open) {
-        this.local_open = true;
-        this.open_requests++;
-        return true;
-    } else {
-        return false;
-    }
-};
-
-EndpointState.prototype.close = function () {
-    if (this.local_open) {
-        this.local_open = false;
-        this.close_requests++;
-        return true;
-    } else {
-        return false;
-    }
-};
-
-EndpointState.prototype.disconnected = function () {
-    var was_open = this.local_open;
-    this.init();
-    if (was_open) {
-        this.open();
-    } else {
-        this.close();
-    }
-};
-
-EndpointState.prototype.remote_opened = function (frame) {
-    if (!this.remote_open) {
-        this.remote_open = true;
-        return true;
-    } else {
-        return false;
-    }
-};
-
-EndpointState.prototype.remote_closed = function (frame) {
-    if (this.remote_open) {
-        this.remote_open = false;
-        return true;
-    } else {
-        return false;
-    }
-};
-
-EndpointState.prototype.is_open = function () {
-    return this.local_open && this.remote_open;
-};
-
-EndpointState.prototype.is_closed = function () {
-    return this.initialised && !this.local_open && !this.remote_open;
-};
-
-EndpointState.prototype.has_settled = function () {
-    return this.open_requests == 0 && this.close_requests == 0;
-};
-
-EndpointState.prototype.need_open = function () {
-    if (this.open_requests > 0) {
-        this.open_requests--;
-        return true;
-    } else {
-        return false;
-    }
-};
-
-EndpointState.prototype.need_close = function () {
-    if (this.close_requests > 0) {
-        this.close_requests--;
-        return true;
-    } else {
-        return false;
-    }
-};
-
-module.exports = EndpointState
-
-},{}],3:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed 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.
- */
-'use strict';
-
-var types = require('./types.js');
-
-var frames = {};
-var by_descriptor = {};
-
-frames.read_header = function(buffer) {
-    var offset = 4;
-    var header = {};
-    var name = buffer.toString('ascii', 0, offset);
-    if (name !== 'AMQP') {
-        throw Error('Invalid protocol header for AMQP ' + name);
-    }
-    header.protocol_id = buffer.readUInt8(offset++);
-    header.major = buffer.readUInt8(offset++);
-    header.minor = buffer.readUInt8(offset++);
-    header.revision = buffer.readUInt8(offset++);
-    if (header.major !== 1 || header.minor !== 0) {
-        throw Error('Unsupported AMQP version: ' + JSON.stringify(header));
-    }
-    return header;
-};
-frames.write_header = function(buffer, header) {
-    var offset = 4;
-    buffer.write('AMQP', 0, offset, 'ascii');
-    buffer.writeUInt8(header.protocol_id, offset++);
-    buffer.writeUInt8(header.major, offset++);
-    buffer.writeUInt8(header.minor, offset++);
-    buffer.writeUInt8(header.revision, offset++);
-    return 8;
-};
-//todo: define enumeration for frame types
-frames.TYPE_AMQP = 0x00;
-frames.TYPE_SASL = 0x01;
-
-frames.read_frame = function(buffer) {
-    var reader = new types.Reader(buffer);
-    var frame = {};
-    frame.size = reader.read_uint(4);
-    if (reader.remaining < frame.size) {
-        return null;
-    }
-    var doff = reader.read_uint(1);
-    if (doff < 2) {
-        throw Error('Invalid data offset, must be at least 2 was ' + doff);
-    }
-    frame.type = reader.read_uint(1);
-    if (frame.type === frames.TYPE_AMQP) {
-        frame.channel = reader.read_uint(2);
-    } else if (frame.type === frames.TYPE_SASL) {
-        reader.skip(2);
-    } else {
-        throw Error('Unknown frame type ' + frame.type);
-    }
-    if (doff > 1) {
-        //ignore any extended header
-        reader.skip(doff * 4 - 8);
-    }
-    if (reader.remaining()) {
-        frame.performative = reader.read();
-        var c = by_descriptor[frame.performative.descriptor.value];
-        if (c) {
-            frame.performative = new c(frame.performative.value);
-        }
-        if (reader.remaining()) {
-            frame.payload = reader.read_bytes(reader.remaining());
-        }
-    }
-    return frame;
-};
-
-frames.write_frame = function(frame) {
-    var writer = new types.Writer();
-    writer.skip(4);//skip size until we know how much we have written
-    writer.write_uint(2, 1);//doff
-    writer.write_uint(frame.type, 1);
-    if (frame.type === frames.TYPE_AMQP) {
-        writer.write_uint(frame.channel, 2);
-    } else if (frame.type === frames.TYPE_SASL) {
-        writer.write_uint(0, 2);
-    } else {
-        throw Error('Unknown frame type ' + frame.type);
-    }
-    if (frame.performative) {
-        writer.write(frame.performative);
-        if (frame.payload) {
-            writer.write_bytes(frame.payload);
-        }
-    }
-    var buffer = writer.toBuffer();
-    buffer.writeUInt32BE(buffer.length, 0);//fill in the size
-    return buffer;
-};
-
-frames.amqp_frame = function(channel, performative, payload) {
-    return {'channel': channel || 0, 'type': frames.TYPE_AMQP, 'performative': performative, 'payload': payload};
-};
-frames.sasl_frame = function(performative) {
-    return {'channel': 0, 'type': frames.TYPE_SASL, 'performative': performative};
-};
-
-function define_frame(type, def) {
-    var c = types.define_composite(def);
-    frames[def.name] = c.create;
-    by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
-    by_descriptor[c.descriptor.symbolic] = c;
-};
-
-var open = {name: "open",
-            code: 0x10,
-            fields: [
-                 {name:"container_id", type:"string", mandatory:true},
-                 {name:"hostname", type:"string"},
-                 {name:"max_frame_size", type:"uint", default_value:4294967295},
-                 {name:"channel_max", type:"ushort", default_value:65535},
-                 {name:"idle_time_out", type:"uint"},
-                 {name:"outgoing_locales", type:"symbol", multiple:true},
-                 {name:"incoming_locales", type:"symbol", multiple:true},
-                 {name:"offered_capabilities", type:"symbol", multiple:true},
-                 {name:"desired_capabilities", type:"symbol", multiple:true},
-                 {name:"properties", type:"symbolic_map"}
-             ]
-           };
-
-var begin = {name:"begin",
-             code:0x11,
-             fields:[
-                 {name:"remote_channel", type:"ushort"},
-                 {name:"next_outgoing_id", type:"uint", mandatory:true},
-                 {name:"incoming_window", type:"uint", mandatory:true},
-                 {name:"outgoing_window", type:"uint", mandatory:true},
-                 {name:"handle_max", type:"uint", default_value:"4294967295"},
-                 {name:"offered_capabilities", type:"symbol", multiple:true},
-                 {name:"desired_capabilities", type:"symbol", multiple:true},
-                 {name:"properties", type:"symbolic_map"}
-             ]
-            };
-
-var attach = {name:"attach",
-              code:0x12,
-              fields:[
-                  {name:"name", type:"string", mandatory:true},
-                  {name:"handle", type:"uint", mandatory:true},
-                  {name:"role", type:"boolean", mandatory:true},
-                  {name:"snd_settle_mode", type:"ubyte", default_value:2},
-                  {name:"rcv_settle_mode", type:"ubyte", default_value:0},
-                  {name:"source", type:"*"},
-                  {name:"target", type:"*"},
-                  {name:"unsettled", type:"map"},
-                  {name:"incomplete_unsettled", type:"boolean", default_value:false},
-                  {name:"initial_delivery_count", type:"uint"},
-                  {name:"max_message_size", type:"ulong"},
-                  {name:"offered_capabilities", type:"symbol", multiple:true},
-                  {name:"desired_capabilities", type:"symbol", multiple:true},
-                  {name:"properties", type:"symbolic_map"}
-              ]
-             };
-
-var flow = {name:"flow",
-            code:0x13,
-            fields:[
-                {name:"next_incoming_id", type:"uint"},
-                {name:"incoming_window", type:"uint", mandatory:true},
-                {name:"next_outgoing_id", type:"uint", mandatory:true},
-                {name:"outgoing_window", type:"uint", mandatory:true},
-                {name:"handle", type:"uint"},
-                {name:"delivery_count", type:"uint"},
-                {name:"link_credit", type:"uint"},
-                {name:"available", type:"uint"},
-                {name:"drain", type:"boolean", default_value:false},
-                {name:"echo", type:"boolean", default_value:false},
-                {name:"properties", type:"symbolic_map"}
-            ]
-           };
-
-var transfer = {name:"transfer",
-                code:0x14,
-                fields:[
-                    {name:"handle", type:"uint", mandatory:true},
-                    {name:"delivery_id", type:"uint"},
-                    {name:"delivery_tag", type:"binary"},
-                    {name:"message_format", type:"uint"},
-                    {name:"settled", type:"boolean"},
-                    {name:"more", type:"boolean", default_value:false},
-                    {name:"rcv_settle_mode", type:"ubyte"},
-                    {name:"state", type:"delivery_state"},
-                    {name:"resume", type:"boolean", default_value:false},
-                    {name:"aborted", type:"boolean", default_value:false},
-                    {name:"batchable", type:"boolean", default_value:false}
-                ]
-               };
-
-var disposition = {name:"disposition",
-                   code:0x15,
-                   fields:[
-                       {name:"role", type:"boolean", mandatory:true},
-                       {name:"first", type:"uint", mandatory:true},
-                       {name:"last", type:"uint"},
-                       {name:"settled", type:"boolean", default_value:false},
-                       {name:"state", type:"*"},
-                       {name:"batchable", type:"boolean", default_value:false}
-                   ]
-                  };
-
-var detach = {name: "detach",
-             code: 0x16,
-              fields: [
-                  {name:"handle", type:"uint", mandatory:true},
-                  {name:"closed", type:"boolean", default_value:false},
-                  {name:"error", type:"error"}
-              ]
-             };
-
-var end = {name: "end",
-             code: 0x17,
-             fields: [
-                 {name:"error", type:"error"}
-             ]
-            };
-
-var close = {name: "close",
-             code: 0x18,
-             fields: [
-                 {name:"error", type:"error"}
-             ]
-            };
-
-define_frame(frames.TYPE_AMQP, open);
-define_frame(frames.TYPE_AMQP, begin);
-define_frame(frames.TYPE_AMQP, attach);
-define_frame(frames.TYPE_AMQP, flow);
-define_frame(frames.TYPE_AMQP, transfer);
-define_frame(frames.TYPE_AMQP, disposition);
-define_frame(frames.TYPE_AMQP, detach);
-define_frame(frames.TYPE_AMQP, end);
-define_frame(frames.TYPE_AMQP, close);
-
-var sasl_mechanisms = {name:"sasl_mechanisms", code:0x40,
-                       fields: [
-                           {name:"sasl_server_mechanisms", type:"symbol", multiple:true, mandatory:true}
-                       ]};
-
-var sasl_init = {name:"sasl_init", code:0x41,
-                 fields: [
-                     {name:"mechanism", type:"symbol", mandatory:true},
-                     {name:"initial_response", type:"binary"},
-                     {name:"hostname", type:"string"}
-                 ]};
-
-var sasl_challenge = {name:"sasl_challenge", code:0x42,
-                      fields: [
-                          {name:"challenge", type:"binary", mandatory:true}
-                      ]};
-
-var sasl_response = {name:"sasl_response", code:0x43,
-                     fields: [
-                         {name:"response", type:"binary", mandatory:true}
-                     ]};
-
-var sasl_outcome = {name:"sasl_outcome", code:0x44,
-                    fields: [
-                        {name:"code", type:"ubyte", mandatory:true},
-                        {name:"additional_data", type:"binary"}
-                    ]};
-
-define_frame(frames.TYPE_SASL, sasl_mechanisms);
-define_frame(frames.TYPE_SASL, sasl_init);
-define_frame(frames.TYPE_SASL, sasl_challenge);
-define_frame(frames.TYPE_SASL, sasl_response);
-define_frame(frames.TYPE_SASL, sasl_outcome);
-
-module.exports = frames;
-
-},{"./types.js":12}],4:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed 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.
- */
-'use strict';
-
-var frames = require('./frames.js');
-var log = require('./log.js');
-var message = require('./message.js');
-var terminus = require('./terminus.js')
-var types = require('./types.js')
-var EndpointState = require('./endpoint.js');
-
-var FlowController = function (window) {
-    this.window = window;
-};
-FlowController.prototype.update = function (context) {
-    var delta = this.window - context.receiver.credit;
-    context.receiver.flow(delta);
-};
-
-function auto_settle(context) {
-    context.delivery.settled = true;
-};
-
-function auto_accept(context) {
-    context.delivery.update(true, message.accepted().described());
-};
-
-var EventEmitter = require('events').EventEmitter;
-
-var link = Object.create(EventEmitter.prototype);
-link.dispatch = function(name, context) {
-    log.events('Link got event: '+ name);
-    EventEmitter.prototype.emit.apply(this.observers, arguments);
-    if (this.listeners(name).length) {
-        EventEmitter.prototype.emit.apply(this, arguments);
-    } else {
-        this.session.dispatch.apply(this.session, arguments);
-    }
-};
-link.set_source = function (fields) {
-    this.local.attach.source = terminus.source(fields).described();
-};
-link.set_target = function (fields) {
-    this.local.attach.target = terminus.target(fields).described();
-};
-
-link.attach = function () {
-    if (this.state.open()) {
-        this.connection._register();
-    }
-};
-link.open = link.attach;
-
-link.detach = function () {
-    this.local.detach.closed = false;
-    if (this.state.close()) {
-        this.connection._register();
-    }
-};
-link.close = function() {
-    this.local.detach.closed = true;
-    if (this.state.close()) {
-        this.connection._register();
-    }
-}
-
-link.is_open = function () {
-    return this.session.is_open() && this.state.is_open();
-};
-
-link.is_closed = function () {
-    return this.session.is_closed() || this.state.is_closed();
-};
-
-link._process = function () {
-    do {
-        if (this.state.need_open()) {
-            this.session.output(this.local.attach.described());
-        }
-
-        if (this.issue_flow) {
-            this.session._write_flow(this);
-            this.issue_flow = false;
-        }
-
-        if (this.state.need_close()) {
-            this.session.output(this.local.detach.described());
-        }
-    } while (!this.state.has_settled());
-};
-
-link.on_attach = function (frame) {
-    if (this.state.remote_opened()) {
-        if (!this.remote.handle) {
-            this.remote.handle = frame.handle;
-        }
-        frame.performative.source = terminus.unwrap(frame.performative.source);
-        frame.performative.target = terminus.unwrap(frame.performative.target);
-        this.remote.attach = frame.performative;
-        this.open();
-        this.dispatch(this.is_receiver() ? 'receiver_open' : 'sender_open', this._context());
-    } else {
-        throw Error('Attach already received');
-    }
-};
-
-link.on_detach = function (frame) {
-    if (this.state.remote_closed()) {
-        this.remote.detach = frame.performative;
-        this.close();
-        this.dispatch(this.local.attach.role ? 'receiver_close' : 'sender_close', this._context());
-    } else {
-        throw Error('Detach already received');
-    }
-};
-
-function is_internal(name) {
-    switch (name) {
-    case 'handle':
-    case 'role':
-    case 'initial_delivery_count':
-        return true;
-    default:
-        return false;
-    }
-}
-
-link.init = function (session, name, local_handle, opts, is_receiver) {
-    this.session = session;
-    this.connection = session.connection;
-    this.name = name;
-    this.options = opts === undefined ? {} : opts;
-    this.state = new EndpointState();
-    this.issue_flow = false;//currently only used by receiver
-    this.local = {'handle': local_handle};
-    this.local.attach = frames.attach({'handle':local_handle,'name':name, role:is_receiver});
-    for (var f in this.local.attach) {
-        if (!is_internal(f) && this.options[f] !== undefined) {
-            this.local.attach[f] = this.options[f];
-        }
-    }
-    this.local.detach = frames.detach({'handle':local_handle, 'closed':true});
-    this.remote = {'handle':undefined};
-    this.delivery_count = 0;
-    this.credit = 0;
-    this.observers = new EventEmitter();
-};
-link.reset = function() {
-    this.state.disconnected();
-    this.remote = {'handle':undefined};
-    this.delivery_count = 0;
-    this.credit = 0;
-};
-
-link.has_credit = function () {
-    return this.credit > 0;
-};
-link.is_receiver = function () {
-    return this.local.attach.role;
-};
-link._context = function (c) {
-    var context = c ? c : {};
-    if (this.is_receiver()) {
-        context.receiver = this;
-    } else {
-        context.sender = this;
-    }
-    return this.session._context(context);
-};
-link.get_option = function (name, default_value) {
-    if (this.options[name] !== undefined) return this.options[name];
-    else return this.session.get_option(name, default_value);
-};
-
-var Sender = function (session, name, local_handle, opts) {
-    this.init(session, name, local_handle, opts, false);
-    this.local.attach.initial_delivery_count = 0;
-    this.tag = 0;
-    if (this.get_option('autosettle', true)) {
-        this.observers.on('settled', auto_settle);
-    }
-};
-Sender.prototype = Object.create(link);
-Sender.prototype.constructor = Sender;
-Sender.prototype.next_tag = function () {
-    return new String(this.tag++);
-};
-Sender.prototype.sendable = function (frame) {
-    return this.credit && this.session.outgoing.available();
-}
-Sender.prototype.on_flow = function (frame) {
-    var flow = frame.performative;
-    this.credit = flow.delivery_count + flow.link_credit - this.delivery_count;
-    if (this.is_open()) {
-        this.dispatch('sender_flow', this._context());
-        if (this.sendable()) {
-            this.dispatch('sendable', this._context());
-        }
-    }
-};
-Sender.prototype.on_transfer = function (frame) {
-    throw Error('got transfer on sending link');
-};
-Sender.prototype.send = function (msg, tag) {
-    return this.session.send(this, tag ? tag : this.next_tag(), message.encode(msg), 0);
-};
-
-
-var Receiver = function (session, name, local_handle, opts) {
-    this.init(session, name, local_handle, opts, true);
-    this.set_prefetch(this.get_option('prefetch', 100));
-    if (this.get_option('autoaccept', true)) {
-        this.observers.on('message', auto_accept);
-    }
-};
-Receiver.prototype = Object.create(link);
-Receiver.prototype.constructor = Receiver;
-Receiver.prototype.on_flow = function (frame) {
-    this.dispatch('receiver_flow', this._context());
-};
-Receiver.prototype.flow = function(credit) {
-    if (credit > 0) {
-        this.credit += credit;
-        this.issue_flow = true;
-        this.connection._register();
-    }
-};
-
-Receiver.prototype.set_prefetch = function(prefetch) {
-    if (prefetch > 0) {
-        var flow_controller = new FlowController(prefetch);
-        var listener = flow_controller.update.bind(flow_controller);
-        this.observers.on('message', listener);
-        this.observers.on('receiver_open', listener);
-    }
-}
-
-module.exports = {'Sender': Sender, 'Receiver':Receiver};
-
-},{"./endpoint.js":2,"./frames.js":3,"./log.js":5,"./message.js":6,"./terminus.js":10,"./types.js":12,"events":23}],5:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed 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.
- */
-'use strict';
-
-var debug = require('debug');
-
-module.exports = {
-    'frames' : debug('rhea:frames'),
-    'raw' : debug('rhea:raw'),
-    'reconnect' : debug('rhea:reconnect'),
-    'events' : debug('rhea:events'),
-    'message' : debug('rhea:message'),
-    'flow' : debug('rhea:flow'),
-    'io' : debug('rhea:io')
-}
-
-},{"debug":15}],6:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed 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.
- */
-'use strict';
-
-var log = require('./log.js');
-var types = require('./types.js');
-
-var by_descriptor = {};
-var unwrappers = {};
-var wrappers = [];
-var message = {};
-
-function define_section(descriptor, unwrap, wrap) {
-    unwrap.descriptor = descriptor;
-    unwrappers[descriptor.symbolic] = unwrap;
-    unwrappers[Number(descriptor.numeric).toString(10)] = unwrap;
-    if (wrap) {
-        wrappers.push(wrap);
-    }
-};
-
-function define_composite_section(def) {
-    var c = types.define_composite(def);
-    message[def.name] = c.create;
-    by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
-    by_descriptor[c.descriptor.symbolic] = c;
-
-    var unwrap = function (msg, section) {
-        msg[def.name] = new c(section.value);
-    };
-
-    var wrap = function (sections, msg) {
-        if (msg[def.name]) {
-            if (msg[def.name].described) {
-                sections.push(msg[def.name].described());
-            } else {
-                sections.push(c.create(msg[def.name]).described());
-            }
-        }
-    };
-    define_section(c.descriptor, unwrap, wrap);
-};
-
-
-function define_map_section(def) {
-    var descriptor = {numeric:def.code};
-    descriptor.symbolic = 'amqp:' + def.name.replace(/_/g, '-') + ':map';
-    var unwrap = function (msg, section) {
-        msg[def.name] = types.unwrap(section);
-    };
-    var wrap = function (sections, msg) {
-        if (msg[def.name]) {
-            sections.push(types.described(types.wrap_ulong(descriptor.numeric), types.wrap_map(msg[def.name])));
-        }
-    };
-    define_section(descriptor, unwrap, wrap);
-};
-
-define_composite_section({name:"header",
-                          code:0x70,
-                          fields:[
-                              {name:"durable", type:"boolean", default_value:false},
-                              {name:"priority", type:"ubyte", default_value:4},
-                              {name:"ttl", type:"uint"},
-                              {name:"first_acquirer", type:"boolean", default_value:false},
-                              {name:"delivery_count", type:"uint", default_value:0}
-                          ]
-                         });
-define_map_section({name:"delivery_annotations", code:0x71});
-define_map_section({name:"message_annotations", code:0x72});
-define_composite_section({name:"properties",
-                          code:0x73,
-                          fields:[
-                              {name:"message_id", type:"message_id"},
-                              {name:"user_id", type:"binary"},
-                              {name:"to", type:"string"},
-                              {name:"subject", type:"string"},
-                              {name:"reply_to", type:"string"},
-                              {name:"correlation_id", type:"message_id"},
-                              {name:"content_type", type:"symbol"},
-                              {name:"content_encoding", type:"symbol"},
-                              {name:"absolute_expiry_time", type:"timestamp"},
-                              {name:"creation_time", type:"timestamp"},
-                              {name:"group_id", type:"string"},
-                              {name:"group_sequence", type:"uint"},
-                              {name:"reply_to_group_id", type:"string"}
-                          ]
-                         });
-define_map_section({name:"application_properties", code:0x74});
-
-define_section({numeric:0x77, symbolic:'amqp:value:*'},
-               function(msg, section) { msg.body = types.unwrap(section); },
-               function(sections, msg) { sections.push(types.described(types.wrap_ulong(0x77), types.wrap(msg.body))); });
-
-define_map_section({name:"footer", code:0x78});
-
-message.encode = function(obj) {
-    var sections = [];
-
-    wrappers.forEach(function (wrapper_fn) { wrapper_fn(sections, obj); });
-    var writer = new types.Writer();
-    for (var i = 0; i < sections.length; i++) {
-        log.message('Encoding section ' + (i+1) + ' of ' + sections.length + ': ' + sections[i]);
-        writer.write(sections[i]);
-    }
-    var data = writer.toBuffer();
-    log.message('encoded ' + data.length + ' bytes');
-    return data;
-}
-
-message.decode = function(buffer) {
-    var msg = {};
-    var reader = new types.Reader(buffer);
-    while (reader.remaining()) {
-        var s = reader.read();
-        log.message('decoding section: ' + JSON.stringify(s) + ' of type: ' + JSON.stringify(s.descriptor));
-        if (s.descriptor) {
-            var unwrap = unwrappers[s.descriptor.value];
-            if (unwrap) {
-                unwrap(msg, s);
-            } else {
-                console.log("WARNING: did not recognise message section with descriptor " + s.descriptor);
-            }
-        } else {
-            console.log("WARNING: expected described message section got " + JSON.stringify(s));
-        }
-    }
-    return msg;
-}
-
-var outcomes = {};
-
-function define_outcome(def) {
-    var c = types.define_composite(def);
-    c.composite_type = def.name;
-    message[def.name] = c.create;
-    outcomes[Number(c.descriptor.numeric).toString(10)] = c;
-    outcomes[c.descriptor.symbolic] = c;
-    message['is_' + def.name] = function (o) {
-        if (o && o.descriptor) {
-            var c = outcomes[o.descriptor.value];
-            if (c) {
-                return c.descriptor.numeric == def.code;
-            }
-        }
-        return false;
-    };
-}
-
-message.unwrap_outcome = function (outcome) {
-    if (outcome && outcome.descriptor) {
-        var c = outcomes[outcome.descriptor.value];
-        if (c) {
-            return new c(outcome);
-        }
-    }
-    console.log('unrecognised outcome');
-    return outcome;
-};
-
-message.are_outcomes_equivalent = function(a, b) {
-    if (a === undefined && b === undefined) return true;
-    else if (a === undefined || b === undefined) return false;
-    else return a.descriptor.value == b.descriptor.value && JSON.stringify(a) == JSON.stringify(b);
-};
-
-define_outcome({name:"received", code:0x23,
-                fields:[
-                    {name:"section-number", type:"uint", mandatory:true},
-                    {name:"section-offset", type:"ulong", mandatory:true}
-                ]});
-define_outcome({name:"accepted", code:0x24, fields:[]});
-define_outcome({name:"rejected", code:0x25, fields:[{name:"error", type:"error"}]});
-define_outcome({name:"released", code:0x26, fields:[]});
-define_outcome({name:"modified",
- code:0x27,
- fields:[
-     {name:"delivery-failed", type:"boolean"},
-     {name:"undeliverable-here", type:"boolean"},
-     {name:"message-annotations", type:"fields"}
-]});
-
-module.exports = message;
-
-},{"./log.js":5,"./types.js":12}],7:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed 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.
- */
-'use strict';
-
-var url = require('url');
-
-var simple_id_generator = {
-    counter : 1,
-    next : function() {
-        return this.counter++;
-    }
-};
-
-var Client = function (container, address) {
-    var u = url.parse(address);
-    //TODO: handle scheme and user/password if present
-    this.connection = container.connect({'host':u.hostname, 'port':u.port});
-    this.connection.on('message', this._response.bind(this));
-    this.connection.on('receiver_open', this._ready.bind(this));
-    this.sender = this.connection.attach_sender(u.path.substr(1));
-    this.receiver = this.connection.attach_receiver({source:{dynamic:true}});
-    this.id_generator = simple_id_generator;
-    this.pending = [];//requests yet to be made (waiting for receiver to open)
-    this.outstanding = {};//requests sent, for which responses have not yet been received
-};
-
-Client.prototype._request = function (id, name, args, callback) {
-    var request = {properties:{}};
-    request.properties.subject = name;
-    request.body = args;
-    request.properties.message_id = id;
-    request.properties.reply_to = this.receiver.remote.attach.source.address;
-    this.outstanding[id] = callback;
-    this.sender.send(request);
-};
-
-Client.prototype._response = function (context) {
-    var id = context.message.properties.correlation_id;
-    var callback = this.outstanding[id];
-    if (callback) {
-        if (context.message.properties.subject === 'ok') {
-            callback(context.message.body);
-        } else {
-            callback(undefined, {name: context.message.properties.subject, description: context.message.body});
-        }
-    } else {
-        console.log('no request pending for ' + id + ', ignoring response');
-    }
-};
-
-Client.prototype._ready = function (context) {
-    this._process_pending();
-};
-
-Client.prototype._process_pending = function () {
-    for (var i = 0; i < this.pending.length; i++) {
-        var r = this.pending[i];
-        this._request(r.id, r.name, r.args, r.callback);
-    }
-    this.pending = [];
-};
-
-Client.prototype.call = function (name, args, callback) {
-    var id = this.id_generator.next();
-    if (this.receiver.is_open() && this.pending.length === 0) {
-        this._request(id, name, args, callback);
-    } else {
-        //need to wait for reply-to address
-        this.pending.push({'name':name, 'args':args, 'callback':callback, 'id':id});
-    }
-};
-
-Client.prototype.close = function () {
-    this.receiver.close();
-    this.sender.close();
-    this.connection.close();
-};
-
-Client.prototype.define = function (name) {
-    this[name] = function (args, callback) { this.call(name, args, callback); };
-};
-
-var Cache = function (ttl, purged) {
-    this.ttl = ttl;
-    this.purged = purged;
-    this.entries = {};
-    this.timeout = undefined;
-};
-
-Cache.prototype.clear = function () {
-    if (this.timeout) clearTimeout(this.timeout);
-    this.entries = {};
-}
-
-Cache.prototype.put = function (key, value) {
-    this.entries[key] = {'value':value, 'last_accessed': Date.now()};
-    if (!this.timeout) this.timeout = setTimeout(this.purge.bind(this), this.ttl);
-};
-
-Cache.prototype.get = function (key) {
-    var entry = this.entries[key];
-    if (entry) {
-        entry.last_accessed = Date.now();
-        return entry.value;
-    } else {
-        return undefined;
-    }
-};
-
-Cache.prototype.purge = function() {
-    //TODO: this could be optimised if the map is large
-    var now = Date.now();
-    var expired = [];
-    var live = 0;
-    for (var k in this.entries) {
-        if (now - this.entries[k].last_accessed >= this.ttl) {
-            expired.push(k);
-        } else {
-            live++;
-        }
-    }
-    for (var i = 0; i < expired.length; i++) {
-        var entry = this.entries[expired[i]];
-        delete this.entries[expired[i]];
-        this.purged(entry.value);
-    }
-    if (live && !this.timeout) {
-        this.timeout = setTimeout(this.purge.bind(this), this.ttl);
-    }
-};
-
-var LinkCache = function (factory, ttl) {
-    this.factory = factory;
-    this.cache = new Cache(ttl, function(link) { link.close(); });
-}
-
-LinkCache.prototype.clear = function () {
-    this.cache.clear();
-}
-
-LinkCache.prototype.get = function (address) {
-    var link = this.cache.get(address);
-    if (link === undefined) {
-        link = this.factory(address);
-        this.cache.put(address, link);
-    }
-    return link;
-};
-
-var Server = function (container, address, options) {
-    this.options = options || {};
-    var u = url.parse(address);
-    //TODO: handle scheme and user/password if present
-    this.connection = container.connect({'host':u.hostname, 'port':u.port});
-    this.connection.on('connection_open', this._connection_open.bind(this));
-    this.connection.on('message', this._request.bind(this));
-    this.receiver = this.connection.attach_receiver(u.path.substr(1));
-    this.callbacks = {};
-    this._send = undefined;
-    this._clear = undefined;
-};
-
-function match(desired, offered) {
-    if (offered) {
-        if (Array.isArray(offered)) {
-            return offered.indexOf(desired) > -1;
-        } else {
-            return desired === offered;
-        }
-    } else {
-        return false;
-    }
-}
-
-Server.prototype._connection_open = function (context) {
-    if (match('ANONYMOUS-RELAY', this.connection.remote.open.offered_capabilities)) {
-        var relay = this.connection.attach_sender({target:{}});
-        this._send = function (msg) { relay.send(msg); };
-    } else {
-        var cache = new LinkCache(this.connection.attach_sender.bind(this.connection), this.options.cache_ttl || 60000);
-        this._send = function (msg) { var s = cache.get(msg.properties.to); if (s) s.send(msg); };
-        this._clear = function () { cache.clear(); }
-    }
-}
-
-Server.prototype._respond = function (response) {
-    var server = this;
-    return function (result, error) {
-        if (error) {
-            response.properties.subject = error.name || 'error';
-            response.body = error.description || error;
-        } else {
-            response.properties.subject = 'ok';
-            response.body = result;
-        }
-        server._send(response);
-    };
-}
-
-Server.prototype._request = function (context) {
-    var request = context.message;
-    var response = {properties:{}};
-    response.properties.to = request.properties.reply_to;
-    response.properties.correlation_id = request.properties.message_id;
-    var callback = this.callbacks[request.properties.subject];
-    if (callback) {
-        callback(request.body, this._respond(response));
-    } else {
-        response.properties.subject = 'bad-method';
-        response.body = 'Unrecognised method ' + request.properties.subject;
-        this._send(response);
-    }
-};
-
-Server.prototype.bind_sync = function (f, name) {
-    this.callbacks[name || f.name] = function (args, callback) { var result = f(args); callback(result); };
-};
-Server.prototype.bind = function (f, name) {
-    this.callbacks[name || f.name] = f;
-};
-
-Server.prototype.close = function () {
-    if (this._clear) this._clear();
-    this.receiver.close();
-    this.connection.close();
-};
-
-module.exports = {
-    server : function(container, address, options) { return new Server(container, address, options); },
-    client : function(connection, address) { return new Client(connection, address); }
-};
-
-},{"url":29}],8:[function(require,module,exports){
-(function (Buffer){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed 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.
- */
-'use strict';
-
-var frames = require('./frames.js');
-var log = require('./log.js');
-var Transport = require('./transport.js');
-
-var sasl_codes = {
-    "OK":0,
-    "AUTH":1,
-    "SYS":2,
-    "SYS_PERM":3,
-    "SYS_TEMP":4,
-};
-
-var SASL_PROTOCOL_ID = 0x03;
-
-function intersection(lista, listb) {
-    return lista.filter(function (a) { return listb.indexOf(a) >= 0; });
-}
-function extract(buffer) {
-    var results = [];
-    var start = 0;
-    var i = 0;
-    while (i < buffer.length) {
-        if (buffer[i] === 0x00) {
-            if (i > start) results.push(buffer.toString('utf8', start, i));
-            else results.push(null);
-            start = ++i;
-        } else {
-            ++i;
-        }
-    }
-    if (i > start) results.push(buffer.toString('utf8', start, i));
-    else results.push(null);
-    return results;
-}
-
-var PlainServer = function(callback) {
-    this.callback = callback;
-    this.outcome = undefined;
-    this.username = undefined;
-};
-
-PlainServer.prototype.start = function(response) {
-    var fields = extract(response);
-    if (fields.length !== 3) {
-        this.connection.sasl_failed('Unexpected response in PLAIN, got ' + fields.length + ' fields, expected 3');
-    }
-    if (this.callback(fields[1], fields[2])) {
-        this.outcome = true;
-        this.username = fields[1];
-    } else {
-        this.outcome = false;
-    }
-};
-
-var PlainClient = function(username, password) {
-    this.username = username;
-    this.password = password;
-};
-
-PlainClient.prototype.start = function() {
-    var response = new Buffer(1 + this.username.length + 1 + this.password.length);
-    response.writeUInt8(0, 0);
-    response.write(this.username, 1);
-    response.writeUInt8(0, 1 + this.username.length);
-    response.write(this.password, 1 + this.username.length + 1);
-    return response;
-};
-
-var AnonymousServer = function() {
-    this.outcome = undefined;
-    this.username = undefined;
-};
-
-AnonymousServer.prototype.start = function(response) {
-    this.outcome = true;
-    this.username = response ? response.toString('utf8') : 'anonymous';
-};
-
-var AnonymousClient = function(name) {
-    this.username = name ? name : 'anonymous';
-};
-
-AnonymousClient.prototype.start = function() {
-    var response = new Buffer(1 + this.username.length);
-    response.writeUInt8(0, 0);
-    response.write(this.username, 1);
-    return response;
-};
-
-var ExternalServer = function() {
-    this.outcome = undefined;
-    this.username = undefined;
-};
-
-ExternalServer.prototype.start = function(response) {
-    this.outcome = true;
-};
-
-var ExternalClient = function() {
-    this.username = undefined;
-};
-
-ExternalClient.prototype.start = function() {
-    return null;
-};
-
-/**
- * The mechanisms argument is a map of mechanism names to factory
- * functions for objects that implement that mechanism.
- */
-var SaslServer = function (connection, mechanisms) {
-    this.connection = connection;
-    this.transport = new Transport(connection.amqp_transport.identifier, SASL_PROTOCOL_ID, frames.TYPE_SASL, this);
-    this.next = connection.amqp_transport;
-    this.mechanisms = mechanisms;
-    this.mechanism = undefined;
-    this.outcome = undefined;
-    this.username = undefined;
-    var mechlist = Object.getOwnPropertyNames(mechanisms);
-    this.transport.encode(frames.sasl_frame(frames.sasl_mechanisms({sasl_server_mechanisms:mechlist}).described()));
-};
-
-SaslServer.prototype.do_step = function (challenge) {
-    if (this.mechanism.outcome === undefined) {
-        this.transport.encode(frames.sasl_frame(frames.sasl_challenge({'challenge':challenge}).described()));
-    } else {
-        this.outcome = this.mechanism.outcome ? sasl_codes.OK : sasl_codes.AUTH;
-        this.transport.encode(frames.sasl_frame(frames.sasl_outcome({code: this.outcome}).described()));
-        if (this.outcome === sasl_codes.OK) {
-            this.username = this.mechanism.username;
-            this.transport.write_complete = true;
-            this.transport.read_complete = true;
-        }
-    }
-};
-
-SaslServer.prototype.on_sasl_init = function (frame) {
-    var f = this.mechanisms[frame.performative.mechanism];
-    if (f) {
-        this.mechanism = f();
-        var challenge = this.mechanism.start(frame.performative.initial_response);
-        this.do_step(challenge);
-    } else {
-        this.outcome = sasl_codes.AUTH;
-        this.transport.encode(frames.sasl_frame(frames.sasl_outcome({code: this.outcome}).described()));
-    }
-};
-SaslServer.prototype.on_sasl_response = function (frame) {
-    this.do_step(this.mechanism.step(frame.performative.response));
-};
-
-SaslServer.prototype.has_writes_pending = function () {
-    return this.transport.has_writes_pending() || this.next.has_writes_pending();
-}
-
-SaslServer.prototype.write = function (socket) {
-    if (this.transport.write_complete && this.transport.pending.length === 0) {
-        return this.next.write(socket);
-    } else {
-        return this.transport.write(socket);
-    }
-};
-
-SaslServer.prototype.read = function (buffer) {
-    if (this.transport.read_complete) {
-        return this.next.read(buffer);
-    } else {
-        return this.transport.read(buffer);
-    }
-};
-
-var SaslClient = function (connection, mechanisms) {
-    this.connection = connection;
-    this.transport = new Transport(connection.amqp_transport.identifier, SASL_PROTOCOL_ID, frames.TYPE_SASL, this);
-    this.next = connection.amqp_transport;
-    this.mechanisms = mechanisms;
-    this.mechanism = undefined;
-    this.mechanism_name = undefined;
-    this.failed = false;
-};
-
-SaslClient.prototype.on_sasl_mechanisms = function (frame) {
-    for (var i = 0; this.mechanism === undefined && i < frame.performative.sasl_server_mechanisms.length; i++) {
-        var mech = frame.performative.sasl_server_mechanisms[i];
-        var f = this.mechanisms[mech];
-        if (f) {
-            this.mechanism = f();
-            this.mechanism_name = mech;
-        }
-    }
-    if (this.mechanism) {
-        var response = this.mechanism.start();
-        this.transport.encode(frames.sasl_frame(frames.sasl_init({'mechanism':this.mechanism_name,'initial_response':response}).described()));
-    } else {
-        this.failed = true;
-        this.connection.sasl_failed('No suitable mechanism; server supports ' + frame.performative.sasl_server_mechanisms);
-    }
-};
-SaslClient.prototype.on_sasl_challenge = function (frame) {
-    var response = this.mechanism.step(frame.performative.challenge);
-    this.transport.encode(frames.sasl_frame(frames.sasl_response({'response':response}).described()));
-};
-SaslClient.prototype.on_sasl_outcome = function (frame) {
-    switch (frame.performative.code) {
-    case sasl_codes.OK:
-        this.transport.read_complete = true;
-        this.transport.write_complete = true;
-        break;
-    default:
-        this.transport.write_complete = true;
-        this.connection.sasl_failed("Failed to authenticate: " + frame.performative.code);
-    }
-};
-
-SaslClient.prototype.has_writes_pending = function () {
-    return this.transport.has_writes_pending() || this.next.has_writes_pending();
-}
-
-SaslClient.prototype.write = function (socket) {
-    if (this.transport.write_complete) {
-        return this.next.write(socket);
-    } else {
-        return this.transport.write(socket);
-    }
-};
-
-SaslClient.prototype.read = function (buffer) {
-    if (this.transport.read_complete) {
-        return this.next.read(buffer);
-    } else {
-        return this.transport.read(buffer);
-    }
-};
-
-var default_server_mechanisms = {
-    enable_anonymous: function () {
-        this['ANONYMOUS'] = function() { return new AnonymousServer(); };
-    },
-    enable_plain: function (callback) {
-        this['PLAIN'] = function() { return new PlainServer(callback); };
-    }
-};
-
-var default_client_mechanisms = {
-    enable_anonymous: function (name) {
-        this['ANONYMOUS'] = function() { return new AnonymousClient(name); };
-    },
-    enable_plain: function (username, password) {
-        this['PLAIN'] = function() { return new PlainClient(username, password); };
-    },
-    enable_external: function () {
-        this['EXTERNAL'] = function() { return new ExternalClient(); };
-    }
-};
-
-module.exports = {
-    Client : SaslClient,
-    Server : SaslServer,
-    server_mechanisms : function () {
-        return Object.create(default_server_mechanisms);
-    },
-    client_mechanisms : function () {
-        return Object.create(default_client_mechanisms);
-    },
-    server_add_external: function (mechs) {
-        mechs['EXTERNAL'] = function() { return new ExternalServer(); };
-        return mechs;
-    }
-};
-
-}).call(this,require("buffer").Buffer)
-},{"./frames.js":3,"./log.js":5,"./transport.js":11,"buffer":19}],9:[function(require,module,exports){
-(function (Buffer){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed 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.
- */
-'use strict';
-
-var frames = require('./frames.js');
-var link = require('./link.js');
-var log = require('./log.js');
-var message = require('./message.js');
-var types = require('./types.js');
-var util = require('./util.js');
-var EndpointState = require('./endpoint.js');
-
-var EventEmitter = require('events').EventEmitter;
-
-var CircularBuffer = function (capacity) {
-    this.capacity = capacity;
-    this.size = 0;
-    this.head = 0;
-    this.tail = 0;
-    this.entries = [];
-};
-
-CircularBuffer.prototype.available = function () {
-    return this.capacity - this.size;
-};
-
-CircularBuffer.prototype.push = function (o) {
-    if (this.size < this.capacity) {
-        this.entries[this.tail] = o;
-        this.tail = (this.tail + 1) % this.capacity;
-        this.size++;
-    } else {
-        throw Error('circular buffer overflow: head=' + this.head + ' tail=' + this.tail + ' size=' + this.size + ' capacity=' + this.capacity);
-    }
-};
-
-CircularBuffer.prototype.pop_if = function (f) {
-    var count = 0;
-    while (this.size && f(this.entries[this.head])) {
-        this.entries[this.head] = undefined;
-        this.head = (this.head + 1) % this.capacity;
-        this.size--;
-        count++;
-    }
-    return count;
-};
-
-CircularBuffer.prototype.by_id = function (id) {
-    if (this.size > 0) {
-        var gap = id - this.entries[this.head].id;
-        if (gap < this.size) {
-            return this.entries[(this.head + gap) % this.capacity];
-        }
-    }
-    return undefined;
-};
-
-CircularBuffer.prototype.get_head = function (id) {
-    return this.size > 0 ? this.entries[this.head] : undefined;
-};
-
-
-var Outgoing = function () {
-    this.deliveries = new CircularBuffer(2048/*TODO= configurable?*/);
-    this.updated = [];
-    this.next_delivery_id = 0;
-    this.next_pending_delivery = 0;
-    this.next_transfer_id = 0;
-    this.window = types.MAX_UINT;
-    this.remote_next_transfer_id = undefined;
-    this.remote_window = undefined;
-};
-
-Outgoing.prototype.available = function () {
-    return this.deliveries.available();
-};
-
-Outgoing.prototype.send = function (sender, tag, data, format) {
-    var d = {'id':this.next_delivery_id++,
-             'tag':tag,
-             'link':sender,
-             'data': data,
-             'format':format ? format : 0,
-             'sent': false,
-             'settled': false,
-             'state': undefined,
-             'remote_settled': false,
-             'remote_state': undefined};
-    this.deliveries.push(d);
-    return d;
-};
-
-Outgoing.prototype.on_begin = function (fields) {
-    this.remote_window = fields.incoming_window;
-};
-
-Outgoing.prototype.on_flow = function (fields) {
-    this.remote_next_transfer_id = fields.next_incoming_id;
-    this.remote_window = fields.incoming_window;
-};
-
-Outgoing.prototype.on_disposition = function (fields) {
-    var last = fields.last ? fields.last : fields.first;
-    for (var i = fields.first; i <= last; i++) {
-        var d = this.deliveries.by_id(i);
-        if (!d) {
-            console.log('Could not find delivery for ' + i + ' [' + JSON.stringify(fields) + ']');
-        }
-        if (d && !d.remote_settled) {
-            var updated = false;
-            if (fields.settled) {
-                d.remote_settled = fields.settled;
-                updated = true;
-            }
-            if (fields.state && fields.state !== d.remote_state) {
-                d.remote_state = fields.state;
-                updated = true;
-            }
-            if (updated) {
-                this.updated.push(d);
-            }
-        }
-    }
-};
-
-Outgoing.prototype.transfer_window = function() {
-    if (this.remote_window) {
-        return this.remote_window - (this.next_transfer_id - this.remote_next_transfer_id);
-    }
-};
-
-Outgoing.prototype.process = function() {
-    // send pending deliveries for which there is credit:
-    while (this.next_pending_delivery < this.next_delivery_id) {
-        var d = this.deliveries.by_id(this.next_pending_delivery);
-        if (d) {
-            if (d.link.has_credit()) {
-                d.link.delivery_count++;
-                //TODO: fragment as appropriate
-                d.transfers_required = 1;
-                if (this.transfer_window() >= d.transfers_required) {
-                    this.next_transfer_id += d.transfers_required;
-                    this.window -= d.transfers_required;
-                    d.link.session.output(frames.transfer({'handle':d.link.local.handle,'message_format':d.format,'delivery_id':d.id, 'delivery_tag':d.tag}).described(), d.data);
-                    d.link.credit--;
-                    this.next_pending_delivery++;
-                } else {
-                    log.flow('Incoming window of peer preventing sending further transfers: remote_window=' + this.remote_window + ", remote_next_transfer_id=" + this.remote_next_transfer_id
-                               + ", next_transfer_id=" + this.next_transfer_id);
-                    break;
-                }
-            } else {
-                log.flow('Link has no credit');
-                break;
-            }
-        } else {
-            console.log('ERROR: Next pending delivery not found: ' + this.next_pending_delivery);
-            break;
-        }
-    }
-
-    // notify application of any updated deliveries:
-    for (var i = 0; i < this.updated.length; i++) {
-        var d = this.updated[i];
-        if (d.remote_state) {
-            d.remote_state = message.unwrap_outcome(d.remote_state);
-            if (d.remote_state && d.remote_state.constructor.composite_type) {
-                d.link.dispatch(d.remote_state.constructor.composite_type, d.link._context({'delivery':d}));
-            }
-        }
-        if (d.remote_settled) d.link.dispatch('settled', d.link._context({'delivery':d}));
-    }
-    this.updated = [];
-
-    // remove any fully settled deliveries:
-    this.deliveries.pop_if(function (d) { return d.settled && d.remote_settled; });
-};
-
-var Incoming = function () {
-    this.deliveries = new CircularBuffer(2048/*TODO: configurable?*/);
-    this.updated = [];
-    this.next_transfer_id = 0;
-    this.next_delivery_id = undefined;
-    this.window = 2048/*TODO: configurable?*/;
-    this.remote_next_transfer_id = undefined;
-    this.remote_window = undefined;
-};
-
-Incoming.prototype.update = function (delivery, settled, state) {
-    if (delivery) {
-        delivery.settled = settled;
-        if (state !== undefined) delivery.state = state;
-        if (!delivery.remote_settled) {
-            this.updated.push(delivery);
-        }
-        delivery.link.connection._register();
-    }
-};
-
-Incoming.prototype.on_transfer = function(frame, receiver) {
-    this.next_transfer_id++;
-    if (receiver.is_open()) {
-        if (this.next_delivery_id === undefined) {
-            this.next_delivery_id = frame.performative.delivery_id;
-        }
-        var current;
-        var data;
-        var last = this.deliveries.get_head();
-        if (last && last.incomplete) {
-            if (frame.performative.delivery_id !== undefined && this.next_delivery_id != frame.performative.delivery_id) {
-                //TODO: better error handling
-                throw Error("frame sequence error: delivery " + this.next_delivery_id + " not complete, got " + frame.performative.delivery_id);
-            }
-            current = last;
-            data = Buffer.concat([current.data, frame.payload], current.data.size() + frame.payload.size());
-        } else if (this.next_delivery_id === frame.performative.delivery_id) {
-            current = {'id':frame.performative.delivery_id,
-                       'tag':frame.performative.delivery_tag,
-                       'link':receiver,
-                       'settled': false,
-                       'state': undefined,
-                       'remote_settled': frame.performative.settled,
-                       'remote_state': undefined};
-            var self = this;
-            current.update = function (settled, state) { self.update(current, settled, state); };
-            this.deliveries.push(current);
-            data = frame.payload;
-        } else {
-            //TODO: better error handling
-            throw Error("frame sequence error: expected " + this.next_delivery_id + ", got " + frame.performative.delivery_id);
-        }
-        current.incomplete = frame.performative.more;
-        if (current.incomplete) {
-            current.data = data;
-        } else {
-            receiver.credit--;
-            receiver.delivery_count++;
-            this.next_delivery_id++;
-            receiver.dispatch('message', receiver._context({'message':message.decode(data), 'delivery':current}));
-        }
-    }
-};
-
-Incoming.prototype.process = function () {
-    if (this.updated.length > 0) {
-        var first;
-        var last;
-        var next_id;
-
-        for (var i = 0; i < this.updated.length; i++) {
-            var delivery = this.updated[i];
-            if (first === undefined) {
-                first = delivery;
-                last = delivery;
-                next_id = delivery.id;
-            }
-
-            if (!message.are_outcomes_equivalent(last.state, delivery.state) || last.settled !== delivery.settled || next_id !== delivery.id) {
-                first.link.session.output(frames.disposition({'role':true,'first':first.id,'last':last.id, 'state':first.state, 'settled':first.settled}).described());
-                first = delivery;
-                last = delivery;
-                next_id = delivery.id;
-            } else {
-                if (last.id !== delivery.id) {
-                    last = delivery;
-                }
-                next_id++;
-            }
-        }
-        if (first !== undefined && last !== undefined) {
-            first.link.session.output(frames.disposition({'role':true,'first':first.id,'last':last.id, 'state':first.state, 'settled':first.settled}).described());
-        }
-
-        this.updated = [];
-    }
-
-    // remove any fully settled deliveries:
-    this.deliveries.pop_if(function (d) { return d.settled; });
-};
-
-Incoming.prototype.on_begin = function (fields) {
-    this.remote_window = fields.outgoing_window;
-};
-
-Incoming.prototype.on_flow = function (fields) {
-    this.remote_next_transfer_id = fields.next_outgoing_id;
-    this.remote_window = fields.outgoing_window;
-};
-
-Incoming.prototype.on_disposition = function (fields) {
-    var last = fields.last ? fields.last : fields.first;
-    for (var i = fields.first; i <= last; i++) {
-        var d = this.deliveries.by_id(i);
-        if (!d) {
-            console.log('Could not find delivery for ' + i);
-        }
-        if (d && !d.remote_settled) {
-            var updated = false;
-            if (fields.settled) {
-                d.remote_settled = fields.settled;
-                updated = true;
-            }
-            if (fields.state && fields.state !== d.remote_state) {
-                d.remote_state = fields.state;
-                updated = true;
-            }
-            if (updated) {
-                console.log(d.link.connection.options.id + ' added delivery to updated list following receipt of disposition for incoming deliveries');
-                this.updated.push(d);
-            }
-        }
-    }
-
-};
-
-var Session = function (connection, local_channel) {
-    this.connection = connection;
-    this.outgoing = new Outgoing();
-    this.incoming = new Incoming();
-    this.state = new EndpointState();
-    this.local = {'channel': local_channel, 'handles':{}};
-    this.local.begin = frames.begin({next_outgoing_id:this.outgoing.next_transfer_id,incoming_window:this.incoming.window,outgoing_window:this.outgoing.window});
-    this.local.end = frames.end();
-    this.remote = {'handles':{}};
-    this.links = {}; // map by name
-    this.options = {};
-};
-Session.prototype = Object.create(EventEmitter.prototype);
-Session.prototype.constructor = Session;
-
-Session.prototype.reset = function() {
-    this.state.disconnected();
-    this.outgoing = new Outgoing();
-    this.incoming = new Incoming();
-    this.remote = {'handles':{}};
-    for (var l in this.links) {
-        this.links[l].reset();
-    }
-};
-
-Session.prototype.dispatch = function(name, context) {
-    log.events('Session got event: '+ name);
-    if (this.listeners(name).length) {
-        EventEmitter.prototype.emit.apply(this, arguments);
-    } else {
-        this.connection.dispatch.apply(this.connection, arguments);
-    }
-};
-Session.prototype.output = function (frame, payload) {
-    this.connection._write_frame(this.local.channel, frame, payload);
-};
-
-Session.prototype.create_sender = function (name, opts) {
-    return this.create_link(name, link.Sender, opts);
-};
-
-Session.prototype.create_receiver = function (name, opts) {
-    return this.create_link(name, link.Receiver, opts);
-};
-
-function attach(factory, args, remote_terminus) {
-    var opts = args ? args : {};
-    if (typeof args === 'string') {
-        opts = {};
-        opts[remote_terminus] = args;
-    }
-    if (!opts.name) opts.name = util.generate_uuid();
-    var l = factory(opts.name, opts);
-    for (var t in {'source':0, 'target':0}) {
-        if (opts[t]) {
-            if (typeof opts[t] === 'string') {
-                opts[t] = {'address' : opts[t]};
-            }
-            l['set_' + t](opts[t]);
-        }
-    }
-    l.attach();
-    return l;
-}
-
-Session.prototype.get_option = function (name, default_value) {
-    if (this.options[name] !== undefined) return this.options[name];
-    else return this.connection.get_option(name, default_value);
-};
-
-Session.prototype.attach_sender = function (args) {
-    return attach(this.create_sender.bind(this), args, 'target');
-};
-Session.prototype.open_sender = Session.prototype.attach_sender;//alias
-
-Session.prototype.attach_receiver = function (args) {
-    return attach(this.create_receiver.bind(this), args, 'source');
-};
-Session.prototype.open_receiver = Session.prototype.attach_receiver;//alias
-
-Session.prototype.create_link = function (name, constructor, opts) {
-    var i = 0;
-    while (this.local.handles[i]) i++;
-    var l = new constructor(this, name, i, opts);
-    this.links[name] = l;
-    this.local.handles[i] = l;
-    return l;
-};
-
-Session.prototype.begin = function () {
-    if (this.state.open()) {
-        this.connection._register();
-    }
-};
-Session.prototype.open = Session.prototype.begin;
-
-Session.prototype.end = function () {
-    if (this.state.close()) {
-        this.connection._register();
-    }
-};
-Session.prototype.close = Session.prototype.end;
-
-Session.prototype.is_open = function () {
-    return this.connection.is_open() && this.state.is_open();
-};
-
-Session.prototype.is_closed = function () {
-    return this.connection.is_closed() || this.state.is_closed();
-};
-
-Session.prototype._process = function () {
-    do {
-        if (this.state.need_open()) {
-            this.output(this.local.begin.described());
-        }
-
-        this.outgoing.process();
-        this.incoming.process();
-        for (var k in this.links) {
-            this.links[k]._process();
-        }
-
-        if (this.state.need_close()) {
-            this.output(this.local.end.described());
-        }
-    } while (!this.state.has_settled());
-};
-
-Session.prototype.send = function (sender, tag, data, format) {
-    var d = this.outgoing.send(sender, tag, data, format);
-    this.connection._register();
-    return d;
-};
-
-Session.prototype._write_flow = function (link) {
-    var fields = {'next_incoming_id':this.incoming.next_transfer_id,
-                  'incoming_window':this.incoming.window,
-                  'next_outgoing_id':this.outgoing.next_transfer_id,
-                  'outgoing_window':this.outgoing.window
-                 };
-    if (link) {
-        fields.delivery_count = link.delivery_count;
-        fields.handle = link.local.handle;
-        fields.link_credit = link.credit;
-    }
-    this.output(frames.flow(fields).described());
-};
-
-Session.prototype.on_begin = function (frame) {
-    if (this.state.remote_opened()) {
-        if (!this.remote.channel) {
-            this.remote.channel = frame.channel;
-        }
-        this.remote.begin = frame.performative;
-        this.outgoing.on_begin(frame.performative);
-        this.incoming.on_begin(frame.performative);
-        this.open();
-        this.dispatch('session_open', this._context());
-    } else {
-        throw Error('Begin already received');
-    }
-};
-Session.prototype.on_end = function (frame) {
-    if (this.state.remote_closed()) {
-        this.remote.end = frame.performative;
-        this.close();
-        this.dispatch('session_close', this._context());
-    } else {
-        throw Error('End already received');
-    }
-};
-
-Session.prototype.on_attach = function (frame) {
-    var name = frame.performative.name;
-    var link = this.links[name];
-    if (!link) {
-        // if role is true, peer is receiver, so we are sender
-        link = frame.performative.role ? this.create_sender(name) : this.create_receiver(name);
-    }
-    this.remote.handles[frame.performative.handle] = link;
-    link.on_attach(frame);
-    link.remote.attach = frame.performative;
-};
-
-Session.prototype.on_disposition = function (frame) {
-    if (frame.performative.role) {
-        log.events('Received disposition for outgoing transfers');
-        this.outgoing.on_disposition(frame.performative);
-    } else {
-        log.events('Received disposition for incoming transfers');
-        this.incoming.on_disposition(frame.performative);
-    }
-    this.connection._register();
-}
-
-Session.prototype.on_flow = function (frame) {
-    this.outgoing.on_flow(frame.performative);
-    this.incoming.on_flow(frame.performative);
-    if (frame.performative.handle !== undefined) {
-        this._get_link(frame).on_flow(frame);
-    }
-    this.connection._register();
-}
-Session.prototype._context = function (c) {
-    var context = c ? c : {};
-    context.session = this;
-    return this.connection._context(context);
-};
-
-Session.prototype._get_link = function (frame) {
-    var handle = frame.performative.handle;
-    var link = this.remote.handles[handle];
-    if (!link) {
-        throw Error('Invalid handle ' + handle);
-    }
-    return link;
-};
-
-Session.prototype.on_detach = function (frame) {
-    this._get_link(frame).on_detach(frame);
-    //remove link
-    var handle = frame.performative.handle;
-    var link = this.remote.handles[handle];
-    delete this.remote.handles[handle];
-    delete this.local.handles[link.local.handle];
-    delete this.links[link.name];
-};
-
-Session.prototype.on_transfer = function (frame) {
-    this.incoming.on_transfer(frame, this._get_link(frame));
-};
-
-module.exports = Session;
-
-}).call(this,require("buffer").Buffer)
-},{"./endpoint.js":2,"./frames.js":3,"./link.js":4,"./log.js":5,"./message.js":6,"./types.js":12,"./util.js":13,"buffer":19,"events":23}],10:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed 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.
- */
-'use strict';
-
-var types = require('./types.js');
-
-var terminus = {};
-var by_descriptor = {};
-
-function define_terminus(def) {
-    var c = types.define_composite(def);
-    terminus[def.name] = c.create;
-    by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
-    by_descriptor[c.descriptor.symbolic] = c;
-};
-
-terminus.unwrap = function(field) {
-    if (field && field.descriptor) {
-        var c = by_descriptor[field.descriptor.value];
-        if (c) {
-            return new c(field.value)
-        } else {
-            console.log('Unknown terminus: ' + field.descriptor);
-        }
-    }
-    return null;
-};
-
-define_terminus(
-    {name:"source",
-     code:0x28,
-     fields: [
-         {name:"address", type:"string"},
-         {name:"durable", type:"uint", default_value:0},
-         {name:"expiry_policy", type:"symbol", default_value:"session-end"},
-         {name:"timeout", type:"uint", default_value:0},
-         {name:"dynamic", type:"boolean", default_value:false},
-         {name:"dynamic_node_properties", type:"symbolic_map"},
-         {name:"distribution_mode", type:"symbol"},
-         {name:"filter", type:"symbolic_map"},
-         {name:"default_outcome", type:"*"},
-         {name:"outcomes", type:"symbol", multiple:true},
-         {name:"capabilities", type:"symbol", multiple:true}
-     ]
-    });
-
-define_terminus(
-    {name:"target",
-     code:0x29,
-     fields: [
-         {name:"address", type:"string"},
-         {name:"durable", type:"uint", default_value:0},
-         {name:"expiry_policy", type:"symbol", default_value:"session-end"},
-         {name:"timeout", type:"uint", default_value:0},
-         {name:"dynamic", type:"boolean", default_value:false},
-         {name:"dynamic_node_properties", type:"symbolic_map"},
-         {name:"capabilities", type:"symbol", multiple:true}
-     ]
-    });
-
-module.exports = terminus;
-
-},{"./types.js":12}],11:[function(require,module,exports){
-(function (Buffer){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in 

<TRUNCATED>

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[17/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/css/site-base.css
----------------------------------------------------------------------
diff --git a/console/plugin/css/site-base.css b/console/plugin/css/site-base.css
deleted file mode 100644
index 23141ec..0000000
--- a/console/plugin/css/site-base.css
+++ /dev/null
@@ -1,4482 +0,0 @@
-/*
-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.
-*/
-* {
-  outline: none;
-}
-a:focus {
-  outline: none;
-}
-.navbar .brand {
-  font-size: 18px;
-}
-
-.brand > img {
-  height: 11px;
-  width: auto;
-}
-
-.property-name {
-  white-space: nowrap;
-}
-
-small table tbody tr td.property-name {
-  font-weight: bold;
-  text-align: right;
-}
-
-#log-panel {
-  position: fixed;
-  top: -5px;
-  left: 30px;
-  right: 30px;
-  bottom: 50%;
-  z-index: 10000;
-  background: inherit;
-  transition: bottom 1s ease-in-out;
-}
-
-#log-panel > div {
-  position: relative;
-  width: 100%;
-  height: 100%;
-}
-
-#log-panel #log-panel-statements {
-  margin-left: 0;
-  margin-bottom: 0;
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 20px;
-  overflow-y: auto;
-}
-
-#log-panel-statements li {
-  margin-left: 3px;
-  margin-right: 3px;
-  transition: background .25s ease-in-out;
-}
-
-#log-panel-statements li pre {
-  border-radius: 0;
-  font-size: 11px;
-}
-
-#log-panel-statements li:hover {
-  background: #111111;
-}
-
-#log-panel-statements li.DEBUG {
-  color: dodgerblue;
-}
-
-#log-panel-statements li.INFO {
-  color: white;
-}
-
-#log-panel-statements li.WARN {
-  color: yellow;
-}
-
-#log-panel-statements li.ERROR {
-  color: red;
-}
-
-#log-panel #close {
-  text-align: center;
-  position: absolute;
-  height: 20px;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  box-shadow: 0 1px 13px rgba(0, 0, 0, 0.1) inset;
-  opacity: 1;
-}
-
-#log-panel #copy {
-  position: absolute;
-  right: 23px;
-  bottom: 26px;
-  background: inherit;
-  transition: opacity 1s ease-in-out;
-  opacity: 0.4;
-  cursor: pointer;
-}
-
-#log-panel #copy:hover {
-  opacity: 1;
-}
-
-div.log-stack-trace p {
-  line-height: 14px;
-  margin-bottom: 2px;
-}
-
-#canvas {
-  display: inline-block;
-}
-.fill {
-  min-height: 100%;
-  height: 100%;
-}
-/* sub tab tweaks */
-body div div ul.nav {
-  margin-bottom: 5px;
-  border-bottom: none;
-}
-
-#tree-ctrl {
-  position: relative;
-  top: -3px;
-}
-
-#tree-ctrl > li > a {
-  display: block;
-  padding-left: 5px;
-  padding-right: 5px;
-  /* padding: 5px; */
-}
-
-ul.dynatree-container {
-  background: inherit;
-}
-ul.dynatree-container li {
-  background: inherit;
-}
-/* Chart stuff */
-#charts {
-  display: block;
-  overflow: hidden;
-  margin: 5px auto;
-  position: relative;
-  padding-bottom: 35px;
-}
-.group {
-  margin-bottom: 1em;
-}
-.axis {
-  font: 10px sans-serif;
-  pointer-events: none;
-  z-index: 2;
-}
-.axis.text {
-  -webkit-transition: fill-opacity 250ms linear;
-}
-.axis path {
-  display: none;
-}
-.axis line {
-  stroke: #000;
-  shape-rendering: crispEdges;
-}
-.axis.top {
-  position: relative;
-  top: 0;
-  padding: 0;
-}
-.axis.bottom {
-  position: absolute;
-  bottom: 0px;
-  padding: 0;
-}
-.horizon {
-  overflow: hidden;
-  position: relative;
-}
-.horizon:last-child {
-  border-bottom: none;
-}
-.horizon + .horizon {
-  border-top: none;
-}
-.horizon canvas {
-  display: block;
-}
-.horizon .title,
-.horizon .value {
-  bottom: 0;
-  line-height: 30px;
-  margin: 0 6px;
-  position: absolute;
-  white-space: nowrap;
-}
-.horizon .title {
-  left: 0;
-}
-.horizon .value {
-  right: 0;
-}
-.line {
-  opacity: .2;
-  z-index: 2;
-}
-
-td {
-  padding-right: 20px;
-}
-
-.expandable {
-  padding: 3px;
-}
-
-.expandable > .title {
-  cursor: pointer;
-}
-
-i.expandable-indicator {
-  font-family: FontAwesome;
-  font-weight: normal;
-  font-style: normal;
-  display: inline-block;
-  text-decoration: inherit;
-}
-
-.expandable-body form fieldset legend {
-  font-size: inherit;
-  margin-bottom: 0px;
-}
-
-.expandable.opened i.expandable-indicator:before {
-  font-family: FontAwesome;
-  content: "\f078" !important;
-}
-
-.expandable.closed i.expandable-indicator:before {
-  font-family: FontAwesome;
-  content: "\f054";
-}
-
-.expandable.opened i.expandable-indicator.folder:before {
-  font-family: FontAwesome;
-  content: "\F07C" !important;
-}
-
-.expandable.closed i.expandable-indicator.folder:before {
-  font-family: FontAwesome;
-  content: "\F07B";
-}
-
-.expandable.opened .expandable-body {
-  display: inline-block;
-  margin-bottom: 3px;
-}
-
-.expandable.closed .expandable-body {
-  display: none;
-}
-
-span.dynatree-icon {
-  position: relative;
-  top: -2px;
-  font-size: 17px;
-}
-
-span:not(.dynatree-has-children) .dynatree-icon:before {
-  font-family: FontAwesome;
-  content: "\f013";
-}
-
-ul.inline,
-ol.inline {
-  margin-left: 0;
-  list-style: none;
-}
-
-ul.inline > li,
-ol.inline > li {
-  display: inline-block;
-  padding-right: 2px;
-  padding-left: 2px;
-}
-
-.tab {
-  display: block;
-  margin-left: 1em;
-}
-
-.red {
-  color: red !important;
-}
-
-.orange {
-  color: orange !important;
-}
-
-.yellow {
-  color: yellow !important;
-}
-
-.green {
-  color: green !important;
-}
-
-.background-green {
-  color: white;
-  background-color: #51a351;
-}
-
-.background-light-green {
-  color: white;
-  background-color: #5ab15a;
-}
-
-.blue {
-  color: dodgerblue !important;
-}
-
-.background-blue {
-  color: white;
-  background-color: #006dcc;
-}
-
-.icon1point5x {
-  font-size: 1.5em;
-}
-
-.centered,
-.align-center {
-  margin-left: auto !important;
-  margin-right: auto !important;
-  text-align: center;
-}
-
-.align-right {
-  text-align: right;
-}
-
-.align-left {
-  text-align: left;
-}
-
-.inline {
-  display: inline;
-}
-
-.inline-block,
-.list-row-select,
-.list-row-contents,
-.list-row-contents > .ngCellText {
-  display: inline-block;
-}
-
-.list-row {
-  height: 30px;
-  white-space: nowrap;
-}
-
-.list-row .ngCellText {
-  padding: 0;
-  vertical-align: middle;
-}
-
-.list-row-select,
-.list-row-contents {
-  height: 100%;
-  vertical-align: middle;
-}
-
-.list-row-select > input {
-  vertical-align: middle;
-}
-
-.no-bottom-margin {
-  margin-bottom: 0 !important;
-}
-
-.no-bottom-margin .control-group {
-  margin-bottom: 4px;
-}
-
-.bottom-margin {
-  margin-bottom: 20px;
-}
-
-li.attr-column {
-  width: 1em;
-}
-
-.editor-autoresize .CodeMirror {
-  height: auto;
-}
-
-.well.editor-autoresize {
-  padding: 0px;
-}
-
-.well.editor-autoresize .CodeMirror {
-  margin-bottom: 0px;
-  border: none;
-}
-
-.editor-autoresize .CodeMirror .CodeMirror-scroll {
-  overflow-y: hidden;
-  overflow-x: auto;
-}
-
-.gridster ul#widgets {
-  list-style-type: none;
-}
-
-.gridster ul#widgets .gs_w {
-  padding: 0px;
-  overflow: hidden;
-  position: relative;
-}
-
-.gridster ul#widgets .preview-holder {
-  transition-property: opacity;
-  transition-duration: 500ms;
-  padding: 1px;
-}
-
-.widget-area {
-  position: relative;
-  height: 100%;
-  width: 100%;
-}
-
-.widget-title {
-  margin: 0;
-  padding-left: 5px;
-  padding-right: 5px;
-  z-index: 6000;
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-}
-
-.widget-title:hover {
-  cursor: move;
-}
-
-.widget-title > .row-fluid > .pull-right > i {
-  cursor: pointer;
-  opacity: .25;
-}
-
-.widget-title > .row-fluid > .pull-right > i:hover {
-  transition: opacity 0.25s ease-in-out;
-  -moz-transition: opacity 0.25s ease-in-out;
-  -webkit-transition: opacity 0.25s ease-in-out;
-  opacity: 1;
-}
-
-.widget-body {
-  position: absolute;
-  top: 20px;
-  bottom: 0;
-  left: 0;
-  right: 0;
-}
-
-.height-controls > a {
-  float: left;
-  display: block;
-  opacity: .1;
-  text-decoration: none;
-}
-
-.width-controls > a {
-  float: left;
-  display: block;
-  opacity: .1;
-  text-decoration: none;
-}
-
-.width-controls > a:hover {
-  opacity: .9;
-  text-decoration: none;
-}
-
-.height-controls > a:hover {
-  opacity: .9;
-  text-decoration: none;
-}
-
-.width-controls {
-  font-size: 32px;
-  z-index: 50;
-  position: absolute;
-  width: 1.5em;
-  height: 3em;
-  display: block;
-  right: 5px;
-  top: 43%;
-}
-
-.height-controls {
-  font-size: 32px;
-  z-index: 50;
-  position: absolute;
-  display: block;
-  width: 3em;
-  height: 1.5em;
-  left: 41%;
-  bottom: 5px;
-}
-
-editable-property {
-  position: relative;
-}
-
-.ep.editing {
-  position: absolute;
-  top: -10px;
-  padding: 0;
-  z-index: 10000;
-  border: 1px solid #cecdcd;
-  white-space: nowrap;
-}
-
-/*
-.widget-title > div > div .ep[ng-show=editing] {
-  top: -1px;
-}
-
-table .ep.editing {
-  top: 12px;
-}
-  */
-.ep.editing > form > fieldset > i {
-  position: relative;
-  top: 2px;
-}
-
-.ep > i {
-  cursor: pointer;
-  opacity: .25;
-  transition: opacity 0.25s ease-in-out;
-  -moz-transition: opacity 0.25s ease-in-out;
-  -webkit-transition: opacity 0.25s ease-in-out;
-}
-
-.ep > form > fieldset > input {
-  border: 0;
-}
-
-.ep > i:hover {
-  opacity: 1;
-}
-
-.ep form fieldset i {
-  cursor: pointer;
-  padding-left: 5px;
-}
-
-.ep form.no-bottom-margin {
-  margin: 0;
-}
-
-.ngTotalSelectContainer {
-  margin: 0px;
-}
-
-.ngTopPanel {
-  background: inherit;
-}
-
-.ngGrid {
-  background: inherit;
-}
-
-.ngViewport {
-  margin-left: 0px;
-  margin-right: 0px;
-}
-
-#widgets li div div div div form fieldset div input {
-  display: none;
-}
-#widgets li div div div div div#attributesGrid div div div div.ngHeaderCell {
-  border: none;
-}
-#widgets li div div div div div#attributesGrid div div div div.ngCell {
-  border: none;
-}
-#widgets li div div div div div#attributesGrid div.ngTopPanel {
-  border: none;
-}
-#widgets li div div div div div#attributesGrid div.ngTopPanel div.ngGroupPanel {
-  border: none;
-}
-#widgets li div div div div div#attributesGrid div.ngFooterPanel {
-  border: none;
-  display: none;
-}
-.ngFooterPanel {
-  border-top: none;
-}
-.ngRow .ngCell:last-child {
-  border-right: none;
-}
-.ngRow:last-child {
-  border-bottom: none;
-}
-.ngFooterTotalItems span:first-child {
-  margin-right: .5em;
-}
-
-.ACTIVE:before {
-  font-family: FontAwesome;
-  content: "\f087";
-  font-style: normal;
-  color: #777777;
-}
-
-.RESOLVED:before {
-  font-family: FontAwesome;
-  content: "\f0ad";
-  font-style: normal;
-}
-
-.STARTING:before {
-  font-family: FontAwesome;
-  content: "\f021";
-  font-style: normal;
-}
-
-.STARTING {
-  -moz-animation: spin 2s infinite linear;
-  -o-animation: spin 2s infinite linear;
-  -webkit-animation: spin 2s infinite linear;
-  animation: spin 2s infinite linear;
-}
-
-.STOPPING:before {
-  font-family: FontAwesome;
-  content: "\f021";
-  font-style: normal;
-}
-
-.STOPPING {
-  -moz-animation: spin 2s infinite linear;
-  -o-animation: spin 2s infinite linear;
-  -webkit-animation: spin 2s infinite linear;
-  animation: spin 2s infinite linear;
-}
-
-.UNINSTALLED:before {
-  font-family: FontAwesome;
-  content: "\f014";
-  font-style: normal;
-}
-
-.INSTALLED:before {
-  font-family: FontAwesome;
-  content: "\f06b";
-  font-style: normal;
-}
-
-.table-bordered {
-  border: none;
-  border-radius: 0px;
-}
-
-.table-bordered thead:first-child tr:first-child th:first-child,
-.table-bordered tbody:first-child tr:first-child td:first-child {
-  border-radius: 0px;
-  border-left: none;
-}
-
-.table-bordered th,
-.table-bordered td {
-  border-left: none;
-  border-top: none;
-}
-
-.table-bordered th:last-child,
-.table-bordered td:last-child {
-  border-left: none;
-  border-top: none;
-  border-right: none;
-}
-
-table.table thead .sorting {
-  background: inherit;
-}
-
-table.table thead .sorting_asc:after {
-  background: url('../img/datatable/sort_asc.png') no-repeat top center;
-}
-
-table.table thead .sorting_desc:after {
-  background: url('../img/datatable/sort_desc.png') no-repeat top center;
-}
-
-.dataTables_filter label {
-  margin-bottom: 0px;
-}
-
-.dataTables_filter label input {
-  padding-right: 14px;
-  padding-right: 4px \9;
-  padding-left: 14px;
-  padding-left: 4px \9;
-  margin-bottom: 0;
-}
-
-.nav {
-  margin-bottom: 10px;
-}
-
-.navbar-fixed-top {
-  margin-bottom: 0px;
-}
-
-#main > div > ul.nav,
-ng-include > .nav.nav-tabs {
-  margin-bottom: 10px;
-  min-width: 120px;
-}
-
-#main > div > ul.nav > li, 
-ng-include > .nav.nav-tabs > li {
-  margin-top: 3px;
-  margin-bottom: 3px;
-}
-
-.navbar .btn-navbar span:after {
-  font-family: FontAwesome;
-  content: "\f0de";
-  margin-left: 7px;
-}
-
-.navbar .btn-navbar.collapsed span:after {
-  font-family: FontAwesome;
-  content: "\f0dd";
-  margin-left: 7px;
-}
-
-#main > div > ul.nav,
-ng-include > .nav.nav-tabs {
-  padding-left: 3px;
-  padding-right: 3px;
-}
-
-.nav-tabs > li > a,
-.nav-pills > li > a {
-  margin-right: 0px;
-}
-
-div#main div ul.nav li a,
-div#main div ul.nav li span {
-  padding-bottom: 2px;
-  padding-top: 2px;
-}
-
-div#main div ul.nav li a:hover {
-  padding-bottom: 2px;
-  padding-top: 2px;
-}
-
-#main div div div section .tabbable .nav.nav-tabs {
-  margin-top: 0px;
-  margin-bottom: 10px;
-  min-width: 120px;
-}
-
-#main > div > div > div > .nav.nav-tabs:not(.connected),
-.span12 > .nav.nav-tabs:not(.connected) {
-  margin-top: 5px;
-}
-
-.span12 > .nav.nav-tabs:not(.connected),
-.span12 > .nav.nav-tabs > li {
-  margin: 3px;
-}
-
-.logbar {
-  z-index: 40;
-  position: fixed;
-  width: 87%;
-  top: 70px;
-  left: 5%;
-  padding-left: 20px;
-  padding-right: 20px;
-}
-
-.logbar-container {
-  margin-top: 10px;
-  margin-bottom: 5px;
-}
-
-.logbar-container .control-group {
-  margin-bottom: 5px;
-}
-
-.log-main {
-  margin-top: 55px;
-}
-
-.log-filter {
-  margin-right: 30px;
-}
-
-.ui-resizeable-handle {
-  display: none;
-}
-
-.ui-resizable-se {
-  height: 10px;
-  width: 10px;
-  margin-right: 5px;
-  margin-bottom: 5px;
-  font-size: 32px;
-  z-index: 50;
-  position: absolute;
-  display: block;
-  right: 0px;
-  bottom: 0px;
-  cursor: se-resize;
-}
-
-.no-log {
-  margin-top: 55px;
-}
-
-.control i {
-  cursor: pointer;
-}
-
-td.details {
-  padding: 0px;
-  border: none;
-  margin: 0px;
-  height: 0px;
-}
-
-.innerDetails {
-  padding: 5px;
-  white-space: normal;
-  display: none;
-}
-
-table.dataTable {
-  table-layout: fixed;
-}
-
-table.dataTable tbody tr td {
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-}
-
-.wiki.logbar-container {
-  margin-top: 5px;
-  margin-bottom: 5px;
-}
-
-.wiki.logbar-container > .nav.nav-tabs {
-  margin-top: 0px;
-  margin-bottom: 0px;
-}
-
-.wiki.logbar-container .pull-right {
-  margin-top: 1px;
-}
-
-.wiki-fixed {
-  margin-top: 45px;
-}
-
-.wiki-fixed .pane {
-  top: 120px;
-}
-
-.help-sidebar li {
-  padding-left: 2px;
-  padding-right: 2px;
-}
-
-.help-sidebar li a {
-  padding-left: 3px;
-  padding-right: 3px;
-}
-
-.help-sidebar li:first-child {
-  margin-top: 0px !important;
-  padding-top: 20px;
-}
-
-.help-display p {
-  text-align: justify;
-}
-
-.help-display h5 {
-  margin-top: 2em;
-}
-
-.help-display h6 {
-  margin-top: 2em;
-}
-
-.form-data {
-  display: inline-block;
-  margin: 5px;
-}
-
-input[type="checkbox"].hawtio-checkbox {
-  margin-top: 10px;
-}
-
-.bundle-list {
-  width: 100%;
-}
-
-.bundle-item {
-  position: relative;
-  display: inline-block;
-  width: 300px;
-  margin-bottom: 1px;
-}
-
-.bundle-item-details table {
-  min-height: 0;
-}
-
-.bundle-item-details {
-  height: 0;
-  display: inline-block;
-  z-index: 15;
-}
-
-.bundle-item > a {
-  display: block;
-  z-index: 5;
-}
-
-.bundle-item > a:hover {
-  text-decoration: none;
-}
-
-.bundle-item a span {
-  display: block;
-  padding: 8px;
-  font-weight: normal;
-  z-index: 6;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.bundle-item a span.badge {
-  margin-left: 7px;
-}
-
-.bundle-item a span.badge::before {
-  padding: 0px;
-  float: left;
-  position: relative;
-  top: 4px;
-  left: -8px;
-  display: block;
-  content: ' ';
-  height: 6px;
-  width: 6px;
-  z-index: 10;
-}
-
-.bundle-item a.toggle-action {
-  position: absolute;
-  display: block;
-  width: 16px;
-  height: 16px;
-  margin: 0;
-  padding: 0;
-  right: 12px;
-  top: 6px;
-  opacity: 0.2;
-  transition: all 500ms ease-in-out;
-  font-size: 18px;
-}
-
-.bundle-item a.toggle-action .icon-power-off {
-  color: orange;
-}
-
-.bundle-item a.toggle-action .icon-play-circle {
-  color: green;
-}
-
-.bundle-item a.toggle-action:hover {
-  opacity: 1;
-  text-decoration: none;
-}
-
-.bundle-list {
-  margin-bottom: 2em;
-}
-
-div.hawtio-form-tabs div.tab-content {
-  padding-top: 15px;
-  padding: 10px;
-}
-
-.hawtio-form fieldset legend {
-  margin-bottom: 0;
-  border-bottom: none;
-  font-size: 15px;
-}
-
-.spacer {
-  display: inline-block;
-  margin-bottom: 10px;
-}
-
-div.hawtio-form-tabs ul.nav-tabs {
-  margin-bottom: 0px !important;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li {
-  margin-bottom: -1px !important;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li.active:first-child {
-  margin-left: 0px;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li.active {
-  margin-right: 1px;
-  margin-left: 2px;
-  box-shadow: 0 -10px 10px -10px rgba(0, 0, 0, 0.1) !important;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li.active a {
-  font-weight: bold;
-}
-
-.popover-inner .popover-title {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.popover {
-  width: auto;
-}
-
-li.stacktrace {
-  line-height: 10px;
-}
-
-.control-button {
-  width: 14px;
-}
-
-.ngViewport:focus {
-  outline: none;
-}
-
-.wikiGridStyle {
-  height: 350px;
-}
-
-/** Animations */
-.wave-enter-setup,
-.wave-leave-setup {
-  transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
-}
-
-.wave-enter-setup {
-  position: absolute;
-  left: -100%;
-}
-
-.wave-enter-start {
-  left: 0;
-}
-
-.wave-leave-setup {
-  position: absolute;
-  left: 0;
-}
-
-.wave-leave-start {
-  left: 100%;
-}
-
-/* slideout directive stuff */
-.slideout {
-  position: fixed;
-  z-index: 3000;
-  width: 75%;
-}
-
-.slideout > .slideout-title {
-  min-height: 22px;
-  font-size: 20px;
-  padding: 15px;
-}
-
-.slideout > .slideout-content {
-  position: relative;
-  min-height: 93%;
-  max-height: 93%;
-  overflow: auto;
-  -webkit-transform: translateZ(0);
-}
-
-.slideout-title span {
-  width: 97%;
-  display: inline-block;
-  text-align: left;
-}
-
-.slideout.left > .slideout-content {
-  left: 0;
-  top: 0;
-  margin-right: 2px;
-  margin-left: 0px;
-}
-
-.slideout.right > .slideout-content {
-  left: 2px;
-  top: 0;
-  margin-left: 2px;
-  margin-right: 0px;
-}
-
-.slideout > .slideout-content > .slideout-body {
-  margin: 5px;
-  height: 100%;  
-}
-
-.slideout.right {
-  left: 100%;
-}
-
-.slideout.left {
-  left: -75%;
-}
-
-.slideout .slideout-title a {
-  display: inline-block;
-}
-
-.slideout .slideout-title a:hover {
-  text-decoration: none;
-}
-
-.slideout.right .slideout-title a {
-  margin-left: 5px;
-  float: left;
-}
-
-.out {
-  transition: left 1s, right 1s ease-in-out;
-}
-
-.slideout.left .slideout-title a {
-  margin-right: 5px;
-  float: right;
-}
-
-.slideout.right.out {
-  left: 25%;
-}
-
-.slideout.left.out {
-  left: 0%;
-}
-
-.column-filter {
-  width: 94%;
-  margin-bottom: 10px !important;
-}
-
-.color-picker {
-  display: inline-block;
-  position: relative;
-  margin: 0px;
-  line-height: 0px;
-}
-
-.color-picker .wrapper {
-  display: inline-block;
-  padding: 2px;
-  line-height: 0;
-}
-
-.selected-color {
-  width: 1em;
-  height: 1em;
-  padding: 4px;
-  transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
-  display: inline-block;
-  cursor: pointer;
-}
-
-.color-picker-popout {
-  transition: opacity 0.25s ease-in-out;
-  position: absolute;
-  top: 0px;
-  overflow: hidden;
-  padding: 0px;
-  line-height: 0;
-  margin: 0px;
-  width: 0px;
-  opacity: 0;
-}
-
-.popout-open {
-  padding: 1px;
-  width: auto;
-  opacity: 1;
-}
-
-.color-picker div table tr td div {
-  width: 1em;
-  height: 1em;
-  padding: 3px;
-  transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
-}
-
-.color-picker div table tr td {
-  padding-right: 5px;
-}
-
-.color-picker div table tr td:last-child {
-  padding-right: 0px;
-}
-
-.modal-body div form fieldset div.spacer {
-  display: inherit;
-  margin-bottom: inherit;
-}
-
-.mouse-pointer {
-  cursor: pointer;
-}
-
-.clickable {
-  cursor: pointer;
-  opacity: 0.6;
-  transition: opacity .5s;
-  text-decoration: none;
-}
-
-.clickable,
-.clickable:before {
-  width: 16px;
-  height: 16px;
-  line-height: 16px;
-}
-
-.clickable.no-fade {
-  transition: none;
-  opacity: 1;
-}
-
-.clickable:hover {
-  opacity: 1;
-  text-decoration: none;
-}
-
-.hawtio-pager {
-  overflow: auto;
-  display: inline-block;
-}
-
-.hawtio-pager label {
-  min-height: 100%;
-  vertical-align: middle;
-  margin-right: 5px;
-  display: inline-block;
-}
-
-.fabric-view {
-  position: relative;
-  min-width: 928px;
-}
-
-.columns {
-  position: absolute;
-  bottom: 0;
-  top: 0;
-  left: 0;
-  right: 0;
-  padding-left: 300px;
-  padding-right: 304px;
-  padding-bottom: 0px;
-  padding-top: 0px;
-}
-
-.column {
-  float: left;
-  position: relative;
-  margin-top: 0px;
-  margin-bottom: 0;
-  height: 100%;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.columns #center {
-  width: 100%;
-  padding: 0 5px;
-  margin-right: 8px;
-}
-
-.columns #left {
-  width: 280px;
-  padding: 0 5px;
-  margin-left: -100%;
-  right: 315px;
-}
-
-.columns #right {
-  width: 270px;
-  padding: 0 5px;
-  margin-right: -330px;
-}
-
-.canvas {
-  height: 91%;
-}
-
-.container-section {
-  height: 90%;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.profile-section {
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.box.ui-draggable-dragging {
-  width: 274px;
-  transition: none;
-}
-
-.box.selected .box-right i {
-  text-shadow: none;
-}
-
-.contained {
-  display: inline-block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  position: relative;
-  white-space: nowrap;
-}
-
-h2 > .contained {
-  top: 5px;
-}
-
-h4 > .contained {
-  top: 4px;
-}
-
-.dropdown-toggle > .contained,
-.breadcrumb-link > .contained {
-  top: 2px;
-  line-height: 15px;
-}
-
-/* these widths are totally arbitrary */
-.c-narrow {
-  max-width: 5em;
-}
-
-.c-medium {
-  max-width: 10em;
-}
-
-.c-wide {
-  max-width: 15em;
-}
-
-.c-wide2 {
-  max-width: 20em;
-}
-
-.c-wide3 {
-  max-width: 25em;
-  min-width: 10em;
-}
-
-.c-max {
-  width: 100%;
-}
-
-.fabric-page-header > .profile-summary-wide {
-  margin-left: 10px;
-  line-height: 22px;
-}
-
-.profile-selector-name > .contained {
-  top: 8px;
-}
-
-.box {
-  cursor: pointer;
-  height: 50px;
-  overflow: hidden;
-  padding: 0;
-  margin: 0;
-  position: relative;
-  text-overflow: ellipsis;
-  transition: all 0.2s ease 0s;
-  white-space: nowrap;
-  line-height: 22px;
-  vertical-align: middle;
-}
-
-.box > .box-left,
-.box > .box-right,
-.box > .box-middle {
-  display: inline-block;
-  position: absolute;
-  vertical-align: middle;
-  top: 0;
-  bottom: 0;
-  padding-top: 10px;
-}
-
-.box > .box-left {
-  left: 11px;
-}
-
-.box > .box-right {
-  right: 11px;
-}
-
-.box > .box-middle {
-  right: 60px;
-}
-
-.box > .box-left > div,
-.box > .box-right > div,
-.box > .box-middle > div {
-
-}
-
-.box > .box-left > div > div,
-.box > .box-right > div > div,
-.box > .box-middle > div > div {
-  vertical-align: middle;
-  display: inline-block;
-  margin-left: 4px;
-  margin-right: 4px;
-}
-
-
-.box > .box-left > div > div .contained,
-.box > .box-left > div > div > span,
-.box > .box-right > div > div .contained,
-.box > .box-middle > div > div .contained {
-  vertical-align: middle;
-}
-
-
-.box > .box-left > .profile-select {
-  display: inline-block;
-  top: 9px;
-  max-width: 210px;
-  width: 210px;
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-}
-
-.box input[type='checkbox'] {
-  margin-top: 5px;
-  display: inline;
-}
-
-.box .active-profile a.invisible {
-  visibility: none;
-}
-
-.box .active-profile div {
-  display: inline;
-}
-
-.box .active-profile {
-  position: absolute;
-  display: inline-block;
-  top: 10px;
-  left: 12px;
-  right: 0px;
-}
-
-.box .active-profile [class^='icon-circle'] {
-  top: 0;
-}
-
-.box-middle ul.inline li {
-  opacity: 0.5;
-  transition: opacity 0.5s;
-}
-
-.box-middle ul.inline li:hover{
-  opacity: 1;
-}
-
-.section-header {
-  padding: 5px 7px;
-}
-
-.selection-controls {
-  display: inline-block;
-}
-
-.section-title {
-  margin-left: 10px;
-  display: inline-block;
-}
-
-.section-controls {
-  display: inline-block;
-  float: right;
-}
-
-#center .section-header .section-controls {
-  position: relative;
-  top: 7px;
-  left: -2px;
-}
-
-.page-padded .section-header .section-controls {
-  position: relative;
-  top: 6px;
-  left: -3px;
-}
-
-.page-padded .section-header .selection-controls {
-  position: relative;
-  top: 1px;
-}
-
-.section-controls > a,
-.section-controls > span > span > span > span > span > .hawtio-dropdown {
-  margin-left: 12px;
-  margin-right: 12px;
-  cursor: pointer;
-}
-
-.section-controls > a:hover,
-.section-controls > span:hover {
-  text-decoration: none;
-}
-
-.section-controls > a.nav-danger {
-  color: IndianRed !important;
-}
-
-.section-controls > a.nav-danger:hover {
-  text-shadow: rgba(205, 92, 92, 0.6) 0 0 20px !important;
-}
-
-.page-padded .section-header .section-filter {
-  margin-top: 0px;
-}
-
-.section-filter {
-  position: relative;
-  display: inline-block;
-  margin-left: 12px;
-}
-
-.active-profile-filter > .section-filter {
-  margin-top: 5px;
-}
-
-#center > .section-header > .section-filter {
-  margin-top: 0px;
-}
-
-#right > .section-header > .section-filter {
-  margin-left: 8px;
-}
-
-#right > .canvas {
-  height: 80%;
-}
-
-.section-filter .icon-remove {
-  position: absolute;
-  top: 7px;
-  right: 9px;
-}
-
-.features-toolbar {
-  position: relative;
-  margin-bottom: 0.5em;
-}
-
-.version-section > .canvas > div > .box {
-  line-height: inherit;
-}
-
-.version-section select {
-  width: 100%;
-  margin-top: 5px;
-  margin-bottom: 5px;
-}
-
-span.remove {
-  float: right;
-}
-
-span.deleting {
-  text-decoration: line-through;
-}
-
-td.deleting {
-  background-color: IndianRed !important;
-}
-
-td.adding {
-  background-color: Aquamarine !important;
-}
-
-.no-match-filter {
-  display: none;
-}
-
-.file-upload div form fieldset .input-prepend .btn {
-  float: left;
-}
-
-@-moz-document url-prefix() {
-  /* hack to get the add button to line up correctly in FF */
-  .input-prepend .btn {
-    padding-top: 5px;
-    padding-bottom: 5px;
-  }
-}
-
-.input-prepend .progress {
-  position: relative;
-  left: 1px;
-  top: 0px;
-  min-height: 30px;
-  width: 160px;
-}
-
-.login-wrapper {
-  position: absolute;
-  left: 0;
-  top: 350px;
-  padding-top: 2px;
-  padding-bottom: 2px;
-  padding-left: 0;
-  padding-right: 0;
-  line-height: 0;
-  width: 100%;
-}
-
-.login-wrapper form {
-  margin-bottom: 0px;
-  padding-top: 67px;
-  padding-bottom: 7px;
-  padding-right: 40px;
-  padding-left: 40px;
-}
-
-.login-wrapper form fieldset {
-  width: 413px;
-}
-
-.login-form form fieldset .control-group {
-  margin-bottom: 15px;
-  margin-left: 5px;
-}
-
-.login-form form fieldset .control-group button[type='submit'] {
-  float: right;
-}
-
-.login-logo {
-  display: block;
-  position: absolute;
-  letter-spacing: 5px;
-  padding: 10px;
-  font-size: 20px;
-  left: 233px;
-  top: 9px;
-}
-
-.login-logo > img {
-  height: 30px;
-}
-
-/** highlight required fields which have no focus */
-input.ng-invalid,
-textarea.ng-invalid,
-select.ng-invalid {
-  border-color: #e5e971;
-  -webkit-box-shadow: 0 0 6px #eff898;
-  -moz-box-shadow: 0 0 6px #eff898;
-  box-shadow: 0 0 6px #eff898;
-}
-
-/** Use bigger and darker border on checkboxes as its hard to see since they already have a shadow */
-input[type="checkbox"].ng-invalid {
-  -webkit-box-shadow: 0 0 12px #e5e971;
-  -moz-box-shadow: 0 0 12px #e5e971;
-  box-shadow: 0 0 12px #e5e971;
-}
-
-.container-profile-settings {
-  min-width: 360px;
-}
-
-.container-settings {
-  min-width: 360px;
-}
-
-.bold {
-  font-weight: bold;
-}
-
-.container-settings dd .ep {
-  display: inline-block;
-  top: -5px;
-}
-
-.deployment-pane h3 {
-  margin-top: 0px;
-}
-
-.deployment-pane ul li i {
-  display: inline-block;
-  white-space: nowrap;
-}
-
-.deployment-pane ul li {
-  white-space: nowrap;
-  padding: 7px;
-}
-
-.deployment-pane ul li editable-property {
-  display: inline-block;
-}
-
-.deployment-pane ul li .ep {
-  display: inline-block;
-}
-
-.container-settings dd input[type=radio] {
-  display: inline-block;
-}
-
-.fabric-page-header .span4 h1,
-.fabric-page-header .span4 h2 {
-  line-height: inherit;
-}
-
-.fabric-page-header h2.inline-block {
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.create-container-body {
-  margin-top: 10px;
-}
-
-.log-stack-trace > dd {
-  margin-left: 0;
-}
-
-.log-message > dd > div {
-  margin-top: 10px;
-}
-
-.log-stack-trace > dd > ul {
-  margin-top: 10px;
-}
-
-.log-stack-trace > dd > ul > li {
-  line-height: 12px;
-}
-
-.log-stack-trace > dd > ul > li > div.stack-line > a {
-  font-weight: bold;
-}
-
-pre.stack-line {
-  padding: 0;
-  margin: 0;
-  line-height: 14px;
-}
-
-div.stack-line {
-  white-space: pre-wrap;
-  word-break: break-all;
-  word-wrap: break-word;
-  line-height: 14px;
-}
-
-#container-create-form {
-  margin-bottom: 14px;
-}
-
-#container-create-form .control-group {
-  margin-bottom: 0px;
-}
-
-h1.ajaxError {
-  font-size: 16px;
-}
-
-h2.ajaxError {
-  font-size: 14px;
-}
-
-h3.ajaxError,
-h4.ajaxError {
-  font-size: 12px;
-}
-
-.directive-example {
-  padding: 10px;
-  margin: 10px;
-}
-
-div#main div ul.nav li a.nav-primary.active {
-  color: rgba(255, 255, 255, 0.75);
-}
-
-div#main div ul.nav li a.nav-primary {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #006dcc;
-  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
-  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
-  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
-  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
-  border-color: #0044cc #0044cc #002a80;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #0044cc;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-div#main div ul.nav li a.nav-primary:hover,
-div#main div ul.nav li a.nav-primary:active,
-div#main div ul.nav li a.nav-primary.active,
-div#main div ul.nav li a.nav-primary.disabled,
-div#main div ul.nav li a.nav-primary[disabled] {
-  color: #ffffff;
-  background-color: #0044cc;
-  *background-color: #003bb3;
-}
-
-div#main div ul.nav li a.nav-primary:active,
-div#main div ul.nav li a.nav-primary.active {
-  background-color: #003399 \9;
-}
-
-.nav.nav-tabs li a[disabled] {
-  cursor: not-allowed;
-  opacity: 0.3;
-}
-
-.caret:before {
-  font-family: 'FontAwesome';
-  border: 0;
-  content: "\f078";
-  font-size: 11px;
-  display: block;
-  position: relative;
-  top: -9px;
-  left: 0;
-}
-
-.dropdown.perspective-selector .caret:before {
-  top: -7px;
-}
-
-.caret {
-  border: none;
-  width: 9px;
-}
-
-div#main div ul.nav li a.nav-primary .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.main-nav-upper .container:before {
-  display: none;
-}
-
-.main-nav-upper .container:after {
-  display: none;
-}
-
-.main-nav-upper .container {
-  width: auto;
-  line-height: 23px;
-  vertical-align: auto;
-}
-
-.main-nav-upper .icon-desktop:before {
-  position:relative;
-  top: 1px;
-}
-
-.main-nav-lower .container:before {
-  display: none;
-}
-
-.main-nav-lower .container:after {
-  display: none;
-}
-
-.main-nav-lower .container {
-  width: 100%;
-}
-
-.overflow > .dropdown-toggle:not(.open) + .dropdown-menu {
-  border: none;
-}
-
-.main-nav-lower .container ul.nav {
-  width: 100%;
-}
-
-.navbar-inner {
-  height: auto;
-  min-height: 0;
-}
-
-.main-nav-upper {
-  height: 28px;
-  min-height: 28px;
-  font-size: 11px;
-}
-
-.main-nav-upper .brand {
-  font-size: 13px;
-  margin-left: 0px;
-  padding: 0px;
-  font-weight: normal;
-  margin-left: 20px;
-}
-
-.main-nav-upper .nav li a {
-  padding-top: 2px;
-  padding-bottom: 5px;
-}
-
-#main-nav {
-  max-height: 70px;
-}
-
-#main {
-  margin-top: 70px !important;
-}
-
-dd.file-list {
-  margin-left: 0;
-}
-
-.file-list-toolbar .nav .caption {
-  font-weight: bold;
-  padding-top: 5px;
-  padding-bottom: 5px;
-  padding-left: 0 !important;
-}
-
-.file-icon {
-  padding: 0;
-  margin: 0;
-  display: inline-block;
-  width: 16px;
-  height: 16px;
-  margin-right: 6px;
-}
-
-.file-icon i {
-  width: 16px;
-  height: 16px;
-  font-size: 17px;
-  position: relative;
-  left: 2px;
-  top: 2px;
-}
-
-.file-icon img {
-  width: 16px;
-  height: 16px;
-}
-
-.page-padded {
-  padding-left: 20px;
-  padding-right: 20px;
-}
-
-.fabric-page-header .span4 h2 i {
-  margin-right: 13px;
-}
-
-.controller-section-widget {
-  padding: 3px;
-}
-
-.container-dashboard-controls {
-  position: relative;
-  z-index: 10;
-}
-
-.container-dashboard-controls .pull-right .btn {
-  opacity: 0.5;
-  transition: opacity 1s;
-}
-
-.container-dashboard-controls .pull-right .btn:hover {
-  opacity: 0.9;
-}
-
-.container-dashboard-status-table {
-  position: relative;
-  top: -34px;
-  display: table;
-  max-width: 278px;
-  z-index: 9;
-}
-
-.container-status-dashboard {
-  text-align: center;
-  display: table-cell;
-  min-width: 144px;
-}
-
-.container-status-dashboard i {
-  position: relative;
-  left: 0px;
-  font-size: 133px;
-}
-
-.status-icon {
-  display: inline-block;
-  text-decoration: none;
-  color: inherit;
-}
-
-.status-icon:hover {
-  text-decoration: none;
-}
-
-.dashboard-service-list {
-  display: table-cell;
-  min-width: 139px;
-  vertical-align: middle;
-}
-
-.container-dashboard-profile-controls {
-  width: 100%;
-  text-align: center;
-  margin-bottom: 5px;
-}
-
-.no-list {
-  list-style-type: none;
-}
-
-.profile-selector-item {
-  display: table;
-}
-
-.profile-selector-checkbox {
-  display: table-cell;
-  padding-right: 5px;
-}
-
-.profile-selector-name {
-  display: table-cell;
-  position: relative;
-  width: 100%;
-}
-
-.profile-info {
-  position: absolute;
-  right: 3px;
-}
-
-.profile-list ul {
-  margin-left: 0;
-  margin-bottom: 0;
-}
-
-.profile-list ul li .expandable .expandable-body {
-  margin-left: 16px;
-}
-
-/** fabric active profiles */
-.active-profile-titles {
-  position: relative;
-  display: inline-block;
-  width: 100%;
-  height: 40px;
-}
-
-.active-profile-list .expandable {
-  padding: 0;
-}
-
-.active-profile-titles.section-header {
-  padding: 0;
-}
-
-.active-profile-titles div:not(.active-profile-filter) {
-  display: inline-block;
-  font-weight: bold;
-  top: 10px;
-}
-
-.active-profile-row {
-  position: relative;
-  display: inline-block;
-  width: 100%;
-  line-height: 22px;
-  height: 22px;
-}
-
-.active-profile-row div {
-  display: inline-block;
-}
-
-.active-profile-list .expandable .expandable-body {
-  width: 100%;
-}
-
-.active-profile-list .expandable .expandable-body ul li .box {
-  background: inherit;
-}
-
-.active-profile-list .expandable .expandable-body ul li .child-container {
-  margin-left: 0;
-}
-
-.active-profile-expander {
-  position: absolute;
-  left: 0;
-}
-
-.active-profile-requirements {
-  position: absolute;
-  right: 75px;
-}
-
-.active-profile-requirements-title {
-  position: absolute;
-  right: 75px;
-}
-
-.active-profile-create {
-  position: absolute;
-  right: 210px;
-}
-
-.active-profile-count {
-  position: absolute;
-  right: 0px;
-}
-
-.active-profile-count-title {
-  padding: 5px;
-  text-align: right;
-  font-weight: bold;
-}
-
-.active-profile-titles .section-controls {
-  position: absolute;
-  top: 10px !important;
-  right: 10px;
-}
-
-.active-profile-titles .section-controls a {
-  font-weight: normal;
-}
-
-
-.active-profile-name {
-  position: absolute;
-  left: 35px;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  right: 95px;
-}
-
-.active-profile-icon {
-  position: absolute;
-  top: 1px;
-  left: 15px;
-  color: green !important;
-}
-
-.active-profile-icon i {
-  font-size: 17px;
-}
-
-.active-profile-filter {
-  position: absolute;
-  left: 0px;
-  top: -10px;
-}
-
-.active-profile-main {
-  min-width: 754px;
-}
-
-.active-profile-count a .icon-plus {
-  position: relative;
-  top: 1px;
-}
-
-.active-profile-count a:hover {
-  text-decoration: none;
-}
-
-/** fabric brokers page */
-.mq-titles {
-  position: relative;
-  display: inline-block;
-  width: 100%;
-  height: 40px;
-}
-
-.mq-titles.section-header {
-  padding: 0;
-}
-
-.mq-titles .section-controls {
-  position: absolute;
-  top: 9px !important;
-  right: 0px;
-}
-
-.mq-titles .section-controls a {
-  font-weight: normal;
-}
-
-.mq-profile-icon {
-  color: green !important;
-}
-
-.mq-profile-list, .mq-broker-list, .mq-container-list {
-  margin-left: 15px;
-}
-
-i.mq-master {
-  color: orange;
-}
-
-.mq-broker-rectangle, .mq-container-rectangle {
-  position: relative;
-
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-
-  margin-left: 5px;
-  margin-right: 5px;
-  margin-bottom: 5px;
-  margin-top: 5px;
-
-  border-left-width: 10px;
-  border-right-width: 10px;
-  border-top-width: 10px;
-
-  *zoom: 1;
-  padding: 4px 12px;
-  margin-bottom: 0;
-  font-size: 14px;
-  line-height: 20px;
-  *line-height: 20px;
-  text-align: center;
-  vertical-align: middle;
-  cursor: pointer;
-}
-
-.mq-page {
-  position: relative;
-}
-
-.mq-page .hero-unit {
-  position: absolute;
-  top: 53px;
-  left: 10px;
-  right: 10px;
-}
-
-.mq-groups {
-  position: absolute;
-  top: 42px;
-  left: 19px;
-  right: 10px;
-}
-
-.mq-group-rectangle:first-child {
-  margin-top: 10px;
-}
-
-.mq-group-rectangle {
-  position: relative;
-  margin-left: 0;
-  margin-right: 10px;
-  margin-bottom: 10px;
-  margin-top: 0;
-}
-
-.mq-group-rectangle-label .mq-group-name {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  position: absolute;
-  top: 61px;
-  left: 4px;
-  right: 0;
-}
-
-.mq-group-rectangle-label a {
-  position: absolute;
-  top: 5px;
-  right: 5px;
-}
-
-.mq-group-rectangle-label {
-  position: relative;
-  top: 7px;
-  display: inline-block;
-  min-width: 150px;
-  max-width: 150px;
-  min-height: 150px;
-}
-
-.mq-profiles {
-  position: absolute;
-  min-height: 185px;
-  left: 150px;
-  right: 0;
-  display: inline-block;
-  overflow-x: auto;
-}
-
-.mq-profiles .mq-profile-canvas {
-  overflow: auto;
-}
-
-.mq-profile-rectangle {
-  display: inline-block;
-  height: 150px;
-  margin: 0;
-  margin-top: 5px;
-  margin-left: 10px;
-  padding-left: 4px;
-  padding-right: 4px;
-  padding-top: 4px;
-}
-
-.mq-profile-rectangle-label {
-  position: relative;
-  top: 2px;
-}
-
-.mq-profile-name {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  margin-right: 48px;
-  max-width: 300px;
-  display: block;
-}
-
-.mq-profile-rectangle-label .mq-profile-create-broker {
-  position: absolute;
-  top: 0;
-  right: 0;
-}
-
-.mq-profile-canvas {
-  display: inline-block;
-}
-
-.mq-broker-area {
-  position: relative;
-  top: 11px;
-  text-align: center;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-.mq-container-rectangle {
-  margin-top: 2px;
-  width: 20px;
-}
-
-.mq-container-row {
-  display: block;
-  margin-top: 8px;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-.mq-broker-rectangle {
-  height: 88px;
-}
-
-.mq-group-rectangle-label, .mq-profile-rectangle-label, .mq-broker-rectangle-label, .mq-container-rectangle-label {
-  white-space:nowrap;
-}
-
-/** dashboard */
-.dashboard-link-row {
-  width: 100%;
-  position: relative;
-}
-
-a.dashboard-link {
-  line-height: 15px;
-  font-weight: normal;
-}
-
-a.dashboard-link:hover {
-  text-decoration: none;
-}
-
-.dashboard-link {
-  position: absolute;
-  top: 15px;
-  right: 76px;
-  z-index: 500;
-}
-
-.container-list-main {
-  min-width: 592px;
-}
-
-.widget-title > .row-fluid {
-  position: relative;
-}
-
-.widget-title > .row-fluid > .pull-left {
-  position: absolute;
-  right: 16px;
-  left: 0;
-}
-
-.widget-title > .row-fluid > .pull-left > .ep > div {
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-}
-
-.container-detail-profiles {
-  position: relative;
-  margin-top: 2px;
-}
-
-.container-detail-profile-buttons {
-  position: absolute;
-  right: 0;
-  z-index: 50;
-}
-
-#dialog-body div .profile-list {
-  max-height: 327px;
-  overflow-y: auto;
-}
-
-@media (max-width: 979px) {
-  .navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner {
-    padding: 0;
-  }
-
-  .navbar-fixed-top, .navbar-fixed-bottom {
-    position: fixed;
-  }
-
-}
-
-.header-list li {
-  vertical-align: top;
-  height: 30px;
-}
-
-.header-list li div {
-  height: 30px;
-}
-
-.provision-list {
-  margin-left: 0px;
-}
-
-.provision-list ul {
-  margin-left: 0px;
-}
-
-.provision-list ul li {
-  list-style-type: none;
-  padding: 7px;
-}
-
-ul.zebra-list {
-  margin-left: 0;
-}
-
-.zebra-list li {
-  padding: 7px;
-}
-
-ul.zebra-list > li {
-  list-style-type: none;
-}
-
-ol.zebra-list {
-  counter-reset:li;
-  margin-left: 0;
-  padding-left: 0;
-}
-
-ol.zebra-list > li {
-  position: relative;
-  list-style-type: none;
-}
-
-ol.zebra-list > li:before {
-  content: counter(li);
-  counter-increment: li;
-  padding: 7px;
-  font-weight: bold;
-}
-
-.pointer {
-  cursor: pointer;
-}
-
-.container-profile-settings span.folder-title {
-  font-weight: bold;
-}
-li.profile-selector-folder span.folder-title:hover, li.profile div.profile-selector-name>span>span:hover {
-  color: #005580;
-}
-.widget-body div div .wiki-fixed {
-  margin: 3px;
-}
-
-.loading {
-  position: relative;
-  top: 140px;
-}
-
-.loading p {
-  margin-top: 20px;
-  font-weight: bold;
-  font-size: 20px;
-}
-
-.add-link {
-  position: absolute;
-  right: 20px;
-  top: 130px;
-  width: 22px;
-  height: 19px;
-  text-align: center;
-}
-
-.log-table > li {
-  position: relative;
-  list-style-type: none;
-  min-height: 32px;
-  max-width: 100%;
-  padding: 0;
-}
-
-.log-table .table-head div div {
-  font-weight: bold;
-  text-align: center !important;
-  direction: ltr !important;
-}
-
-.log-table .table-head div div:nth-child(4) {
-  font-weight: bold;
-  left: 247px;
-  width: 326px;
-  text-align: center !important;
-  direction: ltr !important;
-}
-
-.log-table > li > div > div {
-  position: absolute;
-  display: inline-block;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  font-size: 12px;
-  min-height: 28px;
-  overflow-x: hidden;
-  padding: 3px;
-  padding-top: 6px;
-  width: auto;
-}
-
-.log-table {
-  margin: 0;
-}
-
-.log-table > .table-row {
-  cursor: pointer;
-}
-
-.log-table > .table-row.selected:before {
-  z-index: 39;
-  position: absolute;
-  top: 6px;
-  font-family: FontAwesome;
-  content: "\f054";
-  font-size: 20px;
-  color: green;
-}
-
-.log-table > li > div > div:nth-child(1):not(.stack-line) {
-  left: 0;
-  width: 11px;
-  z-index: 5;
-}
-
-.log-table > li > div > div:nth-child(2) {
-  left: 18px;
-  width: 180px;
-  z-index: 5;
-}
-
-.log-table > li > div > div:nth-child(3) {
-  left: 190px;
-  width: 60px;
-  z-index: 5;
-  text-align: center;
-}
-
-.log-table > li > div > div:nth-child(4) {
-  padding-right: 5px;
-  text-align: right;
-  direction: rtl;
-  z-index: 3;
-  left: 0;
-  width: 573px;
-}
-
-.log-table > li > div > div:nth-child(5) {
-  left: 580px;
-  right: 0;
-  padding-left: 5px;
-}
-
-.log-table > li > div > div:nth-child(6) {
-  position: static;
-  margin-top: 43px;
-  white-space: normal;
-  display: block;
-}
-
-.log-info-panel {
-  z-index: 60;
-  position: fixed;
-  right: 7em;
-  top: 150px;
-  bottom: 5em;
-  padding: 0;
-  overflow: hidden;
-  min-height: 500px;
-  min-width: 800px;
-}
-
-@media(max-width: 1085px) {
-  .log-info-panel {
-    left: 5px;
-    right: 5px;
-    max-width: inherit;
-    min-width: 500px;
-  }
-}
-
-.log-info-panel >.log-info-panel-frame {
-  position: relative;
-  height: 100%;
-  width: 100%;
-  margin: 10px;
-}
-
-.log-info-panel > .log-info-panel-frame > .log-info-panel-header {
-  position: absolute;
-  top: 0;
-  height: 80px;
-  left: 5px;
-  right: 50px;
-  white-space: nowrap;
-}
-
-.log-info-panel-header > span {
-  margin-left: 7px;
-  position: relative;
-  top: 2px;
-  overflow: hidden;
-}
-
-.log-info-panel-frame > .log-info-panel-body {
-  position: absolute;
-  overflow: auto;
-  left: 5px;
-  right: 27px;
-  top: 80px;
-  bottom: 15px;
-  padding-top: 10px;
-  padding-left: 5px;
-  padding-right: 5px;
-}
-
-.log-info-panel-body > .row-fluid {
-  margin-bottom: 10px;
-}
-
-.log-info-panel > .log-info-panel-frame > .log-info-panel-body > .row-fluid > span {
-  margin-right: 7px;
-  white-space: nowrap;
-}
-
-.log-table-dashboard {
-  position: absolute;
-  bottom: 0;
-  left: 0;
-  right: 0;
-}
-
-.ex-node-container {
-  position: relative;
-  width: 100%;
-  height: 696px;
-}
-
-.ex-node {
-  position: absolute;
-  width: 150px;
-  height: 90px;
-  text-align: center;
-  padding-top: 60px;
-}
-
-.dozer-mapping-node {
-  display: block;
-  margin-top: 10px;
-  margin-bottom: 10px;
-  padding: 20px;
-}
-
-.dozer-mappings li {
-  list-style-type: none;
-}
-
-.dozer-mappings ul {
-  margin-left: 50px;
-}
-
-.dozer-mappings span {
-  width: 500px;
-}
-
-.wiki-file-list-up:hover {
-  text-decoration: none;
-
-}
-
-.fabric-page-header.features {
-  margin-top: 10px;
-}
-
-.fabric-page-header > * {
-  line-height: 38px;
-}
-
-.profile-selector-name a:hover {
-  text-decoration: none;
-}
-
-.file-name:hover {
-  text-decoration: none;
-}
-
-i.expandable-indicator.folder {
-  font-size: 17px;
-}
-
-.switches li {
-  width: 215px;
-}
-
-.switch-light.switch-ios {
-  width: 100px;
-}
-
-.switch-container {
-  position: static;
-  padding-top: 5px;
-  width: 215px;
-  height: 45px;
-}
-
-[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] {
-
-}
-
-[class^="dynatree-folder icon-"]:before, [class*=" dynatree-folder icon-"]:before {
-  font-size: 17px;
-  margin-left: 18px;
-}
-
-
-[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] .dynatree-connector {
-  display: none;
-}
-
-[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] .dynatree-icon {
-  display: none;
-}
-
-.main-nav-lower .container ul .dropdown.overflow {
-  margin-right: 25px;
-}
-
-.dropdown-menu.right {
-  left: auto;
-  right: 0;
-}
-
-.dropdown-menu.right:before {
-  left:auto !important;
-  right: 9px;
-}
-
-.dropdown-menu.right:after {
-  left:auto !important;
-  right: 10px;
-}
-
-@media(max-width: 1134px) {
-  .profile-details > [class^="span"] {
-    width: 100%;
-    float: inherit;
-    display: block;
-    margin-left: 2px;
-    margin-right: 2px;
-  }
-}
-
-/* Start 800x600 Optimzations */
-@media(max-width: 849px) {
-
-  .page-padded {
-    padding-left: 5px;
-    padding-right: 5px;
-  }
-
-  .wiki-fixed {
-    margin-left: 0 !important;
-    margin-right: 0 !important;
-  }
-
-  .wiki-fixed .row-fluid .span9 {
-    margin-left: 9px;
-  }
-
-  .container-details > [class*=" offset"] {
-    display: none;
-  }
-
-  .container-details > .span4.offset1 {
-    width: 100%;
-    float: inherit;
-    display: block;
-    margin-left: 2px;
-    margin-right: 2px;
-  }
-
-  .container-details > .span5.offset1 {
-    width: 100%;
-    float: inherit;
-    display: block;
-    margin-left: 2px;
-    margin-right: 2px;
-  }
-
-  .create-container-body > [class^="span"] {
-    width: 100%;
-    float: inherit;
-    display: block;
-    margin-left: 2px;
-    margin-right: 2px;
-  }
-
-  .create-container-body > [class^="span"]:first-child {
-    margin-bottom: 15px;
-  }
-
-  .features-toolbar .pull-left {
-    margin-bottom: 10px;
-  }
-
-  .edit-feature-lists > [class^="span"] {
-    width: 49%;
-    float: inherit;
-    display: inline-block;
-    margin-left: 0;
-    margin-right: 0;
-  }
-
-}
-/* End 800x600 optimizations */
-
-/*
- * jquery.tocify.css 1.8.0
- * Author: @gregfranko
- */
-/* The Table of Contents container element */
-.tocify {
-  /* top works for the wiki, may need customization
-     elsewhere */
-  top: 120px;
-  width: 232px;
-  padding-left: 1em;
-  padding-right: 1em;
-  overflow-y: auto;
-  overflow-x: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  position: fixed;
-  bottom: 5px;
-  z-index: 20;
-}
-
-.tocify h2,
-.tocify h3 {
-  white-space: normal;
-}
-
-.toc-container {
-  position: relative;
-  width: 100%;
-}
-
-.toc-content {
-  position: absolute;
-  left: 290px;
-  right: 0;
-}
-
-.tocify ul {
-  margin-left: 0px;
-}
-
-.tocify li {
-  list-style-type: none;
-  display: block;
-}
-
-.tocify li a {
-  display: block;
-  padding: 3px;
-  transition: background,border .25s ease-in-out;
-}
-
-.tocify li a:hover {
-  text-decoration: none;
-}
-
-.tocify li a.active {
-  font-weight: bolder;
-}
-
-/* Makes the font smaller for all subheader elements. */
-.tocify-subheader li {
-  font-size: 12px;
-}
-
-/* Further indents second level subheader elements. */
-.tocify-subheader .tocify-subheader {
-  text-indent: 30px;
-}
-
-/* Further indents third level subheader elements. You can continue this pattern if you have more nested elements. */
-.tocify-subheader .tocify-subheader .tocify-subheader {
-  text-indent: 40px;
-}
-
-@media(max-width: 700px) {
-  .tocify {
-    position: static;
-    width: auto;
-    margin-bottom: 1em;
-  }
-
-  .toc-content {
-    position: static;
-    left: auto;
-  }
-}
-
-fs-donut svg g text.value {
-  font-size: 40px;
-}
-
-fs-donut svg g text.units {
-  font-size: 20px;
-}
-
-.health-displays {
-  width: 100%;
-}
-
-.panel {
-  position: fixed;
-}
-
-.panel.bottom {
-  bottom: 0;
-}
-
-.deploy {
-  right: 0;
-}
-
-.profile-list-item:after {
-  content: ", ";
-}
-
-.profile-list-item:last-child:after {
-  content: " ";
-}
-
-.health-displays .health-display,
-.column-box,
-.column-box-variable,
-.column-box-square,
-.column-box-half-screen {
-  position: relative;
-  display: inline-block;
-  width: 300px;
-  height: 300px;
-  margin-left: 0;
-  margin-right: 0;
-  margin-bottom: 10px;
-  overflow: hidden;
-  vertical-align: top;
-}
-
-.column-box {
-  height: auto;
-  min-height: 175px;
-  width: 500px;
-}
-
-.wiki-icon-view {
-  min-height: 200px;
-}
-
-.wiki-icon-view .column-box {
-  min-height: 0;
-  margin-bottom: 25px;
-}
-
-.column-box-half-screen {
-  width: 50%;
-  min-width: auto;
-  height: auto;
-}
-
-.column-box-square {
-  height: 32px;
-  width: 32px;
-  line-height: 28px;
-  vertical-align: middle;
-  text-align: center;
-}
-
-.column-box-variable {
-  height: auto;
-  min-height: 175px;
-  width: auto;
-  min-width: 175px;
-  max-width: 500px;
-}
-
-.column-box-variable > h3 {
-  margin-bottom: 0;
-}
-
-.column-box .file-icon > * {
-  width: 100%;
-  height: auto;
-}
-
-.location-box {
-  margin: 12px;
-}
-
-.column-box-square > i {
-  font-size: 24px;
-  height: 24px;
-  vertical-align: middle;
-}
-
-.container-groups .column-box {
-  height: 125px;
-  width: auto;
-}
-
-.container-header-version,
-.container-header-version + hr {
-  margin-bottom: 0;
-}
-
-.container-header-version + hr {
-  margin-top: 0;
-}
-
-.container-groups .container-group-header {
-  border-bottom: none;
-}
-
-.column-row {
-  float: left;
-}
-
-.column-box-selected .column-box-header {
-  font-size: 150%;
-  font-weight: bold;
-}
-
-.column-box-icons > .span1 {
-  text-align: center;
-  vertical-align: middle;
-  width: 32px;
-}
-
-.column-box-icons i, 
-.column-box-icons img {
-  font-size: 32px;
-  width: 32px;
-}
-
-.ok-container > i {
-  font-size: 32px;
-  color: #a4a4a4;
-}
-
-.column-box > div {
-  position: relative;
-  height: 100%;
-  margin: 10px;
-}
-
-.column-box h3 {
-  text-overflow: ellipsis;
-  line-height: normal;
-  margin-bottom: 0;
-}
-
-.bottom-anchored {
-  position: absolute;
-  bottom: 0;
-  margin-top: -3em;
-}
-
-.label-list > li > .badge {
-  margin-top: 3px;
-  margin-bottom: 3px;
-}
-
-.label-list > .inline-block > .badge {
-  margin-left: 3px;
-  margin-right: 3px;
-}
-
-.health-details {
-  top: 0;
-  bottom: 0;
-  z-index: 40;
-}
-
-.health-status {
-  padding: 0;
-  position: absolute;
-  bottom: 0;
-  overflow: hidden;
-  left: 0;
-  right: 0;
-  z-index: 20;
-}
-
-.health-message-wrap {
-  margin: 0;
-  padding: 0;
-  width: 100%;
-  height: 100%;
-}
-
-.health-message {
-  display: block;
-  margin: 10px;
-}
-
-.health-details-toggle {
-  position: absolute;
-  display: inline-block;
-  width: 16px;
-  height: 16px;
-  right: 2px;
-  top: 0px;
-}
-
-.health-details-wrap {
-  width: 300px;
-  height: 300px;
-  overflow-y: auto;
-  overflow-x: hidden;
-}
-
-.health-details-wrap a {
-  color: #d4d4d4;
-}
-
-.health-details-wrap dl {
-  margin-top: 5px;
-  margin-bottom: 2px;
-  margin-left: 0;
-}
-
-.health-details-wrap table {
-  max-width: 300px;
-}
-
-.health-details-wrap table tr td {
-  vertical-align: middle;
-}
-
-.health-details-wrap table tr td:first-child {
-  font-weight: bold;
-  text-align: right;
-  padding-right: 5px;
-}
-
-.health-details-wrap table tr td:last-child {
-  padding-left: 5px;
-  overflow-x: hidden;
-  text-overflow: ellipsis;
-}
-
-.health-display-title {
-  padding-top: 18px;
-  font-size: 30px;
-  width: 100%;
-  height: 40px;
-  margin-top: 10px;
-  margin-bottom: 10px;
-  font-weight: bold;
-  text-align: center;
-}
-
-.health-display-title.ok {
-  background-color: lightgreen;
-}
-
-.health-display-title.warning {
-  background-color: darkorange;
-}
-
-.health-displays .health-display .health-chart {
-  width: 300px;
-  height: 300px;
-}
-
-.create-column {
-  vertical-align: top;
-  display: inline-block;
-  width: 445px;
-  margin-bottom: 10px;
-}
-
-#create-form {
-  max-width: 422px;
-}
-
-/* hack to work around strange tabset behavior */
-tabset > .tabbable > ul {
-  display: none;
-}
-/* end hack */
-
-tabset > .tabbable > .tab-content > .nav.nav-tabs > li {
-  cursor: pointer;
-}
-
-tabset > .tabbable > .tab-content > .nav.nav-tabs > li.active {
-  cursor: pointer;
-}
-
-tabset > .tabbable > .tab-content > .nav.nav-tabs > li.disabled {
-  opacity: 0.3;
-}
-
-.toast.toast-warning * {
-  color: black;
-}
-
-.hawtio-toc .panel-title {
-  padding: 0;
-  margin-top: 20px;
-  margin-bottom: 20px;
-}
-
-.hawtio-toc .panel-title a {
-  display: block;
-  text-align: center;
-  padding: 10px;
-}
-
-._jsPlumb_endpoint {
-  z-index: 25;
-}
-
-.panes {
-  position: relative;
-  display: block;
-  min-height: 100%;
-}
-
-.panes > .left-pane {
-  position: absolute;
-  left: 0;
-  right: 285px;
-  height: 100%;
-}
-
-.panes > .right-pane {
-  position: absolute;
-  right: 0;
-  width: 275px;
-  height: 100%;
-}
-
-.camel-viewport {
-  overflow: auto;
-  height: 100%;
-}
-
-.camel-canvas-endpoint svg circle {
-  fill: #346789;
-}
-
-.camel-props {
-  position: relative;
-  height: 100%;
-}
-
-.camel-props > .button-bar {
-  left: 0;
-  right: 0;
-  display: block;
-  position: absolute;
-}
-
-.button-bar > .centered > form {
-  margin-bottom: 10px;
-}
-
-.camel-props > .prop-viewport {
-  overflow-y: auto;
-  overflow-x: visible;
-  position: absolute;
-  bottom: 0;
-  top: 80px;
-  width: 100%;
-}
-
-.camel-props form > fieldset > legend {
-  font-size: medium;
-  font-weight: bold;
-  margin: 0;
-  line-height: 12px;
-  padding: 3px;
-}
-
-.endpoint-control > label {
-  font-size: medium;
-  font-weight: bold;
-  margin: 0;
-  line-height: 12px;
-  padding: 3px;
-}
-
-.endpoint-props > p {
-  font-size: medium;
-  font-weight: bold;
-  margin: 0;
-  margin-bottom: 25px;
-  line-height: 12px;
-  padding: 3px;
-}
-
-.endpoint-control > .controls {
-  margin-top: 15px;
-}
-
-.camel-props form fieldset .control-label {
-  float: none;
-  width: auto;
-  text-align: left;
-}
-
-.camel-props form fieldset .controls {
-  margin-left: auto;
-}
-
-.camel-props form fieldset .controls .input-xxlarge {
-  width: auto;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-.camel-props form fieldset div[hawtio-form-array] > div > div > div > .controls.pull-right {
-  float: none;
-}
-
-.welcome {
-  margin-left: 5em;
-  margin-right: 5em;
-}
-
-input.ng-invalid-pattern {
-  border-color: #e9322d;
-  -webkit-box-shadow: 0 0 6px #f8b9b7;
-  -moz-box-shadow: 0 0 6px #f8b9b7;
-  box-shadow: 0 0 6px #f8b9b7;
-}
-
-input.ng-invalid-pattern:focus {
-  border-color: #e9322d;
-  -webkit-box-shadow: 0 0 6px #f8b9b7;
-  -moz-box-shadow: 0 0 6px #f8b9b7;
-  box-shadow: 0 0 6px #f8b9b7;
-}
-
-.threads.logbar > .logbar-container {
-  margin-top: 2px;
-  margin-bottom: 5px;
-}
-
-.state-panel > ul > li:not(:first-child) > span {
-  margin-left: 15px;
-}
-
-.state-panel > ul > li.active {
-  font-weight: bold;
-}
-
-.runnable {
-  color: green;
-}
-
-.timed-waiting {
-  color: orange;
-}
-
-.waiting,
-.darkgray {
-  color: darkgray;
-}
-
-.blocked {
-  color: red;
-}
-
-strong.new,
-.lightgreen {
-  color: lightgreen;
-}
-
-.terminated,
-.darkred {
-  color: darkred;
-}
-
-.thread-state-indicator {
-  width: 100%;
-  height: 100%;
-  padding-top: 5px;
-}
-
-.monitor-indicator {
-  font-size: 10px;
-  padding: 4px;
-  margin: 5px;
-}
-
-.monitor-indicator.button {
-  cursor: pointer;
-}
-
-.monitor-indicator.true {
-  background: #1cd11d;
-  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 1px rgba(34, 203, 1, 0.49);
-}
-
-.monitor-indicator.false {
-  background: #737373;
-  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5);
-}
-
-.table-header {
-  color: black;
-  position: relative;
-}
-
-.table-header > .indicator:after {
-  font-family: 'FontAwesome';
-  position: absolute;
-  right: 5px;
-}
-
-.table-header.asc > .indicator:after {
-  content: "\f077";
-}
-
-.table-header.desc > .indicator:after {
-  content: "\f078";
-}
-
-.camel-tree > ul.nav {
-  margin-bottom: 3px !important;
-}
-
-.camel-tree > .section-filter {
-  margin: 0 0 8px;
-  display: block;
-}
-
-.table > thead > tr > th {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-th > .indicator:before {
-  display: inline-block;
-  content: "\00a0";
-  margin-left: 12px;
-}
-
-.simple-table-checkbox, 
-.simple-table-checkbox > input {
-  vertical-align: middle;
-  margin: 0;
-  width: 16px;
-  line-height: 16px;
-  max-width: 16px;
-}
-
-
-.table td,
-.table th {
-  vertical-align: middle;
-}
-
-.ngCellText .icon-replication-controller {
-  width: 32px;
-}
-
-.repository-browser-toolbar > .btn {
-  margin-bottom: 10px;
-}
-
-.bundle-list-toolbar {
-  vertical-align: top;
-}
-
-.bundle-list-toolbar > .pull-left > *,
-.bundle-list-toolbar > .pull-right > * {
-  display: inline-block;
-}
-
-.bundle-list-toolbar > div > input,
-.bundle-list-toolbar > div > div > input {
-  margin-bottom: 10px;
-}
-
-.bundle-list-toolbar > div > label,
-.bundle-list-toolbar > div > strong {
-  position: relative;
-  top: -3px;
-}
-
-.bundle-list-toolbar > div > .input-append {
-  position: relative;
-  left: 3px;
-  top: -9px;
-}
-
-.connect-column {
-  display: inline-block;
-  vertical-align: top;
-  width: 550px;
-}
-
-.icon-spacer:before {
-  content: '\00a0';
-  width: 11px;
-}
-
-.dropdown-menu {
-  padding-top: 0;
-  padding-bottom: 0;
-  margin-top: 0;
-  top: 100%;
-  left: 0;
-  right: 0;
-  border-radius: 0;
-}
-
-.main-nav-upper .dropdown-menu {
-  border-top: none;
-  margin-top: -1;
-  border-radius: 0;
-}
-
-.main-nav-lower .dropdown-menu {
-  border-top: none;
-}
-
-.dropdown-menu > li > a {
-  cursor: pointer;
-  padding-left: 15px;
-  padding-right: 15px;
-}
-
-.dropdown.perspective-selector > .dropdown-menu {
-  min-width: 160px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div {
-  display: block;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div > p,
-.hawtio-dropdown p {
-  font-size: smaller;
-  padding-left: 3px;
-  padding-right: 3px;
-  margin-bottom: 0;
-}
-
-.nav .hawtio-dropdown {
-  margin-top: 2px;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div > ul {
-  margin-top: 0;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div > ul > li.clear-recent > a {
-  padding: 3px 5px;
-}
-
-.dropdown-menu > li:hover > a {
-  text-shadow:0px 0px 1px white;
-}
-
-.dropdown-menu:before {
-  display: none !important;
-}
-
-.dropdown-menu:after {
-  display: none !important;
-}
-
-.nav.nav-tabs li .hawtio-dropdown .dropdown-menu {
-  margin-top: 4px;
-  border-top: none;
-}
-
-span.hawtio-dropdown {
-  position: relative;
-  display: block;
-  cursor: pointer;
-}
-
-span.hawtio-dropdown .dropdown-menu {
-  width: auto;
-}
-
-.btn .hawtio-dropdown > .caret {
-  width: 7px;
-}
-
-.btn .hawtio-dropdown > .dropdown-menu {
-  left: -10px;
-  margin-top: 5px;
-  text-align: left;
-}
-
-.submenu-caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-}
-
-.submenu-caret:before {
-  font-family: 'FontAwesome';
-  border: 0;
-  content: "\f054";
-  font-size: 11px;
-  display: block;
-}
-
-.hawtio-dropdown > ul > li {
-  padding: 3px;
-  padding-left: 5px;
-}
-
-.hawtio-dropdown > ul > li > .menu-item {
-  position: relative;
-  display: block;
-}
-
-.hawtio-dropdown > .submenu-caret:before,
-.hawtio-dropdown > ul > li > .menu-item > .submenu-caret:before {
-  position: absolute;
-  top: 0;
-  right: -2px;
-}
-
-.dropdown-menu .sub-menu {
-  position: absolute;
-  left: 195px;
-  top: -8px;
-}
-
-.hawtio-breadcrumb > li {
-  display: inline-block;
-}
-
-.dropdown-menu .dropdown .caret {
-  display: none;
-}
-
-.hawtio-breadcrumb .caret {
-  border: 0;
-  width: 17px;
-  margin-right: 2px;
-  margin-left: 0;
-}
-
-.hawtio-breadcrumb .caret:before {
-  font-family: 'FontAwesome';
-  content: "\F105";
-  font-size: 40px;
-  top: -9px;
-}
-/*
-.modal {
-  z-index: 5000;
-  width: 660px;
-  margin: -250px 0 0 -320px;
-}
-.modal-backdrop {
-  z-index: 4090;
-}
-*/
-.scrollable-section {
-  overflow-x: hidden;
-  overflow-y: auto;
-  max-height: 260px;
-}
-
-.component {
-  opacity: 0.8;
-  filter: alpha(opacity = 80);
-}
-
-.window,
-.node > rect {
-  stroke-width: 2px;
-  stroke: #346789;
-  fill: url(#rect-gradient);
-  border: 2px solid #346789;
-  z-index: 20;
-  position: absolute;
-  font-size: 0.8em;
-  filter: alpha(opacity = 80);
-  cursor: move;
-
-  box-shadow: 2px 2px 19px #e0e0e0;
-  -o-box-shadow: 2px 2px 19px #e0e0e0;
-  -webkit-box-shadow: 2px 2px 19px #e0e0e0;
-  -moz-box-shadow: 2px 2px 19px #e0e0e0;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  background-color: lightgrey;
-  fill: lightgrey;
-}
-
-.window,
-.node.selected > rect {
-    stroke-width: 2px;
-    stroke-dasharray: 10,5;
-    stroke: red;
-}
-
-.window-inner {
-  position: relative;
-  border-radius: 2px;
-}
-
-.window-inner {
-  padding: 6px;
-}
-
-.window-inner.from,
-.node > .from {
-  background-color: lightsteelblue;
-  fill: lightsteelblue;
-}
-
-.window-inner.choice,
-.node > .choice {
-  background-color: lightblue;
-  fill: lightblue;
-}
-
-.window-inner.when,
-.node > .when {
-  background-color: lightgreen;
-  fill: lightgreen;
-}
-
-.window-inner.otherwise,
-.node > .otherwise {
-  background-color: lightgreen;
-  fill: lightgreen;
-}
-
-.window-inner.to,
-.node > .to {
-  background-color: lightsteelblue;
-  fill: lightsteelblue;
-}
-
-.window-inner.log,
-.node > .log {
-  background-color: lightcyan;
-  fill: lightcyan;
-}
-
-.window-inner.setBody,
-.node > .setBody {
-  background-color: #d3d3d3;
-  fill: #d3d3d3;
-}
-
-.window-inner.onException,
-.node > .onException {
-  background-color: lightpink;
-  fill: lightpink;
-}
-
-.window-inner.delay,
-.node > .delay {
-  background-color: lightgrey;
-  fill: lightgrey;
-}
-
-.window-inner.bean,
-.node > .bean {
-  background-color: mediumaquamarine;
-  fill: mediumaquamarine;
-}
-
-.window-inner > * {
-  vertical-align: middle;
-}
-
-.window-inner > span {
-  max-width: 15em;
-  display: inline-block;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.window:hover {
-  border-color: #5d94a6;
-  background-color: #ffffa0;
-}
-
-.window:hover > .window-inner {
-  background: inherit;
-}
-
-.window.selected {
-  background-color: #f0f0a0;
-}
-
-.window.selected > .window-inner {
-  background: inherit;
-}
-
-img.nodeIcon {
-  width: 24px !important;
-  height: 24px !important;
-  cursor: crosshair;
-  margin-right: 10px;
-}
-
-img.nodeIcon:hover {
-  opacity: 0.6;
-  box-shadow: 2px 2px 19px #a0a0a0;
-  background-color: #a0a0a0;
-}
-
-.l1 {
-  font-size: 13px;
-}
-
-._jsPlumb_connector {
-  z-index: 4;
-}
-
-._jsPlumb_overlay {
-  z-index: 6;
-}
-
-.hl {
-  border: 3px solid red;
-}
-
-.strong {
-  font-weight: bold;
-}
-
-.discovery > li {
-  position: relative;
-}
-
-.discovery > li > div {
-  vertical-align: middle;
-}
-
-.discovery > li > div:first-child {
-  margin-right: 10px;
-}
-
-.discovery > li > div:last-child,
-.discovery > li > .lock {
-  position: absolute;
-  width: 32px;
-  height: 32px;
-  margin: auto;
-  top: 0;
-  bottom: 0;
-  right: 10px;
-}
-
-.discovery > li > .lock {
-  right: 42px;
-}
-
-.discovery > li > div:last-child > div.connect-button {
-  width: 32px;
-  height: 32px;
-}
-
-.discovery > li > div:last-child > div > i,
-.discovery > li > .lock > i {
-  font-size: 32px;
-  cursor: pointer;
-}
-
-.discovery > li > .lock > i {
-  cursor: inherit;
-}
-
-.discovery > li > div:first-child > img {
-  vertical-align: middle;
-  width: 64px;
-  max-height: 64px;
-}
-
-.auth-form {
-  white-space: nowrap;
-}
-
-.auth-form > form > input {
-  margin-bottom: 0;
-}
-
-.slideout-body .btn-group,
-.btn-group[hawtio-pager] {
-  line-height: normal;
-}
-
-@media print {
-  #main-nav,
-  #log-panel {
-    display: none !important;
-    height: 0 !important;
-  }
-
-  .wiki-grid {
-    display: none;
-  }
-
-  .wiki-fixed {
-    margin-top: 0 !important;
-  }
-
-  .wiki-fixed > .row-fluid > .span3 {
-    display: none;
-  }
-
-  .wiki-fixed > .row-fluid > .span9 {
-    width: 100%;
-  }
-
-  .instance-name {
-    display: none !important;
-  }
-
-  .logbar-container > .nav {
-    display: none !important;
-    height: 0 !important;
-  }
-
-}
-
-.prefs {
-  height: 100%;
-  margin: 0;
-}
-
-.prefs > div {
-  height: 100%;
-  margin: 0;
-}
-
-.slideout-body .prefs {
-  overflow: hidden;
-  margin: 0;
-}
-
-.slideout-body .prefs .tabbable {
-  position: relative;
-  height: 100%;
-  margin: 0;
-}
-
-.pref-slideout > div > div > div {
-  height: 100%;
-  margin: 0;
-}
-
-.pref-slideout .slideout-body {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0px;
-  right: 0;
-  overflow: none !important;
-  margin: 0 !important;
-}
-
-.slideout-body .prefs .nav.nav-tabs {
-  top: 5px;
-  bottom: 5px;
-  left: 0;
-  width: 130px;
-  position: absolute;
-  margin: 0;
-  overflow-y: auto;
-}
-
-.slideout-body .prefs .nav.nav-tabs:after,
-.slideout-body .prefs .nav.nav-tabs:before {
-  display: none;
-}
-
-.slideout-body .prefs .nav.nav-tabs li {
-  display: block;
-  float: none;
-}
-
-.slideout-body .prefs .tab-content {
-  position: absolute;
-  overflow: auto;
-  top: 5px;
-  left: 140px;
-  right: 15px;
-  bottom: 5px;
-  margin: 0;
-}
-
-.help-header .without-text,
-.about-header .without-text {
-  position: relative;
-  top: -4px;
-  vertical-align: middle;    
-  height: 48px;
-}
-
-.help-header .with-text,
-.about-header .with-text {
-  position: relative;
-  top: -4px;
-  vertical-align: middle;
-  height: 48px;
-}
-
-.service-list > li {
-  list-style-type: none;
-  display: inline-block;
-  margin-left: 3px;
-  margin-right: 3px;
-  vertical-align: middle;
-}
-
-.container-type {
-  width: 16px;
-}
-
-.container-status > i:before,
-.container-type i:before,
-.container-type img {
-  vertical-align: middle;
-  font-size: 16px;
-  height: 16px;
-  width: auto;
-  line-height: 16px;
-}
-
-.container-type img.girthy {
-  height: auto;
-  width: 16px;
-}
-
-.app-logo {
-  width: 64px;
-  margin-right: 10px;
-}
-
-.app-logo img,
-.app-logo i {
-  vertical-align: middle;
-  font-size: 64px;
-  height: 64px;
-  width: auto;
-  line-height: 64px;
-}
-
-.app-logo img.girthy {
-  height: auto;
-  width: 64px;
-}
-
-.service-list i:before,
-.service-list img {
-  height: 16px;
-  width: auto;
-  font-size: 16px;
-  vertical-align: middle;
-}
-
-.service-list img.girthy {
-  height: auto;
-  width: 16px;
-}
-
-.perspective-selector img {
-  width: auto;
-  height: 16px;
-  vertical-align: top;
-}
-
-.operation-row {
-  position: relative;
-  height: 30px;
-  vertical-align: middle;
-}
-
-.operation-row.can-invoke {
-  cursor: pointer;
-}
-
-.operation-row.cant-invoke {
-  cursor: not-allowed;
-}
-
-.operation-row > * {
-  display: inline-block;
-  height: 100%;
-  line-height: 30px;
-}
-
-.operation-actions {
-  position: absolute;
-  right: 6px;
-  top: 4px;
-}
-
-.help-block:empty {
-  margin-top: 10px;
-}
-
-ul.dynatree-container {
-  overflow: visible;
-}
-
-.pane {
-  position: fixed;
-  bottom: 0;
-  top: 70px;
-  height: auto;
-  width: 300px;
-}
-
-.pane > .pane-wrapper {
-  position: relative;
-  height: 100%;
-  width: 100%;
-  overflow: hidden;
-}
-
-.pane-viewport {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  overflow: auto;
-  margin-right: 10px;
-}
-
-.pane-content {
-  width: auto;
-  height: auto;
-}
-
-.pane-bar {
-  position: absolute;
-  top: 0;
-  right: 0;
-  width: 5px;
-  cursor: ew-resize;
-  height: 100%;
-}
-
-.pane-content {
-  float: none;
-  position: static;
-}
-
-.pane.left {
-  left: 0;
-  z-index: 39;
-}
-
-.pane.left .pane-viewport {
-  margin-left: 10px;
-  right: 5px;
-  margin-right: 0;
-}
-
-.pane.left .pane-bar {
-  right: 0;
-}
-
-.pane.right {
-  right: 0;
-}
-
-.pane.right .pane-viewport {
-  margin-left: 10px;
-  margin-right: 5px;
-  right: 5px;
-}
-
-.pane.right .pane-bar {
-  left: 0;
-}
-
-.pane-header-wrapper {
-  margin-left: 10px;
-  margin-right: 10px;
-}
-
-.tree-header {
-  position: relative;
-  height: 26px;
-}
-
-.fabric-app-view-header {
-  height: auto;
-}
-
-.fabric-app-view-header > * {
-  line-height: 12px;
-}
-
-.fabric-app-view-header .alert {
-  margin-bottom: 0;
-}
-
-.fabric-app-view-header .row-fluid:last-child {
-  padding-bottom: 8px;
-}
-
-.tree-header > .left,
-.tree-header > .right {
-  position: absolute;
-  top: 3px;
-  bottom: 6px;
-  vertical-align: middle;
-  line-height: 10px;
-}
-
-.tree-header > .left {
-  left: 0;
-}
-
-.tree-header > .right {
-  right: 10px;
-}
-
-.camel.tree-header {
-  height: 42px;
-}
-
-.camel.tree-header > .left {
-  right: 94px;
-}
-
-.camel.tree-header > .left,
-.camel.tree-header > .right {
-  top: 6px;
-  line-height: 30px;
-}
-
-
-.camel.tree-header > .left > .section-filter {
-  width: 100%;
-}
-
-.camel.tree-header > .left > .section-filter > .search-query {
-  width: 100%;
-  margin-bottom: 10px;
-}
-
-.camel.tree-header > .left > .section-filter > .icon-remove {
-  right: -16px;
-}
-
-.attributes-wrapper {
-  width: 100%;
-  overflow: auto;
-}
-
-.separator {
-  padding-top: 4px;
-  display: inline-block;
-}
-
-.grid-block,
-.health-display {
-  border: 1px solid #00f;
-}
-
-.widget-title {
-  border-bottom: 1px solid #00f;
-}
-
-.container-group-header {
-  vertical-align: middle;
-  line-height: 18px;
-  font-weight: bold;
-  padding: 4px;
-  margin-top: 10px;
-}
-
-.search-query.has-text {
-  background: #55ddff;
-  color: #333333;
-}
-
-.dataTables_filter input {
-    border-radius: 15px
-}
-
-.config-admin-form .form-horizontal .control-label {
-    width: 260px;
-}
-.config-admin-form .form-horizontal .controls {
-    margin-left: 280px;
-}
-
-.new-config-name-form {
-    margin-top: 30px;
-}
-
-.td-fixed-width-150 {
-  white-space: normal;
-  width: 150px;
-}
-
-.pod-label {
-  margin-right: 1em;
-}
-
-td > ul {
-  margin-bottom: 0px;
-}
-
-td > .zebra-list > li {
-  padding: 2px;
-}
-
-ul.nav select {
-  margin-bottom: 0px;
-  height: 25px;
-}
-
-/* ENTESB-2249: fixing bootstrap forms with tooltips */
-.form-horizontal input + div + .help-block,
-.form-horizontal select + div + .help-block,
-.form-horizontal textarea + div + .help-block {
-  margin-top: 10px;
-}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/css/ui.dynatree.css
----------------------------------------------------------------------
diff --git a/console/plugin/css/ui.dynatree.css b/console/plugin/css/ui.dynatree.css
deleted file mode 100644
index 4b51e05..0000000
--- a/console/plugin/css/ui.dynatree.css
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
-Licensed under MIT and GPL
-see https://code.google.com/p/dynatree/wiki/LicenseInfo
-*/
-
-/*******************************************************************************
- * Tree container
- */
-ul.dynatree-container
-{
-	font-family: tahoma, arial, helvetica;
-	font-size: 10pt; /* font size should not be too big */
-	white-space: nowrap;
-	padding: 3px;
-	margin: 0; /* issue 201 */
-	background-color: white;
-	overflow: auto;
-	height: 100%; /* issue 263 */
-}
-
-ul.dynatree-container ul
-{
-	padding: 0 0 0 16px;
-	margin: 0;
-}
-
-ul.dynatree-container li
-{
-	list-style-image: none;
-	list-style-position: outside;
-	list-style-type: none;
-	-moz-background-clip:border;
-	-moz-background-inline-policy: continuous;
-	-moz-background-origin: padding;
-	background-attachment: scroll;
-	background-color: transparent;
-	background-position: 0 0;
-	background-repeat: repeat-y;
-	background-image: none;  /* no v-lines */
-
-	margin:0;
-	padding:1px 0 0 0;
-}
-/* Suppress lines for last child node */
-ul.dynatree-container li.dynatree-lastsib
-{
-	background-image: none;
-}
-/* Suppress lines if level is fixed expanded (option minExpandLevel) */
-ul.dynatree-no-connector > li
-{
-	background-image: none;
-}
-
-/* Style, when control is disabled */
-.ui-dynatree-disabled ul.dynatree-container
-{
-	opacity: 0.5;
-/*	filter: alpha(opacity=50); /* Yields a css warning */
-	background-color: silver;
-}
-
-
-/*******************************************************************************
- * Common icon definitions
- */
-span.dynatree-empty,
-span.dynatree-vline,
-span.dynatree-connector,
-span.dynatree-expander,
-span.dynatree-icon,
-span.dynatree-checkbox,
-span.dynatree-radio,
-span.dynatree-drag-helper-img,
-#dynatree-drop-marker
-{
-	width: 16px;
-	height: 16px;
-/*	display: -moz-inline-box; /* @ FF 1+2 removed for issue 221*/
-/*	-moz-box-align: start; /* issue 221 */
-	display: inline-block; /* Required to make a span sizeable */
-	vertical-align: top;
-	background-repeat: no-repeat;
-	background-position: left;
-	background-image: url("../img/dynatree/icons.gif");
-	background-position: 0 0;
-}
-
-/** Used by 'icon' node option: */
-ul.dynatree-container img
-{
-	width: 16px;
-	height: 16px;
-	margin-left: 3px;
-	vertical-align: top;
-	border-style: none;
-}
-
-
-/*******************************************************************************
- * Lines and connectors
- */
-
-/*
-span.dynatree-empty
-{
-}
-span.dynatree-vline
-{
-}
-*/
-span.dynatree-connector
-{
-	background-image: none;
-}
-/*
-.dynatree-lastsib span.dynatree-connector
-{
-}
-*/
-/*******************************************************************************
- * Expander icon
- * Note: IE6 doesn't correctly evaluate multiples class names,
- *		 so we create combined class names that can be used in the CSS.
- *
- * Prefix: dynatree-exp-
- * 1st character: 'e': expanded, 'c': collapsed
- * 2nd character (optional): 'd': lazy (Delayed)
- * 3rd character (optional): 'l': Last sibling
- */
-
-span.dynatree-expander
-{
-	background-position: 0px -80px;
-	cursor: pointer;
-}
-span.dynatree-expander:hover
-{
-	background-position: -16px -80px;
-}
-.dynatree-exp-cl span.dynatree-expander /* Collapsed, not delayed, last sibling */
-{
-}
-.dynatree-exp-cd span.dynatree-expander /* Collapsed, delayed, not last sibling */
-{
-}
-.dynatree-exp-cdl span.dynatree-expander /* Collapsed, delayed, last sibling */
-{
-}
-.dynatree-exp-e span.dynatree-expander,  /* Expanded, not delayed, not last sibling */
-.dynatree-exp-ed span.dynatree-expander,  /* Expanded, delayed, not last sibling */
-.dynatree-exp-el span.dynatree-expander,  /* Expanded, not delayed, last sibling */
-.dynatree-exp-edl span.dynatree-expander  /* Expanded, delayed, last sibling */
-{
-	background-position: -32px -80px;
-}
-.dynatree-exp-e span.dynatree-expander:hover,  /* Expanded, not delayed, not last sibling */
-.dynatree-exp-ed span.dynatree-expander:hover,  /* Expanded, delayed, not last sibling */
-.dynatree-exp-el span.dynatree-expander:hover,  /* Expanded, not delayed, last sibling */
-.dynatree-exp-edl span.dynatree-expander:hover  /* Expanded, delayed, last sibling */
-{
-	background-position: -48px -80px;
-}
-.dynatree-loading span.dynatree-expander  /* 'Loading' status overrides all others */
-{
-	background-position: 0 0;
-	background-image: url("../img/dynatree/loading.gif");
-}
-
-
-/*******************************************************************************
- * Checkbox icon
- */
-span.dynatree-checkbox
-{
-	margin-left: 3px;
-	background-position: 0px -32px;
-}
-span.dynatree-checkbox:hover
-{
-	background-position: -16px -32px;
-}
-
-.dynatree-partsel span.dynatree-checkbox
-{
-	background-position: -64px -32px;
-}
-.dynatree-partsel span.dynatree-checkbox:hover
-{
-	background-position: -80px -32px;
-}
-
-.dynatree-selected span.dynatree-checkbox
-{
-	background-position: -32px -32px;
-}
-.dynatree-selected span.dynatree-checkbox:hover
-{
-	background-position: -48px -32px;
-}
-
-/*******************************************************************************
- * Radiobutton icon
- * This is a customization, that may be activated by overriding the 'checkbox'
- * class name as 'dynatree-radio' in the tree options.
- */
-span.dynatree-radio
-{
-	margin-left: 3px;
-	background-position: 0px -48px;
-}
-span.dynatree-radio:hover
-{
-	background-position: -16px -48px;
-}
-
-.dynatree-partsel span.dynatree-radio
-{
-	background-position: -64px -48px;
-}
-.dynatree-partsel span.dynatree-radio:hover
-{
-	background-position: -80px -48px;
-}
-
-.dynatree-selected span.dynatree-radio
-{
-	background-position: -32px -48px;
-}
-.dynatree-selected span.dynatree-radio:hover
-{
-	background-position: -48px -48px;
-}
-
-/*******************************************************************************
- * Node type icon
- * Note: IE6 doesn't correctly evaluate multiples class names,
- *		 so we create combined class names that can be used in the CSS.
- *
- * Prefix: dynatree-ico-
- * 1st character: 'e': expanded, 'c': collapsed
- * 2nd character (optional): 'f': folder
- */
-
-span.dynatree-icon /* Default icon */
-{
-	margin-left: 3px;
-	background-position: 0px 0px;
-}
-
-.dynatree-has-children span.dynatree-icon /* Default icon */
-{
-    background-position: 0px -16px; 
-}
-
-.dynatree-ico-cf span.dynatree-icon  /* Collapsed Folder */
-{
-	background-position: 0px -16px;
-}
-
-.dynatree-ico-ef span.dynatree-icon  /* Expanded Folder */
-{
-	background-position: -64px -16px;
-}
-
-/* Status node icons */
-
-.dynatree-statusnode-wait span.dynatree-icon
-{
-	background-image: url("../img/dynatree/loading.gif");
-}
-
-.dynatree-statusnode-error span.dynatree-icon
-{
-	background-position: 0px -112px;
-/*	background-image: url("../img/dynatree/ltError.gif");*/
-}
-
-/*******************************************************************************
- * Node titles
- */
-
-/* @Chrome: otherwise hit area of node titles is broken (issue 133)
-   Removed again for issue 165; (133 couldn't be reproduced) */
-span.dynatree-node
-{
-/*	display: -moz-inline-box; /* issue 133, 165, 172, 192. removed for issue 221 */
-/*	-moz-box-align: start; /* issue 221 */
-/*  display: inline-block; /* Required to make a span sizeable */
-}
-
-
-/* Remove blue color and underline from title links */
-ul.dynatree-container a
-/*, ul.dynatree-container a:visited*/
-{
-	color: black; /* inherit doesn't work on IE */
-	text-decoration: none;
-	vertical-align: top;
-	margin: 0px;
-	margin-left: 3px;
-/*	outline: 0; /* @ Firefox, prevent dotted border after click */
-	/* Set transparent border to prevent jumping when active node gets a border
-	   (we can do this, because this theme doesn't use vertical lines)
-	   */
-	border: 1px solid white; /* Note: 'transparent' would not work in IE6 */
-
-}
-
-ul.dynatree-container a:hover
-{
-/*	text-decoration: underline; */
-	background: #F2F7FD; /* light blue */
-	border-color: #B8D6FB; /* darker light blue */
-}
-
-span.dynatree-node a
-{
-	display: inline-block; /* Better alignment, when title contains <br> */
-/*	vertical-align: top;*/
-	padding-left: 3px;
-	padding-right: 3px; /* Otherwise italic font will be outside bounds */
-	/*	line-height: 16px; /* should be the same as img height, in case 16 px */
-}
-span.dynatree-folder a
-{
-/*	font-weight: bold; */ /* custom */
-}
-
-ul.dynatree-container a:focus,
-span.dynatree-focused a:link  /* @IE */
-{
-	background-color: #EFEBDE; /* gray */
-}
-
-span.dynatree-has-children a
-{
-/*	font-style: oblique; /* custom: */
-}
-
-span.dynatree-expanded a
-{
-}
-
-span.dynatree-selected a
-{
-/*	color: green; */
-	font-style: italic;
-}
-
-span.dynatree-active a
-{
-	border: 1px solid #99DEFD;
-	background-color: #D8F0FA;
-}
-
-/*******************************************************************************
- * Drag'n'drop support
- */
-
-/*** Helper object ************************************************************/
-div.dynatree-drag-helper
-{
-}
-div.dynatree-drag-helper a
-{
-	border: 1px solid gray;
-	background-color: white;
-	padding-left: 5px;
-	padding-right: 5px;
-	opacity: 0.8;
-}
-span.dynatree-drag-helper-img
-{
-	/*
-	position: relative;
-	left: -16px;
-	*/
-}
-div.dynatree-drag-helper /*.dynatree-drop-accept*/
-{
-/*    border-color: green;
-	background-color: red;*/
-}
-div.dynatree-drop-accept span.dynatree-drag-helper-img
-{
-	background-position: -32px -112px;
-}
-div.dynatree-drag-helper.dynatree-drop-reject
-{
-	border-color: red;
-}
-div.dynatree-drop-reject span.dynatree-drag-helper-img
-{
-	background-position: -16px -112px;
-}
-
-/*** Drop marker icon *********************************************************/
-
-#dynatree-drop-marker
-{
-	width: 24px;
-	position: absolute;
-	background-position: 0 -128px;
-	margin: 0;
-}
-#dynatree-drop-marker.dynatree-drop-after,
-#dynatree-drop-marker.dynatree-drop-before
-{
-	width:64px;
-	background-position: 0 -144px;
-}
-#dynatree-drop-marker.dynatree-drop-copy
-{
-	background-position: -64px -128px;
-}
-#dynatree-drop-marker.dynatree-drop-move
-{
-	background-position: -64px -128px;
-}
-
-/*** Source node while dragging ***********************************************/
-
-span.dynatree-drag-source
-{
-	/* border: 1px dotted gray; */
-	background-color: #e0e0e0;
-}
-span.dynatree-drag-source a
-{
-	color: gray;
-}
-
-/*** Target node while dragging cursor is over it *****************************/
-
-span.dynatree-drop-target
-{
-	/*border: 1px solid gray;*/
-}
-span.dynatree-drop-target a
-{
-}
-span.dynatree-drop-target.dynatree-drop-accept a
-{
-	/*border: 1px solid green;*/
-	background-color: #3169C6 !important;
-	color: white !important; /* @ IE6 */
-	text-decoration: none;
-}
-span.dynatree-drop-target.dynatree-drop-reject
-{
-	/*border: 1px solid red;*/
-}
-span.dynatree-drop-target.dynatree-drop-after a
-{
-}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[03/19] qpid-dispatch git commit: removed canvas class from left panel

Posted by ea...@apache.org.
removed canvas class from left panel


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/4802b684
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/4802b684
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/4802b684

Branch: refs/heads/master
Commit: 4802b6847236d7ab0f913d8c9e6a99f08194bebe
Parents: 739dff2
Author: Ernest Allen <ea...@redhat.com>
Authored: Thu Feb 18 13:00:37 2016 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Thu Feb 18 13:00:37 2016 -0500

----------------------------------------------------------------------
 .../stand-alone/plugin/html/qdrTopology.html    | 222 +++++++++++++++++++
 1 file changed, 222 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4802b684/console/stand-alone/plugin/html/qdrTopology.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrTopology.html b/console/stand-alone/plugin/html/qdrTopology.html
new file mode 100644
index 0000000..0cea1b6
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrTopology.html
@@ -0,0 +1,222 @@
+<!--
+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.
+-->
+<div class="qdrTopology row-fluid" ng-controller="QDR.TopologyController">
+    <div class="tertiary left panel">
+        <div id="topologyForm" ng-class="{selected : isSelected()}">
+            <!-- <div ng-repeat="form in forms" ng-show="isVisible(form)" ng-class='{selected : isSelected(form)}'> -->
+
+            <div ng-show="isGeneral()">
+                <h4>Router Info</h4>
+                <div ng-style="getTableHeight(attributes)" ui-grid-auto-resize ui-grid="topoGridOptions"></div>
+            </div>
+            <div ng-show="isConnections()">
+                <h4>Connection Info</h4>
+                <div ng-style="getTableHeight(connAttributes)" ui-grid-auto-resize ui-grid="topoConnOptions"></div>
+            </div>
+            <div id="addNodeForm" ng-show="isAddNode()">
+                <h4>Add a new router</h4>
+                <ul>
+                    <li>Click on an existing router to create a connection to the new router</li>
+                    <li>Double-click on the new router to <button ng-click="editNewRouter()">edit</button> its properties</li>
+                    <li ng-show="addingNode.hasLink" >Right-click on a new connection to edit its properties</li>
+                </ul>
+                <button ng-click="cancel()">Cancel</button>
+            </div>
+        </div>
+    </div>
+    <div class="panel-adjacent">
+
+<!--
+        <ul class="nav nav-tabs ng-scope qdrTopoModes">
+            <li ng-repeat="mode in modes" ng-class="{active : isModeActive(mode.name), 'pull-right' : isRight(mode)}" ng-click="selectMode('{{mode.name}}')" >
+                <a data-placement="bottom" class="ng-binding"> {{mode.name}} </a></li>
+        </ul>
+-->
+        <div id="topology" ng-show="mode == 'Diagram'"><!-- d3 toplogy here --></div>
+        <div id="geology" ng-show="mode == 'Globe'"><!-- d3 globe here --></div>
+        <div id="crosssection"><!-- d3 pack here --></div>
+        <!-- <div id="addRouter" ng-show="mode == 'Add Node'"></div> -->
+        <div id="node_context_menu" class="contextMenu">
+            <ul>
+                <li class="na" ng-class="{new: contextNode.cls == 'temp'}" ng-click="addingNode.trigger = 'editNode'">Edit...</li>
+                <li class="na" ng-class="{adding: addingNode.step > 0}" ng-click="addingNode.step = 0">Cancel add</li>
+                <li class="context-separator"></li>
+                <li class="na" ng-class="{'force-display': !isFixed()}" ng-click="setFixed(true)">Freeze in place</li>
+                <li class="na" ng-class="{'force-display': isFixed()}" ng-click="setFixed(false)">Unfreeze</li>
+            </ul>
+        </div>
+        <div id="svg_context_menu" class="contextMenu">
+            <ul>
+                <li ng-click="addingNode.step = 2">Add a new router</li>
+            </ul>
+        </div>
+        <div id="link_context_menu" class="contextMenu">
+            <ul>
+                <li ng-click="reverseLink()">Reverse connection direction</li>
+                <li ng-click="removeLink()">Remove connection</li>
+            </ul>
+        </div>
+
+    </div>
+</div>
+<!--
+    This is the template for the node edit dialog that is displayed.
+-->
+<script type="text/ng-template" id="node-config-template.html">
+    <div class="modal-header">
+        <h3 class="modal-title">Configure new router</h3>
+    </div>
+    <div class="modal-body">
+        <form novalidate name="editForm">
+        <div class="tabbable tabs-left">
+            <ul class="nav nav-tabs">
+                <li ng-repeat="entity in entities" ng-click="setActive(entity.tabName)" ng-class="{separated: entity.tabName == 'listener0'}">
+                    <a href="#{{entity.tabName}}" data-toggle="tab"><i ng-if="entity.icon !== ''" ng-class="entity.icon ? 'ui-icon-arrowthick-1-w' : 'ui-icon-arrowthick-1-e'" class="ui-icon"></i>{{entity.humanName}}</a>
+                </li>
+            </ul>
+            <div class="tab-content">
+                <div id="{{entity.tabName}}" ng-repeat="entity in entities" ng-show="isActive(entity.tabName)" class="entity-fields">
+                    <div class="entity-description">{{entity.description}}</div>
+                    <fieldset>
+                        <div ng-mouseenter="showDescription(attribute, $event)" ng-repeat="attribute in entity.attributes">
+                            <label for="{{attribute.name}}">{{attribute.humanName}}</label>
+                            <div ng-if="attribute.input == 'input'">
+                                <!-- ng-pattern="testPattern(attribute)" -->
+                                <input type="{{attribute.type}}" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.value" ng-required="attribute.required" class="ui-widget-content ui-corner-all">
+                            </div>
+                            <div ng-if="attribute.input == 'select'">
+                                <select id="{{attribute.name}}" ng-model="attribute.selected" ng-options="item for item in attribute.rawtype"></select>
+                            </div>
+                            <div ng-if="attribute.input == 'boolean'" class="boolean">
+                                <label><input type="radio" ng-model="attribute.value" value="true"> True</label>
+                                <label><input type="radio" ng-model="attribute.value" value="false"> False</label>
+                            </div>
+                        </div>
+                    </fieldset>
+                    <div class="attr-description">{{attributeDescription}}
+                        <div class="attr-type">{{attributeType}}</div>
+                        <div class="attr-required">{{attributeRequired}}</div>
+                        <div class="attr-unique">{{attributeUnique}}</div>
+                    </div>
+                    <div class="attr-annotations" ng-repeat="annotation in entity.annotatedBy">
+                        <span>You can also enter the <button ng-click="selectAnnotationTab(annotation)">{{annotation}}</button> values.</span>
+                    </div>
+                </div>
+            </div>
+        </div>
+        </form>
+    </div>
+    <div class="modal-footer">
+        <button class="btn btn-primary" type="button" ng-click="download()">Download</button>
+        <button class="btn btn-warning" type="button" ng-click="cancel()">Cancel</button>
+    </div>
+
+<!--
+
+
+    <div class="nodeOptions" title="Configure new router">
+        <form novalidate name="editForm">
+        <div id="tabs" class="nodeEntities">
+            <ul class="nodeTabs">
+                <li ng-repeat="entity in entities" ng-class="{separated: entity.tabName == 'listener0'}">
+
+                    <a href="#{{entity.tabName}}"><i ng-if="entity.icon !== ''" ng-class="entity.icon ? 'ui-icon-arrowthick-1-w' : 'ui-icon-arrowthick-1-e'" class="ui-icon"></i>{{entity.humanName}}</a>
+                </li>
+            </ul>
+            <div id="{{entity.tabName}}" ng-repeat="entity in entities" class="entity-fields">
+                <div class="entity-description">{{entity.description}}</div>
+                <fieldset>
+                    <div ng-mouseenter="showDescription(attribute, $event)" ng-repeat="attribute in entity.attributes">
+                        <label for="{{attribute.name}}">{{attribute.humanName}}</label>
+                        <div ng-if="attribute.input == 'input'">
+                            <input type="{{attribute.type}}" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.value" ng-pattern="testPattern(attribute)" ng-required="attribute.required" class="ui-widget-content ui-corner-all">
+                        </div>
+                        <div ng-if="attribute.input == 'select'">
+                            <select id="{{attribute.name}}" ng-model="attribute.selected" ng-options="item for item in attribute.rawtype"></select>
+                        </div>
+                        <div ng-if="attribute.input == 'boolean'" class="boolean">
+                            <label><input type="radio" ng-model="attribute.value" value="true"> True</label>
+                            <label><input type="radio" ng-model="attribute.value" value="false"> False</label>
+                        </div>
+                    </div>
+                </fieldset>
+                <div class="attr-description">{{attributeDescription}}
+                    <div class="attr-type">{{attributeType}}</div>
+                    <div class="attr-required">{{attributeRequired}}</div>
+                    <div class="attr-unique">{{attributeUnique}}</div>
+                </div>
+                <div class="attr-annotations" ng-repeat="annotation in entity.annotatedBy">
+                    <span>You can also enter the <button ng-click="selectAnnotationTab(annotation)">{{annotation}}</button> values.</span>
+                </div>
+            </div>
+        </div>
+        </form>
+
+        <div class="okButton">
+            <button ng-click="download()">Download</button>
+            <button ng-click="cancel()">Cancel</button>
+        </div>
+    </div>
+    -->
+</script>
+
+<script type="text/ng-template" id="config-file-header.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
+##
+</script>
+
+<script type="text/ng-template" id="download-dialog-template.html">
+    <div title="Configure new router">
+
+        <label title="Show descriptions and default values in confile files"><input type="checkbox" ng-model="verbose"> Verbose output</label>
+        <div>
+            <button ng-click="download()">Download</button>
+            <button class="btn" zero-clipboard data-clipboard-text="{{output}}" title="Copy to clipboard">
+                <i class="icon-copy"></i>
+            </button> configuration file for {{newRouterName}}
+        </div>
+        <div ng-repeat="part in parts">
+            <button ng-click="downloadPart(part)">Download</button>
+            <button class="btn" zero-clipboard data-clipboard-text="{{part.output}}" title="Copy to clipboard">
+                <i class="icon-copy"></i>
+            </button> connector section for {{part.name}}
+        </div>
+
+        <div class="okButton">
+            <button ng-click="done()">Done</button>
+        </div>
+
+    </div>
+</script>
+


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[09/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/lib/slider.js
----------------------------------------------------------------------
diff --git a/console/plugin/lib/slider.js b/console/plugin/lib/slider.js
deleted file mode 100644
index 1f0dd1d..0000000
--- a/console/plugin/lib/slider.js
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- jQuery UI Slider plugin wrapper
-
-    Source: https://github.com/angular-ui/ui-slider/blob/master/src/slider.js
- 	License: MIT
-
-*/
-angular.module('ui.slider', []).value('uiSliderConfig',{}).directive('uiSlider', ['uiSliderConfig', '$timeout', function(uiSliderConfig, $timeout) {
-    uiSliderConfig = uiSliderConfig || {};
-    return {
-        require: 'ngModel',
-        compile: function() {
-            var preLink = function (scope, elm, attrs, ngModel) {
-
-                function parseNumber(n, decimals) {
-                    return (decimals) ? parseFloat(n) : parseInt(n, 10);
-                }
-
-                var options = angular.extend(scope.$eval(attrs.uiSlider) || {}, uiSliderConfig);
-                // Object holding range values
-                var prevRangeValues = {
-                    min: null,
-                    max: null
-                };
-
-                // convenience properties
-                var properties = ['min', 'max', 'step'];
-                var useDecimals = (!angular.isUndefined(attrs.useDecimals)) ? true : false;
-
-                var init = function() {
-                    // When ngModel is assigned an array of values then range is expected to be true.
-                    // Warn user and change range to true else an error occurs when trying to drag handle
-                    if (angular.isArray(ngModel.$viewValue) && options.range !== true) {
-                        console.warn('Change your range option of ui-slider. When assigning ngModel an array of values then the range option should be set to true.');
-                        options.range = true;
-                    }
-
-                    // Ensure the convenience properties are passed as options if they're defined
-                    // This avoids init ordering issues where the slider's initial state (eg handle
-                    // position) is calculated using widget defaults
-                    // Note the properties take precedence over any duplicates in options
-                    angular.forEach(properties, function(property) {
-                        if (angular.isDefined(attrs[property])) {
-                            options[property] = parseNumber(attrs[property], useDecimals);
-                        }
-                    });
-
-                    elm.slider(options);
-                    init = angular.noop;
-                };
-
-                // Find out if decimals are to be used for slider
-                angular.forEach(properties, function(property) {
-                    // support {{}} and watch for updates
-                    attrs.$observe(property, function(newVal) {
-                        if (!!newVal) {
-                            init();
-                            options[property] = parseNumber(newVal, useDecimals);
-                            elm.slider('option', property, parseNumber(newVal, useDecimals));
-                            ngModel.$render();
-                        }
-                    });
-                });
-                attrs.$observe('disabled', function(newVal) {
-                    init();
-                    elm.slider('option', 'disabled', !!newVal);
-                });
-
-                // Watch ui-slider (byVal) for changes and update
-                scope.$watch(attrs.uiSlider, function(newVal) {
-                    init();
-                    if(newVal !== undefined) {
-                      elm.slider('option', newVal);
-                    }
-                }, true);
-
-                // Late-bind to prevent compiler clobbering
-                $timeout(init, 0, true);
-
-                // Update model value from slider
-                elm.bind('slide', function(event, ui) {
-                    ngModel.$setViewValue(ui.values || ui.value);
-                    scope.$apply();
-                });
-
-                // Update slider from model value
-                ngModel.$render = function() {
-                    init();
-                    var method = options.range === true ? 'values' : 'value';
-
-                    if (!options.range && isNaN(ngModel.$viewValue) && !(ngModel.$viewValue instanceof Array)) {
-                        ngModel.$viewValue = 0;
-                    }
-                    else if (options.range && !angular.isDefined(ngModel.$viewValue)) {
-                            ngModel.$viewValue = [0,0];
-                    }
-
-                    // Do some sanity check of range values
-                    if (options.range === true) {
-
-                        // Check outer bounds for min and max values
-                        if (angular.isDefined(options.min) && options.min > ngModel.$viewValue[0]) {
-                            ngModel.$viewValue[0] = options.min;
-                        }
-                        if (angular.isDefined(options.max) && options.max < ngModel.$viewValue[1]) {
-                            ngModel.$viewValue[1] = options.max;
-                        }
-
-                        // Check min and max range values
-                        if (ngModel.$viewValue[0] > ngModel.$viewValue[1]) {
-                            // Min value should be less to equal to max value
-                            if (prevRangeValues.min >= ngModel.$viewValue[1]) {
-                                ngModel.$viewValue[0] = prevRangeValues.min;
-                            }
-                            // Max value should be less to equal to min value
-                            if (prevRangeValues.max <= ngModel.$viewValue[0]) {
-                                ngModel.$viewValue[1] = prevRangeValues.max;
-                            }
-                        }
-
-                        // Store values for later user
-                        prevRangeValues.min = ngModel.$viewValue[0];
-                        prevRangeValues.max = ngModel.$viewValue[1];
-
-                    }
-                    elm.slider(method, ngModel.$viewValue);
-                };
-
-                scope.$watch(attrs.ngModel, function() {
-                    if (options.range === true) {
-                        ngModel.$render();
-                    }
-                }, true);
-
-                function destroy() {
-                    elm.slider('destroy');
-                }
-                scope.$on("$destroy", function() {
-                    destroy();
-                });
-            };
-
-            var postLink = function (scope, element, attrs, ngModel) {
-                // Add tick marks if 'tick' and 'step' attributes have been setted on element.
-                // Support horizontal slider bar so far. 'tick' and 'step' attributes are required.
-                var options = angular.extend({}, scope.$eval(attrs.uiSlider));
-                var properties = ['max', 'step', 'tick'];
-                angular.forEach(properties, function(property) {
-                    if (angular.isDefined(attrs[property])) {
-                        options[property] = attrs[property];
-                    }
-                });
-                if (angular.isDefined(options['tick']) && angular.isDefined(options['step'])) {
-                    var gaps = parseInt(parseInt(options['max'])/parseInt(options['step'])) - 1;
-                    if (gaps > 0) {
-                        for (var i = 0; i<= gaps; ++i) {
-                            var left = ((i / gaps) * 100) + '%';
-                            $("<div/>").addClass("ui-slider-tick").appendTo(element).css({left: left});
-                        };
-                    }
-                }
-            }
-
-            return {
-                pre: preLink,
-                post: postLink
-            };
-        }
-    };
-}]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/css/plugin.css
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/css/plugin.css b/console/stand-alone/plugin/css/plugin.css
new file mode 100644
index 0000000..5097d64
--- /dev/null
+++ b/console/stand-alone/plugin/css/plugin.css
@@ -0,0 +1,658 @@
+/*
+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.
+*/
+main-display > .span8 {
+  height: 100%;
+  position: relative;
+}
+
+.nickname-window,
+.channel-window,
+.main-window {
+  position: absolute;
+  top: 2px;
+  bottom: 2px;
+  left: 4px;
+  right: 4px;
+  /* border: 1px solid #d4d4d4;
+  border-radius: 4px;*/
+  overflow-y: auto;
+  overflow-x: hidden;
+}
+
+.nickname-window > .nickname-window-inner,
+.channel-window > .channel-window-inner,
+.main-window > .main-window-inner {
+  position: static;
+}
+
+.channel-window-inner > ul > li {
+  cursor: pointer;
+  padding: 0;
+  border-bottom: 1px solid #EEEEEE;
+}
+
+
+.channel-window-inner > ul > li > span:hover {
+  background-color: #EAEAEA;
+}
+
+ul.qdrListNodes > li > span {
+  padding: 6px 20px; 6px; 6px;
+  display: block;
+}
+
+.qdrList .gridStyle {
+    width: 20em;
+    margin-right: 0;
+    float: left;
+}
+
+
+.qdrList div.gridDetails {
+
+    width: auto;
+}
+
+.selectedItems {
+    margin-left: 21em;
+}
+
+.qdrListPane {
+    top: 110px;
+}
+
+.qdrListActions {
+    width: auto;
+}
+
+.nickname-window-inner > ul > li {
+  cursor: pointer;
+}
+
+.channel-window {
+  bottom: 40px;
+}
+
+.main-window {
+  border: none;
+  top: 46px;
+  bottom: 46px;
+}
+
+.main-window.no-topic {
+  top: 2px;
+}
+
+.topic-window {
+  position: absolute;
+  left: 10px;
+  right: 10px;
+  top: 2px;
+  height: 20px;
+  overflow: hidden;
+  z-index: 50;
+  border-bottom-left-radius: 4px;
+  border-bottom-right-radius: 4px;
+  border-left: 1px solid #d4d4d4;
+  border-right: 1px solid #d4d4d4;
+  border-bottom: 1px solid #d4d4d4;
+  background: white;
+  padding: 10px;
+}
+
+.input-widget {
+  background: white;
+  position: absolute;
+  bottom: 2px;
+  left: 2px;
+  right: 2px;
+  height: 40px;
+  z-index: 50;
+}
+
+.input-widget > form {
+  position: relative;
+}
+
+.input-widget > form > div {
+  position: absolute;
+  left: 2px;
+  top: 2px;
+  bottom: 2px;
+  right: 84px;
+}
+
+.input-widget > form > div > input[type="text"] {
+  width: 100%;
+}
+
+.input-widget > form > input[type="submit"] {
+  position: absolute;
+  right: 2px;
+  top: 3px;
+}
+
+.input-widget > form > input {
+  margin-bottom: 0;
+}
+
+.channel-control-buttons {
+  position: absolute;
+  background: white;
+  bottom: 2px;
+  left: 2px;
+  right: 2px;
+  z-index: 50;
+}
+
+div.listAttrName {
+    padding-top: 5px;
+}
+
+div.listAttrName i.icon-bar-chart {
+    float: right;
+    margin: 5px;
+}
+
+div.listAttrName i.icon-bar-chart.active, div.hastip i.icon-bar-chart.active, li.haschart i {
+    background-color: #AAFFAA;
+}
+
+div#main div ul.nav li a:not(.btn) {
+    background: initial !important;
+}
+
+div#main div ul.nav li.active a {
+    background-color: #f0f0ff !important;
+}
+
+div#main.qdr {
+    margin-top: 44px !important;
+}
+
+div.charts-header {
+  font-size: 1.2em;
+  color: #666666;
+  margin: 1em 0;
+}
+
+.selectedNode, .selectedAction, .selectedEntity {
+    font-weight: 600;
+    color: #606066;
+}
+
+.okButton {
+    text-align: center;
+    margin: 1em;
+}
+
+span.showChartsLink {
+    border: 1px solid blue;
+    padding: 1px 2px;
+}
+
+div.listGraphs p {
+    margin: 1em 0 2em 2em;
+    text-align: center;
+}
+
+div.centered {
+    text-align: center;
+    margin: 4em;
+}
+
+.modal-body.centered {
+	margin: 0;
+}
+
+div.aChart {
+    height: 200px;
+    width:  400px;
+    margin: 1em;
+}
+
+div.chartContainer {
+    float: left;
+}
+
+div.d3Chart path {
+    stroke: black;
+    stroke-width: 1;
+	opacity: 0.5;
+}
+
+div.d3Chart path.line {
+    stroke: steelblue;
+    stroke-width: 1;
+    fill: none;
+    opacity: 1;
+}
+
+.mo-rect {
+    fill: #ffffdd;
+    stroke: #f0f0f0;
+    stroke-width: 1;
+}
+
+.mo-guide {
+    fill: none;
+    stroke: #d0d0d0;
+    stroke-width: 2;
+    stroke-dasharray: 3,3;
+}
+
+div.d3Chart .title {
+    text-decoration: underline;
+}
+
+
+.axis line, .axis path {
+  fill: none;
+  shape-rendering: crispEdges;
+  stroke-width: 1;
+  stroke: #000000;
+}
+
+.axis line {
+  stroke: #C0C0C0;
+  stroke-dasharray: 1,1;
+  opacity: 0.5;
+}
+
+.y.axis text, .x.axis text, .focus text, div.d3Chart .title {
+    font-size: 12px;
+}
+
+.y.axis path {
+   stroke: #000;
+ }
+
+.overlay {
+   fill: none;
+   pointer-events: all;
+ }
+
+.focus circle {
+   fill: none;
+   stroke: steelblue;
+ }
+.focus .fo-table {
+	/* box-shadow: 2px 2px 3px #EEE; */
+}
+
+div.d3Chart {
+    padding: 1em 0;
+    border: 1px solid #C0C0C0;
+}
+
+div.d3Chart .axis path {
+	display: inherit;
+}
+.c3-circle {
+	display: none;
+}
+
+.fo-table {
+	border: 1px solid darkgray;
+	background-color: white;
+	font-size: .85em;
+}
+
+.fo-table td {
+	padding: 4px;
+	border-left: 1px solid darkgray;
+}
+.fo-table tr.detail td {
+	padding: 1px 4px;
+}
+.fo-title {
+	color: white;
+	background-color: darkgray;
+}
+
+.fo-table-legend {
+	width: 8px;
+	height: 8px;
+	border: 1px solid black;
+	margin: 0 4px;
+	display: inline-block;
+}
+
+svg .legend {
+	dominant-baseline: central;
+}
+
+div.chartContainer div.aChart {
+    margin-top: 0.5em;
+}
+
+div#main.qdr div ul.nav li.active a {
+  background-color: #e0e0ff !important;
+  color: #000000;
+}
+
+div#main.qdr .selected, .box.selected {
+  color: #000000;
+  text-shadow: none;
+}
+
+/* the selected node on the list page */
+div.qdrList li.active {
+    background-color: #e0e0ff;
+}
+
+/* the selected row in the name table */
+div#main.qdr div.qdrList div.selected {
+  background-color: #e0e0ff !important;
+}
+
+#dialogChart {
+    height: 200px;
+}
+
+div.qdrCharts p.chartLabels button {
+    float: right;
+}
+
+div.qdrCharts p.chartLabels {
+     padding-right: 1em;;
+ }
+
+p.dialogHeader {
+    text-align: center;
+}
+
+p.dialogHeader input {
+    margin-top: 10px;
+    width: 480px;
+}
+
+.ui-slider-tick {
+  position: absolute;
+  background-color: #666;
+  width: 2px;
+  height: 8px;
+  top: 12px;
+  z-index: -1;
+}
+
+label.rateGroup {
+    float: left;
+}
+
+div.chartOptions div.dlg-slider {
+    float: left;
+    margin-left: 2em;
+    width: 28em;
+    font-size: 14px;
+}
+
+div.chartOptions div.duration {
+  width: 35em !important;
+}
+
+div.chartOptions .slider {
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+input[type="radio"] {
+    margin-top: 0 !important;
+}
+
+div.chartOptions legend {
+    font-size: 1.2em;
+    margin-bottom: 10px;
+}
+
+div.chartOptions span.minicolors-swatch {
+    width: 14px;
+    height: 14px;
+}
+
+.minicolors-input {
+    width: 4em;
+    padding: 0 0 0 24px !important;
+}
+
+
+div.colorPicker div:nth-of-type(1), /* first span under div.colorPicker */
+ div.minicolors{
+    float:left;
+    margin-right: 0.5em;
+}
+
+div.chartOptions p.sep {
+    height: 1em;
+}
+
+ul.nav-tabs {
+    border-bottom: 1px solid #ddd !important;
+}
+
+.chartOptions ul.nav-tabs {
+    margin-bottom: 0px !important;
+}
+
+div.tabbable div.tab-content {
+    overflow: visible;
+}
+
+div.tabbable ul.nav-tabs > .active > a {
+  background-color: #f8f8f8;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+
+
+div.tabbable .tab-pane {
+    background-color: #f8f8f8;
+    padding: 12px;
+    border-right: 1px solid #ddd;
+    border-left: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+}
+
+div.tabbable ul.nav-tabs {
+  margin-bottom: 0;
+}
+
+ul.qdrTopoModes {
+    position: relative;
+    top: -10px;
+}
+.overview.section {
+	/* width: 35em; */
+}
+.overview.section .ngGrid {
+	height: 12em !important;
+	min-height: 12em !important;
+}
+
+.overview.routers.section .ngGrid {
+ 	height: 16em !important;
+ 	min-height: 16em !important;
+}
+.overview.routers.section {
+ 	/*width: 15em; */
+ }
+
+.grid-align-value {
+	text-align: right;
+}
+
+.overview .ngRow:hover {
+	background:#e0e0ff;
+}
+
+.treeContainer {
+	width: 250px;
+	float: left;
+}
+
+.treeDetails {
+	margin-left: 260px;
+}
+
+.gridStyle:not(.noHighlight) .ui-grid-row:hover .ui-grid-cell-contents {
+	background-color: #e0e0ff;
+}
+
+.ngCellText {
+	padding: 4px 0 0 4px;
+}
+
+.overview {
+	border-bottom: 1px solid #d4d4d4;
+}
+
+.ui-grid-row.ui-grid-row-selected > [ui-grid-row] > .ui-grid-cell {
+  background-color: #e0e0ff;
+}
+
+.tab-content .tab-pane {
+    background-color: #f8f8f8;
+    padding: 12px;
+    border-right: 1px solid #ddd;
+    border-left: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+}
+
+div.chartOptions ul.nav-tabs > .active > a {
+  background-color: #f8f8f8;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+
+div.chartOptions label:nth-of-type(2) {
+    margin-left: 1em;
+}
+div.chartOptions label {
+	font-weight: normal;
+}
+
+.form-horizontal .control-label {
+    float: left;
+    width: 160px;
+    padding-top: 5px;
+    text-align: right;
+}
+
+.form-horizontal .controls {
+    margin-left: 180px;
+}
+
+.form-horizontal input,  {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+}
+
+input[type="text"], input[type="number"], input[type="password"] {
+    background-color: #ffffff;
+    border: 1px solid #cccccc;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+    -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+    -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+    -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+    -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+    transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+
+input[type="text"], input[type="number"], input[type="password"] {
+    display: inline-block;
+    width: 200px;
+    padding: 4px 6px;
+    margin-bottom: 10px;
+    font-size: 14px;
+    line-height: 20px;
+    color: #555555;
+    vertical-align: middle;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+}
+
+.login input[type="checkbox"] {
+	margin-top: 0.75em;
+}
+
+#login-container {
+	width: 18.5em;
+	margin-top: 2em;
+}
+
+div.login.container {
+	width: 550px;
+}
+
+#overtree .fancytree-container {
+	border: 0px;
+}
+
+#overtree span.fancytree-alert-icon.ui-icon-refresh {
+	background-position: -64px -80px;
+}
+#overtree span.fancytree-alert-icon.ui-icon-transfer-e-w {
+	background-position: -112px -80px;
+}
+
+#alerts {
+	position: fixed;
+	right: 0;
+	top: 0;
+	z-index: 100;
+}
+
+.alert-enter,
+.alert-leave,
+.alert-move {
+  -webkit-transition: 1s linear all;
+  -moz-transition: 1s linear all;
+  -o-transition: 1s linear all;
+  transition: 1s linear all;
+  position:relative;
+}
+
+.alert-enter {
+  left:-10px;
+  opacity:0;
+}
+.alert-enter.alert-enter-active {
+  left:0;
+  opacity:1;
+}
+
+.alert-leave {
+  left:0;
+  opacity:1;
+}
+.alert-leave.alert-leave-active {
+  left:-10px;
+  opacity:0;
+}
+
+.alert-move {
+  opacity:0.5;
+}
+.alert-move.alert-move-active {
+  opacity:1;
+}
+

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/css/qdrTopology.css
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/css/qdrTopology.css b/console/stand-alone/plugin/css/qdrTopology.css
new file mode 100644
index 0000000..e1cf239
--- /dev/null
+++ b/console/stand-alone/plugin/css/qdrTopology.css
@@ -0,0 +1,498 @@
+/*
+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.
+*/
+
+svg {
+  background-color: transparent;
+  cursor: default;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+}
+
+svg:not(.active):not(.ctrl) {
+  cursor: crosshair;
+}
+#end-arrow-selected, #start-arrow-selected {
+	stroke: #00F;
+	fill: #00F;
+}
+
+path.link {
+  fill: none;
+  stroke: #000;
+  stroke-width: 4px;
+  cursor: default;
+}
+
+svg:not(.active):not(.ctrl) path.link {
+  cursor: pointer;
+}
+
+path.link.selected {
+  stroke-dasharray: 10,2;
+  stroke: #00F  !important;
+}
+
+
+path.link.highlighted {
+    stroke: #0F0 !important;
+
+}
+
+path.link.temp {
+  opacity: 0.3;
+}
+path.link.temp.over {
+  opacity: 0.8;
+  stroke-dasharray: 10,2;
+}
+
+path.link.dragline {
+  pointer-events: none;
+}
+
+path.link.hidden {
+  stroke-width: 0;
+}
+
+
+circle.node {
+    stroke-width: 1.5px;
+    cursor: pointer;
+    stroke: darkgray;
+    fill: lightgray;
+}
+
+circle.node.reflexive {
+    stroke: #F00 !important;
+    stroke-width: 2.5px;
+}
+circle.node.selected {
+    stroke: #F00 !important;
+    stroke-width: 2px;
+    fill: #e0e0ff !important;
+}
+circle.node.inter-router {
+    fill: #EAEAEA;
+}
+circle.node.normal {
+    fill: #F0F000;
+}
+circle.node.on-demand {
+    fill: #00F000;
+}
+
+circle.node.fixed {
+    stroke-dasharray: 10,2;
+}
+circle.node.temp {
+    stroke: #f80;
+    fill: #f0f0ff;
+}
+
+text {
+  font: 12px sans-serif;
+  pointer-events: none;
+  /*font-family: monospace;*/
+
+}
+
+.tooltipsy
+{
+    padding: 10px;
+/*    max-width: 320px;*/
+    color: #303030;
+    background-color: #fcfcfe;
+    border: 1px solid #deca7e;
+    border-radius: 5px;
+}
+
+.tiptable {
+
+}
+.tiptable tr {
+	border-bottom: 1px solid #ccc;
+}
+
+.tiptable tr:last-child {
+	border-bottom: 0px;
+}
+
+.tiptable tr:nth-child(even) {
+	background: #fcfcfe;
+}
+.tiptable tr:nth-child(odd) {
+	background: #FFF
+}
+
+text.id {
+  text-anchor: middle;
+  font-weight: bold;
+}
+
+.row-fluid.tertiary {
+  position: relative;
+  left: 20px;
+}
+
+.row-fluid.tertiary.left {
+  float: left;
+}
+
+.row-fluid.tertiary.panel {
+  width: 410px;
+  height: 100%;
+}
+
+.panel-adjacent {
+  margin-left: 430px;
+}
+
+#topologyForm.selected {
+  border: 1px solid red;
+}
+#topologyForm {
+  border: 1px solid white;
+  padding: 2px;
+  position: relative;
+  top: -8px;
+}
+
+#topologyForm > div {
+  width:396px;
+}
+
+/* globe */
+.land {
+  fill: #999;
+  stroke-opacity: 1;
+}
+
+.graticule {
+  fill: none;
+  stroke: black;
+  stroke-width:.5;
+  opacity:.1;
+}
+
+.labels {
+    font: 18px sans-serif;
+    fill: black;
+    opacity: .85;
+	text-anchor: middle;
+}
+
+.noclicks { pointer-events:none; }
+
+.point {  opacity:.6; }
+
+.arcs {
+  opacity:.7;
+  stroke: darkgreen;
+  stroke-width: 3;
+}
+.flyers {
+  stroke-width:1;
+  opacity: 0;
+  stroke: darkred;
+}
+.arc, .flyer {
+  stroke-linejoin: round;
+  fill:none;
+}
+.arc { }
+.arc:hover {
+  stroke: darkred;
+}
+.flyer { }
+.flyer:hover {
+  stroke: darkgreen;
+}
+.arc.inter-router {
+  stroke: darkblue;
+}
+
+#addNodeForm {
+  padding: 1em;
+}
+
+
+li.currentStep {
+  font-weight: bold;
+}
+
+.qdrTopology div.panel {
+  position: absolute;
+}
+/*
+.ui-dialog-titlebar {
+    border: 0;
+    background: transparent;
+}
+*/
+
+.ui-tabs.ui-tabs-vertical {
+    padding: 0;
+    width: 48em;
+}
+.ui-tabs.ui-tabs-vertical .ui-widget-header {
+    border: none;
+}
+.ui-tabs.ui-tabs-vertical .ui-tabs-nav {
+    float: left;
+    width: 10em;
+    background: #CCC;
+    border-radius: 4px 0 0 4px;
+    border-right: 1px solid gray;
+}
+.ui-tabs.ui-tabs-vertical .ui-tabs-nav li {
+    clear: left;
+    width: 100%;
+    margin: 0.1em 0;
+    border: 1px solid gray;
+    border-width: 1px 0 1px 1px;
+    border-radius: 4px 0 0 4px;
+    overflow: hidden;
+    position: relative;
+    right: -2px;
+    z-index: 2;
+}
+.ui-tabs.ui-tabs-vertical .ui-tabs-nav li a {
+    display: block;
+    width: 100%;
+    padding: 0.1em 1em;
+}
+.ui-tabs.ui-tabs-vertical .ui-tabs-nav li a:hover {
+    cursor: pointer;
+}
+.ui-tabs.ui-tabs-vertical .ui-tabs-nav li.ui-tabs-active {
+    margin-bottom: 0.2em;
+    padding-bottom: 0;
+    border-right: 1px solid white;
+}
+.ui-tabs.ui-tabs-vertical .ui-tabs-nav li:last-child {
+    margin-bottom: 10px;
+}
+.ui-tabs.ui-tabs-vertical .ui-tabs-panel {
+    float: left;
+    width: 34em;
+    border-left: 1px solid gray;
+    border-radius: 0;
+    position: relative;
+    left: -1px;
+}
+
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected {
+    right: -3px !important;
+}
+
+.ui-tabs li i.ui-icon {
+    display: inline-block;
+}
+.ui-tabs .ui-tabs-panel {
+    /* padding-top: 0 !important; */
+}
+
+.ui-widget-content fieldset {
+  float: left;
+  padding: 0 1em 0 0;
+}
+
+.entity-description {
+  color: #960;
+  font-size: 90%;
+}
+
+.attr-description {
+  padding-top: 1.5em;
+  float: right;
+  width: 17em;
+}
+.attr-annotations {
+    padding-top: 2.5em;
+    clear: both;
+}
+.attr-annotations > span {
+    padding-top: 0.5em;
+    border-top: 1px dashed darkgray;
+    display: block;
+}
+
+.attr-type {
+    color: #990;
+    font-size: 85%;
+}
+.attr-required {
+    color: red;
+    font-size: 85%;
+}
+.attr-unique {
+    color: green;
+    font-size: 85%;
+}
+
+#tabs.nodeEntities {
+  border: 0;
+}
+
+#tabs ul.nodeTabs {
+  background: #fff;
+}
+
+#tabs #Container {
+  border-left: 1px solid #aaa;
+}
+
+#tabs.ui-tabs .ui-tabs-nav li {
+  border-bottom: 1px solid #aaa !important;
+}
+
+.entity-fields {
+  /* height: 400px; */
+  overflow-y: scroll;
+  overflow-x: hidden;
+}
+
+.entity-fields div.boolean label:first-child {
+    float: left;
+    margin-right: 1em;
+}
+.entity-fields div.boolean {
+    padding-bottom: 1em;
+}
+
+.entity-fields label.ng-binding {
+    font-weight: 600;
+    margin-top: 0.5em;
+}
+
+.aggregate {
+	text-align: right;
+}
+
+.aggregate i {
+	float: right;
+    margin: 3px 3px 3px 8px;
+}
+
+.aggregate .hastip {
+	padding: 5px;
+}
+
+.subTip .tipsy-inner {
+	background-color: white;
+	color: black;
+	font-size: 1.3em;
+	border: 1px solid black;
+}
+
+.subTip .tipsy-arrow-n { border-bottom-color: black; }
+.subTip .tipsy-arrow-s { border-top-color: black; }
+.subTip .tipsy-arrow-e { border-left-color: black; }
+.subTip .tipsy-arrow-w { border-right-color: black; }
+
+
+.contextMenu {
+    display:none;
+	position:absolute;
+	left:30px;
+	top:-30px;
+	z-index:999;
+	/* width:300px; */
+}
+.contextMenu ul {
+	width:300px;
+	margin:0;
+	/* padding:10px; */
+	list-style:none;
+	background:#fff;
+	color:#333;
+    font-weight: 600;
+	/* -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; */
+	-moz-box-shadow:5px 5px 5px #ddd; -webkit-box-shadow:5px 5px 5px #999; box-shadow:5px 5px 5px #ddd;
+	border: 1px solid #aaa;
+}
+.contextMenu ul li {
+	padding:5px 10px;
+	/* border-bottom: solid 1px #ccc; */
+}
+.contextMenu ul li:hover {
+	background:#4a90d9; color:#fff;
+}
+.contextMenu ul li:last-child {
+    border:none;
+}
+
+.na {
+    display: none;
+}
+.contextMenu ul li.new {
+    display: block;
+}
+.contextMenu ul li.adding, .contextMenu ul li.adding + li {
+    display: block;
+}
+.contextMenu ul li.force-display {
+    display: block;
+}
+.contextMenu ul li.context-separator {
+    background-color: lightgray;
+    height: 1px;
+    padding: 0;
+}
+
+.ui-tabs.ui-tabs-vertical .ui-tabs-nav li.separated {
+    margin-top: 1em;
+}
+
+#crosssection {
+    display: none;
+    position: absolute;
+    top: 200px;
+    left: 600px;
+}
+
+.node circle {
+/*  fill: rgb(31, 119, 180);
+  fill-opacity: .25; */
+  fill: #cfe2f3;
+  fill-opacity: .98;
+  stroke: black;
+  stroke-width: 3px;
+}
+
+.leaf circle {
+  fill: #6fa8dc;
+  fill-opacity: 0.95;
+  stroke-width: 3px;
+}
+
+.leaf circle[title] {
+    font-family: monospace;
+
+}
+
+.tabs-left .nav-tabs {
+	float: left;
+}
+.tabs-left .nav-tabs > li {
+	float: initial;
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[18/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
moved standalone to a subdir


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/4940e63d
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/4940e63d
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/4940e63d

Branch: refs/heads/master
Commit: 4940e63df9e9345d0fec4ae949c86f7172a2c4e3
Parents: 4802b68
Author: Ernest Allen <ea...@redhat.com>
Authored: Thu Feb 18 13:01:26 2016 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Thu Feb 18 13:01:26 2016 -0500

----------------------------------------------------------------------
 console/index.html                              |  127 -
 console/plugin/css/json-formatter-min.css       |    6 -
 console/plugin/css/plugin.css                   |  658 --
 console/plugin/css/qdrTopology.css              |  498 --
 console/plugin/css/site-base.css                | 4482 ----------
 console/plugin/css/ui.dynatree.css              |  456 --
 console/plugin/data/places1.json                |   13 -
 console/plugin/data/world-110m.json             |    1 -
 console/plugin/html/qdrCharts.html              |  150 -
 console/plugin/html/qdrConnect.html             |   65 -
 console/plugin/html/qdrGraphs.html              |   15 -
 console/plugin/html/qdrLayout.html              |   26 -
 console/plugin/html/qdrList.html                |   56 -
 console/plugin/html/qdrOverview.html            |   83 -
 console/plugin/html/qdrSchema.html              |   21 -
 console/plugin/html/qdrTopology.html            |  222 -
 console/plugin/img/ZeroClipboard.swf            |  Bin 1966 -> 0 bytes
 console/plugin/img/ajax-loader.gif              |  Bin 3208 -> 0 bytes
 console/plugin/img/dynatree/icons.gif           |  Bin 5512 -> 0 bytes
 console/plugin/img/dynatree/loading.gif         |  Bin 3111 -> 0 bytes
 console/plugin/js/navbar.js                     |  119 -
 console/plugin/js/qdrChartService.js            |  956 ---
 console/plugin/js/qdrCharts.js                  |  230 -
 console/plugin/js/qdrList.js                    |  474 --
 console/plugin/js/qdrOverview.js                |  696 --
 console/plugin/js/qdrPlugin.js                  |  197 -
 console/plugin/js/qdrSchema.js                  |   31 -
 console/plugin/js/qdrService.js                 |  742 --
 console/plugin/js/qdrSettings.js                |  115 -
 console/plugin/js/qdrTopology.js                | 1871 -----
 console/plugin/lib/jquery.tipsy.js              |  418 -
 console/plugin/lib/json-formatter-min.js        |    7 -
 console/plugin/lib/rhea.js                      | 7716 ------------------
 console/plugin/lib/slider.js                    |  170 -
 console/stand-alone/plugin/css/plugin.css       |  658 ++
 console/stand-alone/plugin/css/qdrTopology.css  |  498 ++
 console/stand-alone/plugin/css/site-base.css    | 4482 ++++++++++
 console/stand-alone/plugin/data/places1.json    |   13 +
 console/stand-alone/plugin/data/world-110m.json |    1 +
 console/stand-alone/plugin/html/qdrCharts.html  |  150 +
 console/stand-alone/plugin/html/qdrConnect.html |   65 +
 console/stand-alone/plugin/html/qdrGraphs.html  |   15 +
 console/stand-alone/plugin/html/qdrLayout.html  |   26 +
 console/stand-alone/plugin/html/qdrList.html    |   56 +
 .../stand-alone/plugin/html/qdrOverview.html    |   83 +
 console/stand-alone/plugin/html/qdrSchema.html  |   21 +
 .../stand-alone/plugin/img/ZeroClipboard.swf    |  Bin 0 -> 1966 bytes
 console/stand-alone/plugin/img/ajax-loader.gif  |  Bin 0 -> 3208 bytes
 .../stand-alone/plugin/img/dynatree/icons.gif   |  Bin 0 -> 5512 bytes
 .../stand-alone/plugin/img/dynatree/loading.gif |  Bin 0 -> 3111 bytes
 console/stand-alone/plugin/js/navbar.js         |  119 +
 .../stand-alone/plugin/js/qdrChartService.js    |  956 +++
 console/stand-alone/plugin/js/qdrCharts.js      |  230 +
 console/stand-alone/plugin/js/qdrList.js        |  474 ++
 console/stand-alone/plugin/js/qdrOverview.js    |  696 ++
 console/stand-alone/plugin/js/qdrPlugin.js      |  197 +
 console/stand-alone/plugin/js/qdrSchema.js      |   31 +
 console/stand-alone/plugin/js/qdrService.js     |  742 ++
 console/stand-alone/plugin/js/qdrSettings.js    |  115 +
 console/stand-alone/plugin/lib/rhea.js          | 7716 ++++++++++++++++++
 60 files changed, 17344 insertions(+), 20621 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/index.html
----------------------------------------------------------------------
diff --git a/console/index.html b/console/index.html
deleted file mode 100644
index 69aa788..0000000
--- a/console/index.html
+++ /dev/null
@@ -1,127 +0,0 @@
-<!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>
-
-<head>
-
-    <meta charset="utf-8"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
-    <title>Qpid Dispatch Console</title>
-
-    <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
-    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.tipsy/1.0.2/jquery.tipsy.css" type="text/css"/>
-    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-grid/3.0.7/ui-grid.css" type="text/css"/>
-    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.fancytree/2.15.0/skin-win8/ui.fancytree.css" type="text/css">
-
-    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
-    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
-
-    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.min.css">
-
-
-    <link rel="stylesheet" href="plugin/css/site-base.css" type="text/css"/>
-    <link rel="stylesheet" href="plugin/css/plugin.css" type="text/css"/>
-    <link rel="stylesheet" href="plugin/css/qdrTopology.css" type="text/css"/>
-    <link rel="stylesheet" href="plugin/css/json-formatter-min.css" type="text/css"/>
-
-</head>
-
-<body ng-app="QDR">
-
-<div id="core" ng-controller="QDR.Core">
-    <div id="alerts">
-        <uib-alert ng-repeat="alert in alerts" type="{{alert.type}}">{{alert.msg}}</uib-alert>
-    </div>
-    <div id="main-nav" class="navbar navbar-fixed-top" ng-controller="QDR.MainController">
-        <div class="navbar-inner main-nav-lower">
-            <div class="container">
-                <div class="pull-left">
-                    <ul class="nav">
-                        <li ng-repeat="nav in topLevelTabs track by $index"
-                            ng-class="{active : !nav.isActive()}"
-                            ng-show="nav.isValid()">
-                            <a ng-href="{{nav.href}}" title="{{nav.title}}" data-placement="bottom" ng-bind="nav.content">
-                            </a>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <div id="main-body" >
-        <div id="main" class="container-fluid ng-cloak qdr">
-            <div>
-                <ul class="nav nav-tabs connected" ng-controller="QDR.NavBarController">
-                    <li ng-repeat="link in breadcrumbs" ng-show="isValid(link)" ng-class='{active : isActive(link.href), "pull-right" : isRight(link), haschart: hasChart(link)}'>
-                        <a ng-href="{{link.href}}{{hash}}" ng-bind-html="link.content | to_trusted"></a>
-                    </li>
-                </ul>
-                <div class="row-fluid">
-                    <div ng-view></div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-
-    <script src="http://d3js.org/d3.v3.min.js"></script>
-    <script src="http://d3js.org/queue.v1.min.js"></script>
-    <script src="http://d3js.org/topojson.v0.min.js"></script>
-
-    <script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>
-
-    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
-
-    <script src="https://code.angularjs.org/1.4.8/angular.js"></script>
-    <script src="https://code.angularjs.org/1.4.8/angular-resource.js"></script>
-    <script src="https://code.angularjs.org/1.4.8/angular-route.js"></script>
-    <script src="https://code.angularjs.org/1.4.8/angular-animate.js"></script>
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/1.1.0/ui-bootstrap-tpls.min.js"></script>
-    <script type="text/javascript" src="plugin/lib/jquery.tipsy.js"></script>
-    <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tipsy/1.0.2/jquery.tipsy.js"></script> -->
-
-    <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-grid/3.0.7/ui-grid.js"></script>
-
-    <script type="text/javascript" src="plugin/js/qdrPlugin.js"></script>
-    <script type="text/javascript" src="plugin/js/qdrOverview.js"></script>
-    <script type="text/javascript" src="plugin/js/navbar.js"></script>
-    <script type="text/javascript" src="plugin/js/qdrList.js"></script>
-    <script type="text/javascript" src="plugin/js/qdrCharts.js"></script>
-    <script type="text/javascript" src="plugin/js/qdrSchema.js"></script>
-    <script type="text/javascript" src="plugin/js/qdrService.js"></script>
-    <script type="text/javascript" src="plugin/js/qdrChartService.js"></script>
-    <script type="text/javascript" src="plugin/js/qdrTopology.js"></script>
-    <script type="text/javascript" src="plugin/js/qdrSettings.js"></script>
-
-    <script type="text/javascript" src="plugin/lib/slider.js"></script>
-    <script type="text/javascript" src="plugin/lib/rhea.js"></script>
-
-    <script type="text/javascript" src="plugin/lib/json-formatter-min.js"></script>
-
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.fancytree/2.15.0/jquery.fancytree.js" type="text/javascript"></script>
-
-    <script type="text/javascript">
-        angular.element(document.getElementsByTagName('head')).append(angular.element('<base href="' + window.location.pathname + '" />'));
-  </script>
-</body>
-</html>
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/css/json-formatter-min.css
----------------------------------------------------------------------
diff --git a/console/plugin/css/json-formatter-min.css b/console/plugin/css/json-formatter-min.css
deleted file mode 100644
index cd55fd4..0000000
--- a/console/plugin/css/json-formatter-min.css
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * jsonformatter
- *
- * Version: 0.4.1 - 2015-12-03T03:38:59.933Z
- * License: MIT
- */.json-formatter-dark.json-formatter-row,.json-formatter-row{font-family:monospace}.json-formatter-dark.json-formatter-row .toggler.open:after,.json-formatter-row .toggler.open:after{transform:rotate(90deg)}.json-formatter-row,.json-formatter-row a,.json-formatter-row a:hover{color:#000;text-decoration:none}.json-formatter-row .json-formatter-row{margin-left:1em}.json-formatter-row .children.empty{opacity:.5;margin-left:1em}.json-formatter-row .children.empty.object:after{content:"No properties"}.json-formatter-row .children.empty.array:after{content:"[]"}.json-formatter-row .string{color:green;white-space:pre;word-wrap:break-word}.json-formatter-row .number{color:#00f}.json-formatter-row .boolean{color:red}.json-formatter-row .null{color:#855a00}.json-formatter-row .undefined{color:#ca0b69}.json-formatter-row .function{color:#ff20ed}.json-formatter-row .date{background-color:rgba(0,0,0,.05)}.json-formatter-row .url{text-decoration:underline;color:#00f;cursor:pointer}.json-formatt
 er-row .bracket{color:#00f}.json-formatter-row .key{color:#00008b;cursor:pointer}.json-formatter-row .constructor-name{cursor:pointer}.json-formatter-row .toggler{font-size:.8em;line-height:1.2em;vertical-align:middle;opacity:.6;cursor:pointer}.json-formatter-row .toggler:after{display:inline-block;transition:transform .1s ease-in;content:"â–º"}.json-formatter-row>a>.thumbnail-text{opacity:0;transition:opacity .15s ease-in;font-style:italic}.json-formatter-row:hover>a>.thumbnail-text{opacity:.6}.json-formatter-dark.json-formatter-row,.json-formatter-dark.json-formatter-row a,.json-formatter-dark.json-formatter-row a:hover{color:#fff;text-decoration:none}.json-formatter-dark.json-formatter-row .json-formatter-row{margin-left:1em}.json-formatter-dark.json-formatter-row .children.empty{opacity:.5;margin-left:1em}.json-formatter-dark.json-formatter-row .children.empty.object:after{content:"No properties"}.json-formatter-dark.json-formatter-row .children.empty.array:after{content:"[]"}.j
 son-formatter-dark.json-formatter-row .string{color:#31f031;white-space:pre;word-wrap:break-word}.json-formatter-dark.json-formatter-row .number{color:#66c2ff}.json-formatter-dark.json-formatter-row .boolean{color:#ec4242}.json-formatter-dark.json-formatter-row .null{color:#eec97d}.json-formatter-dark.json-formatter-row .undefined{color:#ef8fbe}.json-formatter-dark.json-formatter-row .function{color:#fd48cb}.json-formatter-dark.json-formatter-row .date{background-color:rgba(255,255,255,.05)}.json-formatter-dark.json-formatter-row .url{text-decoration:underline;color:#027bff;cursor:pointer}.json-formatter-dark.json-formatter-row .bracket{color:#9494ff}.json-formatter-dark.json-formatter-row .key{color:#23a0db;cursor:pointer}.json-formatter-dark.json-formatter-row .constructor-name{cursor:pointer}.json-formatter-dark.json-formatter-row .toggler{font-size:.8em;line-height:1.2em;vertical-align:middle;opacity:.6;cursor:pointer}.json-formatter-dark.json-formatter-row .toggler:after{displa
 y:inline-block;transition:transform .1s ease-in;content:"â–º"}.json-formatter-dark.json-formatter-row>a>.thumbnail-text{opacity:0;transition:opacity .15s ease-in;font-style:italic}.json-formatter-dark.json-formatter-row:hover>a>.thumbnail-text{opacity:.6}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/css/plugin.css
----------------------------------------------------------------------
diff --git a/console/plugin/css/plugin.css b/console/plugin/css/plugin.css
deleted file mode 100644
index 5097d64..0000000
--- a/console/plugin/css/plugin.css
+++ /dev/null
@@ -1,658 +0,0 @@
-/*
-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.
-*/
-main-display > .span8 {
-  height: 100%;
-  position: relative;
-}
-
-.nickname-window,
-.channel-window,
-.main-window {
-  position: absolute;
-  top: 2px;
-  bottom: 2px;
-  left: 4px;
-  right: 4px;
-  /* border: 1px solid #d4d4d4;
-  border-radius: 4px;*/
-  overflow-y: auto;
-  overflow-x: hidden;
-}
-
-.nickname-window > .nickname-window-inner,
-.channel-window > .channel-window-inner,
-.main-window > .main-window-inner {
-  position: static;
-}
-
-.channel-window-inner > ul > li {
-  cursor: pointer;
-  padding: 0;
-  border-bottom: 1px solid #EEEEEE;
-}
-
-
-.channel-window-inner > ul > li > span:hover {
-  background-color: #EAEAEA;
-}
-
-ul.qdrListNodes > li > span {
-  padding: 6px 20px; 6px; 6px;
-  display: block;
-}
-
-.qdrList .gridStyle {
-    width: 20em;
-    margin-right: 0;
-    float: left;
-}
-
-
-.qdrList div.gridDetails {
-
-    width: auto;
-}
-
-.selectedItems {
-    margin-left: 21em;
-}
-
-.qdrListPane {
-    top: 110px;
-}
-
-.qdrListActions {
-    width: auto;
-}
-
-.nickname-window-inner > ul > li {
-  cursor: pointer;
-}
-
-.channel-window {
-  bottom: 40px;
-}
-
-.main-window {
-  border: none;
-  top: 46px;
-  bottom: 46px;
-}
-
-.main-window.no-topic {
-  top: 2px;
-}
-
-.topic-window {
-  position: absolute;
-  left: 10px;
-  right: 10px;
-  top: 2px;
-  height: 20px;
-  overflow: hidden;
-  z-index: 50;
-  border-bottom-left-radius: 4px;
-  border-bottom-right-radius: 4px;
-  border-left: 1px solid #d4d4d4;
-  border-right: 1px solid #d4d4d4;
-  border-bottom: 1px solid #d4d4d4;
-  background: white;
-  padding: 10px;
-}
-
-.input-widget {
-  background: white;
-  position: absolute;
-  bottom: 2px;
-  left: 2px;
-  right: 2px;
-  height: 40px;
-  z-index: 50;
-}
-
-.input-widget > form {
-  position: relative;
-}
-
-.input-widget > form > div {
-  position: absolute;
-  left: 2px;
-  top: 2px;
-  bottom: 2px;
-  right: 84px;
-}
-
-.input-widget > form > div > input[type="text"] {
-  width: 100%;
-}
-
-.input-widget > form > input[type="submit"] {
-  position: absolute;
-  right: 2px;
-  top: 3px;
-}
-
-.input-widget > form > input {
-  margin-bottom: 0;
-}
-
-.channel-control-buttons {
-  position: absolute;
-  background: white;
-  bottom: 2px;
-  left: 2px;
-  right: 2px;
-  z-index: 50;
-}
-
-div.listAttrName {
-    padding-top: 5px;
-}
-
-div.listAttrName i.icon-bar-chart {
-    float: right;
-    margin: 5px;
-}
-
-div.listAttrName i.icon-bar-chart.active, div.hastip i.icon-bar-chart.active, li.haschart i {
-    background-color: #AAFFAA;
-}
-
-div#main div ul.nav li a:not(.btn) {
-    background: initial !important;
-}
-
-div#main div ul.nav li.active a {
-    background-color: #f0f0ff !important;
-}
-
-div#main.qdr {
-    margin-top: 44px !important;
-}
-
-div.charts-header {
-  font-size: 1.2em;
-  color: #666666;
-  margin: 1em 0;
-}
-
-.selectedNode, .selectedAction, .selectedEntity {
-    font-weight: 600;
-    color: #606066;
-}
-
-.okButton {
-    text-align: center;
-    margin: 1em;
-}
-
-span.showChartsLink {
-    border: 1px solid blue;
-    padding: 1px 2px;
-}
-
-div.listGraphs p {
-    margin: 1em 0 2em 2em;
-    text-align: center;
-}
-
-div.centered {
-    text-align: center;
-    margin: 4em;
-}
-
-.modal-body.centered {
-	margin: 0;
-}
-
-div.aChart {
-    height: 200px;
-    width:  400px;
-    margin: 1em;
-}
-
-div.chartContainer {
-    float: left;
-}
-
-div.d3Chart path {
-    stroke: black;
-    stroke-width: 1;
-	opacity: 0.5;
-}
-
-div.d3Chart path.line {
-    stroke: steelblue;
-    stroke-width: 1;
-    fill: none;
-    opacity: 1;
-}
-
-.mo-rect {
-    fill: #ffffdd;
-    stroke: #f0f0f0;
-    stroke-width: 1;
-}
-
-.mo-guide {
-    fill: none;
-    stroke: #d0d0d0;
-    stroke-width: 2;
-    stroke-dasharray: 3,3;
-}
-
-div.d3Chart .title {
-    text-decoration: underline;
-}
-
-
-.axis line, .axis path {
-  fill: none;
-  shape-rendering: crispEdges;
-  stroke-width: 1;
-  stroke: #000000;
-}
-
-.axis line {
-  stroke: #C0C0C0;
-  stroke-dasharray: 1,1;
-  opacity: 0.5;
-}
-
-.y.axis text, .x.axis text, .focus text, div.d3Chart .title {
-    font-size: 12px;
-}
-
-.y.axis path {
-   stroke: #000;
- }
-
-.overlay {
-   fill: none;
-   pointer-events: all;
- }
-
-.focus circle {
-   fill: none;
-   stroke: steelblue;
- }
-.focus .fo-table {
-	/* box-shadow: 2px 2px 3px #EEE; */
-}
-
-div.d3Chart {
-    padding: 1em 0;
-    border: 1px solid #C0C0C0;
-}
-
-div.d3Chart .axis path {
-	display: inherit;
-}
-.c3-circle {
-	display: none;
-}
-
-.fo-table {
-	border: 1px solid darkgray;
-	background-color: white;
-	font-size: .85em;
-}
-
-.fo-table td {
-	padding: 4px;
-	border-left: 1px solid darkgray;
-}
-.fo-table tr.detail td {
-	padding: 1px 4px;
-}
-.fo-title {
-	color: white;
-	background-color: darkgray;
-}
-
-.fo-table-legend {
-	width: 8px;
-	height: 8px;
-	border: 1px solid black;
-	margin: 0 4px;
-	display: inline-block;
-}
-
-svg .legend {
-	dominant-baseline: central;
-}
-
-div.chartContainer div.aChart {
-    margin-top: 0.5em;
-}
-
-div#main.qdr div ul.nav li.active a {
-  background-color: #e0e0ff !important;
-  color: #000000;
-}
-
-div#main.qdr .selected, .box.selected {
-  color: #000000;
-  text-shadow: none;
-}
-
-/* the selected node on the list page */
-div.qdrList li.active {
-    background-color: #e0e0ff;
-}
-
-/* the selected row in the name table */
-div#main.qdr div.qdrList div.selected {
-  background-color: #e0e0ff !important;
-}
-
-#dialogChart {
-    height: 200px;
-}
-
-div.qdrCharts p.chartLabels button {
-    float: right;
-}
-
-div.qdrCharts p.chartLabels {
-     padding-right: 1em;;
- }
-
-p.dialogHeader {
-    text-align: center;
-}
-
-p.dialogHeader input {
-    margin-top: 10px;
-    width: 480px;
-}
-
-.ui-slider-tick {
-  position: absolute;
-  background-color: #666;
-  width: 2px;
-  height: 8px;
-  top: 12px;
-  z-index: -1;
-}
-
-label.rateGroup {
-    float: left;
-}
-
-div.chartOptions div.dlg-slider {
-    float: left;
-    margin-left: 2em;
-    width: 28em;
-    font-size: 14px;
-}
-
-div.chartOptions div.duration {
-  width: 35em !important;
-}
-
-div.chartOptions .slider {
-    margin-top: 1em;
-    margin-bottom: 1em;
-}
-
-input[type="radio"] {
-    margin-top: 0 !important;
-}
-
-div.chartOptions legend {
-    font-size: 1.2em;
-    margin-bottom: 10px;
-}
-
-div.chartOptions span.minicolors-swatch {
-    width: 14px;
-    height: 14px;
-}
-
-.minicolors-input {
-    width: 4em;
-    padding: 0 0 0 24px !important;
-}
-
-
-div.colorPicker div:nth-of-type(1), /* first span under div.colorPicker */
- div.minicolors{
-    float:left;
-    margin-right: 0.5em;
-}
-
-div.chartOptions p.sep {
-    height: 1em;
-}
-
-ul.nav-tabs {
-    border-bottom: 1px solid #ddd !important;
-}
-
-.chartOptions ul.nav-tabs {
-    margin-bottom: 0px !important;
-}
-
-div.tabbable div.tab-content {
-    overflow: visible;
-}
-
-div.tabbable ul.nav-tabs > .active > a {
-  background-color: #f8f8f8;
-  border: 1px solid #ddd;
-  border-bottom-color: transparent;
-}
-
-
-div.tabbable .tab-pane {
-    background-color: #f8f8f8;
-    padding: 12px;
-    border-right: 1px solid #ddd;
-    border-left: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-}
-
-div.tabbable ul.nav-tabs {
-  margin-bottom: 0;
-}
-
-ul.qdrTopoModes {
-    position: relative;
-    top: -10px;
-}
-.overview.section {
-	/* width: 35em; */
-}
-.overview.section .ngGrid {
-	height: 12em !important;
-	min-height: 12em !important;
-}
-
-.overview.routers.section .ngGrid {
- 	height: 16em !important;
- 	min-height: 16em !important;
-}
-.overview.routers.section {
- 	/*width: 15em; */
- }
-
-.grid-align-value {
-	text-align: right;
-}
-
-.overview .ngRow:hover {
-	background:#e0e0ff;
-}
-
-.treeContainer {
-	width: 250px;
-	float: left;
-}
-
-.treeDetails {
-	margin-left: 260px;
-}
-
-.gridStyle:not(.noHighlight) .ui-grid-row:hover .ui-grid-cell-contents {
-	background-color: #e0e0ff;
-}
-
-.ngCellText {
-	padding: 4px 0 0 4px;
-}
-
-.overview {
-	border-bottom: 1px solid #d4d4d4;
-}
-
-.ui-grid-row.ui-grid-row-selected > [ui-grid-row] > .ui-grid-cell {
-  background-color: #e0e0ff;
-}
-
-.tab-content .tab-pane {
-    background-color: #f8f8f8;
-    padding: 12px;
-    border-right: 1px solid #ddd;
-    border-left: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-}
-
-div.chartOptions ul.nav-tabs > .active > a {
-  background-color: #f8f8f8;
-  border: 1px solid #ddd;
-  border-bottom-color: transparent;
-}
-
-div.chartOptions label:nth-of-type(2) {
-    margin-left: 1em;
-}
-div.chartOptions label {
-	font-weight: normal;
-}
-
-.form-horizontal .control-label {
-    float: left;
-    width: 160px;
-    padding-top: 5px;
-    text-align: right;
-}
-
-.form-horizontal .controls {
-    margin-left: 180px;
-}
-
-.form-horizontal input,  {
-    display: inline-block;
-    margin-bottom: 0;
-    vertical-align: middle;
-}
-
-input[type="text"], input[type="number"], input[type="password"] {
-    background-color: #ffffff;
-    border: 1px solid #cccccc;
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-    -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-    -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
-    -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
-    -o-transition: border linear 0.2s, box-shadow linear 0.2s;
-    transition: border linear 0.2s, box-shadow linear 0.2s;
-}
-
-input[type="text"], input[type="number"], input[type="password"] {
-    display: inline-block;
-    width: 200px;
-    padding: 4px 6px;
-    margin-bottom: 10px;
-    font-size: 14px;
-    line-height: 20px;
-    color: #555555;
-    vertical-align: middle;
-    -webkit-border-radius: 4px;
-    -moz-border-radius: 4px;
-    border-radius: 4px;
-}
-
-.login input[type="checkbox"] {
-	margin-top: 0.75em;
-}
-
-#login-container {
-	width: 18.5em;
-	margin-top: 2em;
-}
-
-div.login.container {
-	width: 550px;
-}
-
-#overtree .fancytree-container {
-	border: 0px;
-}
-
-#overtree span.fancytree-alert-icon.ui-icon-refresh {
-	background-position: -64px -80px;
-}
-#overtree span.fancytree-alert-icon.ui-icon-transfer-e-w {
-	background-position: -112px -80px;
-}
-
-#alerts {
-	position: fixed;
-	right: 0;
-	top: 0;
-	z-index: 100;
-}
-
-.alert-enter,
-.alert-leave,
-.alert-move {
-  -webkit-transition: 1s linear all;
-  -moz-transition: 1s linear all;
-  -o-transition: 1s linear all;
-  transition: 1s linear all;
-  position:relative;
-}
-
-.alert-enter {
-  left:-10px;
-  opacity:0;
-}
-.alert-enter.alert-enter-active {
-  left:0;
-  opacity:1;
-}
-
-.alert-leave {
-  left:0;
-  opacity:1;
-}
-.alert-leave.alert-leave-active {
-  left:-10px;
-  opacity:0;
-}
-
-.alert-move {
-  opacity:0.5;
-}
-.alert-move.alert-move-active {
-  opacity:1;
-}
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/css/qdrTopology.css
----------------------------------------------------------------------
diff --git a/console/plugin/css/qdrTopology.css b/console/plugin/css/qdrTopology.css
deleted file mode 100644
index e1cf239..0000000
--- a/console/plugin/css/qdrTopology.css
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
-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.
-*/
-
-svg {
-  background-color: transparent;
-  cursor: default;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  -o-user-select: none;
-  user-select: none;
-}
-
-svg:not(.active):not(.ctrl) {
-  cursor: crosshair;
-}
-#end-arrow-selected, #start-arrow-selected {
-	stroke: #00F;
-	fill: #00F;
-}
-
-path.link {
-  fill: none;
-  stroke: #000;
-  stroke-width: 4px;
-  cursor: default;
-}
-
-svg:not(.active):not(.ctrl) path.link {
-  cursor: pointer;
-}
-
-path.link.selected {
-  stroke-dasharray: 10,2;
-  stroke: #00F  !important;
-}
-
-
-path.link.highlighted {
-    stroke: #0F0 !important;
-
-}
-
-path.link.temp {
-  opacity: 0.3;
-}
-path.link.temp.over {
-  opacity: 0.8;
-  stroke-dasharray: 10,2;
-}
-
-path.link.dragline {
-  pointer-events: none;
-}
-
-path.link.hidden {
-  stroke-width: 0;
-}
-
-
-circle.node {
-    stroke-width: 1.5px;
-    cursor: pointer;
-    stroke: darkgray;
-    fill: lightgray;
-}
-
-circle.node.reflexive {
-    stroke: #F00 !important;
-    stroke-width: 2.5px;
-}
-circle.node.selected {
-    stroke: #F00 !important;
-    stroke-width: 2px;
-    fill: #e0e0ff !important;
-}
-circle.node.inter-router {
-    fill: #EAEAEA;
-}
-circle.node.normal {
-    fill: #F0F000;
-}
-circle.node.on-demand {
-    fill: #00F000;
-}
-
-circle.node.fixed {
-    stroke-dasharray: 10,2;
-}
-circle.node.temp {
-    stroke: #f80;
-    fill: #f0f0ff;
-}
-
-text {
-  font: 12px sans-serif;
-  pointer-events: none;
-  /*font-family: monospace;*/
-
-}
-
-.tooltipsy
-{
-    padding: 10px;
-/*    max-width: 320px;*/
-    color: #303030;
-    background-color: #fcfcfe;
-    border: 1px solid #deca7e;
-    border-radius: 5px;
-}
-
-.tiptable {
-
-}
-.tiptable tr {
-	border-bottom: 1px solid #ccc;
-}
-
-.tiptable tr:last-child {
-	border-bottom: 0px;
-}
-
-.tiptable tr:nth-child(even) {
-	background: #fcfcfe;
-}
-.tiptable tr:nth-child(odd) {
-	background: #FFF
-}
-
-text.id {
-  text-anchor: middle;
-  font-weight: bold;
-}
-
-.row-fluid.tertiary {
-  position: relative;
-  left: 20px;
-}
-
-.row-fluid.tertiary.left {
-  float: left;
-}
-
-.row-fluid.tertiary.panel {
-  width: 410px;
-  height: 100%;
-}
-
-.panel-adjacent {
-  margin-left: 430px;
-}
-
-#topologyForm.selected {
-  border: 1px solid red;
-}
-#topologyForm {
-  border: 1px solid white;
-  padding: 2px;
-  position: relative;
-  top: -8px;
-}
-
-#topologyForm > div {
-  width:396px;
-}
-
-/* globe */
-.land {
-  fill: #999;
-  stroke-opacity: 1;
-}
-
-.graticule {
-  fill: none;
-  stroke: black;
-  stroke-width:.5;
-  opacity:.1;
-}
-
-.labels {
-    font: 18px sans-serif;
-    fill: black;
-    opacity: .85;
-	text-anchor: middle;
-}
-
-.noclicks { pointer-events:none; }
-
-.point {  opacity:.6; }
-
-.arcs {
-  opacity:.7;
-  stroke: darkgreen;
-  stroke-width: 3;
-}
-.flyers {
-  stroke-width:1;
-  opacity: 0;
-  stroke: darkred;
-}
-.arc, .flyer {
-  stroke-linejoin: round;
-  fill:none;
-}
-.arc { }
-.arc:hover {
-  stroke: darkred;
-}
-.flyer { }
-.flyer:hover {
-  stroke: darkgreen;
-}
-.arc.inter-router {
-  stroke: darkblue;
-}
-
-#addNodeForm {
-  padding: 1em;
-}
-
-
-li.currentStep {
-  font-weight: bold;
-}
-
-.qdrTopology div.panel {
-  position: absolute;
-}
-/*
-.ui-dialog-titlebar {
-    border: 0;
-    background: transparent;
-}
-*/
-
-.ui-tabs.ui-tabs-vertical {
-    padding: 0;
-    width: 48em;
-}
-.ui-tabs.ui-tabs-vertical .ui-widget-header {
-    border: none;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav {
-    float: left;
-    width: 10em;
-    background: #CCC;
-    border-radius: 4px 0 0 4px;
-    border-right: 1px solid gray;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li {
-    clear: left;
-    width: 100%;
-    margin: 0.1em 0;
-    border: 1px solid gray;
-    border-width: 1px 0 1px 1px;
-    border-radius: 4px 0 0 4px;
-    overflow: hidden;
-    position: relative;
-    right: -2px;
-    z-index: 2;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li a {
-    display: block;
-    width: 100%;
-    padding: 0.1em 1em;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li a:hover {
-    cursor: pointer;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li.ui-tabs-active {
-    margin-bottom: 0.2em;
-    padding-bottom: 0;
-    border-right: 1px solid white;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li:last-child {
-    margin-bottom: 10px;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-panel {
-    float: left;
-    width: 34em;
-    border-left: 1px solid gray;
-    border-radius: 0;
-    position: relative;
-    left: -1px;
-}
-
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected {
-    right: -3px !important;
-}
-
-.ui-tabs li i.ui-icon {
-    display: inline-block;
-}
-.ui-tabs .ui-tabs-panel {
-    /* padding-top: 0 !important; */
-}
-
-.ui-widget-content fieldset {
-  float: left;
-  padding: 0 1em 0 0;
-}
-
-.entity-description {
-  color: #960;
-  font-size: 90%;
-}
-
-.attr-description {
-  padding-top: 1.5em;
-  float: right;
-  width: 17em;
-}
-.attr-annotations {
-    padding-top: 2.5em;
-    clear: both;
-}
-.attr-annotations > span {
-    padding-top: 0.5em;
-    border-top: 1px dashed darkgray;
-    display: block;
-}
-
-.attr-type {
-    color: #990;
-    font-size: 85%;
-}
-.attr-required {
-    color: red;
-    font-size: 85%;
-}
-.attr-unique {
-    color: green;
-    font-size: 85%;
-}
-
-#tabs.nodeEntities {
-  border: 0;
-}
-
-#tabs ul.nodeTabs {
-  background: #fff;
-}
-
-#tabs #Container {
-  border-left: 1px solid #aaa;
-}
-
-#tabs.ui-tabs .ui-tabs-nav li {
-  border-bottom: 1px solid #aaa !important;
-}
-
-.entity-fields {
-  /* height: 400px; */
-  overflow-y: scroll;
-  overflow-x: hidden;
-}
-
-.entity-fields div.boolean label:first-child {
-    float: left;
-    margin-right: 1em;
-}
-.entity-fields div.boolean {
-    padding-bottom: 1em;
-}
-
-.entity-fields label.ng-binding {
-    font-weight: 600;
-    margin-top: 0.5em;
-}
-
-.aggregate {
-	text-align: right;
-}
-
-.aggregate i {
-	float: right;
-    margin: 3px 3px 3px 8px;
-}
-
-.aggregate .hastip {
-	padding: 5px;
-}
-
-.subTip .tipsy-inner {
-	background-color: white;
-	color: black;
-	font-size: 1.3em;
-	border: 1px solid black;
-}
-
-.subTip .tipsy-arrow-n { border-bottom-color: black; }
-.subTip .tipsy-arrow-s { border-top-color: black; }
-.subTip .tipsy-arrow-e { border-left-color: black; }
-.subTip .tipsy-arrow-w { border-right-color: black; }
-
-
-.contextMenu {
-    display:none;
-	position:absolute;
-	left:30px;
-	top:-30px;
-	z-index:999;
-	/* width:300px; */
-}
-.contextMenu ul {
-	width:300px;
-	margin:0;
-	/* padding:10px; */
-	list-style:none;
-	background:#fff;
-	color:#333;
-    font-weight: 600;
-	/* -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; */
-	-moz-box-shadow:5px 5px 5px #ddd; -webkit-box-shadow:5px 5px 5px #999; box-shadow:5px 5px 5px #ddd;
-	border: 1px solid #aaa;
-}
-.contextMenu ul li {
-	padding:5px 10px;
-	/* border-bottom: solid 1px #ccc; */
-}
-.contextMenu ul li:hover {
-	background:#4a90d9; color:#fff;
-}
-.contextMenu ul li:last-child {
-    border:none;
-}
-
-.na {
-    display: none;
-}
-.contextMenu ul li.new {
-    display: block;
-}
-.contextMenu ul li.adding, .contextMenu ul li.adding + li {
-    display: block;
-}
-.contextMenu ul li.force-display {
-    display: block;
-}
-.contextMenu ul li.context-separator {
-    background-color: lightgray;
-    height: 1px;
-    padding: 0;
-}
-
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li.separated {
-    margin-top: 1em;
-}
-
-#crosssection {
-    display: none;
-    position: absolute;
-    top: 200px;
-    left: 600px;
-}
-
-.node circle {
-/*  fill: rgb(31, 119, 180);
-  fill-opacity: .25; */
-  fill: #cfe2f3;
-  fill-opacity: .98;
-  stroke: black;
-  stroke-width: 3px;
-}
-
-.leaf circle {
-  fill: #6fa8dc;
-  fill-opacity: 0.95;
-  stroke-width: 3px;
-}
-
-.leaf circle[title] {
-    font-family: monospace;
-
-}
-
-.tabs-left .nav-tabs {
-	float: left;
-}
-.tabs-left .nav-tabs > li {
-	float: initial;
-}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[05/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrList.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrList.js b/console/stand-alone/plugin/js/qdrList.js
new file mode 100644
index 0000000..7352d82
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrList.js
@@ -0,0 +1,474 @@
+/*
+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.
+*/
+/**
+ * @module QDR
+ */
+var QDR = (function(QDR) {
+
+  /**
+   * @method ListController
+   * @param $scope
+   * @param QDRService
+   *
+   * Controller for the main interface
+   */
+	QDR.module.controller("QDR.ListController", ['$scope', '$location', 'uiGridConstants', 'QDRService', 'QDRChartService', '$uibModal',
+		function ($scope, $location, uiGridConstants, QDRService, QDRChartService, $uibModal) {
+
+		//QDR.log.debug("started List controller");
+		if (!angular.isDefined(QDRService.schema))
+			return;
+		$scope.selectedAction = localStorage['QDRSelectedAction'];
+		$scope.selectedNode = localStorage['QDRSelectedNode'];
+		$scope.selectedNodeId = localStorage['QDRSelectedNodeId'];
+		$scope.selectedRecordName = localStorage['QDRSelectedRecordName'];
+
+		var excludedEntities = ["management", "org.amqp.management", "operationalEntity", "entity", "configurationEntity", "dummy", "console"];
+		var aggregateEntities = ["router.address"];
+
+		$scope.entities = [];
+		for (var entity in QDRService.schema.entityTypes) {
+			if (excludedEntities.indexOf(entity) == -1) {
+				$scope.entities.push( {
+					title: angular.isDefined(QDRService.schema.entityTypes[entity].description) ? QDRService.schema.entityTypes[entity].description : '',
+					humanName: QDRService.humanify(entity),
+					name: entity}
+				 );
+			}
+		}
+		if (!angular.isDefined($scope.selectedAction)) {
+			$scope.selectedAction = $scope.entities[0].name;
+			//QDR.log.debug("defaulted selectedAction to " + $scope.selectedAction);
+		}
+
+		$scope.nodes = QDRService.nodeList().sort(function (a, b) { return a.name.toLowerCase() > b.name.toLowerCase()});
+		if (!angular.isDefined($scope.selectedNode)) {
+			//QDR.log.debug("selectedNode was " + $scope.selectedNode);
+			if ($scope.nodes.length > 0) {
+				$scope.selectedNode = $scope.nodes[0].name;
+				$scope.selectedNodeId = $scope.nodes[0].id;
+				//QDR.log.debug("forcing selectedNode to " + $scope.selectedNode);
+			}
+		}
+
+		$scope.isActionActive = function(name) {
+			//QDR.log.debug("isActionActive(" + name + ")  selectedAction is " + $scope.selectedAction);
+			return $scope.selectedAction === name;
+		};
+		$scope.isNodeSelected = function (id) {
+			return $scope.selectedNodeId === id;
+		};
+
+		$scope.selectNode = function(node) {
+			//QDR.log.debug("setting selectedNode to " + node.name);
+			$scope.selectedNode = node.name;
+			$scope.selectedNodeId = node.id;
+			//QDR.log.debug("location is " + $location.url());
+			$location.search('n', node.name);
+		};
+		$scope.selectAction = function(action) {
+			$scope.selectedAction = action;
+			$location.search('a', action);
+			//QDR.log.debug("selectAction called with " + action + "  location is now " + $location.url());
+		};
+
+		$scope.$watch('selectedAction', function(newValue, oldValue) {
+			if (newValue !== oldValue) {
+				localStorage['QDRSelectedAction'] = $scope.selectedAction;
+				//QDR.log.debug("saving selectedAction as " + $scope.selectedAction + " newValue is " + newValue);
+			}
+		})
+		$scope.$watch('selectedNode', function(newValue, oldValue) {
+		    if (newValue !== oldValue) {
+				localStorage['QDRSelectedNode'] = $scope.selectedNode;
+				localStorage['QDRSelectedNodeId'] = $scope.selectedNodeId;
+				//QDR.log.debug("saving selectedNode as " + $scope.selectedNode + " newValue is " + newValue);
+			}
+		})
+		$scope.$watch('selectedRecordName', function(newValue, oldValue) {
+			if (newValue != oldValue) {
+				localStorage['QDRSelectedRecordName'] = $scope.selectedRecordName;
+				//QDR.log.debug("saving selectedRecordName as " + $scope.selectedRecordName);
+			}
+		})
+
+		$scope.tableRows = [];
+		var selectedRowIndex = 0;
+		var updateTableData = function (entity) {
+			var gotNodeInfo = function (nodeName, dotentity, response) {
+				//QDR.log.debug("got results for  " + nodeName);
+				//console.dump(response);
+
+				var records = response.results;
+				var aggregates = response.aggregates;
+				var attributeNames = response.attributeNames;
+				var nameIndex = attributeNames.indexOf("name");
+				var ent = QDRService.schema.entityTypes[entity];
+				var tableRows = [];
+				for (var i=0; i<records.length; ++i) {
+					var record = records[i];
+					var aggregate = aggregates ? aggregates[i] : undefined;
+					var row = {};
+					var rowName;
+					if (nameIndex > -1) {
+						rowName = record[nameIndex];
+					} else {
+						QDR.log.error("response attributeNames did not contain a name field");
+						console.dump(response.attributeNames);
+						return;
+					}
+					if (rowName == $scope.selectedRecordName)
+						selectedRowIndex = i;
+					for (var j=0; j<attributeNames.length; ++j) {
+						var col = attributeNames[j];
+						row[col] = {value: record[j], type: undefined, graph: false, title: '', aggregate: '', aggregateTip: ''};
+						if (ent) {
+							var att = ent.attributes[col];
+							if (att) {
+								row[col].type = att.type;
+								row[col].graph = att.graph;
+								row[col].title = att.description;
+
+								if (aggregate) {
+									if (att.graph) {
+										row[col].aggregate = att.graph ? aggregate[j].sum : '';
+										var tip = [];
+										aggregate[j].detail.forEach( function (line) {
+											tip.push(line);
+										})
+										row[col].aggregateTip = angular.toJson(tip);
+									}
+								}
+							}
+						}
+					}
+					tableRows.push(row);
+				}
+				setTimeout(selectRow, 0, tableRows);
+			}
+
+			// if this entity should show an aggregate column, send the request to get the info for this entity from all the nedes
+			if (aggregateEntities.indexOf(entity) > -1) {
+				var nodeInfo = QDRService.topology.nodeInfo();
+				QDRService.getMultipleNodeInfo(Object.keys(nodeInfo), entity, [], gotNodeInfo, $scope.selectedNodeId);
+			} else {
+				QDRService.getNodeInfo($scope.selectedNodeId, '.' + entity, [], gotNodeInfo);
+			}
+		};
+
+		// tableRows are the records that were returned, this populates the left hand table on the page
+		var selectRow = function (tableRows) {
+			$scope.tableRows = tableRows;
+			// must apply scope here to update the tableRows before selecting the row
+			$scope.$apply();
+            $scope.gridApi.selection.selectRow($scope.tableRows[selectedRowIndex]);
+			fixTooltips();
+		}
+
+		$scope.getTableHeight = function() {
+	       return {height: ($scope.tableRows.length * 30) + "px"};
+	    };
+	    var titleFromAlt = function (alt) {
+			if (alt && alt.length) {
+				var data = angular.fromJson(alt);
+				var table = "<table class='tiptable'><tbody>";
+				data.forEach (function (row) {
+					table += "<tr>";
+					table += "<td>" + row.node + "</td><td align='right'>" + QDRService.pretty(row.val) + "</td>";
+					table += "</tr>"
+				})
+				table += "</tbody></table>"
+				return table;
+			}
+			return '';
+	    }
+		var fixTooltips = function () {
+			if ($('.hastip').length == 0) {
+				setTimeout(fixTooltips, 100);
+				return;
+			}
+			$('.hastip').each( function (i, tip) {
+				var tipset = tip.getAttribute('tipset')
+				if (!tipset) {
+					$(tip).tipsy({html: true, className: 'subTip', opacity: 1, title: function () {
+						return titleFromAlt(this.getAttribute('alt'))
+					} });
+					tip.setAttribute('tipset', true)
+				} else {
+					var title = titleFromAlt(tip.getAttribute('alt'))
+					tip.setAttribute('original-title', title)
+				}
+/*
+				$(tip).tipsy({html: true, className: 'subTip', opacity: 1, title: function () {
+					var alt = this.getAttribute('alt');
+					if (alt && alt.length) {
+						var data = angular.fromJson(alt);
+						var table = "<table class='tiptable'><tbody>";
+						data.forEach (function (row) {
+							table += "<tr>";
+							table += "<td>" + row.node + "</td><td align='right'>" + QDRService.pretty(row.val) + "</td>";
+							table += "</tr>"
+						})
+						table += "</tbody></table>"
+						return table;
+					}
+					return '';
+				} });
+				*/
+			})
+		}
+		$scope.selectedEntity = undefined;
+		for (var i=0; i<$scope.entities.length; ++i) {
+			if ($scope.selectedAction === $scope.entities[i].name) {
+				$scope.selectedEntity = $scope.entities[i].name;
+				break;
+			}
+		}
+		if (!angular.isDefined($scope.selectedEntity)) {
+			$scope.selectedAction = $scope.entities[0].name;
+			$scope.selectedEntity = $scope.entities[0].name;
+		}
+		var savedCharts = angular.fromJson(localStorage['QDRListCharts']);
+		var getCurrentSavedCharts = function () {
+			if (angular.isDefined(savedCharts)) {
+				if (angular.isDefined(savedCharts[$scope.selectedEntity])) {
+					//graphFields = savedCharts[$scope.selectedEntity];
+				}
+			} else {
+				savedCharts = {};
+			}
+		}
+		getCurrentSavedCharts();
+
+		//QDR.log.debug("using entity of " + $scope.selectedEntity);
+		var stop = undefined;
+
+		// The left-hand table that lists the names
+		var gridCols = [
+			{ field: 'name',
+			  displayName: '',
+			  cellTemplate: '<div class="ngCellText"><span ng-cell-text>{{row.entity.name.value}}</span></div>'
+			}
+		];
+		// the table on the left of the page contains the name field for each record that was returned
+		$scope.gridDef = {
+			data: 'tableRows',
+			hideHeader: true,
+			showHeader: false,
+			enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+			enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+			columnDefs: gridCols,
+			enableColumnResize: true,
+			multiSelect: false,
+			enableRowHeaderSelection: false,
+			noUnselect: true,
+			enableSelectAll: false,
+			enableRowSelection: true,
+			onRegisterApi: function (gridApi) {
+				$scope.gridApi = gridApi;
+				gridApi.selection.on.rowSelectionChanged($scope, function(row) {
+					if (row.isSelected)  {
+						selectedRowIndex = row.rowIndex;
+						$scope.selectedRecordName = row.entity.name.value;
+						var details = [];
+						// for each field in the new row, add a row in the details grid
+						for (var name in row.entity) {
+							details.push( { attributeName: QDRService.humanify(name),
+											attributeValue: QDRService.pretty(row.entity[name].value),
+											type: row.entity[name].type,
+											name: name,
+											rawValue: row.entity[name].value,
+											graph: row.entity[name].graph,
+											title: row.entity[name].title,
+											aggregateValue: QDRService.pretty(row.entity[name].aggregate),
+											aggregateTip: row.entity[name].aggregateTip})
+						}
+						setTimeout(updateDetails, 10, details);
+					}
+				});
+		    }
+		};
+
+		$scope.detailFields = [];
+		updateDetails = function (details) {
+			$scope.detailFields = details;
+			$scope.$apply();
+		}
+
+		$scope.isFieldGraphed = function(rowEntity, aggregate) {
+			var dot = !aggregate ? '.' : '';
+			return QDRChartService.isAttrCharted($scope.selectedNodeId, dot + $scope.selectedEntity, $scope.selectedRecordName, rowEntity.name);
+		}
+
+		$scope.addToGraph = function(rowEntity) {
+			var chart = QDRChartService.registerChart($scope.selectedNodeId, "." + $scope.selectedEntity, $scope.selectedRecordName, rowEntity.name, 1000);
+			doDialog("template-from-script.html", chart);
+			reset();
+		}
+
+		$scope.addAllToGraph = function(rowEntity) {
+			var chart = QDRChartService.registerChart($scope.selectedNodeId,
+						$scope.selectedEntity,
+						$scope.selectedRecordName,
+						rowEntity.name,
+						1000,
+						false,
+						true);
+			doDialog("template-from-script.html", chart);
+			reset();
+		}
+
+		var detailCols = [
+			 {
+				 field: 'attributeName',
+				 cellTemplate: '<div title="{{row.entity.title}}" class="listAttrName">{{row.entity.name}}<i ng-if="row.entity.graph" ng-click="grid.appScope.addToGraph(row.entity)" ng-class="{\'active\': grid.appScope.isFieldGraphed(row.entity, false), \'icon-bar-chart\': row.entity.graph == true }"></i></div>',
+				 displayName: 'Attribute'
+			 },
+			 {
+				 field: 'attributeValue',
+				 displayName: 'Value'
+			 }
+		];
+		if (aggregateEntities.indexOf($scope.selectedEntity) > -1) {
+			detailCols.push(
+			 {
+				 width: '10%',
+				 field: 'aggregateValue',
+				 displayName: 'Aggregate',
+				 cellTemplate: '<div class="hastip" alt="{{row.entity.aggregateTip}}">{{row.entity.aggregateValue}}<i ng-if="row.entity.graph" ng-click="grid.appScope.addAllToGraph(row.entity)" ng-class="{\'active\': grid.appScope.isFieldGraphed(row.entity, true), \'icon-bar-chart\': row.entity.graph == true }"></i></div>',
+				 cellClass: 'aggregate'
+			 }
+			)
+		}
+
+		// the table on the right of the page contains a row for each field in the selected record in the table on the left
+		$scope.details = {
+			data: 'detailFields',
+			columnDefs: detailCols,
+			enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+			enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+			enableColumnResize: true,
+			multiSelect: false,
+			enableRowHeaderSelection: false,
+			noUnselect: true,
+			enableSelectAll: false,
+			enableRowSelection: true
+		};
+
+		updateTableData($scope.selectedEntity);
+		stop = setInterval(updateTableData, 5000, $scope.selectedEntity);
+		$scope.getDetailsTableHeight = function() {
+	       return {height: ($scope.detailFields.length * 30) + "px"};
+	    };
+
+		$scope.$on("$destroy", function( event ) {
+			//QDR.log.debug("scope destroyed for qdrList");
+			reset();
+			if (angular.isDefined(stop)) {
+				clearInterval(stop);
+				stop = undefined;
+			};
+		});
+
+		var reset = function () {
+			if ($scope.context) {
+				$scope.context.stop();
+				$scope.context = null;
+			}
+		};
+
+		function doDialog(template, chart) {
+
+		    var modalInstance = $uibModal.open({
+		      animation: true,
+		      templateUrl: template,
+		      controller: 'QDR.ListChartController',
+		      resolve: {
+		        chart: function () {
+		          return chart;
+		        }
+		      }
+		    });
+		};
+
+	}]);
+
+
+	QDR.module.controller('QDR.ListChartController', function ($scope, $uibModalInstance, $location, QDRChartService, chart) {
+
+	    $scope.chart = chart;
+		$scope.dialogSvgChart = null;
+		$scope.updateTimer = null;
+		$scope.svgDivId = "dialogChart";    // the div id for the svg chart
+
+		$scope.showChartsPage = function () {
+			cleanup();
+		    $uibModalInstance.close();
+			$location.path("/charts");
+		};
+
+		$scope.addChartsPage = function () {
+			QDRChartService.addDashboard($scope.chart);
+		};
+
+		$scope.delChartsPage = function () {
+			QDRChartService.delDashboard($scope.chart);
+		};
+
+		$scope.isOnChartsPage = function () {
+			return $scope.chart.dashboard;
+		}
+
+		var showChart = function () {
+			// the chart divs are generated by angular and aren't available immediately
+			var div = angular.element("#" + $scope.svgDivId);
+			if (!div.width()) {
+				setTimeout(showChart, 100);
+				return;
+			}
+			dialogSvgChart = new QDRChartService.AreaChart($scope.chart, $location.$$path);
+			$scope.dialogSvgChart = dialogSvgChart;
+			updateDialogChart();
+		}
+		showChart();
+
+		var updateDialogChart = function () {
+			if ($scope.dialogSvgChart)
+				$scope.dialogSvgChart.tick($scope.svgDivId);
+			$scope.updateTimer = setTimeout(updateDialogChart, 1000);
+		}
+
+		var cleanup = function () {
+			if ($scope.updateTimer) {
+				clearTimeout($scope.updateTimer);
+				$scope.updateTimer = null;
+			}
+			if (!$scope.chart.dashboard)
+				QDRChartService.unRegisterChart(chart);     // remove the chart
+
+		}
+		$scope.ok = function () {
+			cleanup();
+	        $uibModalInstance.close();
+	    };
+
+	});
+    return QDR;
+
+} (QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrOverview.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrOverview.js b/console/stand-alone/plugin/js/qdrOverview.js
new file mode 100644
index 0000000..d787a5e
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrOverview.js
@@ -0,0 +1,696 @@
+/*
+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.
+*/
+/**
+ * @module QDR
+ */
+/**
+ * @module QDR
+ */
+var QDR = (function (QDR) {
+
+  /**
+   * @method OverviewController
+   * @param $scope
+   * @param QDRService
+   * @param QDRChartServer
+   * dialogServer
+   * $location
+   *
+   * Controller that handles the QDR overview page
+   */
+	QDR.module.controller("QDR.OverviewController", ['$scope', 'uiGridConstants', 'QDRService', function($scope, uiGridConstants, QDRService) {
+
+
+		if (!angular.isDefined(QDRService.schema))
+		    return;
+
+		var nodeIds = QDRService.nodeIdList();
+		var currentTimer;
+		var refreshInterval = 5000
+		var Folder = (function () {
+            function Folder(title) {
+                this.title = title;
+				this.children = [];
+				this.folder = true;
+            }
+            return Folder;
+        })();
+		var Leaf = (function () {
+            function Leaf(title) {
+                this.title = title;
+            }
+            return Leaf;
+        })();
+	    $scope.modes = [
+	    	{title: 'Overview', name: 'Overview', right: false}
+	    	];
+
+		$scope.templates =
+		    [ { name: 'Routers', url: 'routers.html'},
+		      { name: 'Router', url: 'router.html'},
+              { name: 'Addresses', url: 'addresses.html'},
+		      { name: 'Address', url: 'address.html'},
+              { name: 'Connections', url: 'connections.html'},
+		      { name: 'Connection', url: 'connection.html'},
+              { name: 'Logs', url: 'logs.html'},
+              { name: 'Log', url: 'log.html'} ];
+
+		$scope.getGridHeight = function (data) {
+	       // add 1 for the header row
+	       return {height: (($scope[data.data].length + 1) * 30) + "px"};
+		}
+		$scope.overview = new Folder("Overview");
+
+		$scope.allRouterFields = [];
+		var allRouterCols = [
+			 {
+				 field: 'routerId',
+				 displayName: 'Router'
+			 },
+			 {
+				 field: 'area',
+				 displayName: 'Area'
+			 },
+			 {
+				 field: 'mode',
+				 displayName: 'Mode'
+			 },
+			 {
+				 field: 'connections',
+				 displayName: 'External connections'
+			 },
+             {
+                 field: 'addrCount',
+                 displayName: 'Address count'
+             },
+             {
+                 field: 'linkCount',
+                 displayName: 'Link count'
+             }
+		];
+		$scope.allRouters = {
+			data: 'allRouterFields',
+			columnDefs: allRouterCols,
+			enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+			enableColumnResize: true,
+			multiSelect: false,
+			enableRowHeaderSelection: false,
+			noUnselect: true,
+			enableSelectAll: false,
+			enableRowSelection: true,
+			onRegisterApi: function (gridApi) {
+				gridApi.selection.on.rowSelectionChanged($scope, function(row) {
+					if (row.isSelected) {
+						var nodeId = row.entity.nodeId;
+						$("#overtree").fancytree("getTree").activateKey(nodeId);
+					}
+				});
+		    }
+		};
+		// get info for all routers
+		var allRouterInfo = function () {
+			nodeIds = QDRService.nodeIdList()
+			var expected = Object.keys(nodeIds).length
+			var received = 0;
+			var allRouterFields = [];
+			var gotNodeInfo = function (nodeName, entity, response) {
+				var results = response.results;
+				var name = QDRService.nameFromId(nodeName)
+				var connections = 0;
+				results.forEach( function (result) {
+					var role = QDRService.valFor(response.attributeNames, result, "role")
+					if (role != 'inter-router') {
+						++connections
+					}
+				})
+				allRouterFields.push({routerId: name, connections: connections, nodeId: nodeName})
+				++received
+				if (expected == received) {
+					allRouterFields.sort ( function (a,b) { return a.routerId < b.routerId ? -1 : a.routerId > b.routerId ? 1 : 0})
+					// now get each router's node info
+					QDRService.getMultipleNodeInfo(nodeIds, "router", [], function (nodeIds, entity, response) {
+						var results = response.aggregates
+						results.forEach ( function (result) {
+
+							var routerId = QDRService.valFor(response.attributeNames, result, "routerId").sum
+							allRouterFields.some( function (connField) {
+								if (routerId === connField.routerId) {
+									response.attributeNames.forEach ( function (attrName) {
+										connField[attrName] = QDRService.valFor(response.attributeNames, result, attrName).sum
+									})
+									return true
+								}
+								return false
+							})
+						})
+						$scope.allRouterFields = allRouterFields
+						$scope.$apply()
+						if (currentTimer) {
+							clearTimeout(currentTimer)
+						}
+						currentTimer = setTimeout(allRouterInfo, refreshInterval);
+					}, nodeIds[0])
+				}
+			}
+			nodeIds.forEach ( function (nodeId) {
+				QDRService.getNodeInfo(nodeId, ".connection", ["role"], gotNodeInfo)
+			})
+
+		}
+
+		// get info for a single router
+		var routerInfo = function (node) {
+			$scope.router = node
+			$scope.routerFields = []
+			var cols = [
+				 {
+					 field: 'attribute',
+					 displayName: 'Attribute',
+					 width: '40%'
+				 },
+				 {
+					 field: 'value',
+					 displayName: 'Value',
+					 width: '40%'
+				 }
+			]
+			$scope.routerGrid = {
+				data: 'routerFields',
+				columnDefs: cols,
+				enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+	            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+				enableColumnResize: true,
+				multiSelect: false
+			}
+
+			$scope.allRouterFields.some( function (field) {
+				if (field.routerId === node.title) {
+					Object.keys(field).forEach ( function (key) {
+						if (key !== '$$hashKey')
+							$scope.routerFields.push({attribute: key, value: field[key]})
+					})
+					return true
+				}
+			})
+
+			$scope.$apply()
+			if (currentTimer) {
+				clearTimeout(currentTimer)
+				currentTimer = null
+			}
+		}
+
+		// get info for a all addresses
+		var allAddressInfo = function () {
+			$scope.addressFields = []
+			var addressCols = [
+				 {
+					 field: 'address',
+					 displayName: 'address'
+				 },
+				 {
+					 field: 'class',
+					 displayName: 'class'
+				 },
+				 {
+					 field: 'phase',
+					 displayName: 'phase',
+					 cellClass: 'grid-align-value'
+				 },
+				 {
+					 field: 'inproc',
+					 displayName: 'in-proc'
+				 },
+				 {
+					 field: 'local',
+					 displayName: 'local',
+					 cellClass: 'grid-align-value'
+				 },
+				 {
+					 field: 'remote',
+					 displayName: 'remote',
+					 cellClass: 'grid-align-value'
+				 },
+				 {
+					 field: 'in',
+					 displayName: 'in',
+					 cellClass: 'grid-align-value'
+				 },
+				 {
+					 field: 'out',
+					 displayName: 'out',
+					 cellClass: 'grid-align-value'
+				 }
+			]
+			$scope.selectedAddresses = []
+			$scope.addressGrid = {
+				data: 'addressFields',
+				columnDefs: addressCols,
+				enableColumnResize: true,
+				enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+	            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+				multiSelect: false,
+				enableRowHeaderSelection: false,
+				noUnselect: true,
+				enableSelectAll: false,
+				enableRowSelection: true,
+				onRegisterApi: function (gridApi) {
+					gridApi.selection.on.rowSelectionChanged($scope, function(row) {
+						if (row.isSelected) {
+							var key = row.entity.uid;
+							$("#overtree").fancytree("getTree").activateKey(key);
+						}
+					});
+			    }
+			}
+
+			var gotAllAddressFields = function ( addressFields ) {
+				$scope.addressFields = 	addressFields
+				$scope.$apply()
+				if (currentTimer) {
+					clearTimeout(currentTimer)
+				}
+				currentTimer = setTimeout(allAddressInfo, refreshInterval);
+			}
+			getAllAddressFields(gotAllAddressFields)
+		}
+
+		var getAllAddressFields = function (callback) {
+			var addr_class = function (addr) {
+				if (!addr) return "-"
+		        if (addr[0] == 'M')  return "mobile"
+		        if (addr[0] == 'R')  return "router"
+		        if (addr[0] == 'A')  return "area"
+		        if (addr[0] == 'L')  return "local"
+		        if (addr[0] == 'C')  return "link-incoming"
+		        if (addr[0] == 'D')  return "link-outgoing"
+		        return "unknown: " + addr[0]
+			}
+
+			var addr_text = function (addr) {
+		        if (!addr)
+		            return "-"
+		        if (addr[0] == 'M')
+		            return addr.substring(2)
+		        else
+		            return addr.substring(1)
+			}
+
+			var addr_phase = function (addr) {
+		        if (!addr)
+		            return "-"
+		        if (addr[0] == 'M')
+		            return addr[1]
+		        return ''
+			}
+
+			var identity_clean = function (identity) {
+		        if (!identity)
+		            return "-"
+		        var pos = identity.indexOf('/')
+		        if (pos >= 0)
+		            return identity.substring(pos + 1)
+		        return identity
+			}
+
+			var addressFields = []
+			nodeIds = QDRService.nodeIdList()
+			QDRService.getMultipleNodeInfo(nodeIds, "router.address", [], function (nodeIds, entity, response) {
+				response.aggregates.forEach( function (result) {
+					var prettySum = function (field) {
+						var fieldIndex = response.attributeNames.indexOf(field)
+						if (fieldIndex < 0) {
+							return "-"
+						}
+						var val = result[fieldIndex].sum
+						return QDRService.pretty(val)
+					}
+
+					var uid = QDRService.valFor(response.attributeNames, result, "identity").sum
+					var identity = identity_clean(uid)
+
+					addressFields.push({
+						address: addr_text(identity),
+						'class': addr_class(identity),
+						phase:   addr_phase(identity),
+						inproc:  prettySum("inProcess"),
+						local:   prettySum("subscriberCount"),
+						remote:  prettySum("remoteCount"),
+						'in':    prettySum("deliveriesIngress"),
+						out:     prettySum("deliveriesEgress"),
+						thru:    prettySum("deliveriesTransit"),
+						toproc:  prettySum("deliveriesToContainer"),
+						fromproc:prettySum("deliveriesFromContainer"),
+						uid:     uid
+					})
+				})
+				callback(addressFields)
+			}, nodeIds[0])
+		}
+
+
+		// get info for a all connections
+		var allConnectionInfo = function () {
+			$scope.allConnectionFields = []
+			var allConnectionCols = [
+				 {
+					 field: 'host',
+					 displayName: 'host'
+				 },
+				 {
+					 field: 'container',
+					 displayName: 'container'
+				 },
+				 {
+					 field: 'role',
+					 displayName: 'role'
+				 },
+				 {
+					 field: 'dir',
+					 displayName: 'dir'
+				 },
+				 {
+					 field: 'security',
+					 displayName: 'security'
+				 },
+				 {
+					 field: 'authentication',
+					 displayName: 'authentication'
+				 }
+			]
+			$scope.allConnectionGrid = {
+				data: 'allConnectionFields',
+				columnDefs: allConnectionCols,
+				enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+	            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+				enableColumnResize: true,
+				multiSelect: false,
+				enableRowHeaderSelection: false,
+				noUnselect: true,
+				enableSelectAll: false,
+				enableRowSelection: true,
+				onRegisterApi: function (gridApi) {
+					gridApi.selection.on.rowSelectionChanged($scope, function(row) {
+						if (row.isSelected) {
+							var host = row.entity.host;
+							$("#overtree").fancytree("getTree").activateKey(host);
+						}
+					});
+			    }
+			}
+			connections.children.forEach( function (connection) {
+				$scope.allConnectionFields.push(connection.fields)
+			})
+			$scope.$apply()
+			if (currentTimer) {
+				clearTimeout(currentTimer)
+				currentTimer = null
+			}
+		}
+
+		// get info for a single address
+		var addressInfo = function (address) {
+			$scope.address = address
+			$scope.addressFields = []
+			var cols = [
+				 {
+					 field: 'attribute',
+					 displayName: 'Attribute',
+					 width: '40%'
+				 },
+				 {
+					 field: 'value',
+					 displayName: 'Value',
+					 width: '40%'
+				 }
+			]
+			$scope.addressGrid = {
+				data: 'addressFields',
+				columnDefs: cols,
+				enableColumnResize: true,
+				enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+	            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+				multiSelect: false
+			}
+
+			var fields = Object.keys(address.data.fields)
+			fields.forEach( function (field) {
+				if (field != "title" && field != "uid")
+					$scope.addressFields.push({attribute: field, value: address.data.fields[field]})
+			})
+
+			$scope.$apply()
+			if (currentTimer) {
+				clearTimeout(currentTimer)
+				currentTimer = null
+			}
+		}
+
+		// get info for a single connection
+		var connectionInfo = function (connection) {
+			$scope.connection = connection
+			$scope.connectionFields = []
+			var cols = [
+				 {
+					 field: 'attribute',
+					 displayName: 'Attribute',
+					 width: '40%'
+				 },
+				 {
+					 field: 'value',
+					 displayName: 'Value',
+					 width: '40%'
+				 }
+			]
+			$scope.connectionGrid = {
+				data: 'connectionFields',
+				columnDefs: cols,
+				enableColumnResize: true,
+				enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+	            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+				multiSelect: false
+			}
+
+			var fields = Object.keys(connection.data.fields)
+			fields.forEach( function (field) {
+				$scope.connectionFields.push({attribute: field, value: connection.data.fields[field]})
+			})
+
+			$scope.$apply()
+			if (currentTimer) {
+				clearTimeout(currentTimer)
+				currentTimer = null
+			}
+		}
+
+		// get info for a all logs
+		var allLogInfo = function () {
+		}
+
+		// get info for a single log
+		var logInfo = function (node) {
+			$scope.log = node
+		}
+
+		var activated = function (event, node) {
+			//QDR.log.debug("node activated: " + node.data.title)
+			node = node.node;
+			var type = node.data.type;
+			var template = $scope.templates.filter( function (tpl) {
+				return tpl.name == type;
+			})
+			$scope.template = template[0];
+			// Call the function associated with this type passing in the node that was selected
+			// In dynatree I could save the function to call in the node, but not in FancyTree
+			if (treeTypeMap[type])
+				treeTypeMap[type](node);
+
+			/*if (node.data.info)
+				node.data.info(node)
+			*/
+			$scope.$apply();
+		}
+        $scope.template = $scope.templates[0];
+
+		var routers = new Folder("Routers")
+		routers.type = "Routers"
+		//routers.info = allRouterInfo
+		routers.focus = true
+		routers.expanded = true
+		routers.key = "Routers"
+		$scope.overview.children.push(routers)
+		nodeIds.forEach( function (node) {
+			var name = QDRService.nameFromId(node)
+			var router = new Leaf(name)
+			router.type = "Router"
+			//router.info = routerInfo
+			router.nodeId = node
+			router.key = node
+			routers.children.push(router)
+		})
+
+		var expected = nodeIds.length;
+		var addresses = new Folder("Addresses")
+		addresses.type = "Addresses"
+		//addresses.info = allAddressInfo
+		addresses.key = "Addresses"
+		$scope.overview.children.push(addresses)
+
+		var gotAddressFields = function (addressFields) {
+			addressFields.sort ( function (a,b) { return a.address < b.address ? -1 : a.address > b.address ? 1 : 0})
+			addressFields[0].title = addressFields[0].address
+			for (var i=1; i<addressFields.length; ++i) {
+				if (addressFields[i].address === addressFields[i-1].address) {
+					addressFields[i-1].title = addressFields[i-1].address + " (" + addressFields[i-1]['class'] + ")"
+					addressFields[i].title = addressFields[i].address + " (" + addressFields[i]['class'] + ")"
+				} else
+					addressFields[i].title = addressFields[i].address
+			}
+			addressFields.forEach( function (address) {
+				var a = new Leaf(address.title)
+				//a.info = addressInfo
+				a.key = address.uid
+				a.fields = address
+				a.type = "Address"
+				addresses.children.push(a)
+			} )
+		}
+		getAllAddressFields(gotAddressFields)
+
+
+		var connreceived = 0;
+		var connectionsObj = {}
+		var connections = new Folder("Connections")
+		connections.type = "Connections"
+		//connections.info = allConnectionInfo
+		connections.key = "Connections"
+		$scope.overview.children.push(connections)
+		nodeIds.forEach( function (nodeId) {
+
+			QDRService.getNodeInfo(nodeId, ".connection", [], function (nodeName, entity, response) {
+				response.results.forEach( function (result) {
+
+					var auth = "no_auth"
+					var sasl = QDRService.valFor(response.attributeNames, result, "sasl")
+					if (QDRService.valFor(response.attributeNames, result, "isAuthenticated")) {
+						auth = sasl
+						if (sasl === "ANONYMOUS")
+							auth = "anonymous-user"
+						else {
+							if (sasl === "GSSAPI")
+								sasl = "Kerberos"
+							if (sasl === "EXTERNAL")
+								sasl = "x.509"
+							auth = QDRService.valFor(response.attributeNames, result, "user") + "(" +
+									QDRService.valFor(response.attributeNames, result, "sslCipher") + ")"
+							}
+					}
+
+					var sec = "no-security"
+					if (QDRService.valFor(response.attributeNames, result, "isEncrypted")) {
+						if (sasl === "GSSAPI")
+							sec = "Kerberos"
+						else
+							sec = QDRService.valFor(response.attributeNames, result, "sslProto") + "(" +
+									QDRService.valFor(response.attributeNames, result, "sslCipher") + ")"
+					}
+
+					var host = QDRService.valFor(response.attributeNames, result, "host")
+					connectionsObj[host] = {}
+					response.attributeNames.forEach( function (attribute, i) {
+						connectionsObj[host][attribute] = result[i]
+					})
+					connectionsObj[host].security = sec
+					connectionsObj[host].authentication = auth
+				})
+				++connreceived;
+				if (connreceived == expected) {
+					var allConnections = Object.keys(connectionsObj).sort()
+					allConnections.forEach(function (connection) {
+						var c = new Leaf(connection)
+						c.type = "Connection"
+						c.icon = "ui-icon "
+						c.icon += connectionsObj[connection].role === "inter-router" ? "ui-icon-refresh" : "ui-icon-transfer-e-w"
+						//c.info = connectionInfo
+						c.key = connection
+						c.fields = connectionsObj[connection]
+						c.tooltip = connectionsObj[connection].role === "inter-router" ? "inter-router connection" : "external connection"
+						connections.children.push(c)
+					})
+				}
+			})
+		})
+
+		var logsreceived = 0;
+		var logObj = {}
+		var logs = new Folder("Logs")
+		logs.type = "Logs"
+		//logs.info = allLogInfo
+		logs.key = "Logs"
+		//$scope.overview.children.push(logs)
+		nodeIds.forEach( function (nodeId) {
+			QDRService.getNodeInfo(nodeId, ".log", ["name"], function (nodeName, entity, response) {
+				response.results.forEach( function (result) {
+					logObj[result[0]] = 1    // use object to collapse duplicates
+				})
+				++logsreceived;
+				if (logsreceived == expected) {
+					var allLogs = Object.keys(logObj).sort()
+					allLogs.forEach(function (log) {
+						var l = new Leaf(log)
+						l.type = "Log"
+						//l.info = logInfo
+						l.key = log
+						logs.children.push(l)
+					})
+					//console.log("---------------")
+					//console.dump($scope.overview.children)
+					//console.log("---------------")
+					$("#overtree").fancytree({
+						activate: activated,
+						clickFolderMode: 1,
+						source: $scope.overview.children
+						})
+					allRouterInfo();
+				}
+			})
+		})
+
+        $scope.$on("$destroy", function( event ) {
+			if (currentTimer) {
+				clearTimeout(currentTimer)
+				currentTimer = null;
+			}
+        });
+		var treeTypeMap = {
+			Routers:     allRouterInfo,
+			Router:      routerInfo,
+			Addresses:   allAddressInfo,
+			Address:     addressInfo,
+			Connections: allConnectionInfo,
+			Connection:  connectionInfo
+		}
+
+    }]);
+
+  return QDR;
+
+}(QDR || {}));
+

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrPlugin.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrPlugin.js b/console/stand-alone/plugin/js/qdrPlugin.js
new file mode 100644
index 0000000..3d14f72
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrPlugin.js
@@ -0,0 +1,197 @@
+/*
+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.
+*/
+/**
+ * @module QDR
+ * @main QDR
+ *
+ * The main entrypoint for the QDR module
+ *
+ */
+var QDR = (function(QDR) {
+
+  /**
+   * @property pluginName
+   * @type {string}
+   *
+   * The name of this plugin
+   */
+  QDR.pluginName = "QDR";
+
+  /**
+   * @property log
+   * @type {Logging.Logger}
+   *
+   * This plugin's logger instance
+   */
+  //HIO QDR.log = Logger.get(QDR.pluginName);
+  /**
+   * @property templatePath
+   * @type {string}
+   *
+   * The top level path to this plugin's partials
+   */
+  QDR.srcBase = "../dispatch/plugin/";
+  QDR.templatePath = QDR.srcBase + "html/";
+  QDR.cssPath = QDR.srcBase + "css/";
+
+  /**
+   * @property SETTINGS_KEY
+   * @type {string}
+   *
+   * The key used to fetch our settings from local storage
+   */
+  QDR.SETTINGS_KEY = 'QDRSettings';
+  QDR.LAST_LOCATION = "QDRLastLocation";
+
+  /**
+   * @property module
+   * @type {object}
+   *
+   * This plugin's angularjs module instance
+   */
+  QDR.module = angular.module(QDR.pluginName, ['ngAnimate', 'ngResource', 'ngRoute', 'ui.grid', 'ui.grid.selection',
+    'ui.grid.autoResize', 'jsonFormatter', 'ui.bootstrap', 'ui.slider'/*, 'minicolors' */]);
+
+  // set up the routing for this plugin
+  QDR.module.config(function($routeProvider) {
+    $routeProvider
+      .when('/', {
+        templateUrl: QDR.templatePath + 'qdrConnect.html'
+        })
+      .when('/overview', {
+          templateUrl: QDR.templatePath + 'qdrOverview.html'
+        })
+      .when('/topology', {
+          templateUrl: QDR.templatePath + 'qdrTopology.html'
+        })
+      .when('/list', {
+          templateUrl: QDR.templatePath + 'qdrList.html'
+        })
+      .when('/schema', {
+          templateUrl: QDR.templatePath + 'qdrSchema.html'
+        })
+      .when('/charts', {
+          templateUrl: QDR.templatePath + 'qdrCharts.html'
+        })
+      .when('/connect', {
+          templateUrl: QDR.templatePath + 'qdrConnect.html'
+        })
+  });
+
+  QDR.module.config(['$compileProvider', function ($compileProvider) {
+	var cur = $compileProvider.aHrefSanitizationWhitelist();
+    $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|blob):/);
+	cur = $compileProvider.aHrefSanitizationWhitelist();
+  }]);
+
+	QDR.module.config(function (JSONFormatterConfigProvider) {
+		// Enable the hover preview feature
+        JSONFormatterConfigProvider.hoverPreviewEnabled = true;
+	});
+
+	QDR.module.filter('to_trusted', ['$sce', function($sce){
+          return function(text) {
+              return $sce.trustAsHtml(text);
+          };
+    }]);
+
+	QDR.module.filter('humanify', function (QDRService) {
+		return function (input) {
+			return QDRService.humanify(input);
+		};
+	});
+
+	QDR.logger = function ($log) {
+		var log = $log;
+
+		this.debug = function (msg) { msg = "QDR: " + msg; log.debug(msg)};
+		this.error = function (msg) {msg = "QDR: " + msg; log.error(msg)}
+		this.info = function (msg) {msg = "QDR: " + msg; log.info(msg)}
+		this.warn = function (msg) {msg = "QDR: " + msg; log.warn(msg)}
+
+		return this;
+	}
+    // one-time initialization happens in the run function
+    // of our module
+	QDR.module.run( ["$rootScope", "$location", "$log", "QDRService", "QDRChartService",  function ($rootScope, $location, $log, QDRService, QDRChartService) {
+		QDR.log = new QDR.logger($log);
+		QDR.log.debug("QDR.module.run()")
+
+		QDRService.initProton();
+		var settings = angular.fromJson(localStorage[QDR.SETTINGS_KEY]);
+		var lastLocation = localStorage[QDR.LAST_LOCATION];
+		if (!angular.isDefined(lastLocation))
+			lastLocation = "/overview";
+
+		QDRService.addConnectAction(function() {
+			QDRChartService.init(); // initialize charting service after we are connected
+		});
+		if (settings && settings.autostart) {
+			QDRService.addConnectAction(function() {
+				$location.path(lastLocation);
+				$location.replace();
+				$rootScope.$apply();
+			});
+			QDRService.connect(settings);
+        } else {
+			setTimeout(function () {
+	            $location.url('/connect')
+				$location.replace();
+			}, 100)
+        }
+
+        $rootScope.$on('$routeChangeSuccess', function() {
+            localStorage[QDR.LAST_LOCATION] = $location.$$path;
+        });
+
+
+	}]);
+
+	QDR.module.controller ("QDR.MainController", ['$scope', '$location', function ($scope, $location) {
+		QDR.log.debug("started QDR.MainController with location.url: " + $location.url());
+		QDR.log.debug("started QDR.MainController with window.location.pathname : " + window.location.pathname);
+		$scope.topLevelTabs = [];
+		$scope.topLevelTabs.push({
+			id: "qdr",
+			content: "Qpid Dispatch Router Console",
+			title: "Dispatch Router Console",
+			isValid: function() { return true; },
+			href: function() { return "#connect"; },
+			isActive: function() { return true; }
+		});
+	}])
+
+	QDR.module.controller ("QDR.Core", function ($scope, $rootScope) {
+		$scope.alerts = [];
+		$scope.closeAlert = function(index) {
+            $scope.alerts.splice(index, 1);
+        };
+		$scope.$on('newAlert', function(event, data) {
+			$scope.alerts.push(data);
+			$scope.$apply();
+		});
+		$scope.$on("clearAlerts", function () {
+			$scope.alerts = [];
+			$scope.$apply();
+		})
+
+	})
+
+  return QDR;
+}(QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrSchema.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrSchema.js b/console/stand-alone/plugin/js/qdrSchema.js
new file mode 100644
index 0000000..0e94351
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrSchema.js
@@ -0,0 +1,31 @@
+/*
+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.
+*/
+/**
+ * @module QDR
+ */
+var QDR = (function (QDR) {
+
+    QDR.module.controller("QDR.SchemaController", ['$scope', 'QDRService', function($scope, QDRService) {
+
+        $scope.schema = QDRService.schema;
+
+    }]);
+
+    return QDR;
+}(QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrService.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrService.js b/console/stand-alone/plugin/js/qdrService.js
new file mode 100644
index 0000000..47029d7
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrService.js
@@ -0,0 +1,742 @@
+/*
+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.
+*/
+/**
+ * @module QDR
+ */
+var QDR = (function(QDR) {
+
+  // The QDR service handles the connection to
+  // the server in the background
+  QDR.module.factory("QDRService", ['$rootScope', '$http', '$resource', '$location', function($rootScope, $http, $resource, $location) {
+    var self = {
+
+	  rhea: require("rhea"),
+
+      timeout: 10,
+      connectActions: [],
+      disconnectActions: [],
+      updatedActions: {},
+      stop: undefined,  // update interval handle
+
+      addConnectAction: function(action) {
+        if (angular.isFunction(action)) {
+          self.connectActions.push(action);
+        }
+      },
+      addDisconnectAction: function(action) {
+        if (angular.isFunction(action)) {
+          self.disconnectActions.push(action);
+        }
+      },
+      addUpdatedAction: function(key, action) {
+        if (angular.isFunction(action)) {
+            self.updatedActions[key] = action;
+        }
+      },
+      delUpdatedAction: function(key) {
+        if (key in self.updatedActions)
+            delete self.updatedActions[key];
+      },
+
+      executeConnectActions: function() {
+        self.connectActions.forEach(function(action) {
+          //QDR.log.debug("executing connect action " + action);
+          action.apply();
+        });
+        self.connectActions = [];
+      },
+      executeDisconnectActions: function() {
+        self.disconnectActions.forEach(function(action) {
+          action.apply();
+        });
+        self.disconnectActions = [];
+      },
+      executeUpdatedActions: function() {
+        for (action in self.updatedActions) {
+            self.updatedActions[action].apply();
+        }
+      },
+
+      notifyTopologyDone: function() {
+        //QDR.log.debug("got Toplogy done notice");
+
+        if (!angular.isDefined(self.schema))
+            return;
+        else if (self.topology._gettingTopo)
+            return;
+        if (!self.gotTopology) {
+            QDR.log.debug("topology was just initialized");
+            self.gotTopology = true;
+            self.executeConnectActions();
+            $rootScope.$apply();
+        } else {
+            QDR.log.debug("topology model was just updated");
+            self.executeUpdatedActions();
+        }
+
+      },
+      /**
+       * @property options
+       * Holds a reference to the connection options when
+       * a connection is started
+       */
+      options: undefined,
+
+      /*
+       * @property message
+       * The proton message that is used to send commands
+       * and receive responses
+       */
+		sender: undefined,
+		receiver: undefined,
+		sendable: false,
+
+      schema: undefined,
+
+      toAddress: undefined,
+      connected: false,
+      gotTopology: false,
+      errorText: undefined,
+	  connectionError: undefined,
+
+      isConnected: function() {
+        return self.gotTopology;
+      },
+
+    correlator: {
+        _objects: {},
+        _corremationID: 0,
+
+        corr: function () {
+            var id = ++this._corremationID + "";
+			this._objects[id] = {resolver: null}
+            return id;
+        },
+        request: function() {
+            //QDR.log.debug("correlator:request");
+            return this;
+        },
+        then: function(id, resolver, error) {
+            //QDR.log.debug("registered then resolver for correlationID: " + id);
+			if (error) {
+	            delete this._objects[id];
+				return;
+			}
+            this._objects[id].resolver = resolver;
+        },
+        // called by receiver's on('message') handler when a response arrives
+        resolve: function(context) {
+			var correlationID = context.message.properties.correlation_id;
+            this._objects[correlationID].resolver(context.message.body);
+            delete this._objects[correlationID];
+        }
+    },
+    
+    onSubscription: function() {
+        self.getSchema();
+        self.topology.get();
+     },
+
+    startUpdating: function () {
+        QDR.log.info("startUpdating called")
+        self.stopUpdating();
+        self.topology.get();
+        self.stop = setInterval(function() {
+            self.topology.get();
+        }, 2000);
+    },
+    stopUpdating: function () {
+        if (angular.isDefined(self.stop)) {
+            QDR.log.info("stoptUpdating called")
+            clearInterval(self.stop);
+            self.stop = undefined;
+        }
+    },
+
+      initProton: function() {
+        //QDR.log.debug("*************QDR init proton called ************");
+      },
+      cleanUp: function() {
+      },
+      error: function(line) {
+        if (line.num) {
+          QDR.log.debug("error - num: ", line.num, " message: ", line.message);
+        } else {
+          QDR.log.debug("error - message: ", line.message);
+        }
+      },
+      disconnected: function(line) {
+        QDR.log.debug("Disconnected from QDR server");
+        self.executeDisconnectActions();
+      },
+
+      nameFromId: function (id) {
+		return id.split('/')[3];
+      },
+
+      humanify: function (s) {
+          var t = s.charAt(0).toUpperCase() + s.substr(1).replace(/[A-Z]/g, ' $&');
+          return t.replace(".", " ");
+      },
+	  pretty: function(v) {
+    	var formatComma = d3.format(",");
+		if (!isNaN(parseFloat(v)) && isFinite(v))
+			return formatComma(v);
+		return v;
+	  },
+
+      nodeNameList: function() {
+        var nl = [];
+        // if we are in the middel of updating the topology
+        // then use the last known node info
+        var ni = self.topology._nodeInfo;
+        if (self.topology._gettingTopo)
+            ni = self.topology._lastNodeInfo;
+		for (var id in ni) {
+            nl.push(self.nameFromId(id));
+        }
+        return nl.sort();
+      },
+
+      nodeIdList: function() {
+        var nl = [];
+        // if we are in the middel of updating the topology
+        // then use the last known node info
+        var ni = self.topology._nodeInfo;
+        if (self.topology._gettingTopo)
+            ni = self.topology._lastNodeInfo;
+		for (var id in ni) {
+            nl.push(id);
+        }
+        return nl.sort();
+      },
+
+      nodeList: function () {
+        var nl = [];
+        var ni = self.topology._nodeInfo;
+        if (self.topology._gettingTopo)
+            ni = self.topology._lastNodeInfo;
+		for (var id in ni) {
+            nl.push({name: self.nameFromId(id), id: id});
+        }
+        return nl;
+      },
+
+      // given an attribute name array, find the value at the same index in the values array
+      valFor: function (aAr, vAr, key) {
+          var idx = aAr.indexOf(key);
+          if ((idx > -1) && (idx < vAr.length)) {
+              return vAr[idx];
+          }
+          return null;
+      },
+
+      /*
+       * send the management messages that build up the topology
+       *
+       *
+       */
+      topology: {
+        _gettingTopo: false,
+        _nodeInfo: {},
+        _lastNodeInfo: {},
+        _expected: {},
+        _timerHandle: null,
+
+        nodeInfo: function () {
+            return this._gettingTopo ? this._lastNodeInfo : this._nodeInfo;
+        },
+
+        get: function () {
+            if (this._gettingTopo)
+                return;
+            if (!self.connected) {
+				QDR.log.debug("topology get failed because !self.connected")
+                return;
+            }
+            this._lastNodeInfo = angular.copy(this._nodeInfo);
+            this._gettingTopo = true;
+
+            self.errorText = undefined;
+            this.cleanUp(this._nodeInfo);
+            this._nodeInfo = {};
+            this._expected = {};
+
+            // get the list of nodes to query.
+            // once this completes, we will get the info for each node returned
+            self.getRemoteNodeInfo( function (response) {
+                //QDR.log.debug("got remote node list of ");
+                //console.dump(response);
+                if( Object.prototype.toString.call( response ) === '[object Array]' ) {
+                    // we expect a response for each of these nodes
+                    self.topology.wait(self.timeout);
+                    for (var i=0; i<response.length; ++i) {
+                        self.makeMgmtCalls(response[i]);
+                    }
+                };
+            });
+        },
+
+        cleanUp: function (obj) {
+/*
+            for (var o in obj) {
+                QDR.log.debug("cleaning up");
+                console.dump(obj[o]);
+                if (isNaN(parseInt(o)))
+                    this.cleanUp(obj[o]);
+            }
+*/
+            if (obj)
+                delete obj;
+        },
+        wait: function (timeout) {
+            this.timerHandle = setTimeout(this.timedOut, timeout * 1000);
+         },
+        timedOut: function () {
+        // a node dropped out. this happens when the get-mgmt-nodex
+        // results contains more nodes than actually respond within
+        // the timeout. However, if the responses we get don't contain
+        // the missing node, assume we are done.
+            QDR.log.debug("timed out waiting for management responses");
+            // note: can't use 'this' in a timeout handler
+            self.topology.dump("state at timeout");
+            // check if _nodeInfo is consistent
+            if (self.topology.isConsistent()) {
+                //TODO: notify controllers which node was dropped
+                // so they can keep an event log
+                self.topology.ondone();
+                return;
+            }
+            self.topology.onerror(Error("Timed out waiting for management responses"));
+        },
+        isConsistent: function () {
+            // see if the responses we have so far reference any nodes
+            // for which we don't have a response
+            var gotKeys = {};
+            for (var id in this._nodeInfo) {
+                var onode = this._nodeInfo[id];
+                var conn = onode['.connection'];
+                // get list of node names in the connection data
+                if (conn) {
+                    var containerIndex = conn.attributeNames.indexOf('container');
+                    var connectionResults = conn.results;
+                    if (containerIndex >= 0)
+                        for (var j=0; j < connectionResults.length; ++j) {
+                            // inter-router connection to a valid dispatch connection name
+                            gotKeys[connectionResults[j][containerIndex]] = ""; // just add the key
+                        }
+                }
+            }
+            // gotKeys now contains all the container names that we have received
+            // Are any of the keys that are still expected in the gotKeys list?
+            var keys = Object.keys(gotKeys);
+            for (var id in this._expected) {
+                var key = self.nameFromId(id);
+                if (key in keys)
+                    return false;
+            }
+            return true;
+        },
+            
+        addNodeInfo: function (id, entity, values) {
+            // save the results in the nodeInfo object
+            if (id) {
+                if (!(id in self.topology._nodeInfo)) {
+                    self.topology._nodeInfo[id] = {};
+                }
+                self.topology._nodeInfo[id][entity] = values;
+            }
+  
+            // remove the id / entity from _expected
+            if (id in self.topology._expected) {
+                var entities = self.topology._expected[id];
+                var idx = entities.indexOf(entity);
+                if (idx > -1) {
+                    entities.splice(idx, 1);
+                    if (entities.length == 0)
+                        delete self.topology._expected[id];
+                }
+            }
+            // see if the expected obj is empty
+            if (Object.getOwnPropertyNames(self.topology._expected).length == 0)
+                self.topology.ondone();
+            self.topology.cleanUp(values);
+        },
+        expect: function (id, key) {
+            if (!key || !id)
+                return;
+            if (!(id in this._expected))
+                this._expected[id] = [];
+            if (this._expected[id].indexOf(key) == -1)
+                this._expected[id].push(key);
+        },
+/*
+The response looks like:
+{
+    ".router": {
+        "results": [
+            [4, "router/QDR.X", 1, "0", 3, 60, 60, 11, "QDR.X", 30, "interior", "org.apache.qpid.dispatch.router", 5, 12, "router/QDR.X"]
+        ],
+        "attributeNames": ["raIntervalFlux", "name", "helloInterval", "area", "helloMaxAge", "mobileAddrMaxAge", "remoteLsMaxAge", "addrCount", "routerId", "raInterval", "mode", "type", "nodeCount", "linkCount", "identity"]
+    },
+    ".connection": {
+        "results": [
+            ["QDR.B", "connection/0.0.0.0:20002", "operational", "0.0.0.0:20002", "inter-router", "connection/0.0.0.0:20002", "ANONYMOUS", "org.apache.qpid.dispatch.connection", "out"],
+            ["QDR.A", "connection/0.0.0.0:20001", "operational", "0.0.0.0:20001", "inter-router", "connection/0.0.0.0:20001", "ANONYMOUS", "org.apache.qpid.dispatch.connection", "out"],
+            ["b2de2f8c-ef4a-4415-9a23-000c2f86e85d", "connection/localhost:33669", "operational", "localhost:33669", "normal", "connection/localhost:33669", "ANONYMOUS", "org.apache.qpid.dispatch.connection", "in"]
+        ],
+        "attributeNames": ["container", "name", "state", "host", "role", "identity", "sasl", "type", "dir"]
+    },
+    ".router.node": {
+        "results": [
+            ["QDR.A", null],
+            ["QDR.B", null],
+            ["QDR.C", "QDR.A"],
+            ["QDR.D", "QDR.A"],
+            ["QDR.Y", "QDR.A"]
+        ],
+        "attributeNames": ["routerId", "nextHop"]
+    }
+}*/
+        ondone: function () {
+            clearTimeout(this.timerHandle);
+            this._gettingTopo = false;
+            //this.miniDump();
+            //this.dump();
+            self.notifyTopologyDone();
+
+         },
+         dump: function (prefix) {
+            if (prefix)
+                QDR.log.debug(prefix);
+            QDR.log.debug("---");
+            for (var key in this._nodeInfo) {
+                QDR.log.debug(key);
+                console.dump(this._nodeInfo[key]);
+                QDR.log.debug("---");
+            }
+            QDR.log.debug("was still expecting:");
+            console.dump(this._expected);
+        },
+         miniDump: function (prefix) {
+            if (prefix)
+                QDR.log.debug(prefix);
+            QDR.log.debug("---");
+            console.dump(Object.keys(this._nodeInfo));
+            QDR.log.debug("---");
+        },
+        onerror: function (err) {
+            this._gettingTopo = false;
+            QDR.log.debug("Err:" + err);
+            self.executeDisconnectActions();
+
+        }
+
+      },
+
+      getRemoteNodeInfo: function (callback) {
+	 	//QDR.log.debug("getRemoteNodeInfo called");
+        var ret;
+        // first get the list of remote node names
+	 	self.correlator.request(
+                ret = self.sendMgmtQuery('GET-MGMT-NODES')
+            ).then(ret.id, function(response) {
+                callback(response);
+                self.topology.cleanUp(response);
+            }, ret.error);
+      },
+
+      makeMgmtCalls: function (id) {
+            var keys = [".router", ".connection", ".container", ".router.node", ".listener", ".router.link"];
+            $.each(keys, function (i, key) {
+                self.topology.expect(id, key);
+                self.getNodeInfo(id, key, [], self.topology.addNodeInfo);
+            });
+      },
+
+      getNodeInfo: function (nodeName, entity, attrs, callback) {
+        //QDR.log.debug("getNodeInfo called with nodeName: " + nodeName + " and entity " + entity);
+        var ret;
+        self.correlator.request(
+            ret = self.sendQuery(nodeName, entity, attrs)
+        ).then(ret.id, function(response) {
+            // TODO: file a bug against rhea - large numbers are coming back as Uint8Array
+			response.results.forEach( function (result) {
+				result.forEach( function (val, i) {
+					if (val instanceof Uint8Array) {
+						var ua2num = function(ua) {
+	                        var n = 0;
+	                        for (var i = 0; i<ua.length; i++) {
+	                            n *= 256;
+	                            n += ua[i];
+	                        }
+	                        return n;
+	                    }
+	                    result[i] = ua2num(val);
+					}
+				})
+			})
+            callback(nodeName, entity, response);
+            //self.topology.addNodeInfo(nodeName, entity, response);
+            //self.topology.cleanUp(response);
+        }, ret.error);
+      },
+
+		getMultipleNodeInfo: function (nodeNames, entity, attrs, callback, selectedNodeId) {
+			var responses = {};
+			var gotNodesResult = function (nodeName, dotentity, response) {
+				responses[nodeName] = response;
+				if (Object.keys(responses).length == nodeNames.length) {
+					aggregateNodeInfo(nodeNames, entity, responses, callback);
+				}
+			}
+
+			var aggregateNodeInfo = function (nodeNames, entity, responses, callback) {
+				//QDR.log.debug("got all results for  " + entity);
+				// aggregate the responses
+				var newResponse = {};
+				var thisNode = responses[selectedNodeId];
+				newResponse['attributeNames'] = thisNode.attributeNames;
+				newResponse['results'] = thisNode.results;
+				newResponse['aggregates'] = [];
+				for (var i=0; i<thisNode.results.length; ++i) {
+					var result = thisNode.results[i];
+					var vals = [];
+					result.forEach( function (val) {
+						vals.push({sum: val, detail: []})
+					})
+					newResponse.aggregates.push(vals);
+				}
+				var nameIndex = thisNode.attributeNames.indexOf("name");
+				var ent = self.schema.entityTypes[entity];
+				var ids = Object.keys(responses);
+				ids.sort();
+				ids.forEach( function (id) {
+					var response = responses[id];
+					var results = response.results;
+					results.forEach( function (result) {
+						// find the matching result in the aggregates
+						var found = newResponse.aggregates.some( function (aggregate, j) {
+							if (aggregate[nameIndex].sum === result[nameIndex]) {
+								// result and aggregate are now the same record, add the graphable values
+								newResponse.attributeNames.forEach( function (key, i) {
+									if (ent.attributes[key] && ent.attributes[key].graph) {
+										if (id != selectedNodeId)
+											aggregate[i].sum += result[i];
+										aggregate[i].detail.push({node: self.nameFromId(id)+':', val: result[i]})
+									}
+								})
+								return true; // stop looping
+							}
+							return false; // continute looking for the aggregate record
+						})
+						if (!found) {
+							// this attribute was not found in the aggregates yet
+							// because it was not in the selectedNodeId's results
+							var vals = [];
+							result.forEach( function (val) {
+								vals.push({sum: val, detail: []})
+							})
+							newResponse.aggregates.push(vals)
+						}
+					})
+				})
+				callback(nodeNames, entity, newResponse);
+			}
+
+			nodeNames.forEach( function (id) {
+	            self.getNodeInfo(id, '.'+entity, attrs, gotNodesResult);
+	        })
+			//TODO: implement a timeout in case not all requests complete
+		},
+
+      getSchema: function () {
+        //QDR.log.debug("getting schema");
+        var ret;
+        self.correlator.request(
+            ret = self.sendMgmtQuery('GET-SCHEMA')
+        ).then(ret.id, function(response) {
+            //QDR.log.debug("Got schema response");
+			self.schema = response;
+            //self.schema = angular.copy(response);
+            //self.topology.cleanUp(response);
+            self.notifyTopologyDone();
+        }, ret.error);
+      },
+
+    sendQuery: function(toAddr, entity, attrs) {
+        var toAddrParts = toAddr.split('/');
+        if (toAddrParts.shift() != "amqp:") {
+            self.topology.error(Error("unexpected format for router address: " + toAddr));
+            return;
+        }
+        var fullAddr =  self.toAddress + "/" + toAddrParts.join('/');
+
+		var body;
+        if (attrs)
+            body = {
+                    "attributeNames": attrs,
+            }
+        else
+            body = {
+                "attributeNames": [],
+            }
+
+		return self._send(body, fullAddr, "QUERY", "org.apache.qpid.dispatch" + entity);
+    },
+
+    sendMgmtQuery: function (operation) {
+		// TODO: file bug against dispatch - We should be able to just pass body: [], but that generates an 'invalid body'
+		return self._send([' '], self.toAddress + "/$management", operation);
+    },
+
+	_send: function (body, to, operation, entityType) {
+		var ret = {id: self.correlator.corr()};
+		if (!self.sender || !self.sendable) {
+			ret.error = "no sender"
+			return ret;
+		}
+		try {
+			var application_properties = {
+				operation:  operation,
+                type:       "org.amqp.management",
+                name:       "self"
+            };
+			if (entityType)
+                application_properties.entityType = entityType;
+
+	        self.sender.send({
+	                body: body,
+	                properties: {
+	                    to:                     to,
+                        reply_to:               self.receiver.remote.attach.source.address,
+	                    correlation_id:         ret.id
+	                },
+	                application_properties: application_properties
+            })
+		}
+		catch (e) {
+			error = "error sending: " + e;
+			QDR.log.error(error)
+			ret.error = error;
+		}
+		return ret;
+	},
+
+      disconnect: function() {
+        self.connection.close();
+      },
+
+      connect: function(options) {
+        self.options = options;
+        self.topologyInitialized = false;
+		if (!self.connected) {
+			var okay = {connection: false, sender: false, receiver: false}
+            var port = options.port || 5673;
+            var baseAddress = options.address + ':' + port;
+			var ws = self.rhea.websocket_connect(WebSocket);
+			self.toAddress = "amqp://" + baseAddress;
+			self.connectionError = undefined;
+
+			var stop = function (context) {
+				//self.stopUpdating();
+				if (self.connected) {
+				    $rootScope.$broadcast('newAlert', { type: 'danger', msg: 'Connection to ' + baseAddress + " was lost. Retrying..." });
+				}
+				okay.sender = false;
+				okay.receiver = false;
+				okay.connected = false;
+				self.connected = false;
+				self.sender = null;
+				self.receiver = null;
+				self.sendable = false;
+			}
+
+			var maybeStart = function () {
+				if (okay.connection && okay.sender && okay.receiver && self.sendable && !self.connected) {
+					QDR.log.info("okay to start")
+					self.connected = true;
+					self.connection = connection;
+					self.sender = sender;
+					self.receiver = receiver;
+					self.onSubscription();
+					$rootScope.$broadcast("clearAlerts");
+				}
+			}
+
+			QDR.log.debug("****** calling rhea.connect ********")
+            var connection = self.rhea.connect({
+                    connection_details:ws('ws://' + baseAddress),
+                    reconnect:true,
+                    properties: {console_identifier: 'Dispatch console'}
+            });
+			connection.on('connection_open', function (context) {
+				QDR.log.debug("connection_opened")
+				okay.connection = true;
+				okay.receiver = false;
+				okay.sender = false;
+			})
+			connection.on('disconnected', function (context) {
+				QDR.log.warn("disconnected");
+				stop();
+				self.errorText = "Error: Connection failed."
+				self.executeDisconnectActions();
+				self.connectionError = true;
+			})
+			connection.on('connection_close', function (context) { QDR.log.warn("connection_close"); stop()})
+
+			var sender = connection.open_sender("/$management");
+			sender.on('sender_open', function (context) {
+				QDR.log.debug("sender_opened")
+				okay.sender = true
+				maybeStart()
+			})
+			sender.on('sendable', function (context) {
+				//QDR.log.debug("sendable")
+				self.sendable = true;
+				maybeStart();
+			})
+
+			var receiver = connection.open_receiver({source: {dynamic: true}});
+			receiver.on('receiver_open', function (context) {
+				QDR.log.debug("receiver_opened")
+				okay.receiver = true;
+				maybeStart()
+			})
+			receiver.on("message", function (context) {
+				self.correlator.resolve(context);
+			});
+
+		}
+      }
+    }
+      return self;
+  }]);
+
+  return QDR;
+}(QDR || {}));
+
+(function() {
+    console.dump = function(object) {
+        if (window.JSON && window.JSON.stringify)
+            console.log(JSON.stringify(object));
+        else
+            console.log(object);
+    };
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrSettings.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrSettings.js b/console/stand-alone/plugin/js/qdrSettings.js
new file mode 100644
index 0000000..950e1c5
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrSettings.js
@@ -0,0 +1,115 @@
+/*
+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.
+*/
+/**
+ * @module QDR
+ */
+var QDR = (function (QDR) {
+
+  /**
+   * @method SettingsController
+   * @param $scope
+   * @param QDRServer
+   *
+   * Controller that handles the QDR settings page
+   */
+  QDR.module.controller("QDR.SettingsController", ['$scope', 'QDRService', '$location', function($scope, QDRService, $location) {
+
+    $scope.connecting = false;
+    $scope.connectionError = false;
+    $scope.connectionErrorText = undefined;
+    $scope.forms = {};
+
+    $scope.formEntity = angular.fromJson(localStorage[QDR.SETTINGS_KEY]) || {address: '', port: '', username: '', password: '', autostart: false};
+    $scope.formConfig = {
+      properties: {
+        address: {
+          description: "Router address",
+          'type': 'java.lang.String',
+          required: true
+        },
+        port: {
+          description: 'Router port',
+          'type': 'Integer',
+          tooltip: 'Ports to connect to, by default 5672'
+        },
+        username: {
+          description: 'User Name',
+          'type': 'java.lang.String'
+        },
+        password: {
+          description: 'Password',
+          'type': 'password'
+        },
+        /*
+        useSSL: {
+          description: 'SSL',
+          'type': 'boolean'
+        },*/
+        autostart: {
+          description: 'Connect at startup',
+          'type': 'boolean',
+          tooltip: 'Whether or not the connection should be started as soon as you log into hawtio'
+        }
+      }
+    };
+
+    $scope.$watch('formEntity', function(newValue, oldValue) {
+      if (newValue !== oldValue) {
+        localStorage[QDR.SETTINGS_KEY] = angular.toJson(newValue);
+      }
+    }, true);
+
+    $scope.buttonText = function() {
+      if (QDRService.isConnected()) {
+        return "Reconnect";
+      } else {
+        return "Connect";
+      }
+    };
+
+    
+    $scope.connect = function() {
+      if ($scope.settings.$valid) {
+        $scope.connectionError = false;
+        $scope.connecting = true;
+        console.log("attempting to connect");
+        QDRService.addDisconnectAction(function() {
+          //QDR.log.debug("disconnect action called");
+          $scope.connecting = false;
+          $scope.connectionErrorText = QDRService.errorText;
+          $scope.connectionError = true;
+          $scope.$apply();
+        });
+        QDRService.addConnectAction(function() {
+          //QDR.log.debug("got connection notification");
+          $scope.connecting = false;
+          //console.log("we were on connect page. let's switch to topo now that we are connected");
+          //QDR.log.debug("location before the connect " + $location.path());
+          $location.path("/overview");
+          //QDR.log.debug("location after the connect " + $location.path());
+          $scope.$apply();
+        });
+        QDRService.connect($scope.formEntity);
+      }
+    };
+
+  }]);
+
+  return QDR;
+}(QDR || {}));


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[11/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/lib/json-formatter-min.js
----------------------------------------------------------------------
diff --git a/console/plugin/lib/json-formatter-min.js b/console/plugin/lib/json-formatter-min.js
deleted file mode 100644
index 89ccb72..0000000
--- a/console/plugin/lib/json-formatter-min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * jsonformatter
- *
- * Version: 0.4.1 - 2015-12-03T03:38:59.925Z
- * License: MIT
- */
-"use strict";angular.module("jsonFormatter",["RecursionHelper"]).provider("JSONFormatterConfig",function(){var n=!1,e=100,t=5;return{get hoverPreviewEnabled(){return n},set hoverPreviewEnabled(e){n=!!e},get hoverPreviewArrayCount(){return e},set hoverPreviewArrayCount(n){e=parseInt(n,10)},get hoverPreviewFieldCount(){return t},set hoverPreviewFieldCount(n){t=parseInt(n,10)},$get:function(){return{hoverPreviewEnabled:n,hoverPreviewArrayCount:e,hoverPreviewFieldCount:t}}}}).directive("jsonFormatter",["RecursionHelper","JSONFormatterConfig",function(n,e){function t(n){return n.replace('"','"')}function r(n){if(void 0===n)return"";if(null===n)return"Object";if("object"==typeof n&&!n.constructor)return"Object";var e=/function (.{1,})\(/,t=e.exec(n.constructor.toString());return t&&t.length>1?t[1]:""}function o(n){return null===n?"null":typeof n}function s(n,e){var r=o(n);return"null"===r||"undefined"===r?r:("string"===r&&(e='"'+t(e)+'"'),"function"===r?n.toString().replace(/[\r\n]/g,"").
 replace(/\{.*\}/,"")+"{…}":e)}function i(n){var e="";return angular.isObject(n)?(e=r(n),angular.isArray(n)&&(e+="["+n.length+"]")):e=s(n,n),e}function a(n){n.isArray=function(){return angular.isArray(n.json)},n.isObject=function(){return angular.isObject(n.json)},n.getKeys=function(){return n.isObject()?Object.keys(n.json).map(function(n){return""===n?'""':n}):void 0},n.type=o(n.json),n.hasKey="undefined"!=typeof n.key,n.getConstructorName=function(){return r(n.json)},"string"===n.type&&("Invalid Date"!==new Date(n.json).toString()&&(n.isDate=!0),0===n.json.indexOf("http")&&(n.isUrl=!0)),n.isEmptyObject=function(){return n.getKeys()&&!n.getKeys().length&&n.isOpen&&!n.isArray()},n.isOpen=!!n.open,n.toggleOpen=function(){n.isOpen=!n.isOpen},n.childrenOpen=function(){return n.open>1?n.open-1:0},n.openLink=function(e){e&&(window.location.href=n.json)},n.parseValue=function(e){return s(n.json,e)},n.showThumbnail=function(){return!!e.hoverPreviewEnabled&&n.isObject()&&!n.isOpen},n.getTh
 umbnail=function(){if(n.isArray())return n.json.length>e.hoverPreviewArrayCount?"Array["+n.json.length+"]":"["+n.json.map(i).join(", ")+"]";var t=n.getKeys(),r=t.slice(0,e.hoverPreviewFieldCount),o=r.map(function(e){return e+":"+i(n.json[e])}),s=t.length>=5?"…":"";return"{"+o.join(", ")+s+"}"}}return{templateUrl:"json-formatter.html",restrict:"E",replace:!0,scope:{json:"=",key:"=",open:"="},compile:function(e){return n.compile(e,a)}}}]),"object"==typeof module&&(module.exports="jsonFormatter"),angular.module("RecursionHelper",[]).factory("RecursionHelper",["$compile",function(n){return{compile:function(e,t){angular.isFunction(t)&&(t={post:t});var r,o=e.contents().remove();return{pre:t&&t.pre?t.pre:null,post:function(e,s){r||(r=n(o)),r(e,function(n){s.append(n)}),t&&t.post&&t.post.apply(null,arguments)}}}}}]),angular.module("jsonFormatter").run(["$templateCache",function(n){n.put("json-formatter.html",'<div ng-init="isOpen = open && open > 0" class="json-formatter-row"><a ng-click=
 "toggleOpen()"><span class="toggler {{isOpen ? \'open\' : \'\'}}" ng-if="isObject()"></span> <span class="key" ng-if="hasKey"><span class="key-text">{{key}}</span><span class="colon">:</span></span> <span class="value"><span ng-if="isObject()"><span class="constructor-name">{{getConstructorName(json)}}</span> <span ng-if="isArray()"><span class="bracket">[</span><span class="number">{{json.length}}</span><span class="bracket">]</span></span></span> <span ng-if="!isObject()" ng-click="openLink(isUrl)" class="{{type}}" ng-class="{date: isDate, url: isUrl}">{{parseValue(json)}}</span></span> <span ng-if="showThumbnail()" class="thumbnail-text">{{getThumbnail()}}</span></a><div class="children" ng-if="getKeys().length && isOpen"><json-formatter ng-repeat="key in getKeys() track by $index" json="json[key]" key="key" open="childrenOpen()"></json-formatter></div><div class="children empty object" ng-if="isEmptyObject()"></div><div class="children empty array" ng-if="getKeys() && !getKeys()
 .length && isOpen && isArray()"></div></div>')}]);
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[19/19] qpid-dispatch git commit: DISPATCH-201: removed LICENSE file. No 3rd party files are being distributed

Posted by ea...@apache.org.
DISPATCH-201: removed LICENSE file. No 3rd party files are being distributed


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/06c2538a
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/06c2538a
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/06c2538a

Branch: refs/heads/master
Commit: 06c2538af6eefe5388a6a74011edb79f55a2d442
Parents: 4940e63
Author: Ernest Allen <ea...@redhat.com>
Authored: Thu Feb 18 13:04:06 2016 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Thu Feb 18 13:04:06 2016 -0500

----------------------------------------------------------------------
 console/LICENSE | 265 ---------------------------------------------------
 1 file changed, 265 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/06c2538a/console/LICENSE
----------------------------------------------------------------------
diff --git a/console/LICENSE b/console/LICENSE
deleted file mode 100644
index fc915e4..0000000
--- a/console/LICENSE
+++ /dev/null
@@ -1,265 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" 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. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed 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.
-
-
-
-###############################################
-# Third Party Dependency Licensing Information:
-###############################################
-
-This product bundles
-// tipsy, facebook style tooltips for jquery
-// version 1.0.2
-// (c) 2008-2010 jason frame [jason@onehackoranother.com]
-// released under the MIT license
-
-/*!
- * jsonformatter
- *
- * Version: 0.4.1 - 2015-12-03T03:38:59.925Z
- * License: MIT
- */
-
-/* ui-dynatree
-Licensed under MIT and GPL
-see https://code.google.com/p/dynatree/wiki/LicenseInfo
-*/
-
-/*
- jQuery UI Slider plugin wrapper
-
-    Source: https://github.com/angular-ui/ui-slider/blob/master/src/slider.js
- 	License: MIT
-
-*/
-
-This product loads but does not bundle the following javascript libraries:
-angularjs, bootstrap, jquery which use the MIT license.
-
-the MIT licence:
-
-Copyright (c) 2004-2013 QOS.ch
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-d3.js is loaded but not bundled. It's license is @ https://github.com/mbostock/d3/blob/master/LICENSE
-jquery.fancytree is loaded but not bundled. It's license is @ https://github.com/mar10/fancytree/blob/master/LICENSE.txt
-
-


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[15/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/data/world-110m.json
----------------------------------------------------------------------
diff --git a/console/plugin/data/world-110m.json b/console/plugin/data/world-110m.json
deleted file mode 100644
index a1ce852..0000000
--- a/console/plugin/data/world-110m.json
+++ /dev/null
@@ -1 +0,0 @@
-{"type":"Topology","transform":{"scale":[0.0036000360003600037,0.0016925586033320111],"translate":[-180,-85.60903777459777]},"objects":{"land":{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[7,8,9]],[[10,11]],[[12]],[[13]],[[14]],[[15]],[[16]],[[17]],[[18]],[[19]],[[20]],[[21]],[[22]],[[23]],[[24]],[[25]],[[26]],[[27]],[[28]],[[29,30]],[[31]],[[32]],[[33]],[[34]],[[35]],[[36]],[[37]],[[38]],[[39]],[[40]],[[41]],[[42,43]],[[44]],[[45]],[[46]],[[47,48,49,50]],[[51]],[[52]],[[53]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]],[[60]],[[61]],[[62,63]],[[64]],[[65]],[[66]],[[67]],[[68]],[[69]],[[70]],[[71]],[[72]],[[73]],[[74]],[[75]],[[76,77]],[[78]],[[79]],[[80]],[[81]],[[82]],[[83]],[[84]],[[85]],[[86]],[[87]],[[88]],[[89]],[[90,91]],[[92]],[[93]],[[94]],[[95]],[[96]],[[97]],[[98]],[[99]],[[100]],[[101]],[[102]],[[103]],[[104]],[[105]],[[106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137
 ,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221]],[[222,223]],[[224]],[[225]],[[226]],[[227]],[[228]],[[229]],[[230,231,232,233]],[[234]],[[235]],[[236]],[[237]],[[238]],[[239]],[[240]],[[241]],[[242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,
 370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477],[478,479,480,481,482,483,484]],[[485]],[[486]],[[487]],[[488]],[[489]],[[490]],[[491]],[[492]],[[493]],[[494]],[[495]],[[496]],[[497]],[[498]]]},"countries":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[499,500,501,502,503,504]],"id":4},{"type":"MultiPolygon","arcs":[[[505,506,352,507]],[[354,508,509]]],"id":24},{"type":"Polygon","arcs":[[510,511,414,512,513,514]],"id":8},{"type":"Polygon","arcs":[[312,515,314,516,517]],"id":784},{"type":"MultiPolygon","arcs":[[[518,11]],[[519,520,521,166,522,168,523,524]]],"id":32},{"type":"Polygon",
 "arcs":[[525,526,527,528,529]],"id":51},{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[530,531]]],"id":10},{"type":"Polygon","arcs":[[13]],"id":260},{"type":"MultiPolygon","arcs":[[[14]],[[24]]],"id":36},{"type":"Polygon","arcs":[[532,533,534,535,536,537,538]],"id":40},{"type":"MultiPolygon","arcs":[[[539,-528]],[[484,540,479,541,-526,542,543]]],"id":31},{"type":"Polygon","arcs":[[544,545,546]],"id":108},{"type":"Polygon","arcs":[[547,548,549,550,437]],"id":56},{"type":"Polygon","arcs":[[551,552,553,554,366]],"id":204},{"type":"Polygon","arcs":[[555,556,557,-553,558,559]],"id":854},{"type":"Polygon","arcs":[[560,561,289,562]],"id":50},{"type":"Polygon","arcs":[[563,404,564,565,566,567]],"id":100},{"type":"MultiPolygon","arcs":[[[71]],[[73]],[[74]]],"id":44},{"type":"Polygon","arcs":[[568,569,570]],"id":70},{"type":"Polygon","arcs":[[571,572,573,574,575]],"id":112},{"type":"Polygon","arcs":[[576,145,577]],"id":84},{"type":"Polygon","arcs":[[578,579,580,581
 ,-525]],"id":68},{"type":"Polygon","arcs":[[-521,582,-581,583,584,585,586,587,588,164,589]],"id":76},{"type":"Polygon","arcs":[[48,590]],"id":96},{"type":"Polygon","arcs":[[591,592]],"id":64},{"type":"Polygon","arcs":[[593,594,595,596]],"id":72},{"type":"Polygon","arcs":[[597,598,599,600,601,602,603]],"id":140},{"type":"MultiPolygon","arcs":[[[84]],[[85]],[[86]],[[87]],[[88]],[[96]],[[97]],[[99]],[[101]],[[103]],[[604,107,605,109,606,111,607,113,608,115,609,117,610,199,611,201,612,215,613,217,614,219,615,221]],[[616,223]],[[224]],[[225]],[[226]],[[227]],[[229]],[[230,617,232,618]],[[235]],[[237]],[[238]],[[240]],[[241]],[[485]],[[486]],[[488]],[[489]],[[490]],[[496]],[[497]]],"id":124},{"type":"Polygon","arcs":[[-536,619,620,621]],"id":756},{"type":"MultiPolygon","arcs":[[[-519,622,623,624]],[[-524,169,625,171,626,-579]]],"id":152},{"type":"MultiPolygon","arcs":[[[64]],[[627,274,628,276,629,278,630,280,631,632,633,634,635,-593,636,637,638,639,-503,640,641,642,643,644,645]]],"id":156
 },{"type":"Polygon","arcs":[[369,646,647,648,-556,649]],"id":384},{"type":"Polygon","arcs":[[650,651,652,359,653,654,655,656,-604,657]],"id":120},{"type":"Polygon","arcs":[[658,659,-545,660,661,662,663,-508,353,-510,664,-602,665]],"id":180},{"type":"Polygon","arcs":[[-509,355,666,-658,-603,-665]],"id":178},{"type":"Polygon","arcs":[[667,174,668,155,669,-585,670]],"id":170},{"type":"Polygon","arcs":[[178,671,151,672]],"id":188},{"type":"Polygon","arcs":[[70]],"id":192},{"type":"Polygon","arcs":[[77,673]],"id":-99},{"type":"Polygon","arcs":[[76,-674]],"id":196},{"type":"Polygon","arcs":[[-538,674,675,676]],"id":203},{"type":"Polygon","arcs":[[445,677,-675,-537,-622,678,679,-549,680,441,681]],"id":276},{"type":"Polygon","arcs":[[337,682,683,684]],"id":262},{"type":"MultiPolygon","arcs":[[[92]],[[-682,442,685,444]]],"id":208},{"type":"Polygon","arcs":[[62,686]],"id":214},{"type":"Polygon","arcs":[[687,688,689,690,691,384,692,693]],"id":12},{"type":"Polygon","arcs":[[173,-668,694]],"id":
 218},{"type":"Polygon","arcs":[[333,695,696,390,697]],"id":818},{"type":"Polygon","arcs":[[698,699,700,336,-685]],"id":232},{"type":"Polygon","arcs":[[431,701,433,702,427,703,429,704]],"id":724},{"type":"Polygon","arcs":[[450,705,706]],"id":233},{"type":"Polygon","arcs":[[-684,707,708,709,710,711,712,-699]],"id":231},{"type":"Polygon","arcs":[[713,452,714,715,455,716,717]],"id":246},{"type":"MultiPolygon","arcs":[[[18]],[[19]],[[20]]],"id":242},{"type":"Polygon","arcs":[[12]],"id":238},{"type":"MultiPolygon","arcs":[[[718,719,163,-589]],[[82]],[[720,-679,-621,721,426,-703,434,722,436,-551]]],"id":250},{"type":"Polygon","arcs":[[356,723,-651,-667]],"id":266},{"type":"MultiPolygon","arcs":[[[724,90]],[[725,726,727,728,729,730,731,732]]],"id":826},{"type":"Polygon","arcs":[[400,733,-543,-530,734]],"id":268},{"type":"Polygon","arcs":[[368,-650,-560,735]],"id":288},{"type":"Polygon","arcs":[[736,737,374,738,739,740,-648]],"id":324},{"type":"Polygon","arcs":[[741,377]],"id":270},{"type":"
 Polygon","arcs":[[375,742,-739]],"id":624},{"type":"Polygon","arcs":[[357,-652,-724]],"id":226},{"type":"MultiPolygon","arcs":[[[78]],[[407,743,409,744,411,745,413,-512,746,-566,747]]],"id":300},{"type":"Polygon","arcs":[[498]],"id":304},{"type":"Polygon","arcs":[[185,748,-578,146,749,750]],"id":320},{"type":"Polygon","arcs":[[161,751,-587,752]],"id":328},{"type":"Polygon","arcs":[[182,753,754,-750,147,755,149,756]],"id":340},{"type":"Polygon","arcs":[[757,-571,758,417,759,419,760,761]],"id":191},{"type":"Polygon","arcs":[[-687,63]],"id":332},{"type":"Polygon","arcs":[[-533,762,763,764,765,-762,766]],"id":348},{"type":"MultiPolygon","arcs":[[[26]],[[767,30]],[[31]],[[32]],[[35]],[[36]],[[39]],[[40]],[[768,43]],[[44]],[[45]],[[769,50]],[[46]]],"id":360},{"type":"Polygon","arcs":[[-639,770,-637,-592,-636,771,-563,290,772,292,773,294,774,296,775]],"id":356},{"type":"Polygon","arcs":[[91,-725]],"id":372},{"type":"Polygon","arcs":[[776,-505,777,300,778,302,779,780,781,-540,-527,-542,480]
 ],"id":364},{"type":"Polygon","arcs":[[782,783,784,785,786,-781,787]],"id":368},{"type":"Polygon","arcs":[[100]],"id":352},{"type":"Polygon","arcs":[[788,789,-698,391,790,791,792]],"id":376},{"type":"MultiPolygon","arcs":[[[79]],[[80]],[[793,421,794,423,795,425,-722,-620,-535]]],"id":380},{"type":"Polygon","arcs":[[61]],"id":388},{"type":"Polygon","arcs":[[796,-785,797,332,-790,798,-793]],"id":400},{"type":"MultiPolygon","arcs":[[[75]],[[81]],[[83]]],"id":392},{"type":"Polygon","arcs":[[799,800,482,801,-643,802]],"id":398},{"type":"Polygon","arcs":[[342,803,804,805,-710,806]],"id":404},{"type":"Polygon","arcs":[[-803,-642,807,808]],"id":417},{"type":"Polygon","arcs":[[809,810,811,283]],"id":116},{"type":"Polygon","arcs":[[265,812,267,813]],"id":410},{"type":"Polygon","arcs":[[-515,814,815,816]],"id":-99},{"type":"Polygon","arcs":[[304,817,-783]],"id":414},{"type":"Polygon","arcs":[[818,819,-634,820,-811]],"id":418},{"type":"Polygon","arcs":[[-791,392,821]],"id":422},{"type":"Polygon
 ","arcs":[[370,822,372,823,-737,-647]],"id":430},{"type":"Polygon","arcs":[[824,-694,825,388,826,-697,827,828]],"id":434},{"type":"Polygon","arcs":[[52]],"id":144},{"type":"Polygon","arcs":[[829]],"id":426},{"type":"Polygon","arcs":[[830,448,831,-572,832]],"id":440},{"type":"Polygon","arcs":[[-680,-721,-550]],"id":442},{"type":"Polygon","arcs":[[449,-707,833,-573,-832]],"id":428},{"type":"Polygon","arcs":[[-692,834,835,836,837,383]],"id":504},{"type":"Polygon","arcs":[[838,839]],"id":498},{"type":"Polygon","arcs":[[23]],"id":450},{"type":"Polygon","arcs":[[840,-577,-749,186,841,188,842,190,843,192,844,194,845]],"id":484},{"type":"Polygon","arcs":[[-817,846,-567,-747,-511]],"id":807},{"type":"Polygon","arcs":[[847,-689,848,-557,-649,-741,849]],"id":466},{"type":"Polygon","arcs":[[287,-561,-772,-635,-820,850]],"id":104},{"type":"Polygon","arcs":[[416,-759,-570,851,-815,-514,852]],"id":499},{"type":"Polygon","arcs":[[853,-645]],"id":496},{"type":"Polygon","arcs":[[854,344,855,856,347,8
 57,858,859,860,861,862]],"id":508},{"type":"Polygon","arcs":[[863,379,864,-690,-848]],"id":478},{"type":"Polygon","arcs":[[-863,865,866]],"id":454},{"type":"MultiPolygon","arcs":[[[285,867]],[[-770,47,-591,49]]],"id":458},{"type":"Polygon","arcs":[[351,-507,868,-595,869]],"id":516},{"type":"Polygon","arcs":[[17]],"id":540},{"type":"Polygon","arcs":[[-558,-849,-688,-825,870,-656,871,-554]],"id":562},{"type":"Polygon","arcs":[[361,872,363,873,365,-555,-872,-655]],"id":566},{"type":"Polygon","arcs":[[179,874,181,-757,150,-672]],"id":558},{"type":"Polygon","arcs":[[-681,-548,438,875,440]],"id":528},{"type":"MultiPolygon","arcs":[[[876,-718,877,457,878,459,879,461]],[[487]],[[492]],[[493]]],"id":578},{"type":"Polygon","arcs":[[-771,-638]],"id":524},{"type":"MultiPolygon","arcs":[[[15]],[[16]]],"id":554},{"type":"MultiPolygon","arcs":[[[880,319,881,882,883,-517,315,884,317]],[[-516,313]]],"id":512},{"type":"Polygon","arcs":[[-640,-776,297,885,299,-778,-504]],"id":586},{"type":"Polygon","a
 rcs":[[175,886,177,-673,152,887,154,-669]],"id":591},{"type":"Polygon","arcs":[[-627,172,-695,-671,-584,-580]],"id":604},{"type":"MultiPolygon","arcs":[[[51]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]]],"id":608},{"type":"MultiPolygon","arcs":[[[37]],[[38]],[[-769,42]],[[41]]],"id":598},{"type":"Polygon","arcs":[[-678,446,888,-833,-576,889,890,-676]],"id":616},{"type":"Polygon","arcs":[[60]],"id":630},{"type":"Polygon","arcs":[[262,891,264,-814,892,269,893,271,894,273,-628,895]],"id":408},{"type":"Polygon","arcs":[[-705,430]],"id":620},{"type":"Polygon","arcs":[[-582,-583,-520]],"id":600},{"type":"Polygon","arcs":[[-799,-789]],"id":275},{"type":"Polygon","arcs":[[308,896,310,897]],"id":634},{"type":"Polygon","arcs":[[898,-840,899,403,-564,900,-765]],"id":642},{"type":"MultiPolygon","arcs":[[[89]],[[-889,447,-831]],[[102]],[[104]],[[105]],[[228]],[[234]],[[236]],[[239]],[[901,243,902,245,903,247,904,249,905,251,906,253,907,255,908,257,909,259,910,261,-896,-646,-854,-644,-802,483,-544,
 -734,401,911,-574,-834,-706,451,-714,-877,912,913,914,915,464,916,466,917,468,918,470,919,920,473,921,475,922,477]],[[491]],[[494]],[[495]]],"id":643},{"type":"Polygon","arcs":[[923,-546,-660,924]],"id":646},{"type":"Polygon","arcs":[[-691,-865,380,-835]],"id":732},{"type":"Polygon","arcs":[[925,329,926,331,-798,-784,-818,305,927,307,-898,311,-518,-884,928]],"id":682},{"type":"Polygon","arcs":[[-599,929,-828,-696,334,-700,-713,930,931,932]],"id":729},{"type":"Polygon","arcs":[[-711,-806,933,-666,-601,934,-932,935]],"id":728},{"type":"Polygon","arcs":[[378,-864,-850,-740,-743,376,-742]],"id":686},{"type":"MultiPolygon","arcs":[[[25]],[[27]],[[28]],[[33]],[[34]]],"id":90},{"type":"Polygon","arcs":[[373,-738,-824]],"id":694},{"type":"Polygon","arcs":[[184,-751,-755,936]],"id":222},{"type":"Polygon","arcs":[[-708,-683,338,937,340,938]],"id":-99},{"type":"Polygon","arcs":[[-807,-709,-939,341]],"id":706},{"type":"Polygon","arcs":[[-568,-847,-816,-852,-569,-758,-766,-901]],"id":688},{"type
 ":"Polygon","arcs":[[162,-720,939,-588,-752]],"id":740},{"type":"Polygon","arcs":[[-891,940,-763,-539,-677]],"id":703},{"type":"Polygon","arcs":[[-534,-767,-761,420,-794]],"id":705},{"type":"Polygon","arcs":[[-878,-717,456]],"id":752},{"type":"Polygon","arcs":[[941,-859]],"id":748},{"type":"Polygon","arcs":[[-797,-792,-822,393,942,-786]],"id":760},{"type":"Polygon","arcs":[[-871,-829,-930,-598,-657]],"id":148},{"type":"Polygon","arcs":[[-736,-559,-552,367]],"id":768},{"type":"Polygon","arcs":[[284,-868,286,-851,-819,-810]],"id":764},{"type":"Polygon","arcs":[[-808,-641,-502,943]],"id":762},{"type":"Polygon","arcs":[[-777,481,-801,944,-500]],"id":795},{"type":"Polygon","arcs":[[29,-768]],"id":626},{"type":"Polygon","arcs":[[53]],"id":780},{"type":"Polygon","arcs":[[-693,385,945,387,-826]],"id":788},{"type":"MultiPolygon","arcs":[[[399,-735,-529,-782,-787,-943,394,946,947,397,948]],[[949,-748,-565,405]]],"id":792},{"type":"Polygon","arcs":[[72]],"id":158},{"type":"Polygon","arcs":[[-8
 04,343,-855,-867,950,-663,951,-661,-547,-924,952]],"id":834},{"type":"Polygon","arcs":[[-925,-659,-934,-805,-953]],"id":800},{"type":"Polygon","arcs":[[-912,402,-900,-839,-899,-764,-941,-890,-575]],"id":804},{"type":"Polygon","arcs":[[-590,165,-522]],"id":858},{"type":"MultiPolygon","arcs":[[[65]],[[66]],[[67]],[[68]],[[69]],[[118,953,120,954,122,955,124,956,126,957,128,958,130,959,132,960,134,961,136,962,138,963,140,964,142,-846,195,965,966,967,968,969,-611]],[[93]],[[95]],[[98]],[[-613,202,970,204,971,206,972,208,973,210,974,212,975,214]]],"id":840},{"type":"Polygon","arcs":[[-945,-800,-809,-944,-501]],"id":860},{"type":"Polygon","arcs":[[156,976,158,977,160,-753,-586,-670]],"id":862},{"type":"Polygon","arcs":[[282,-812,-821,-633]],"id":704},{"type":"MultiPolygon","arcs":[[[21]],[[22]]],"id":548},{"type":"Polygon","arcs":[[321,978,323,979,325,980,327,-929,-883,981]],"id":887},{"type":"Polygon","arcs":[[982,350,-870,-594,983,-860,-942,-858,348],[-830]],"id":710},{"type":"Polygon","
 arcs":[[-866,-862,984,-596,-869,-506,-664,-951]],"id":894},{"type":"Polygon","arcs":[[-984,-597,-985,-861]],"id":716}]}},"arcs":[[[33289,2723],[-582,81],[-621,-35],[-348,197],[0,23],[-152,174],[625,-23],[599,-58],[207,243],[147,208],[288,-243],[-82,-301],[-81,-266]],[[5242,3530],[-364,208],[-163,209],[-11,35],[-180,162],[169,220],[517,-93],[277,-185],[212,-209],[76,-266],[-533,-81]],[[35977,2708],[-658,35],[-365,197],[49,243],[593,162],[239,197],[174,254],[126,220],[168,209],[180,243],[141,0],[414,127],[419,-127],[342,-255],[120,-359],[33,-254],[11,-301],[-430,-186],[-452,-150],[-522,-139],[-582,-116]],[[16602,6806],[-386,47],[-278,208],[60,197],[332,-104],[359,-93],[332,104],[-158,-208],[-261,-151]],[[15547,6934],[-164,23],[-359,58],[-381,162],[202,127],[277,-139],[425,-231]],[[23277,7733],[-217,46],[-337,-23],[-343,23],[-376,-35],[-283,116],[-146,243],[174,104],[353,-81],[403,-46],[305,-81],[304,69],[163,-335]],[[30256,7743],[-364,11],[136,232],[-327,-81],[-310,-81],[-212,174],[-1
 6,243],[305,231],[190,70],[321,-23],[82,301],[16,219],[-6,475],[158,278],[256,93],[147,-220],[65,-220],[120,-267],[92,-254],[76,-267],[33,-266],[-49,-231],[-76,-220],[-326,-81],[-311,-116]],[[794,704],[78,49],[94,61],[81,52],[41,26]],[[1088,892],[41,-1],[29,-10]],[[1158,881],[402,-246],[352,246],[63,34],[816,104],[265,-138],[130,-71],[419,-196],[789,-151],[625,-185],[1072,-139],[800,162],[1181,-116],[669,-185],[734,174],[773,162],[60,278],[-1094,23],[-898,139],[-234,231],[-745,128],[49,266],[103,243],[104,220],[-55,243],[-462,162],[-212,209],[-430,185],[675,-35],[642,93],[402,-197],[495,173],[457,220],[223,197],[-98,243],[-359,162],[-408,174],[-571,35],[-500,81],[-539,58],[-180,220],[-359,185],[-217,208],[-87,672],[136,-58],[250,-185],[457,58],[441,81],[228,-255],[441,58],[370,127],[348,162],[315,197],[419,58],[-11,220],[-97,220],[81,208],[359,104],[163,-196],[425,115],[321,151],[397,12],[375,57],[376,139],[299,128],[337,127],[218,-35],[190,-46],[414,81],[370,-104],[381,11],[364,81]
 ,[375,-57],[414,-58],[386,23],[403,-12],[413,-11],[381,23],[283,174],[337,92],[349,-127],[331,104],[300,208],[179,-185],[98,-208],[180,-197],[288,174],[332,-220],[375,-70],[321,-162],[392,35],[354,104],[418,-23],[376,-81],[381,-104],[147,254],[-180,197],[-136,209],[-359,46],[-158,220],[-60,220],[-98,440],[213,-81],[364,-35],[359,35],[327,-93],[283,-174],[119,-208],[376,-35],[359,81],[381,116],[342,70],[283,-139],[370,46],[239,451],[224,-266],[321,-104],[348,58],[228,-232],[365,-23],[337,-69],[332,-128],[218,220],[108,209],[278,-232],[381,58],[283,-127],[190,-197],[370,58],[288,127],[283,151],[337,81],[392,69],[354,81],[272,127],[163,186],[65,254],[-32,244],[-87,231],[-98,232],[-87,231],[-71,209],[-16,231],[27,232],[130,220],[109,243],[44,231],[-55,255],[-32,232],[136,266],[152,173],[180,220],[190,186],[223,173],[109,255],[152,162],[174,151],[267,34],[174,186],[196,115],[228,70],[202,150],[157,186],[218,69],[163,-151],[-103,-196],[-283,-174],[-120,-127],[-206,92],[-229,-58],[-190,-13
 9],[-202,-150],[-136,-174],[-38,-231],[17,-220],[130,-197],[-190,-139],[-261,-46],[-153,-197],[-163,-185],[-174,-255],[-44,-220],[98,-243],[147,-185],[229,-139],[212,-185],[114,-232],[60,-220],[82,-232],[130,-196],[82,-220],[38,-544],[81,-220],[22,-232],[87,-231],[-38,-313],[-152,-243],[-163,-197],[-370,-81],[-125,-208],[-169,-197],[-419,-220],[-370,-93],[-348,-127],[-376,-128],[-223,-243],[-446,-23],[-489,23],[-441,-46],[-468,0],[87,-232],[424,-104],[311,-162],[174,-208],[-310,-185],[-479,58],[-397,-151],[-17,-243],[-11,-232],[327,-196],[60,-220],[353,-220],[588,-93],[500,-162],[398,-185],[506,-186],[690,-92],[681,-162],[473,-174],[517,-197],[272,-278],[136,-220],[337,209],[457,173],[484,186],[577,150],[495,162],[691,12],[680,-81],[560,-139],[180,255],[386,173],[702,12],[550,127],[522,128],[577,81],[614,104],[430,150],[-196,209],[-119,208],[0,220],[-539,-23],[-571,-93],[-544,0],[-77,220],[39,440],[125,128],[397,138],[468,139],[337,174],[337,174],[251,231],[380,104],[376,81],[190,47
 ],[430,23],[408,81],[343,116],[337,139],[305,139],[386,185],[245,197],[261,173],[82,232],[-294,139],[98,243],[185,185],[288,116],[305,139],[283,185],[217,232],[136,277],[202,163],[331,-35],[136,-197],[332,-23],[11,220],[142,231],[299,-58],[71,-220],[331,-34],[360,104],[348,69],[315,-34],[120,-243],[305,196],[283,105],[315,81],[310,81],[283,139],[310,92],[240,128],[168,208],[207,-151],[288,81],[202,-277],[157,-209],[316,116],[125,232],[283,162],[365,-35],[108,-220],[229,220],[299,69],[326,23],[294,-11],[310,-70],[300,-34],[130,-197],[180,-174],[304,104],[327,24],[315,0],[310,11],[278,81],[294,70],[245,162],[261,104],[283,58],[212,162],[152,324],[158,197],[288,-93],[109,-208],[239,-139],[289,46],[196,-208],[206,-151],[283,139],[98,255],[250,104],[289,197],[272,81],[326,116],[218,127],[228,139],[218,127],[261,-69],[250,208],[180,162],[261,-11],[229,139],[54,208],[234,162],[228,116],[278,93],[256,46],[244,-35],[262,-58],[223,-162],[27,-254],[245,-197],[168,-162],[332,-70],[185,-162],[22
 9,-162],[266,-35],[223,116],[240,243],[261,-127],[272,-70],[261,-69],[272,-46],[277,0],[229,-614],[-11,-150],[-33,-267],[-266,-150],[-218,-220],[38,-232],[310,12],[-38,-232],[-141,-220],[-131,-243],[212,-185],[321,-58],[321,104],[153,232],[92,220],[153,185],[174,174],[70,208],[147,289],[174,58],[316,24],[277,69],[283,93],[136,231],[82,220],[190,220],[272,151],[234,115],[153,197],[157,104],[202,93],[277,-58],[250,58],[272,69],[305,-34],[201,162],[142,393],[103,-162],[131,-278],[234,-115],[266,-47],[267,70],[283,-46],[261,-12],[174,58],[234,-35],[212,-127],[250,81],[300,0],[255,81],[289,-81],[185,197],[141,196],[191,163],[348,439],[179,-81],[212,-162],[185,-208],[354,-359],[272,-12],[256,0],[299,70],[299,81],[229,162],[190,174],[310,23],[207,127],[218,-116],[141,-185],[196,-185],[305,23],[190,-150],[332,-151],[348,-58],[288,47],[218,185],[185,185],[250,46],[251,-81],[288,-58],[261,93],[250,0],[245,-58],[256,-58],[250,104],[299,93],[283,23],[316,0],[255,58],[251,46],[76,290],[11,243],[
 174,-162],[49,-266],[92,-244],[115,-196],[234,-105],[315,35],[365,12],[250,35],[364,0],[262,11],[364,-23],[310,-46],[196,-186],[-54,-220],[179,-173],[299,-139],[310,-151],[360,-104],[375,-92],[283,-93],[315,-12],[180,197],[245,-162],[212,-185],[245,-139],[337,-58],[321,-69],[136,-232],[316,-139],[212,-208],[310,-93],[321,12],[299,-35],[332,12],[332,-47],[310,-81],[288,-139],[289,-116],[195,-173],[-32,-232],[-147,-208],[-125,-266],[-98,-209],[-131,-243],[-364,-93],[-163,-208],[-360,-127],[-125,-232],[-190,-220],[-201,-185],[-115,-243],[-70,-220],[-28,-266],[6,-220],[158,-232],[60,-220],[130,-208],[517,-81],[109,-255],[-501,-93],[-424,-127],[-528,-23],[-234,-336],[-49,-278],[-119,-220],[-147,-220],[370,-196],[141,-244],[239,-219],[338,-197],[386,-186],[419,-185],[636,-185],[142,-289],[800,-128],[53,-45],[208,-175],[767,151],[636,-186],[-99504,-147],[245,344],[501,-185],[32,21]],[[31400,18145],[-92,-239],[-238,-183],[-301,67],[-202,177],[-291,86],[-350,330],[-283,317],[-383,662],[229,-
 124],[390,-395],[369,-212],[143,271],[90,405],[256,244],[198,-70]],[[30935,19481],[106,-274],[139,-443],[361,-355],[389,-147],[-125,-296],[-264,-29],[-141,208]],[[33139,19680],[-139,266],[333,354],[236,-148],[167,237],[222,-266],[-83,-207],[-375,-177],[-125,207],[-236,-266]],[[69095,21172],[-7,314],[41,244],[19,121],[179,-186],[263,-74],[9,-112],[-77,-269],[-427,-38]],[[90796,24799],[-57,32],[-171,19],[-171,505],[-38,390],[-160,515],[7,271],[181,-52],[269,-204],[151,81],[217,113],[166,-39],[20,-702],[-95,-203],[-29,-476],[-97,162],[-193,-412]],[[97036,23023],[-256,13],[-180,194],[-302,42],[-46,217],[149,438],[349,583],[179,111],[200,225],[238,310],[167,306],[123,441],[106,149],[41,330],[195,273],[61,-251],[63,-244],[198,239],[80,-249],[0,-249],[-103,-274],[-182,-435],[-142,-238],[103,-284],[-214,-7],[-238,-223],[-75,-387],[-157,-597],[-219,-264],[-138,-169]],[[98677,25949],[-48,155],[-116,85],[160,486],[-91,326],[-299,236],[8,214],[201,206],[47,455],[-13,382],[-113,396],[8,104],[-13
 3,244],[-218,523],[-117,418],[104,46],[151,-328],[216,-153],[78,-526],[202,-622],[5,403],[126,-161],[41,-447],[224,-192],[188,-48],[158,226],[141,-69],[-67,-524],[-85,-345],[-212,12],[-74,-179],[26,-254],[-41,-110],[-105,-319],[-138,-404],[-214,-236]],[[96316,37345],[-153,160],[-199,266],[-179,313],[-184,416],[-38,201],[119,-9],[156,-201],[122,-200],[89,-166],[228,-366],[144,-272],[-105,-142]],[[99425,39775],[-153,73],[-27,260],[107,203],[126,-74],[69,98],[96,-171],[-46,-308],[-172,-81]],[[99645,40529],[-36,220],[139,121],[88,33],[163,184],[0,-289],[-177,-145],[-177,-124]],[[0,40798],[0,289],[57,27],[-34,-284],[-23,-32]],[[96531,40773],[-93,259],[10,158],[175,-339],[-92,-78]],[[96463,41280],[-75,74],[-58,-32],[-39,163],[-6,453],[133,-182],[45,-476]],[[62613,35454],[-160,151],[-220,211],[-77,312],[-18,524],[-98,471],[-26,425],[50,426],[128,102],[1,197],[133,447],[25,377],[-65,280],[-52,372],[-23,544],[97,331],[38,375],[138,22],[155,121],[103,107],[122,7],[158,337],[229,364],[83,297],
 [-38,253],[118,-71],[153,410],[6,356],[92,264],[96,-254],[74,-251],[69,-390],[45,-711],[72,-276],[-28,-284],[-49,-174],[-94,347],[-53,-175],[53,-438],[-24,-250],[-77,-137],[-18,-500],[-109,-689],[-137,-814],[-172,-1120],[-106,-821],[-125,-685],[-226,-140],[-243,-250]],[[90643,27516],[-230,262],[-170,104],[43,308],[-152,-112],[-243,-428],[-240,160],[-158,94],[-159,42],[-269,171],[-179,364],[-52,449],[-64,298],[-137,240],[-267,71],[91,287],[-67,438],[-136,-408],[-247,-109],[146,327],[42,341],[107,289],[-22,438],[-226,-504],[-174,-202],[-106,-470],[-217,243],[9,313],[-174,429],[-147,221],[52,137],[-356,358],[-195,17],[-267,287],[-498,-56],[-359,-211],[-317,-197],[-265,39],[-294,-303],[-241,-137],[-53,-309],[-103,-240],[-236,-15],[-174,-52],[-246,107],[-199,-64],[-191,-27],[-165,-315],[-81,26],[-140,-167],[-133,-187],[-203,23],[-186,0],[-295,377],[-149,113],[6,338],[138,81],[47,134],[-10,212],[34,411],[-31,350],[-147,598],[-45,337],[12,336],[-111,385],[-7,174],[-123,235],[-35,463],[-158
 ,467],[-39,252],[122,-255],[-93,548],[137,-171],[83,-229],[-5,303],[-138,465],[-26,186],[-65,177],[31,341],[56,146],[38,295],[-29,346],[114,425],[21,-450],[118,406],[225,198],[136,252],[212,217],[126,46],[77,-73],[219,220],[168,66],[42,129],[74,54],[153,-14],[292,173],[151,262],[71,316],[163,300],[13,236],[7,321],[194,502],[117,-510],[119,118],[-99,279],[87,287],[122,-128],[34,449],[152,291],[67,233],[140,101],[4,165],[122,-69],[5,148],[122,85],[134,80],[205,-271],[155,-350],[173,-4],[177,-56],[-59,325],[133,473],[126,155],[-44,147],[121,338],[168,208],[142,-70],[234,111],[-5,302],[-204,195],[148,86],[184,-147],[148,-242],[234,-151],[79,60],[172,-182],[162,169],[105,-51],[65,113],[127,-292],[-74,-316],[-105,-239],[-96,-20],[32,-236],[-81,-295],[-99,-291],[20,-166],[221,-327],[214,-189],[143,-204],[201,-350],[78,1],[145,-151],[43,-183],[265,-200],[183,202],[55,317],[56,262],[34,324],[85,470],[-39,286],[20,171],[-32,339],[37,445],[53,120],[-43,197],[67,313],[52,325],[7,168],[104,222],
 [78,-289],[19,-371],[70,-71],[11,-249],[101,-300],[21,-335],[-10,-214],[100,-464],[179,223],[92,-250],[133,-231],[-29,-262],[60,-506],[42,-295],[70,-72],[75,-505],[-27,-307],[90,-400],[301,-309],[197,-281],[186,-257],[-37,-143],[159,-371],[108,-639],[111,130],[113,-256],[68,91],[48,-626],[197,-363],[129,-226],[217,-478],[78,-475],[7,-337],[-19,-365],[132,-502],[-16,-523],[-48,-274],[-75,-527],[6,-339],[-55,-423],[-123,-538],[-205,-290],[-102,-458],[-93,-292],[-82,-510],[-107,-294],[-70,-442],[-36,-407],[14,-187],[-159,-205],[-311,-22],[-257,-242],[-127,-229],[-168,-254]],[[95110,44183],[-194,4],[-106,363],[166,-142],[56,-22],[78,-203]],[[83414,44519],[-368,414],[259,116],[146,-180],[97,-180],[-17,-159],[-117,-11]],[[94572,44733],[-170,60],[-58,91],[17,235],[183,-93],[91,-124],[45,-155],[-108,-14]],[[94868,44799],[-206,512],[-57,353],[94,0],[100,-473],[111,-283],[-42,-109]],[[84713,45326],[32,139],[239,133],[194,20],[87,74],[105,-74],[-102,-160],[-289,-258],[-233,-170]],[[84746,45030
 ],[-181,-441],[-238,-130],[-33,71],[25,201],[119,360],[275,235]],[[82576,45238],[-149,5],[95,340],[153,5],[74,209],[100,-158],[172,48],[69,-251],[-321,-119],[-193,-79]],[[83681,45301],[-370,73],[0,216],[220,123],[174,-177],[185,45],[249,216],[-41,-328],[-417,-168]],[[94421,45535],[-218,251],[-152,212],[-104,197],[41,60],[128,-142],[228,-272],[65,-187],[12,-119]],[[93704,46205],[-121,134],[-114,243],[14,99],[166,-250],[111,-193],[-56,-33]],[[81823,45409],[-306,238],[-251,-16],[-288,44],[-260,106],[-322,225],[-204,59],[-116,-74],[-506,243],[-48,254],[-255,44],[191,564],[337,-35],[224,-231],[115,-45],[38,-210],[533,-59],[61,244],[515,-284],[101,-383],[417,-108],[341,-351],[-317,-225]],[[87280,46506],[-27,445],[49,212],[58,200],[63,-173],[0,-282],[-143,-402]],[[93221,46491],[-120,227],[-122,375],[-59,450],[38,57],[30,-175],[84,-134],[135,-375],[131,-200],[-39,-166],[-78,-59]],[[91733,46847],[-148,1],[-228,171],[-158,165],[23,183],[249,-86],[152,46],[42,283],[40,15],[27,-314],[158,45],[7
 8,202],[155,211],[-30,348],[166,11],[56,-97],[-5,-327],[-93,-361],[-146,-48],[-44,-166],[-152,-144],[-142,-138]],[[85242,48340],[-192,108],[-54,254],[281,29],[69,-195],[-104,-196]],[[86342,48300],[-234,244],[-232,49],[-157,-39],[-192,21],[65,325],[344,24],[305,-172],[101,-452]],[[92451,47764],[-52,348],[-65,229],[-126,193],[-158,252],[-200,174],[77,143],[150,-166],[94,-130],[117,-142],[111,-248],[106,-189],[33,-307],[-87,-157]],[[89166,49043],[482,-407],[513,-338],[192,-302],[154,-297],[43,-349],[462,-365],[68,-313],[-256,-64],[62,-393],[248,-388],[180,-627],[159,20],[-11,-262],[215,-100],[-84,-111],[295,-249],[-30,-171],[-184,-41],[-69,153],[-238,66],[-281,89],[-216,377],[-158,325],[-144,517],[-362,259],[-235,-169],[-170,-195],[35,-436],[-218,-203],[-155,99],[-288,25]],[[89175,45193],[-247,485],[-282,118],[-69,-168],[-352,-18],[118,481],[175,164],[-72,642],[-134,496],[-538,500],[-229,50],[-417,546],[-82,-287],[-107,-52],[-63,216],[-1,257],[-212,290],[299,213],[198,-11],[-23,156],[-
 407,1],[-110,352],[-248,109],[-117,293],[374,143],[142,192],[446,-242],[44,-220],[78,-955],[287,-354],[232,627],[319,356],[247,1],[238,-206],[206,-212],[298,-113]],[[83276,47228],[-119,173],[79,544],[-43,570],[-117,4],[-86,405],[115,387],[40,469],[139,891],[58,243],[237,439],[217,-174],[350,-82],[319,25],[275,429],[48,-132],[-223,-587],[-209,-113],[-267,115],[-463,-29],[-243,-85],[-39,-447],[248,-526],[150,268],[518,201],[-22,-272],[-121,86],[-121,-347],[-245,-229],[263,-757],[-50,-203],[249,-682],[-2,-388],[-148,-173],[-109,207],[134,484],[-273,-229],[-69,164],[36,228],[-200,346],[21,576],[-186,-179],[24,-689],[11,-846],[-176,-85]],[[85582,50048],[-112,374],[-82,755],[56,472],[92,215],[20,-322],[164,-52],[26,-241],[-15,-517],[-143,58],[-42,-359],[114,-312],[-78,-71]],[[79085,47110],[-234,494],[-356,482],[-119,358],[-210,481],[-138,443],[-212,827],[-244,493],[-81,508],[-103,461],[-250,372],[-145,506],[-209,330],[-290,652],[-24,300],[178,-24],[430,-114],[246,-577],[215,-401],[153,-24
 6],[263,-635],[283,-9],[233,-405],[161,-495],[211,-270],[-111,-482],[159,-205],[100,-15],[47,-412],[97,-330],[204,-52],[135,-374],[-70,-735],[-11,-914],[-308,-12]],[[80461,51765],[204,-202],[214,110],[56,500],[119,112],[333,128],[199,467],[137,374]],[[81723,53254],[110,221],[236,323]],[[82069,53798],[214,411],[140,462],[112,2],[143,-299],[13,-257],[183,-165],[231,-177],[-20,-232],[-186,-29],[50,-289],[-205,-201]],[[82744,53024],[-158,-533],[204,-560],[-48,-272],[312,-546],[-329,-70],[-93,-403],[12,-535],[-267,-404],[-7,-589],[-107,-903],[-41,210],[-316,-266],[-110,361],[-198,34],[-139,189],[-330,-212],[-101,285],[-182,-32],[-229,68],[-43,793],[-138,164],[-134,505],[-38,517],[32,548],[165,392]],[[84832,53877],[-327,343],[-78,428],[84,280],[-176,280],[-87,-245],[-131,23],[-205,-330],[-46,173],[109,498],[175,166],[151,223],[98,-268],[212,162],[45,264],[196,15],[-16,457],[225,-280],[23,-297],[20,-218],[28,-392],[16,-332],[-94,-540],[-102,602],[-130,-300],[89,-435],[-79,-277]],[[72318,54
 106],[-132,470],[-49,849],[126,959],[192,-328],[129,-416],[134,-616],[-42,-615],[-116,-168],[-242,-135]],[[32841,56488],[-50,53],[81,163],[-6,233],[160,77],[58,-21],[-11,-440],[-232,-65]],[[84165,55910],[-171,409],[57,158],[70,165],[30,367],[153,35],[-44,-398],[205,570],[-26,-563],[-100,-195],[-87,-373],[-87,-175]],[[82548,55523],[136,414],[200,364],[167,409],[146,587],[49,-482],[-183,-325],[-146,-406],[-369,-561]],[[83889,56748],[-10,275],[20,301],[-43,282],[166,-183],[177,1],[-5,-247],[-129,-251],[-176,-178]],[[84666,56567],[-11,416],[-84,31],[-43,357],[163,-47],[-4,224],[-169,451],[266,-13],[77,-220],[78,-660],[-214,157],[5,-199],[68,-364],[-132,-133]],[[83683,57791],[-119,295],[-142,450],[238,-22],[97,-213],[-74,-510]],[[84465,57987],[-216,290],[-103,310],[-71,-217],[-177,354],[-253,-87],[-138,130],[14,244],[87,151],[-83,136],[-36,-213],[-137,340],[-41,257],[-11,566],[112,-195],[29,925],[90,535],[169,-1],[171,-168],[85,153],[26,-150],[-46,-245],[95,-423],[-73,-491],[-164,-196],[
 -43,-476],[62,-471],[147,-65],[123,70],[347,-328],[-27,-321],[91,-142],[-29,-272]],[[31337,61183],[-16,253],[40,86],[227,-3],[142,-52],[50,-118],[-71,-149],[-209,4],[-163,-21]],[[28554,61038],[-156,95],[-159,215],[34,135],[116,41],[64,-20],[187,-53],[147,-142],[46,-161],[-195,-11],[-84,-99]],[[30080,62227],[34,101],[217,-3],[165,-152],[73,15],[50,-209],[152,11],[-9,-176],[124,-21],[136,-217],[-103,-240],[-132,128],[-127,-25],[-92,28],[-50,-107],[-106,-37],[-43,144],[-92,-85],[-111,-405],[-71,94],[-14,170]],[[30081,61241],[-185,100],[-131,-41],[-169,43],[-130,-110],[-149,184],[24,190],[256,-82],[210,-47],[100,131],[-127,256],[2,226],[-175,92],[62,163],[170,-26],[241,-93]],[[80409,61331],[-228,183],[-8,509],[137,267],[304,166],[159,-14],[62,-226],[-122,-260],[-64,-341],[-240,-284]],[[6753,61756],[-69,84],[8,165],[-46,216],[14,65],[48,97],[-19,116],[16,55],[21,-11],[107,-100],[49,-51],[45,-79],[71,-207],[-7,-33],[-108,-126],[-89,-92],[-41,-99]],[[6551,62734],[-47,125],[-32,48],[-3,37],
 [27,50],[99,-56],[73,-90],[-23,-71],[-94,-43]],[[6447,63028],[-149,17],[21,72],[137,-26],[-9,-63]],[[6192,63143],[-19,8],[-97,21],[-35,133],[-11,24],[74,82],[23,-38],[80,-196],[-15,-34]],[[5704,63509],[-93,107],[14,43],[43,58],[64,-12],[5,-138],[-33,-58]],[[28401,62311],[186,329],[-113,154],[-179,39],[-96,171],[-66,336],[-157,-23],[-259,159],[-83,124],[-362,91],[-97,115],[104,148],[-273,30],[-199,-307],[-115,-8],[-40,-144],[-138,-65],[-118,56],[146,183],[60,213],[126,131],[142,116],[210,56],[67,65],[240,-42],[219,-7],[261,-201],[110,-216],[260,66],[98,-138],[235,-366],[173,-267],[92,8],[165,-120],[-20,-167],[205,-24],[210,-242],[-33,-138],[-185,-75],[-187,-29],[-191,46],[-398,-57]],[[28394,64588],[-70,340],[-104,171],[60,375],[84,-23],[97,-491],[1,-343],[-68,-29]],[[83540,63560],[-146,499],[-32,438],[163,581],[223,447],[127,-176],[-49,-357],[-167,-947],[-119,-485]],[[28080,66189],[-19,219],[130,47],[184,-18],[8,-153],[-303,-95]],[[28563,65870],[-51,75],[4,309],[-124,234],[-1,67],[22
 0,-265],[-48,-420]],[[86948,69902],[-181,168],[2,281],[154,352],[158,-68],[114,248],[204,-127],[35,-203],[-156,-357],[-114,189],[-143,-137],[-73,-346]],[[59437,71293],[8,-48],[-285,-240],[-136,77],[-64,237],[132,22]],[[59092,71341],[19,3],[40,143],[200,-8],[253,176],[-188,-251],[21,-111]],[[56867,71211],[3,98],[-339,115],[52,251],[152,-199],[216,34],[207,-42],[-7,-103],[151,71],[-35,-175],[-400,-50]],[[54194,72216],[-213,222],[-141,64],[-387,300],[38,304],[325,-54],[284,64],[211,51],[-100,-465],[41,-183],[-58,-303]],[[52446,73567],[-105,156],[-11,713],[-64,338],[153,-30],[139,183],[166,-419],[-39,-782],[-126,38],[-113,-197]],[[86301,68913],[-135,229],[69,533],[-176,172],[-113,405],[263,182],[145,371],[280,306],[203,403],[553,177],[297,-121],[291,1050],[185,-282],[408,591],[158,229],[174,723],[-47,664],[117,374],[295,108],[152,-819],[-9,-479],[-256,-595],[4,-610],[-104,-472],[48,-296],[-145,-416],[-355,-278],[-488,-36],[-396,-675],[-186,227],[-12,442],[-483,-130],[-329,-279],[-325,-1
 1],[282,-435],[-186,-1004],[-179,-248]],[[52563,75028],[-126,120],[-64,398],[56,219],[179,226],[47,-507],[-92,-456]],[[88876,75140],[-39,587],[138,455],[296,33],[81,817],[83,460],[326,-615],[213,-198],[195,-126],[197,250],[62,-663],[-412,-162],[-244,-587],[-436,404],[-152,-646],[-308,-9]],[[32535,77739],[-353,250],[-69,198],[105,183],[97,-288],[202,-79],[257,16],[-137,-242],[-102,-38]],[[32696,79581],[-360,186],[-258,279],[96,49],[365,-148],[284,-247],[8,-108],[-135,-11]],[[15552,79158],[-456,269],[-84,209],[-248,207],[-50,168],[-286,107],[-107,321],[24,137],[291,-129],[171,-89],[261,-63],[94,-204],[138,-280],[277,-244],[115,-327],[-140,-82]],[[35133,78123],[-183,111],[60,484],[-77,75],[-322,-513],[-166,21],[196,277],[-267,144],[-298,-35],[-539,18],[-43,175],[173,208],[-121,160],[234,356],[287,941],[172,336],[241,204],[129,-26],[-54,-160],[-148,-372],[-184,-517],[181,199],[187,-126],[-98,-206],[247,-162],[128,144],[277,-182],[-86,-433],[194,101],[36,-313],[86,-367],[-117,-520],[-125
 ,-22]],[[13561,81409],[-111,1],[-167,270],[-103,272],[-140,184],[-51,260],[16,188],[131,-76],[267,47],[-84,-671],[242,-475]],[[89469,77738],[-51,496],[31,575],[-32,638],[64,446],[13,790],[-163,581],[24,808],[257,271],[-110,274],[123,83],[73,-391],[96,-569],[-7,-581],[114,-597],[280,-1046],[-411,195],[-171,-854],[271,-605],[-8,-413],[-211,356],[-182,-457]],[[47896,83153],[233,24],[298,-365],[-149,-406]],[[48278,82406],[46,-422],[-210,-528],[-493,-349],[-393,89],[225,617],[-145,601],[378,463],[210,276]],[[53358,82957],[-291,333],[-39,246],[408,195],[88,-296],[-166,-478]],[[7221,84100],[-142,152],[-43,277],[252,210],[148,90],[185,-40],[117,-183],[-240,-281],[-277,-225]],[[48543,80097],[-148,118],[407,621],[249,127],[-436,99],[-79,235],[291,183],[-152,319],[52,387],[414,-54],[40,343],[-190,372],[-337,104],[-66,160],[101,264],[-92,163],[-149,-279],[-17,569],[-140,301],[101,611],[216,480],[222,-47],[335,49],[-297,-639],[283,81],[304,-3],[-72,-481],[-250,-530],[287,-38],[270,-759],[190,-95
 ],[171,-673],[79,-233],[337,-113],[-34,-378],[-142,-173],[111,-305],[-250,-310],[-371,6],[-473,-163],[-130,116],[-183,-276],[-257,67],[-195,-226]],[[3835,85884],[-182,110],[-168,161],[274,101],[220,-54],[27,-226],[-171,-92]],[[27873,86994],[-123,50],[-73,176],[13,41],[107,177],[114,-13],[70,-121],[-108,-310]],[[26925,87305],[-196,13],[-61,160],[207,273],[381,-6],[-6,-114],[-325,-326]],[[2908,87788],[-211,128],[-106,107],[-245,-34],[-66,52],[17,223],[171,-113],[173,61],[225,-156],[276,-79],[-23,-64],[-211,-125]],[[26243,87832],[-95,346],[-377,-57],[242,292],[35,465],[95,542],[201,-49],[51,-259],[143,91],[161,-155],[304,-203],[318,-184],[25,-281],[204,46],[199,-196],[-247,-186],[-432,142],[-156,266],[-275,-314],[-396,-306]],[[44817,88095],[-365,87],[-775,187],[273,261],[-605,289],[492,114],[-12,174],[-583,137],[188,385],[421,87],[433,-400],[422,321],[349,-167],[453,315],[461,-42],[-64,-382],[314,-403],[-361,-451],[-801,-405],[-240,-107]],[[28614,90223],[-69,289],[118,331],[255,82],[21
 7,-163],[3,-253],[-32,-82],[-180,-174],[-312,-30]],[[1957,88542],[-260,17],[-212,206],[-369,172],[-62,257],[-283,96],[-315,-76],[-151,207],[60,219],[-333,-140],[126,-278],[-158,-251],[0,2354],[681,-451],[728,-588],[-24,-367],[187,-147],[-64,429],[754,-88],[544,-553],[-276,-257],[-455,-61],[-7,-578],[-111,-122]],[[23258,91203],[-374,179],[-226,-65],[-380,266],[245,183],[194,256],[295,-168],[166,-106],[84,-112],[169,-226],[-173,-207]],[[99694,92399],[-49,187],[354,247],[0,-404],[-305,-30]],[[0,92429],[0,404],[36,24],[235,-1],[402,-169],[-24,-81],[-286,-141],[-363,-36]],[[26228,91219],[16,648],[394,-45]],[[26638,91822],[411,-87],[373,-293],[17,-293],[-207,-315],[196,-316],[-36,-288],[-544,-413],[-386,-91],[-287,178],[-83,-297],[-268,-498]],[[25824,89109],[-81,-258],[-322,-400]],[[25421,88451],[-397,-39],[-220,-250],[-18,-384],[-323,-74],[-340,-479],[-301,-665],[-108,-466]],[[23714,86094],[-15,-686],[408,-99]],[[24107,85309],[125,-553],[130,-448],[388,117],[517,-256],[277,-225],[199,-27
 9]],[[25743,83665],[348,-162],[294,-249]],[[26385,83254],[459,-34],[302,-58],[-45,-511],[86,-594],[201,-661],[414,-561],[214,192],[150,607],[-145,934],[-196,311],[445,276],[314,415],[154,411]],[[28738,83981],[-22,395],[-189,502]],[[28527,84878],[-338,445],[328,619],[-121,535],[-93,922],[194,137],[476,-161],[286,-57],[230,155],[258,-200],[342,-343],[85,-229],[495,-45],[-8,-496],[92,-747],[254,-92],[201,-348],[402,328],[266,652],[184,274],[216,-527],[362,-754],[307,-709],[-112,-371],[370,-333],[250,-338],[442,-152],[179,-189],[110,-500],[216,-78],[112,-223],[20,-664],[-202,-222],[-199,-207],[-458,-210],[-349,-486],[-470,-96],[-594,125],[-417,4],[-287,-41],[-233,-424],[-354,-262],[-401,-782],[-320,-545],[236,97],[446,776],[583,493]],[[31513,79609],[416,59],[245,-290]],[[32174,79378],[-262,-397],[88,-637],[91,-446],[361,-295],[459,86],[278,664],[19,-429],[180,-214],[-344,-387],[-615,-351],[-276,-239],[-310,-426],[-211,44],[-11,500],[483,488],[-445,-19],[-309,-72]],[[31350,77248],[48,-19
 4],[-296,-286],[-286,-204],[-293,-175]],[[30523,76389],[-159,-386],[-35,-98]],[[30329,75905],[-3,-313],[92,-313],[115,-15],[-29,216],[83,-131],[-22,-169],[-188,-96]],[[30377,75084],[-133,12],[-205,-104]],[[30039,74992],[-121,-29],[-162,-29],[-231,-171],[408,111],[82,-112],[-389,-177],[-177,-1],[8,72],[-84,-164],[82,-27],[-60,-424],[-203,-455],[-20,152]],[[29172,73738],[-61,31],[-91,147]],[[29020,73916],[57,-318]],[[29077,73598],[66,-106],[8,-222]],[[29151,73270],[-89,-230],[-157,-472],[-25,24],[86,402]],[[28966,72994],[-142,226],[-33,490]],[[28791,73710],[-53,-255],[59,-375]],[[28797,73080],[-175,88],[183,-186]],[[28805,72982],[12,-562],[79,-41],[29,-204],[39,-591],[-176,-439],[-288,-175],[-182,-346],[-139,-38],[-141,-217],[-39,-199],[-305,-383],[-157,-281],[-131,-351],[-43,-419],[50,-411],[92,-505],[124,-418],[1,-256],[132,-685],[-9,-398],[-12,-230],[-69,-361]],[[27672,65472],[-83,-74],[-137,71]],[[27452,65469],[-44,259]],[[27408,65728],[-106,136],[-147,508]],[[27155,66372],[-129,4
 52],[-42,231],[57,393],[-77,325],[-217,494]],[[26747,68267],[-108,91],[-281,-269]],[[26358,68089],[-49,30]],[[26309,68119],[-135,276],[-174,146]],[[26000,68541],[-314,-75],[-247,66],[-212,-41]],[[25227,68491],[-118,-83],[54,-166]],[[25163,68242],[-5,-240],[59,-117],[-53,-77],[-103,87],[-104,-112],[-202,18]],[[24755,67801],[-207,313],[-242,-74]],[[24306,68040],[-202,137],[-173,-42],[-234,-138],[-253,-438],[-276,-255],[-152,-282],[-63,-266],[-3,-407],[14,-284],[52,-201]],[[23016,65864],[1,-1],[-1,-1],[-107,-516]],[[22909,65346],[-49,-426],[-20,-791],[-27,-289],[48,-322],[86,-288],[56,-458],[184,-440],[65,-337],[109,-291],[295,-157],[114,-247],[244,165],[212,60],[208,106],[175,101],[176,241],[67,345],[22,496],[48,173],[188,155],[294,137],[246,-21],[169,50],[66,-125],[-9,-285],[-149,-351],[-66,-360],[51,-103],[-42,-255],[-69,-461],[-71,152],[-58,-10]],[[25472,61510],[1,-87],[53,-3],[-5,-160],[-45,-256],[24,-91],[-29,-212],[18,-56],[-32,-299],[-55,-156],[-50,-19],[-55,-205]],[[25297,5996
 6],[90,-107],[24,88],[82,-75]],[[25493,59872],[29,-23],[61,104],[79,8],[26,-48],[43,29],[129,-53]],[[25860,59889],[128,16],[90,65]],[[26078,59970],[32,66],[89,-31],[66,-40],[73,14],[55,51],[127,-82],[44,-13],[85,-110],[80,-132],[101,-91],[73,-162]],[[26903,59440],[-24,-57],[-14,-132],[29,-216],[-64,-202],[-30,-237],[-9,-261],[15,-152],[7,-266],[-43,-58],[-26,-253],[19,-156],[-56,-151],[12,-159],[43,-97]],[[26762,57043],[70,-321],[108,-238],[130,-252]],[[27070,56232],[100,-212]],[[27170,56020],[-6,-125],[111,-27]],[[27275,55868],[26,48],[77,-145],[136,42],[119,150],[168,119],[95,176],[153,-34],[-10,-58],[155,-21],[124,-102],[90,-177],[105,-164]],[[28513,55702],[143,-18],[209,412],[114,63],[3,195],[51,500],[159,274],[175,11],[22,123],[218,-49],[218,298],[109,132],[134,285],[98,-36],[73,-156],[-54,-199]],[[30185,57537],[-8,-139],[-163,-69],[91,-268],[-3,-309]],[[30102,56752],[-123,-343],[105,-469]],[[30084,55940],[120,38],[62,427],[-86,208],[-14,447],[346,241],[-38,278],[97,186],[100,-
 415],[195,-9],[180,-330],[11,-195],[249,-6],[297,61],[159,-264]],[[31762,56607],[213,-73],[155,184]],[[32130,56718],[4,149],[344,35],[333,9],[-236,-175],[95,-279],[222,-44],[210,-291],[45,-473],[144,13],[109,-139]],[[33400,55523],[183,-217],[171,-385],[8,-304],[105,-14],[149,-289],[109,-205]],[[34125,54109],[333,-119],[30,107],[225,43],[298,-159]],[[35011,53981],[95,-65],[204,-140],[294,-499],[46,-242]],[[35650,53035],[95,28],[69,-327],[155,-1033],[149,-97],[7,-408],[-208,-487],[86,-178],[491,-92],[10,-593],[211,388],[349,-212],[462,-361],[135,-346],[-45,-327],[323,182],[540,-313],[415,23],[411,-489],[355,-662],[214,-170],[237,-24],[101,-186],[94,-752],[46,-358],[-110,-977],[-142,-385],[-391,-822],[-177,-668],[-206,-513],[-69,-11],[-78,-435],[20,-1107],[-77,-910],[-30,-390],[-88,-233],[-49,-790],[-282,-771],[-47,-610],[-225,-256],[-65,-355],[-302,2],[-437,-227],[-195,-263],[-311,-173],[-327,-470],[-235,-586],[-41,-441],[46,-326],[-51,-597],[-63,-289],[-195,-325],[-308,-1040],[-244,-
 468],[-189,-277],[-127,-562],[-183,-337]],[[35174,30629],[-121,-372],[-313,-328],[-205,118],[-151,-63],[-256,253],[-189,-19],[-169,327]],[[33770,30545],[-19,-308],[353,-506],[-38,-408],[173,-257],[-14,-289],[-267,-757],[-412,-317],[-557,-123],[-305,59],[59,-352],[-57,-442],[51,-298],[-167,-208],[-284,-82],[-267,216],[-108,-155],[39,-587],[188,-178],[152,186],[82,-307],[-255,-183],[-223,-367],[-41,-595],[-66,-316],[-262,-2],[-218,-302],[-80,-443]],[[31227,23224],[274,-433],[265,-119]],[[31766,22672],[-96,-531],[-328,-333],[-180,-692],[-254,-234],[-113,-276],[89,-614],[185,-342],[-117,30]],[[30952,19680],[-247,4],[-134,-145],[-250,-213],[-45,-552],[-118,-14],[-313,192],[-318,412],[-346,338],[-87,374],[79,346],[-140,393],[-36,1007],[119,568],[293,457],[-422,172],[265,522],[94,982],[309,-208],[145,1224],[-186,157],[-87,-738],[-175,83],[87,845],[95,1095],[127,404]],[[29661,27385],[-79,576],[-23,666]],[[29559,28627],[117,19],[170,954],[192,945],[118,881],[-64,885],[83,487],[-34,730],[163,
 721],[50,1143],[89,1227],[87,1321],[-20,967],[-58,832]],[[30452,39739],[-279,340],[-24,242],[-551,593],[-498,646],[-214,365],[-115,488],[46,170],[-236,775],[-274,1090],[-262,1177],[-114,269],[-87,435],[-216,386],[-198,239],[90,264],[-134,563],[86,414],[221,373]],[[27693,48568],[148,442],[-60,258],[-106,-275],[-166,259],[56,167],[-47,536],[97,89],[52,368],[105,381],[-20,241],[153,126],[190,236]],[[28095,51396],[-37,183],[103,44],[-12,296],[65,214],[138,40],[117,371],[106,310],[-102,141],[52,343],[-62,540],[59,155],[-44,500],[-112,315]],[[28366,54848],[-93,170],[-59,319],[68,158],[-70,40]],[[28212,55535],[-52,195],[-138,165]],[[28022,55895],[-122,-38],[-56,-205],[-112,-149],[-61,-20],[-27,-123],[132,-321],[-75,-76],[-40,-87],[-130,-30],[-48,353],[-36,-101],[-92,35],[-56,238],[-114,39],[-72,69],[-119,-1],[-8,-128],[-32,89]],[[26954,55439],[-151,131],[-56,124],[32,103],[-11,130],[-77,142],[-109,116],[-95,76],[-19,173],[-73,105],[18,-172],[-55,-141],[-64,164],[-89,58],[-38,120],[2,179],[
 36,187],[-78,83],[64,114]],[[26191,57131],[-96,186],[-130,238],[-61,200],[-117,185],[-140,267]],[[25647,58207],[31,92],[46,-89]],[[25724,58210],[21,41]],[[25745,58251],[-48,185]],[[25697,58436],[-84,52],[-31,-140]],[[25582,58348],[-161,9],[-100,57],[-115,117],[-154,37],[-79,127]],[[24973,58695],[-142,103],[-174,11],[-127,117],[-149,244]],[[24381,59170],[-314,636]],[[24067,59806],[-144,192],[-226,154]],[[23697,60152],[-156,-43],[-223,-223],[-140,-58],[-196,156],[-208,112],[-260,271],[-208,83],[-314,275],[-233,282],[-70,158],[-155,35],[-284,187],[-116,270],[-299,335],[-139,373],[-66,288],[93,57],[-29,169],[64,153],[1,204],[-93,266],[-25,235],[-94,298],[-244,587],[-280,462],[-135,368],[-238,241],[-51,145],[42,365]],[[19641,66203],[-142,137],[-164,288]],[[19335,66628],[-69,412],[-149,48],[-162,311],[-130,288],[-12,184],[-149,446],[-99,452],[5,227]],[[18570,68996],[-201,235],[-93,-26]],[[18276,69205],[-159,163],[-44,-240],[46,-284],[27,-444],[95,-243],[206,-407],[46,-139],[42,-42],[37,-2
 03],[49,8],[56,-381],[85,-150],[59,-210],[174,-300],[92,-550],[83,-259],[77,-277],[15,-311],[134,-20],[112,-268],[100,-264],[-6,-106],[-117,-217],[-49,3],[-74,359]],[[19362,64423],[-182,337],[-200,286]],[[18980,65046],[-142,150],[9,432],[-42,320],[-132,183],[-191,264],[-37,-76],[-70,154],[-171,143],[-164,343],[20,44],[115,-33],[103,221],[10,266],[-214,422],[-163,163],[-102,369],[-103,388],[-129,472],[-113,531]],[[17464,69802],[-46,302],[-180,340],[-130,71],[-30,169],[-156,30],[-100,159],[-258,59]],[[16564,70932],[-70,95],[-34,324]],[[16460,71351],[-270,594],[-231,821],[10,137],[-123,195],[-215,495],[-38,482],[-148,323],[61,489],[-10,507],[-89,453],[109,557],[67,1072],[-50,792],[-88,506],[-80,274],[33,115],[402,-200],[148,-558]],[[15948,78405],[68,156],[-44,485],[-94,484]],[[15878,79530],[-38,1],[-537,581],[-199,255]],[[15104,80367],[-503,245],[-155,523],[40,362]],[[14486,81497],[-356,252],[-48,476],[-336,429],[-6,304]],[[13740,82958],[-153,223],[-245,188],[-78,515],[-358,478],[-150,
 558],[-267,38],[-441,15],[-326,170],[-574,613],[-266,112],[-486,211]],[[10396,86079],[-385,-50],[-546,271]],[[9465,86300],[-330,252],[-309,-125],[58,-411],[-154,-38],[-321,-123],[-245,-199]],[[8164,85656],[-307,-126],[-40,348]],[[7817,85878],[125,580],[295,182],[-76,148],[-354,-329],[-190,-394],[-400,-420],[203,-287],[-262,-424]],[[7158,84934],[-299,-247],[-278,-181]],[[6581,84506],[-69,-261],[-434,-305],[-87,-278],[-325,-252],[-191,45],[-259,-165],[-282,-201],[-231,-197],[-477,-169],[-43,99],[304,276],[271,182],[296,324],[345,66],[137,243],[385,353],[62,119],[205,208],[48,448],[141,349],[-320,-179],[-90,102],[-150,-215],[-181,300],[-75,-212],[-104,294],[-278,-236],[-170,0],[-24,352]],[[4985,85596],[50,217],[-179,210]],[[4856,86023],[-361,-113],[-235,277],[-190,142],[-1,334],[-214,252],[108,340],[226,330],[99,303],[225,43],[191,-94],[224,285],[201,-51],[212,183],[-52,270],[-155,106],[205,228],[-170,-7],[-295,-128],[-85,-131],[-219,131],[-392,-67],[-407,142],[-117,238],[-351,343],[39
 0,247],[620,289],[228,0]],[[4541,89915],[-38,-295],[586,22]],[[5089,89642],[-225,366]],[[4864,90008],[-342,226],[-197,295]],[[4325,90529],[-267,252],[-381,187],[155,309],[493,19],[350,270],[66,287],[284,281],[271,68],[526,262],[256,-40],[427,315],[421,-124],[201,-266],[123,114],[469,-35],[-16,-136],[425,-101],[283,59],[585,-186],[534,-56],[214,-77],[370,96],[421,-177],[302,-83]],[[10837,91767],[518,-142]],[[11355,91625],[438,-284],[289,-55]],[[12082,91286],[244,247],[336,184],[413,-72],[416,259],[455,148],[191,-245],[207,138],[62,278],[192,-63],[470,-530],[369,401]],[[15437,92031],[38,-448],[341,96]],[[15816,91679],[105,173],[337,-34],[424,-248],[650,-217],[383,-100],[272,38]],[[17987,91291],[375,-300],[-391,-293]],[[17971,90698],[502,-127],[750,70],[236,103],[296,-354],[302,299],[-283,251],[179,202],[338,27],[223,59],[224,-141],[279,-321],[310,47],[491,-266],[431,94],[405,-14],[-32,367],[247,103],[431,-200],[-2,-559],[177,471],[223,-16],[126,594],[-298,364],[-324,239],[22,653],[329
 ,429],[366,-95],[281,-261],[378,-666],[-247,-290],[517,-120],[-1,-604],[371,463],[332,-380],[-83,-438],[269,-399],[290,427],[202,510]],[[19722,91216],[-824,-103],[-374,-41]],[[18524,91072],[-151,279],[-379,161],[-246,-66],[-343,468],[185,62],[429,101],[392,-26],[362,103],[-537,138],[-594,-47],[-394,12],[-146,217],[644,237],[-428,-9],[-485,156],[233,443],[193,235],[744,359],[284,-114],[-139,-277],[618,179],[386,-298],[314,302],[254,-194],[227,-580],[140,244],[-197,606],[244,86],[276,-94],[311,-239],[175,-575],[86,-417],[466,-293],[502,-279],[-31,-260],[-456,-48],[178,-227],[-94,-217],[-503,93],[-478,160],[-322,-36],[-522,-201]],[[20728,93568],[-434,413],[95,83],[372,24],[211,-130],[-244,-390]],[[27920,93557],[-80,36],[-306,313],[12,213],[133,39],[636,-63],[479,-325],[25,-163],[-296,17],[-299,13],[-304,-80]],[[31620,87170],[-753,236],[-596,343],[-337,287],[97,167],[-414,304],[-405,286],[5,-171],[-803,-94],[-235,203],[183,435],[522,10],[571,76],[-92,211],[96,294],[360,576],[-77,261],[-
 107,203],[-425,286],[-563,201],[178,150],[-294,367],[-245,34],[-219,201],[-149,-175],[-503,-76],[-1011,132],[-588,174],[-450,89],[-231,207],[290,270],[-394,2],[-88,599],[213,528],[286,241],[717,158],[-204,-382],[219,-369],[256,477],[704,242],[477,-611],[-42,-387],[550,172],[263,235],[616,-299],[383,-282],[36,-258],[515,134],[290,-376],[670,-234],[242,-238],[263,-553],[-510,-275],[654,-386],[441,-130],[400,-543],[437,-39],[-87,-414],[-487,-687],[-342,253],[-437,568],[-359,-74],[-35,-338],[292,-344],[377,-272],[114,-157],[181,-584],[-96,-425],[-350,160],[-697,473],[393,-509],[289,-357],[45,-206]],[[22678,92689],[-268,50],[-192,225],[-690,456],[5,189],[567,-73],[-306,386],[329,286],[331,-124],[496,75],[72,-172],[-259,-283],[420,-254],[-50,-532],[-455,-229]],[[89468,93831],[-569,66],[-49,31],[263,234],[348,54],[394,-226],[34,-155],[-421,-4]],[[23814,93133],[-317,22],[-173,519],[4,294],[145,251],[276,161],[579,-20],[530,-144],[-415,-526],[-331,-115],[-298,-442]],[[15808,92470],[-147,259]
 ,[-641,312]],[[15020,93041],[93,193],[218,489]],[[15331,93723],[241,388],[-272,362],[939,93],[397,-123],[709,-33],[270,-171],[298,-249],[-349,-149],[-681,-415],[-344,-414]],[[16539,93012],[0,-248],[-731,-294]],[[91548,94707],[-444,53],[-516,233],[66,192],[518,-89],[697,-155],[-321,-234]],[[23845,94650],[-403,44],[-337,155],[148,266],[399,159],[243,-208],[101,-187],[-151,-229]],[[88598,94662],[-550,384],[149,406],[366,111],[734,-26],[1004,-313],[-219,-439],[-1023,16],[-461,-139]],[[22275,94831],[-298,94],[5,345],[-455,-46],[-18,457],[299,-18],[419,201],[390,-34],[22,77],[212,-273],[9,-303],[-127,-440],[-458,-60]],[[18404,94533],[-35,193],[577,261],[-1255,-70],[-389,106],[379,577],[262,165],[782,-199],[493,-350],[485,-45],[-397,565],[255,215],[286,-68],[94,-282],[109,-210],[247,99],[291,-26],[49,-289],[-169,-281],[-940,-91],[-701,-256],[-423,-14]],[[65817,92311],[-907,77],[-74,262],[-503,158],[-40,320],[284,126],[-10,323],[551,503],[-255,73],[665,518],[-75,268],[621,312],[917,380],[92
 5,110],[475,220],[541,76],[193,-233],[-187,-184],[-984,-293],[-848,-282],[-863,-562],[-414,-577],[-435,-568],[56,-491],[531,-484],[-164,-52]],[[25514,94532],[-449,73],[-738,190],[-96,325],[-34,293],[-279,258],[-574,72],[-322,183],[104,242],[573,-37],[308,-190],[547,1],[240,-194],[-64,-222],[319,-134],[177,-140],[374,-26],[406,-50],[441,128],[566,51],[451,-42],[298,-223],[62,-244],[-174,-157],[-414,-127],[-355,72],[-797,-91],[-570,-11]],[[16250,95423],[-377,128],[472,442],[570,383],[426,-9],[381,87],[-38,-454],[-214,-205],[-259,-29],[-517,-252],[-444,-91]],[[81143,94175],[250,112],[142,-379]],[[81535,93908],[122,153],[444,93],[892,-97],[67,-276],[1162,-88],[15,451]],[[84237,94144],[590,-103],[443,3]],[[85270,94044],[449,-312],[128,-378],[-165,-247],[349,-465],[437,-240],[268,620],[446,-266],[473,159],[538,-182],[204,166],[455,-83],[-201,549],[367,256],[2509,-384],[236,-351],[727,-451],[1122,112],[553,-98],[231,-244],[-33,-432],[342,-168],[372,121],[492,15],[525,-116],[526,66],[484,-5
 26],[344,189],[-224,378]],[[97224,91732],[123,263],[886,-166]],[[98233,91829],[578,36],[799,-282],[389,-258],[0,-2354],[-2,-3],[-357,-260],[-360,44],[250,-315],[166,-487],[128,-159],[32,-244],[-71,-157],[-518,129],[-777,-445],[-247,-69],[-425,-415],[-403,-362],[-102,-269],[-397,409],[-724,-464]],[[96192,85904],[-126,220],[-268,-254]],[[95798,85870],[-371,81],[-90,-388],[-333,-572],[10,-239],[316,-132],[-37,-860],[-258,-22],[-119,-494],[116,-255]],[[95032,82989],[-486,-301],[-96,-675]],[[94450,82013],[-415,-144],[-83,-600],[-400,-551],[-103,407],[-119,862],[-155,1313],[134,819],[234,353]],[[93543,84472],[15,276],[431,132]],[[93989,84880],[496,744],[479,608],[499,471],[223,833],[-337,-50],[-167,-487]],[[95182,86999],[-705,-648],[-227,726]],[[94250,87077],[-717,-201],[-696,-990],[230,-362],[-620,-154],[-430,-61],[20,427],[-431,90],[-344,-291],[-850,102]],[[90412,85637],[-913,-175],[-900,-1153]],[[88599,84309],[-1065,-1394],[438,-74],[136,-370],[270,-132]],[[88378,82339],[178,296],[305,
 -39]],[[88861,82596],[401,-650]],[[89262,81946],[9,-502],[-217,-591]],[[89054,80853],[-23,-705],[-126,-945],[-418,-855],[-94,-409],[-377,-688],[-374,-682],[-179,-349],[-370,-346],[-175,-8],[-175,287],[-373,-432],[-43,-197]],[[86327,75524],[-106,36]],[[86221,75560],[-120,-201],[-83,-201]],[[86018,75158],[10,-424],[-143,-130],[-50,-105],[-104,-174],[-185,-97],[-121,-159],[-9,-256],[-32,-65],[111,-96],[157,-259]],[[85652,73393],[240,-697],[68,-383],[3,-681],[-105,-325],[-252,-113],[-222,-245],[-250,-51],[-31,322]],[[85103,71220],[52,443],[-123,615]],[[85032,72278],[206,99],[-190,506]],[[85048,72883],[-135,113],[-34,-112]],[[84879,72884],[-81,-49],[-10,112],[-72,54],[-75,94]],[[84641,73095],[77,260],[65,69]],[[84783,73424],[-25,108],[71,319]],[[84829,73851],[-18,97],[-163,64]],[[84648,74012],[-131,158]],[[84517,74170],[-388,-171],[-204,-277],[-300,-161],[148,274],[-58,230],[220,397],[-147,310],[-242,-209],[-314,-411],[-171,-381],[-272,-29],[-142,-275],[147,-400],[227,-97],[9,-265]],[[83
 030,72705],[220,-172],[311,421]],[[83561,72954],[247,-230],[179,-15]],[[83987,72709],[46,-310],[-394,-165]],[[83639,72234],[-130,-319],[-270,-296],[-142,-414]],[[83097,71205],[299,-324],[109,-582]],[[83505,70299],[169,-541],[189,-454],[-5,-439],[-174,-161],[66,-315],[164,-184],[-43,-481],[-71,-468],[-155,-53],[-203,-640],[-225,-775],[-258,-705],[-382,-545],[-386,-498],[-313,-68],[-170,-262],[-96,192],[-157,-294],[-388,-296],[-294,-90],[-95,-624],[-154,-35],[-73,429],[66,228]],[[80517,63220],[-373,190],[-131,-97]],[[80013,63313],[-371,-505],[-231,-558],[-61,-410],[212,-623],[260,-772],[252,-365],[169,-475],[127,-1093],[-37,-1039],[-232,-389],[-318,-381],[-227,-492],[-346,-550],[-101,378],[78,401],[-206,335]],[[78981,56775],[-233,87],[-112,307],[-141,611]],[[78495,57780],[-249,271],[-238,-11],[41,464],[-245,-3],[-22,-650],[-150,-863],[-90,-522],[19,-428],[181,-18],[113,-539],[50,-512],[155,-338],[168,-69],[144,-306]],[[78372,54256],[64,-56],[164,-356],[116,-396],[16,-398],[-29,-269],[
 27,-203],[20,-349],[98,-163],[109,-523],[-5,-199],[-197,-40],[-263,438],[-329,469],[-32,301],[-161,395],[-38,489],[-100,322],[30,431],[-61,250]],[[77801,54399],[-110,227],[-47,292],[-148,334],[-135,280],[-45,-347],[-53,328],[30,369],[82,566]],[[77375,56448],[-27,439],[86,452],[-94,350],[23,644],[-113,306],[-90,707],[-50,746],[-121,490],[-183,-297],[-315,-421],[-156,53],[-172,138],[96,732],[-58,554],[-218,681],[34,213],[-163,76],[-197,481]],[[75657,62792],[-79,309],[-16,301],[-53,284]],[[75509,63686],[-116,344],[-256,23],[25,-243],[-87,-329],[-118,120],[-41,-108],[-78,65],[-108,53]],[[74730,63611],[-39,-216],[-189,7],[-343,-122],[16,-445],[-148,-349],[-400,-398],[-311,-695],[-209,-373]],[[73107,61020],[-276,-386],[-1,-272]],[[72830,60362],[-138,-146]],[[72692,60216],[-250,-212],[-130,-31]],[[72312,59973],[-84,-450],[58,-769],[15,-490],[-118,-561],[-1,-1004],[-144,-29],[-126,-450],[84,-195]],[[71996,56025],[-253,-167],[-93,-402]],[[71650,55456],[-112,-170],[-263,552],[-128,827],[-107,
 596],[-97,279],[-148,568],[-69,739],[-48,369],[-253,811],[-115,1145],[-83,756],[1,716],[-54,553],[-404,-353],[-196,70],[-362,716],[133,214],[-82,232],[-326,501]],[[68937,64577],[-203,150]],[[68734,64727],[-83,425],[-215,449]],[[68436,65601],[-512,-111],[-451,-11],[-391,-83]],[[67082,65396],[-523,179]],[[66559,65575],[-302,136],[-314,76]],[[65943,65787],[-118,725],[-133,105],[-214,-106],[-280,-286],[-339,196],[-281,454],[-267,168],[-186,561],[-205,788],[-149,-96],[-177,196]],[[63594,68492],[-103,-231],[-165,29]],[[63326,68290],[58,-261],[-25,-135],[89,-445]],[[63448,67449],[109,-510],[137,-135],[47,-207]],[[63741,66597],[190,-248],[16,-244]],[[63947,66105],[-27,-197],[35,-199],[80,-165],[37,-194],[41,-145]],[[64113,65205],[-18,430],[75,310],[76,64]],[[64246,66009],[84,-186],[5,-345]],[[64335,65478],[-61,-348]],[[64274,65130],[53,-226]],[[64327,64904],[49,29],[11,-162],[217,93],[230,-15],[168,-18],[190,400],[207,379],[176,364]],[[65575,65974],[80,201],[35,-51],[-26,-244],[-37,-108]],[
 [65627,65772],[38,-466]],[[65665,65306],[125,-404],[155,-214]],[[65945,64688],[204,-78],[164,-107]],[[66313,64503],[125,-339],[75,-196],[100,-75],[-1,-132],[-101,-352],[-44,-166],[-117,-189],[-104,-404],[-126,31],[-58,-141],[-44,-300],[34,-395],[-26,-72],[-128,2],[-174,-221],[-27,-288],[-63,-125],[-173,5],[-109,-149]],[[65352,60997],[1,-239],[-134,-164]],[[65219,60594],[-153,56],[-186,-199]],[[64880,60451],[-128,-33],[-201,-159]],[[64551,60259],[-54,-263],[-6,-201],[-277,-249],[-444,-276],[-249,-417]],[[63521,58853],[-122,-32],[-83,34]],[[63316,58855],[-163,-245]],[[63153,58610],[-177,-113],[-233,-31]],[[62743,58466],[-70,-34],[-61,-156],[-73,-43]],[[62539,58233],[-42,-150],[-138,13]],[[62359,58096],[-89,-80],[-192,30],[-72,345],[8,323],[-46,174],[-54,437],[-80,243],[56,29],[-29,270],[34,114],[-12,257]],[[61883,60238],[-36,253],[-84,177]],[[61763,60668],[-22,236],[-143,212],[-148,495],[-79,482],[-192,406],[-124,97],[-184,563],[-32,411],[12,350],[-159,655],[-130,231],[-150,122],[-92,
 339],[15,133]],[[60335,65400],[-77,307],[-81,131]],[[60177,65838],[-108,440],[-170,476],[-141,406],[-139,-3],[44,325],[12,206],[34,236]],[[59709,67924],[-9,86]],[[59700,68010],[-78,-238],[-60,-446],[-75,-308],[-65,-103],[-93,191],[-125,263],[-198,847],[-29,-53],[115,-624],[171,-594],[210,-920],[102,-321],[90,-334],[249,-654],[-55,-103],[9,-384],[323,-530],[49,-121]],[[60240,63578],[90,-580],[-61,-107],[40,-608],[102,-706],[106,-145],[152,-219]],[[60669,61213],[161,-683],[77,-543]],[[60907,59987],[152,-288],[379,-558],[154,-336],[151,-341],[87,-203],[136,-178]],[[61966,58083],[66,-183],[-9,-245],[-158,-142],[119,-161]],[[61984,57352],[91,-109]],[[62075,57243],[54,-244],[125,-248]],[[62254,56751],[138,-2],[262,151],[302,70],[245,184],[138,39],[99,108],[158,20]],[[63596,57321],[89,12],[128,88],[147,59],[132,202],[105,2],[6,-163],[-25,-344],[1,-310],[-59,-214],[-78,-639],[-134,-659],[-172,-755],[-238,-866],[-237,-661],[-327,-806],[-278,-479],[-415,-586],[-259,-450],[-304,-715],[-64,-312
 ],[-63,-140]],[[61551,49585],[-195,-236],[-68,-246],[-104,-44],[-40,-416],[-89,-238],[-54,-393],[-112,-195]],[[60889,47817],[-128,-728],[16,-335],[178,-216],[8,-153],[-76,-357],[16,-180],[-18,-282],[97,-370],[115,-583],[101,-129]],[[61198,44484],[45,-265],[-11,-588],[34,-519],[11,-923],[49,-290],[-83,-422],[-108,-410],[-177,-366],[-254,-225],[-313,-287],[-313,-634],[-107,-108],[-194,-420],[-115,-136],[-23,-421],[132,-448],[54,-346],[4,-177],[49,29],[-8,-579]],[[59870,36949],[-45,-274],[65,-102]],[[59890,36573],[-41,-246],[-116,-210]],[[59733,36117],[-229,-199],[-334,-320],[-122,-219],[24,-248],[71,-40],[-24,-311]],[[59119,34780],[-70,-430],[-32,-491],[-72,-267],[-190,-298],[-54,-86],[-118,-300],[-77,-303],[-158,-424],[-314,-609],[-196,-355]],[[57838,31217],[-209,-269],[-291,-229]],[[57338,30719],[-141,-31],[-36,-164],[-169,88],[-138,-113],[-301,114],[-168,-72],[-115,31],[-286,-233],[-238,-94],[-171,-223],[-127,-14],[-117,210],[-94,11],[-120,264],[-13,-82],[-37,159],[2,346],[-90,396]
 ,[89,108],[-7,453],[-182,553],[-139,501],[-1,1],[-199,768]],[[54540,33696],[-207,446],[-108,432],[-62,575],[-68,428],[-93,910],[-7,707],[-35,322],[-108,243],[-144,489],[-146,708],[-60,371],[-226,577],[-17,453]],[[53259,40357],[-26,372],[38,519],[96,541],[15,254],[90,532],[66,243],[159,386],[90,263],[29,438],[-15,335],[-83,211],[-74,358],[-68,355],[15,122],[85,235],[-84,570],[-57,396],[-139,374],[26,115]],[[53422,46976],[-39,183]],[[53383,47159],[-74,444]],[[53309,47603],[-228,626]],[[53081,48229],[-285,596],[-184,488],[-169,610],[9,196],[61,189],[67,430],[56,438]],[[52636,51176],[-52,90],[96,663]],[[52680,51929],[40,467],[-108,390]],[[52612,52786],[-127,100],[-56,265]],[[52429,53151],[-71,85],[3,163]],[[52361,53399],[-289,-213]],[[52072,53186],[-105,32],[-107,-133]],[[51860,53085],[-222,13],[-149,370],[-91,427]],[[51398,53895],[-197,390],[-209,-8]],[[50992,54277],[-245,1]],[[50747,54278],[-229,-69]],[[50518,54209],[-224,-126]],[[50294,54083],[-436,-346],[-154,-203],[-250,-171],[-248
 ,168]],[[49206,53531],[-126,-7],[-194,116],[-178,-7],[-329,-103],[-193,-170],[-275,-217],[-54,15]],[[47857,53158],[-73,-5],[-286,282]],[[47498,53435],[-252,450],[-237,323]],[[47009,54208],[-187,381]],[[46822,54589],[-75,44],[-200,238],[-144,316],[-49,216],[-34,437]],[[46320,55840],[-122,349],[-108,232],[-71,76],[-69,118],[-32,261],[-41,130],[-80,97]],[[45797,57103],[-149,247],[-117,39],[-63,166],[1,90],[-84,125],[-18,127]],[[45367,57897],[-46,453]],[[45321,58350],[36,262]],[[45357,58612],[-115,460],[-138,210],[122,112],[134,415],[66,304]],[[45426,60113],[-24,318],[78,291],[34,557],[-30,583],[-34,294],[28,295],[-72,281],[-146,255]],[[45260,62987],[12,249]],[[45272,63236],[13,274],[106,161],[91,308],[-18,200],[96,417],[155,376],[93,95],[74,344],[6,315],[100,365],[185,216],[177,603],[144,235]],[[46494,67145],[259,66],[219,403],[139,158]],[[47111,67772],[232,493],[-70,735],[106,508],[37,312],[179,399],[278,270],[206,244],[186,612],[87,362],[205,-2],[167,-251],[264,41],[288,-131],[121,-6
 ]],[[49397,71358],[267,323],[300,102],[175,244],[268,180],[471,105],[459,48],[140,-87],[262,232],[297,5],[113,-137],[190,35]],[[52339,72408],[302,239],[195,-71],[-9,-299],[236,217],[20,-113]],[[53083,72381],[-139,-289],[-2,-274]],[[52942,71818],[96,-147],[-36,-511],[-183,-297],[53,-322],[143,-10],[70,-281],[106,-92]],[[53191,70158],[326,-204],[117,51],[232,-98],[368,-264],[130,-526],[250,-114],[391,-248],[296,-293],[136,153],[133,272],[-65,452],[87,288],[200,277],[192,80],[375,-121],[95,-264],[104,-2],[88,-101]],[[56646,69496],[276,-69],[68,-196]],[[56990,69231],[369,10],[268,-156],[275,-175],[129,-92],[214,188],[114,169],[245,49],[198,-75],[75,-293],[65,193],[222,-140],[217,-33],[137,149]],[[59518,69025],[80,194],[-19,34],[74,276],[56,446],[40,149],[8,6]],[[59757,70130],[99,482],[138,416],[5,21]],[[59999,71049],[-26,452],[68,243]],[[60041,71744],[-102,268],[105,222],[-169,-51],[-233,136],[-191,-340],[-421,-66],[-225,317],[-300,20],[-64,-245]],[[58441,72005],[-192,-71],[-268,315]],[
 [57981,72249],[-303,-10],[-165,587]],[[57513,72826],[-203,328],[135,459],[-176,283],[308,565],[428,23],[117,449],[529,-78],[334,383],[324,167],[459,13]],[[59768,75418],[485,-416],[399,-229]],[[60652,74773],[323,91],[239,-53],[328,309]],[[61542,75120],[42,252],[-70,403],[-160,218],[-154,68],[-102,181]],[[61098,76242],[-354,499],[-317,223],[-240,347],[202,95],[231,494],[-156,234],[410,241],[-8,129],[-249,-95]],[[60617,78409],[-222,-48],[-185,-191],[-260,-31],[-239,-220],[16,-368],[136,-142],[284,35],[-55,-210],[-304,-103],[-377,-342],[-154,121],[61,277],[-304,173],[50,113],[265,197],[-80,135],[-432,149],[-19,221],[-257,-73],[-103,-325],[-215,-437]],[[58223,77340],[6,-152],[-135,-128],[-84,56],[-78,-713]],[[57932,76403],[-144,-245],[-101,-422],[89,-337]],[[57776,75399],[33,-228],[243,-190],[-51,-145],[-330,-33],[-118,-182],[-232,-319]],[[57321,74302],[-87,275],[3,122]],[[57237,74699],[-169,17],[-145,56],[-336,-154],[192,-332],[-141,-96]],[[56638,74190],[-154,0],[-147,304]],[[56337,7449
 4],[-52,-130],[62,-353],[139,-277]],[[56486,73734],[-105,-130],[155,-272]],[[56536,73332],[137,-171],[4,-334],[-257,157],[82,-302],[-176,-62],[105,-521]],[[56431,72099],[-184,-7],[-228,257],[-104,472]],[[55915,72821],[-49,393],[-108,272],[-143,337],[-18,168]],[[55597,73991],[-48,41],[-5,130],[-154,199],[-24,281],[23,403],[38,184]],[[55427,75229],[-46,93],[-59,46]],[[55322,75368],[-78,192],[-120,118]],[[55124,75678],[-261,218],[-161,213],[-254,176]],[[54448,76285],[-233,435],[56,44]],[[54271,76764],[-127,248],[-5,200],[-179,93],[-85,-255],[-82,198],[6,205],[10,9]],[[53809,77462],[62,54]],[[53871,77516],[-221,86],[-226,-210],[15,-293],[-34,-168],[91,-301],[261,-298],[140,-488],[309,-476],[217,3],[68,-130],[-78,-118]],[[54413,75123],[249,-213],[204,-179]],[[54866,74731],[238,-308],[29,-111],[-52,-211],[-154,276],[-242,97],[-116,-382],[200,-219],[-33,-309],[-116,-35],[-148,-506],[-116,-46],[1,181],[57,317],[60,126],[-108,342],[-85,298],[-115,74],[-82,255],[-179,107],[-120,238],[-206,38]
 ,[-217,267],[-254,384]],[[53108,75604],[-189,341],[-86,584]],[[52833,76529],[-138,68],[-226,195],[-128,-80],[-161,-274],[-115,-43]],[[52065,76395],[-252,-334],[-548,160],[-404,-192],[-32,-355]],[[50829,75674],[15,-344],[-263,-393],[-356,-125],[-25,-199],[-171,-327],[-107,-481],[108,-338],[-160,-263],[-60,-384],[-210,-118]],[[49600,72702],[-197,-455],[-352,-8]],[[49051,72239],[-265,11],[-174,-209],[-106,-223],[-136,49],[-103,199],[-79,340],[-259,92]],[[47929,72498],[-112,-153],[-146,83],[-143,-65],[42,462],[-26,363],[-124,55],[-67,224],[22,386],[111,215],[20,239],[58,355],[-6,250],[-56,212],[-12,200]],[[47490,75324],[14,420],[-114,257],[393,426]],[[47783,76427],[340,-107],[373,4]],[[48496,76324],[296,-101],[230,31],[449,-19]],[[49471,76235],[144,354],[53,1177],[-287,620],[-205,299]],[[49176,78685],[-424,228],[-28,430]],[[48724,79343],[360,129],[466,-152],[-88,669],[263,-254],[646,461],[84,484],[243,119]],[[50698,80799],[222,117]],[[50920,80916],[143,162]],[[51063,81078],[244,870],[38
 0,247]],[[51687,82195],[231,-17]],[[51918,82178],[54,125],[232,32],[52,-130],[188,291],[-63,222],[-13,335]],[[52368,83053],[-113,328],[-8,604],[46,159]],[[52293,84144],[80,178],[244,36]],[[52617,84358],[98,163],[223,167],[-9,-304],[-82,-192],[33,-166],[151,-89],[-68,-223],[-83,64],[-200,-425],[76,-288]],[[52756,83065],[4,-228],[281,-138],[-3,-210],[283,111],[156,162],[313,-233],[132,-189]],[[53922,82340],[189,174],[434,273],[350,200],[277,-100],[21,-144],[268,-7]],[[55461,82736],[63,260],[383,191]],[[55907,83187],[-59,497]],[[55848,83684],[10,445],[136,371],[262,202],[221,-442],[223,12],[53,453]],[[56753,84725],[32,349],[-102,-75],[-176,210],[-24,340],[351,164],[350,86],[301,-97],[287,17]],[[57772,85719],[316,327],[-291,280]],[[57797,86326],[-504,-47],[-489,-216],[-452,-125]],[[56352,85938],[-161,322],[-269,195],[62,581]],[[55984,87036],[-135,534],[133,344]],[[55982,87914],[252,371],[635,640],[185,124],[-28,250],[-387,279]],[[56639,89578],[-478,-167],[-269,-413],[43,-361],[-441,-475
 ],[-537,-509],[-202,-832],[198,-416],[265,-328],[-255,-666],[-289,-138],[-106,-992],[-157,-554],[-337,57],[-158,-468],[-321,-27],[-89,558],[-232,671],[-211,835]],[[53063,85353],[-187,363],[-548,-684]],[[52328,85032],[-370,-138],[-385,301]],[[51573,85195],[-99,635]],[[51474,85830],[-88,1364],[256,380]],[[51642,87574],[733,496],[549,609],[508,824],[668,1141],[465,444],[763,741],[610,259],[457,-31],[423,489],[506,-26],[499,118],[869,-433],[-358,-158],[305,-371]],[[58639,91676],[286,206],[456,-358],[761,-140],[1050,-668],[213,-281],[18,-393],[-308,-311],[-454,-157],[-1240,449],[-204,-75],[453,-433],[36,-878],[358,-180],[217,-153],[36,286]],[[60317,88590],[-174,263],[183,215]],[[60326,89068],[672,-368]],[[60998,88700],[234,144],[-187,433]],[[61045,89277],[647,578],[256,-34],[260,-206],[161,406],[-231,352],[136,353],[-204,367],[777,-190],[158,-331],[-351,-73]],[[62654,90499],[2,-328],[218,-203]],[[62874,89968],[429,128],[68,377]],[[63371,90473],[581,282],[969,507]],[[64921,91262],[209,-29
 ],[-273,-359],[344,-61],[199,202],[521,16],[412,245],[317,-356],[315,391],[-291,343],[145,195],[820,-179],[385,-185],[1006,-675],[186,309],[-282,313],[-8,125],[-335,58],[92,280],[-149,461],[-8,189],[512,535]],[[69038,93080],[182,537],[207,116]],[[69427,93733],[735,-156],[58,-328]],[[70220,93249],[-263,-479],[173,-189],[89,-413],[-63,-809],[307,-362],[-120,-395],[-544,-839],[318,-87],[110,213],[306,151],[74,293],[240,281],[-162,336],[130,390],[-304,49],[-67,328]],[[70444,91717],[222,594],[-361,481]],[[70305,92792],[497,398],[-64,421],[139,13],[145,-328],[-109,-570],[297,-108],[-127,426],[465,233],[577,31],[513,-337],[-247,492],[-28,630]],[[72363,94093],[484,119],[668,-26]],[[73515,94186],[602,77],[-226,309],[321,388],[319,16],[540,293],[734,79],[93,162],[729,55],[227,-133],[624,314],[510,-10],[77,255],[265,252],[656,242],[476,-191],[-378,-146],[629,-90],[75,-292],[254,143],[812,-7],[626,-289],[223,-221],[-69,-307],[-307,-175],[-730,-328],[-209,-175],[345,-83],[410,-149]],[[63720,7385
 8],[-47,-207],[-102,-138]],[[63571,73513],[7,-293]],[[63578,73220],[88,-436],[263,-123],[193,-296],[395,-102],[434,156],[27,139]],[[64978,72558],[-52,417],[40,618],[-216,200],[71,405],[-184,34],[61,498],[262,-145],[244,189],[-202,355],[-80,338],[-224,-151],[-28,-433],[-87,383]],[[64583,75266],[-15,144],[68,246],[-53,206],[-322,202],[-125,530],[-154,150],[-9,192],[270,-56],[11,432],[236,96],[243,-88],[50,576],[-50,365],[-278,-28],[-236,144],[-321,-260],[-259,-124]],[[63639,77993],[-127,-350],[-269,-97],[-276,-610],[252,-561],[-27,-398],[303,-696]],[[63495,75281],[146,-311],[141,-419],[130,-28],[85,-159],[-228,-47],[-49,-459]],[[23807,96363],[-521,38],[-74,165],[559,-9],[195,-109],[-33,-68],[-126,-17]],[[18874,96315],[-411,191],[224,188],[406,60],[392,-92],[-93,-177],[-518,-170]],[[56247,96336],[-490,137],[191,152],[-167,189],[575,119],[110,-222],[401,-134],[-620,-241]],[[19199,96904],[-461,1],[5,84],[285,177],[149,-27],[361,-120],[-339,-115]],[[22969,96575],[-226,138],[-119,221],[-22
 ,245],[360,-24],[162,-39],[332,-205],[-76,-214],[-411,-122]],[[22313,96609],[-453,66],[-457,192],[-619,21],[268,176],[-335,142],[-21,227],[546,-81],[751,-215],[212,-281],[108,-247]],[[77621,96617],[507,776],[229,66],[208,-38],[704,-336],[-82,-240],[-1566,-228]],[[54420,95937],[-598,361],[252,210],[-416,170],[-541,499],[-216,463],[757,212],[152,-207],[396,8],[105,202],[408,20],[350,-206],[915,-440],[-699,-233],[-155,-435],[-243,-111],[-132,-490],[-335,-23]],[[56395,97491],[-819,98],[-50,163],[-398,11],[-304,271],[858,165],[403,-142],[281,177],[702,-148],[545,-207],[-412,-318],[-806,-70]],[[63218,97851],[-301,140],[158,185],[-618,18],[542,107],[422,8],[57,-160],[159,142],[262,97],[412,-129],[-107,-90],[-373,-78],[-250,-45],[-39,-97],[-324,-98]],[[77154,97111],[-773,170],[-462,226],[-213,423],[-379,117],[722,404],[600,133],[540,-297],[640,-572],[-69,-531],[-606,-73]],[[24776,96791],[-575,76],[-299,240],[4,215],[220,157],[-508,-4],[-306,196],[-176,268],[193,262],[192,180],[285,42],[-122
 ,135],[646,30],[355,-315],[468,-127],[455,-112],[220,-390],[334,-190],[-381,-176],[-513,-445],[-492,-42]],[[27622,95587],[-726,163],[-816,-91],[-414,71],[-525,31],[-35,284],[514,133],[-137,427],[170,41],[742,-255],[-379,379],[-450,113],[225,229],[492,141],[79,206],[-392,231],[-118,304],[759,-26],[220,-64],[433,216],[-625,68],[-972,-38],[-491,201],[-232,239],[-324,173],[-61,202],[413,112],[324,19],[545,96],[409,220],[344,-30],[300,-166],[211,319],[367,95],[498,65],[849,24],[148,-63],[802,100],[601,-38],[602,-37],[742,-47],[597,-75],[508,-161],[-12,-157],[-678,-257],[-672,-119],[-251,-133],[605,3],[-656,-358],[-452,-167],[-476,-483],[-573,-98],[-177,-120],[-841,-64],[383,-74],[-192,-105],[230,-292],[-264,-202],[-429,-167],[-132,-232],[-388,-176],[39,-134],[475,23],[6,-144],[-742,-355]],[[37559,86051],[-410,482],[-556,3],[-269,324],[-186,577],[-481,735],[-141,385],[-38,530],[-384,546],[100,435],[-186,208],[275,691],[418,220],[110,247],[58,461],[-318,-209],[-151,-88],[-249,-84],[-341,19
 3],[-19,401],[109,314],[258,9],[567,-157],[-478,375],[-249,202],[-276,-83],[-232,147],[310,550],[-169,220],[-220,409],[-335,626],[-353,230],[3,247],[-745,346],[-590,43],[-743,-24],[-677,-44],[-323,188],[-482,372],[729,186],[559,31],[-1188,154],[-627,241],[39,229],[1051,285],[1018,284],[107,214],[-750,213],[243,235],[961,413],[404,63],[-115,265],[658,156],[854,93],[853,5],[303,-184],[737,325],[663,-221],[390,-46],[577,-192],[-660,318],[38,253],[932,353],[975,-27],[354,218],[982,57],[2219,-74],[1737,-469],[-513,-227],[-1062,-26],[-1496,-58],[140,-105],[984,65],[836,-204],[540,181],[231,-212],[-305,-344],[707,220],[1348,229],[833,-114],[156,-253],[-1132,-420],[-157,-136],[-888,-102],[643,-28],[-324,-431],[-224,-383],[9,-658],[333,-386],[-434,-24],[-457,-187],[513,-313],[65,-502],[-297,-55],[360,-508],[-617,-42],[322,-241],[-91,-208],[-391,-91],[-388,-2],[348,-400],[4,-263],[-549,244],[-143,-158],[375,-148],[364,-361],[105,-476],[-495,-114],[-214,228],[-344,340],[95,-401],[-322,-311],[7
 32,-25],[383,-32],[-745,-515],[-755,-466],[-813,-204],[-306,-2],[-288,-228],[-386,-624],[-597,-414],[-192,-24],[-370,-145],[-399,-138],[-238,-365],[-4,-415],[-141,-388],[-453,-472],[112,-462],[-125,-488],[-142,-577],[-391,-36]],[[67002,71642],[284,-224],[209,79],[58,268],[219,89],[157,180],[55,472],[234,114],[44,211],[131,-158],[84,-19]],[[68477,72654],[154,-4],[210,-124]],[[68841,72526],[85,-72],[201,189],[93,-114],[90,271],[166,-12],[43,86],[29,239],[120,205],[150,-134],[-30,-181],[84,-28],[-26,-496],[110,-194],[97,125],[123,58],[173,265],[192,-44],[286,-1]],[[70827,72688],[50,-169]],[[70877,72519],[-162,-67],[-141,-109],[-319,-68],[-298,-124],[-163,-258],[66,-250],[32,-294],[-139,-248],[12,-227],[-76,-213],[-265,18],[110,-390],[-177,-150],[-118,-356],[15,-355],[-108,-166],[-103,55],[-212,-77],[-31,-166],[-207,1],[-154,-334],[-10,-503],[-361,-246],[-194,52],[-56,-129],[-166,75],[-278,-88],[-465,301]],[[66909,68203],[252,536],[-23,380],[-210,100],[-22,375],[-91,472],[119,323],[-121
 ,87],[76,430],[113,736]],[[56642,44124],[29,-184],[-32,-286],[49,-277],[-41,-222],[24,-203],[-579,7],[-13,-1880],[188,-483],[181,-369]],[[56448,40227],[-510,-241],[-673,83],[-192,284],[-1126,-26],[-42,-41],[-166,267],[-180,17],[-166,-100],[-134,-113]],[[53422,46976],[115,79],[80,-11],[98,71],[820,-8],[68,-440],[80,-354],[64,-191],[106,-309],[184,47],[91,83],[154,-83],[42,148],[69,344],[172,23],[15,103],[142,2],[-24,-213],[337,5],[5,-372],[56,-228],[-41,-356],[21,-363],[93,-219],[-15,-703],[68,54],[121,-15],[172,89],[127,-35]],[[53309,47603],[112,255],[84,100],[104,-203]],[[53609,47755],[-101,-124],[-45,-152],[-9,-258],[-71,-62]],[[55719,75309],[-35,-201],[39,-254],[115,-144]],[[55838,74710],[-5,-155],[-91,-85],[-16,-192],[-129,-287]],[[55427,75229],[-47,93]],[[55380,75322],[-18,188],[120,291],[18,-111],[75,52]],[[55575,75742],[59,-159],[66,-60],[19,-214]],[[65575,65974],[52,-202]],[[65665,65306],[-142,-3],[-23,-384],[50,-82],[-126,-117],[-1,-241],[-81,-245],[-7,-238]],[[65335,63996]
 ,[-56,-125],[-835,298],[-106,599],[-11,136]],[[31400,18145],[-168,16],[-297,1],[0,1319]],[[32587,37434],[511,-964],[227,-89],[339,-437],[286,-231],[40,-261],[-273,-898],[280,-160],[312,-91],[220,95],[252,453],[45,521]],[[34826,35372],[138,114],[139,-341],[-6,-472],[-234,-326],[-186,-241],[-314,-573],[-370,-806]],[[33993,32727],[-70,-473],[-74,-607],[3,-588],[-61,-132],[-21,-382]],[[31227,23224],[273,-433],[266,-119]],[[30952,19680],[-257,93],[-672,79],[-115,344],[6,443],[-185,-38],[-98,214],[-24,626],[213,260],[88,375],[-33,299],[148,504],[101,782],[-30,347],[122,112],[-30,223],[-129,118],[92,248],[-126,224],[-65,682],[112,120],[-47,720],[65,605],[75,527],[166,215],[-84,576],[-1,543],[210,386],[-7,494],[159,576],[1,544],[-72,108],[-128,1020],[171,607],[-27,572],[100,537],[182,555],[196,367],[-83,232],[58,190],[-9,985],[302,291],[96,614],[-34,148]],[[31359,37147],[231,534],[364,-144],[163,-427],[109,475],[316,-24],[45,-127]],[[62492,74950],[57,-155],[106,-103],[-56,-148],[148,-202],[
 -78,-189],[118,-160],[124,-97],[7,-410]],[[62918,73486],[-101,-17]],[[62817,73469],[-113,342],[1,91],[-123,-2],[-82,159],[-58,-16]],[[62442,74043],[-109,172],[-207,147],[27,288],[-47,208]],[[62106,74858],[386,92]],[[1088,892],[38,-7],[32,-4]],[[1158,881],[402,-246],[352,246],[63,34],[816,104],[265,-138],[130,-71],[419,-196],[789,-151],[625,-185],[1072,-139],[800,162],[1181,-116],[669,-185],[734,174],[773,162],[60,278],[-1094,23],[-898,139],[-234,231],[-745,128],[49,266],[103,243],[104,220],[-55,243],[-462,162],[-212,209],[-430,185],[675,-35],[642,93],[402,-197],[495,173],[457,220],[223,197],[-98,243],[-359,162],[-408,174],[-571,35],[-500,81],[-539,58],[-180,220],[-359,185],[-217,208],[-87,672],[136,-58],[250,-185],[457,58],[441,81],[228,-255],[441,58],[370,127],[348,162],[315,197],[419,58],[-11,220],[-97,220],[81,208],[359,104],[163,-196],[425,115],[321,151],[397,12],[375,57],[376,139],[299,128],[337,127],[218,-35],[190,-46],[414,81],[370,-104],[381,11],[364,81],[375,-57],[414,-58],
 [386,23],[403,-12],[413,-11],[381,23],[283,174],[337,92],[349,-127],[331,104],[300,208],[179,-185],[98,-208],[180,-197],[288,174],[332,-220],[375,-70],[321,-162],[392,35],[354,104],[418,-23],[376,-81],[381,-104],[147,254],[-180,197],[-136,209],[-359,46],[-158,220],[-60,220],[-98,440],[213,-81],[364,-35],[359,35],[327,-93],[283,-174],[119,-208],[376,-35],[359,81],[381,116],[342,70],[283,-139],[370,46],[239,451],[224,-266],[321,-104],[348,58],[228,-232],[365,-23],[337,-69],[332,-128],[218,220],[108,209],[278,-232],[381,58],[283,-127],[190,-197],[370,58],[288,127],[283,151],[337,81],[392,69],[354,81],[272,127],[163,186],[65,254],[-32,244],[-87,231],[-98,232],[-87,231],[-71,209],[-16,231],[27,232],[130,220],[109,243],[44,231],[-55,255],[-32,232],[136,266],[152,173],[180,220],[190,186],[223,173],[109,255],[152,162],[174,151],[267,34],[174,186],[196,115],[228,70],[202,150],[157,186],[218,69],[163,-151],[-103,-196],[-283,-174],[-120,-127],[-206,92],[-229,-58],[-190,-139],[-202,-150],[-136,
 -174],[-38,-231],[17,-220],[130,-197],[-190,-139],[-261,-46],[-153,-197],[-163,-185],[-174,-255],[-44,-220],[98,-243],[147,-185],[229,-139],[212,-185],[114,-232],[60,-220],[82,-232],[130,-196],[82,-220],[38,-544],[81,-220],[22,-232],[87,-231],[-38,-313],[-152,-243],[-163,-197],[-370,-81],[-125,-208],[-169,-197],[-419,-220],[-370,-93],[-348,-127],[-376,-128],[-223,-243],[-446,-23],[-489,23],[-441,-46],[-468,0],[87,-232],[424,-104],[311,-162],[174,-208],[-310,-185],[-479,58],[-397,-151],[-17,-243],[-11,-232],[327,-196],[60,-220],[353,-220],[588,-93],[500,-162],[398,-185],[506,-186],[690,-92],[681,-162],[473,-174],[517,-197],[272,-278],[136,-220],[337,209],[457,173],[484,186],[577,150],[495,162],[691,12],[680,-81],[560,-139],[180,255],[386,173],[702,12],[550,127],[522,128],[577,81],[614,104],[430,150],[-196,209],[-119,208],[0,220],[-539,-23],[-571,-93],[-544,0],[-77,220],[39,440],[125,128],[397,138],[468,139],[337,174],[337,174],[251,231],[380,104],[376,81],[190,47],[430,23],[408,81],[
 343,116],[337,139],[305,139],[386,185],[245,197],[261,173],[82,232],[-294,139],[98,243],[185,185],[288,116],[305,139],[283,185],[217,232],[136,277],[202,163],[331,-35],[136,-197],[332,-23],[11,220],[142,231],[299,-58],[71,-220],[331,-34],[360,104],[348,69],[315,-34],[120,-243],[305,196],[283,105],[315,81],[310,81],[283,139],[310,92],[240,128],[168,208],[207,-151],[288,81],[202,-277],[157,-209],[316,116],[125,232],[283,162],[365,-35],[108,-220],[229,220],[299,69],[326,23],[294,-11],[310,-70],[300,-34],[130,-197],[180,-174],[304,104],[327,24],[315,0],[310,11],[278,81],[294,70],[245,162],[261,104],[283,58],[212,162],[152,324],[158,197],[288,-93],[109,-208],[239,-139],[289,46],[196,-208],[206,-151],[283,139],[98,255],[250,104],[289,197],[272,81],[326,116],[218,127],[228,139],[218,127],[261,-69],[250,208],[180,162],[261,-11],[229,139],[54,208],[234,162],[228,116],[278,93],[256,46],[244,-35],[262,-58],[223,-162],[27,-254],[245,-197],[168,-162],[332,-70],[185,-162],[229,-162],[266,-35],[22
 3,116],[240,243],[261,-127],[272,-70],[261,-69],[272,-46],[277,0],[229,-614],[-11,-150],[-33,-267],[-266,-150],[-218,-220],[38,-232],[310,12],[-38,-232],[-141,-220],[-131,-243],[212,-185],[321,-58],[321,104],[153,232],[92,220],[153,185],[174,174],[70,208],[147,289],[174,58],[316,24],[277,69],[283,93],[136,231],[82,220],[190,220],[272,151],[234,115],[153,197],[157,104],[202,93],[277,-58],[250,58],[272,69],[305,-34],[201,162],[142,393],[103,-162],[131,-278],[234,-115],[266,-47],[267,70],[283,-46],[261,-12],[174,58],[234,-35],[212,-127],[250,81],[300,0],[255,81],[289,-81],[185,197],[141,196],[191,163],[348,439],[179,-81],[212,-162],[185,-208],[354,-359],[272,-12],[256,0],[299,70],[299,81],[229,162],[190,174],[310,23],[207,127],[218,-116],[141,-185],[196,-185],[305,23],[190,-150],[332,-151],[348,-58],[288,47],[218,185],[185,185],[250,46],[251,-81],[288,-58],[261,93],[250,0],[245,-58],[256,-58],[250,104],[299,93],[283,23],[316,0],[255,58],[251,46],[76,290],[11,243],[174,-162],[49,-266],[
 92,-244],[115,-196],[234,-105],[315,35],[365,12],[250,35],[364,0],[262,11],[364,-23],[310,-46],[196,-186],[-54,-220],[179,-173],[299,-139],[310,-151],[360,-104],[375,-92],[283,-93],[315,-12],[180,197],[245,-162],[212,-185],[245,-139],[337,-58],[321,-69],[136,-232],[316,-139],[212,-208],[310,-93],[321,12],[299,-35],[332,12],[332,-47],[310,-81],[288,-139],[289,-116],[195,-173],[-32,-232],[-147,-208],[-125,-266],[-98,-209],[-131,-243],[-364,-93],[-163,-208],[-360,-127],[-125,-232],[-190,-220],[-201,-185],[-115,-243],[-70,-220],[-28,-266],[6,-220],[158,-232],[60,-220],[130,-208],[517,-81],[109,-255],[-501,-93],[-424,-127],[-528,-23],[-234,-336],[-49,-278],[-119,-220],[-147,-220],[370,-196],[141,-244],[239,-219],[338,-197],[386,-186],[419,-185],[636,-185],[142,-289],[800,-128],[53,-45],[208,-175],[767,151],[636,-186],[-99504,-147],[245,344],[501,-185],[32,21],[294,188]],[[54716,79012],[-21,-241],[-156,-2],[53,-128],[-92,-380]],[[54500,78261],[-53,-100],[-243,-14],[-140,-134],[-229,45]],[
 [53835,78058],[-398,153],[-62,205],[-274,-102],[-32,-113],[-169,84]],[[52900,78285],[-142,16],[-125,108],[42,145],[-10,104]],[[52665,78658],[83,33],[141,-164],[39,156],[245,-25],[199,106],[133,-18],[87,-121],[26,100],[-40,385],[100,75],[98,272]],[[53776,79457],[206,-190],[157,242],[98,44],[215,-180],[131,30],[128,-111]],[[54711,79292],[-23,-75],[28,-205]],[[62817,73469],[-190,78],[-141,273],[-44,223]],[[63720,73858],[-48,-207],[-101,-138]],[[63578,73220],[-69,-29],[-173,309],[95,292],[-82,174],[-104,-44],[-327,-436]],[[62492,74950],[68,96],[207,-169],[149,-36],[38,70],[-136,319],[72,82]],[[62890,75312],[78,-20],[191,-359],[122,-40],[48,150],[166,238]],[[58149,47921],[-17,713],[-70,268]],[[58062,48902],[169,-46],[85,336],[147,-38]],[[58463,49154],[16,-233],[60,-134],[3,-192],[-69,-124],[-108,-308],[-101,-214],[-115,-28]],[[50920,80916],[204,-47],[257,123],[176,-258],[153,-138]],[[51710,80596],[-32,-400]],[[51678,80196],[-72,-22],[-30,-331]],[[51576,79843],[-243,269],[-143,-46],[-194,
 279],[-129,237],[-129,10],[-40,207]],[[50518,54209],[-69,407],[13,1357],[-56,122],[-11,290],[-96,207],[-85,174],[35,311]],[[50249,57077],[96,67],[56,258],[136,56],[61,176]],[[50598,57634],[93,173],[100,2],[212,-340]],[[51003,57469],[-11,-197],[62,-350],[-54,-238],[29,-159],[-135,-366],[-86,-181],[-52,-372],[7,-376],[-16,-952]],[[49214,56277],[-190,152],[-130,-22],[-97,-149],[-125,125],[-49,195],[-125,129]],[[48498,56707],[-18,343],[76,250],[-7,200],[221,490],[41,405],[76,144],[134,-79],[116,120],[38,152],[216,265],[53,184],[259,246],[153,84],[70,-114],[178,3]],[[50104,59400],[-22,-286],[37,-269],[156,-386],[9,-286],[320,-134],[-6,-405]],[[50249,57077],[-243,13]],[[50006,57090],[-128,47],[-90,-96],[-123,43],[-482,-27],[-7,-336],[38,-444]],[[75742,63602],[-6,-424],[-97,90],[18,-476]],[[75657,62792],[-79,308],[-16,301],[-53,285]],[[74730,63611],[-43,486],[-96,444],[47,356],[-171,159],[62,215],[173,220],[-200,313],[98,401],[220,-255],[133,-30],[24,-410],[265,-81],[257,8],[160,-101],[-12
 8,-500],[-124,-34],[-86,-336],[152,-306],[46,377],[76,2],[147,-937]],[[56293,76715],[80,-243],[108,43],[213,-92],[408,-31],[138,150],[327,138],[202,-215],[163,-62]],[[57776,75399],[-239,79],[-283,-186]],[[57254,75292],[-3,-294],[-252,-56],[-196,206],[-222,-162],[-206,17]],[[56375,75003],[-20,391],[-139,189]],[[56216,75583],[46,84],[-30,70],[47,188],[105,185],[-135,255],[-24,216],[68,134]],[[55279,77084],[100,2],[-69,-260],[134,-227],[-41,-278],[-65,-27]],[[55338,76294],[-52,-53],[-90,-138],[-41,-325]],[[55155,75778],[-246,224],[-105,247],[-106,130],[-127,221],[-61,183],[-136,277],[59,245],[99,-136],[60,123],[130,13],[239,-98],[192,8],[126,-131]],[[56523,82432],[268,-4],[302,223],[64,333],[228,190],[-26,264]],[[57359,83438],[169,100],[298,228]],[[57826,83766],[293,-149],[39,-146],[146,70],[272,-141],[27,-277],[-60,-159],[174,-387],[113,-108],[-16,-107],[187,-104],[80,-157],[-108,-129],[-224,20],[-54,-55],[66,-196],[68,-379]],[[58829,81362],[-239,-35],[-85,-129],[-18,-298],[-111,57],[
 -250,-28],[-73,138],[-104,-103],[-105,86],[-218,12],[-310,141],[-281,47],[-215,-14],[-152,-160],[-133,-23]],[[56535,81053],[-6,263],[-85,274],[166,121],[2,235],[-77,225],[-12,261]],[[25238,61101],[-2,87],[33,27],[51,-70],[99,357],[53,8]],[[25297,59966],[-83,0],[22,667],[2,468]],[[31359,37147],[-200,-81],[-109,814],[-150,663],[88,572],[-146,250],[-37,426],[-136,402]],[[30669,40193],[175,638],[-119,496],[63,199],[-49,219],[108,295],[6,503],[13,415],[60,200],[-240,951]],[[30686,44109],[206,-50],[143,13],[62,179],[243,239],[147,222],[363,100],[-29,-443],[34,-227],[-23,-396],[302,-529],[311,-98],[109,-220],[188,-117],[115,-172],[175,6],[161,-175],[12,-342],[55,-172],[3,-255],[-81,-10],[107,-688],[533,-24],[-41,-342],[30,-233],[151,-166],[66,-367],[-49,-465],[-77,-259],[27,-337],[-87,-122]],[[33842,38659],[-4,182],[-259,302],[-258,9],[-484,-172],[-133,-520],[-7,-318],[-110,-708]],[[34826,35372],[54,341],[38,350],[0,325],[-100,107],[-104,-96],[-103,26],[-33,228],[-26,541],[-52,177],[-187,1
 60],[-114,-116],[-293,113],[18,802],[-82,329]],[[30686,44109],[-157,-102],[-126,68],[18,898],[-228,-348],[-245,15],[-105,315],[-184,34],[59,254],[-155,359],[-115,532],[73,108],[0,250],[168,171],[-28,319],[71,206],[20,275],[318,402],[227,114],[37,89],[251,-28]],[[30585,48040],[125,1620],[6,256],[-43,339],[-123,215],[1,430],[156,97],[56,-61],[9,226],[-162,61],[-4,370],[541,-13],[92,203],[77,-187],[55,-349],[52,73]],[[31423,51320],[153,-312],[216,38],[54,181],[206,138],[115,97],[32,250],[198,168],[-15,124],[-235,51],[-39,372],[12,396],[-125,153],[52,55],[206,-76],[221,-148],[80,140],[200,92],[310,221],[102,225],[-37,167]],[[33129,53652],[145,26],[64,-136],[-36,-259],[96,-90],[63,-274],[-77,-209],[-44,-502],[71,-299],[20,-274],[171,-277],[137,-29],[30,116],[88,25],[126,104],[90,157],[154,-50],[67,21]],[[34294,51702],[151,-48],[25,120],[-46,118],[28,171],[112,-53],[131,61],[159,-125]],[[34854,51946],[121,-122],[86,160],[62,-25],[38,-166],[133,42],[107,224],[85,436],[164,540]],[[35174,306
 29],[-77,334],[122,280],[-160,402],[-218,327],[-286,379],[-103,-18],[-279,457],[-180,-63]],[[82069,53798],[-13,-291],[-16,-377],[-133,19],[-58,-202],[-126,307]],[[75471,66988],[113,-189],[-20,-363],[-227,-17],[-234,39],[-175,-92],[-252,224],[-6,119]],[[74670,66709],[184,439],[150,150],[198,-137],[147,-14],[122,-159]],[[58175,37528],[-393,-435],[-249,-442],[-93,-393],[-83,-

<TRUNCATED>

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[12/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrTopology.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrTopology.js b/console/plugin/js/qdrTopology.js
deleted file mode 100644
index c8921ff..0000000
--- a/console/plugin/js/qdrTopology.js
+++ /dev/null
@@ -1,1871 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-
-  /**
-   * @method SettingsController
-   * @param $scope
-   * @param QDRServer
-   *
-   * Controller that handles the QDR settings page
-   */
-
-  /**
-   * @function NavBarController
-   *
-   * @param $scope
-   * @param workspace
-   *
-   * The controller for this plugin's navigation bar
-   *
-   */
-   
-    QDR.module.controller("QDR.TopologyController", ['$scope', '$rootScope', 'uiGridConstants', 'QDRService', '$uibModal', '$location', '$timeout',
-    function($scope, $rootScope, uiGridConstants, QDRService, $uibModal, $location, $timeout) {
-
-		QDR.log.debug("started QDR.TopologyController with location.url: " + $location.url());
-		var urlPrefix = window.location.pathname;
-
-		$scope.attributes = [];
-        $scope.connAttributes = [];
-        $scope.topoForm = "general";
-        $scope.topoFormSelected = "";
-		$scope.addingNode = {
-			step: 0,
-			hasLink: false,
-			trigger: ''
-		}; // shared object about the node that is be	    $scope.topoForm = "general";
-
-        var generalCellTemplate = '<div class="ngCellText"><span title="{{row.entity.description}}">{{row.entity.attributeName}}</span></div>';
-
-		$scope.isGeneral = function () {
-    	    //QDR.log.debug("$scope.topoForm=" + $scope.topoForm)
-    	    return $scope.topoForm === 'general';
-		};
-		$scope.isConnections = function () {
-    	    //QDR.log.debug("$scope.topoForm=" + $scope.topoForm)
-    	    return $scope.topoForm === 'connections';
-		};
-		$scope.isAddNode = function () {
-    	    //QDR.log.debug("$scope.topoForm=" + $scope.topoForm)
-			return $scope.topoForm === 'addNode';
-		}
-
-		$scope.getTableHeight = function (rows) {
-	        return {height: (rows.length * 30) + "px"};
-		}
-        $scope.isSelected = function () {
-            return ($scope.topoFormSelected != "");
-        }
-
-        $scope.cancel = function () {
-            $scope.addingNode.step = 0;
-        }
-		$scope.editNewRouter = function () {
-			$scope.addingNode.trigger = 'editNode';
-		}
-
-        $scope.topoGridOptions = {
-            data: 'attributes',
-			enableColumnResize: true,
-			enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
-			multiSelect: false,
-            columnDefs: [
-            {
-                field: 'attributeName',
-                displayName: 'Attribute',
-                cellTemplate: generalCellTemplate
-            },
-            {
-                field: 'attributeValue',
-                displayName: 'Value'
-            }
-            ]
-        };
-        $scope.topoConnOptions = angular.copy($scope.topoGridOptions);
-        $scope.topoConnOptions.data = 'connAttributes';
-		var NewRouterName = "__NEW__";
-	    // mouse event vars
-	    var selected_node = null,
-	        selected_link = null,
-	        mousedown_link = null,
-	        mousedown_node = null,
-	        mouseup_node = null,
-	        initial_mouse_down_position = null;
-
-        $scope.schema = "Not connected";
-
-	    $scope.modes = [
-	    	{title: 'Topology view', name: 'Diagram', right: false},
-	    	/* {title: '3D Globe view', name: 'Globe', right: false}, */
-	    	/* {title: 'Add a new router node', name: 'Add Router', right: true} */
-	    	];
-		$scope.mode = "Diagram";
-		$scope.contextNode = null; // node that is associated with the current context menu
-
-		$scope.isModeActive = function (name) {
-			if ((name == 'Add Router' || name == 'Diagram') && $scope.addingNode.step > 0)
-				return true;
-			return ($scope.mode == name);
-		}
-		$scope.selectMode = function (name) {
-			if (name == "Add Router") {
-				name = 'Diagram';
-				if ($scope.addingNode.step > 0) {
-					$scope.topoForm = 'general'
-					$scope.topoFormSelected = '';
-					$scope.addingNode.step = 0;
-				} else {
-					// start adding node mode
-					$scope.addingNode.step = 1;
-				}
-			} else {
-				$scope.topoForm = 'general'
-				$scope.topoFormSelected = '';
-				$scope.addingNode.step = 0;
-			}
-
-			$scope.mode = name;
-		}
-		$scope.$watch(function () {return $scope.addingNode.step}, function (newValue, oldValue) {
-			if (newValue == 0 && oldValue != 0) {
-				// we are cancelling the add
-
-				// find the New node
-				nodes.every(function (n, i) {
-					// for the placeholder node, the key will be __internal__
-					if (QDRService.nameFromId(n.key) == '__internal__') {
-						var newLinks = links.filter(function (e, i) {
-							return e.source.id == n.id || e.target.id == n.id;
-						})
-						// newLinks is an array of links to remove
-						newLinks.map(function (e) {
-							links.splice(links.indexOf(e), 1);
-						})
-						// i is the index of the node to remove
-						nodes.splice(i, 1);
-						force.nodes(nodes).links(links).start();
-		                restart(false);
-						return false; // stop looping
-					}
-					return true;
-				})
-				$scope.topoForm = 'general'
-				$scope.topoFormSelected = '';
-			} else if (newValue > 0) {
-				// we are starting the add mode
-				$scope.topoForm = 'addNode';
-                $scope.topoFormSelected = 'addNode';
-
-				resetMouseVars();
-                selected_node = null;
-                selected_link = null;
-                // add a new node
-                var id = "amqp:/_topo/0/__internal__/$management";
-                var x = radiusNormal * 4;
-                var y = x;;
-                if (newValue > 1) {   // add at current mouse position
-                    var offset = jQuery('#topology').offset();
-                    x = mouseX - offset.left + $(document).scrollLeft();
-                    y = mouseY - offset.top + $(document).scrollTop();;
-                }
-                NewRouterName = genNewName();
-                nodes.push( aNode(id, NewRouterName, "inter-router", undefined, nodes.length, x, y, undefined, true) );
-                force.nodes(nodes).links(links).start();
-                restart(false);
-			}
-
-		})
-		$scope.isRight = function (mode) {
-			return mode.right;
-		}
-
-
-		// generate unique name for router and containerName
-		var genNewName = function () {
-			var nodeInfo = QDRService.topology.nodeInfo();
-			var nameIndex = 1;
-			var newName = "R." + nameIndex;
-
-			var names = [];
-			for (key in nodeInfo) {
-				var node = nodeInfo[key];
-				var router = node['.router'];
-				var attrNames = router.attributeNames;
-				var name = QDRService.valFor(attrNames, router.results[0], 'routerId')
-				if (!name)
-					name = QDRService.valFor(attrNames, router.results[0], 'name')
-				names.push(name);
-			}
-
-			while (names.indexOf(newName) >= 0) {
-				newName = "R." + nameIndex++;
-			}
-			return newName;
-		}
-
-		$scope.$watch(function () {return $scope.addingNode.trigger}, function (newValue, oldValue) {
-			if (newValue == 'editNode') {
-				$scope.addingNode.trigger = "";
-				editNode();
-			}
-		})
-
-	    function editNode() {
-	        doAddDialog(NewRouterName);
-	    };
-		$scope.reverseLink = function () {
-			if (!mousedown_link)
-				return;
-			var d = mousedown_link;
-			var tmp = d.left;
-			d.left = d.right;;
-			d.right = tmp;
-		    restart(false);
-		    tick();
-		}
-		$scope.removeLink = function () {
-			if (!mousedown_link)
-				return;
-			var d = mousedown_link;
-			 links.every( function (l, i) {
-				if (l.source.id == d.source.id && l.target.id == d.target.id) {
-			        links.splice(i, 1);
-					force.links(links).start();
-					return false; // exit the 'every' loop
-				}
-				return true;
-			});
-		    restart(false);
-		    tick();
-		}
-		$scope.setFixed = function (b) {
-			if ($scope.contextNode) {
-				$scope.contextNode.fixed = b;
-			}
-			restart();
-		}
-		$scope.isFixed = function () {
-			if (!$scope.contextNode)
-				return false;
-			return ($scope.contextNode.fixed & 0b1);
-		}
-
-		var mouseX, mouseY;
-		// event handlers for popup context menu
-		$(document).mousemove(function (e) {
-		    mouseX = e.clientX;
-		    mouseY = e.clientY;
-		});
-		$(document).mousemove();
-		$(document).click(function (e) {
-			$scope.contextNode = null;
-            $(".contextMenu").fadeOut(200);
-        });
-
-
-		// set up SVG for D3
-	    var width, height;
-	    var tpdiv = $('#topology');
-	    var colors = {'inter-router': "#EAEAEA", 'normal': "#F0F000", 'on-demand': '#00F000'};
-	    var gap = 5;
-	    var radii = {'inter-router': 25, 'normal': 15, 'on-demand': 15};
-	    var radius = 25;
-	    var radiusNormal = 15;
-	    width = tpdiv.width() - gap;
-	    height = $(document).height() - gap;
-
-	    var svg;
-		var force;
-		var animate = false; // should the force graph organize itself when it is displayed
-		var path, circle;
-		var savedKeys = {};
-
-	    // set up initial nodes and links
-	    //  - nodes are known by 'id', not by index in array.
-	    //  - selected edges are indicated on the node (as a bold red circle).
-	    //  - links are always source < target; edge directions are set by 'left' and 'right'.
-		var nodes = [];
-		var links = [];
-
-		var aNode = function (id, name, nodeType, nodeInfo, nodeIndex, x, y, resultIndex, fixed) {
-			var containerName;
-			if (nodeInfo) {
-				var node = nodeInfo[id];
-				if (node) {
-					containerName = node['.container'].results[0][0];
-				}
-			}
-			return {   key: id,
-				name: name,
-				nodeType: nodeType,
-				containerName: containerName,
-				x: x,
-				y: y,
-				id: nodeIndex,
-				resultIndex: resultIndex,
-				fixed: fixed,
-				cls: name == NewRouterName ? 'temp' : ''
-			};
-		};
-
-
-        var initForm = function (attributes, results, entityType, formFields) {
-        
-            while(formFields.length > 0) {
-                // remove all existing attributes
-                    formFields.pop();
-            }
-
-            for (var i=0; i<attributes.length; ++i) {
-                var name = attributes[i];
-                var val = results[i];
-                var desc = "";
-                if (entityType.attributes[name])
-                    if (entityType.attributes[name].description)
-                        desc = entityType.attributes[name].description;
-
-                formFields.push({'attributeName': name, 'attributeValue': val, 'description': desc});
-            }
-        }
-
-		var cities = ["Raleigh"];
-		var possibleCities = ["Boston","Tel Aviv-Yafo", "Brno", "Toronto", "Beijing", , "Ashburn", "Raleigh"]
-		//var drag;
-		// create an bare svg element and
-		// initialize the nodes and links array from the QDRService.topology._nodeInfo object
-		var initForceGraph = function () {
-            //QDR.log.debug("initForceGraph called");
-			nodes = [];
-			links = [];
-
-			svg = d3.select('#topology')
-				.append('svg')
-				.attr("id", "SVG_ID")
-				.attr('width', width)
-				.attr('height', height)
-	            .on("contextmenu", function(d) {
-	                if (d3.event.defaultPrevented)
-	                    return;
-                    d3.event.preventDefault();
-					if ($scope.addingNode.step != 0)
-						return;
-					if (d3.select('#svg_context_menu').style('display') !== 'block')
-	                    $(document).click();
-                    d3.select('#svg_context_menu')
-                      .style('left', (mouseX + $(document).scrollLeft()) + "px")
-                      .style('top', (mouseY + $(document).scrollTop()) + "px")
-                      .style('display', 'block');
-                })
-                .on('click', function (d) {
-					d3.select("#crosssection").style("display","none");
-					d3.select("#crosssection svg").remove();
-
-                });
-
-			// mouse event vars
-			selected_node = null;
-			selected_link = null;
-			mousedown_link = null;
-			mousedown_node = null;
-			mouseup_node = null;
-
-			// initialize the list of nodes
-			var yInit = 10;
-			var nodeInfo = QDRService.topology.nodeInfo();
-			var nodeCount = Object.keys(nodeInfo).length;
-			for (var id in nodeInfo) {
-				var name = QDRService.nameFromId(id);
-                // if we have any new nodes, animate the force graph to position them
-				var position = angular.fromJson(localStorage[name]);
-				if (!angular.isDefined(position)) {
-				    animate = true;
-				    position = {x: width / 4 + ((width / 2)/nodeCount) * nodes.length,
-                				y: height / 2 + yInit,
-                				fixed: false};
-				}
-				nodes.push( aNode(id, name, "inter-router", nodeInfo, nodes.length, position.x, position.y, undefined, position.fixed) );
-				yInit *= -1;
-				//QDR.log.debug("adding node " + nodes.length-1);
-			}
-
-			// initialize the list of links
-			var source = 0;
-			var client = 1;
-			cities = ["Raleigh"];
-			for (var id in nodeInfo) {
-				var onode = nodeInfo[id];
-				var conns = onode['.connection'].results;
-				var attrs = onode['.connection'].attributeNames;
-
-				for (var j = 0; j < conns.length; j++) {
-                    var role = QDRService.valFor(attrs, conns[j], "role");
-                    var dir = QDRService.valFor(attrs, conns[j], "dir");
-					if (role == "inter-router") {
-						var connId = QDRService.valFor(attrs, conns[j], "container");
-						var target = getContainerIndex(connId);
-						if (target >= 0)
-							getLink(source, target, dir);
-					} else if (role == "normal" || role == "on-demand") {
-						// not a router, but an external client
-						//QDR.log.debug("found an external client for " + id);
-						var name = QDRService.nameFromId(id) + "." + client;
-						//QDR.log.debug("external client name is  " + name + " and the role is " + role);
-						var parent = getNodeIndex(QDRService.nameFromId(id));
-						//QDR.log.debug("external client parent is " + parent);
-
-                        // if we have any new clients, animate the force graph to position them
-                        var position = angular.fromJson(localStorage[name]);
-                        if (!angular.isDefined(position)) {
-                            animate = true;
-                            position = {x: nodes[parent].x + 40 + Math.sin(Math.PI/2 * client),
-                                        y: nodes[parent].y + 40 + Math.cos(Math.PI/2 * client),
-                                        fixed: false};
-                        }
-						//QDR.log.debug("adding node " + nodeIndex);
-						nodes.push(	aNode(id, name, role, nodeInfo, nodes.length, position.x, position.y, j, position.fixed) );
-						// now add a link
-						getLink(parent, nodes.length-1, dir);
-						client++;
-
-/*
-	                    var container = QDRService.valFor(attrs, conns[j], "container");
-	                    var parts = container.split('.')
-	                    if (parts.length) {
-	                        var city = parts[parts.length-1]
-	                        if (city === 'TelAvivYafo')
-	                            city = 'Tel Aviv-Yafo'
-	                        if (possibleCities.indexOf(city) > -1) {
-	                            if (cities.indexOf(city) == -1) {
-	                                cities.push(city);
-	                            }
-	                        }
-	                    } else {
-	                        // there was no city
-		                    var user = QDRService.valFor(attrs, conns[j], "user");
-	                        city = 'Boston'
-                            if (cities.indexOf(city) == -1 && role == 'normal' && user != "anonymous") {
-                                cities.push(city);
-                            }
-
-	                    }
-*/
-					}
-				}
-				source++;
-			}
-
-            $scope.schema = QDRService.schema;
-			// add a row for each attribute in .router attributeNames array
-			for (var id in nodeInfo) {
-				var onode = nodeInfo[id];
-
-                initForm(onode['.connection'].attributeNames, onode['.connection'].results[0], QDRService.schema.entityTypes.connection, $scope.connAttributes);
-                initForm(onode['.router'].attributeNames, onode['.router'].results[0], QDRService.schema.entityTypes.router, $scope.attributes);
-                
-				break;
-			}
-			// init D3 force layout
-			force = d3.layout.force()
-				.nodes(nodes)
-				.links(links)
-				.size([width, height])
-				.linkDistance(function(d) { return d.target.nodeType === 'inter-router' ? 150 : 65 })
-				.charge(-1800)
-				.friction(.10)
-				.gravity(0.0001)
-				.on('tick', tick)
-				.start()
-
-			//drag = force.drag()
-            //    .on("dragstart", dragstart);
-
-			svg.append("svg:defs").selectAll('marker')
-				.data(["end-arrow", "end-arrow-selected"])      // Different link/path types can be defined here
-				.enter().append("svg:marker")    // This section adds in the arrows
-				.attr("id", String)
-				.attr("viewBox", "0 -5 10 10")
-				//.attr("refX", 25)
-				.attr("markerWidth", 4)
-				.attr("markerHeight", 4)
-				.attr("orient", "auto")
-				.append("svg:path")
-				.attr('d', 'M 0 -5 L 10 0 L 0 5 z')
-
-			svg.append("svg:defs").selectAll('marker')
-				.data(["start-arrow", "start-arrow-selected"])      // Different link/path types can be defined here
-				.enter().append("svg:marker")    // This section adds in the arrows
-				.attr("id", String)
-				.attr("viewBox", "0 -5 10 10")
-				.attr("refX", 5)
-				.attr("markerWidth", 4)
-				.attr("markerHeight", 4)
-				.attr("orient", "auto")
-				.append("svg:path")
-				.attr('d', 'M 10 -5 L 0 0 L 10 5 z');
-
-			// handles to link and node element groups
-			path = svg.append('svg:g').selectAll('path'),
-			circle = svg.append('svg:g').selectAll('g');
-            
-			force.on('end', function() {
-				//QDR.log.debug("force end called");
-				circle
-					.attr('cx', function(d) {
-						localStorage[d.name] = angular.toJson({x: d.x, y: d.y, fixed: d.fixed});
-						return d.x; });
-			});
-
-			// app starts here
-			restart(false);
-    	    force.start();
-		}
-/*
-		function dragstart(d) {
-		  d3.select(this).classed("fixed", d.fixed = true);
-		}
-
-		function dblclick(d) {
-		  d3.select(this).classed("fixed", d.fixed = false);
-		}
-*/
-        var initGlobe = function (clients) {
-			d3.select(window)
-				.on("mousemove", mousemove)
-				.on("mouseup", mouseup);
-
-			var width = 960,
-				height = 500;
-
-			var proj = d3.geo.orthographic()
-				.scale(220)
-				.translate([width / 2, height / 2])
-				.clipAngle(90);
-
-			var path = d3.geo.path().projection(proj).pointRadius(1.5);
-
-			var links = [],
-				arcLines = [];
-
-			var graticule = d3.geo.graticule();
-			d3.select("#geology svg").remove();
-			var svg = d3.select("#geology").append("svg")
-				.attr("width", width)
-				.attr("height", height)
-				.on("mousedown", mousedown);
-
-			queue()
-				.defer(d3.json, "plugin/data/world-110m.json")
-				.defer(d3.json, "plugin/data/places1.json")
-				.await(ready);
-
-			function ready(error, world, places) {
-			  var ocean_fill = svg.append("defs").append("radialGradient")
-					.attr("id", "ocean_fill")
-					.attr("cx", "75%")
-					.attr("cy", "25%");
-				  ocean_fill.append("stop").attr("offset", "5%").attr("stop-color", "#fff");
-				  ocean_fill.append("stop").attr("offset", "100%").attr("stop-color", "#eef");
-
-			  var globe_highlight = svg.append("defs").append("radialGradient")
-					.attr("id", "globe_highlight")
-					.attr("cx", "75%")
-					.attr("cy", "25%");
-				  globe_highlight.append("stop")
-					.attr("offset", "5%").attr("stop-color", "#ffd")
-					.attr("stop-opacity","0.6");
-				  globe_highlight.append("stop")
-					.attr("offset", "100%").attr("stop-color", "#ba9")
-					.attr("stop-opacity","0.1");
-
-			  var globe_shading = svg.append("defs").append("radialGradient")
-					.attr("id", "globe_shading")
-					.attr("cx", "55%")
-					.attr("cy", "45%");
-				  globe_shading.append("stop")
-					.attr("offset","30%").attr("stop-color", "#fff")
-					.attr("stop-opacity","0")
-				  globe_shading.append("stop")
-					.attr("offset","100%").attr("stop-color", "#505962")
-					.attr("stop-opacity","0.2")
-
-			  var drop_shadow = svg.append("defs").append("radialGradient")
-					.attr("id", "drop_shadow")
-					.attr("cx", "50%")
-					.attr("cy", "50%");
-				  drop_shadow.append("stop")
-					.attr("offset","20%").attr("stop-color", "#000")
-					.attr("stop-opacity",".5")
-				  drop_shadow.append("stop")
-					.attr("offset","100%").attr("stop-color", "#000")
-					.attr("stop-opacity","0")
-
-			  svg.append("ellipse")
-				.attr("cx", 440).attr("cy", 450)
-				.attr("rx", proj.scale()*.90)
-				.attr("ry", proj.scale()*.25)
-				.attr("class", "noclicks")
-				.style("fill", "url("+urlPrefix+"#drop_shadow)");
-
-			  svg.append("circle")
-				.attr("cx", width / 2).attr("cy", height / 2)
-				.attr("r", proj.scale())
-				.attr("class", "noclicks")
-				.style("fill", "url("+urlPrefix+"#ocean_fill)");
-
-			  svg.append("path")
-				.datum(topojson.object(world, world.objects.land))
-				.attr("class", "land noclicks")
-				.attr("d", path);
-
-			  svg.append("path")
-				.datum(graticule)
-				.attr("class", "graticule noclicks")
-				.attr("d", path);
-
-			  svg.append("circle")
-				.attr("cx", width / 2).attr("cy", height / 2)
-				.attr("r", proj.scale())
-				.attr("class","noclicks")
-				.style("fill", "url("+urlPrefix+"#globe_highlight)");
-
-			  svg.append("circle")
-				.attr("cx", width / 2).attr("cy", height / 2)
-				.attr("r", proj.scale())
-				.attr("class","noclicks")
-				.style("fill", "url("+urlPrefix+"#globe_shading)");
-
-			  var filtered = places.features.filter( function (feature) {
-			    return clients.indexOf(feature.properties.NAME) > -1
-			  })
-			  svg.append("g").attr("class","points")
-				  .selectAll("text").data(filtered)
-				.enter().append("path")
-				  .attr("class", "point")
-				  .attr("d", path);
-
-				svg.append("g").attr("class","labels")
-				  .selectAll("text").data(filtered)
-				  .enter().append("text")
-				  .attr("class", "label")
-				  .text(function(d) { return d.properties.NAME })
-
-				position_labels();
-
-			  // spawn links between cities as source/target coord pairs
-			  places.features.forEach(function(a, i) {
-				if (clients.indexOf(a.properties.NAME) > -1) {
-					places.features.forEach(function(b, j) {
-					  if (b.properties.NAME === 'Raleigh') {
-					  if (j > i) {	// avoid duplicates
-						links.push({
-						  source: a.geometry.coordinates,
-						  target: b.geometry.coordinates
-						});
-					  }
-					  }
-					});
-				}
-			  });
-
-			  // build geoJSON features from links array
-			  links.forEach(function(e,i,a) {
-				var feature =   { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [e.source,e.target] }}
-				arcLines.push(feature)
-			  })
-
-			  svg.append("g").attr("class","arcs")
-				.selectAll("path").data(arcLines)
-				.enter().append("path")
-				  .attr("class","arc")
-				  .attr("d",path)
-			  refresh();
-			}
-
-			function position_labels() {
-			  var centerPos = proj.invert([width/2,height/2]);
-
-			  var arc = d3.geo.greatArc();
-
-			  svg.selectAll(".label")
-				.attr("transform", function(d) {
-				  var loc = proj(d.geometry.coordinates),
-					x = loc[0],
-					y = loc[1];
-				  var offset = x < width/2 ? -5 : 5;
-				  return "translate(" + (x+offset) + "," + (y-2) + ")"
-				})
-				.style("display",function(d) {
-				  var d = arc.distance({source: d.geometry.coordinates, target: centerPos});
-				  return (d > 1.57) ? 'none' : 'inline';
-				})
-			}
-
-			function refresh() {
-			  svg.selectAll(".land").attr("d", path);
-			  svg.selectAll(".point").attr("d", path);
-			  svg.selectAll(".graticule").attr("d", path);
-			  svg.selectAll(".arc").attr("d", path);
-			  position_labels();
-			}
-
-			// modified from http://bl.ocks.org/1392560
-			var m0, o0;
-			o0 = angular.fromJson(localStorage["QDR.rotate"]);
-			if (o0)
-				proj.rotate(o0);
-
-			function mousedown() {
-			  m0 = [d3.event.pageX, d3.event.pageY];
-			  o0 = proj.rotate();
-			  d3.event.preventDefault();
-			}
-			function mousemove() {
-			  if (m0) {
-				var m1 = [d3.event.pageX, d3.event.pageY]
-				  , o1 = [o0[0] + (m1[0] - m0[0]) / 6, o0[1] + (m0[1] - m1[1]) / 6];
-				o1[1] = o1[1] > 30  ? 30  :
-						o1[1] < -30 ? -30 :
-						o1[1];
-				proj.rotate(o1);
-				refresh();
-			  }
-			}
-			function mouseup() {
-			  if (m0) {
-				mousemove();
-				m0 = null;
-				localStorage["QDR.rotate"] = angular.toJson(proj.rotate());
-			  }
-			}
-        }
-
-        // called when we mouseover a node
-        // we need to update the table
-		function updateNodeForm (d) {
-			//QDR.log.debug("update form info for ");
-			//console.dump(d);
-			var nodeInfo = QDRService.topology.nodeInfo();
-			var onode = nodeInfo[d.key];
-			if (onode) {
-				var nodeResults = onode['.router'].results[0];
-				var nodeAttributes = onode['.router'].attributeNames;
-
-                for (var i=0; i<$scope.attributes.length; ++i) {
-                    var idx = nodeAttributes.indexOf($scope.attributes[i].attributeName);
-                    if (idx > -1) {
-                        if ($scope.attributes[i].attributeValue != nodeResults[idx]) {
-                            // highlight the changed data
-                            $scope.attributes[i].attributeValue = nodeResults[idx];
-
-                        }
-                    }
-                }
-			}
-            $scope.topoForm = "general";
-            $scope.$apply();
-		}
-
-		function updateConnForm (d, resultIndex) {
-			var nodeInfo = QDRService.topology.nodeInfo();
-			var onode = nodeInfo[d.key];
-			if (onode && onode['.connection']) {
-				var nodeResults = onode['.connection'].results[resultIndex];
-				var nodeAttributes = onode['.connection'].attributeNames;
-
-                for (var i=0; i<$scope.connAttributes.length; ++i) {
-                    var idx = nodeAttributes.indexOf($scope.connAttributes[i].attributeName);
-                    if (idx > -1) {
-                    	try {
-                        if ($scope.connAttributes[i].attributeValue != nodeResults[idx]) {
-                            // highlight the changed data
-                            $scope.connAttributes[i].attributeValue = nodeResults[idx];
-
-                        }
-                        } catch (err) {
-							QDR.log.error("error updating form" + err)
-                        }
-                    }
-                }
-			}
-            $scope.topoForm = "connections";
-            $scope.$apply();
-		}
-
-
-        function getContainerIndex(_id) {
-            var nodeIndex = 0;
-            var nodeInfo = QDRService.topology.nodeInfo();
-            for (var id in nodeInfo) {
-                var node = nodeInfo[id];
-                if (node['.container'].results[0][0] == _id)
-                    return nodeIndex;
-                nodeIndex++
-            }
-            QDR.log.warn("unable to find containerIndex for " + _id);
-            return -1;
-        }
-
-        function getNodeIndex (_id) {
-            var nodeIndex = 0;
-            var nodeInfo = QDRService.topology.nodeInfo();
-            for (var id in nodeInfo) {
-                if (QDRService.nameFromId(id) == _id) return nodeIndex;
-                nodeIndex++
-            }
-            QDR.log.warn("unable to find nodeIndex for " + _id);
-            return -1;
-        }
-
-        function getLink (_source, _target, dir, cls) {
-            for (var i=0; i < links.length; i++) {
-                var s = links[i].source, t = links[i].target;
-                if (typeof links[i].source == "object") {
-                    s = s.id;
-                    t = t.id;
-				}
-                if (s == _source && t == _target) {
-                    return i;
-                }
-				// same link, just reversed
-                if (s == _target && t == _source) {
-                    return -i;
-				}
-            }
-
-            //QDR.log.debug("creating new link (" + (links.length) + ") between " + nodes[_source].name + " and " + nodes[_target].name);
-            var link = {
-                source: _source,
-                target: _target,
-                left: dir != "out",
-                right: dir == "out",
-                cls: cls
-            };
-            return links.push(link) - 1;
-        }
-
-
-	    function resetMouseVars() {
-	        mousedown_node = null;
-	        mouseup_node = null;
-	        mousedown_link = null;
-	    }
-
-	    // update force layout (called automatically each iteration)
-	    function tick() {
-	        // draw directed edges with proper padding from node centers
-	        path.attr('d', function (d) {
-				//QDR.log.debug("in tick for d");
-				//console.dump(d);
-
-	            var deltaX = d.target.x - d.source.x,
-	                deltaY = d.target.y - d.source.y,
-	                dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY),
-	                normX = deltaX / dist,
-	                normY = deltaY / dist;
-	                var sourcePadding, targetPadding;
-	                if (d.target.nodeType == "inter-router") {
-						//                       right arrow  left line start
-						sourcePadding = d.left ? radius + 8  : radius;
-						//                      left arrow      right line start
-						targetPadding = d.right ? radius + 16 : radius;
-	                } else {
-						sourcePadding = d.left ? radiusNormal + 18  : radiusNormal;
-						targetPadding = d.right ? radiusNormal + 16 : radiusNormal;
-	                }
-	                var sourceX = d.source.x + (sourcePadding * normX),
-	                sourceY = d.source.y + (sourcePadding * normY),
-	                targetX = d.target.x - (targetPadding * normX),
-	                targetY = d.target.y - (targetPadding * normY);
-	            return 'M' + sourceX + ',' + sourceY + 'L' + targetX + ',' + targetY;
-	        });
-
-	        circle.attr('transform', function (d) {
-	            d.x = Math.max(d.x, radiusNormal * 2);
-	            d.y = Math.max(d.y, radiusNormal * 2);
-	            return 'translate(' + d.x + ',' + d.y + ')';
-	        });
-	        if (!animate) {
-	            animate = true;
-	            force.stop();
-	        }
-	    }
-
-        // highlight the paths between the selected node and the hovered node
-        function findNextHopNode(from, d) {
-            // d is the node that the mouse is over
-            // from is the selected_node ....
-            if (!from)
-                return null;
-
-            if (from == d)
-                return selected_node;
-
-            //QDR.log.debug("finding nextHop from: " + from.name + " to " + d.name);
-            var sInfo = QDRService.topology.nodeInfo()[from.key];
-
-            if (!sInfo) {
-                QDR.log.warn("unable to find topology node info for " + from.key);
-                return null;
-            }
-
-            // find the hovered name in the selected name's .router.node results
-            if (!sInfo['.router.node'])
-                return null;
-            var aAr = sInfo['.router.node'].attributeNames;
-            var vAr = sInfo['.router.node'].results;
-            for (var hIdx=0; hIdx<vAr.length; ++hIdx) {
-                var addrT = QDRService.valFor(aAr, vAr[hIdx], "routerId" );
-                if (addrT == d.name) {
-                    //QDR.log.debug("found " + d.name + " at " + hIdx);
-                    var nextHop = QDRService.valFor(aAr, vAr[hIdx], "nextHop");
-                    //QDR.log.debug("nextHop was " + nextHop);
-                    return (nextHop == null) ? nodeFor(addrT) : nodeFor(nextHop);
-                }
-            }
-            return null;
-        }
-
-        function nodeFor(name) {
-            for (var i=0; i<nodes.length; ++i) {
-                if (nodes[i].name == name)
-                    return nodes[i];
-            }
-            return null;
-        }
-
-        function linkFor(source, target) {
-            for (var i=0; i<links.length; ++i) {
-                if ((links[i].source == source) && (links[i].target == target))
-                    return links[i];
-                if ((links[i].source == target) && (links[i].target == source))
-                    return links[i];
-            }
-            // the selected node was a client/broker
-            //QDR.log.debug("failed to find a link between ");
-            //console.dump(source);
-            //QDR.log.debug(" and ");
-            //console.dump(target);
-            return null;
-        }
-
-	    // takes the nodes and links array of objects and adds svg elements for everything that hasn't already
-	    // been added
-	    function restart(start) {
-	        circle.call(force.drag);
-	        //svg.classed('ctrl', true);
-
-	        // path (link) group
-	        path = path.data(links);
-
-			// update existing links
-  			path.classed('selected', function(d) { return d === selected_link; })
-  			    .classed('highlighted', function(d) { return d.highlighted; } )
-  			    .classed('temp', function(d) { return d.cls == 'temp'; } )
-                .attr('marker-start', function(d) {
-                    var sel = d===selected_link ? '-selected' : '';
-                    return d.left ? 'url('+urlPrefix+'#start-arrow' + sel + ')' : ''; })
-                .attr('marker-end', function(d) {
-                    var sel = d===selected_link ? '-selected' : '';
-                    return d.right ? 'url('+urlPrefix+'#end-arrow' + sel +')' : ''; })
-
-
-			// add new links. if links[] is longer than the existing paths, add a new path for each new element
-			path.enter().append('svg:path')
-				.attr('class', 'link')
-                .attr('marker-start', function(d) {
-                        var sel = d===selected_link ? '-selected' : '';
-						return d.left ? 'url('+urlPrefix+'#start-arrow' + sel + ')' : ''; })
-                .attr('marker-end', function(d) {
-					var sel = d===selected_link ? '-selected' : '';
-                    return d.right ? 'url('+urlPrefix+'#end-arrow' + sel + ')' : ''; })
-  			    .classed('temp', function(d) { return d.cls == 'temp'; } )
-	            .on('mouseover', function (d) {
-				  if($scope.addingNode.step > 0) {
-				    if (d.cls == 'temp') {
-				        d3.select(this).classed('over', true);
-				    }
-				    return;
-				  }
-				        //QDR.log.debug("showing connections form");
-					var resultIndex = 0; // the connection to use
-                    var left = d.left ? d.target : d.source;
-					// right is the node that the arrow points to, left is the other node
-					var right = d.left ? d.source : d.target;
-					var onode = QDRService.topology.nodeInfo()[left.key];
-					// loop through all the connections for left, and find the one for right
-					if (!onode || !onode['.connection'])
-						return;
-                    // update the info dialog for the link the mouse is over
-                    if (!selected_node && !selected_link) {
-                        for (resultIndex=0; resultIndex < onode['.connection'].results.length; ++resultIndex) {
-                            var conn = onode['.connection'].results[resultIndex];
-                            /// find the connection whose container is the right's name
-                            var name = QDRService.valFor(onode['.connection'].attributeNames, conn, "container");
-                            if (name == right.name) {
-                                break;
-                            }
-                        }
-                        // did not find connection. this is a connection to a non-interrouter node
-                        if (resultIndex === onode['.connection'].results.length) {
-                            // use the non-interrouter node's connection info
-                            left = d.target;
-                            resultIndex = left.resultIndex;
-                        }
-                        updateConnForm(left, resultIndex);
-                    }
-
-					// select link
-					mousedown_link = d;
-					selected_link = mousedown_link;
-					//selected_node = null;
-					//mousedown_node = null;
-					restart();
-				})
-	            .on('mouseout', function (d) {
-				  if($scope.addingNode.step > 0) {
-				    if (d.cls == 'temp') {
-				        d3.select(this).classed('over', false);
-				    }
-				    return;
-				  }
-				        //QDR.log.debug("showing connections form");
-					// select link
-					selected_link = null;
-					//selected_node = null;
-					//mousedown_node = null;
-					restart();
-				})
-	            .on("contextmenu", function(d) {
-	                $(document).click();
-                    d3.event.preventDefault();
-	                if (d.cls !== "temp")
-	                    return;
-
-					mousedown_link = d;
-                    d3.select('#link_context_menu')
-                      .style('left', (mouseX + $(document).scrollLeft()) + "px")
-                      .style('top', (mouseY + $(document).scrollTop()) + "px")
-                      .style('display', 'block');
-                })
-                .on("dblclick", function (d) {
-                    var pos = d3.mouse(this);
-                    var diameter = 400;
-                    var format = d3.format(",d");
-                    var pack = d3.layout.pack()
-                        .size([diameter - 4, diameter - 4])
-                        .padding(3)
-                        .value(function(d) { return d.size; });
-
-                    var svg = d3.select("#crosssection").append("svg")
-                        .attr("width", diameter)
-                        .attr("height", diameter);
-                    var svgg = svg.append("g")
-                        .attr("transform", "translate(2,2)");
-
-					svg.on('click', function (d) {
-		                d3.select("#crosssection").style("display","none");
-					})
-
-					var root = {
-						name: "links between " + d.source.name + " and " + d.target.name,
-						children: []
-					}
-					var nodeInfo = QDRService.topology.nodeInfo();
-					var connections = nodeInfo[d.source.key]['.connection'];
-					var containerIndex = connections.attributeNames.indexOf('container');
-					connections.results.some ( function (connection) {
-                        if (connection[containerIndex] == d.target.containerName) {
-                            root.attributeNames = connections.attributeNames;
-                            root.obj = connection;
-                            root.desc = "Connection";
-                            return true;    // stop looping after 1 match
-                        }
-                        return false;
-                    })
-
-					// find router.links where link.remoteContainer is d.source.name
-					var links = nodeInfo[d.source.key]['.router.link'];
-					containerIndex = links.attributeNames.indexOf('remoteContainer');
-					var nameIndex = links.attributeNames.indexOf('name');
-					var linkDirIndex = links.attributeNames.indexOf('linkDir');
-					links.results.forEach ( function (link) {
-						if (link[containerIndex] == d.target.containerName)
-							root.children.push (
-								{ name: "(" + link[linkDirIndex] + ") " + link[nameIndex],
-								size: 100,
-								obj: link,
-	                            desc: "Link",
-								attributeNames: links.attributeNames
-							})
-					})
-					if (root.children.length == 0)
-						return;
-	                var node = svgg.datum(root).selectAll(".node")
-	                      .data(pack.nodes)
-	                    .enter().append("g")
-	                      .attr("class", function(d) { return d.children ? "parent node hastip" : "leaf node hastip"; })
-	                      .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
-	                      .attr("title", function (d) {
-	                          var title = "<h4>" + d.desc + "</h4><table class='tiptable'><tbody>";
-	                          if (d.attributeNames)
-		                            d.attributeNames.forEach( function (n, i) {
-		                                title += "<tr><td>" + n + "</td><td>";
-		                                title += d.obj[i] != null ? d.obj[i] : '';
-		                                title += '</td></tr>';
-		                            })
-		                      title += "</tbody></table>"
-	                          return title
-	                      })
-
-	                node.append("circle")
-	                      .attr("r", function(d) { return d.r; });
-
-//	                node.filter(function(d) { return !d.children; }).append("text")
-	                node.append("text")
-	                      .attr("dy", function (d) { return d.children ? "-10em" : ".3em"})
-	                      .style("text-anchor", "middle")
-	                      .text(function(d) {
-	                          return d.name.substring(0, d.r / 3);
-	                      });
-
-					$('.hastip').tooltipsy({ alignTo: 'cursor'});
-	                d3.select("#crosssection").style("display","block");
-                })
-
-
-	        // remove old links
-	        path.exit().remove();
-
-
-	        // circle (node) group
-	        // nodes are known by id
-	        circle = circle.data(nodes, function (d) {
-	            return d.id;
-	        });
-
-	        // update existing nodes visual states
-	        circle.selectAll('circle')
-	            .classed('selected', function (d) { return (d === selected_node) })
-	            .classed('fixed', function (d) { return (d.fixed & 0b1) })
-
-			// add new circle nodes. if nodes[] is longer than the existing paths, add a new path for each new element
-	        var g = circle.enter().append('svg:g');
-
-			// add new circles and set their attr/class/behavior
-	        g.append('svg:circle')
-	            .attr('class', 'node')
-	            .attr('r', function (d) {
-	            	return radii[d.nodeType];
-	            })
-	            .classed('fixed', function (d) {return d.fixed})
-  			    .classed('temp', function(d) { return QDRService.nameFromId(d.key) == '__internal__'; } )
-  			    .classed('normal', function(d) { return d.nodeType == 'normal' } )
-  			    .classed('inter-router', function(d) { return d.nodeType == 'inter-router' } )
-  			    .classed('on-demand', function(d) { return d.nodeType == 'on-demand' } )
-
-/*
-	            .style('fill', function (d) {
-	                var sColor = colors[d.nodeType];
-	                return (d === selected_node) ? d3.rgb(sColor).brighter().toString() : d3.rgb(sColor);
-	            })
-	            .style('stroke', function (d) {
-	                var sColor = colors[d.nodeType];
-	                return d3.rgb(sColor).darker().toString();
-	            })
-*/
-	            .on('mouseover', function (d) {
-	                if ($scope.addingNode.step > 0) {
-		                d3.select(this).attr('transform', 'scale(1.1)');
-						return;
-	                }
-					if (!selected_node) {
-                        if (d.nodeType === 'inter-router') {
-                            //QDR.log.debug("showing general form");
-                            updateNodeForm(d);
-                        } else if (d.nodeType === 'normal' || d.nodeType === 'on-demand') {
-                            //QDR.log.debug("showing connections form");
-                            updateConnForm(d, d.resultIndex);
-                        }
-					}
-
-	                if (d === mousedown_node) 
-	                    return;
-	                //if (d === selected_node)
-	                //    return;
-	                // enlarge target node
-	                d3.select(this).attr('transform', 'scale(1.1)');
-                    // highlight the next-hop route from the selected node to this node
-                    mousedown_node = null;
-
-	                if (!selected_node) {
-	                    return;
-	                }
-                    setTimeout(nextHop, 1, selected_node, d);
-	            })
-	            .on('mouseout', function (d) {
-	                // unenlarge target node
-	                d3.select(this).attr('transform', '');
-                    for (var i=0; i<links.length; ++i) {
-                        links[i]['highlighted'] = false;
-                    }
-                    restart();
-	            })
-	            .on('mousedown', function (d) {
-	                if (d3.event.button !== 0) {   // ignore all but left button
-	                    return;
-	                }
-	                mousedown_node = d;
-	                // mouse position relative to svg
-	                initial_mouse_down_position = d3.mouse(this.parentElement.parentElement.parentElement).slice();
-	            })
-	            .on('mouseup', function (d) {
-	                if (!mousedown_node)
-	                    return;
-
-                    selected_link = null;
-	                // unenlarge target node
-	                d3.select(this).attr('transform', '');
-
-	                // check for drag
-	                mouseup_node = d;
-	                var mySvg = this.parentElement.parentElement.parentElement;
-                    // if we dragged the node, make it fixed
-                    var cur_mouse = d3.mouse(mySvg);
-                    if (cur_mouse[0] != initial_mouse_down_position[0] ||
-                        cur_mouse[1] != initial_mouse_down_position[1]) {
-						console.log("mouse pos changed. making this node fixed")
-						d3.select(this).classed("fixed", d.fixed = true);
-                        resetMouseVars();
-                        return;
-	                }
-
-					// we didn't drag, we just clicked on the node
-	                if ($scope.addingNode.step > 0) {
-                        if (d.nodeType !== 'inter-router')
-                            return;
-						if (QDRService.nameFromId(d.key) == '__internal__')
-							return;
-
-						// add a link from the clicked node to the new node
-						getLink(d.id, nodes.length-1, "in", "temp");
-						$scope.addingNode.hasLink = true;
-						$scope.$apply();
-						// add new elements to the svg
-						force.links(links).start();
-						restart();
-						return;
-
-	                }
-
-					// if this node was selected, unselect it
-                    if (mousedown_node === selected_node) {
-                        selected_node = null;
-                        $scope.topoFormSelected = "";
-                    }
-                    else {
-                        selected_node = mousedown_node;
-                        if (d.nodeType === 'inter-router') {
-                            //QDR.log.debug("showing general form");
-                            updateNodeForm(d);
-                            $scope.topoFormSelected = "general";
-                        } else if (d.nodeType === 'normal' || d.nodeType === 'on-demand') {
-                            //QDR.log.debug("showing connections form");
-                            updateConnForm(d, d.resultIndex);
-                            $scope.topoFormSelected = "connections";
-                        }
-                    }
-                    for (var i=0; i<links.length; ++i) {
-                        links[i]['highlighted'] = false;
-                    }
-	                mousedown_node = null;
-                    $scope.$apply();
-                    restart(false);
-
-	            })
-	            .on("dblclick", function (d) {
-	                if (d.fixed) {
-						d3.select(this).classed("fixed", d.fixed = false);
-						force.start();  // let the nodes move to a new position
-	                }
-	                if (QDRService.nameFromId(d.key) == '__internal__') {
-	                    editNode();
-	                    $scope.$apply();
-	                }
-	            })
-	            .on("contextmenu", function(d) {
-	                $(document).click();
-                    d3.event.preventDefault();
-	                $scope.contextNode = d;
-	                $scope.$apply();    // we just changed a scope valiable during an async event
-                    d3.select('#node_context_menu')
-                      .style('left', (mouseX + $(document).scrollLeft()) + "px")
-                      .style('top', (mouseY + $(document).scrollTop()) + "px")
-                      .style('display', 'block');
-
-                });
-
-	        // show node IDs
-	        g.append('svg:text')
-	            .attr('x', 0)
-	            .attr('y', 4)
-	            .attr('class', 'id')
-	            .text(function (d) {
-	                return (d.nodeType === 'normal' || d.nodeType == 'on-demand') ? d.name.slice(-1) :
-	                    d.name.length>7 ? d.name.substr(0,6)+'...' : d.name;
-	        });
-
-	        // remove old nodes
-	        circle.exit().remove();
-
-	        if (!mousedown_node || !selected_node)
-	            return;
-
-            if (!start)
-                return;
-	        // set the graph in motion
-	        //QDR.log.debug("mousedown_node is " + mousedown_node);
-	        force.start();
-
-	    }
-
-        function nextHop(thisNode, d) {
-            if ((thisNode) && (thisNode != d)) {
-                var target = findNextHopNode(thisNode, d);
-                //QDR.log.debug("highlight link from node ");
-                 //console.dump(nodeFor(selected_node.name));
-                 //console.dump(target);
-                if (target) {
-                    var hlLink = linkFor(nodeFor(thisNode.name), target);
-                    //QDR.log.debug("need to highlight");
-                    //console.dump(hlLink);
-                    if (hlLink)
-                        hlLink['highlighted'] = true;
-                    else
-                        target = null;
-                }
-                setTimeout(nextHop, 1, target, d);
-            }
-            restart();
-        }
-
-
-	    function mousedown() {
-	        // prevent I-bar on drag
-	        //d3.event.preventDefault();
-
-	        // because :active only works in WebKit?
-	        svg.classed('active', true);
-	    }
-
-        QDRService.addUpdatedAction("topology", function() {
-            //QDR.log.debug("Topology controller was notified that the model was updated");
-            if (hasChanged()) {
-                QDR.log.info("svg graph changed")
-                saveChanged();
-                // TODO: update graph nodes instead of rebuilding entire graph
-                d3.select("#SVG_ID").remove();
-                animate = true;
-                initForceGraph();
-                initGlobe(cities);
-                //if ($location.path().startsWith("/topology"))
-                //    Core.notification('info', "Qpid dispatch router topology changed");
-
-            } else {
-                //QDR.log.debug("no changes")
-            }
-        });
-
-		function hasChanged () {
-			var nodeInfo = QDRService.topology.nodeInfo();
-			if (Object.keys(nodeInfo).length != Object.keys(savedKeys).length)
-				return true;
-			for (var key in nodeInfo) {
-                // if this node isn't in the saved node list
-                if (!savedKeys.hasOwnProperty(key))
-                    return true;
-                // if the number of connections for this node chaanged
-                if (nodeInfo[key]['.connection'].results.length != savedKeys[key]) {
-					/*
-					QDR.log.debug("number of connections changed for " + key);
-					QDR.log.debug("QDRService.topology._nodeInfo[key]['.connection'].results.length");
-					console.dump(QDRService.topology._nodeInfo[key]['.connection'].results.length);
-					QDR.log.debug("savedKeys[key]");
-					console.dump(savedKeys[key]);
-					*/
-                    return true;
-                }
-			}
-			return false;
-		};
-		function saveChanged () {
-            savedKeys = {};
-            var nodeInfo = QDRService.topology.nodeInfo();
-            // save the number of connections per node
-		    for (var key in nodeInfo) {
-		        savedKeys[key] = nodeInfo[key]['.connection'].results.length;
-		    }
-			//QDR.log.debug("saving current keys");
-			console.dump(savedKeys);
-		};
-		// we are about to leave the page, save the node positions
-		$rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl) {
-			//QDR.log.debug("locationChangeStart");
-			nodes.forEach( function (d) {
-	           localStorage[d.name] = angular.toJson({x: d.x, y: d.y, fixed: d.fixed});
-			});
-            $scope.addingNode.step = 0;
-
-		});
-		// When the DOM element is removed from the page,
-        // AngularJS will trigger the $destroy event on
-        // the scope
-        $scope.$on("$destroy", function( event ) {
-   			//QDR.log.debug("scope on destroy");
-            QDRService.stopUpdating();
-            QDRService.delUpdatedAction("topology");
-			d3.select("#SVG_ID").remove();
-        });
-
-		initForceGraph();
-		saveChanged();
-        QDRService.startUpdating();
-
-		initGlobe(cities)//, "Boston", "Tel Aviv-Yafo"]);
-
-	    function doAddDialog(NewRouterName) {
-		    var modalInstance = $uibModal.open({
-		        animation: true,
-		        controller: 'QDR.NodeDialogController',
-		        templateUrl: 'node-config-template.html',
-		        size: 'lg',
-		        resolve: {
-		            newname: function () {
-		                return NewRouterName;
-		            }
-		        }
-		    });
-		    modalInstance.result.then(function (result) {
-				if (result)
-					setTimeout(doDownloadDialog, 100, result);
-		    });
-        };
-
-	    function doDownloadDialog(result) {
-		    var modalInstance = $uibModal.open({
-		        animation: true,
-				controller: 'QDR.DownloadDialogController',
-		        templateUrl: 'download-dialog-template.html',
-		        resolve: {
-		            results: function () {
-		                return result;
-		            }
-		        }
-		    });
-        };
-  }]);
-
-  QDR.module.controller("QDR.NodeDialogController", function($scope, QDRService, $uibModalInstance, newname) {
-   		var schema = QDRService.schema;
-   		var myEntities = ['container', 'router', 'log', 'listener' ];
-   		var typeMap = {integer: 'number', string: 'text', path: 'text', boolean: 'boolean'};
-		var newLinks = $('path.temp').toArray();    // jquery array of new links for the added router
-		var nodeInfo = QDRService.topology.nodeInfo();
-		var separatedEntities = []; // additional entities required if a link is reversed
-		var myPort = 0, myAddr = '0.0.0.0'; // port and address for new router
-   		$scope.entities = [];
-
-		// find max port number that is used in all the listeners
-		var getMaxPort = function (nodeInfo) {
-			var maxPort = 5674;
-			for (var key in nodeInfo) {
-				var node = nodeInfo[key];
-				var listeners = node['.listener'];
-				var attrs = listeners.attributeNames;
-				for (var i=0; i<listeners.results.length; ++i) {
-					var res = listeners.results[i];
-					var port = QDRService.valFor(attrs, res, 'port');
-					if (parseInt(port, 10) > maxPort)
-						maxPort = parseInt(port, 10);
-				}
-			}
-			return maxPort;
-		}
-		var maxPort = getMaxPort(nodeInfo);
-
-		// construct an object that contains all the info needed for a single tab's fields
-		var entity = function (actualName, tabName, humanName, ent, icon, link) {
-			var nameIndex = -1; // the index into attributes that the name field was placed
-			var index = 0;
-			var info = {
-			    actualName: actualName,
-				tabName:    tabName,
-				humanName:  humanName,
-				description:ent.description,
-				icon:       angular.isDefined(icon) ? icon : '',
-				references: ent.references,
-				link:       link,
-
-   		        attributes: $.map(ent.attributes, function (value, key) {
-					// skip identity and depricated fields
-   		            if (key == 'identity' || value.description.startsWith('Deprecated'))
-   		                return null;
-					var val = value['default'];
-					if (key == 'name')
-						nameIndex = index;
-					index++;
-					return {    name:       key,
-								humanName:  QDRService.humanify(key),
-                                description:value.description,
-                                type:       typeMap[value.type],
-                                rawtype:    value.type,
-                                input:      typeof value.type == 'string' ? value.type == 'boolean' ? 'boolean' : 'input'
-                                                                          : 'select',
-                                selected:   val ? val : undefined,
-                                'default':  value['default'],
-                                value:      val,
-                                required:   value.required,
-                                unique:     value.unique
-                    };
-                })
-			}
-			// move the 'name' attribute to the 1st position
-			if (nameIndex > -1) {
-				var tmp = info.attributes[0];
-				info.attributes[0] = info.attributes[nameIndex];
-				info.attributes[nameIndex] = tmp;
-			}
-			return info;
-		}
-
-		// remove the annotation fields
-		var stripAnnotations = function (entityName, ent, annotations) {
-			if (ent.references) {
-				var newEnt = {attributes: {}};
-				ent.references.forEach( function (annoKey) {
-					if (!annotations[annoKey])
-						annotations[annoKey] = {};
-					annotations[annoKey][entityName] = true;    // create the key/consolidate duplicates
-					var keys = Object.keys(schema.annotations[annoKey].attributes);
-					for (var attrib in ent.attributes) {
-						if (keys.indexOf(attrib) == -1) {
-							newEnt.attributes[attrib] = ent.attributes[attrib];
-						}
-					}
-					// add a field for the reference name
-					newEnt.attributes[annoKey] = {type: 'string',
-							description: 'Name of the ' + annoKey + ' section.',
-							'default': annoKey, required: true};
-				})
-				newEnt.references = ent.references;
-				newEnt.description = ent.description;
-				return newEnt;
-			}
-			return ent;
-		}
-
-		var annotations = {};
-   		myEntities.forEach(function (entityName) {
-   		    var ent = schema.entityTypes[entityName];
-   		    var hName = QDRService.humanify(entityName);
-   		    if (entityName == 'listener')
-   		        hName = "Listener for clients";
-   		    var noAnnotations = stripAnnotations(entityName, ent, annotations);
-			var ediv = entity(entityName, entityName, hName, noAnnotations, undefined);
-			if (ediv.actualName == 'router') {
-				ediv.attributes.filter(function (attr) { return attr.name == 'name'})[0].value = newname;
-				// if we have any new links (connectors), then the router's mode should be interior
-				if (newLinks.length) {
-					var roleAttr = ediv.attributes.filter(function (attr) { return attr.name == 'mode'})[0];
-					roleAttr.value = roleAttr.selected = "interior";
-				}
-			}
-			if (ediv.actualName == 'container') {
-				ediv.attributes.filter(function (attr) { return attr.name == 'containerName'})[0].value = newname + "-container";
-			}
-			if (ediv.actualName == 'listener') {
-				// find max port number that is used in all the listeners
-				ediv.attributes.filter(function (attr) { return attr.name == 'port'})[0].value = ++maxPort;
-			}
-			// special case for required log.module since it doesn't have a default
-			if (ediv.actualName == 'log') {
-				var moduleAttr = ediv.attributes.filter(function (attr) { return attr.name == 'module'})[0];
-				moduleAttr.value = moduleAttr.selected = "DEFAULT";
-			}
-			$scope.entities.push( ediv );
-   		})
-
-		// add a tab for each annotation that was found
-		var annotationEnts = [];
-		for (var key in annotations) {
-			ent = angular.copy(schema.annotations[key]);
-			ent.attributes.name = {type: "string", unique: true, description: "Unique name that is used to refer to this set of attributes."}
-			var ediv = entity(key, key+'tab', QDRService.humanify(key), ent, undefined);
-			ediv.attributes.filter(function (attr) { return attr.name == 'name'})[0].value = key;
-			$scope.entities.push( ediv );
-			annotationEnts.push( ediv );
-		}
-
-		// add an additional listener tab if any links are reversed
-		ent = schema.entityTypes['listener'];
-		newLinks.some(function (link) {
-			if (link.__data__.right) {
-	   		    var noAnnotations = stripAnnotations('listener', ent, annotations);
-				var ediv = entity("listener", "listener0", "Listener (internal)", noAnnotations, undefined);
-				ediv.attributes.filter(function (attr) { return attr.name == 'port'})[0].value = ++maxPort;
-				// connectors from other routers need to connect to this addr:port
-				myPort = maxPort;
-				myAddr = ediv.attributes.filter(function (attr) { return attr.name == 'addr'})[0].value
-
-				// override the role. 'normal' is the default, but we want inter-router
-				ediv.attributes.filter(function( attr ) { return attr.name == 'role'})[0].selected = 'inter-router';
-				separatedEntities.push( ediv );
-				return true; // stop looping
-			}
-			return false;   // continue looping
-		})
-
-		// Add connector tabs for each new link on the topology graph
-		ent = schema.entityTypes['connector'];
-		newLinks.forEach(function (link, i) {
-   		    var noAnnotations = stripAnnotations('connector', ent, annotations);
-			var ediv = entity('connector', 'connector' + i, " " + link.__data__.source.name, noAnnotations, link.__data__.right, link)
-
-			// override the connector role. 'normal' is the default, but we want inter-router
-			ediv.attributes.filter(function( attr ) { return attr.name == 'role'})[0].selected = 'inter-router';
-
-			// find the addr:port of the inter-router listener to use
-			var listener = nodeInfo[link.__data__.source.key]['.listener'];
-			var attrs = listener.attributeNames;
-			for (var i=0; i<listener.results.length; ++i) {
-				var res = listener.results[i];
-				var role = QDRService.valFor(attrs, res, 'role');
-				if (role == 'inter-router') {
-					ediv.attributes.filter(function( attr ) { return attr.name == 'addr'})[0].value =
-						QDRService.valFor(attrs, res, 'addr')
-					ediv.attributes.filter(function( attr ) { return attr.name == 'port'})[0].value =
-						QDRService.valFor(attrs, res, 'port')
-					break;
-				}
-			}
-			if (link.__data__.right) {
-				// connectors from other nodes need to connect to the new router's listener addr:port
-   				ediv.attributes.filter(function (attr) { return attr.name == 'port'})[0].value = myPort;
-   				ediv.attributes.filter(function (attr) { return attr.name == 'addr'})[0].value = myAddr;
-
-				separatedEntities.push(ediv)
-			}
-			else
-				$scope.entities.push( ediv );
-		})
-		Array.prototype.push.apply($scope.entities, separatedEntities);
-
-		// update the description on all the annotation tabs
-		annotationEnts.forEach ( function (ent) {
-			var shared = Object.keys(annotations[ent.actualName]);
-			ent.description += " These fields are shared by " + shared.join(" and ") + ".";
-
-		})
-
-        $scope.cancel = function () {
-            $uibModalInstance.close()
-        };
-		$scope.testPattern = function (attr) {
-			if (attr.rawtype == 'path')
-				return /^(\/)?([^/\0]+(\/)?)+$/;
-				//return /^(.*\/)([^/]*)$/;
-			return /(.*?)/;
-		}
-
-		$scope.attributeDescription = '';
-		$scope.attributeType = '';
-		$scope.attributeRequired = '';
-		$scope.attributeUnique = '';
-		$scope.active = 'container'
-		$scope.fieldsetDivs = "/fieldsetDivs.html"
-		$scope.setActive = function (tabName) {
-			$scope.active = tabName
-		}
-		$scope.isActive = function (tabName) {
-			return $scope.active === tabName
-		}
-		$scope.showDescription = function (attr, e) {
-			$scope.attributeDescription = attr.description;
-			var offset = jQuery(e.currentTarget).offset()
-			jQuery('.attr-description').offset({top: offset.top})
-
-			$scope.attributeType = "Type: " + JSON.stringify(attr.rawtype);
-			$scope.attributeRequired = attr.required ? 'required' : '';
-			$scope.attributeUnique = attr.unique ? 'Must be unique' : '';
-		}
-        // handle the download button click
-        // copy the dialog's values to the original node
-        $scope.download = function () {
-	        $uibModalInstance.close({entities: $scope.entities, annotations: annotations});
-        }
-
-		$scope.selectAnnotationTab = function (tabName) {
-            var tabs = $( "#tabs" ).tabs();
-            tabs.tabs("select", tabName);
-		}
-
-        var initTabs = function () {
-            var div = angular.element("#tabs");
-            if (!div.width()) {
-                setTimeout(initTabs, 100);
-                return;
-            }
-            $( "#tabs" )
-                .tabs()
-                .addClass('ui-tabs-vertical ui-helper-clearfix');
-        }
-        // start the update loop
-        initTabs();
-
-  });
-
-QDR.module.controller("QDR.DownloadDialogController", function($scope, QDRService, $templateCache, $window, $uibModalInstance, results) {
-
-		var result = results.entities;
-		var annotations = results.annotations;
-		var annotationKeys = Object.keys(annotations);
-		var annotationSections = {};
-
-		// use the router's name as the file name if present
-		$scope.newRouterName = 'router';
-		result.forEach( function (e) {
-			if (e.actualName == 'router') {
-				e.attributes.forEach( function (a) {
-					if (a.name == 'name') {
-						$scope.newRouterName = a.value;
-					}
-				})
-			}
-		})
-		$scope.newRouterName = $scope.newRouterName + ".conf";
-
-		var template = $templateCache.get('config-file-header.html');
-		$scope.verbose = true;
-		$scope.$watch('verbose', function (newVal) {
-			if (newVal !== undefined) {
-				// recreate output using current verbose setting
-				getOutput();
-			}
-		})
-
-		var getOutput = function () {
-			$scope.output = template + '\n';
-			$scope.parts = [];
-			var commentChar = '#'
-			result.forEach(function (entity) {
-				// don't output a section for annotations, they get flattened into the entities
-				var section = "";
-				if (entity.icon) {
-					section += "##\n## Add to " + entity.link.__data__.source.name + "'s configuration file\n##\n";
-				}
-				section += "##\n## " + QDRService.humanify(entity.actualName) + " - " + entity.description + "\n##\n";
-				section += entity.actualName + " {\n";
-				entity.attributes.forEach(function (attribute) {
-					if (attribute.input == 'select')
-						attribute.value = attribute.selected;
-
-					// treat values with all spaces and empty strings as undefined
-					attribute.value = String(attribute.value).trim();
-					if (attribute.value === 'undefined' || attribute.value === '')
-						attribute.value = undefined;
-
-					if ($scope.verbose) {
-						commentChar = attribute.required || attribute.value != attribute['default'] ? ' ' : '#';
-						if (!attribute.value) {
-							commentChar = '#';
-							attribute.value = '';
-						}
-						section += commentChar + "    "
-							+ attribute.name + ":" + Array(Math.max(20 - attribute.name.length, 1)).join(" ")
-							+ attribute.value
-						    + Array(Math.max(20 - ((attribute.value)+"").length, 1)).join(" ")
-							+ '# ' + attribute.description
-						    + "\n";
-					} else {
-						if (attribute.value) {
-							if (attribute.value != attribute['default'] || attribute.required)
-								section += "    "
-									+ attribute.name + ":" + Array(20 - attribute.name.length).join(" ")
-									+ attribute.value + "\n";
-
-						}
-					}
-				})
-				section += "}\n\n";
-				// if entity.icon is true, this is a connector intended for another router
-				if (entity.icon)
-					$scope.parts.push({output: section,
-								link: entity.link,
-								name: entity.link.__data__.source.name,
-								references: entity.references});
-				else
-					$scope.output += section;
-
-				// if this section is actually an annotation
-				if (annotationKeys.indexOf(entity.actualName) > -1) {
-					annotationSections[entity.actualName] = section;
-				}
-			})
-			// go back and add annotation sections to the parts
-			$scope.parts.forEach (function (part) {
-				for (var section in annotationSections) {
-					if (part.references.indexOf(section) > -1) {
-						part.output += annotationSections[section];
-					}
-				}
-			})
-			QDR.log.debug($scope.output);
-		}
-
-        // handle the download button click
-        $scope.download = function () {
-			var blob = new Blob([$scope.output], { type: 'text/plain' });
-	        var downloadLink = angular.element('<a></a>');
-	        downloadLink.attr('href', ($window.URL || $window.webkitURL).createObjectURL(blob));
-	        downloadLink.attr('download', $scope.newRouterName);
-	        downloadLink[0].click();
-        }
-
-		$scope.downloadPart = function (part) {
-			var linkName = part.link.__data__.source.name + 'additional.conf';
-			var blob = new Blob([part.output], { type: 'text/plain' });
-	        var downloadLink = angular.element('<a></a>');
-	        downloadLink.attr('href', ($window.URL || $window.webkitURL).createObjectURL(blob));
-	        downloadLink.attr('download', linkName);
-	        downloadLink[0].click();
-
-			QDR.log.debug(part);
-		}
-
-		$scope.done = function () {
-	        $uibModalInstance.close();
-		}
-});
-
-  return QDR;
-}(QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/lib/jquery.tipsy.js
----------------------------------------------------------------------
diff --git a/console/plugin/lib/jquery.tipsy.js b/console/plugin/lib/jquery.tipsy.js
deleted file mode 100644
index 7c12d4e..0000000
--- a/console/plugin/lib/jquery.tipsy.js
+++ /dev/null
@@ -1,418 +0,0 @@
-// tipsy, facebook style tooltips for jquery
-// version 1.0.2
-// (c) 2008-2010 jason frame [jason@onehackoranother.com]
-// released under the MIT license
-
-(function($, window, undefined) {
-
-    function maybeCall(thing, ctx) {
-        return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
-    }
-
-    function isElementInDOM(ele) {
-        while (ele = ele.parentNode) {
-            if (ele == document) return true;
-        }
-        return false;
-    }
-
-	// Returns true if it is a DOM element
-	// http://stackoverflow.com/a/384380/999
-	function isElement(o){
-		return (
-			typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
-			o && typeof o === "object" && o.nodeType === 1 && typeof o.nodeName==="string"
-		);
-	}
-
-    var tipsyIDcounter = 0;
-    function tipsyID() {
-        return "tipsyuid" + (tipsyIDcounter++);
-    }
-
-    function Tipsy(element, options) {
-        this.$element = $(element);
-        this.options = options;
-        this.enabled = true;
-        this.fixTitle();
-    }
-
-    Tipsy.prototype = {
-        show: function() {
-            if (!isElementInDOM(this.$element[0])) {
-                return;
-            }
-
-            if (isElement(this.$element) && !this.$element.is(':visible')) {
-                return;
-            }
-
-            var title;
-            if (this.enabled && (title = this.getTitle())) {
-                var $tip = this.tip();
-
-                $tip.find('.tipsy-inner' + this.options.theme)[this.options.html ? 'html' : 'text'](title);
-
-                $tip[0].className = 'tipsy' + this.options.theme; // reset classname in case of dynamic gravity
-                if (this.options.className) {
-                    $tip.addClass(maybeCall(this.options.className, this.$element[0]));
-                }
-
-                $tip.remove().css({top: 0, left: 0, width: 'auto', visibility: 'hidden', display: 'block'}).prependTo(document.body);
-
-                var pos = $.extend({}, this.$element.offset());
-
-                // If the element is contained in a SVG object, use getBBox
-                if (this.$element.parents('svg').size() > 0) {
-                    pos = $.extend(pos, this.$element[0].getBBox());
-                } else {
-                    pos = $.extend(pos, {
-                        width: this.$element[0].offsetWidth || 0,
-                        height: this.$element[0].offsetHeight || 0
-                    });
-                }
-
-                var actualWidth = $tip[0].offsetWidth,
-                    actualHeight = $tip[0].offsetHeight,
-                    gravity = maybeCall(this.options.gravity, this.$element[0]);
-
-                var tp;
-                switch (gravity.charAt(0)) {
-                    case 'n':
-                        tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
-                        break;
-                    case 's':
-                        tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
-                        break;
-                    case 'e':
-                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
-                        break;
-                    case 'w':
-                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
-                        break;
-                    default:
-                        break;
-                }
-
-                if (gravity.length == 2) {
-                    if (gravity.charAt(1) == 'w') {
-                        tp.left = pos.left + pos.width / 2 - 15;
-                    } else {
-                        tp.left = pos.left + pos.width / 2 - actualWidth + 15;
-                    }
-                }
-
-                $tip.css(tp).addClass('tipsy-' + gravity + this.options.theme);
-                $tip.find('.tipsy-arrow' + this.options.theme)[0].className = 'tipsy-arrow' + this.options.theme + ' tipsy-arrow-' + gravity.charAt(0) + this.options.theme;
-                $tip.css({width: (actualWidth - 8) + 'px'});
-
-                if (this.options.fade) {
-                    if(this.options.shadow)
-                        $(".tipsy-inner").css({'box-shadow': '0px 0px '+this.options.shadowBlur+'px '+this.options.shadowSpread+'px rgba(0, 0, 0, '+this.options.shadowOpacity+')', '-webkit-box-shadow': '0px 0px '+this.options.shadowBlur+'px '+this.options.shadowSpread+'px rgba(0, 0, 0, '+this.options.shadowOpacity+')'});
-                    $tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity}, this.options.fadeInTime);
-                } else {
-                    $tip.css({visibility: 'visible', opacity: this.options.opacity});
-                }
-
-                if (this.options.aria) {
-                    var $tipID = tipsyID();
-                    $tip.attr("id", $tipID);
-                    this.$element.attr("aria-describedby", $tipID);
-                }
-            }
-        },
-
-        hide: function() {
-            if (this.options.fade) {
-                this.tip().stop().fadeOut(this.options.fadeOutTime, function() { $(this).remove(); });
-            } else {
-                this.tip().remove();
-            }
-            if (this.options.aria) {
-                this.$element.removeAttr("aria-describedby");
-            }
-        },
-
-        fixTitle: function() {
-            var $e = this.$element,
-                id = maybeCall(this.options.id, this.$element[0]);
-            if ($e.prop('title') || typeof($e.prop('original-title')) != 'string') {
-                $e.prop('original-title', $e.prop('title') || '').removeAttr('title');
-                // add aria-describedby pointing to the tooltip's id
-                $e.attr('aria-describedby', id);
-                // if it doesn't already have a tabindex, force the trigger element into the tab cycle
-                // to make it keyboard accessible with tabindex=0. this automatically makes elements
-                // that are not normally keyboard accessible (div or span) that have been tipsy-fied
-                // also operable with the keyboard.
-                if ($e.attr('tabindex') === undefined) {
-                    $e.attr('tabindex', 0);
-                }
-            }
-        },
-
-        getTitle: function() {
-            var title, $e = this.$element, o = this.options;
-            this.fixTitle();
-            if (typeof o.title == 'string') {
-                title = $e.prop(o.title == 'title' ? 'original-title' : o.title);
-            } else if (typeof o.title == 'function') {
-                title = o.title.call($e[0]);
-            }
-            title = ('' + title).replace(/(^\s*|\s*$)/, "");
-            return title || o.fallback;
-        },
-
-        tip: function() {
-            var id = maybeCall(this.options.id, this.$element[0]);
-
-            if (!this.$tip) {
-                // generate tooltip, with appropriate ARIA role and an 'id' (can be set in options),
-                // so it can be targetted by aria-describedby in the trigger element
-                this.$tip = $('<div class="tipsy' + this.options.theme + '" id="'+id+'" role="tooltip"></div>').html('<div class="tipsy-arrow' + this.options.theme + '"></div><div class="tipsy-inner' + this.options.theme + '"></div>').attr("role","tooltip");
-                this.$tip.data('tipsy-pointee', this.$element[0]);
-            }
-            return this.$tip;
-        },
-
-        validate: function() {
-            if (!this.$element[0].parentNode) {
-                this.hide();
-                this.$element = null;
-                this.options = null;
-            }
-        },
-
-        enable: function() { this.enabled = true; },
-        disable: function() { this.enabled = false; },
-        toggleEnabled: function() { this.enabled = !this.enabled; }
-    };
-
-    $.fn.tipsy = function(options) {
-
-        $.fn.tipsy.enable();
-
-        if (options === true) {
-            return this.data('tipsy');
-        } else if (typeof options == 'string') {
-            var tipsy = this.data('tipsy');
-            if (tipsy) tipsy[options]();
-            return this;
-        }
-
-        options = $.extend({}, $.fn.tipsy.defaults, options);
-
-        // Establish theme
-        options.theme = (options.theme && options.theme !== '') ? '-' + options.theme : '';
-
-        function get(ele) {
-            var tipsy = $.data(ele, 'tipsy');
-            if (!tipsy) {
-                tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
-                $.data(ele, 'tipsy', tipsy);
-            }
-            return tipsy;
-        }
-
-        function enter() {
-            if ($.fn.tipsy.enabled !== true) {
-                return;
-            }
-            var tipsy = get(this);
-            tipsy.hoverState = 'in';
-            if (options.delayIn === 0) {
-                tipsy.show();
-            } else {
-                tipsy.fixTitle();
-                setTimeout(function() {
-                    if (tipsy.hoverState == 'in' && isElementInDOM(tipsy.$element)) {
-                        tipsy.show();
-                    }
-                }, options.delayIn);
-            }
-        }
-
-        function leave() {
-            var tipsy = get(this);
-            tipsy.hoverState = 'out';
-            if (options.delayOut === 0) {
-                tipsy.hide();
-            } else {
-                setTimeout(function() { if (tipsy.hoverState == 'out' || !tipsy.$element || !tipsy.$element.is(':visible')) tipsy.hide(); }, options.delayOut);
-            }
-        }
-
-        if (!options.live) this.each(function() { get(this); });
-
-        if (options.trigger != 'manual') {
-            // one of the biggest changes from 1.0.0a: by default, bind to BOTH mouseenter/mouseleave AND focus/blur
-            // this ensures out-of-the-box keyboard accessibility, showing tooltips when users TAB to a (focusable) element
-            // sites that still use 'hover' will also get this new interactive behavior automatically, only those who
-            // explicitly set 'focus' will only get focus/blur (for forms, for instance)
-
-            if (options.live && options.live !== true) {
-                if (options.trigger != 'focus') {
-                    $(this).on('mouseenter', options.live, enter);
-                    $(this).on('mouseleave', options.live, leave);
-                }
-                if (options.trigger != 'blur') {
-                    $(this).on('focus', options.live, enter);
-                    $(this).on('blur', options.live, leave);
-                }
-            } else {
-                if (options.live && !$.live) {
-                    //live === true and using jQuery >= 1.9
-                    throw "Since jQuery 1.9, pass selector as live argument. eg. $(document).tipsy({live: 'a.live'});";
-                }
-                var binder = options.live ? 'live' : 'bind';
-                if (options.trigger != 'focus') {
-                    this[binder]('mouseenter', enter)[binder]('mouseleave', leave);
-                }
-                if (options.trigger != 'blur') {
-                    this[binder]('focus', enter)[binder]('blur', leave);
-                }
-            }
-        }
-
-        return this;
-
-    };
-
-    $.fn.tipsy.defaults = {
-        aria: false,
-        className: null,
-        id: 'tipsy',
-        delayIn: 0,
-        delayOut: 0,
-        fade: false,
-        fadeInTime: 400,
-        fadeOutTime: 400,
-        shadow: false,
-        shadowBlur: 8,
-        shadowOpacity: 1,
-        shadowSpread: 0,
-        fallback: '',
-        gravity: 'n',
-        html: false,
-        live: false,
-        offset: 0,
-        opacity: 0.8,
-        title: 'title',
-        trigger: 'interactive',
-        theme: ''
-    };
-
-    $.fn.tipsy.revalidate = function() {
-      $('.tipsy').each(function() {
-        var pointee = $.data(this, 'tipsy-pointee');
-        if (!pointee || !isElementInDOM(pointee)) {
-          $(this).remove();
-        }
-      });
-    };
-
-    $.fn.tipsy.enable = function() {
-        $.fn.tipsy.enabled = true;
-    };
-
-    $.fn.tipsy.disable = function() {
-        $.fn.tipsy.enabled = false;
-    };
-
-    // Overwrite this method to provide options on a per-element basis.
-    // For example, you could store the gravity in a 'tipsy-gravity' attribute:
-    // return $.extend({}, options, {gravity: $(ele).prop('tipsy-gravity') || 'n' });
-    // (remember - do not modify 'options' in place!)
-    $.fn.tipsy.elementOptions = function(ele, options) {
-        return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
-    };
-
-    $.fn.tipsy.autoNS = function() {
-        return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
-    };
-
-    $.fn.tipsy.autoWE = function() {
-        return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
-    };
-
-    $.fn.tipsy.autoNWNE = function() {
-        return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'ne' : 'nw';
-    };
-
-    $.fn.tipsy.autoSWSE = function() {
-        return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'se' : 'sw';
-    };
-
-    /**
-     * yields a closure of the supplied parameters, producing a function that takes
-     * no arguments and is suitable for use as an autogravity function like so:
-     *
-     * @param marginNorth (int) - distance from the viewable region top edge that an
-     *        element should be before setting its tooltip's gravity to be away
-     *        from that edge.
-     * @param marginEast (int) - distance from the viewable region right edge that an
-     *        element should be before setting its tooltip's gravity to be away
-     *        from that edge.
-     * @param prefer (string, e.g. 'n', 'sw', 'w') - the direction to prefer
-     *        if there are no viewable region edges effecting the tooltip's
-     *        gravity. It will try to vary from this minimally, for example,
-     *        if 'sw' is preferred and an element is near the right viewable
-     *        region edge, but not the top edge, it will set the gravity for
-     *        that element's tooltip to be 'se', preserving the southern
-     *        component.
-     */
-    $.fn.tipsy.autoBounds = function(marginNorth, marginEast, prefer) {
-        return function() {
-            var dir = {ns: prefer[0], ew: (prefer.length > 1 ? prefer[1] : false)},
-                boundTop = $(document).scrollTop() + marginNorth,
-                boundLeft = $(document).scrollLeft() + marginEast,
-                $this = $(this);
-
-            if ($this.offset().top < boundTop) dir.ns = 'n';
-            if ($this.offset().left < boundLeft) dir.ew = 'w';
-            if ($(window).width() + $(document).scrollLeft() - $this.offset().left < marginEast) dir.ew = 'e';
-            if ($(window).height() + $(document).scrollTop() - $this.offset().top < marginNorth) dir.ns = 's';
-
-            return dir.ns + (dir.ew ? dir.ew : '');
-        };
-    };
-
-    /**
-     * Improved version of autoBounds for automatic placement of chunky tips
-     * The original autoBounds failed in two regards: 1. it would never return a 'w' or 'e', gravity even if they
-     * were preferred and/or optimal, 2. it only respected the margin between the left hand side of an element and
-     * left hand side of the viewport, and the top of an element and the top of the viewport. This version checks
-     * to see if the bottom of an element is too close to the bottom of the screen, similarly for the right hand side
-     */
-    $.fn.tipsy.autoBounds2 = function(margin, prefer) {
-        return function() {
-            var dir = {},
-                boundTop = $(document).scrollTop() + margin,
-                boundLeft = $(document).scrollLeft() + margin,
-                $this = $(this);
-
-            // bi-directional string (ne, se, sw, etc...)
-            if (prefer.length > 1) {
-                dir.ns = prefer[0];
-                dir.ew = prefer[1];
-            } else {
-                // single direction string (e, w, n or s)
-                if (prefer[0] == 'e' || prefer[0] == 'w') {
-                    dir.ew = prefer[0];
-                } else {
-                    dir.ns = prefer[0];
-                }
-            }
-
-            if ($this.offset().top < boundTop) dir.ns = 'n';
-            if ($this.offset().left < boundLeft) dir.ew = 'w';
-            if ($(window).width() + $(document).scrollLeft() - ($this.offset().left + $this.width()) < margin) dir.ew = 'e';
-            if ($(window).height() + $(document).scrollTop() - ($this.offset().top + $this.height()) < margin) dir.ns = 's';
-
-            if (dir.ns) {
-                return dir.ns + (dir.ew ? dir.ew : '');
-            }
-            return dir.ew;
-        }
-    };
-
-})(jQuery, window);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[14/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrCharts.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrCharts.html b/console/plugin/html/qdrCharts.html
deleted file mode 100644
index 8ba1ffe..0000000
--- a/console/plugin/html/qdrCharts.html
+++ /dev/null
@@ -1,150 +0,0 @@
-<div class="main-display row-fluid qdrCharts" ng-controller="QDR.ChartsController">
-    <div ng-show="hasCharts()">
-        <div ng-repeat="chart in svgCharts" class="chartContainer">
-            <p class="chartLabels">
-                <button ng-click="delChart(chart)" title="Delete"><i class="icon-trash"></i></button>
-                <button ng-click="editChart(chart)" title="Configure"><i class="icon-edit"></i></button>
-                <button ng-click="zoomChart(chart)" title="Zoom {{chart.zoomed ? 'in' : 'out'}}" ng-if="!chart.chart.request().nodeList"><i ng-class="chart.zoomed ? 'icon-zoom-in' : 'icon-zoom-out'"></i></button>
-            </p><div style="clear:both"></div>
-            <div id="{{chart.chart.id()}}" class="aChart d3Chart"></div>
-        </div>
-        <div ng-init="chartsLoaded()"></div>
-    </div>
-    <div ng-hide="hasCharts()" class="centered">
-        There are no charts. To add charts to this page, click on a <i class="icon-bar-chart"></i> icon on the <button ng-click="showListPage()"><i class="icon-list "></i> List</button> page.
-    </div>
-</div>
-
-<!--
-    This is the template for the graph dialog that is displayed. It uses the
-    dialogCtrl controller in qdrCharts.js.
--->
-<script type="text/ng-template" id="chart-config-template.html">
-<div class="chartOptions">
-    <div class="modal-header">
-        <h3 class="modal-title">Chart {{chart.attr() | humanify}}</h3>
-    </div>
-    <div class="modal-body">
-        <div id="{{svgDivId}}" class="d3Chart"></div>
-        <uib-tabset>
-            <uib-tab heading="Type">
-                <legend>Chart type</legend>
-                <label><input type="radio" ng-model="dialogChart.type" value="value" ng-change="chartChanged()" /> Value Chart</label>
-                <label><input type="radio" ng-model="dialogChart.type" value="rate" ng-change="chartChanged()" /> Rate Chart</label>
-                <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
-                    <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span>
-                    <div class="slider" ui-slider="slider.options" ng-model="rateWindow"></div>
-                </div>
-                <div style="clear:both;"> </div>
-            </uib-tab>
-            <uib-tab heading="Colors">
-                <legend>Chart colors</legend>
-                <div class="colorPicker">
-                    <div>Area</div><input minicolors="areaColor" id="position-bottom-left" type="text" ng-model="dialogChart.areaColor" />
-                </div>
-                <div class="colorPicker">
-                    <div>Line</div><input minicolors="lineColor" id="position-bottom-left" type="text" ng-model="dialogChart.lineColor" />
-                </div>
-                <div style="clear:both;"> </div>
-            </uib-tab>
-            <uib-tab heading="Duration">
-                <legend>Chart duration</legend>
-                <div class="dlg-slider duration">
-                    <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="duration.options" ng-model="dialogChart.visibleDuration"></div>
-                </div>
-                <div style="clear:both;"> </div>
-
-            </uib-tab>
-        </uib-tabset>
-    </div>
-    <div class="modal-footer">
-        <button class="btn btn-success" type="button" ng-click="apply()">Apply to existing chart</button>
-        <button class="btn btn-info" type="button" ng-click="copyToDashboard()">Create new chart</button>
-        <button class="btn btn-primary" type="button" ng-click="okClick()">Close</button>
-    </div>
-</div>
-<!--
-    <div class="chartOptions" title="Configure chart" ng-controller="QDR.ChartDialogController">
-        <p class="dialogHeader">Title: <input type="text" ng-model="userTitle" /></p>
-        <div id="{{svgDivId}}" class="d3Chart"></div>
-        <p></p>
-        <uib-tabset>
-            <uib-tab heading="Type">
-                <legend>Chart type</legend>
-                <label><input type="radio" ng-model="dialogChart.type" value="value" ng-change="chartChanged()" /> Value Chart</label>
-                <label><input type="radio" ng-model="dialogChart.type" value="rate" ng-change="chartChanged()" /> Rate Chart</label>
-
-                <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
-                    <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span>
-                    <div class="slider" ui-slider="slider.options" ng-model="rateWindow"></div>
-                </div>
-                <div style="clear:both;"> </div>
-            </uib-tab>
-            <uib-tab heading="Colors">
-                <legend>Chart colors</legend>
-                <div class="colorPicker">
-                    <div>Area</div><input minicolors="areaColor" id="position-bottom-left" type="text" ng-model="dialogChart.areaColor" />
-                </div>
-                <div class="colorPicker">
-                    <div>Line</div><input minicolors="lineColor" id="position-bottom-left" type="text" ng-model="dialogChart.lineColor" />
-                </div>
-                <div style="clear:both;"> </div>
-            </uib-tab>
-            <uib-tab heading="Duration">
-                <legend>Chart duration</legend>
-                <div class="dlg-slider duration">
-                    <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="duration.options" ng-model="dialogChart.visibleDuration"></div>
-                </div>
-                <div style="clear:both;"> </div>
-
-            </uib-tab>
-        </uib-tabset>
-
-        <tabset>
-            <tab heading="Type">
-                <div>
-                    <legend>Chart type</legend>
-                    <label>
-                        <input type="radio" ng-model="dialogChart.type" value="value" ng-change="chartChanged()" />
-                        Value Chart
-                    </label>
-                    <label class="rateGroup">
-                        <input type="radio" ng-model="dialogChart.type" value="rate" ng-change="chartChanged()" /> Rate Chart
-                    </label>
-                    <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
-                        <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="slider.options" ng-model="rateWindow"></div>
-                    </div>
-                </div>
-                <div style="clear:both;"> </div>
-            </tab>
-            <tab heading="Colors">
-                <div>
-                    <legend>Chart colors</legend>
-                    <div class="colorPicker">
-                        <div>Area</div><input minicolors="areaColor" id="position-bottom-left" type="text" ng-model="dialogChart.areaColor" />
-                    </div>
-                    <div class="colorPicker">
-                        <div>Line</div><input minicolors="lineColor" id="position-bottom-left" type="text" ng-model="dialogChart.lineColor" />
-                    </div>
-                </div>
-                <div style="clear:both;"> </div>
-            </tab>
-            <tab heading="Duration">
-                <div>
-                    <legend>Chart duration</legend>
-                </div>
-                <div class="dlg-slider duration">
-                    <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="duration.options" ng-model="dialogChart.visibleDuration"></div>
-                </div>
-                <div style="clear:both;"> </div>
-            </tab>
-        </tabset>
-        <div class="okButton">
-            <button ng-click="apply()">Apply to existing chart</button>
-            <button ng-click="copyToDashboard()">Create new chart</button>
-            <button ng-click="okClick()">Close</button>
-        </div>
-    </div>
--->
-</script>
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrConnect.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrConnect.html b/console/plugin/html/qdrConnect.html
deleted file mode 100644
index 34e452f..0000000
--- a/console/plugin/html/qdrConnect.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<div class="row-fluid" ng-controller="QDR.SettingsController">
-      <div class="login container" ng-hide="connecting">
-          <div class="row" id="login-container">
-              <div class="span2 offset4">
-                  <!-- <div simple-form name="settings" data="formConfig" entity="formEntity"></div> -->
-                  <form class="form-horizontal no-bottom-margin" novalidate name="settings" action="" method="post">
-                      <fieldset>
-                          <div class="control-group">
-                              <label class="control-label">Address: </label>
-                              <div class="controls">
-                                  <input type="text" description="Router address" ng-model="formEntity.address" name="address" required="required" autofocus="autofocus" class="ng-pristine ng-valid ng-valid-required">
-                                  <span class="help-block"></span>
-                              </div>
-                          </div>
-                          <div class="control-group">
-                              <label class="control-label" title="Port to connect to, by default 5673">Port: </label>
-                              <div class="controls">
-                                  <input type="number" description="Router port" tooltip="Ports to connect to, by default 5672" ng-model="formEntity.port" name="port" title="Port to connect to, by default 5673" class="ng-scope ng-pristine ng-valid ng-valid-number">
-                                  <span class="help-block"></span>
-                              </div>
-                          </div>
-                          <!--
-                                          <div class="control-group">
-                                              <label class="control-label">Username: </label>
-                                              <div class="controls">
-                                                  <input type="text" description="User Name" ng-model="formEntity.username" name="username" class="ng-pristine ng-valid">
-                                                  <span class="help-block"></span>
-                                              </div>
-                                          </div>
-                                          <div class="control-group">
-                                              <label class="control-label">Password: </label>
-                                              <div class="controls">
-                                                  <input type="password" description="Password" ng-model="formEntity.password" name="password" class="ng-pristine ng-valid">
-                                                  <span class="help-block"></span>
-                                              </div>
-                                          </div>
-                          -->
-                          <div class="control-group">
-                              <label class="control-label" title="Whether or not the connection should be started as soon as you navigate to the console">Autostart: </label>
-                              <div class="controls">
-                                  <input type="checkbox" description="Connect at startup" tooltip="Whether or not the connection should be started as soon as you navigate to the console" ng-model="formEntity.autostart" name="autostart" title="Whether or not the connection should be started as soon as you log into hawtio" class="ng-scope ng-pristine ng-valid">
-                                  <span class="help-block"></span>
-                              </div>
-                          </div>
-                          <input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;">
-                      </fieldset>
-                  </form>
-                  <p></p>
-                  <div>
-                      <button class="btn btn-primary pull-right" ng-disabled="settings.$invalid" ng-click="connect()">{{buttonText()}}</button>
-                  </div>
-              </div>
-          </div>
-      </div>
-
-  <div class="span4 centered" ng-show="connecting">
-    <i class="icon-spin icon-spinner icon-4x"></i>
-    <p>Please wait, connecting now...</p>
-  </div>
-  <div class="centered" ng-show="connectionError">
-    <p>There was a connection error: {{connectionErrorText}}</p>
-  </div>
-
-  <div class="span4"></div>
-</div>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrGraphs.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrGraphs.html b/console/plugin/html/qdrGraphs.html
deleted file mode 100644
index c311246..0000000
--- a/console/plugin/html/qdrGraphs.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<div ng-controller="QDR.ListController" title=""
-     class="prefs">
-  <div class="row-fluid">
-    <div class="tabbable">
-      <div value="graphs"
-           class="tab-pane" 
-           title="graphs">
-          <div>
-              <div id="graph"></div>
-
-          </div>
-      </div>
-     </div>
-  </div>
-</div>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrLayout.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrLayout.html b/console/plugin/html/qdrLayout.html
deleted file mode 100644
index d164f8a..0000000
--- a/console/plugin/html/qdrLayout.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-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.
--->
-<ul class="nav nav-tabs connected" ng-controller="QDR.NavBarController">
-  <li ng-repeat="link in breadcrumbs" ng-show="isValid(link)" ng-class='{active : isActive(link.href), "pull-right" : isRight(link), haschart: hasChart(link)}'>
-    <a ng-href="{{link.href}}{{hash}}" ng-bind-html="link.content | to_trusted"></a>
-  </li>
-</ul>
-<div class="row-fluid">
-  <div ng-view></div>
-</div>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrList.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrList.html b/console/plugin/html/qdrList.html
deleted file mode 100644
index 156b21a..0000000
--- a/console/plugin/html/qdrList.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
-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.
--->
-<div class="main-display row-fluid qdrList" ng-controller="QDR.ListController">
-    <ul class="nav nav-tabs qdrListNodes">
-          <li ng-repeat="node in nodes" ng-click="selectNode(node)" ng-class="{active : isNodeSelected(node.id)}"> <span>{{node.name}}</span> </li>
-    </ul>
-
-    <div class="row-fluid qdrListActions">
-        <ul class="nav nav-tabs ng-scope">
-            <li ng-repeat="entity in entities" ng-class="{active : isActionActive(entity.name)}" ng-click="selectAction(entity.name)" >
-                <a title="{{entity.title}}" data-placement="bottom"> {{entity.humanName}} </a></li>
-        </ul>
-            <div class="gridStyle" ng-style="getTableHeight()" ui-grid-auto-resize ui-grid-selection ui-grid="gridDef"></div>
-            <div class="selectedItems">
-                <div ng-style="getDetailsTableHeight()" ui-grid-auto-resize ui-grid-selection ui-grid="details"></div>
-            </div>
-    </div>
-</div>
-<!--
-    This is the template for the graph dialog that is displayed. It uses the
-    dialogCtrl controller in qdrList.js.
--->
-<script type="text/ng-template" id="template-from-script.html">
-    <div class="modal-header">
-        <h3 class="modal-title">Chart {{chart.attr() | humanify}}</h3>
-    </div>
-    <div class="modal-body">
-            <div id="{{svgDivId}}" class="d3Chart"></div>
-    </div>
-    <div class="modal-footer">
-        <span ng-hide="isOnChartsPage()">
-            <button class="btn btn-success" type="button" ng-click="addChartsPage()"><i class="icon-bar-chart"></i> Add</button> this chart to the Charts page.
-        </span>
-        <span ng-show="isOnChartsPage()">
-            <button class="btn btn-danger" type="button" ng-click="delChartsPage()">Remove</button> this chart from the <button class="btn btn-success" type="button" ng-click="showChartsPage()"><i class="icon-bar-chart"></i> Charts</button> page.
-        </span>
-        <button class="btn btn-primary" type="button" ng-click="ok()">Close</button>
-    </div>
-</script>
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrOverview.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrOverview.html b/console/plugin/html/qdrOverview.html
deleted file mode 100644
index d63ea0e..0000000
--- a/console/plugin/html/qdrOverview.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!--
-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.
--->
-<div ng-controller="QDR.OverviewController">
-
-    <div class="treeContainer">
-        <div id="overtree"></div>
-    </div>
-
-    <div class="treeDetails" ng-include="template.url"></div>
-</div>
-
-
-<!-- the following scripts are content that gets loaded into the above div that has the temple.url -->
-<script type="text/ng-template" id="routers.html">
-    <div class="row-fluid">
-        <h3>Routers</h3>
-        <div class="overview">
-            <div class="gridStyle" ng-style="getGridHeight(allRouters)" ui-grid-auto-resize ui-grid-selection ui-grid="allRouters"></div>
-        </div>
-    </div>
-</script>
-
-<script type="text/ng-template" id="router.html">
-    <div class="row-fluid">
-        <h3>Router {{router.data.title}}</h3>
-        <div ng-style="getGridHeight(routerGrid)" ui-grid-auto-resize ui-grid="routerGrid" class="gridStyle noHighlight"></div>
-    </div>
-</script>
-
-<script type="text/ng-template" id="addresses.html">
-    <div class="row-fluid">
-    <h3>Addresses</h3>
-    <div class="overview">
-        <div class="gridStyle" ng-style="getGridHeight(addressGrid)" ui-grid-auto-resize ui-grid-selection ui-grid="addressGrid"></div>
-    </div>
-    </div>
-</script>
-<script type="text/ng-template" id="address.html">
-    <div class="row-fluid">
-    <h3>Address {{address.data.title}}</h3>
-    <div ng-style="getGridHeight(addressGrid)" ui-grid-auto-resize class="gridStyle noHighlight" ui-grid="addressGrid"></div>
-    </div>
-</script>
-<script type="text/ng-template" id="connections.html">
-    <div class="row-fluid">
-    <h3>Connections</h3>
-    <div class="overview">
-        <div class="gridStyle" ng-style="getGridHeight(allConnectionGrid)" ui-grid-auto-resize ui-grid-selection ui-grid="allConnectionGrid"></div>
-    </div>
-    </div>
-</script>
-<script type="text/ng-template" id="connection.html">
-    <div class="row-fluid">
-    <h3>Connection {{connection.data.title}}</h3>
-    <div ng-style="getGridHeight(connectionGrid)" ui-grid-auto-resize class="gridStyle noHighlight" ui-grid="connectionGrid"></div>
-    </div>
-</script>
-<script type="text/ng-template" id="logs.html">
-    <div class="row-fluid">
-    <h3>Logs</h3>
-    </div>
-</script>
-<script type="text/ng-template" id="log.html">
-    <div class="row-fluid">
-    <h3>Log {{log.data.title}}</h3>
-    </div>
-</script>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrSchema.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrSchema.html b/console/plugin/html/qdrSchema.html
deleted file mode 100644
index 15ebb46..0000000
--- a/console/plugin/html/qdrSchema.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-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.
--->
-<div class="main-display row-fluid" ng-controller="QDR.SchemaController">
-    <json-formatter json="schema" open="2"></json-formatter>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrTopology.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrTopology.html b/console/plugin/html/qdrTopology.html
deleted file mode 100644
index 078cc97..0000000
--- a/console/plugin/html/qdrTopology.html
+++ /dev/null
@@ -1,222 +0,0 @@
-<!--
-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.
--->
-<div class="qdrTopology row-fluid" ng-controller="QDR.TopologyController">
-    <div class="tertiary left panel">
-        <div id="topologyForm" ng-class="{selected : isSelected()}">
-            <!-- <div ng-repeat="form in forms" ng-show="isVisible(form)" ng-class='{selected : isSelected(form)}'> -->
-
-            <div ng-show="isGeneral()">
-                <h4>Router Info</h4>
-                <div ng-style="getTableHeight(attributes)" ui-grid-auto-resize ui-grid="topoGridOptions"></div>
-            </div>
-            <div ng-show="isConnections()">
-                <h4>Connection Info</h4>
-                <div ng-style="getTableHeight(connAttributes)" ui-grid-auto-resize ui-grid="topoConnOptions"></div>
-            </div>
-            <div id="addNodeForm" ng-show="isAddNode()">
-                <h4>Add a new router</h4>
-                <ul>
-                    <li>Click on an existing router to create a connection to the new router</li>
-                    <li>Double-click on the new router to <button ng-click="editNewRouter()">edit</button> its properties</li>
-                    <li ng-show="addingNode.hasLink" >Right-click on a new connection to edit its properties</li>
-                </ul>
-                <button ng-click="cancel()">Cancel</button>
-            </div>
-        </div>
-    </div>
-    <div class="panel-adjacent canvas">
-
-<!--
-        <ul class="nav nav-tabs ng-scope qdrTopoModes">
-            <li ng-repeat="mode in modes" ng-class="{active : isModeActive(mode.name), 'pull-right' : isRight(mode)}" ng-click="selectMode('{{mode.name}}')" >
-                <a data-placement="bottom" class="ng-binding"> {{mode.name}} </a></li>
-        </ul>
--->
-        <div id="topology" ng-show="mode == 'Diagram'"><!-- d3 toplogy here --></div>
-        <div id="geology" ng-show="mode == 'Globe'"><!-- d3 globe here --></div>
-        <div id="crosssection"><!-- d3 pack here --></div>
-        <!-- <div id="addRouter" ng-show="mode == 'Add Node'"></div> -->
-        <div id="node_context_menu" class="contextMenu">
-            <ul>
-                <li class="na" ng-class="{new: contextNode.cls == 'temp'}" ng-click="addingNode.trigger = 'editNode'">Edit...</li>
-                <li class="na" ng-class="{adding: addingNode.step > 0}" ng-click="addingNode.step = 0">Cancel add</li>
-                <li class="context-separator"></li>
-                <li class="na" ng-class="{'force-display': !isFixed()}" ng-click="setFixed(true)">Freeze in place</li>
-                <li class="na" ng-class="{'force-display': isFixed()}" ng-click="setFixed(false)">Unfreeze</li>
-            </ul>
-        </div>
-        <div id="svg_context_menu" class="contextMenu">
-            <ul>
-                <li ng-click="addingNode.step = 2">Add a new router</li>
-            </ul>
-        </div>
-        <div id="link_context_menu" class="contextMenu">
-            <ul>
-                <li ng-click="reverseLink()">Reverse connection direction</li>
-                <li ng-click="removeLink()">Remove connection</li>
-            </ul>
-        </div>
-
-    </div>
-</div>
-<!--
-    This is the template for the node edit dialog that is displayed.
--->
-<script type="text/ng-template" id="node-config-template.html">
-    <div class="modal-header">
-        <h3 class="modal-title">Configure new router</h3>
-    </div>
-    <div class="modal-body">
-        <form novalidate name="editForm">
-        <div class="tabbable tabs-left">
-            <ul class="nav nav-tabs">
-                <li ng-repeat="entity in entities" ng-click="setActive(entity.tabName)" ng-class="{separated: entity.tabName == 'listener0'}">
-                    <a href="#{{entity.tabName}}" data-toggle="tab"><i ng-if="entity.icon !== ''" ng-class="entity.icon ? 'ui-icon-arrowthick-1-w' : 'ui-icon-arrowthick-1-e'" class="ui-icon"></i>{{entity.humanName}}</a>
-                </li>
-            </ul>
-            <div class="tab-content">
-                <div id="{{entity.tabName}}" ng-repeat="entity in entities" ng-show="isActive(entity.tabName)" class="entity-fields">
-                    <div class="entity-description">{{entity.description}}</div>
-                    <fieldset>
-                        <div ng-mouseenter="showDescription(attribute, $event)" ng-repeat="attribute in entity.attributes">
-                            <label for="{{attribute.name}}">{{attribute.humanName}}</label>
-                            <div ng-if="attribute.input == 'input'">
-                                <!-- ng-pattern="testPattern(attribute)" -->
-                                <input type="{{attribute.type}}" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.value" ng-required="attribute.required" class="ui-widget-content ui-corner-all">
-                            </div>
-                            <div ng-if="attribute.input == 'select'">
-                                <select id="{{attribute.name}}" ng-model="attribute.selected" ng-options="item for item in attribute.rawtype"></select>
-                            </div>
-                            <div ng-if="attribute.input == 'boolean'" class="boolean">
-                                <label><input type="radio" ng-model="attribute.value" value="true"> True</label>
-                                <label><input type="radio" ng-model="attribute.value" value="false"> False</label>
-                            </div>
-                        </div>
-                    </fieldset>
-                    <div class="attr-description">{{attributeDescription}}
-                        <div class="attr-type">{{attributeType}}</div>
-                        <div class="attr-required">{{attributeRequired}}</div>
-                        <div class="attr-unique">{{attributeUnique}}</div>
-                    </div>
-                    <div class="attr-annotations" ng-repeat="annotation in entity.annotatedBy">
-                        <span>You can also enter the <button ng-click="selectAnnotationTab(annotation)">{{annotation}}</button> values.</span>
-                    </div>
-                </div>
-            </div>
-        </div>
-        </form>
-    </div>
-    <div class="modal-footer">
-        <button class="btn btn-primary" type="button" ng-click="download()">Download</button>
-        <button class="btn btn-warning" type="button" ng-click="cancel()">Cancel</button>
-    </div>
-
-<!--
-
-
-    <div class="nodeOptions" title="Configure new router">
-        <form novalidate name="editForm">
-        <div id="tabs" class="nodeEntities">
-            <ul class="nodeTabs">
-                <li ng-repeat="entity in entities" ng-class="{separated: entity.tabName == 'listener0'}">
-
-                    <a href="#{{entity.tabName}}"><i ng-if="entity.icon !== ''" ng-class="entity.icon ? 'ui-icon-arrowthick-1-w' : 'ui-icon-arrowthick-1-e'" class="ui-icon"></i>{{entity.humanName}}</a>
-                </li>
-            </ul>
-            <div id="{{entity.tabName}}" ng-repeat="entity in entities" class="entity-fields">
-                <div class="entity-description">{{entity.description}}</div>
-                <fieldset>
-                    <div ng-mouseenter="showDescription(attribute, $event)" ng-repeat="attribute in entity.attributes">
-                        <label for="{{attribute.name}}">{{attribute.humanName}}</label>
-                        <div ng-if="attribute.input == 'input'">
-                            <input type="{{attribute.type}}" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.value" ng-pattern="testPattern(attribute)" ng-required="attribute.required" class="ui-widget-content ui-corner-all">
-                        </div>
-                        <div ng-if="attribute.input == 'select'">
-                            <select id="{{attribute.name}}" ng-model="attribute.selected" ng-options="item for item in attribute.rawtype"></select>
-                        </div>
-                        <div ng-if="attribute.input == 'boolean'" class="boolean">
-                            <label><input type="radio" ng-model="attribute.value" value="true"> True</label>
-                            <label><input type="radio" ng-model="attribute.value" value="false"> False</label>
-                        </div>
-                    </div>
-                </fieldset>
-                <div class="attr-description">{{attributeDescription}}
-                    <div class="attr-type">{{attributeType}}</div>
-                    <div class="attr-required">{{attributeRequired}}</div>
-                    <div class="attr-unique">{{attributeUnique}}</div>
-                </div>
-                <div class="attr-annotations" ng-repeat="annotation in entity.annotatedBy">
-                    <span>You can also enter the <button ng-click="selectAnnotationTab(annotation)">{{annotation}}</button> values.</span>
-                </div>
-            </div>
-        </div>
-        </form>
-
-        <div class="okButton">
-            <button ng-click="download()">Download</button>
-            <button ng-click="cancel()">Cancel</button>
-        </div>
-    </div>
-    -->
-</script>
-
-<script type="text/ng-template" id="config-file-header.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
-##
-</script>
-
-<script type="text/ng-template" id="download-dialog-template.html">
-    <div title="Configure new router">
-
-        <label title="Show descriptions and default values in confile files"><input type="checkbox" ng-model="verbose"> Verbose output</label>
-        <div>
-            <button ng-click="download()">Download</button>
-            <button class="btn" zero-clipboard data-clipboard-text="{{output}}" title="Copy to clipboard">
-                <i class="icon-copy"></i>
-            </button> configuration file for {{newRouterName}}
-        </div>
-        <div ng-repeat="part in parts">
-            <button ng-click="downloadPart(part)">Download</button>
-            <button class="btn" zero-clipboard data-clipboard-text="{{part.output}}" title="Copy to clipboard">
-                <i class="icon-copy"></i>
-            </button> connector section for {{part.name}}
-        </div>
-
-        <div class="okButton">
-            <button ng-click="done()">Done</button>
-        </div>
-
-    </div>
-</script>
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/img/ZeroClipboard.swf
----------------------------------------------------------------------
diff --git a/console/plugin/img/ZeroClipboard.swf b/console/plugin/img/ZeroClipboard.swf
deleted file mode 100644
index a3aaa20..0000000
Binary files a/console/plugin/img/ZeroClipboard.swf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/img/ajax-loader.gif
----------------------------------------------------------------------
diff --git a/console/plugin/img/ajax-loader.gif b/console/plugin/img/ajax-loader.gif
deleted file mode 100644
index 3c2f7c0..0000000
Binary files a/console/plugin/img/ajax-loader.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/img/dynatree/icons.gif
----------------------------------------------------------------------
diff --git a/console/plugin/img/dynatree/icons.gif b/console/plugin/img/dynatree/icons.gif
deleted file mode 100644
index 6e237a0..0000000
Binary files a/console/plugin/img/dynatree/icons.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/img/dynatree/loading.gif
----------------------------------------------------------------------
diff --git a/console/plugin/img/dynatree/loading.gif b/console/plugin/img/dynatree/loading.gif
deleted file mode 100644
index 2a96840..0000000
Binary files a/console/plugin/img/dynatree/loading.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/navbar.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/navbar.js b/console/plugin/js/navbar.js
deleted file mode 100644
index ebda4d4..0000000
--- a/console/plugin/js/navbar.js
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-
-  /**
-   * @property breadcrumbs
-   * @type {{content: string, title: string, isValid: isValid, href: string}[]}
-   *
-   * Data structure that defines the sub-level tabs for
-   * our plugin, used by the navbar controller to show
-   * or hide tabs based on some criteria
-   */
-  QDR.breadcrumbs = [
-    {
-        content: '<i class="icon-cogs"></i> Connect',
-        title: "Connect to a router",
-        isValid: function () { return true; },
-        href: "#connect"
-    },
-    {
-        content: '<i class="fa fa-home"></i> Overview',
-        title: "View router overview",
-        isValid: function (QDRService) { return QDRService.isConnected(); },
-        href: "#/overview"
-      },
-    {
-        content: '<i class="icon-star-empty"></i> Topology',
-        title: "View router network topology",
-        isValid: function (QDRService) { return QDRService.isConnected(); },
-        href: "#/topology"
-      },
-    {
-        content: '<i class="icon-list "></i> List',
-        title: "View router nodes as a list",
-        isValid: function (QDRService) { return QDRService.isConnected(); },
-        href: "#/list"
-      },
-    {
-        content: '<i class="icon-bar-chart"></i> Charts',
-        title: "View charts",
-        isValid: function (QDRService, $location) { return QDRService.isConnected(); },
-        href: "#/charts"
-    },
-    {
-        content: '<i class="icon-align-left"></i> Schema',
-        title: "View dispatch schema",
-        isValid: function (QDRService) { return QDRService.isConnected(); },
-        href: "#/schema",
-        right: true
-
-      }
-  ];
-  /**
-   * @function NavBarController
-   *
-   * @param $scope
-   * @param workspace
-   *
-   * The controller for this plugin's navigation bar
-   *
-   */
-  QDR.module.controller("QDR.NavBarController", ['$scope', '$sce', 'QDRService', 'QDRChartService', '$location', function($scope, $sce, QDRService, QDRChartService, $location) {
-
-	QDR.log.debug("navbar started with location.url: " + $location.url());
-	QDR.log.debug("navbar started with window.location.pathname : " + window.location.pathname);
-
-    if ($location.path().startsWith("/topology")
-    && !QDRService.isConnected()) {
-      $location.path("/connect");
-    }
-
-    if ($location.path().startsWith("/connect")
-    && QDRService.isConnected()) {
-      $location.path("/topology");
-    }
-
-    $scope.breadcrumbs = QDR.breadcrumbs;
-
-    $scope.isValid = function(link) {
-      return link.isValid(QDRService, $location);
-    };
-
-    $scope.isActive = function(href) {
-        return href.split("#")[1] == $location.path();
-    };
-
-    $scope.isRight = function (link) {
-        return angular.isDefined(link.right);
-    };
-
-    $scope.hasChart = function (link) {
-        if (link.href == "#/charts") {
-            return QDRChartService.charts.some(function (c) { return c.dashboard });
-        }
-    }
-  }]);
-
-  return QDR;
-
-} (QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrChartService.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrChartService.js b/console/plugin/js/qdrChartService.js
deleted file mode 100644
index 6535384..0000000
--- a/console/plugin/js/qdrChartService.js
+++ /dev/null
@@ -1,956 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
-    // The QDR chart service handles periodic gathering data for charts and displaying the charts
-    QDR.module.factory("QDRChartService", ['$rootScope', 'QDRService', '$http', '$resource',
-    function($rootScope, QDRService, $http, $resource) {
-
-        var instance = 0;   // counter for chart instances
-        var bases = [];
-        var findBase = function (name, attr, request) {
-            for (var i=0; i<bases.length; ++i) {
-                var base = bases[i];
-                if (base.equals(name, attr, request))
-                    return base;
-            }
-            return null;
-        }
-
-        function ChartBase(name, attr, request) {
-            // the base chart attributes
-            this.name = name;           // the record's "name" field
-            this.attr = attr;           // the record's attr field to chart
-            this.request = request;     // the associated request that fetches the data
-
-            // copy the savable properties to an object
-            this.copyProps = function (o) {
-                o.name = this.name;
-                o.attr = this.attr;
-                this.request.copyProps(o);
-            }
-
-            this.equals = function (name, attr, request) {
-                return (this.name == name && this.attr == attr && this.request.equals(request));
-            }
-        };
-
-        // Object that represents a visible chart
-        // There can be multiple of these per ChartBase (eg. one rate  and one value chart)
-        function Chart(name, attr, request) {
-
-            var base = findBase(name, attr, request);
-            if (!base) {
-                base = new ChartBase(name, attr, request);
-                bases.push(base);
-            }
-            this.base = base;
-            this.instance = instance++;
-            this.dashboard = false;     // is this chart on the dashboard page
-            this.type = "value";        // value or rate
-            this.rateWindow = 1000;     // calculate the rate of change over this time interval. higher == smother graph
-            this.areaColor = "#c0e0ff"; // the chart's area color when not an empty string
-            this.lineColor = "#4682b4"; // the chart's line color when not an empty string
-            this.visibleDuration = 10;  // number of minutes of data to show (<= base.duration)
-            this.userTitle = null;      // user title overrides title()
-
-            // generate a unique id for this chart
-            this.id = function () {
-                var key = this.request().nodeId + this.request().entity + this.name() + this.attr() + "_" + this.instance;
-                // remove all characters except letters,numbers, and _
-                return key.replace(/[^\w]/gi, '')
-            }
-            // copy the savable properties to an object
-            this.copyProps = function (o) {
-                o.type = this.type;
-                o.rateWindow = this.rateWindow;
-                o.areaColor = this.areaColor;
-                o.lineColor = this.lineColor;
-                o.visibleDuration = this.visibleDuration;
-                o.userTitle = this.userTitle;
-                this.base.copyProps(o);
-            }
-            this.name = function (_) {
-                if (!arguments.length) return this.base.name;
-                this.base.name = _;
-                return this;
-            }
-            this.attr = function (_) {
-                if (!arguments.length) return this.base.attr;
-                this.base.attr = _;
-                return this;
-            }
-            this.nodeId = function (_) {
-                if (!arguments.length) return this.base.request.nodeId;
-                this.base.request.nodeId = _;
-                return this;
-            }
-            this.entity = function (_) {
-                if (!arguments.length) return this.base.request.entity;
-                this.base.request.entity = _;
-                return this;
-            }
-            this.request = function (_) {
-                if (!arguments.length) return this.base.request;
-                this.base.request = _;
-                return this;
-            }
-            this.data = function () {
-                return this.base.request.data(this.base.name, this.base.attr); // refernce to chart's data array
-            }
-            this.interval = function (_) {
-                if (!arguments.length) return this.base.request.interval;
-                this.base.request.interval = _;
-                return this;
-            }
-            this.duration = function (_) {
-                if (!arguments.length) return this.base.request.duration;
-                this.base.request.duration = _;
-                return this;
-            }
-            this.title = function (_) {
-				var name = this.request().aggregate ? 'Aggregate' : QDRService.nameFromId(this.nodeId());
-                var computed = name +
-                                   " " + QDRService.humanify(this.attr()) +
-                                   " - " + this.name()
-                if (!arguments.length) return this.userTitle || computed;
-
-                // don't store computed title in userTitle
-                if (_ === computed)
-                    _ = null;
-                this.userTitle = _;
-                return this;
-            }
-            this.title_short = function (_) {
-                if (!arguments.length) return this.userTitle || this.name();
-                return this;
-            }
-            this.copy = function () {
-                var chart = self.registerChart(this.nodeId(), this.entity(),
-                            this.name(), this.attr(), this.interval(), true, this.base.request.aggregate);
-                chart.type = this.type;
-                chart.areaColor = this.areaColor;
-                chart.lineColor = this.lineColor;
-                chart.rateWindow = this.rateWindow;
-                chart.visibleDuration = this.visibleDuration;
-                chart.userTitle = this.userTitle;
-                return chart;
-            }
-            // compare to a chart
-            this.equals = function (c) {
-                return (c.instance == this.instance &&
-                        c.base.equals(this.base.name, this.base.attr, this.base.request) &&
-                        c.type == this.type &&
-                        c.rateWindow == this.rateWindow &&
-                        c.areaColor == this.areaColor &&
-                        c.lineColor == this.lineColor)
-            }
-        }
-
-        // Object that represents the management request to fetch and store data for multiple charts
-        function ChartRequest(nodeId, entity, name, attr, interval, aggregate) {
-            this.duration = 10;         // number of minutes to keep the data
-            this.nodeId = nodeId;       // eg amqp:/_topo/0/QDR.A/$management
-            this.entity = entity;       // eg .router.address
-			// sorted since the responses will always be sorted
-			this.aggregate = aggregate;   // list of nodeIds for aggregate charts
-            this.datum = {};            // object containing array of arrays for each attr
-                                        // like {attr1: [[date,value],[date,value]...], attr2: [[date,value]...]}
-
-            this.interval = interval;   // number of milliseconds between updates to data
-            this.setTimeoutHandle = null;   // used to cancel the next request
-            // copy the savable properties to an object
-
-			this.data = function (name, attr) {
-				if (this.datum[name] && this.datum[name][attr])
-					return this.datum[name][attr]
-				return null;
-			}
-			this.addAttrName = function (name, attr) {
-				if (Object.keys(this.datum).indexOf(name) == -1) {
-					this.datum[name] = {}
-				}
-				if (Object.keys(this.datum[name]).indexOf(attr) == -1) {
-					this.datum[name][attr] = [];
-				}
-			}
-			this.addAttrName(name, attr)
-
-            this.copyProps = function (o) {
-                o.nodeId = this.nodeId;
-                o.entity = this.entity;
-                o.interval = this.interval;
-				o.aggregate = this.aggregate;
-				o.duration = this.duration;
-            }
-
-			this.removeAttr = function (name, attr) {
-				if (this.datum[name]) {
-					if (this.datum[name][attr]) {
-						delete this.datum[name][attr]
-					}
-				}
-				return this.attrs().length;
-			}
-
-            this.equals = function (r, entity, aggregate) {
-				if (arguments.length == 3) {
-					var o = {nodeId: r, entity: entity, aggregate: aggregate}
-					r = o;
-				}
-                return (this.nodeId === r.nodeId && this.entity === r.entity && this.aggregate == r.aggregate)
-			}
-			this.names = function () {
-				return Object.keys(this.datum)
-			}
-			this.attrs = function () {
-				var attrs = {}
-				Object.keys(this.datum).forEach( function (name) {
-					Object.keys(this.datum[name]).forEach( function (attr) {
-						attrs[attr] = 1;
-					})
-				}, this)
-				return Object.keys(attrs);
-			}
-        };
-        var self = {
-            charts: [],         // list of charts to gather data for
-            chartRequests: [],  // the management request info (multiple charts can be driven off of a single request
-
-            init: function () {
-                self.loadCharts();
-            },
-
-			findChartRequest: function (nodeId, entity, aggregate) {
-				var ret = null;
-				self.chartRequests.some( function (request) {
-					if (request.equals(nodeId, entity, aggregate)) {
-						ret = request;
-						return true;
-					}
-				})
-				return ret;
-			},
-
-            findCharts: function (name, attr, nodeId, entity) {
-                return self.charts.filter( function (chart) {
-                    return (chart.name() == name &&
-                            chart.attr() == attr &&
-                            chart.nodeId() == nodeId &&
-                            chart.entity() == entity)
-                });
-            },
-
-            delChartRequest: function (request) {
-                for (var i=0; i<self.chartRequests.length; ++i) {
-                    var r = self.chartRequests[i];
-                    if (request.equals(r)) {
-	                    QDR.log.debug("removed request: " + request.nodeId + " " + request.entity);
-                        self.chartRequests.splice(i, 1);
-                        self.stopCollecting(request);
-                        return;
-                    }
-                }
-            },
-
-            delChart: function (chart) {
-                var foundBases = 0;
-                for (var i=0; i<self.charts.length; ++i) {
-                    var c = self.charts[i];
-					if (c.base === chart.base)
-						++foundBases;
-                    if (c.equals(chart)) {
-                        self.charts.splice(i, 1);
-                        if (chart.dashboard)
-                            self.saveCharts();
-                    }
-                }
-                if (foundBases == 1) {
-                    var baseIndex = bases.indexOf(chart.base)
-                    bases.splice(baseIndex, 1);
-                }
-            },
-
-            registerChart: function (nodeId, entity, name, attr, interval, forceCreate, aggregate) {
-                var request = self.findChartRequest(nodeId, entity, aggregate);
-                if (request) {
-                    // add any new attr or name to the list
-                    request.addAttrName(name, attr)
-                } else {
-                    // the nodeId/entity did not already exist, so add a new request and chart
-                    QDR.log.debug("added new request: " + nodeId + " " + entity);
-                    request = new ChartRequest(nodeId, entity, name, attr, interval, aggregate);
-                    self.chartRequests.push(request);
-                    self.startCollecting(request);
-                }
-                var charts = self.findCharts(name, attr, nodeId, entity);
-                var chart;
-                if (charts.length == 0 || forceCreate) {
-                    chart = new Chart(name, attr, request);
-                    self.charts.push(chart);
-                } else {
-                    chart = charts[0];
-                }
-                return chart;
-            },
-
-            // remove the chart for name/attr
-            // if all attrs are gone for this request, remove the request
-            unRegisterChart: function (chart) {
-                // remove the chart
-                for (var i=0; i<self.charts.length; ++i) {
-                    var c = self.charts[i];
-                    if (chart.equals(c)) {
-                        var request = chart.request();
-                        self.delChart(chart);
-                        if (request) {
-                            // see if any other charts use this attr
-                            for (var i=0; i<self.charts.length; ++i) {
-                                var c = self.charts[i];
-                                if (c.attr() == chart.attr() && c.request().equals(chart.request()))
-                                    return;
-                            }
-                            // no other charts use this attr, so remove it
-                            if (request.removeAttr(chart.name(), chart.attr()) == 0) {
-                                self.stopCollecting(request);
-                                self.delChartRequest(request);
-                            }
-                        }
-                    }
-                }
-            },
-
-            stopCollecting: function (request) {
-                if (request.setTimeoutHandle) {
-                    clearTimeout(request.setTimeoutHandle);
-                    request.setTimeoutHandle = null;
-                }
-            },
-
-            startCollecting: function (request) {
-                // Using setTimeout instead of setInterval because the response may take longer than interval
-                request.setTimeoutHandle = setTimeout(self.sendChartRequest, request.interval, request);
-            },
-            // send the request
-            sendChartRequest: function (request) {
-                // ensure the response has the name field so we can associate the response values with the correct chart
-                var attrs = request.attrs();
-                attrs.push("name");
-
-	            // this is called when the response is received
-				var saveResponse = function (nodeId, entity, response) {
-	                //QDR.log.debug("got chart results for " + nodeId + " " + entity);
-	                // records an array that has data for all names
-	                var records = response.results;
-	                if (!records)
-	                    return;
-
-	                var now = new Date();
-	                var cutOff = new Date(now.getTime() - request.duration * 60 * 1000);
-	                // index of the "name" attr in the response
-	                var nameIndex = response.attributeNames.indexOf("name");
-	                if (nameIndex < 0)
-	                    return;
-
-					var names = request.names();
-	                // for each record returned, find the name/attr for this request and save the data with this timestamp
-	                for (var i=0; i<records.length; ++i) {
-	                    var name = records[i][nameIndex];
-						// if we want to store the values for some attrs for this name
-	                    if (names.indexOf(name) > -1) {
-	                        attrs.forEach( function (attr) {
-		                        var data = request.data(name, attr) // get a reference to the data array
-								if (data) {
-		                            var attrIndex = response.attributeNames.indexOf(attr)
-			                        if (request.aggregate) {
-			                            data.push([now, response.aggregates[i][attrIndex].sum, response.aggregates[i][attrIndex].detail])
-			                        } else {
-										data.push([now, records[i][attrIndex]])
-			                        }
-	                                // expire the old data
-	                                while (data[0][0] < cutOff) {
-	                                    data.shift();
-	                                }
-								}
-	                        })
-	                    }
-	                }
-				}
-				if (request.aggregate) {
-					var nodeList = QDRService.nodeIdList()
-					QDRService.getMultipleNodeInfo(nodeList, request.entity, attrs, saveResponse, request.nodeId);
-				} else {
-                    QDRService.getNodeInfo(request.nodeId, request.entity, attrs, saveResponse);
-				}
-                // it is now safe to send another request
-                request.setTimeoutHandle = setTimeout(self.sendChartRequest, request.interval, request)
-            },
-
-            numCharts: function () {
-                return self.charts.length;
-            },
-
-            isAttrCharted: function (nodeId, entity, name, attr) {
-                var charts = self.findCharts(name, attr, nodeId, entity);
-                // if any of the matching charts are on the dashboard page, return true
-                return charts.some(function (chart) {
-                    return (chart.dashboard) });
-            },
-
-            addDashboard: function (chart) {
-                chart.dashboard = true;
-                self.saveCharts();
-            },
-            delDashboard: function (chart) {
-                chart.dashboard = false;
-                self.saveCharts();
-            },
-            // save the charts to local storage
-            saveCharts: function () {
-                var charts = [];
-                var minCharts = [];
-
-                self.charts.forEach(function (chart) {
-                    var minChart = {};
-                    // don't save chart unless it is on the dashboard
-                    if (chart.dashboard) {
-                        chart.copyProps(minChart);
-                        minCharts.push(minChart);
-                    }
-                })
-                localStorage["QDRCharts"] = angular.toJson(minCharts);
-            },
-            loadCharts: function () {
-                var charts = angular.fromJson(localStorage["QDRCharts"]);
-                if (charts) {
-                    charts.forEach(function (chart) {
-                        if (!chart.interval)
-                            chart.interval = 1000;
-                        if (!chart.duration)
-                            chart.duration = 10;
-                        if (chart.nodeList)
-                            chart.aggregate = true;
-                        var newChart = self.registerChart(chart.nodeId, chart.entity, chart.name, chart.attr, chart.interval, true, chart.aggregate);
-                        newChart.dashboard = true;  // we only save the dashboard charts
-                        newChart.type = chart.type;
-                        newChart.rateWindow = chart.rateWindow;
-                        newChart.areaColor = chart.areaColor ? chart.areaColor : "#c0e0ff";
-                        newChart.lineColor = chart.lineColor ? chart.lineColor : "#4682b4";
-                        newChart.duration(chart.duration);
-                        newChart.visibleDuration = chart.visibleDuration ? chart.visibleDuration : 10;
-                        if (chart.userTitle)
-                            newChart.title(chart.userTitle);
-                    })
-                }
-            },
-
-            AreaChart: function (chart, url) {
-                if (!chart)
-                    return;
-
-				// if this is an aggregate chart, show it stacked
-				var stacked = chart.request().aggregate;
-                this.chart = chart; // reference to underlying chart
-                this.svgchart = null;
-                if (url)
-                    url = "/dispatch" + url;
-                else
-                    url = "";
-                this.url = url;
-
-                // callback function. called by svgchart when binding data
-                // the variable 'this' refers to the svg and not the AreaChart,
-                // but since we are still in the scope of the AreaChart we have access to the passed in chart argument
-                this.chartData = function () {
-
-                    var now = new Date();
-                    var visibleDate = new Date(now.getTime() - chart.visibleDuration * 60 * 1000);
-					var data = chart.data();
-					var nodeList = QDRService.nodeIdList();
-
-                    if (chart.type == "rate") {
-                        var rateData = [];
-                        var datalen = data.length;
-                        k = 0;  // inner loop optimization
-                        for (var i=0; i<datalen; ++i) {
-                            var d = data[i];
-                            if (d[0] >= visibleDate) {
-                                for (var j=k+1; j<datalen; ++j) {
-                                    var d1 = data[j];
-                                    if (d1[0] - d[0] >= chart.rateWindow) { // rateWindow is the timespan to calculate rates
-										var elapsed = Math.max((d1[0] - d[0]) / 1000, 1); // number of seconds that elapsed
-										var rd = [d1[0],(d1[1] - d[1])/elapsed]
-                                        k = j; // start here next time
-										// this is a stacked (aggregate) chart
-										if (stacked) {
-											var detail = [];
-											nodeList.forEach( function (node, nodeIndex) {
-												if (d1[2][nodeIndex] && d[2][nodeIndex])
-													detail.push({node: QDRService.nameFromId(node), val: (d1[2][nodeIndex].val- d[2][nodeIndex].val)/elapsed})
-											})
-											rd.push(detail)
-										}
-										rateData.push(rd);
-                                        break;
-                                    }
-                                }
-                            }
-                        }
-                        // we need at least a point to chart
-                        if (rateData.length == 0) {
-                            rateData[0] = [chart.data()[0][0],0,[{node:'',val:0}]];
-                        }
-                        return rateData;
-                    }
-                    if (chart.visibleDuration != chart.duration()) {
-                        return data.filter(function (d) { return d[0]>=visibleDate});
-                    } else
-                        return data;
-                }
-
-                this.zoom = function (id, zoom) {
-                    if (this.svgchart) {
-                        this.svgchart.attr("zoom", zoom)
-						d3.select('#' + id)
-							.data([this.chartData()])
-							.call(this.svgchart)
-                    }
-                }
-
-                // called by the controller on the page that displays the chart
-                // called whenever the controller wants to redraw the chart
-                // note: the data is collected independently of how often the chart is redrawn
-                this.tick = function (id) {
-
-                    // can't draw charts that don't have data yet
-                    if (this.chart.data().length == 0) {
-                        return;
-                    }
-
-                    // if we haven't created the svg yet
-                    if (!this.svgchart) {
-
-						// make sure the dom element exists on the page
-                        var div = angular.element('#' + id);
-                        if (!div)
-                            return;
-
-                        var width = div.width();
-                        var height = div.height();
-
-						// make sure the dom element has a size. otherwise we wouldn't see anything anyway
-                        if (!width)
-                            return;
-
-						var tooltipGenerator;
-						// stacked charts have a different tooltip
-                        if (stacked) {
-							tooltipGenerator = function (d, color, format) {
-			                    var html = "<table class='fo-table'><tbody><tr class='fo-title'>"+
-			                    "<td align='center' colspan='2' nowrap>Time: "+d[0].toTimeString().substring(0, 8)+"</td></tr>"
-			                    d[2].forEach( function (detail) {
-			                        html += "<tr class='detail'><td align='right' nowrap>"
-			                        + detail.node
-			                        + "<div class='fo-table-legend' style='background-color: "+color(detail.node)+"'></div>"
-			                        + "</td><td>"+format(detail.val)+"</td></tr>"
-			                    })
-			                    html += "</tbody></table>"
-			                    return html;
-							}
-                        } else {
-                            tooltipGenerator = function (d, color, format) {
-								var html = "<table class='fo-table'><tbody><tr class='fo-title'>"+
-		                                "<td align='center'>Time</td><td align='center'>Value</td></tr><tr><td>" +
-		                                    d[0].toTimeString().substring(0, 8) +
-		                                "</td><td>" +
-		                                   format(d[1]) +
-		                                "</td></tr></tbody></table>"
-			                    return html;
-                            }
-						}
-                        // create and initialize the chart
-                        this.svgchart = self.timeSeriesStackedChart(id, width, height,
-                                QDRService.humanify(this.chart.attr()),
-                                this.chart.name(),
-                                QDRService.nameFromId(this.chart.nodeId()),
-                                this.chart.entity(),
-                                stacked)
-                            .tooltipGenerator(tooltipGenerator);
-
-                    }
-                    // in case the chart properties have changed, set the new props
-                    this.svgchart
-                        .attr("type", this.chart.type)
-                        .attr("areaColor", this.chart.areaColor)
-                        .attr("lineColor", this.chart.lineColor)
-                        .attr("url", this.url)
-                        .attr("title", this.chart.userTitle);
-
-                    // bind the new data and update the chart
-                    d3.select('#' + id)         // the div id on the page/dialog
-						.data([this.chartData()])
-                        .call(this.svgchart);       // the charting function
-                }
-            },
-
-            timeSeriesStackedChart: function (id, width, height, attrName, name, node, entity, stacked) {
-				var margin = {top: 20, right: 18, bottom: 10, left: 15}
-				// attrs that can be changed after the chart is created by using
-				// chart.attr(<attrname>, <attrvalue>);
-				var attrs = {
-							attrName: attrName, // like Deliveries to Container. Put at top of chart
-							name: name,         // like router.address/qdrhello  Put at bottom of chart with node
-							node: node,         // put at bottom of chart with name
-							entity: entity,     // like .router.address  Not used atm
-							title: "",          // user title overrides the node and name at the bottom of the chart
-							url: "",            // needed to reference filters and clip because of angular's location service
-							type: "value",      // value or rate
-							areaColor: "",      // can be set for non-stacked charts
-							lineColor: "",      // can be set for non-stacked charts
-							zoom: false         // should the y-axis range start at 0 or the min data value
-				}
-				var width = width - margin.left - margin.right,
-					height = height - margin.top - margin.bottom
-					yAxisTransitionDuration = 0
-
-				var x = d3.time.scale()
-			    var y = d3.scale.linear()
-			          .rangeRound([height, 0]);
-                // The x-accessor for the path generator; xScale ∘ xValue.
-				var X = function (d) { return x(d[0]) }
-                // The x-accessor for the path generator; yScale ∘ yValue.
-                var Y = function Y(d) { return y(d[1]) }
-
-                var xAxis = d3.svg.axis().scale(x).orient("bottom")
-					.outerTickSize(6)
-					.innerTickSize(-(height-margin.top-margin.bottom))
-                    .tickPadding(2)
-                    .ticks(d3.time.minutes, 2)
-                var yAxis = d3.svg.axis().scale(y).orient("right")
-                    .outerTickSize(8)
-                    .innerTickSize(-(width-margin.left-margin.right))
-                    .tickPadding(10)
-                    .ticks(3)
-                    .tickFormat(function(d) { return formatValue(d)})
-
-				var tooltipGenerator = function (d, color, format) {return ""}; // should be overridden to set an appropriate tooltip
-                var formatValue = d3.format(".2s");
-                var formatPrecise = d3.format(",");
-                var bisectDate = d3.bisector(function(d) { return d[0]; }).left;
-				var line = d3.svg.line();
-
-		        var stack = d3.layout.stack()
-			          .offset("zero")
-			          .values(function (d) { return d.values; })
-			          .x(function (d) { return x(d.date); })
-			          .y(function (d) { return d.value; });
-
-			    var area = d3.svg.area()
-
-				if (stacked) {
-			        area.interpolate("cardinal")
-			          .x(function (d) { return x(d.date); })
-			          .y0(function (d) { return y(d.y0); })
-			          .y1(function (d) { return y(d.y0 + d.y); });
-				} else {
-                    area.interpolate("basis").x(X).y1(Y)
-                    line.x(X).y(Y)
-				}
-				var color = d3.scale.category20();
-
-			    var sv = d3.select("#"+id).append("svg")
-			          .attr("width",  width  + margin.left + margin.right)
-			          .attr("height", height + margin.top  + margin.bottom)
-				var svg = sv
-			        .append("g")
-			          .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
-
-			    var clip = svg.append("defs").append("svg:clipPath")
-			        .attr("id", "clip")
-			        .append("svg:rect")
-			        .attr("id", "clip-rect")
-			        .attr("x", "0")
-			        .attr("y", "0")
-			        .attr("width", width)
-			        .attr("height", height);
-
-				// we want all our areas to appear before the axiis
-				svg.append("g")
-					.attr("class", "section-container")
-
-		        svg.append("g")
-			            .attr("class", "x axis")
-
-		        svg.append("g")
-			            .attr("class", "y axis")
-
-                svg.append("text").attr("class", "title")
-                        .attr("x", (width / 2) - (margin.left + margin.right) / 2)
-                        .attr("y", 0 - (margin.top / 2))
-                        .attr("text-anchor", "middle")
-                        .text(attrs.attrName);
-
-                svg.append("text").attr("class", "legend")
-                        .attr("x", (width / 2) - (margin.left + margin.right) / 2)
-                        .attr("y", height + (margin.bottom / 2) )
-                        .attr("text-anchor", "middle")
-                        .text(!stacked ? attrs.node + " " + attrs.name : attrs.name);
-
-                var focus = sv.append("g")
-                  .attr("class", "focus")
-                  .style("display", "none");
-
-                focus.append("circle")
-                  .attr("r", 4.5);
-
-                var focusg = focus.append("g");
-                focusg.append("rect")
-                    .attr("class", "mo-guide y")
-                    .attr("width", 1)
-                    .attr("height", height - (margin.top + margin.bottom));
-                focusg.append("rect")
-                    .attr("class", "mo-guide x")
-                    .attr("width", width - (margin.left + margin.right))
-                    .attr("height", 1);
-				focus.append("foreignObject")
-					.attr('class', 'svg-tooltip')
-					.append("xhtml:span");
-
-
-                function chart(selection) {
-                    selection.each(function(data) {
-
-					var seriesArr = []
-					if (stacked) {
-						var detailNames = data[0][2].map(function (detail){ return detail.node })
-						var revNames = angular.copy(detailNames).reverse();
-						color.domain(revNames);
-
-				        var series = {};
-				        detailNames.forEach(function (name) {
-							series[name] = {name: name, values:[]};
-							seriesArr.unshift(series[name]);    // insert at beginning
-				        });
-
-				        data.forEach(function (d) {
-							detailNames.map(function (name, i) {
-								series[name].values.push({date: d[0], value: d[2][i] ? d[2][i].val : 0});
-							});
-				        });
-
-				        // this decorates seriesArr with x,y,and y0 properties
-				        stack(seriesArr);
-					}
-
-                    var extent = d3.extent(data, function(d) {return d[0];});
-                    x.domain(extent)
-                      .range([0, width - margin.left - margin.right]);
-
-                    // Update the y-scale.
-                    var min = attrs.zoom ? 0 : d3.min(data, function(d) {return d[1]});
-                    var max = d3.max(data, function(d) {return d[1]});
-                    var mean = d3.mean(data, function(d) {return d[1]});
-                    //max = max * 1.01;
-                    var diff = (max - min);
-                    if (diff == 0) {
-                        max = max + 1;
-                        diff = 1;
-                    }
-                    var ratio = mean != 0 ? diff / mean : 1;
-                    if (ratio < .05)
-                        formatValue = d3.format(".3s")
-
-					if (stacked) {
-	                    y.domain([min, max])
-	                      .range([height - margin.top - margin.bottom, 0]);
-					} else {
-                        y
-                          .domain([min, max])
-                          .range([height - margin.top - margin.bottom, 0]);
-					}
-                        if (attrs.type == "rate") {
-                            area.interpolate("basis");  // rate charts look better smoothed
-                            line.interpolate("basis");
-                        }
-                        else {
-                            area.interpolate("linear"); // don't smooth value charts
-                            line.interpolate("linear");
-                        }
-
-                    // adjust the xaxis based on the range of x values (domain)
-                    var timeSpan = (extent[1] - extent[0]) / (1000 * 60);   // number of minutes
-                    if (timeSpan < 1.5)
-                        xAxis.ticks(d3.time.seconds, 10);
-                    else if (timeSpan < 3)
-                        xAxis.ticks(d3.time.seconds, 30);
-                    else if (timeSpan < 8)
-                        xAxis.ticks(d3.time.minutes, 1);
-                    else
-                        xAxis.ticks(d3.time.minutes, 2);
-
-                    // adjust the number of yaxis ticks based on the range of y values
-                    if (formatValue(min) === formatValue(max))
-                        yAxis.ticks(2);
-
-					var container = svg.select('.section-container');
-					container.selectAll('.series').remove();
-					if (stacked) {
-	                    y.domain([Math.min(min, 0), d3.max(seriesArr, function (c) {
-	                        return d3.max(c.values, function (d) { return d.y0 + d.y; });
-	                      })]);
-
-						// creates a .series g path for each section in the detail
-						// since we don't get more sections this selection is only run once
-	                    var series = container.selectAll(".series")
-	                      .data(seriesArr)
-
-						series.enter().append("g")
-	                        .attr("class", "series")
-				          .append("path")
-							.attr("class", "streamPath")
-							.style("fill", function (d) { return color(d.name); })
-							.style("stroke", "grey");
-
-						series.exit().remove()
-
-						//series.exit().remove()
-						// each time the data is updated, update each section
-						container.selectAll(".series .streamPath").data(seriesArr)
-							.attr("d", function (d) { return area(d.values); })
-					} else {
-	                    var series = container.selectAll(".series")
-	                      .data([data], function(d) { return d; })
-
-	                      series.enter().append("g")
-	                        .append("path")
-	                        .attr("class", "area")
-						  series.enter().append("path")
-	                        .attr("class", "line")
-
-						series.exit().remove()
-
-                        // Update the area path.
-                        container.select(".area").data([data])
-                          .attr("d", area.y0(y.range()[0]))
-						  .style("fill", attrs.areaColor);
-
-                        //Update the line path.
-                        container.select(".line").data([data])
-                          .attr("d", line)
-						  .style("stroke", attrs.lineColor)
-					}
-                    // Update the x-axis.
-                    svg.select(".x.axis")
-                      .attr("transform", "translate(0," + (height - margin.top - margin.bottom + 1) + ")")
-                      .call(xAxis);
-
-                    svg.select(".y.axis")
-						.transition().duration(yAxisTransitionDuration)  // animate the y axis
-                      .attr("transform", "translate(" + (width - margin.right - margin.left) + ",0)")
-                      .call(yAxis);
-                    yAxisTransitionDuration = 1000  // only do a transition after the chart is 1st drawn
-
-                    // TODO: fix this
-                    // need to recreate this every update... not sure why
-                    var overlay = sv.select(".overlay");
-                    if (!overlay.empty())
-                            overlay.remove();
-                    sv.append("rect")
-                      .attr("class", "overlay")
-                      .attr("width", width)
-                      .attr("height", height)
-                      .on("mouseover", function () {focus.style("display", null)})
-                      .on("mouseout", function () {focus.style("display", "none")})
-                      .on("mousemove", mousemove)
-
-	                    function mousemove() {
-	                        var x0 = x.invert(d3.mouse(this)[0] - margin.left);
-	                        var i = bisectDate(data, x0, 1);
-	                        if (i < data.length && i > 0) {
-	                            var d0 = data[i - 1];
-	                            var d1 = data[i];
-								// set d to the data that is closest to the mouse position
-	                            var d = x0 - d0[0] > d1[0] - x0 ? d1 : d0;
-	                            focus.attr("transform", "translate(" + (x(d[0]) + margin.left) + "," + (y(d[1]) + margin.top) + ")");
-
-								var tipFormat = formatPrecise;
-								if (attrs.type === "rate")
-									tipFormat = d3.format(".2n")
-								// set the tooltip html and position it
-								focus.select('.svg-tooltip span')
-									.html(tooltipGenerator(d, color, tipFormat))
-
-								var foBounds = focus.select('table')[0][0].getBoundingClientRect();
-	                            var mx = x(d[0]); // mouse x
-	                            var my = y(d[1]); // mouse y
-
-	                            // perfer to put the tooltip in the nw corner relative to the focus circle
-	                            var foy = -foBounds.height;
-								var fox = -foBounds.width;
-								// off the left side
-								if (mx - foBounds.width - margin.left < 0)
-									fox = 0;
-								// above the top
-								if (my - foBounds.height - margin.top < 0)
-									foy = 0;
-								// won't fit above or below, just put it at bottom
-								if (my + foBounds.height > height)
-									foy = -(foBounds.height - (height - my));
-
-								focus.select('.svg-tooltip')
-									.attr('x', fox).attr('y', foy);
-
-								// position the guide lines
-	                            focus.select(".mo-guide.y")
-	                                .attr("y", -my);
-	                            focus.select(".mo-guide.x")
-	                                .attr("x", -mx);
-
-	                        } else {
-	                            focus.attr("transform", "translate(-10,-10)");
-	                        }
-	                    }
-
-                    })
-
-
-                }
-				chart.attr = function (attrName, value) {
-					if (arguments.length < 2)
-						return arguments.length == 1 ? attrs[attrName] : chart;
-					if (angular.isDefined(attrs[attrName]))
-						attrs[attrName] = value;
-					return chart;
-				}
-				chart.tooltipGenerator = function (_) {
-					tooltipGenerator = _;
-					return chart;
-				}
-
-				return chart;
-            }
-        }
-        return self;
-  }]);
-
-  return QDR;
-}(QDR || {}));


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[04/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/lib/rhea.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/lib/rhea.js b/console/stand-alone/plugin/lib/rhea.js
new file mode 100644
index 0000000..fa323a3
--- /dev/null
+++ b/console/stand-alone/plugin/lib/rhea.js
@@ -0,0 +1,7716 @@
+require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+(function (process,Buffer){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * Licensed 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.
+ */
+'use strict';
+
+var frames = require('./frames.js');
+var log = require('./log.js');
+var sasl = require('./sasl.js');
+var types = require('./types.js');
+var util = require('./util.js');
+var EndpointState = require('./endpoint.js');
+var Session = require('./session.js');
+var Transport = require('./transport.js');
+
+var net = require("net");
+var tls = require("tls");
+var EventEmitter = require('events').EventEmitter;
+
+var AMQP_PROTOCOL_ID = 0x00;
+var TLS_PROTOCOL_ID = 0x02;
+
+function get_socket_id(socket) {
+    if (socket.get_id_string) return socket.get_id_string();
+    return socket.localAddress + ':' + socket.localPort + ' -> ' + socket.remoteAddress + ':' + socket.remotePort;
+};
+
+function session_per_connection(conn) {
+    var ssn = null;
+    return {
+        'get_session' : function () {
+            if (!ssn) {
+                ssn = conn.create_session();
+                ssn.begin();
+            }
+            return ssn;
+        }
+    };
+};
+
+function restrict(count, f) {
+    if (count) {
+        var current = count;
+        var reset;
+        return function (successful_attempts) {
+            if (reset !== successful_attempts) {
+                current = count;
+                reset = successful_attempts;
+            }
+            if (current--) return f(successful_attempts);
+            else return -1;
+        };
+    } else {
+        return f;
+    }
+}
+
+function backoff(initial, max) {
+    var delay = initial;
+    var reset;
+    return function (successful_attempts) {
+        if (reset !== successful_attempts) {
+            delay = initial;
+            reset = successful_attempts;
+        }
+        var current = delay;
+        var next = delay*2;
+        delay = max > next ? next : max;
+        return current;
+    };
+}
+
+function get_connect_fn(options) {
+    if (options.transport === undefined || options.transport === 'tcp') {
+        return net.connect;
+    } else if (options.transport === 'tls' || options.transport === 'ssl') {
+        return tls.connect;
+    } else {
+        throw Error('Unrecognised transport: ' + options.transport);
+    }
+}
+
+function connection_details(options) {
+    var details = {};
+    details.connect = options.connect ? options.connect : get_connect_fn(options);
+    details.host = options.host ? options.host : 'localhost';
+    details.port = options.port ? options.port : 5672;
+    details.options = options;
+    return details;
+};
+
+var conn_counter = 1;
+
+var Connection = function (options, container) {
+    this.options = {};
+    if (options) {
+        for (var k in options) {
+            this.options[k] = options[k];
+        }
+    }
+    this.container = container;
+    if (!this.options.id) {
+        this.options.id = 'connection-' + conn_counter++;
+    }
+    if (!this.options.container_id) {
+        this.options.container_id = container ? container.id : util.generate_uuid();
+    }
+    if (!this.options.connection_details) {
+        var self = this;
+        this.options.connection_details = function() { return connection_details(self.options); };
+    }
+    var reconnect = this.get_option('reconnect', true);
+    if (typeof reconnect === 'boolean' && reconnect) {
+        var initial = this.get_option('initial_reconnect_delay', 100);
+        var max = this.get_option('max_reconnect_delay', 60000);
+        this.options.reconnect = restrict(this.get_option('reconnect_limit'), backoff(initial, max));
+    } else if (typeof reconnect === 'number') {
+        var fixed = this.options.reconnect
+        this.options.reconnect = restrict(this.get_option('reconnect_limit'), function () { return fixed; });
+    }
+    this.registered = false;
+    this.state = new EndpointState();
+    this.local_channel_map = {};
+    this.remote_channel_map = {};
+    this.local = {};
+    this.remote = {};
+    this.local.open = frames.open(this.options);
+    this.local.close = frames.close({});
+    this.session_policy = session_per_connection(this);
+    this.amqp_transport = new Transport(this.options.id, AMQP_PROTOCOL_ID, frames.TYPE_AMQP, this);
+    this.sasl_transport = undefined;
+    this.transport = this.amqp_transport;
+    this.conn_established_counter = 0;
+    this.heartbeat_out = undefined;
+    this.heartbeat_in = undefined;
+    this.abort_idle = false;
+    this.socket_ready = false;
+};
+
+Connection.prototype = Object.create(EventEmitter.prototype);
+Connection.prototype.constructor = Connection;
+Connection.prototype.dispatch = function(name, context) {
+    log.events('Connection got event: ' + name);
+    if (this.listeners(name).length) {
+        EventEmitter.prototype.emit.apply(this, arguments);
+        return true;
+    } else if (this.container) {
+        return this.container.dispatch.apply(this.container, arguments);
+    }
+};
+
+Connection.prototype.reset = function() {
+    if (this.abort_idle) {
+        this.abort_idle = false;
+        this.local.close.error = undefined;
+        this.state = new EndpointState();
+        this.state.open();
+    }
+
+    //reset transport
+    this.amqp_transport = new Transport(this.options.id, AMQP_PROTOCOL_ID, frames.TYPE_AMQP, this);
+    this.sasl_transport = undefined;
+    this.transport = this.amqp_transport;
+
+    //reset remote endpoint state
+    this.state.disconnected();
+    this.remote = {};
+    //reset sessions:
+    this.remote_channel_map = {};
+    for (var k in this.local_channel_map) {
+        this.local_channel_map[k].reset();
+    }
+    this.socket_ready = false;
+}
+
+Connection.prototype.connect = function () {
+    this.is_server = false;
+    this._connect(this.options.connection_details(this.conn_established_counter));
+    this.open();
+    return this;
+};
+Connection.prototype.reconnect = function () {
+    log.reconnect('reconnecting...');
+    this.reset();
+    this._connect(this.options.connection_details(this.conn_established_counter));
+    process.nextTick(this._process.bind(this));
+    return this;
+};
+
+Connection.prototype._connect = function (details) {
+    if (details.connect) {
+        this.init(details.connect(details.port, details.host, details.options, this.connected.bind(this)));
+    } else {
+        this.init(get_connect_fn(details)(details.port, details.host, details.options, this.connected.bind(this)));
+    }
+    return this;
+};
+
+Connection.prototype.accept = function (socket) {
+    this.is_server = true;
+    log.io('[' + this.id + '] client accepted: '+ get_socket_id(socket));
+    this.socket_ready = true;
+    return this.init(socket);
+};
+
+Connection.prototype.init = function (socket) {
+    this.socket = socket;
+    this.socket.on('data', this.input.bind(this));
+    this.socket.on('error', this.error.bind(this));
+    this.socket.on('end', this.eof.bind(this));
+
+    if (this.is_server) {
+        var mechs;
+        if (this.container && Object.getOwnPropertyNames(this.container.sasl_server_mechanisms).length) {
+            mechs = this.container.sasl_server_mechanisms;
+        }
+        if (this.socket.encrypted && this.socket.authorized && this.get_option('enable_sasl_external', false)) {
+            mechs = sasl.server_add_external(mechs ? util.clone(mechs) : {});
+        }
+        if (mechs) {
+            this.sasl_transport = new sasl.Server(this, mechs);
+        }
+    } else {
+        var mechanisms = this.get_option('sasl_mechanisms');
+        if (!mechanisms) {
+            var username = this.get_option('username');
+            var password = this.get_option('password');
+            if (username) {
+                mechanisms = sasl.client_mechanisms();
+                if (password) mechanisms.enable_plain(username, password);
+                else mechanisms.enable_anonymous(username);
+            }
+        }
+        if (this.socket.encrypted && this.options.cert && this.get_option('enable_sasl_external', false)) {
+            if (!mechanisms) mechanisms = sasl.client_mechanisms();
+            mechanisms.enable_external();
+        }
+
+        if (mechanisms) {
+            this.sasl_transport = new sasl.Client(this, mechanisms);
+        }
+    }
+    this.transport = this.sasl_transport ? this.sasl_transport : this.amqp_transport;
+    return this;
+};
+
+Connection.prototype.attach_sender = function (options) {
+    return this.session_policy.get_session().attach_sender(options);
+};
+Connection.prototype.open_sender = Connection.prototype.attach_sender;//alias
+
+Connection.prototype.attach_receiver = function (options) {
+    return this.session_policy.get_session().attach_receiver(options);
+};
+Connection.prototype.open_receiver = Connection.prototype.attach_receiver;//alias
+
+Connection.prototype.get_option = function (name, default_value) {
+    if (this.options[name] !== undefined) return this.options[name];
+    else if (this.container) return this.container.get_option(name, default_value);
+    else return default_value;
+};
+
+Connection.prototype.connected = function () {
+    this.socket_ready = true;
+    this.conn_established_counter++;
+    log.io('[' + this.options.id + '] connected ' + get_socket_id(this.socket));
+    this.output();
+};
+Connection.prototype.sasl_failed = function (text) {
+    this.transport_error = {condition:'amqp:unauthorized-access', description:text};
+    this._handle_error();
+}
+
+Connection.prototype._handle_error = function () {
+    var error = this.get_error();
+    if (error) {
+        //TODO: invoke connection_close regardless of whether connection_error is handled
+        //TODO: example for error handling
+        if (!this.dispatch('connection_error', this._context())) {
+            if (!this.dispatch('connection_close', this._context())) {
+                console.log('error: ' + JSON.stringify(error));
+            }
+        }
+        return true;
+    } else {
+        return false;
+    }
+}
+
+Connection.prototype.get_error = function () {
+    if (this.transport_error) return this.transport_error;
+    if (this.remote.close && this.remote.close.error) return this.remote.close.error;
+    return undefined;
+}
+
+Connection.prototype.output = function () {
+    if (this.socket && this.socket_ready) {
+        if (this.heartbeat_out) clearTimeout(this.heartbeat_out);
+        this.transport.write(this.socket);
+        if (((this.is_closed() && this.state.has_settled()) || this.abort_idle || this.transport_error) && !this.transport.has_writes_pending()) {
+            this.socket.end();
+        } else if (this.is_open() && this.remote.open.idle_time_out) {
+            this.heartbeat_out = setTimeout(this._write_frame.bind(this), this.remote.open.idle_time_out / 2);
+        }
+    }
+};
+
+Connection.prototype.input = function (buff) {
+    if (this.heartbeat_in) clearTimeout(this.heartbeat_in);
+    log.io('[' + this.options.id + '] read ' + buff.length + ' bytes');
+    var buffer;
+    if (this.previous_input) {
+        buffer = Buffer.concat([this.previous_input, buff], this.previous_input.length + buff.length);
+        this.previous_input = null;
+    } else {
+        buffer = buff;
+    }
+    var read = this.transport.read(buffer, this);
+    if (read < buffer.length) {
+        this.previous_input = buffer.slice(read);
+    }
+    if (this.local.open.idle_time_out) this.heartbeat_in = setTimeout(this.idle.bind(this), this.local.open.idle_time_out);
+    if (this.transport.has_writes_pending()) this.output();
+};
+
+Connection.prototype.idle = function () {
+    if (this.is_open()) {
+        this.abort_idle = true;
+        this.local.close.error = {condition:'amqp:resource-limit-exceeded', description:'max idle time exceeded'};
+        this.close();
+    }
+};
+
+Connection.prototype.error = function (e) {
+    console.log('[' + this.options.id + '] error: ' + e);
+    this._disconnected();
+};
+
+Connection.prototype.eof = function (e) {
+    this._disconnected();
+};
+
+Connection.prototype._disconnected = function () {
+    if (!this.is_closed()) {
+        if (!this.dispatch('disconnected', this._context())) {
+            console.log('[' + this.options.id + '] disconnected');
+        }
+        if (!this.is_server && !this.transport_error && this.options.reconnect) {
+            var delay = this.options.reconnect(this.conn_established_counter);
+            if (delay >= 0) {
+                log.reconnect('Scheduled reconnect in ' + delay + 'ms');
+                setTimeout(this.reconnect.bind(this), delay);
+            }
+        }
+    }
+};
+
+Connection.prototype.open = function () {
+    if (this.state.open()) {
+        this._register();
+    }
+};
+Connection.prototype.close = function () {
+    if (this.state.close()) {
+        this._register();
+    }
+};
+
+Connection.prototype.is_open = function () {
+    return this.state.is_open();
+};
+
+Connection.prototype.is_closed = function () {
+    return this.state.is_closed();
+};
+
+Connection.prototype.create_session = function () {
+    var i = 0;
+    while (this.local_channel_map[i]) i++;
+    var session = new Session(this, i);
+    this.local_channel_map[i] = session;
+    return session;
+}
+
+Connection.prototype.on_open = function (frame) {
+    if (this.state.remote_opened()) {
+        this.remote.open = frame.performative;
+        this.open();
+        this.dispatch('connection_open', this._context());
+    } else {
+        throw Error('Open already received');
+    }
+};
+
+Connection.prototype.on_close = function (frame) {
+    if (this.state.remote_closed()) {
+        this.remote.close = frame.performative;
+        this.close();
+        if (this.remote.close.error) {
+            this._handle_error();
+        } else {
+            this.dispatch('connection_close', this._context());
+        }
+        if (this.heartbeat_out) clearTimeout(this.heartbeat_out);
+    } else {
+        throw Error('Close already received');
+    }
+};
+
+Connection.prototype._register = function () {
+    if (!this.registered) {
+        this.registered = true;
+        process.nextTick(this._process.bind(this));
+    }
+};
+
+Connection.prototype._process = function () {
+    this.registered = false;
+    do {
+        if (this.state.need_open()) {
+            this._write_open();
+        }
+        for (var k in this.local_channel_map) {
+            this.local_channel_map[k]._process();
+        }
+        if (this.state.need_close()) {
+            this._write_close();
+        }
+    } while (!this.state.has_settled());
+};
+
+Connection.prototype._write_frame = function (channel, frame, payload) {
+    this.amqp_transport.encode(frames.amqp_frame(channel, frame, payload));
+    this.output();
+};
+
+Connection.prototype._write_open = function () {
+    this._write_frame(0, this.local.open.described());
+};
+
+Connection.prototype._write_close = function () {
+    this._write_frame(0, this.local.close.described());
+};
+
+Connection.prototype.on_begin = function (frame) {
+    var session;
+    if (frame.performative.remote_channel === null || frame.performative.remote_channel === undefined) {
+        //peer initiated
+        session = this.create_session();
+        session.local.begin.remote_channel = frame.channel;
+    } else {
+        session = this.local_channel_map[frame.performative.remote_channel];
+        if (!session) throw Error('Invalid value for remote channel ' + frame.performative.remote_channel);
+    }
+    session.on_begin(frame);
+    this.remote_channel_map[frame.channel] = session;
+};
+
+Connection.prototype.get_peer_certificate = function() {
+    if (this.socket && this.socket.getPeerCertificate) {
+        return this.socket.getPeerCertificate();
+    } else {
+        return undefined;
+    }
+};
+
+Connection.prototype._context = function (c) {
+    var context = c ? c : {};
+    context.connection = this;
+    if (this.container) context.container = this.container;
+    return context;
+};
+
+function delegate_to_session(name) {
+    Connection.prototype['on_' + name] = function (frame) {
+        var session = this.remote_channel_map[frame.channel];
+        if (!session) {
+            throw Error(name + ' received on invalid channel ' + frame.channel);
+        }
+        session['on_' + name](frame);
+    };
+};
+
+delegate_to_session('end');
+delegate_to_session('attach');
+delegate_to_session('detach');
+delegate_to_session('transfer');
+delegate_to_session('disposition');
+delegate_to_session('flow');
+
+module.exports = Connection
+
+}).call(this,require('_process'),require("buffer").Buffer)
+},{"./endpoint.js":2,"./frames.js":3,"./log.js":5,"./sasl.js":8,"./session.js":9,"./transport.js":11,"./types.js":12,"./util.js":13,"_process":24,"buffer":19,"events":23,"net":18,"tls":18}],2:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * Licensed 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.
+ */
+'use strict';
+
+var EndpointState = function () {
+    this.init();
+};
+
+EndpointState.prototype.init = function () {
+    this.local_open = false;
+    this.remote_open = false;
+    this.open_requests = 0;
+    this.close_requests = 0;
+    this.initialised = false;
+};
+
+EndpointState.prototype.open = function () {
+    this.initialised = true;
+    if (!this.local_open) {
+        this.local_open = true;
+        this.open_requests++;
+        return true;
+    } else {
+        return false;
+    }
+};
+
+EndpointState.prototype.close = function () {
+    if (this.local_open) {
+        this.local_open = false;
+        this.close_requests++;
+        return true;
+    } else {
+        return false;
+    }
+};
+
+EndpointState.prototype.disconnected = function () {
+    var was_open = this.local_open;
+    this.init();
+    if (was_open) {
+        this.open();
+    } else {
+        this.close();
+    }
+};
+
+EndpointState.prototype.remote_opened = function (frame) {
+    if (!this.remote_open) {
+        this.remote_open = true;
+        return true;
+    } else {
+        return false;
+    }
+};
+
+EndpointState.prototype.remote_closed = function (frame) {
+    if (this.remote_open) {
+        this.remote_open = false;
+        return true;
+    } else {
+        return false;
+    }
+};
+
+EndpointState.prototype.is_open = function () {
+    return this.local_open && this.remote_open;
+};
+
+EndpointState.prototype.is_closed = function () {
+    return this.initialised && !this.local_open && !this.remote_open;
+};
+
+EndpointState.prototype.has_settled = function () {
+    return this.open_requests == 0 && this.close_requests == 0;
+};
+
+EndpointState.prototype.need_open = function () {
+    if (this.open_requests > 0) {
+        this.open_requests--;
+        return true;
+    } else {
+        return false;
+    }
+};
+
+EndpointState.prototype.need_close = function () {
+    if (this.close_requests > 0) {
+        this.close_requests--;
+        return true;
+    } else {
+        return false;
+    }
+};
+
+module.exports = EndpointState
+
+},{}],3:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * Licensed 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.
+ */
+'use strict';
+
+var types = require('./types.js');
+
+var frames = {};
+var by_descriptor = {};
+
+frames.read_header = function(buffer) {
+    var offset = 4;
+    var header = {};
+    var name = buffer.toString('ascii', 0, offset);
+    if (name !== 'AMQP') {
+        throw Error('Invalid protocol header for AMQP ' + name);
+    }
+    header.protocol_id = buffer.readUInt8(offset++);
+    header.major = buffer.readUInt8(offset++);
+    header.minor = buffer.readUInt8(offset++);
+    header.revision = buffer.readUInt8(offset++);
+    if (header.major !== 1 || header.minor !== 0) {
+        throw Error('Unsupported AMQP version: ' + JSON.stringify(header));
+    }
+    return header;
+};
+frames.write_header = function(buffer, header) {
+    var offset = 4;
+    buffer.write('AMQP', 0, offset, 'ascii');
+    buffer.writeUInt8(header.protocol_id, offset++);
+    buffer.writeUInt8(header.major, offset++);
+    buffer.writeUInt8(header.minor, offset++);
+    buffer.writeUInt8(header.revision, offset++);
+    return 8;
+};
+//todo: define enumeration for frame types
+frames.TYPE_AMQP = 0x00;
+frames.TYPE_SASL = 0x01;
+
+frames.read_frame = function(buffer) {
+    var reader = new types.Reader(buffer);
+    var frame = {};
+    frame.size = reader.read_uint(4);
+    if (reader.remaining < frame.size) {
+        return null;
+    }
+    var doff = reader.read_uint(1);
+    if (doff < 2) {
+        throw Error('Invalid data offset, must be at least 2 was ' + doff);
+    }
+    frame.type = reader.read_uint(1);
+    if (frame.type === frames.TYPE_AMQP) {
+        frame.channel = reader.read_uint(2);
+    } else if (frame.type === frames.TYPE_SASL) {
+        reader.skip(2);
+    } else {
+        throw Error('Unknown frame type ' + frame.type);
+    }
+    if (doff > 1) {
+        //ignore any extended header
+        reader.skip(doff * 4 - 8);
+    }
+    if (reader.remaining()) {
+        frame.performative = reader.read();
+        var c = by_descriptor[frame.performative.descriptor.value];
+        if (c) {
+            frame.performative = new c(frame.performative.value);
+        }
+        if (reader.remaining()) {
+            frame.payload = reader.read_bytes(reader.remaining());
+        }
+    }
+    return frame;
+};
+
+frames.write_frame = function(frame) {
+    var writer = new types.Writer();
+    writer.skip(4);//skip size until we know how much we have written
+    writer.write_uint(2, 1);//doff
+    writer.write_uint(frame.type, 1);
+    if (frame.type === frames.TYPE_AMQP) {
+        writer.write_uint(frame.channel, 2);
+    } else if (frame.type === frames.TYPE_SASL) {
+        writer.write_uint(0, 2);
+    } else {
+        throw Error('Unknown frame type ' + frame.type);
+    }
+    if (frame.performative) {
+        writer.write(frame.performative);
+        if (frame.payload) {
+            writer.write_bytes(frame.payload);
+        }
+    }
+    var buffer = writer.toBuffer();
+    buffer.writeUInt32BE(buffer.length, 0);//fill in the size
+    return buffer;
+};
+
+frames.amqp_frame = function(channel, performative, payload) {
+    return {'channel': channel || 0, 'type': frames.TYPE_AMQP, 'performative': performative, 'payload': payload};
+};
+frames.sasl_frame = function(performative) {
+    return {'channel': 0, 'type': frames.TYPE_SASL, 'performative': performative};
+};
+
+function define_frame(type, def) {
+    var c = types.define_composite(def);
+    frames[def.name] = c.create;
+    by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
+    by_descriptor[c.descriptor.symbolic] = c;
+};
+
+var open = {name: "open",
+            code: 0x10,
+            fields: [
+                 {name:"container_id", type:"string", mandatory:true},
+                 {name:"hostname", type:"string"},
+                 {name:"max_frame_size", type:"uint", default_value:4294967295},
+                 {name:"channel_max", type:"ushort", default_value:65535},
+                 {name:"idle_time_out", type:"uint"},
+                 {name:"outgoing_locales", type:"symbol", multiple:true},
+                 {name:"incoming_locales", type:"symbol", multiple:true},
+                 {name:"offered_capabilities", type:"symbol", multiple:true},
+                 {name:"desired_capabilities", type:"symbol", multiple:true},
+                 {name:"properties", type:"symbolic_map"}
+             ]
+           };
+
+var begin = {name:"begin",
+             code:0x11,
+             fields:[
+                 {name:"remote_channel", type:"ushort"},
+                 {name:"next_outgoing_id", type:"uint", mandatory:true},
+                 {name:"incoming_window", type:"uint", mandatory:true},
+                 {name:"outgoing_window", type:"uint", mandatory:true},
+                 {name:"handle_max", type:"uint", default_value:"4294967295"},
+                 {name:"offered_capabilities", type:"symbol", multiple:true},
+                 {name:"desired_capabilities", type:"symbol", multiple:true},
+                 {name:"properties", type:"symbolic_map"}
+             ]
+            };
+
+var attach = {name:"attach",
+              code:0x12,
+              fields:[
+                  {name:"name", type:"string", mandatory:true},
+                  {name:"handle", type:"uint", mandatory:true},
+                  {name:"role", type:"boolean", mandatory:true},
+                  {name:"snd_settle_mode", type:"ubyte", default_value:2},
+                  {name:"rcv_settle_mode", type:"ubyte", default_value:0},
+                  {name:"source", type:"*"},
+                  {name:"target", type:"*"},
+                  {name:"unsettled", type:"map"},
+                  {name:"incomplete_unsettled", type:"boolean", default_value:false},
+                  {name:"initial_delivery_count", type:"uint"},
+                  {name:"max_message_size", type:"ulong"},
+                  {name:"offered_capabilities", type:"symbol", multiple:true},
+                  {name:"desired_capabilities", type:"symbol", multiple:true},
+                  {name:"properties", type:"symbolic_map"}
+              ]
+             };
+
+var flow = {name:"flow",
+            code:0x13,
+            fields:[
+                {name:"next_incoming_id", type:"uint"},
+                {name:"incoming_window", type:"uint", mandatory:true},
+                {name:"next_outgoing_id", type:"uint", mandatory:true},
+                {name:"outgoing_window", type:"uint", mandatory:true},
+                {name:"handle", type:"uint"},
+                {name:"delivery_count", type:"uint"},
+                {name:"link_credit", type:"uint"},
+                {name:"available", type:"uint"},
+                {name:"drain", type:"boolean", default_value:false},
+                {name:"echo", type:"boolean", default_value:false},
+                {name:"properties", type:"symbolic_map"}
+            ]
+           };
+
+var transfer = {name:"transfer",
+                code:0x14,
+                fields:[
+                    {name:"handle", type:"uint", mandatory:true},
+                    {name:"delivery_id", type:"uint"},
+                    {name:"delivery_tag", type:"binary"},
+                    {name:"message_format", type:"uint"},
+                    {name:"settled", type:"boolean"},
+                    {name:"more", type:"boolean", default_value:false},
+                    {name:"rcv_settle_mode", type:"ubyte"},
+                    {name:"state", type:"delivery_state"},
+                    {name:"resume", type:"boolean", default_value:false},
+                    {name:"aborted", type:"boolean", default_value:false},
+                    {name:"batchable", type:"boolean", default_value:false}
+                ]
+               };
+
+var disposition = {name:"disposition",
+                   code:0x15,
+                   fields:[
+                       {name:"role", type:"boolean", mandatory:true},
+                       {name:"first", type:"uint", mandatory:true},
+                       {name:"last", type:"uint"},
+                       {name:"settled", type:"boolean", default_value:false},
+                       {name:"state", type:"*"},
+                       {name:"batchable", type:"boolean", default_value:false}
+                   ]
+                  };
+
+var detach = {name: "detach",
+             code: 0x16,
+              fields: [
+                  {name:"handle", type:"uint", mandatory:true},
+                  {name:"closed", type:"boolean", default_value:false},
+                  {name:"error", type:"error"}
+              ]
+             };
+
+var end = {name: "end",
+             code: 0x17,
+             fields: [
+                 {name:"error", type:"error"}
+             ]
+            };
+
+var close = {name: "close",
+             code: 0x18,
+             fields: [
+                 {name:"error", type:"error"}
+             ]
+            };
+
+define_frame(frames.TYPE_AMQP, open);
+define_frame(frames.TYPE_AMQP, begin);
+define_frame(frames.TYPE_AMQP, attach);
+define_frame(frames.TYPE_AMQP, flow);
+define_frame(frames.TYPE_AMQP, transfer);
+define_frame(frames.TYPE_AMQP, disposition);
+define_frame(frames.TYPE_AMQP, detach);
+define_frame(frames.TYPE_AMQP, end);
+define_frame(frames.TYPE_AMQP, close);
+
+var sasl_mechanisms = {name:"sasl_mechanisms", code:0x40,
+                       fields: [
+                           {name:"sasl_server_mechanisms", type:"symbol", multiple:true, mandatory:true}
+                       ]};
+
+var sasl_init = {name:"sasl_init", code:0x41,
+                 fields: [
+                     {name:"mechanism", type:"symbol", mandatory:true},
+                     {name:"initial_response", type:"binary"},
+                     {name:"hostname", type:"string"}
+                 ]};
+
+var sasl_challenge = {name:"sasl_challenge", code:0x42,
+                      fields: [
+                          {name:"challenge", type:"binary", mandatory:true}
+                      ]};
+
+var sasl_response = {name:"sasl_response", code:0x43,
+                     fields: [
+                         {name:"response", type:"binary", mandatory:true}
+                     ]};
+
+var sasl_outcome = {name:"sasl_outcome", code:0x44,
+                    fields: [
+                        {name:"code", type:"ubyte", mandatory:true},
+                        {name:"additional_data", type:"binary"}
+                    ]};
+
+define_frame(frames.TYPE_SASL, sasl_mechanisms);
+define_frame(frames.TYPE_SASL, sasl_init);
+define_frame(frames.TYPE_SASL, sasl_challenge);
+define_frame(frames.TYPE_SASL, sasl_response);
+define_frame(frames.TYPE_SASL, sasl_outcome);
+
+module.exports = frames;
+
+},{"./types.js":12}],4:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * Licensed 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.
+ */
+'use strict';
+
+var frames = require('./frames.js');
+var log = require('./log.js');
+var message = require('./message.js');
+var terminus = require('./terminus.js')
+var types = require('./types.js')
+var EndpointState = require('./endpoint.js');
+
+var FlowController = function (window) {
+    this.window = window;
+};
+FlowController.prototype.update = function (context) {
+    var delta = this.window - context.receiver.credit;
+    context.receiver.flow(delta);
+};
+
+function auto_settle(context) {
+    context.delivery.settled = true;
+};
+
+function auto_accept(context) {
+    context.delivery.update(true, message.accepted().described());
+};
+
+var EventEmitter = require('events').EventEmitter;
+
+var link = Object.create(EventEmitter.prototype);
+link.dispatch = function(name, context) {
+    log.events('Link got event: '+ name);
+    EventEmitter.prototype.emit.apply(this.observers, arguments);
+    if (this.listeners(name).length) {
+        EventEmitter.prototype.emit.apply(this, arguments);
+    } else {
+        this.session.dispatch.apply(this.session, arguments);
+    }
+};
+link.set_source = function (fields) {
+    this.local.attach.source = terminus.source(fields).described();
+};
+link.set_target = function (fields) {
+    this.local.attach.target = terminus.target(fields).described();
+};
+
+link.attach = function () {
+    if (this.state.open()) {
+        this.connection._register();
+    }
+};
+link.open = link.attach;
+
+link.detach = function () {
+    this.local.detach.closed = false;
+    if (this.state.close()) {
+        this.connection._register();
+    }
+};
+link.close = function() {
+    this.local.detach.closed = true;
+    if (this.state.close()) {
+        this.connection._register();
+    }
+}
+
+link.is_open = function () {
+    return this.session.is_open() && this.state.is_open();
+};
+
+link.is_closed = function () {
+    return this.session.is_closed() || this.state.is_closed();
+};
+
+link._process = function () {
+    do {
+        if (this.state.need_open()) {
+            this.session.output(this.local.attach.described());
+        }
+
+        if (this.issue_flow) {
+            this.session._write_flow(this);
+            this.issue_flow = false;
+        }
+
+        if (this.state.need_close()) {
+            this.session.output(this.local.detach.described());
+        }
+    } while (!this.state.has_settled());
+};
+
+link.on_attach = function (frame) {
+    if (this.state.remote_opened()) {
+        if (!this.remote.handle) {
+            this.remote.handle = frame.handle;
+        }
+        frame.performative.source = terminus.unwrap(frame.performative.source);
+        frame.performative.target = terminus.unwrap(frame.performative.target);
+        this.remote.attach = frame.performative;
+        this.open();
+        this.dispatch(this.is_receiver() ? 'receiver_open' : 'sender_open', this._context());
+    } else {
+        throw Error('Attach already received');
+    }
+};
+
+link.on_detach = function (frame) {
+    if (this.state.remote_closed()) {
+        this.remote.detach = frame.performative;
+        this.close();
+        this.dispatch(this.local.attach.role ? 'receiver_close' : 'sender_close', this._context());
+    } else {
+        throw Error('Detach already received');
+    }
+};
+
+function is_internal(name) {
+    switch (name) {
+    case 'handle':
+    case 'role':
+    case 'initial_delivery_count':
+        return true;
+    default:
+        return false;
+    }
+}
+
+link.init = function (session, name, local_handle, opts, is_receiver) {
+    this.session = session;
+    this.connection = session.connection;
+    this.name = name;
+    this.options = opts === undefined ? {} : opts;
+    this.state = new EndpointState();
+    this.issue_flow = false;//currently only used by receiver
+    this.local = {'handle': local_handle};
+    this.local.attach = frames.attach({'handle':local_handle,'name':name, role:is_receiver});
+    for (var f in this.local.attach) {
+        if (!is_internal(f) && this.options[f] !== undefined) {
+            this.local.attach[f] = this.options[f];
+        }
+    }
+    this.local.detach = frames.detach({'handle':local_handle, 'closed':true});
+    this.remote = {'handle':undefined};
+    this.delivery_count = 0;
+    this.credit = 0;
+    this.observers = new EventEmitter();
+};
+link.reset = function() {
+    this.state.disconnected();
+    this.remote = {'handle':undefined};
+    this.delivery_count = 0;
+    this.credit = 0;
+};
+
+link.has_credit = function () {
+    return this.credit > 0;
+};
+link.is_receiver = function () {
+    return this.local.attach.role;
+};
+link._context = function (c) {
+    var context = c ? c : {};
+    if (this.is_receiver()) {
+        context.receiver = this;
+    } else {
+        context.sender = this;
+    }
+    return this.session._context(context);
+};
+link.get_option = function (name, default_value) {
+    if (this.options[name] !== undefined) return this.options[name];
+    else return this.session.get_option(name, default_value);
+};
+
+var Sender = function (session, name, local_handle, opts) {
+    this.init(session, name, local_handle, opts, false);
+    this.local.attach.initial_delivery_count = 0;
+    this.tag = 0;
+    if (this.get_option('autosettle', true)) {
+        this.observers.on('settled', auto_settle);
+    }
+};
+Sender.prototype = Object.create(link);
+Sender.prototype.constructor = Sender;
+Sender.prototype.next_tag = function () {
+    return new String(this.tag++);
+};
+Sender.prototype.sendable = function (frame) {
+    return this.credit && this.session.outgoing.available();
+}
+Sender.prototype.on_flow = function (frame) {
+    var flow = frame.performative;
+    this.credit = flow.delivery_count + flow.link_credit - this.delivery_count;
+    if (this.is_open()) {
+        this.dispatch('sender_flow', this._context());
+        if (this.sendable()) {
+            this.dispatch('sendable', this._context());
+        }
+    }
+};
+Sender.prototype.on_transfer = function (frame) {
+    throw Error('got transfer on sending link');
+};
+Sender.prototype.send = function (msg, tag) {
+    return this.session.send(this, tag ? tag : this.next_tag(), message.encode(msg), 0);
+};
+
+
+var Receiver = function (session, name, local_handle, opts) {
+    this.init(session, name, local_handle, opts, true);
+    this.set_prefetch(this.get_option('prefetch', 100));
+    if (this.get_option('autoaccept', true)) {
+        this.observers.on('message', auto_accept);
+    }
+};
+Receiver.prototype = Object.create(link);
+Receiver.prototype.constructor = Receiver;
+Receiver.prototype.on_flow = function (frame) {
+    this.dispatch('receiver_flow', this._context());
+};
+Receiver.prototype.flow = function(credit) {
+    if (credit > 0) {
+        this.credit += credit;
+        this.issue_flow = true;
+        this.connection._register();
+    }
+};
+
+Receiver.prototype.set_prefetch = function(prefetch) {
+    if (prefetch > 0) {
+        var flow_controller = new FlowController(prefetch);
+        var listener = flow_controller.update.bind(flow_controller);
+        this.observers.on('message', listener);
+        this.observers.on('receiver_open', listener);
+    }
+}
+
+module.exports = {'Sender': Sender, 'Receiver':Receiver};
+
+},{"./endpoint.js":2,"./frames.js":3,"./log.js":5,"./message.js":6,"./terminus.js":10,"./types.js":12,"events":23}],5:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * Licensed 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.
+ */
+'use strict';
+
+var debug = require('debug');
+
+module.exports = {
+    'frames' : debug('rhea:frames'),
+    'raw' : debug('rhea:raw'),
+    'reconnect' : debug('rhea:reconnect'),
+    'events' : debug('rhea:events'),
+    'message' : debug('rhea:message'),
+    'flow' : debug('rhea:flow'),
+    'io' : debug('rhea:io')
+}
+
+},{"debug":15}],6:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * Licensed 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.
+ */
+'use strict';
+
+var log = require('./log.js');
+var types = require('./types.js');
+
+var by_descriptor = {};
+var unwrappers = {};
+var wrappers = [];
+var message = {};
+
+function define_section(descriptor, unwrap, wrap) {
+    unwrap.descriptor = descriptor;
+    unwrappers[descriptor.symbolic] = unwrap;
+    unwrappers[Number(descriptor.numeric).toString(10)] = unwrap;
+    if (wrap) {
+        wrappers.push(wrap);
+    }
+};
+
+function define_composite_section(def) {
+    var c = types.define_composite(def);
+    message[def.name] = c.create;
+    by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
+    by_descriptor[c.descriptor.symbolic] = c;
+
+    var unwrap = function (msg, section) {
+        msg[def.name] = new c(section.value);
+    };
+
+    var wrap = function (sections, msg) {
+        if (msg[def.name]) {
+            if (msg[def.name].described) {
+                sections.push(msg[def.name].described());
+            } else {
+                sections.push(c.create(msg[def.name]).described());
+            }
+        }
+    };
+    define_section(c.descriptor, unwrap, wrap);
+};
+
+
+function define_map_section(def) {
+    var descriptor = {numeric:def.code};
+    descriptor.symbolic = 'amqp:' + def.name.replace(/_/g, '-') + ':map';
+    var unwrap = function (msg, section) {
+        msg[def.name] = types.unwrap(section);
+    };
+    var wrap = function (sections, msg) {
+        if (msg[def.name]) {
+            sections.push(types.described(types.wrap_ulong(descriptor.numeric), types.wrap_map(msg[def.name])));
+        }
+    };
+    define_section(descriptor, unwrap, wrap);
+};
+
+define_composite_section({name:"header",
+                          code:0x70,
+                          fields:[
+                              {name:"durable", type:"boolean", default_value:false},
+                              {name:"priority", type:"ubyte", default_value:4},
+                              {name:"ttl", type:"uint"},
+                              {name:"first_acquirer", type:"boolean", default_value:false},
+                              {name:"delivery_count", type:"uint", default_value:0}
+                          ]
+                         });
+define_map_section({name:"delivery_annotations", code:0x71});
+define_map_section({name:"message_annotations", code:0x72});
+define_composite_section({name:"properties",
+                          code:0x73,
+                          fields:[
+                              {name:"message_id", type:"message_id"},
+                              {name:"user_id", type:"binary"},
+                              {name:"to", type:"string"},
+                              {name:"subject", type:"string"},
+                              {name:"reply_to", type:"string"},
+                              {name:"correlation_id", type:"message_id"},
+                              {name:"content_type", type:"symbol"},
+                              {name:"content_encoding", type:"symbol"},
+                              {name:"absolute_expiry_time", type:"timestamp"},
+                              {name:"creation_time", type:"timestamp"},
+                              {name:"group_id", type:"string"},
+                              {name:"group_sequence", type:"uint"},
+                              {name:"reply_to_group_id", type:"string"}
+                          ]
+                         });
+define_map_section({name:"application_properties", code:0x74});
+
+define_section({numeric:0x77, symbolic:'amqp:value:*'},
+               function(msg, section) { msg.body = types.unwrap(section); },
+               function(sections, msg) { sections.push(types.described(types.wrap_ulong(0x77), types.wrap(msg.body))); });
+
+define_map_section({name:"footer", code:0x78});
+
+message.encode = function(obj) {
+    var sections = [];
+
+    wrappers.forEach(function (wrapper_fn) { wrapper_fn(sections, obj); });
+    var writer = new types.Writer();
+    for (var i = 0; i < sections.length; i++) {
+        log.message('Encoding section ' + (i+1) + ' of ' + sections.length + ': ' + sections[i]);
+        writer.write(sections[i]);
+    }
+    var data = writer.toBuffer();
+    log.message('encoded ' + data.length + ' bytes');
+    return data;
+}
+
+message.decode = function(buffer) {
+    var msg = {};
+    var reader = new types.Reader(buffer);
+    while (reader.remaining()) {
+        var s = reader.read();
+        log.message('decoding section: ' + JSON.stringify(s) + ' of type: ' + JSON.stringify(s.descriptor));
+        if (s.descriptor) {
+            var unwrap = unwrappers[s.descriptor.value];
+            if (unwrap) {
+                unwrap(msg, s);
+            } else {
+                console.log("WARNING: did not recognise message section with descriptor " + s.descriptor);
+            }
+        } else {
+            console.log("WARNING: expected described message section got " + JSON.stringify(s));
+        }
+    }
+    return msg;
+}
+
+var outcomes = {};
+
+function define_outcome(def) {
+    var c = types.define_composite(def);
+    c.composite_type = def.name;
+    message[def.name] = c.create;
+    outcomes[Number(c.descriptor.numeric).toString(10)] = c;
+    outcomes[c.descriptor.symbolic] = c;
+    message['is_' + def.name] = function (o) {
+        if (o && o.descriptor) {
+            var c = outcomes[o.descriptor.value];
+            if (c) {
+                return c.descriptor.numeric == def.code;
+            }
+        }
+        return false;
+    };
+}
+
+message.unwrap_outcome = function (outcome) {
+    if (outcome && outcome.descriptor) {
+        var c = outcomes[outcome.descriptor.value];
+        if (c) {
+            return new c(outcome);
+        }
+    }
+    console.log('unrecognised outcome');
+    return outcome;
+};
+
+message.are_outcomes_equivalent = function(a, b) {
+    if (a === undefined && b === undefined) return true;
+    else if (a === undefined || b === undefined) return false;
+    else return a.descriptor.value == b.descriptor.value && JSON.stringify(a) == JSON.stringify(b);
+};
+
+define_outcome({name:"received", code:0x23,
+                fields:[
+                    {name:"section-number", type:"uint", mandatory:true},
+                    {name:"section-offset", type:"ulong", mandatory:true}
+                ]});
+define_outcome({name:"accepted", code:0x24, fields:[]});
+define_outcome({name:"rejected", code:0x25, fields:[{name:"error", type:"error"}]});
+define_outcome({name:"released", code:0x26, fields:[]});
+define_outcome({name:"modified",
+ code:0x27,
+ fields:[
+     {name:"delivery-failed", type:"boolean"},
+     {name:"undeliverable-here", type:"boolean"},
+     {name:"message-annotations", type:"fields"}
+]});
+
+module.exports = message;
+
+},{"./log.js":5,"./types.js":12}],7:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * Licensed 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.
+ */
+'use strict';
+
+var url = require('url');
+
+var simple_id_generator = {
+    counter : 1,
+    next : function() {
+        return this.counter++;
+    }
+};
+
+var Client = function (container, address) {
+    var u = url.parse(address);
+    //TODO: handle scheme and user/password if present
+    this.connection = container.connect({'host':u.hostname, 'port':u.port});
+    this.connection.on('message', this._response.bind(this));
+    this.connection.on('receiver_open', this._ready.bind(this));
+    this.sender = this.connection.attach_sender(u.path.substr(1));
+    this.receiver = this.connection.attach_receiver({source:{dynamic:true}});
+    this.id_generator = simple_id_generator;
+    this.pending = [];//requests yet to be made (waiting for receiver to open)
+    this.outstanding = {};//requests sent, for which responses have not yet been received
+};
+
+Client.prototype._request = function (id, name, args, callback) {
+    var request = {properties:{}};
+    request.properties.subject = name;
+    request.body = args;
+    request.properties.message_id = id;
+    request.properties.reply_to = this.receiver.remote.attach.source.address;
+    this.outstanding[id] = callback;
+    this.sender.send(request);
+};
+
+Client.prototype._response = function (context) {
+    var id = context.message.properties.correlation_id;
+    var callback = this.outstanding[id];
+    if (callback) {
+        if (context.message.properties.subject === 'ok') {
+            callback(context.message.body);
+        } else {
+            callback(undefined, {name: context.message.properties.subject, description: context.message.body});
+        }
+    } else {
+        console.log('no request pending for ' + id + ', ignoring response');
+    }
+};
+
+Client.prototype._ready = function (context) {
+    this._process_pending();
+};
+
+Client.prototype._process_pending = function () {
+    for (var i = 0; i < this.pending.length; i++) {
+        var r = this.pending[i];
+        this._request(r.id, r.name, r.args, r.callback);
+    }
+    this.pending = [];
+};
+
+Client.prototype.call = function (name, args, callback) {
+    var id = this.id_generator.next();
+    if (this.receiver.is_open() && this.pending.length === 0) {
+        this._request(id, name, args, callback);
+    } else {
+        //need to wait for reply-to address
+        this.pending.push({'name':name, 'args':args, 'callback':callback, 'id':id});
+    }
+};
+
+Client.prototype.close = function () {
+    this.receiver.close();
+    this.sender.close();
+    this.connection.close();
+};
+
+Client.prototype.define = function (name) {
+    this[name] = function (args, callback) { this.call(name, args, callback); };
+};
+
+var Cache = function (ttl, purged) {
+    this.ttl = ttl;
+    this.purged = purged;
+    this.entries = {};
+    this.timeout = undefined;
+};
+
+Cache.prototype.clear = function () {
+    if (this.timeout) clearTimeout(this.timeout);
+    this.entries = {};
+}
+
+Cache.prototype.put = function (key, value) {
+    this.entries[key] = {'value':value, 'last_accessed': Date.now()};
+    if (!this.timeout) this.timeout = setTimeout(this.purge.bind(this), this.ttl);
+};
+
+Cache.prototype.get = function (key) {
+    var entry = this.entries[key];
+    if (entry) {
+        entry.last_accessed = Date.now();
+        return entry.value;
+    } else {
+        return undefined;
+    }
+};
+
+Cache.prototype.purge = function() {
+    //TODO: this could be optimised if the map is large
+    var now = Date.now();
+    var expired = [];
+    var live = 0;
+    for (var k in this.entries) {
+        if (now - this.entries[k].last_accessed >= this.ttl) {
+            expired.push(k);
+        } else {
+            live++;
+        }
+    }
+    for (var i = 0; i < expired.length; i++) {
+        var entry = this.entries[expired[i]];
+        delete this.entries[expired[i]];
+        this.purged(entry.value);
+    }
+    if (live && !this.timeout) {
+        this.timeout = setTimeout(this.purge.bind(this), this.ttl);
+    }
+};
+
+var LinkCache = function (factory, ttl) {
+    this.factory = factory;
+    this.cache = new Cache(ttl, function(link) { link.close(); });
+}
+
+LinkCache.prototype.clear = function () {
+    this.cache.clear();
+}
+
+LinkCache.prototype.get = function (address) {
+    var link = this.cache.get(address);
+    if (link === undefined) {
+        link = this.factory(address);
+        this.cache.put(address, link);
+    }
+    return link;
+};
+
+var Server = function (container, address, options) {
+    this.options = options || {};
+    var u = url.parse(address);
+    //TODO: handle scheme and user/password if present
+    this.connection = container.connect({'host':u.hostname, 'port':u.port});
+    this.connection.on('connection_open', this._connection_open.bind(this));
+    this.connection.on('message', this._request.bind(this));
+    this.receiver = this.connection.attach_receiver(u.path.substr(1));
+    this.callbacks = {};
+    this._send = undefined;
+    this._clear = undefined;
+};
+
+function match(desired, offered) {
+    if (offered) {
+        if (Array.isArray(offered)) {
+            return offered.indexOf(desired) > -1;
+        } else {
+            return desired === offered;
+        }
+    } else {
+        return false;
+    }
+}
+
+Server.prototype._connection_open = function (context) {
+    if (match('ANONYMOUS-RELAY', this.connection.remote.open.offered_capabilities)) {
+        var relay = this.connection.attach_sender({target:{}});
+        this._send = function (msg) { relay.send(msg); };
+    } else {
+        var cache = new LinkCache(this.connection.attach_sender.bind(this.connection), this.options.cache_ttl || 60000);
+        this._send = function (msg) { var s = cache.get(msg.properties.to); if (s) s.send(msg); };
+        this._clear = function () { cache.clear(); }
+    }
+}
+
+Server.prototype._respond = function (response) {
+    var server = this;
+    return function (result, error) {
+        if (error) {
+            response.properties.subject = error.name || 'error';
+            response.body = error.description || error;
+        } else {
+            response.properties.subject = 'ok';
+            response.body = result;
+        }
+        server._send(response);
+    };
+}
+
+Server.prototype._request = function (context) {
+    var request = context.message;
+    var response = {properties:{}};
+    response.properties.to = request.properties.reply_to;
+    response.properties.correlation_id = request.properties.message_id;
+    var callback = this.callbacks[request.properties.subject];
+    if (callback) {
+        callback(request.body, this._respond(response));
+    } else {
+        response.properties.subject = 'bad-method';
+        response.body = 'Unrecognised method ' + request.properties.subject;
+        this._send(response);
+    }
+};
+
+Server.prototype.bind_sync = function (f, name) {
+    this.callbacks[name || f.name] = function (args, callback) { var result = f(args); callback(result); };
+};
+Server.prototype.bind = function (f, name) {
+    this.callbacks[name || f.name] = f;
+};
+
+Server.prototype.close = function () {
+    if (this._clear) this._clear();
+    this.receiver.close();
+    this.connection.close();
+};
+
+module.exports = {
+    server : function(container, address, options) { return new Server(container, address, options); },
+    client : function(connection, address) { return new Client(connection, address); }
+};
+
+},{"url":29}],8:[function(require,module,exports){
+(function (Buffer){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * Licensed 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.
+ */
+'use strict';
+
+var frames = require('./frames.js');
+var log = require('./log.js');
+var Transport = require('./transport.js');
+
+var sasl_codes = {
+    "OK":0,
+    "AUTH":1,
+    "SYS":2,
+    "SYS_PERM":3,
+    "SYS_TEMP":4,
+};
+
+var SASL_PROTOCOL_ID = 0x03;
+
+function intersection(lista, listb) {
+    return lista.filter(function (a) { return listb.indexOf(a) >= 0; });
+}
+function extract(buffer) {
+    var results = [];
+    var start = 0;
+    var i = 0;
+    while (i < buffer.length) {
+        if (buffer[i] === 0x00) {
+            if (i > start) results.push(buffer.toString('utf8', start, i));
+            else results.push(null);
+            start = ++i;
+        } else {
+            ++i;
+        }
+    }
+    if (i > start) results.push(buffer.toString('utf8', start, i));
+    else results.push(null);
+    return results;
+}
+
+var PlainServer = function(callback) {
+    this.callback = callback;
+    this.outcome = undefined;
+    this.username = undefined;
+};
+
+PlainServer.prototype.start = function(response) {
+    var fields = extract(response);
+    if (fields.length !== 3) {
+        this.connection.sasl_failed('Unexpected response in PLAIN, got ' + fields.length + ' fields, expected 3');
+    }
+    if (this.callback(fields[1], fields[2])) {
+        this.outcome = true;
+        this.username = fields[1];
+    } else {
+        this.outcome = false;
+    }
+};
+
+var PlainClient = function(username, password) {
+    this.username = username;
+    this.password = password;
+};
+
+PlainClient.prototype.start = function() {
+    var response = new Buffer(1 + this.username.length + 1 + this.password.length);
+    response.writeUInt8(0, 0);
+    response.write(this.username, 1);
+    response.writeUInt8(0, 1 + this.username.length);
+    response.write(this.password, 1 + this.username.length + 1);
+    return response;
+};
+
+var AnonymousServer = function() {
+    this.outcome = undefined;
+    this.username = undefined;
+};
+
+AnonymousServer.prototype.start = function(response) {
+    this.outcome = true;
+    this.username = response ? response.toString('utf8') : 'anonymous';
+};
+
+var AnonymousClient = function(name) {
+    this.username = name ? name : 'anonymous';
+};
+
+AnonymousClient.prototype.start = function() {
+    var response = new Buffer(1 + this.username.length);
+    response.writeUInt8(0, 0);
+    response.write(this.username, 1);
+    return response;
+};
+
+var ExternalServer = function() {
+    this.outcome = undefined;
+    this.username = undefined;
+};
+
+ExternalServer.prototype.start = function(response) {
+    this.outcome = true;
+};
+
+var ExternalClient = function() {
+    this.username = undefined;
+};
+
+ExternalClient.prototype.start = function() {
+    return null;
+};
+
+/**
+ * The mechanisms argument is a map of mechanism names to factory
+ * functions for objects that implement that mechanism.
+ */
+var SaslServer = function (connection, mechanisms) {
+    this.connection = connection;
+    this.transport = new Transport(connection.amqp_transport.identifier, SASL_PROTOCOL_ID, frames.TYPE_SASL, this);
+    this.next = connection.amqp_transport;
+    this.mechanisms = mechanisms;
+    this.mechanism = undefined;
+    this.outcome = undefined;
+    this.username = undefined;
+    var mechlist = Object.getOwnPropertyNames(mechanisms);
+    this.transport.encode(frames.sasl_frame(frames.sasl_mechanisms({sasl_server_mechanisms:mechlist}).described()));
+};
+
+SaslServer.prototype.do_step = function (challenge) {
+    if (this.mechanism.outcome === undefined) {
+        this.transport.encode(frames.sasl_frame(frames.sasl_challenge({'challenge':challenge}).described()));
+    } else {
+        this.outcome = this.mechanism.outcome ? sasl_codes.OK : sasl_codes.AUTH;
+        this.transport.encode(frames.sasl_frame(frames.sasl_outcome({code: this.outcome}).described()));
+        if (this.outcome === sasl_codes.OK) {
+            this.username = this.mechanism.username;
+            this.transport.write_complete = true;
+            this.transport.read_complete = true;
+        }
+    }
+};
+
+SaslServer.prototype.on_sasl_init = function (frame) {
+    var f = this.mechanisms[frame.performative.mechanism];
+    if (f) {
+        this.mechanism = f();
+        var challenge = this.mechanism.start(frame.performative.initial_response);
+        this.do_step(challenge);
+    } else {
+        this.outcome = sasl_codes.AUTH;
+        this.transport.encode(frames.sasl_frame(frames.sasl_outcome({code: this.outcome}).described()));
+    }
+};
+SaslServer.prototype.on_sasl_response = function (frame) {
+    this.do_step(this.mechanism.step(frame.performative.response));
+};
+
+SaslServer.prototype.has_writes_pending = function () {
+    return this.transport.has_writes_pending() || this.next.has_writes_pending();
+}
+
+SaslServer.prototype.write = function (socket) {
+    if (this.transport.write_complete && this.transport.pending.length === 0) {
+        return this.next.write(socket);
+    } else {
+        return this.transport.write(socket);
+    }
+};
+
+SaslServer.prototype.read = function (buffer) {
+    if (this.transport.read_complete) {
+        return this.next.read(buffer);
+    } else {
+        return this.transport.read(buffer);
+    }
+};
+
+var SaslClient = function (connection, mechanisms) {
+    this.connection = connection;
+    this.transport = new Transport(connection.amqp_transport.identifier, SASL_PROTOCOL_ID, frames.TYPE_SASL, this);
+    this.next = connection.amqp_transport;
+    this.mechanisms = mechanisms;
+    this.mechanism = undefined;
+    this.mechanism_name = undefined;
+    this.failed = false;
+};
+
+SaslClient.prototype.on_sasl_mechanisms = function (frame) {
+    for (var i = 0; this.mechanism === undefined && i < frame.performative.sasl_server_mechanisms.length; i++) {
+        var mech = frame.performative.sasl_server_mechanisms[i];
+        var f = this.mechanisms[mech];
+        if (f) {
+            this.mechanism = f();
+            this.mechanism_name = mech;
+        }
+    }
+    if (this.mechanism) {
+        var response = this.mechanism.start();
+        this.transport.encode(frames.sasl_frame(frames.sasl_init({'mechanism':this.mechanism_name,'initial_response':response}).described()));
+    } else {
+        this.failed = true;
+        this.connection.sasl_failed('No suitable mechanism; server supports ' + frame.performative.sasl_server_mechanisms);
+    }
+};
+SaslClient.prototype.on_sasl_challenge = function (frame) {
+    var response = this.mechanism.step(frame.performative.challenge);
+    this.transport.encode(frames.sasl_frame(frames.sasl_response({'response':response}).described()));
+};
+SaslClient.prototype.on_sasl_outcome = function (frame) {
+    switch (frame.performative.code) {
+    case sasl_codes.OK:
+        this.transport.read_complete = true;
+        this.transport.write_complete = true;
+        break;
+    default:
+        this.transport.write_complete = true;
+        this.connection.sasl_failed("Failed to authenticate: " + frame.performative.code);
+    }
+};
+
+SaslClient.prototype.has_writes_pending = function () {
+    return this.transport.has_writes_pending() || this.next.has_writes_pending();
+}
+
+SaslClient.prototype.write = function (socket) {
+    if (this.transport.write_complete) {
+        return this.next.write(socket);
+    } else {
+        return this.transport.write(socket);
+    }
+};
+
+SaslClient.prototype.read = function (buffer) {
+    if (this.transport.read_complete) {
+        return this.next.read(buffer);
+    } else {
+        return this.transport.read(buffer);
+    }
+};
+
+var default_server_mechanisms = {
+    enable_anonymous: function () {
+        this['ANONYMOUS'] = function() { return new AnonymousServer(); };
+    },
+    enable_plain: function (callback) {
+        this['PLAIN'] = function() { return new PlainServer(callback); };
+    }
+};
+
+var default_client_mechanisms = {
+    enable_anonymous: function (name) {
+        this['ANONYMOUS'] = function() { return new AnonymousClient(name); };
+    },
+    enable_plain: function (username, password) {
+        this['PLAIN'] = function() { return new PlainClient(username, password); };
+    },
+    enable_external: function () {
+        this['EXTERNAL'] = function() { return new ExternalClient(); };
+    }
+};
+
+module.exports = {
+    Client : SaslClient,
+    Server : SaslServer,
+    server_mechanisms : function () {
+        return Object.create(default_server_mechanisms);
+    },
+    client_mechanisms : function () {
+        return Object.create(default_client_mechanisms);
+    },
+    server_add_external: function (mechs) {
+        mechs['EXTERNAL'] = function() { return new ExternalServer(); };
+        return mechs;
+    }
+};
+
+}).call(this,require("buffer").Buffer)
+},{"./frames.js":3,"./log.js":5,"./transport.js":11,"buffer":19}],9:[function(require,module,exports){
+(function (Buffer){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * Licensed 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.
+ */
+'use strict';
+
+var frames = require('./frames.js');
+var link = require('./link.js');
+var log = require('./log.js');
+var message = require('./message.js');
+var types = require('./types.js');
+var util = require('./util.js');
+var EndpointState = require('./endpoint.js');
+
+var EventEmitter = require('events').EventEmitter;
+
+var CircularBuffer = function (capacity) {
+    this.capacity = capacity;
+    this.size = 0;
+    this.head = 0;
+    this.tail = 0;
+    this.entries = [];
+};
+
+CircularBuffer.prototype.available = function () {
+    return this.capacity - this.size;
+};
+
+CircularBuffer.prototype.push = function (o) {
+    if (this.size < this.capacity) {
+        this.entries[this.tail] = o;
+        this.tail = (this.tail + 1) % this.capacity;
+        this.size++;
+    } else {
+        throw Error('circular buffer overflow: head=' + this.head + ' tail=' + this.tail + ' size=' + this.size + ' capacity=' + this.capacity);
+    }
+};
+
+CircularBuffer.prototype.pop_if = function (f) {
+    var count = 0;
+    while (this.size && f(this.entries[this.head])) {
+        this.entries[this.head] = undefined;
+        this.head = (this.head + 1) % this.capacity;
+        this.size--;
+        count++;
+    }
+    return count;
+};
+
+CircularBuffer.prototype.by_id = function (id) {
+    if (this.size > 0) {
+        var gap = id - this.entries[this.head].id;
+        if (gap < this.size) {
+            return this.entries[(this.head + gap) % this.capacity];
+        }
+    }
+    return undefined;
+};
+
+CircularBuffer.prototype.get_head = function (id) {
+    return this.size > 0 ? this.entries[this.head] : undefined;
+};
+
+
+var Outgoing = function () {
+    this.deliveries = new CircularBuffer(2048/*TODO= configurable?*/);
+    this.updated = [];
+    this.next_delivery_id = 0;
+    this.next_pending_delivery = 0;
+    this.next_transfer_id = 0;
+    this.window = types.MAX_UINT;
+    this.remote_next_transfer_id = undefined;
+    this.remote_window = undefined;
+};
+
+Outgoing.prototype.available = function () {
+    return this.deliveries.available();
+};
+
+Outgoing.prototype.send = function (sender, tag, data, format) {
+    var d = {'id':this.next_delivery_id++,
+             'tag':tag,
+             'link':sender,
+             'data': data,
+             'format':format ? format : 0,
+             'sent': false,
+             'settled': false,
+             'state': undefined,
+             'remote_settled': false,
+             'remote_state': undefined};
+    this.deliveries.push(d);
+    return d;
+};
+
+Outgoing.prototype.on_begin = function (fields) {
+    this.remote_window = fields.incoming_window;
+};
+
+Outgoing.prototype.on_flow = function (fields) {
+    this.remote_next_transfer_id = fields.next_incoming_id;
+    this.remote_window = fields.incoming_window;
+};
+
+Outgoing.prototype.on_disposition = function (fields) {
+    var last = fields.last ? fields.last : fields.first;
+    for (var i = fields.first; i <= last; i++) {
+        var d = this.deliveries.by_id(i);
+        if (!d) {
+            console.log('Could not find delivery for ' + i + ' [' + JSON.stringify(fields) + ']');
+        }
+        if (d && !d.remote_settled) {
+            var updated = false;
+            if (fields.settled) {
+                d.remote_settled = fields.settled;
+                updated = true;
+            }
+            if (fields.state && fields.state !== d.remote_state) {
+                d.remote_state = fields.state;
+                updated = true;
+            }
+            if (updated) {
+                this.updated.push(d);
+            }
+        }
+    }
+};
+
+Outgoing.prototype.transfer_window = function() {
+    if (this.remote_window) {
+        return this.remote_window - (this.next_transfer_id - this.remote_next_transfer_id);
+    }
+};
+
+Outgoing.prototype.process = function() {
+    // send pending deliveries for which there is credit:
+    while (this.next_pending_delivery < this.next_delivery_id) {
+        var d = this.deliveries.by_id(this.next_pending_delivery);
+        if (d) {
+            if (d.link.has_credit()) {
+                d.link.delivery_count++;
+                //TODO: fragment as appropriate
+                d.transfers_required = 1;
+                if (this.transfer_window() >= d.transfers_required) {
+                    this.next_transfer_id += d.transfers_required;
+                    this.window -= d.transfers_required;
+                    d.link.session.output(frames.transfer({'handle':d.link.local.handle,'message_format':d.format,'delivery_id':d.id, 'delivery_tag':d.tag}).described(), d.data);
+                    d.link.credit--;
+                    this.next_pending_delivery++;
+                } else {
+                    log.flow('Incoming window of peer preventing sending further transfers: remote_window=' + this.remote_window + ", remote_next_transfer_id=" + this.remote_next_transfer_id
+                               + ", next_transfer_id=" + this.next_transfer_id);
+                    break;
+                }
+            } else {
+                log.flow('Link has no credit');
+                break;
+            }
+        } else {
+            console.log('ERROR: Next pending delivery not found: ' + this.next_pending_delivery);
+            break;
+        }
+    }
+
+    // notify application of any updated deliveries:
+    for (var i = 0; i < this.updated.length; i++) {
+        var d = this.updated[i];
+        if (d.remote_state) {
+            d.remote_state = message.unwrap_outcome(d.remote_state);
+            if (d.remote_state && d.remote_state.constructor.composite_type) {
+                d.link.dispatch(d.remote_state.constructor.composite_type, d.link._context({'delivery':d}));
+            }
+        }
+        if (d.remote_settled) d.link.dispatch('settled', d.link._context({'delivery':d}));
+    }
+    this.updated = [];
+
+    // remove any fully settled deliveries:
+    this.deliveries.pop_if(function (d) { return d.settled && d.remote_settled; });
+};
+
+var Incoming = function () {
+    this.deliveries = new CircularBuffer(2048/*TODO: configurable?*/);
+    this.updated = [];
+    this.next_transfer_id = 0;
+    this.next_delivery_id = undefined;
+    this.window = 2048/*TODO: configurable?*/;
+    this.remote_next_transfer_id = undefined;
+    this.remote_window = undefined;
+};
+
+Incoming.prototype.update = function (delivery, settled, state) {
+    if (delivery) {
+        delivery.settled = settled;
+        if (state !== undefined) delivery.state = state;
+        if (!delivery.remote_settled) {
+            this.updated.push(delivery);
+        }
+        delivery.link.connection._register();
+    }
+};
+
+Incoming.prototype.on_transfer = function(frame, receiver) {
+    this.next_transfer_id++;
+    if (receiver.is_open()) {
+        if (this.next_delivery_id === undefined) {
+            this.next_delivery_id = frame.performative.delivery_id;
+        }
+        var current;
+        var data;
+        var last = this.deliveries.get_head();
+        if (last && last.incomplete) {
+            if (frame.performative.delivery_id !== undefined && this.next_delivery_id != frame.performative.delivery_id) {
+                //TODO: better error handling
+                throw Error("frame sequence error: delivery " + this.next_delivery_id + " not complete, got " + frame.performative.delivery_id);
+            }
+            current = last;
+            data = Buffer.concat([current.data, frame.payload], current.data.size() + frame.payload.size());
+        } else if (this.next_delivery_id === frame.performative.delivery_id) {
+            current = {'id':frame.performative.delivery_id,
+                       'tag':frame.performative.delivery_tag,
+                       'link':receiver,
+                       'settled': false,
+                       'state': undefined,
+                       'remote_settled': frame.performative.settled,
+                       'remote_state': undefined};
+            var self = this;
+            current.update = function (settled, state) { self.update(current, settled, state); };
+            this.deliveries.push(current);
+            data = frame.payload;
+        } else {
+            //TODO: better error handling
+            throw Error("frame sequence error: expected " + this.next_delivery_id + ", got " + frame.performative.delivery_id);
+        }
+        current.incomplete = frame.performative.more;
+        if (current.incomplete) {
+            current.data = data;
+        } else {
+            receiver.credit--;
+            receiver.delivery_count++;
+            this.next_delivery_id++;
+            receiver.dispatch('message', receiver._context({'message':message.decode(data), 'delivery':current}));
+        }
+    }
+};
+
+Incoming.prototype.process = function () {
+    if (this.updated.length > 0) {
+        var first;
+        var last;
+        var next_id;
+
+        for (var i = 0; i < this.updated.length; i++) {
+            var delivery = this.updated[i];
+            if (first === undefined) {
+                first = delivery;
+                last = delivery;
+                next_id = delivery.id;
+            }
+
+            if (!message.are_outcomes_equivalent(last.state, delivery.state) || last.settled !== delivery.settled || next_id !== delivery.id) {
+                first.link.session.output(frames.disposition({'role':true,'first':first.id,'last':last.id, 'state':first.state, 'settled':first.settled}).described());
+                first = delivery;
+                last = delivery;
+                next_id = delivery.id;
+            } else {
+                if (last.id !== delivery.id) {
+                    last = delivery;
+                }
+                next_id++;
+            }
+        }
+        if (first !== undefined && last !== undefined) {
+            first.link.session.output(frames.disposition({'role':true,'first':first.id,'last':last.id, 'state':first.state, 'settled':first.settled}).described());
+        }
+
+        this.updated = [];
+    }
+
+    // remove any fully settled deliveries:
+    this.deliveries.pop_if(function (d) { return d.settled; });
+};
+
+Incoming.prototype.on_begin = function (fields) {
+    this.remote_window = fields.outgoing_window;
+};
+
+Incoming.prototype.on_flow = function (fields) {
+    this.remote_next_transfer_id = fields.next_outgoing_id;
+    this.remote_window = fields.outgoing_window;
+};
+
+Incoming.prototype.on_disposition = function (fields) {
+    var last = fields.last ? fields.last : fields.first;
+    for (var i = fields.first; i <= last; i++) {
+        var d = this.deliveries.by_id(i);
+        if (!d) {
+            console.log('Could not find delivery for ' + i);
+        }
+        if (d && !d.remote_settled) {
+            var updated = false;
+            if (fields.settled) {
+                d.remote_settled = fields.settled;
+                updated = true;
+            }
+            if (fields.state && fields.state !== d.remote_state) {
+                d.remote_state = fields.state;
+                updated = true;
+            }
+            if (updated) {
+                console.log(d.link.connection.options.id + ' added delivery to updated list following receipt of disposition for incoming deliveries');
+                this.updated.push(d);
+            }
+        }
+    }
+
+};
+
+var Session = function (connection, local_channel) {
+    this.connection = connection;
+    this.outgoing = new Outgoing();
+    this.incoming = new Incoming();
+    this.state = new EndpointState();
+    this.local = {'channel': local_channel, 'handles':{}};
+    this.local.begin = frames.begin({next_outgoing_id:this.outgoing.next_transfer_id,incoming_window:this.incoming.window,outgoing_window:this.outgoing.window});
+    this.local.end = frames.end();
+    this.remote = {'handles':{}};
+    this.links = {}; // map by name
+    this.options = {};
+};
+Session.prototype = Object.create(EventEmitter.prototype);
+Session.prototype.constructor = Session;
+
+Session.prototype.reset = function() {
+    this.state.disconnected();
+    this.outgoing = new Outgoing();
+    this.incoming = new Incoming();
+    this.remote = {'handles':{}};
+    for (var l in this.links) {
+        this.links[l].reset();
+    }
+};
+
+Session.prototype.dispatch = function(name, context) {
+    log.events('Session got event: '+ name);
+    if (this.listeners(name).length) {
+        EventEmitter.prototype.emit.apply(this, arguments);
+    } else {
+        this.connection.dispatch.apply(this.connection, arguments);
+    }
+};
+Session.prototype.output = function (frame, payload) {
+    this.connection._write_frame(this.local.channel, frame, payload);
+};
+
+Session.prototype.create_sender = function (name, opts) {
+    return this.create_link(name, link.Sender, opts);
+};
+
+Session.prototype.create_receiver = function (name, opts) {
+    return this.create_link(name, link.Receiver, opts);
+};
+
+function attach(factory, args, remote_terminus) {
+    var opts = args ? args : {};
+    if (typeof args === 'string') {
+        opts = {};
+        opts[remote_terminus] = args;
+    }
+    if (!opts.name) opts.name = util.generate_uuid();
+    var l = factory(opts.name, opts);
+    for (var t in {'source':0, 'target':0}) {
+        if (opts[t]) {
+            if (typeof opts[t] === 'string') {
+                opts[t] = {'address' : opts[t]};
+            }
+            l['set_' + t](opts[t]);
+        }
+    }
+    l.attach();
+    return l;
+}
+
+Session.prototype.get_option = function (name, default_value) {
+    if (this.options[name] !== undefined) return this.options[name];
+    else return this.connection.get_option(name, default_value);
+};
+
+Session.prototype.attach_sender = function (args) {
+    return attach(this.create_sender.bind(this), args, 'target');
+};
+Session.prototype.open_sender = Session.prototype.attach_sender;//alias
+
+Session.prototype.attach_receiver = function (args) {
+    return attach(this.create_receiver.bind(this), args, 'source');
+};
+Session.prototype.open_receiver = Session.prototype.attach_receiver;//alias
+
+Session.prototype.create_link = function (name, constructor, opts) {
+    var i = 0;
+    while (this.local.handles[i]) i++;
+    var l = new constructor(this, name, i, opts);
+    this.links[name] = l;
+    this.local.handles[i] = l;
+    return l;
+};
+
+Session.prototype.begin = function () {
+    if (this.state.open()) {
+        this.connection._register();
+    }
+};
+Session.prototype.open = Session.prototype.begin;
+
+Session.prototype.end = function () {
+    if (this.state.close()) {
+        this.connection._register();
+    }
+};
+Session.prototype.close = Session.prototype.end;
+
+Session.prototype.is_open = function () {
+    return this.connection.is_open() && this.state.is_open();
+};
+
+Session.prototype.is_closed = function () {
+    return this.connection.is_closed() || this.state.is_closed();
+};
+
+Session.prototype._process = function () {
+    do {
+        if (this.state.need_open()) {
+            this.output(this.local.begin.described());
+        }
+
+        this.outgoing.process();
+        this.incoming.process();
+        for (var k in this.links) {
+            this.links[k]._process();
+        }
+
+        if (this.state.need_close()) {
+            this.output(this.local.end.described());
+        }
+    } while (!this.state.has_settled());
+};
+
+Session.prototype.send = function (sender, tag, data, format) {
+    var d = this.outgoing.send(sender, tag, data, format);
+    this.connection._register();
+    return d;
+};
+
+Session.prototype._write_flow = function (link) {
+    var fields = {'next_incoming_id':this.incoming.next_transfer_id,
+                  'incoming_window':this.incoming.window,
+                  'next_outgoing_id':this.outgoing.next_transfer_id,
+                  'outgoing_window':this.outgoing.window
+                 };
+    if (link) {
+        fields.delivery_count = link.delivery_count;
+        fields.handle = link.local.handle;
+        fields.link_credit = link.credit;
+    }
+    this.output(frames.flow(fields).described());
+};
+
+Session.prototype.on_begin = function (frame) {
+    if (this.state.remote_opened()) {
+        if (!this.remote.channel) {
+            this.remote.channel = frame.channel;
+        }
+        this.remote.begin = frame.performative;
+        this.outgoing.on_begin(frame.performative);
+        this.incoming.on_begin(frame.performative);
+        this.open();
+        this.dispatch('session_open', this._context());
+    } else {
+        throw Error('Begin already received');
+    }
+};
+Session.prototype.on_end = function (frame) {
+    if (this.state.remote_closed()) {
+        this.remote.end = frame.performative;
+        this.close();
+        this.dispatch('session_close', this._context());
+    } else {
+        throw Error('End already received');
+    }
+};
+
+Session.prototype.on_attach = function (frame) {
+    var name = frame.performative.name;
+    var link = this.links[name];
+    if (!link) {
+        // if role is true, peer is receiver, so we are sender
+        link = frame.performative.role ? this.create_sender(name) : this.create_receiver(name);
+    }
+    this.remote.handles[frame.performative.handle] = link;
+    link.on_attach(frame);
+    link.remote.attach = frame.performative;
+};
+
+Session.prototype.on_disposition = function (frame) {
+    if (frame.performative.role) {
+        log.events('Received disposition for outgoing transfers');
+        this.outgoing.on_disposition(frame.performative);
+    } else {
+        log.events('Received disposition for incoming transfers');
+        this.incoming.on_disposition(frame.performative);
+    }
+    this.connection._register();
+}
+
+Session.prototype.on_flow = function (frame) {
+    this.outgoing.on_flow(frame.performative);
+    this.incoming.on_flow(frame.performative);
+    if (frame.performative.handle !== undefined) {
+        this._get_link(frame).on_flow(frame);
+    }
+    this.connection._register();
+}
+Session.prototype._context = function (c) {
+    var context = c ? c : {};
+    context.session = this;
+    return this.connection._context(context);
+};
+
+Session.prototype._get_link = function (frame) {
+    var handle = frame.performative.handle;
+    var link = this.remote.handles[handle];
+    if (!link) {
+        throw Error('Invalid handle ' + handle);
+    }
+    return link;
+};
+
+Session.prototype.on_detach = function (frame) {
+    this._get_link(frame).on_detach(frame);
+    //remove link
+    var handle = frame.performative.handle;
+    var link = this.remote.handles[handle];
+    delete this.remote.handles[handle];
+    delete this.local.handles[link.local.handle];
+    delete this.links[link.name];
+};
+
+Session.prototype.on_transfer = function (frame) {
+    this.incoming.on_transfer(frame, this._get_link(frame));
+};
+
+module.exports = Session;
+
+}).call(this,require("buffer").Buffer)
+},{"./endpoint.js":2,"./frames.js":3,"./link.js":4,"./log.js":5,"./message.js":6,"./types.js":12,"./util.js":13,"buffer":19,"events":23}],10:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * Licensed 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.
+ */
+'use strict';
+
+var types = require('./types.js');
+
+var terminus = {};
+var by_descriptor = {};
+
+function define_terminus(def) {
+    var c = types.define_composite(def);
+    terminus[def.name] = c.create;
+    by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
+    by_descriptor[c.descriptor.symbolic] = c;
+};
+
+terminus.unwrap = function(field) {
+    if (field && field.descriptor) {
+        var c = by_descriptor[field.descriptor.value];
+        if (c) {
+            return new c(field.value)
+        } else {
+            console.log('Unknown terminus: ' + field.descriptor);
+        }
+    }
+    return null;
+};
+
+define_terminus(
+    {name:"source",
+     code:0x28,
+     fields: [
+         {name:"address", type:"string"},
+         {name:"durable", type:"uint", default_value:0},
+         {name:"expiry_policy", type:"symbol", default_value:"session-end"},
+         {name:"timeout", type:"uint", default_value:0},
+         {name:"dynamic", type:"boolean", default_value:false},
+         {name:"dynamic_node_properties", type:"symbolic_map"},
+         {name:"distribution_mode", type:"symbol"},
+         {name:"filter", type:"symbolic_map"},
+         {name:"default_outcome", type:"*"},
+         {name:"outcomes", type:"symbol", multiple:true},
+         {name:"capabilities", type:"symbol", multiple:true}
+     ]
+    });
+
+define_terminus(
+    {name:"target",
+     code:0x29,
+     fields: [
+         {name:"address", type:"string"},
+         {name:"durable", type:"uint", default_value:0},
+         {name:"expiry_policy", type:"symbol", default_value:"session-end"},
+         {name:"timeout", type:"uint", default_value:0},
+         {name:"dynamic", type:"boolean", default_value:false},
+         {name:"dynamic_node_properties", type:"symbolic_map"},
+         {name:"capabilities", type:"symbol", multiple:true}
+     ]
+    });
+
+module.exports = terminus;
+
+},{"./types.js":12}],11:[function(require,module,exports){
+(function (Buffer){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License

<TRUNCATED>

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[07/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/data/world-110m.json
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/data/world-110m.json b/console/stand-alone/plugin/data/world-110m.json
new file mode 100644
index 0000000..a1ce852
--- /dev/null
+++ b/console/stand-alone/plugin/data/world-110m.json
@@ -0,0 +1 @@
+{"type":"Topology","transform":{"scale":[0.0036000360003600037,0.0016925586033320111],"translate":[-180,-85.60903777459777]},"objects":{"land":{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[7,8,9]],[[10,11]],[[12]],[[13]],[[14]],[[15]],[[16]],[[17]],[[18]],[[19]],[[20]],[[21]],[[22]],[[23]],[[24]],[[25]],[[26]],[[27]],[[28]],[[29,30]],[[31]],[[32]],[[33]],[[34]],[[35]],[[36]],[[37]],[[38]],[[39]],[[40]],[[41]],[[42,43]],[[44]],[[45]],[[46]],[[47,48,49,50]],[[51]],[[52]],[[53]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]],[[60]],[[61]],[[62,63]],[[64]],[[65]],[[66]],[[67]],[[68]],[[69]],[[70]],[[71]],[[72]],[[73]],[[74]],[[75]],[[76,77]],[[78]],[[79]],[[80]],[[81]],[[82]],[[83]],[[84]],[[85]],[[86]],[[87]],[[88]],[[89]],[[90,91]],[[92]],[[93]],[[94]],[[95]],[[96]],[[97]],[[98]],[[99]],[[100]],[[101]],[[102]],[[103]],[[104]],[[105]],[[106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137
 ,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221]],[[222,223]],[[224]],[[225]],[[226]],[[227]],[[228]],[[229]],[[230,231,232,233]],[[234]],[[235]],[[236]],[[237]],[[238]],[[239]],[[240]],[[241]],[[242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,
 370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477],[478,479,480,481,482,483,484]],[[485]],[[486]],[[487]],[[488]],[[489]],[[490]],[[491]],[[492]],[[493]],[[494]],[[495]],[[496]],[[497]],[[498]]]},"countries":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[499,500,501,502,503,504]],"id":4},{"type":"MultiPolygon","arcs":[[[505,506,352,507]],[[354,508,509]]],"id":24},{"type":"Polygon","arcs":[[510,511,414,512,513,514]],"id":8},{"type":"Polygon","arcs":[[312,515,314,516,517]],"id":784},{"type":"MultiPolygon","arcs":[[[518,11]],[[519,520,521,166,522,168,523,524]]],"id":32},{"type":"Polygon",
 "arcs":[[525,526,527,528,529]],"id":51},{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[530,531]]],"id":10},{"type":"Polygon","arcs":[[13]],"id":260},{"type":"MultiPolygon","arcs":[[[14]],[[24]]],"id":36},{"type":"Polygon","arcs":[[532,533,534,535,536,537,538]],"id":40},{"type":"MultiPolygon","arcs":[[[539,-528]],[[484,540,479,541,-526,542,543]]],"id":31},{"type":"Polygon","arcs":[[544,545,546]],"id":108},{"type":"Polygon","arcs":[[547,548,549,550,437]],"id":56},{"type":"Polygon","arcs":[[551,552,553,554,366]],"id":204},{"type":"Polygon","arcs":[[555,556,557,-553,558,559]],"id":854},{"type":"Polygon","arcs":[[560,561,289,562]],"id":50},{"type":"Polygon","arcs":[[563,404,564,565,566,567]],"id":100},{"type":"MultiPolygon","arcs":[[[71]],[[73]],[[74]]],"id":44},{"type":"Polygon","arcs":[[568,569,570]],"id":70},{"type":"Polygon","arcs":[[571,572,573,574,575]],"id":112},{"type":"Polygon","arcs":[[576,145,577]],"id":84},{"type":"Polygon","arcs":[[578,579,580,581
 ,-525]],"id":68},{"type":"Polygon","arcs":[[-521,582,-581,583,584,585,586,587,588,164,589]],"id":76},{"type":"Polygon","arcs":[[48,590]],"id":96},{"type":"Polygon","arcs":[[591,592]],"id":64},{"type":"Polygon","arcs":[[593,594,595,596]],"id":72},{"type":"Polygon","arcs":[[597,598,599,600,601,602,603]],"id":140},{"type":"MultiPolygon","arcs":[[[84]],[[85]],[[86]],[[87]],[[88]],[[96]],[[97]],[[99]],[[101]],[[103]],[[604,107,605,109,606,111,607,113,608,115,609,117,610,199,611,201,612,215,613,217,614,219,615,221]],[[616,223]],[[224]],[[225]],[[226]],[[227]],[[229]],[[230,617,232,618]],[[235]],[[237]],[[238]],[[240]],[[241]],[[485]],[[486]],[[488]],[[489]],[[490]],[[496]],[[497]]],"id":124},{"type":"Polygon","arcs":[[-536,619,620,621]],"id":756},{"type":"MultiPolygon","arcs":[[[-519,622,623,624]],[[-524,169,625,171,626,-579]]],"id":152},{"type":"MultiPolygon","arcs":[[[64]],[[627,274,628,276,629,278,630,280,631,632,633,634,635,-593,636,637,638,639,-503,640,641,642,643,644,645]]],"id":156
 },{"type":"Polygon","arcs":[[369,646,647,648,-556,649]],"id":384},{"type":"Polygon","arcs":[[650,651,652,359,653,654,655,656,-604,657]],"id":120},{"type":"Polygon","arcs":[[658,659,-545,660,661,662,663,-508,353,-510,664,-602,665]],"id":180},{"type":"Polygon","arcs":[[-509,355,666,-658,-603,-665]],"id":178},{"type":"Polygon","arcs":[[667,174,668,155,669,-585,670]],"id":170},{"type":"Polygon","arcs":[[178,671,151,672]],"id":188},{"type":"Polygon","arcs":[[70]],"id":192},{"type":"Polygon","arcs":[[77,673]],"id":-99},{"type":"Polygon","arcs":[[76,-674]],"id":196},{"type":"Polygon","arcs":[[-538,674,675,676]],"id":203},{"type":"Polygon","arcs":[[445,677,-675,-537,-622,678,679,-549,680,441,681]],"id":276},{"type":"Polygon","arcs":[[337,682,683,684]],"id":262},{"type":"MultiPolygon","arcs":[[[92]],[[-682,442,685,444]]],"id":208},{"type":"Polygon","arcs":[[62,686]],"id":214},{"type":"Polygon","arcs":[[687,688,689,690,691,384,692,693]],"id":12},{"type":"Polygon","arcs":[[173,-668,694]],"id":
 218},{"type":"Polygon","arcs":[[333,695,696,390,697]],"id":818},{"type":"Polygon","arcs":[[698,699,700,336,-685]],"id":232},{"type":"Polygon","arcs":[[431,701,433,702,427,703,429,704]],"id":724},{"type":"Polygon","arcs":[[450,705,706]],"id":233},{"type":"Polygon","arcs":[[-684,707,708,709,710,711,712,-699]],"id":231},{"type":"Polygon","arcs":[[713,452,714,715,455,716,717]],"id":246},{"type":"MultiPolygon","arcs":[[[18]],[[19]],[[20]]],"id":242},{"type":"Polygon","arcs":[[12]],"id":238},{"type":"MultiPolygon","arcs":[[[718,719,163,-589]],[[82]],[[720,-679,-621,721,426,-703,434,722,436,-551]]],"id":250},{"type":"Polygon","arcs":[[356,723,-651,-667]],"id":266},{"type":"MultiPolygon","arcs":[[[724,90]],[[725,726,727,728,729,730,731,732]]],"id":826},{"type":"Polygon","arcs":[[400,733,-543,-530,734]],"id":268},{"type":"Polygon","arcs":[[368,-650,-560,735]],"id":288},{"type":"Polygon","arcs":[[736,737,374,738,739,740,-648]],"id":324},{"type":"Polygon","arcs":[[741,377]],"id":270},{"type":"
 Polygon","arcs":[[375,742,-739]],"id":624},{"type":"Polygon","arcs":[[357,-652,-724]],"id":226},{"type":"MultiPolygon","arcs":[[[78]],[[407,743,409,744,411,745,413,-512,746,-566,747]]],"id":300},{"type":"Polygon","arcs":[[498]],"id":304},{"type":"Polygon","arcs":[[185,748,-578,146,749,750]],"id":320},{"type":"Polygon","arcs":[[161,751,-587,752]],"id":328},{"type":"Polygon","arcs":[[182,753,754,-750,147,755,149,756]],"id":340},{"type":"Polygon","arcs":[[757,-571,758,417,759,419,760,761]],"id":191},{"type":"Polygon","arcs":[[-687,63]],"id":332},{"type":"Polygon","arcs":[[-533,762,763,764,765,-762,766]],"id":348},{"type":"MultiPolygon","arcs":[[[26]],[[767,30]],[[31]],[[32]],[[35]],[[36]],[[39]],[[40]],[[768,43]],[[44]],[[45]],[[769,50]],[[46]]],"id":360},{"type":"Polygon","arcs":[[-639,770,-637,-592,-636,771,-563,290,772,292,773,294,774,296,775]],"id":356},{"type":"Polygon","arcs":[[91,-725]],"id":372},{"type":"Polygon","arcs":[[776,-505,777,300,778,302,779,780,781,-540,-527,-542,480]
 ],"id":364},{"type":"Polygon","arcs":[[782,783,784,785,786,-781,787]],"id":368},{"type":"Polygon","arcs":[[100]],"id":352},{"type":"Polygon","arcs":[[788,789,-698,391,790,791,792]],"id":376},{"type":"MultiPolygon","arcs":[[[79]],[[80]],[[793,421,794,423,795,425,-722,-620,-535]]],"id":380},{"type":"Polygon","arcs":[[61]],"id":388},{"type":"Polygon","arcs":[[796,-785,797,332,-790,798,-793]],"id":400},{"type":"MultiPolygon","arcs":[[[75]],[[81]],[[83]]],"id":392},{"type":"Polygon","arcs":[[799,800,482,801,-643,802]],"id":398},{"type":"Polygon","arcs":[[342,803,804,805,-710,806]],"id":404},{"type":"Polygon","arcs":[[-803,-642,807,808]],"id":417},{"type":"Polygon","arcs":[[809,810,811,283]],"id":116},{"type":"Polygon","arcs":[[265,812,267,813]],"id":410},{"type":"Polygon","arcs":[[-515,814,815,816]],"id":-99},{"type":"Polygon","arcs":[[304,817,-783]],"id":414},{"type":"Polygon","arcs":[[818,819,-634,820,-811]],"id":418},{"type":"Polygon","arcs":[[-791,392,821]],"id":422},{"type":"Polygon
 ","arcs":[[370,822,372,823,-737,-647]],"id":430},{"type":"Polygon","arcs":[[824,-694,825,388,826,-697,827,828]],"id":434},{"type":"Polygon","arcs":[[52]],"id":144},{"type":"Polygon","arcs":[[829]],"id":426},{"type":"Polygon","arcs":[[830,448,831,-572,832]],"id":440},{"type":"Polygon","arcs":[[-680,-721,-550]],"id":442},{"type":"Polygon","arcs":[[449,-707,833,-573,-832]],"id":428},{"type":"Polygon","arcs":[[-692,834,835,836,837,383]],"id":504},{"type":"Polygon","arcs":[[838,839]],"id":498},{"type":"Polygon","arcs":[[23]],"id":450},{"type":"Polygon","arcs":[[840,-577,-749,186,841,188,842,190,843,192,844,194,845]],"id":484},{"type":"Polygon","arcs":[[-817,846,-567,-747,-511]],"id":807},{"type":"Polygon","arcs":[[847,-689,848,-557,-649,-741,849]],"id":466},{"type":"Polygon","arcs":[[287,-561,-772,-635,-820,850]],"id":104},{"type":"Polygon","arcs":[[416,-759,-570,851,-815,-514,852]],"id":499},{"type":"Polygon","arcs":[[853,-645]],"id":496},{"type":"Polygon","arcs":[[854,344,855,856,347,8
 57,858,859,860,861,862]],"id":508},{"type":"Polygon","arcs":[[863,379,864,-690,-848]],"id":478},{"type":"Polygon","arcs":[[-863,865,866]],"id":454},{"type":"MultiPolygon","arcs":[[[285,867]],[[-770,47,-591,49]]],"id":458},{"type":"Polygon","arcs":[[351,-507,868,-595,869]],"id":516},{"type":"Polygon","arcs":[[17]],"id":540},{"type":"Polygon","arcs":[[-558,-849,-688,-825,870,-656,871,-554]],"id":562},{"type":"Polygon","arcs":[[361,872,363,873,365,-555,-872,-655]],"id":566},{"type":"Polygon","arcs":[[179,874,181,-757,150,-672]],"id":558},{"type":"Polygon","arcs":[[-681,-548,438,875,440]],"id":528},{"type":"MultiPolygon","arcs":[[[876,-718,877,457,878,459,879,461]],[[487]],[[492]],[[493]]],"id":578},{"type":"Polygon","arcs":[[-771,-638]],"id":524},{"type":"MultiPolygon","arcs":[[[15]],[[16]]],"id":554},{"type":"MultiPolygon","arcs":[[[880,319,881,882,883,-517,315,884,317]],[[-516,313]]],"id":512},{"type":"Polygon","arcs":[[-640,-776,297,885,299,-778,-504]],"id":586},{"type":"Polygon","a
 rcs":[[175,886,177,-673,152,887,154,-669]],"id":591},{"type":"Polygon","arcs":[[-627,172,-695,-671,-584,-580]],"id":604},{"type":"MultiPolygon","arcs":[[[51]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]]],"id":608},{"type":"MultiPolygon","arcs":[[[37]],[[38]],[[-769,42]],[[41]]],"id":598},{"type":"Polygon","arcs":[[-678,446,888,-833,-576,889,890,-676]],"id":616},{"type":"Polygon","arcs":[[60]],"id":630},{"type":"Polygon","arcs":[[262,891,264,-814,892,269,893,271,894,273,-628,895]],"id":408},{"type":"Polygon","arcs":[[-705,430]],"id":620},{"type":"Polygon","arcs":[[-582,-583,-520]],"id":600},{"type":"Polygon","arcs":[[-799,-789]],"id":275},{"type":"Polygon","arcs":[[308,896,310,897]],"id":634},{"type":"Polygon","arcs":[[898,-840,899,403,-564,900,-765]],"id":642},{"type":"MultiPolygon","arcs":[[[89]],[[-889,447,-831]],[[102]],[[104]],[[105]],[[228]],[[234]],[[236]],[[239]],[[901,243,902,245,903,247,904,249,905,251,906,253,907,255,908,257,909,259,910,261,-896,-646,-854,-644,-802,483,-544,
 -734,401,911,-574,-834,-706,451,-714,-877,912,913,914,915,464,916,466,917,468,918,470,919,920,473,921,475,922,477]],[[491]],[[494]],[[495]]],"id":643},{"type":"Polygon","arcs":[[923,-546,-660,924]],"id":646},{"type":"Polygon","arcs":[[-691,-865,380,-835]],"id":732},{"type":"Polygon","arcs":[[925,329,926,331,-798,-784,-818,305,927,307,-898,311,-518,-884,928]],"id":682},{"type":"Polygon","arcs":[[-599,929,-828,-696,334,-700,-713,930,931,932]],"id":729},{"type":"Polygon","arcs":[[-711,-806,933,-666,-601,934,-932,935]],"id":728},{"type":"Polygon","arcs":[[378,-864,-850,-740,-743,376,-742]],"id":686},{"type":"MultiPolygon","arcs":[[[25]],[[27]],[[28]],[[33]],[[34]]],"id":90},{"type":"Polygon","arcs":[[373,-738,-824]],"id":694},{"type":"Polygon","arcs":[[184,-751,-755,936]],"id":222},{"type":"Polygon","arcs":[[-708,-683,338,937,340,938]],"id":-99},{"type":"Polygon","arcs":[[-807,-709,-939,341]],"id":706},{"type":"Polygon","arcs":[[-568,-847,-816,-852,-569,-758,-766,-901]],"id":688},{"type
 ":"Polygon","arcs":[[162,-720,939,-588,-752]],"id":740},{"type":"Polygon","arcs":[[-891,940,-763,-539,-677]],"id":703},{"type":"Polygon","arcs":[[-534,-767,-761,420,-794]],"id":705},{"type":"Polygon","arcs":[[-878,-717,456]],"id":752},{"type":"Polygon","arcs":[[941,-859]],"id":748},{"type":"Polygon","arcs":[[-797,-792,-822,393,942,-786]],"id":760},{"type":"Polygon","arcs":[[-871,-829,-930,-598,-657]],"id":148},{"type":"Polygon","arcs":[[-736,-559,-552,367]],"id":768},{"type":"Polygon","arcs":[[284,-868,286,-851,-819,-810]],"id":764},{"type":"Polygon","arcs":[[-808,-641,-502,943]],"id":762},{"type":"Polygon","arcs":[[-777,481,-801,944,-500]],"id":795},{"type":"Polygon","arcs":[[29,-768]],"id":626},{"type":"Polygon","arcs":[[53]],"id":780},{"type":"Polygon","arcs":[[-693,385,945,387,-826]],"id":788},{"type":"MultiPolygon","arcs":[[[399,-735,-529,-782,-787,-943,394,946,947,397,948]],[[949,-748,-565,405]]],"id":792},{"type":"Polygon","arcs":[[72]],"id":158},{"type":"Polygon","arcs":[[-8
 04,343,-855,-867,950,-663,951,-661,-547,-924,952]],"id":834},{"type":"Polygon","arcs":[[-925,-659,-934,-805,-953]],"id":800},{"type":"Polygon","arcs":[[-912,402,-900,-839,-899,-764,-941,-890,-575]],"id":804},{"type":"Polygon","arcs":[[-590,165,-522]],"id":858},{"type":"MultiPolygon","arcs":[[[65]],[[66]],[[67]],[[68]],[[69]],[[118,953,120,954,122,955,124,956,126,957,128,958,130,959,132,960,134,961,136,962,138,963,140,964,142,-846,195,965,966,967,968,969,-611]],[[93]],[[95]],[[98]],[[-613,202,970,204,971,206,972,208,973,210,974,212,975,214]]],"id":840},{"type":"Polygon","arcs":[[-945,-800,-809,-944,-501]],"id":860},{"type":"Polygon","arcs":[[156,976,158,977,160,-753,-586,-670]],"id":862},{"type":"Polygon","arcs":[[282,-812,-821,-633]],"id":704},{"type":"MultiPolygon","arcs":[[[21]],[[22]]],"id":548},{"type":"Polygon","arcs":[[321,978,323,979,325,980,327,-929,-883,981]],"id":887},{"type":"Polygon","arcs":[[982,350,-870,-594,983,-860,-942,-858,348],[-830]],"id":710},{"type":"Polygon","
 arcs":[[-866,-862,984,-596,-869,-506,-664,-951]],"id":894},{"type":"Polygon","arcs":[[-984,-597,-985,-861]],"id":716}]}},"arcs":[[[33289,2723],[-582,81],[-621,-35],[-348,197],[0,23],[-152,174],[625,-23],[599,-58],[207,243],[147,208],[288,-243],[-82,-301],[-81,-266]],[[5242,3530],[-364,208],[-163,209],[-11,35],[-180,162],[169,220],[517,-93],[277,-185],[212,-209],[76,-266],[-533,-81]],[[35977,2708],[-658,35],[-365,197],[49,243],[593,162],[239,197],[174,254],[126,220],[168,209],[180,243],[141,0],[414,127],[419,-127],[342,-255],[120,-359],[33,-254],[11,-301],[-430,-186],[-452,-150],[-522,-139],[-582,-116]],[[16602,6806],[-386,47],[-278,208],[60,197],[332,-104],[359,-93],[332,104],[-158,-208],[-261,-151]],[[15547,6934],[-164,23],[-359,58],[-381,162],[202,127],[277,-139],[425,-231]],[[23277,7733],[-217,46],[-337,-23],[-343,23],[-376,-35],[-283,116],[-146,243],[174,104],[353,-81],[403,-46],[305,-81],[304,69],[163,-335]],[[30256,7743],[-364,11],[136,232],[-327,-81],[-310,-81],[-212,174],[-1
 6,243],[305,231],[190,70],[321,-23],[82,301],[16,219],[-6,475],[158,278],[256,93],[147,-220],[65,-220],[120,-267],[92,-254],[76,-267],[33,-266],[-49,-231],[-76,-220],[-326,-81],[-311,-116]],[[794,704],[78,49],[94,61],[81,52],[41,26]],[[1088,892],[41,-1],[29,-10]],[[1158,881],[402,-246],[352,246],[63,34],[816,104],[265,-138],[130,-71],[419,-196],[789,-151],[625,-185],[1072,-139],[800,162],[1181,-116],[669,-185],[734,174],[773,162],[60,278],[-1094,23],[-898,139],[-234,231],[-745,128],[49,266],[103,243],[104,220],[-55,243],[-462,162],[-212,209],[-430,185],[675,-35],[642,93],[402,-197],[495,173],[457,220],[223,197],[-98,243],[-359,162],[-408,174],[-571,35],[-500,81],[-539,58],[-180,220],[-359,185],[-217,208],[-87,672],[136,-58],[250,-185],[457,58],[441,81],[228,-255],[441,58],[370,127],[348,162],[315,197],[419,58],[-11,220],[-97,220],[81,208],[359,104],[163,-196],[425,115],[321,151],[397,12],[375,57],[376,139],[299,128],[337,127],[218,-35],[190,-46],[414,81],[370,-104],[381,11],[364,81]
 ,[375,-57],[414,-58],[386,23],[403,-12],[413,-11],[381,23],[283,174],[337,92],[349,-127],[331,104],[300,208],[179,-185],[98,-208],[180,-197],[288,174],[332,-220],[375,-70],[321,-162],[392,35],[354,104],[418,-23],[376,-81],[381,-104],[147,254],[-180,197],[-136,209],[-359,46],[-158,220],[-60,220],[-98,440],[213,-81],[364,-35],[359,35],[327,-93],[283,-174],[119,-208],[376,-35],[359,81],[381,116],[342,70],[283,-139],[370,46],[239,451],[224,-266],[321,-104],[348,58],[228,-232],[365,-23],[337,-69],[332,-128],[218,220],[108,209],[278,-232],[381,58],[283,-127],[190,-197],[370,58],[288,127],[283,151],[337,81],[392,69],[354,81],[272,127],[163,186],[65,254],[-32,244],[-87,231],[-98,232],[-87,231],[-71,209],[-16,231],[27,232],[130,220],[109,243],[44,231],[-55,255],[-32,232],[136,266],[152,173],[180,220],[190,186],[223,173],[109,255],[152,162],[174,151],[267,34],[174,186],[196,115],[228,70],[202,150],[157,186],[218,69],[163,-151],[-103,-196],[-283,-174],[-120,-127],[-206,92],[-229,-58],[-190,-13
 9],[-202,-150],[-136,-174],[-38,-231],[17,-220],[130,-197],[-190,-139],[-261,-46],[-153,-197],[-163,-185],[-174,-255],[-44,-220],[98,-243],[147,-185],[229,-139],[212,-185],[114,-232],[60,-220],[82,-232],[130,-196],[82,-220],[38,-544],[81,-220],[22,-232],[87,-231],[-38,-313],[-152,-243],[-163,-197],[-370,-81],[-125,-208],[-169,-197],[-419,-220],[-370,-93],[-348,-127],[-376,-128],[-223,-243],[-446,-23],[-489,23],[-441,-46],[-468,0],[87,-232],[424,-104],[311,-162],[174,-208],[-310,-185],[-479,58],[-397,-151],[-17,-243],[-11,-232],[327,-196],[60,-220],[353,-220],[588,-93],[500,-162],[398,-185],[506,-186],[690,-92],[681,-162],[473,-174],[517,-197],[272,-278],[136,-220],[337,209],[457,173],[484,186],[577,150],[495,162],[691,12],[680,-81],[560,-139],[180,255],[386,173],[702,12],[550,127],[522,128],[577,81],[614,104],[430,150],[-196,209],[-119,208],[0,220],[-539,-23],[-571,-93],[-544,0],[-77,220],[39,440],[125,128],[397,138],[468,139],[337,174],[337,174],[251,231],[380,104],[376,81],[190,47
 ],[430,23],[408,81],[343,116],[337,139],[305,139],[386,185],[245,197],[261,173],[82,232],[-294,139],[98,243],[185,185],[288,116],[305,139],[283,185],[217,232],[136,277],[202,163],[331,-35],[136,-197],[332,-23],[11,220],[142,231],[299,-58],[71,-220],[331,-34],[360,104],[348,69],[315,-34],[120,-243],[305,196],[283,105],[315,81],[310,81],[283,139],[310,92],[240,128],[168,208],[207,-151],[288,81],[202,-277],[157,-209],[316,116],[125,232],[283,162],[365,-35],[108,-220],[229,220],[299,69],[326,23],[294,-11],[310,-70],[300,-34],[130,-197],[180,-174],[304,104],[327,24],[315,0],[310,11],[278,81],[294,70],[245,162],[261,104],[283,58],[212,162],[152,324],[158,197],[288,-93],[109,-208],[239,-139],[289,46],[196,-208],[206,-151],[283,139],[98,255],[250,104],[289,197],[272,81],[326,116],[218,127],[228,139],[218,127],[261,-69],[250,208],[180,162],[261,-11],[229,139],[54,208],[234,162],[228,116],[278,93],[256,46],[244,-35],[262,-58],[223,-162],[27,-254],[245,-197],[168,-162],[332,-70],[185,-162],[22
 9,-162],[266,-35],[223,116],[240,243],[261,-127],[272,-70],[261,-69],[272,-46],[277,0],[229,-614],[-11,-150],[-33,-267],[-266,-150],[-218,-220],[38,-232],[310,12],[-38,-232],[-141,-220],[-131,-243],[212,-185],[321,-58],[321,104],[153,232],[92,220],[153,185],[174,174],[70,208],[147,289],[174,58],[316,24],[277,69],[283,93],[136,231],[82,220],[190,220],[272,151],[234,115],[153,197],[157,104],[202,93],[277,-58],[250,58],[272,69],[305,-34],[201,162],[142,393],[103,-162],[131,-278],[234,-115],[266,-47],[267,70],[283,-46],[261,-12],[174,58],[234,-35],[212,-127],[250,81],[300,0],[255,81],[289,-81],[185,197],[141,196],[191,163],[348,439],[179,-81],[212,-162],[185,-208],[354,-359],[272,-12],[256,0],[299,70],[299,81],[229,162],[190,174],[310,23],[207,127],[218,-116],[141,-185],[196,-185],[305,23],[190,-150],[332,-151],[348,-58],[288,47],[218,185],[185,185],[250,46],[251,-81],[288,-58],[261,93],[250,0],[245,-58],[256,-58],[250,104],[299,93],[283,23],[316,0],[255,58],[251,46],[76,290],[11,243],[
 174,-162],[49,-266],[92,-244],[115,-196],[234,-105],[315,35],[365,12],[250,35],[364,0],[262,11],[364,-23],[310,-46],[196,-186],[-54,-220],[179,-173],[299,-139],[310,-151],[360,-104],[375,-92],[283,-93],[315,-12],[180,197],[245,-162],[212,-185],[245,-139],[337,-58],[321,-69],[136,-232],[316,-139],[212,-208],[310,-93],[321,12],[299,-35],[332,12],[332,-47],[310,-81],[288,-139],[289,-116],[195,-173],[-32,-232],[-147,-208],[-125,-266],[-98,-209],[-131,-243],[-364,-93],[-163,-208],[-360,-127],[-125,-232],[-190,-220],[-201,-185],[-115,-243],[-70,-220],[-28,-266],[6,-220],[158,-232],[60,-220],[130,-208],[517,-81],[109,-255],[-501,-93],[-424,-127],[-528,-23],[-234,-336],[-49,-278],[-119,-220],[-147,-220],[370,-196],[141,-244],[239,-219],[338,-197],[386,-186],[419,-185],[636,-185],[142,-289],[800,-128],[53,-45],[208,-175],[767,151],[636,-186],[-99504,-147],[245,344],[501,-185],[32,21]],[[31400,18145],[-92,-239],[-238,-183],[-301,67],[-202,177],[-291,86],[-350,330],[-283,317],[-383,662],[229,-
 124],[390,-395],[369,-212],[143,271],[90,405],[256,244],[198,-70]],[[30935,19481],[106,-274],[139,-443],[361,-355],[389,-147],[-125,-296],[-264,-29],[-141,208]],[[33139,19680],[-139,266],[333,354],[236,-148],[167,237],[222,-266],[-83,-207],[-375,-177],[-125,207],[-236,-266]],[[69095,21172],[-7,314],[41,244],[19,121],[179,-186],[263,-74],[9,-112],[-77,-269],[-427,-38]],[[90796,24799],[-57,32],[-171,19],[-171,505],[-38,390],[-160,515],[7,271],[181,-52],[269,-204],[151,81],[217,113],[166,-39],[20,-702],[-95,-203],[-29,-476],[-97,162],[-193,-412]],[[97036,23023],[-256,13],[-180,194],[-302,42],[-46,217],[149,438],[349,583],[179,111],[200,225],[238,310],[167,306],[123,441],[106,149],[41,330],[195,273],[61,-251],[63,-244],[198,239],[80,-249],[0,-249],[-103,-274],[-182,-435],[-142,-238],[103,-284],[-214,-7],[-238,-223],[-75,-387],[-157,-597],[-219,-264],[-138,-169]],[[98677,25949],[-48,155],[-116,85],[160,486],[-91,326],[-299,236],[8,214],[201,206],[47,455],[-13,382],[-113,396],[8,104],[-13
 3,244],[-218,523],[-117,418],[104,46],[151,-328],[216,-153],[78,-526],[202,-622],[5,403],[126,-161],[41,-447],[224,-192],[188,-48],[158,226],[141,-69],[-67,-524],[-85,-345],[-212,12],[-74,-179],[26,-254],[-41,-110],[-105,-319],[-138,-404],[-214,-236]],[[96316,37345],[-153,160],[-199,266],[-179,313],[-184,416],[-38,201],[119,-9],[156,-201],[122,-200],[89,-166],[228,-366],[144,-272],[-105,-142]],[[99425,39775],[-153,73],[-27,260],[107,203],[126,-74],[69,98],[96,-171],[-46,-308],[-172,-81]],[[99645,40529],[-36,220],[139,121],[88,33],[163,184],[0,-289],[-177,-145],[-177,-124]],[[0,40798],[0,289],[57,27],[-34,-284],[-23,-32]],[[96531,40773],[-93,259],[10,158],[175,-339],[-92,-78]],[[96463,41280],[-75,74],[-58,-32],[-39,163],[-6,453],[133,-182],[45,-476]],[[62613,35454],[-160,151],[-220,211],[-77,312],[-18,524],[-98,471],[-26,425],[50,426],[128,102],[1,197],[133,447],[25,377],[-65,280],[-52,372],[-23,544],[97,331],[38,375],[138,22],[155,121],[103,107],[122,7],[158,337],[229,364],[83,297],
 [-38,253],[118,-71],[153,410],[6,356],[92,264],[96,-254],[74,-251],[69,-390],[45,-711],[72,-276],[-28,-284],[-49,-174],[-94,347],[-53,-175],[53,-438],[-24,-250],[-77,-137],[-18,-500],[-109,-689],[-137,-814],[-172,-1120],[-106,-821],[-125,-685],[-226,-140],[-243,-250]],[[90643,27516],[-230,262],[-170,104],[43,308],[-152,-112],[-243,-428],[-240,160],[-158,94],[-159,42],[-269,171],[-179,364],[-52,449],[-64,298],[-137,240],[-267,71],[91,287],[-67,438],[-136,-408],[-247,-109],[146,327],[42,341],[107,289],[-22,438],[-226,-504],[-174,-202],[-106,-470],[-217,243],[9,313],[-174,429],[-147,221],[52,137],[-356,358],[-195,17],[-267,287],[-498,-56],[-359,-211],[-317,-197],[-265,39],[-294,-303],[-241,-137],[-53,-309],[-103,-240],[-236,-15],[-174,-52],[-246,107],[-199,-64],[-191,-27],[-165,-315],[-81,26],[-140,-167],[-133,-187],[-203,23],[-186,0],[-295,377],[-149,113],[6,338],[138,81],[47,134],[-10,212],[34,411],[-31,350],[-147,598],[-45,337],[12,336],[-111,385],[-7,174],[-123,235],[-35,463],[-158
 ,467],[-39,252],[122,-255],[-93,548],[137,-171],[83,-229],[-5,303],[-138,465],[-26,186],[-65,177],[31,341],[56,146],[38,295],[-29,346],[114,425],[21,-450],[118,406],[225,198],[136,252],[212,217],[126,46],[77,-73],[219,220],[168,66],[42,129],[74,54],[153,-14],[292,173],[151,262],[71,316],[163,300],[13,236],[7,321],[194,502],[117,-510],[119,118],[-99,279],[87,287],[122,-128],[34,449],[152,291],[67,233],[140,101],[4,165],[122,-69],[5,148],[122,85],[134,80],[205,-271],[155,-350],[173,-4],[177,-56],[-59,325],[133,473],[126,155],[-44,147],[121,338],[168,208],[142,-70],[234,111],[-5,302],[-204,195],[148,86],[184,-147],[148,-242],[234,-151],[79,60],[172,-182],[162,169],[105,-51],[65,113],[127,-292],[-74,-316],[-105,-239],[-96,-20],[32,-236],[-81,-295],[-99,-291],[20,-166],[221,-327],[214,-189],[143,-204],[201,-350],[78,1],[145,-151],[43,-183],[265,-200],[183,202],[55,317],[56,262],[34,324],[85,470],[-39,286],[20,171],[-32,339],[37,445],[53,120],[-43,197],[67,313],[52,325],[7,168],[104,222],
 [78,-289],[19,-371],[70,-71],[11,-249],[101,-300],[21,-335],[-10,-214],[100,-464],[179,223],[92,-250],[133,-231],[-29,-262],[60,-506],[42,-295],[70,-72],[75,-505],[-27,-307],[90,-400],[301,-309],[197,-281],[186,-257],[-37,-143],[159,-371],[108,-639],[111,130],[113,-256],[68,91],[48,-626],[197,-363],[129,-226],[217,-478],[78,-475],[7,-337],[-19,-365],[132,-502],[-16,-523],[-48,-274],[-75,-527],[6,-339],[-55,-423],[-123,-538],[-205,-290],[-102,-458],[-93,-292],[-82,-510],[-107,-294],[-70,-442],[-36,-407],[14,-187],[-159,-205],[-311,-22],[-257,-242],[-127,-229],[-168,-254]],[[95110,44183],[-194,4],[-106,363],[166,-142],[56,-22],[78,-203]],[[83414,44519],[-368,414],[259,116],[146,-180],[97,-180],[-17,-159],[-117,-11]],[[94572,44733],[-170,60],[-58,91],[17,235],[183,-93],[91,-124],[45,-155],[-108,-14]],[[94868,44799],[-206,512],[-57,353],[94,0],[100,-473],[111,-283],[-42,-109]],[[84713,45326],[32,139],[239,133],[194,20],[87,74],[105,-74],[-102,-160],[-289,-258],[-233,-170]],[[84746,45030
 ],[-181,-441],[-238,-130],[-33,71],[25,201],[119,360],[275,235]],[[82576,45238],[-149,5],[95,340],[153,5],[74,209],[100,-158],[172,48],[69,-251],[-321,-119],[-193,-79]],[[83681,45301],[-370,73],[0,216],[220,123],[174,-177],[185,45],[249,216],[-41,-328],[-417,-168]],[[94421,45535],[-218,251],[-152,212],[-104,197],[41,60],[128,-142],[228,-272],[65,-187],[12,-119]],[[93704,46205],[-121,134],[-114,243],[14,99],[166,-250],[111,-193],[-56,-33]],[[81823,45409],[-306,238],[-251,-16],[-288,44],[-260,106],[-322,225],[-204,59],[-116,-74],[-506,243],[-48,254],[-255,44],[191,564],[337,-35],[224,-231],[115,-45],[38,-210],[533,-59],[61,244],[515,-284],[101,-383],[417,-108],[341,-351],[-317,-225]],[[87280,46506],[-27,445],[49,212],[58,200],[63,-173],[0,-282],[-143,-402]],[[93221,46491],[-120,227],[-122,375],[-59,450],[38,57],[30,-175],[84,-134],[135,-375],[131,-200],[-39,-166],[-78,-59]],[[91733,46847],[-148,1],[-228,171],[-158,165],[23,183],[249,-86],[152,46],[42,283],[40,15],[27,-314],[158,45],[7
 8,202],[155,211],[-30,348],[166,11],[56,-97],[-5,-327],[-93,-361],[-146,-48],[-44,-166],[-152,-144],[-142,-138]],[[85242,48340],[-192,108],[-54,254],[281,29],[69,-195],[-104,-196]],[[86342,48300],[-234,244],[-232,49],[-157,-39],[-192,21],[65,325],[344,24],[305,-172],[101,-452]],[[92451,47764],[-52,348],[-65,229],[-126,193],[-158,252],[-200,174],[77,143],[150,-166],[94,-130],[117,-142],[111,-248],[106,-189],[33,-307],[-87,-157]],[[89166,49043],[482,-407],[513,-338],[192,-302],[154,-297],[43,-349],[462,-365],[68,-313],[-256,-64],[62,-393],[248,-388],[180,-627],[159,20],[-11,-262],[215,-100],[-84,-111],[295,-249],[-30,-171],[-184,-41],[-69,153],[-238,66],[-281,89],[-216,377],[-158,325],[-144,517],[-362,259],[-235,-169],[-170,-195],[35,-436],[-218,-203],[-155,99],[-288,25]],[[89175,45193],[-247,485],[-282,118],[-69,-168],[-352,-18],[118,481],[175,164],[-72,642],[-134,496],[-538,500],[-229,50],[-417,546],[-82,-287],[-107,-52],[-63,216],[-1,257],[-212,290],[299,213],[198,-11],[-23,156],[-
 407,1],[-110,352],[-248,109],[-117,293],[374,143],[142,192],[446,-242],[44,-220],[78,-955],[287,-354],[232,627],[319,356],[247,1],[238,-206],[206,-212],[298,-113]],[[83276,47228],[-119,173],[79,544],[-43,570],[-117,4],[-86,405],[115,387],[40,469],[139,891],[58,243],[237,439],[217,-174],[350,-82],[319,25],[275,429],[48,-132],[-223,-587],[-209,-113],[-267,115],[-463,-29],[-243,-85],[-39,-447],[248,-526],[150,268],[518,201],[-22,-272],[-121,86],[-121,-347],[-245,-229],[263,-757],[-50,-203],[249,-682],[-2,-388],[-148,-173],[-109,207],[134,484],[-273,-229],[-69,164],[36,228],[-200,346],[21,576],[-186,-179],[24,-689],[11,-846],[-176,-85]],[[85582,50048],[-112,374],[-82,755],[56,472],[92,215],[20,-322],[164,-52],[26,-241],[-15,-517],[-143,58],[-42,-359],[114,-312],[-78,-71]],[[79085,47110],[-234,494],[-356,482],[-119,358],[-210,481],[-138,443],[-212,827],[-244,493],[-81,508],[-103,461],[-250,372],[-145,506],[-209,330],[-290,652],[-24,300],[178,-24],[430,-114],[246,-577],[215,-401],[153,-24
 6],[263,-635],[283,-9],[233,-405],[161,-495],[211,-270],[-111,-482],[159,-205],[100,-15],[47,-412],[97,-330],[204,-52],[135,-374],[-70,-735],[-11,-914],[-308,-12]],[[80461,51765],[204,-202],[214,110],[56,500],[119,112],[333,128],[199,467],[137,374]],[[81723,53254],[110,221],[236,323]],[[82069,53798],[214,411],[140,462],[112,2],[143,-299],[13,-257],[183,-165],[231,-177],[-20,-232],[-186,-29],[50,-289],[-205,-201]],[[82744,53024],[-158,-533],[204,-560],[-48,-272],[312,-546],[-329,-70],[-93,-403],[12,-535],[-267,-404],[-7,-589],[-107,-903],[-41,210],[-316,-266],[-110,361],[-198,34],[-139,189],[-330,-212],[-101,285],[-182,-32],[-229,68],[-43,793],[-138,164],[-134,505],[-38,517],[32,548],[165,392]],[[84832,53877],[-327,343],[-78,428],[84,280],[-176,280],[-87,-245],[-131,23],[-205,-330],[-46,173],[109,498],[175,166],[151,223],[98,-268],[212,162],[45,264],[196,15],[-16,457],[225,-280],[23,-297],[20,-218],[28,-392],[16,-332],[-94,-540],[-102,602],[-130,-300],[89,-435],[-79,-277]],[[72318,54
 106],[-132,470],[-49,849],[126,959],[192,-328],[129,-416],[134,-616],[-42,-615],[-116,-168],[-242,-135]],[[32841,56488],[-50,53],[81,163],[-6,233],[160,77],[58,-21],[-11,-440],[-232,-65]],[[84165,55910],[-171,409],[57,158],[70,165],[30,367],[153,35],[-44,-398],[205,570],[-26,-563],[-100,-195],[-87,-373],[-87,-175]],[[82548,55523],[136,414],[200,364],[167,409],[146,587],[49,-482],[-183,-325],[-146,-406],[-369,-561]],[[83889,56748],[-10,275],[20,301],[-43,282],[166,-183],[177,1],[-5,-247],[-129,-251],[-176,-178]],[[84666,56567],[-11,416],[-84,31],[-43,357],[163,-47],[-4,224],[-169,451],[266,-13],[77,-220],[78,-660],[-214,157],[5,-199],[68,-364],[-132,-133]],[[83683,57791],[-119,295],[-142,450],[238,-22],[97,-213],[-74,-510]],[[84465,57987],[-216,290],[-103,310],[-71,-217],[-177,354],[-253,-87],[-138,130],[14,244],[87,151],[-83,136],[-36,-213],[-137,340],[-41,257],[-11,566],[112,-195],[29,925],[90,535],[169,-1],[171,-168],[85,153],[26,-150],[-46,-245],[95,-423],[-73,-491],[-164,-196],[
 -43,-476],[62,-471],[147,-65],[123,70],[347,-328],[-27,-321],[91,-142],[-29,-272]],[[31337,61183],[-16,253],[40,86],[227,-3],[142,-52],[50,-118],[-71,-149],[-209,4],[-163,-21]],[[28554,61038],[-156,95],[-159,215],[34,135],[116,41],[64,-20],[187,-53],[147,-142],[46,-161],[-195,-11],[-84,-99]],[[30080,62227],[34,101],[217,-3],[165,-152],[73,15],[50,-209],[152,11],[-9,-176],[124,-21],[136,-217],[-103,-240],[-132,128],[-127,-25],[-92,28],[-50,-107],[-106,-37],[-43,144],[-92,-85],[-111,-405],[-71,94],[-14,170]],[[30081,61241],[-185,100],[-131,-41],[-169,43],[-130,-110],[-149,184],[24,190],[256,-82],[210,-47],[100,131],[-127,256],[2,226],[-175,92],[62,163],[170,-26],[241,-93]],[[80409,61331],[-228,183],[-8,509],[137,267],[304,166],[159,-14],[62,-226],[-122,-260],[-64,-341],[-240,-284]],[[6753,61756],[-69,84],[8,165],[-46,216],[14,65],[48,97],[-19,116],[16,55],[21,-11],[107,-100],[49,-51],[45,-79],[71,-207],[-7,-33],[-108,-126],[-89,-92],[-41,-99]],[[6551,62734],[-47,125],[-32,48],[-3,37],
 [27,50],[99,-56],[73,-90],[-23,-71],[-94,-43]],[[6447,63028],[-149,17],[21,72],[137,-26],[-9,-63]],[[6192,63143],[-19,8],[-97,21],[-35,133],[-11,24],[74,82],[23,-38],[80,-196],[-15,-34]],[[5704,63509],[-93,107],[14,43],[43,58],[64,-12],[5,-138],[-33,-58]],[[28401,62311],[186,329],[-113,154],[-179,39],[-96,171],[-66,336],[-157,-23],[-259,159],[-83,124],[-362,91],[-97,115],[104,148],[-273,30],[-199,-307],[-115,-8],[-40,-144],[-138,-65],[-118,56],[146,183],[60,213],[126,131],[142,116],[210,56],[67,65],[240,-42],[219,-7],[261,-201],[110,-216],[260,66],[98,-138],[235,-366],[173,-267],[92,8],[165,-120],[-20,-167],[205,-24],[210,-242],[-33,-138],[-185,-75],[-187,-29],[-191,46],[-398,-57]],[[28394,64588],[-70,340],[-104,171],[60,375],[84,-23],[97,-491],[1,-343],[-68,-29]],[[83540,63560],[-146,499],[-32,438],[163,581],[223,447],[127,-176],[-49,-357],[-167,-947],[-119,-485]],[[28080,66189],[-19,219],[130,47],[184,-18],[8,-153],[-303,-95]],[[28563,65870],[-51,75],[4,309],[-124,234],[-1,67],[22
 0,-265],[-48,-420]],[[86948,69902],[-181,168],[2,281],[154,352],[158,-68],[114,248],[204,-127],[35,-203],[-156,-357],[-114,189],[-143,-137],[-73,-346]],[[59437,71293],[8,-48],[-285,-240],[-136,77],[-64,237],[132,22]],[[59092,71341],[19,3],[40,143],[200,-8],[253,176],[-188,-251],[21,-111]],[[56867,71211],[3,98],[-339,115],[52,251],[152,-199],[216,34],[207,-42],[-7,-103],[151,71],[-35,-175],[-400,-50]],[[54194,72216],[-213,222],[-141,64],[-387,300],[38,304],[325,-54],[284,64],[211,51],[-100,-465],[41,-183],[-58,-303]],[[52446,73567],[-105,156],[-11,713],[-64,338],[153,-30],[139,183],[166,-419],[-39,-782],[-126,38],[-113,-197]],[[86301,68913],[-135,229],[69,533],[-176,172],[-113,405],[263,182],[145,371],[280,306],[203,403],[553,177],[297,-121],[291,1050],[185,-282],[408,591],[158,229],[174,723],[-47,664],[117,374],[295,108],[152,-819],[-9,-479],[-256,-595],[4,-610],[-104,-472],[48,-296],[-145,-416],[-355,-278],[-488,-36],[-396,-675],[-186,227],[-12,442],[-483,-130],[-329,-279],[-325,-1
 1],[282,-435],[-186,-1004],[-179,-248]],[[52563,75028],[-126,120],[-64,398],[56,219],[179,226],[47,-507],[-92,-456]],[[88876,75140],[-39,587],[138,455],[296,33],[81,817],[83,460],[326,-615],[213,-198],[195,-126],[197,250],[62,-663],[-412,-162],[-244,-587],[-436,404],[-152,-646],[-308,-9]],[[32535,77739],[-353,250],[-69,198],[105,183],[97,-288],[202,-79],[257,16],[-137,-242],[-102,-38]],[[32696,79581],[-360,186],[-258,279],[96,49],[365,-148],[284,-247],[8,-108],[-135,-11]],[[15552,79158],[-456,269],[-84,209],[-248,207],[-50,168],[-286,107],[-107,321],[24,137],[291,-129],[171,-89],[261,-63],[94,-204],[138,-280],[277,-244],[115,-327],[-140,-82]],[[35133,78123],[-183,111],[60,484],[-77,75],[-322,-513],[-166,21],[196,277],[-267,144],[-298,-35],[-539,18],[-43,175],[173,208],[-121,160],[234,356],[287,941],[172,336],[241,204],[129,-26],[-54,-160],[-148,-372],[-184,-517],[181,199],[187,-126],[-98,-206],[247,-162],[128,144],[277,-182],[-86,-433],[194,101],[36,-313],[86,-367],[-117,-520],[-125
 ,-22]],[[13561,81409],[-111,1],[-167,270],[-103,272],[-140,184],[-51,260],[16,188],[131,-76],[267,47],[-84,-671],[242,-475]],[[89469,77738],[-51,496],[31,575],[-32,638],[64,446],[13,790],[-163,581],[24,808],[257,271],[-110,274],[123,83],[73,-391],[96,-569],[-7,-581],[114,-597],[280,-1046],[-411,195],[-171,-854],[271,-605],[-8,-413],[-211,356],[-182,-457]],[[47896,83153],[233,24],[298,-365],[-149,-406]],[[48278,82406],[46,-422],[-210,-528],[-493,-349],[-393,89],[225,617],[-145,601],[378,463],[210,276]],[[53358,82957],[-291,333],[-39,246],[408,195],[88,-296],[-166,-478]],[[7221,84100],[-142,152],[-43,277],[252,210],[148,90],[185,-40],[117,-183],[-240,-281],[-277,-225]],[[48543,80097],[-148,118],[407,621],[249,127],[-436,99],[-79,235],[291,183],[-152,319],[52,387],[414,-54],[40,343],[-190,372],[-337,104],[-66,160],[101,264],[-92,163],[-149,-279],[-17,569],[-140,301],[101,611],[216,480],[222,-47],[335,49],[-297,-639],[283,81],[304,-3],[-72,-481],[-250,-530],[287,-38],[270,-759],[190,-95
 ],[171,-673],[79,-233],[337,-113],[-34,-378],[-142,-173],[111,-305],[-250,-310],[-371,6],[-473,-163],[-130,116],[-183,-276],[-257,67],[-195,-226]],[[3835,85884],[-182,110],[-168,161],[274,101],[220,-54],[27,-226],[-171,-92]],[[27873,86994],[-123,50],[-73,176],[13,41],[107,177],[114,-13],[70,-121],[-108,-310]],[[26925,87305],[-196,13],[-61,160],[207,273],[381,-6],[-6,-114],[-325,-326]],[[2908,87788],[-211,128],[-106,107],[-245,-34],[-66,52],[17,223],[171,-113],[173,61],[225,-156],[276,-79],[-23,-64],[-211,-125]],[[26243,87832],[-95,346],[-377,-57],[242,292],[35,465],[95,542],[201,-49],[51,-259],[143,91],[161,-155],[304,-203],[318,-184],[25,-281],[204,46],[199,-196],[-247,-186],[-432,142],[-156,266],[-275,-314],[-396,-306]],[[44817,88095],[-365,87],[-775,187],[273,261],[-605,289],[492,114],[-12,174],[-583,137],[188,385],[421,87],[433,-400],[422,321],[349,-167],[453,315],[461,-42],[-64,-382],[314,-403],[-361,-451],[-801,-405],[-240,-107]],[[28614,90223],[-69,289],[118,331],[255,82],[21
 7,-163],[3,-253],[-32,-82],[-180,-174],[-312,-30]],[[1957,88542],[-260,17],[-212,206],[-369,172],[-62,257],[-283,96],[-315,-76],[-151,207],[60,219],[-333,-140],[126,-278],[-158,-251],[0,2354],[681,-451],[728,-588],[-24,-367],[187,-147],[-64,429],[754,-88],[544,-553],[-276,-257],[-455,-61],[-7,-578],[-111,-122]],[[23258,91203],[-374,179],[-226,-65],[-380,266],[245,183],[194,256],[295,-168],[166,-106],[84,-112],[169,-226],[-173,-207]],[[99694,92399],[-49,187],[354,247],[0,-404],[-305,-30]],[[0,92429],[0,404],[36,24],[235,-1],[402,-169],[-24,-81],[-286,-141],[-363,-36]],[[26228,91219],[16,648],[394,-45]],[[26638,91822],[411,-87],[373,-293],[17,-293],[-207,-315],[196,-316],[-36,-288],[-544,-413],[-386,-91],[-287,178],[-83,-297],[-268,-498]],[[25824,89109],[-81,-258],[-322,-400]],[[25421,88451],[-397,-39],[-220,-250],[-18,-384],[-323,-74],[-340,-479],[-301,-665],[-108,-466]],[[23714,86094],[-15,-686],[408,-99]],[[24107,85309],[125,-553],[130,-448],[388,117],[517,-256],[277,-225],[199,-27
 9]],[[25743,83665],[348,-162],[294,-249]],[[26385,83254],[459,-34],[302,-58],[-45,-511],[86,-594],[201,-661],[414,-561],[214,192],[150,607],[-145,934],[-196,311],[445,276],[314,415],[154,411]],[[28738,83981],[-22,395],[-189,502]],[[28527,84878],[-338,445],[328,619],[-121,535],[-93,922],[194,137],[476,-161],[286,-57],[230,155],[258,-200],[342,-343],[85,-229],[495,-45],[-8,-496],[92,-747],[254,-92],[201,-348],[402,328],[266,652],[184,274],[216,-527],[362,-754],[307,-709],[-112,-371],[370,-333],[250,-338],[442,-152],[179,-189],[110,-500],[216,-78],[112,-223],[20,-664],[-202,-222],[-199,-207],[-458,-210],[-349,-486],[-470,-96],[-594,125],[-417,4],[-287,-41],[-233,-424],[-354,-262],[-401,-782],[-320,-545],[236,97],[446,776],[583,493]],[[31513,79609],[416,59],[245,-290]],[[32174,79378],[-262,-397],[88,-637],[91,-446],[361,-295],[459,86],[278,664],[19,-429],[180,-214],[-344,-387],[-615,-351],[-276,-239],[-310,-426],[-211,44],[-11,500],[483,488],[-445,-19],[-309,-72]],[[31350,77248],[48,-19
 4],[-296,-286],[-286,-204],[-293,-175]],[[30523,76389],[-159,-386],[-35,-98]],[[30329,75905],[-3,-313],[92,-313],[115,-15],[-29,216],[83,-131],[-22,-169],[-188,-96]],[[30377,75084],[-133,12],[-205,-104]],[[30039,74992],[-121,-29],[-162,-29],[-231,-171],[408,111],[82,-112],[-389,-177],[-177,-1],[8,72],[-84,-164],[82,-27],[-60,-424],[-203,-455],[-20,152]],[[29172,73738],[-61,31],[-91,147]],[[29020,73916],[57,-318]],[[29077,73598],[66,-106],[8,-222]],[[29151,73270],[-89,-230],[-157,-472],[-25,24],[86,402]],[[28966,72994],[-142,226],[-33,490]],[[28791,73710],[-53,-255],[59,-375]],[[28797,73080],[-175,88],[183,-186]],[[28805,72982],[12,-562],[79,-41],[29,-204],[39,-591],[-176,-439],[-288,-175],[-182,-346],[-139,-38],[-141,-217],[-39,-199],[-305,-383],[-157,-281],[-131,-351],[-43,-419],[50,-411],[92,-505],[124,-418],[1,-256],[132,-685],[-9,-398],[-12,-230],[-69,-361]],[[27672,65472],[-83,-74],[-137,71]],[[27452,65469],[-44,259]],[[27408,65728],[-106,136],[-147,508]],[[27155,66372],[-129,4
 52],[-42,231],[57,393],[-77,325],[-217,494]],[[26747,68267],[-108,91],[-281,-269]],[[26358,68089],[-49,30]],[[26309,68119],[-135,276],[-174,146]],[[26000,68541],[-314,-75],[-247,66],[-212,-41]],[[25227,68491],[-118,-83],[54,-166]],[[25163,68242],[-5,-240],[59,-117],[-53,-77],[-103,87],[-104,-112],[-202,18]],[[24755,67801],[-207,313],[-242,-74]],[[24306,68040],[-202,137],[-173,-42],[-234,-138],[-253,-438],[-276,-255],[-152,-282],[-63,-266],[-3,-407],[14,-284],[52,-201]],[[23016,65864],[1,-1],[-1,-1],[-107,-516]],[[22909,65346],[-49,-426],[-20,-791],[-27,-289],[48,-322],[86,-288],[56,-458],[184,-440],[65,-337],[109,-291],[295,-157],[114,-247],[244,165],[212,60],[208,106],[175,101],[176,241],[67,345],[22,496],[48,173],[188,155],[294,137],[246,-21],[169,50],[66,-125],[-9,-285],[-149,-351],[-66,-360],[51,-103],[-42,-255],[-69,-461],[-71,152],[-58,-10]],[[25472,61510],[1,-87],[53,-3],[-5,-160],[-45,-256],[24,-91],[-29,-212],[18,-56],[-32,-299],[-55,-156],[-50,-19],[-55,-205]],[[25297,5996
 6],[90,-107],[24,88],[82,-75]],[[25493,59872],[29,-23],[61,104],[79,8],[26,-48],[43,29],[129,-53]],[[25860,59889],[128,16],[90,65]],[[26078,59970],[32,66],[89,-31],[66,-40],[73,14],[55,51],[127,-82],[44,-13],[85,-110],[80,-132],[101,-91],[73,-162]],[[26903,59440],[-24,-57],[-14,-132],[29,-216],[-64,-202],[-30,-237],[-9,-261],[15,-152],[7,-266],[-43,-58],[-26,-253],[19,-156],[-56,-151],[12,-159],[43,-97]],[[26762,57043],[70,-321],[108,-238],[130,-252]],[[27070,56232],[100,-212]],[[27170,56020],[-6,-125],[111,-27]],[[27275,55868],[26,48],[77,-145],[136,42],[119,150],[168,119],[95,176],[153,-34],[-10,-58],[155,-21],[124,-102],[90,-177],[105,-164]],[[28513,55702],[143,-18],[209,412],[114,63],[3,195],[51,500],[159,274],[175,11],[22,123],[218,-49],[218,298],[109,132],[134,285],[98,-36],[73,-156],[-54,-199]],[[30185,57537],[-8,-139],[-163,-69],[91,-268],[-3,-309]],[[30102,56752],[-123,-343],[105,-469]],[[30084,55940],[120,38],[62,427],[-86,208],[-14,447],[346,241],[-38,278],[97,186],[100,-
 415],[195,-9],[180,-330],[11,-195],[249,-6],[297,61],[159,-264]],[[31762,56607],[213,-73],[155,184]],[[32130,56718],[4,149],[344,35],[333,9],[-236,-175],[95,-279],[222,-44],[210,-291],[45,-473],[144,13],[109,-139]],[[33400,55523],[183,-217],[171,-385],[8,-304],[105,-14],[149,-289],[109,-205]],[[34125,54109],[333,-119],[30,107],[225,43],[298,-159]],[[35011,53981],[95,-65],[204,-140],[294,-499],[46,-242]],[[35650,53035],[95,28],[69,-327],[155,-1033],[149,-97],[7,-408],[-208,-487],[86,-178],[491,-92],[10,-593],[211,388],[349,-212],[462,-361],[135,-346],[-45,-327],[323,182],[540,-313],[415,23],[411,-489],[355,-662],[214,-170],[237,-24],[101,-186],[94,-752],[46,-358],[-110,-977],[-142,-385],[-391,-822],[-177,-668],[-206,-513],[-69,-11],[-78,-435],[20,-1107],[-77,-910],[-30,-390],[-88,-233],[-49,-790],[-282,-771],[-47,-610],[-225,-256],[-65,-355],[-302,2],[-437,-227],[-195,-263],[-311,-173],[-327,-470],[-235,-586],[-41,-441],[46,-326],[-51,-597],[-63,-289],[-195,-325],[-308,-1040],[-244,-
 468],[-189,-277],[-127,-562],[-183,-337]],[[35174,30629],[-121,-372],[-313,-328],[-205,118],[-151,-63],[-256,253],[-189,-19],[-169,327]],[[33770,30545],[-19,-308],[353,-506],[-38,-408],[173,-257],[-14,-289],[-267,-757],[-412,-317],[-557,-123],[-305,59],[59,-352],[-57,-442],[51,-298],[-167,-208],[-284,-82],[-267,216],[-108,-155],[39,-587],[188,-178],[152,186],[82,-307],[-255,-183],[-223,-367],[-41,-595],[-66,-316],[-262,-2],[-218,-302],[-80,-443]],[[31227,23224],[274,-433],[265,-119]],[[31766,22672],[-96,-531],[-328,-333],[-180,-692],[-254,-234],[-113,-276],[89,-614],[185,-342],[-117,30]],[[30952,19680],[-247,4],[-134,-145],[-250,-213],[-45,-552],[-118,-14],[-313,192],[-318,412],[-346,338],[-87,374],[79,346],[-140,393],[-36,1007],[119,568],[293,457],[-422,172],[265,522],[94,982],[309,-208],[145,1224],[-186,157],[-87,-738],[-175,83],[87,845],[95,1095],[127,404]],[[29661,27385],[-79,576],[-23,666]],[[29559,28627],[117,19],[170,954],[192,945],[118,881],[-64,885],[83,487],[-34,730],[163,
 721],[50,1143],[89,1227],[87,1321],[-20,967],[-58,832]],[[30452,39739],[-279,340],[-24,242],[-551,593],[-498,646],[-214,365],[-115,488],[46,170],[-236,775],[-274,1090],[-262,1177],[-114,269],[-87,435],[-216,386],[-198,239],[90,264],[-134,563],[86,414],[221,373]],[[27693,48568],[148,442],[-60,258],[-106,-275],[-166,259],[56,167],[-47,536],[97,89],[52,368],[105,381],[-20,241],[153,126],[190,236]],[[28095,51396],[-37,183],[103,44],[-12,296],[65,214],[138,40],[117,371],[106,310],[-102,141],[52,343],[-62,540],[59,155],[-44,500],[-112,315]],[[28366,54848],[-93,170],[-59,319],[68,158],[-70,40]],[[28212,55535],[-52,195],[-138,165]],[[28022,55895],[-122,-38],[-56,-205],[-112,-149],[-61,-20],[-27,-123],[132,-321],[-75,-76],[-40,-87],[-130,-30],[-48,353],[-36,-101],[-92,35],[-56,238],[-114,39],[-72,69],[-119,-1],[-8,-128],[-32,89]],[[26954,55439],[-151,131],[-56,124],[32,103],[-11,130],[-77,142],[-109,116],[-95,76],[-19,173],[-73,105],[18,-172],[-55,-141],[-64,164],[-89,58],[-38,120],[2,179],[
 36,187],[-78,83],[64,114]],[[26191,57131],[-96,186],[-130,238],[-61,200],[-117,185],[-140,267]],[[25647,58207],[31,92],[46,-89]],[[25724,58210],[21,41]],[[25745,58251],[-48,185]],[[25697,58436],[-84,52],[-31,-140]],[[25582,58348],[-161,9],[-100,57],[-115,117],[-154,37],[-79,127]],[[24973,58695],[-142,103],[-174,11],[-127,117],[-149,244]],[[24381,59170],[-314,636]],[[24067,59806],[-144,192],[-226,154]],[[23697,60152],[-156,-43],[-223,-223],[-140,-58],[-196,156],[-208,112],[-260,271],[-208,83],[-314,275],[-233,282],[-70,158],[-155,35],[-284,187],[-116,270],[-299,335],[-139,373],[-66,288],[93,57],[-29,169],[64,153],[1,204],[-93,266],[-25,235],[-94,298],[-244,587],[-280,462],[-135,368],[-238,241],[-51,145],[42,365]],[[19641,66203],[-142,137],[-164,288]],[[19335,66628],[-69,412],[-149,48],[-162,311],[-130,288],[-12,184],[-149,446],[-99,452],[5,227]],[[18570,68996],[-201,235],[-93,-26]],[[18276,69205],[-159,163],[-44,-240],[46,-284],[27,-444],[95,-243],[206,-407],[46,-139],[42,-42],[37,-2
 03],[49,8],[56,-381],[85,-150],[59,-210],[174,-300],[92,-550],[83,-259],[77,-277],[15,-311],[134,-20],[112,-268],[100,-264],[-6,-106],[-117,-217],[-49,3],[-74,359]],[[19362,64423],[-182,337],[-200,286]],[[18980,65046],[-142,150],[9,432],[-42,320],[-132,183],[-191,264],[-37,-76],[-70,154],[-171,143],[-164,343],[20,44],[115,-33],[103,221],[10,266],[-214,422],[-163,163],[-102,369],[-103,388],[-129,472],[-113,531]],[[17464,69802],[-46,302],[-180,340],[-130,71],[-30,169],[-156,30],[-100,159],[-258,59]],[[16564,70932],[-70,95],[-34,324]],[[16460,71351],[-270,594],[-231,821],[10,137],[-123,195],[-215,495],[-38,482],[-148,323],[61,489],[-10,507],[-89,453],[109,557],[67,1072],[-50,792],[-88,506],[-80,274],[33,115],[402,-200],[148,-558]],[[15948,78405],[68,156],[-44,485],[-94,484]],[[15878,79530],[-38,1],[-537,581],[-199,255]],[[15104,80367],[-503,245],[-155,523],[40,362]],[[14486,81497],[-356,252],[-48,476],[-336,429],[-6,304]],[[13740,82958],[-153,223],[-245,188],[-78,515],[-358,478],[-150,
 558],[-267,38],[-441,15],[-326,170],[-574,613],[-266,112],[-486,211]],[[10396,86079],[-385,-50],[-546,271]],[[9465,86300],[-330,252],[-309,-125],[58,-411],[-154,-38],[-321,-123],[-245,-199]],[[8164,85656],[-307,-126],[-40,348]],[[7817,85878],[125,580],[295,182],[-76,148],[-354,-329],[-190,-394],[-400,-420],[203,-287],[-262,-424]],[[7158,84934],[-299,-247],[-278,-181]],[[6581,84506],[-69,-261],[-434,-305],[-87,-278],[-325,-252],[-191,45],[-259,-165],[-282,-201],[-231,-197],[-477,-169],[-43,99],[304,276],[271,182],[296,324],[345,66],[137,243],[385,353],[62,119],[205,208],[48,448],[141,349],[-320,-179],[-90,102],[-150,-215],[-181,300],[-75,-212],[-104,294],[-278,-236],[-170,0],[-24,352]],[[4985,85596],[50,217],[-179,210]],[[4856,86023],[-361,-113],[-235,277],[-190,142],[-1,334],[-214,252],[108,340],[226,330],[99,303],[225,43],[191,-94],[224,285],[201,-51],[212,183],[-52,270],[-155,106],[205,228],[-170,-7],[-295,-128],[-85,-131],[-219,131],[-392,-67],[-407,142],[-117,238],[-351,343],[39
 0,247],[620,289],[228,0]],[[4541,89915],[-38,-295],[586,22]],[[5089,89642],[-225,366]],[[4864,90008],[-342,226],[-197,295]],[[4325,90529],[-267,252],[-381,187],[155,309],[493,19],[350,270],[66,287],[284,281],[271,68],[526,262],[256,-40],[427,315],[421,-124],[201,-266],[123,114],[469,-35],[-16,-136],[425,-101],[283,59],[585,-186],[534,-56],[214,-77],[370,96],[421,-177],[302,-83]],[[10837,91767],[518,-142]],[[11355,91625],[438,-284],[289,-55]],[[12082,91286],[244,247],[336,184],[413,-72],[416,259],[455,148],[191,-245],[207,138],[62,278],[192,-63],[470,-530],[369,401]],[[15437,92031],[38,-448],[341,96]],[[15816,91679],[105,173],[337,-34],[424,-248],[650,-217],[383,-100],[272,38]],[[17987,91291],[375,-300],[-391,-293]],[[17971,90698],[502,-127],[750,70],[236,103],[296,-354],[302,299],[-283,251],[179,202],[338,27],[223,59],[224,-141],[279,-321],[310,47],[491,-266],[431,94],[405,-14],[-32,367],[247,103],[431,-200],[-2,-559],[177,471],[223,-16],[126,594],[-298,364],[-324,239],[22,653],[329
 ,429],[366,-95],[281,-261],[378,-666],[-247,-290],[517,-120],[-1,-604],[371,463],[332,-380],[-83,-438],[269,-399],[290,427],[202,510]],[[19722,91216],[-824,-103],[-374,-41]],[[18524,91072],[-151,279],[-379,161],[-246,-66],[-343,468],[185,62],[429,101],[392,-26],[362,103],[-537,138],[-594,-47],[-394,12],[-146,217],[644,237],[-428,-9],[-485,156],[233,443],[193,235],[744,359],[284,-114],[-139,-277],[618,179],[386,-298],[314,302],[254,-194],[227,-580],[140,244],[-197,606],[244,86],[276,-94],[311,-239],[175,-575],[86,-417],[466,-293],[502,-279],[-31,-260],[-456,-48],[178,-227],[-94,-217],[-503,93],[-478,160],[-322,-36],[-522,-201]],[[20728,93568],[-434,413],[95,83],[372,24],[211,-130],[-244,-390]],[[27920,93557],[-80,36],[-306,313],[12,213],[133,39],[636,-63],[479,-325],[25,-163],[-296,17],[-299,13],[-304,-80]],[[31620,87170],[-753,236],[-596,343],[-337,287],[97,167],[-414,304],[-405,286],[5,-171],[-803,-94],[-235,203],[183,435],[522,10],[571,76],[-92,211],[96,294],[360,576],[-77,261],[-
 107,203],[-425,286],[-563,201],[178,150],[-294,367],[-245,34],[-219,201],[-149,-175],[-503,-76],[-1011,132],[-588,174],[-450,89],[-231,207],[290,270],[-394,2],[-88,599],[213,528],[286,241],[717,158],[-204,-382],[219,-369],[256,477],[704,242],[477,-611],[-42,-387],[550,172],[263,235],[616,-299],[383,-282],[36,-258],[515,134],[290,-376],[670,-234],[242,-238],[263,-553],[-510,-275],[654,-386],[441,-130],[400,-543],[437,-39],[-87,-414],[-487,-687],[-342,253],[-437,568],[-359,-74],[-35,-338],[292,-344],[377,-272],[114,-157],[181,-584],[-96,-425],[-350,160],[-697,473],[393,-509],[289,-357],[45,-206]],[[22678,92689],[-268,50],[-192,225],[-690,456],[5,189],[567,-73],[-306,386],[329,286],[331,-124],[496,75],[72,-172],[-259,-283],[420,-254],[-50,-532],[-455,-229]],[[89468,93831],[-569,66],[-49,31],[263,234],[348,54],[394,-226],[34,-155],[-421,-4]],[[23814,93133],[-317,22],[-173,519],[4,294],[145,251],[276,161],[579,-20],[530,-144],[-415,-526],[-331,-115],[-298,-442]],[[15808,92470],[-147,259]
 ,[-641,312]],[[15020,93041],[93,193],[218,489]],[[15331,93723],[241,388],[-272,362],[939,93],[397,-123],[709,-33],[270,-171],[298,-249],[-349,-149],[-681,-415],[-344,-414]],[[16539,93012],[0,-248],[-731,-294]],[[91548,94707],[-444,53],[-516,233],[66,192],[518,-89],[697,-155],[-321,-234]],[[23845,94650],[-403,44],[-337,155],[148,266],[399,159],[243,-208],[101,-187],[-151,-229]],[[88598,94662],[-550,384],[149,406],[366,111],[734,-26],[1004,-313],[-219,-439],[-1023,16],[-461,-139]],[[22275,94831],[-298,94],[5,345],[-455,-46],[-18,457],[299,-18],[419,201],[390,-34],[22,77],[212,-273],[9,-303],[-127,-440],[-458,-60]],[[18404,94533],[-35,193],[577,261],[-1255,-70],[-389,106],[379,577],[262,165],[782,-199],[493,-350],[485,-45],[-397,565],[255,215],[286,-68],[94,-282],[109,-210],[247,99],[291,-26],[49,-289],[-169,-281],[-940,-91],[-701,-256],[-423,-14]],[[65817,92311],[-907,77],[-74,262],[-503,158],[-40,320],[284,126],[-10,323],[551,503],[-255,73],[665,518],[-75,268],[621,312],[917,380],[92
 5,110],[475,220],[541,76],[193,-233],[-187,-184],[-984,-293],[-848,-282],[-863,-562],[-414,-577],[-435,-568],[56,-491],[531,-484],[-164,-52]],[[25514,94532],[-449,73],[-738,190],[-96,325],[-34,293],[-279,258],[-574,72],[-322,183],[104,242],[573,-37],[308,-190],[547,1],[240,-194],[-64,-222],[319,-134],[177,-140],[374,-26],[406,-50],[441,128],[566,51],[451,-42],[298,-223],[62,-244],[-174,-157],[-414,-127],[-355,72],[-797,-91],[-570,-11]],[[16250,95423],[-377,128],[472,442],[570,383],[426,-9],[381,87],[-38,-454],[-214,-205],[-259,-29],[-517,-252],[-444,-91]],[[81143,94175],[250,112],[142,-379]],[[81535,93908],[122,153],[444,93],[892,-97],[67,-276],[1162,-88],[15,451]],[[84237,94144],[590,-103],[443,3]],[[85270,94044],[449,-312],[128,-378],[-165,-247],[349,-465],[437,-240],[268,620],[446,-266],[473,159],[538,-182],[204,166],[455,-83],[-201,549],[367,256],[2509,-384],[236,-351],[727,-451],[1122,112],[553,-98],[231,-244],[-33,-432],[342,-168],[372,121],[492,15],[525,-116],[526,66],[484,-5
 26],[344,189],[-224,378]],[[97224,91732],[123,263],[886,-166]],[[98233,91829],[578,36],[799,-282],[389,-258],[0,-2354],[-2,-3],[-357,-260],[-360,44],[250,-315],[166,-487],[128,-159],[32,-244],[-71,-157],[-518,129],[-777,-445],[-247,-69],[-425,-415],[-403,-362],[-102,-269],[-397,409],[-724,-464]],[[96192,85904],[-126,220],[-268,-254]],[[95798,85870],[-371,81],[-90,-388],[-333,-572],[10,-239],[316,-132],[-37,-860],[-258,-22],[-119,-494],[116,-255]],[[95032,82989],[-486,-301],[-96,-675]],[[94450,82013],[-415,-144],[-83,-600],[-400,-551],[-103,407],[-119,862],[-155,1313],[134,819],[234,353]],[[93543,84472],[15,276],[431,132]],[[93989,84880],[496,744],[479,608],[499,471],[223,833],[-337,-50],[-167,-487]],[[95182,86999],[-705,-648],[-227,726]],[[94250,87077],[-717,-201],[-696,-990],[230,-362],[-620,-154],[-430,-61],[20,427],[-431,90],[-344,-291],[-850,102]],[[90412,85637],[-913,-175],[-900,-1153]],[[88599,84309],[-1065,-1394],[438,-74],[136,-370],[270,-132]],[[88378,82339],[178,296],[305,
 -39]],[[88861,82596],[401,-650]],[[89262,81946],[9,-502],[-217,-591]],[[89054,80853],[-23,-705],[-126,-945],[-418,-855],[-94,-409],[-377,-688],[-374,-682],[-179,-349],[-370,-346],[-175,-8],[-175,287],[-373,-432],[-43,-197]],[[86327,75524],[-106,36]],[[86221,75560],[-120,-201],[-83,-201]],[[86018,75158],[10,-424],[-143,-130],[-50,-105],[-104,-174],[-185,-97],[-121,-159],[-9,-256],[-32,-65],[111,-96],[157,-259]],[[85652,73393],[240,-697],[68,-383],[3,-681],[-105,-325],[-252,-113],[-222,-245],[-250,-51],[-31,322]],[[85103,71220],[52,443],[-123,615]],[[85032,72278],[206,99],[-190,506]],[[85048,72883],[-135,113],[-34,-112]],[[84879,72884],[-81,-49],[-10,112],[-72,54],[-75,94]],[[84641,73095],[77,260],[65,69]],[[84783,73424],[-25,108],[71,319]],[[84829,73851],[-18,97],[-163,64]],[[84648,74012],[-131,158]],[[84517,74170],[-388,-171],[-204,-277],[-300,-161],[148,274],[-58,230],[220,397],[-147,310],[-242,-209],[-314,-411],[-171,-381],[-272,-29],[-142,-275],[147,-400],[227,-97],[9,-265]],[[83
 030,72705],[220,-172],[311,421]],[[83561,72954],[247,-230],[179,-15]],[[83987,72709],[46,-310],[-394,-165]],[[83639,72234],[-130,-319],[-270,-296],[-142,-414]],[[83097,71205],[299,-324],[109,-582]],[[83505,70299],[169,-541],[189,-454],[-5,-439],[-174,-161],[66,-315],[164,-184],[-43,-481],[-71,-468],[-155,-53],[-203,-640],[-225,-775],[-258,-705],[-382,-545],[-386,-498],[-313,-68],[-170,-262],[-96,192],[-157,-294],[-388,-296],[-294,-90],[-95,-624],[-154,-35],[-73,429],[66,228]],[[80517,63220],[-373,190],[-131,-97]],[[80013,63313],[-371,-505],[-231,-558],[-61,-410],[212,-623],[260,-772],[252,-365],[169,-475],[127,-1093],[-37,-1039],[-232,-389],[-318,-381],[-227,-492],[-346,-550],[-101,378],[78,401],[-206,335]],[[78981,56775],[-233,87],[-112,307],[-141,611]],[[78495,57780],[-249,271],[-238,-11],[41,464],[-245,-3],[-22,-650],[-150,-863],[-90,-522],[19,-428],[181,-18],[113,-539],[50,-512],[155,-338],[168,-69],[144,-306]],[[78372,54256],[64,-56],[164,-356],[116,-396],[16,-398],[-29,-269],[
 27,-203],[20,-349],[98,-163],[109,-523],[-5,-199],[-197,-40],[-263,438],[-329,469],[-32,301],[-161,395],[-38,489],[-100,322],[30,431],[-61,250]],[[77801,54399],[-110,227],[-47,292],[-148,334],[-135,280],[-45,-347],[-53,328],[30,369],[82,566]],[[77375,56448],[-27,439],[86,452],[-94,350],[23,644],[-113,306],[-90,707],[-50,746],[-121,490],[-183,-297],[-315,-421],[-156,53],[-172,138],[96,732],[-58,554],[-218,681],[34,213],[-163,76],[-197,481]],[[75657,62792],[-79,309],[-16,301],[-53,284]],[[75509,63686],[-116,344],[-256,23],[25,-243],[-87,-329],[-118,120],[-41,-108],[-78,65],[-108,53]],[[74730,63611],[-39,-216],[-189,7],[-343,-122],[16,-445],[-148,-349],[-400,-398],[-311,-695],[-209,-373]],[[73107,61020],[-276,-386],[-1,-272]],[[72830,60362],[-138,-146]],[[72692,60216],[-250,-212],[-130,-31]],[[72312,59973],[-84,-450],[58,-769],[15,-490],[-118,-561],[-1,-1004],[-144,-29],[-126,-450],[84,-195]],[[71996,56025],[-253,-167],[-93,-402]],[[71650,55456],[-112,-170],[-263,552],[-128,827],[-107,
 596],[-97,279],[-148,568],[-69,739],[-48,369],[-253,811],[-115,1145],[-83,756],[1,716],[-54,553],[-404,-353],[-196,70],[-362,716],[133,214],[-82,232],[-326,501]],[[68937,64577],[-203,150]],[[68734,64727],[-83,425],[-215,449]],[[68436,65601],[-512,-111],[-451,-11],[-391,-83]],[[67082,65396],[-523,179]],[[66559,65575],[-302,136],[-314,76]],[[65943,65787],[-118,725],[-133,105],[-214,-106],[-280,-286],[-339,196],[-281,454],[-267,168],[-186,561],[-205,788],[-149,-96],[-177,196]],[[63594,68492],[-103,-231],[-165,29]],[[63326,68290],[58,-261],[-25,-135],[89,-445]],[[63448,67449],[109,-510],[137,-135],[47,-207]],[[63741,66597],[190,-248],[16,-244]],[[63947,66105],[-27,-197],[35,-199],[80,-165],[37,-194],[41,-145]],[[64113,65205],[-18,430],[75,310],[76,64]],[[64246,66009],[84,-186],[5,-345]],[[64335,65478],[-61,-348]],[[64274,65130],[53,-226]],[[64327,64904],[49,29],[11,-162],[217,93],[230,-15],[168,-18],[190,400],[207,379],[176,364]],[[65575,65974],[80,201],[35,-51],[-26,-244],[-37,-108]],[
 [65627,65772],[38,-466]],[[65665,65306],[125,-404],[155,-214]],[[65945,64688],[204,-78],[164,-107]],[[66313,64503],[125,-339],[75,-196],[100,-75],[-1,-132],[-101,-352],[-44,-166],[-117,-189],[-104,-404],[-126,31],[-58,-141],[-44,-300],[34,-395],[-26,-72],[-128,2],[-174,-221],[-27,-288],[-63,-125],[-173,5],[-109,-149]],[[65352,60997],[1,-239],[-134,-164]],[[65219,60594],[-153,56],[-186,-199]],[[64880,60451],[-128,-33],[-201,-159]],[[64551,60259],[-54,-263],[-6,-201],[-277,-249],[-444,-276],[-249,-417]],[[63521,58853],[-122,-32],[-83,34]],[[63316,58855],[-163,-245]],[[63153,58610],[-177,-113],[-233,-31]],[[62743,58466],[-70,-34],[-61,-156],[-73,-43]],[[62539,58233],[-42,-150],[-138,13]],[[62359,58096],[-89,-80],[-192,30],[-72,345],[8,323],[-46,174],[-54,437],[-80,243],[56,29],[-29,270],[34,114],[-12,257]],[[61883,60238],[-36,253],[-84,177]],[[61763,60668],[-22,236],[-143,212],[-148,495],[-79,482],[-192,406],[-124,97],[-184,563],[-32,411],[12,350],[-159,655],[-130,231],[-150,122],[-92,
 339],[15,133]],[[60335,65400],[-77,307],[-81,131]],[[60177,65838],[-108,440],[-170,476],[-141,406],[-139,-3],[44,325],[12,206],[34,236]],[[59709,67924],[-9,86]],[[59700,68010],[-78,-238],[-60,-446],[-75,-308],[-65,-103],[-93,191],[-125,263],[-198,847],[-29,-53],[115,-624],[171,-594],[210,-920],[102,-321],[90,-334],[249,-654],[-55,-103],[9,-384],[323,-530],[49,-121]],[[60240,63578],[90,-580],[-61,-107],[40,-608],[102,-706],[106,-145],[152,-219]],[[60669,61213],[161,-683],[77,-543]],[[60907,59987],[152,-288],[379,-558],[154,-336],[151,-341],[87,-203],[136,-178]],[[61966,58083],[66,-183],[-9,-245],[-158,-142],[119,-161]],[[61984,57352],[91,-109]],[[62075,57243],[54,-244],[125,-248]],[[62254,56751],[138,-2],[262,151],[302,70],[245,184],[138,39],[99,108],[158,20]],[[63596,57321],[89,12],[128,88],[147,59],[132,202],[105,2],[6,-163],[-25,-344],[1,-310],[-59,-214],[-78,-639],[-134,-659],[-172,-755],[-238,-866],[-237,-661],[-327,-806],[-278,-479],[-415,-586],[-259,-450],[-304,-715],[-64,-312
 ],[-63,-140]],[[61551,49585],[-195,-236],[-68,-246],[-104,-44],[-40,-416],[-89,-238],[-54,-393],[-112,-195]],[[60889,47817],[-128,-728],[16,-335],[178,-216],[8,-153],[-76,-357],[16,-180],[-18,-282],[97,-370],[115,-583],[101,-129]],[[61198,44484],[45,-265],[-11,-588],[34,-519],[11,-923],[49,-290],[-83,-422],[-108,-410],[-177,-366],[-254,-225],[-313,-287],[-313,-634],[-107,-108],[-194,-420],[-115,-136],[-23,-421],[132,-448],[54,-346],[4,-177],[49,29],[-8,-579]],[[59870,36949],[-45,-274],[65,-102]],[[59890,36573],[-41,-246],[-116,-210]],[[59733,36117],[-229,-199],[-334,-320],[-122,-219],[24,-248],[71,-40],[-24,-311]],[[59119,34780],[-70,-430],[-32,-491],[-72,-267],[-190,-298],[-54,-86],[-118,-300],[-77,-303],[-158,-424],[-314,-609],[-196,-355]],[[57838,31217],[-209,-269],[-291,-229]],[[57338,30719],[-141,-31],[-36,-164],[-169,88],[-138,-113],[-301,114],[-168,-72],[-115,31],[-286,-233],[-238,-94],[-171,-223],[-127,-14],[-117,210],[-94,11],[-120,264],[-13,-82],[-37,159],[2,346],[-90,396]
 ,[89,108],[-7,453],[-182,553],[-139,501],[-1,1],[-199,768]],[[54540,33696],[-207,446],[-108,432],[-62,575],[-68,428],[-93,910],[-7,707],[-35,322],[-108,243],[-144,489],[-146,708],[-60,371],[-226,577],[-17,453]],[[53259,40357],[-26,372],[38,519],[96,541],[15,254],[90,532],[66,243],[159,386],[90,263],[29,438],[-15,335],[-83,211],[-74,358],[-68,355],[15,122],[85,235],[-84,570],[-57,396],[-139,374],[26,115]],[[53422,46976],[-39,183]],[[53383,47159],[-74,444]],[[53309,47603],[-228,626]],[[53081,48229],[-285,596],[-184,488],[-169,610],[9,196],[61,189],[67,430],[56,438]],[[52636,51176],[-52,90],[96,663]],[[52680,51929],[40,467],[-108,390]],[[52612,52786],[-127,100],[-56,265]],[[52429,53151],[-71,85],[3,163]],[[52361,53399],[-289,-213]],[[52072,53186],[-105,32],[-107,-133]],[[51860,53085],[-222,13],[-149,370],[-91,427]],[[51398,53895],[-197,390],[-209,-8]],[[50992,54277],[-245,1]],[[50747,54278],[-229,-69]],[[50518,54209],[-224,-126]],[[50294,54083],[-436,-346],[-154,-203],[-250,-171],[-248
 ,168]],[[49206,53531],[-126,-7],[-194,116],[-178,-7],[-329,-103],[-193,-170],[-275,-217],[-54,15]],[[47857,53158],[-73,-5],[-286,282]],[[47498,53435],[-252,450],[-237,323]],[[47009,54208],[-187,381]],[[46822,54589],[-75,44],[-200,238],[-144,316],[-49,216],[-34,437]],[[46320,55840],[-122,349],[-108,232],[-71,76],[-69,118],[-32,261],[-41,130],[-80,97]],[[45797,57103],[-149,247],[-117,39],[-63,166],[1,90],[-84,125],[-18,127]],[[45367,57897],[-46,453]],[[45321,58350],[36,262]],[[45357,58612],[-115,460],[-138,210],[122,112],[134,415],[66,304]],[[45426,60113],[-24,318],[78,291],[34,557],[-30,583],[-34,294],[28,295],[-72,281],[-146,255]],[[45260,62987],[12,249]],[[45272,63236],[13,274],[106,161],[91,308],[-18,200],[96,417],[155,376],[93,95],[74,344],[6,315],[100,365],[185,216],[177,603],[144,235]],[[46494,67145],[259,66],[219,403],[139,158]],[[47111,67772],[232,493],[-70,735],[106,508],[37,312],[179,399],[278,270],[206,244],[186,612],[87,362],[205,-2],[167,-251],[264,41],[288,-131],[121,-6
 ]],[[49397,71358],[267,323],[300,102],[175,244],[268,180],[471,105],[459,48],[140,-87],[262,232],[297,5],[113,-137],[190,35]],[[52339,72408],[302,239],[195,-71],[-9,-299],[236,217],[20,-113]],[[53083,72381],[-139,-289],[-2,-274]],[[52942,71818],[96,-147],[-36,-511],[-183,-297],[53,-322],[143,-10],[70,-281],[106,-92]],[[53191,70158],[326,-204],[117,51],[232,-98],[368,-264],[130,-526],[250,-114],[391,-248],[296,-293],[136,153],[133,272],[-65,452],[87,288],[200,277],[192,80],[375,-121],[95,-264],[104,-2],[88,-101]],[[56646,69496],[276,-69],[68,-196]],[[56990,69231],[369,10],[268,-156],[275,-175],[129,-92],[214,188],[114,169],[245,49],[198,-75],[75,-293],[65,193],[222,-140],[217,-33],[137,149]],[[59518,69025],[80,194],[-19,34],[74,276],[56,446],[40,149],[8,6]],[[59757,70130],[99,482],[138,416],[5,21]],[[59999,71049],[-26,452],[68,243]],[[60041,71744],[-102,268],[105,222],[-169,-51],[-233,136],[-191,-340],[-421,-66],[-225,317],[-300,20],[-64,-245]],[[58441,72005],[-192,-71],[-268,315]],[
 [57981,72249],[-303,-10],[-165,587]],[[57513,72826],[-203,328],[135,459],[-176,283],[308,565],[428,23],[117,449],[529,-78],[334,383],[324,167],[459,13]],[[59768,75418],[485,-416],[399,-229]],[[60652,74773],[323,91],[239,-53],[328,309]],[[61542,75120],[42,252],[-70,403],[-160,218],[-154,68],[-102,181]],[[61098,76242],[-354,499],[-317,223],[-240,347],[202,95],[231,494],[-156,234],[410,241],[-8,129],[-249,-95]],[[60617,78409],[-222,-48],[-185,-191],[-260,-31],[-239,-220],[16,-368],[136,-142],[284,35],[-55,-210],[-304,-103],[-377,-342],[-154,121],[61,277],[-304,173],[50,113],[265,197],[-80,135],[-432,149],[-19,221],[-257,-73],[-103,-325],[-215,-437]],[[58223,77340],[6,-152],[-135,-128],[-84,56],[-78,-713]],[[57932,76403],[-144,-245],[-101,-422],[89,-337]],[[57776,75399],[33,-228],[243,-190],[-51,-145],[-330,-33],[-118,-182],[-232,-319]],[[57321,74302],[-87,275],[3,122]],[[57237,74699],[-169,17],[-145,56],[-336,-154],[192,-332],[-141,-96]],[[56638,74190],[-154,0],[-147,304]],[[56337,7449
 4],[-52,-130],[62,-353],[139,-277]],[[56486,73734],[-105,-130],[155,-272]],[[56536,73332],[137,-171],[4,-334],[-257,157],[82,-302],[-176,-62],[105,-521]],[[56431,72099],[-184,-7],[-228,257],[-104,472]],[[55915,72821],[-49,393],[-108,272],[-143,337],[-18,168]],[[55597,73991],[-48,41],[-5,130],[-154,199],[-24,281],[23,403],[38,184]],[[55427,75229],[-46,93],[-59,46]],[[55322,75368],[-78,192],[-120,118]],[[55124,75678],[-261,218],[-161,213],[-254,176]],[[54448,76285],[-233,435],[56,44]],[[54271,76764],[-127,248],[-5,200],[-179,93],[-85,-255],[-82,198],[6,205],[10,9]],[[53809,77462],[62,54]],[[53871,77516],[-221,86],[-226,-210],[15,-293],[-34,-168],[91,-301],[261,-298],[140,-488],[309,-476],[217,3],[68,-130],[-78,-118]],[[54413,75123],[249,-213],[204,-179]],[[54866,74731],[238,-308],[29,-111],[-52,-211],[-154,276],[-242,97],[-116,-382],[200,-219],[-33,-309],[-116,-35],[-148,-506],[-116,-46],[1,181],[57,317],[60,126],[-108,342],[-85,298],[-115,74],[-82,255],[-179,107],[-120,238],[-206,38]
 ,[-217,267],[-254,384]],[[53108,75604],[-189,341],[-86,584]],[[52833,76529],[-138,68],[-226,195],[-128,-80],[-161,-274],[-115,-43]],[[52065,76395],[-252,-334],[-548,160],[-404,-192],[-32,-355]],[[50829,75674],[15,-344],[-263,-393],[-356,-125],[-25,-199],[-171,-327],[-107,-481],[108,-338],[-160,-263],[-60,-384],[-210,-118]],[[49600,72702],[-197,-455],[-352,-8]],[[49051,72239],[-265,11],[-174,-209],[-106,-223],[-136,49],[-103,199],[-79,340],[-259,92]],[[47929,72498],[-112,-153],[-146,83],[-143,-65],[42,462],[-26,363],[-124,55],[-67,224],[22,386],[111,215],[20,239],[58,355],[-6,250],[-56,212],[-12,200]],[[47490,75324],[14,420],[-114,257],[393,426]],[[47783,76427],[340,-107],[373,4]],[[48496,76324],[296,-101],[230,31],[449,-19]],[[49471,76235],[144,354],[53,1177],[-287,620],[-205,299]],[[49176,78685],[-424,228],[-28,430]],[[48724,79343],[360,129],[466,-152],[-88,669],[263,-254],[646,461],[84,484],[243,119]],[[50698,80799],[222,117]],[[50920,80916],[143,162]],[[51063,81078],[244,870],[38
 0,247]],[[51687,82195],[231,-17]],[[51918,82178],[54,125],[232,32],[52,-130],[188,291],[-63,222],[-13,335]],[[52368,83053],[-113,328],[-8,604],[46,159]],[[52293,84144],[80,178],[244,36]],[[52617,84358],[98,163],[223,167],[-9,-304],[-82,-192],[33,-166],[151,-89],[-68,-223],[-83,64],[-200,-425],[76,-288]],[[52756,83065],[4,-228],[281,-138],[-3,-210],[283,111],[156,162],[313,-233],[132,-189]],[[53922,82340],[189,174],[434,273],[350,200],[277,-100],[21,-144],[268,-7]],[[55461,82736],[63,260],[383,191]],[[55907,83187],[-59,497]],[[55848,83684],[10,445],[136,371],[262,202],[221,-442],[223,12],[53,453]],[[56753,84725],[32,349],[-102,-75],[-176,210],[-24,340],[351,164],[350,86],[301,-97],[287,17]],[[57772,85719],[316,327],[-291,280]],[[57797,86326],[-504,-47],[-489,-216],[-452,-125]],[[56352,85938],[-161,322],[-269,195],[62,581]],[[55984,87036],[-135,534],[133,344]],[[55982,87914],[252,371],[635,640],[185,124],[-28,250],[-387,279]],[[56639,89578],[-478,-167],[-269,-413],[43,-361],[-441,-475
 ],[-537,-509],[-202,-832],[198,-416],[265,-328],[-255,-666],[-289,-138],[-106,-992],[-157,-554],[-337,57],[-158,-468],[-321,-27],[-89,558],[-232,671],[-211,835]],[[53063,85353],[-187,363],[-548,-684]],[[52328,85032],[-370,-138],[-385,301]],[[51573,85195],[-99,635]],[[51474,85830],[-88,1364],[256,380]],[[51642,87574],[733,496],[549,609],[508,824],[668,1141],[465,444],[763,741],[610,259],[457,-31],[423,489],[506,-26],[499,118],[869,-433],[-358,-158],[305,-371]],[[58639,91676],[286,206],[456,-358],[761,-140],[1050,-668],[213,-281],[18,-393],[-308,-311],[-454,-157],[-1240,449],[-204,-75],[453,-433],[36,-878],[358,-180],[217,-153],[36,286]],[[60317,88590],[-174,263],[183,215]],[[60326,89068],[672,-368]],[[60998,88700],[234,144],[-187,433]],[[61045,89277],[647,578],[256,-34],[260,-206],[161,406],[-231,352],[136,353],[-204,367],[777,-190],[158,-331],[-351,-73]],[[62654,90499],[2,-328],[218,-203]],[[62874,89968],[429,128],[68,377]],[[63371,90473],[581,282],[969,507]],[[64921,91262],[209,-29
 ],[-273,-359],[344,-61],[199,202],[521,16],[412,245],[317,-356],[315,391],[-291,343],[145,195],[820,-179],[385,-185],[1006,-675],[186,309],[-282,313],[-8,125],[-335,58],[92,280],[-149,461],[-8,189],[512,535]],[[69038,93080],[182,537],[207,116]],[[69427,93733],[735,-156],[58,-328]],[[70220,93249],[-263,-479],[173,-189],[89,-413],[-63,-809],[307,-362],[-120,-395],[-544,-839],[318,-87],[110,213],[306,151],[74,293],[240,281],[-162,336],[130,390],[-304,49],[-67,328]],[[70444,91717],[222,594],[-361,481]],[[70305,92792],[497,398],[-64,421],[139,13],[145,-328],[-109,-570],[297,-108],[-127,426],[465,233],[577,31],[513,-337],[-247,492],[-28,630]],[[72363,94093],[484,119],[668,-26]],[[73515,94186],[602,77],[-226,309],[321,388],[319,16],[540,293],[734,79],[93,162],[729,55],[227,-133],[624,314],[510,-10],[77,255],[265,252],[656,242],[476,-191],[-378,-146],[629,-90],[75,-292],[254,143],[812,-7],[626,-289],[223,-221],[-69,-307],[-307,-175],[-730,-328],[-209,-175],[345,-83],[410,-149]],[[63720,7385
 8],[-47,-207],[-102,-138]],[[63571,73513],[7,-293]],[[63578,73220],[88,-436],[263,-123],[193,-296],[395,-102],[434,156],[27,139]],[[64978,72558],[-52,417],[40,618],[-216,200],[71,405],[-184,34],[61,498],[262,-145],[244,189],[-202,355],[-80,338],[-224,-151],[-28,-433],[-87,383]],[[64583,75266],[-15,144],[68,246],[-53,206],[-322,202],[-125,530],[-154,150],[-9,192],[270,-56],[11,432],[236,96],[243,-88],[50,576],[-50,365],[-278,-28],[-236,144],[-321,-260],[-259,-124]],[[63639,77993],[-127,-350],[-269,-97],[-276,-610],[252,-561],[-27,-398],[303,-696]],[[63495,75281],[146,-311],[141,-419],[130,-28],[85,-159],[-228,-47],[-49,-459]],[[23807,96363],[-521,38],[-74,165],[559,-9],[195,-109],[-33,-68],[-126,-17]],[[18874,96315],[-411,191],[224,188],[406,60],[392,-92],[-93,-177],[-518,-170]],[[56247,96336],[-490,137],[191,152],[-167,189],[575,119],[110,-222],[401,-134],[-620,-241]],[[19199,96904],[-461,1],[5,84],[285,177],[149,-27],[361,-120],[-339,-115]],[[22969,96575],[-226,138],[-119,221],[-22
 ,245],[360,-24],[162,-39],[332,-205],[-76,-214],[-411,-122]],[[22313,96609],[-453,66],[-457,192],[-619,21],[268,176],[-335,142],[-21,227],[546,-81],[751,-215],[212,-281],[108,-247]],[[77621,96617],[507,776],[229,66],[208,-38],[704,-336],[-82,-240],[-1566,-228]],[[54420,95937],[-598,361],[252,210],[-416,170],[-541,499],[-216,463],[757,212],[152,-207],[396,8],[105,202],[408,20],[350,-206],[915,-440],[-699,-233],[-155,-435],[-243,-111],[-132,-490],[-335,-23]],[[56395,97491],[-819,98],[-50,163],[-398,11],[-304,271],[858,165],[403,-142],[281,177],[702,-148],[545,-207],[-412,-318],[-806,-70]],[[63218,97851],[-301,140],[158,185],[-618,18],[542,107],[422,8],[57,-160],[159,142],[262,97],[412,-129],[-107,-90],[-373,-78],[-250,-45],[-39,-97],[-324,-98]],[[77154,97111],[-773,170],[-462,226],[-213,423],[-379,117],[722,404],[600,133],[540,-297],[640,-572],[-69,-531],[-606,-73]],[[24776,96791],[-575,76],[-299,240],[4,215],[220,157],[-508,-4],[-306,196],[-176,268],[193,262],[192,180],[285,42],[-122
 ,135],[646,30],[355,-315],[468,-127],[455,-112],[220,-390],[334,-190],[-381,-176],[-513,-445],[-492,-42]],[[27622,95587],[-726,163],[-816,-91],[-414,71],[-525,31],[-35,284],[514,133],[-137,427],[170,41],[742,-255],[-379,379],[-450,113],[225,229],[492,141],[79,206],[-392,231],[-118,304],[759,-26],[220,-64],[433,216],[-625,68],[-972,-38],[-491,201],[-232,239],[-324,173],[-61,202],[413,112],[324,19],[545,96],[409,220],[344,-30],[300,-166],[211,319],[367,95],[498,65],[849,24],[148,-63],[802,100],[601,-38],[602,-37],[742,-47],[597,-75],[508,-161],[-12,-157],[-678,-257],[-672,-119],[-251,-133],[605,3],[-656,-358],[-452,-167],[-476,-483],[-573,-98],[-177,-120],[-841,-64],[383,-74],[-192,-105],[230,-292],[-264,-202],[-429,-167],[-132,-232],[-388,-176],[39,-134],[475,23],[6,-144],[-742,-355]],[[37559,86051],[-410,482],[-556,3],[-269,324],[-186,577],[-481,735],[-141,385],[-38,530],[-384,546],[100,435],[-186,208],[275,691],[418,220],[110,247],[58,461],[-318,-209],[-151,-88],[-249,-84],[-341,19
 3],[-19,401],[109,314],[258,9],[567,-157],[-478,375],[-249,202],[-276,-83],[-232,147],[310,550],[-169,220],[-220,409],[-335,626],[-353,230],[3,247],[-745,346],[-590,43],[-743,-24],[-677,-44],[-323,188],[-482,372],[729,186],[559,31],[-1188,154],[-627,241],[39,229],[1051,285],[1018,284],[107,214],[-750,213],[243,235],[961,413],[404,63],[-115,265],[658,156],[854,93],[853,5],[303,-184],[737,325],[663,-221],[390,-46],[577,-192],[-660,318],[38,253],[932,353],[975,-27],[354,218],[982,57],[2219,-74],[1737,-469],[-513,-227],[-1062,-26],[-1496,-58],[140,-105],[984,65],[836,-204],[540,181],[231,-212],[-305,-344],[707,220],[1348,229],[833,-114],[156,-253],[-1132,-420],[-157,-136],[-888,-102],[643,-28],[-324,-431],[-224,-383],[9,-658],[333,-386],[-434,-24],[-457,-187],[513,-313],[65,-502],[-297,-55],[360,-508],[-617,-42],[322,-241],[-91,-208],[-391,-91],[-388,-2],[348,-400],[4,-263],[-549,244],[-143,-158],[375,-148],[364,-361],[105,-476],[-495,-114],[-214,228],[-344,340],[95,-401],[-322,-311],[7
 32,-25],[383,-32],[-745,-515],[-755,-466],[-813,-204],[-306,-2],[-288,-228],[-386,-624],[-597,-414],[-192,-24],[-370,-145],[-399,-138],[-238,-365],[-4,-415],[-141,-388],[-453,-472],[112,-462],[-125,-488],[-142,-577],[-391,-36]],[[67002,71642],[284,-224],[209,79],[58,268],[219,89],[157,180],[55,472],[234,114],[44,211],[131,-158],[84,-19]],[[68477,72654],[154,-4],[210,-124]],[[68841,72526],[85,-72],[201,189],[93,-114],[90,271],[166,-12],[43,86],[29,239],[120,205],[150,-134],[-30,-181],[84,-28],[-26,-496],[110,-194],[97,125],[123,58],[173,265],[192,-44],[286,-1]],[[70827,72688],[50,-169]],[[70877,72519],[-162,-67],[-141,-109],[-319,-68],[-298,-124],[-163,-258],[66,-250],[32,-294],[-139,-248],[12,-227],[-76,-213],[-265,18],[110,-390],[-177,-150],[-118,-356],[15,-355],[-108,-166],[-103,55],[-212,-77],[-31,-166],[-207,1],[-154,-334],[-10,-503],[-361,-246],[-194,52],[-56,-129],[-166,75],[-278,-88],[-465,301]],[[66909,68203],[252,536],[-23,380],[-210,100],[-22,375],[-91,472],[119,323],[-121
 ,87],[76,430],[113,736]],[[56642,44124],[29,-184],[-32,-286],[49,-277],[-41,-222],[24,-203],[-579,7],[-13,-1880],[188,-483],[181,-369]],[[56448,40227],[-510,-241],[-673,83],[-192,284],[-1126,-26],[-42,-41],[-166,267],[-180,17],[-166,-100],[-134,-113]],[[53422,46976],[115,79],[80,-11],[98,71],[820,-8],[68,-440],[80,-354],[64,-191],[106,-309],[184,47],[91,83],[154,-83],[42,148],[69,344],[172,23],[15,103],[142,2],[-24,-213],[337,5],[5,-372],[56,-228],[-41,-356],[21,-363],[93,-219],[-15,-703],[68,54],[121,-15],[172,89],[127,-35]],[[53309,47603],[112,255],[84,100],[104,-203]],[[53609,47755],[-101,-124],[-45,-152],[-9,-258],[-71,-62]],[[55719,75309],[-35,-201],[39,-254],[115,-144]],[[55838,74710],[-5,-155],[-91,-85],[-16,-192],[-129,-287]],[[55427,75229],[-47,93]],[[55380,75322],[-18,188],[120,291],[18,-111],[75,52]],[[55575,75742],[59,-159],[66,-60],[19,-214]],[[65575,65974],[52,-202]],[[65665,65306],[-142,-3],[-23,-384],[50,-82],[-126,-117],[-1,-241],[-81,-245],[-7,-238]],[[65335,63996]
 ,[-56,-125],[-835,298],[-106,599],[-11,136]],[[31400,18145],[-168,16],[-297,1],[0,1319]],[[32587,37434],[511,-964],[227,-89],[339,-437],[286,-231],[40,-261],[-273,-898],[280,-160],[312,-91],[220,95],[252,453],[45,521]],[[34826,35372],[138,114],[139,-341],[-6,-472],[-234,-326],[-186,-241],[-314,-573],[-370,-806]],[[33993,32727],[-70,-473],[-74,-607],[3,-588],[-61,-132],[-21,-382]],[[31227,23224],[273,-433],[266,-119]],[[30952,19680],[-257,93],[-672,79],[-115,344],[6,443],[-185,-38],[-98,214],[-24,626],[213,260],[88,375],[-33,299],[148,504],[101,782],[-30,347],[122,112],[-30,223],[-129,118],[92,248],[-126,224],[-65,682],[112,120],[-47,720],[65,605],[75,527],[166,215],[-84,576],[-1,543],[210,386],[-7,494],[159,576],[1,544],[-72,108],[-128,1020],[171,607],[-27,572],[100,537],[182,555],[196,367],[-83,232],[58,190],[-9,985],[302,291],[96,614],[-34,148]],[[31359,37147],[231,534],[364,-144],[163,-427],[109,475],[316,-24],[45,-127]],[[62492,74950],[57,-155],[106,-103],[-56,-148],[148,-202],[
 -78,-189],[118,-160],[124,-97],[7,-410]],[[62918,73486],[-101,-17]],[[62817,73469],[-113,342],[1,91],[-123,-2],[-82,159],[-58,-16]],[[62442,74043],[-109,172],[-207,147],[27,288],[-47,208]],[[62106,74858],[386,92]],[[1088,892],[38,-7],[32,-4]],[[1158,881],[402,-246],[352,246],[63,34],[816,104],[265,-138],[130,-71],[419,-196],[789,-151],[625,-185],[1072,-139],[800,162],[1181,-116],[669,-185],[734,174],[773,162],[60,278],[-1094,23],[-898,139],[-234,231],[-745,128],[49,266],[103,243],[104,220],[-55,243],[-462,162],[-212,209],[-430,185],[675,-35],[642,93],[402,-197],[495,173],[457,220],[223,197],[-98,243],[-359,162],[-408,174],[-571,35],[-500,81],[-539,58],[-180,220],[-359,185],[-217,208],[-87,672],[136,-58],[250,-185],[457,58],[441,81],[228,-255],[441,58],[370,127],[348,162],[315,197],[419,58],[-11,220],[-97,220],[81,208],[359,104],[163,-196],[425,115],[321,151],[397,12],[375,57],[376,139],[299,128],[337,127],[218,-35],[190,-46],[414,81],[370,-104],[381,11],[364,81],[375,-57],[414,-58],
 [386,23],[403,-12],[413,-11],[381,23],[283,174],[337,92],[349,-127],[331,104],[300,208],[179,-185],[98,-208],[180,-197],[288,174],[332,-220],[375,-70],[321,-162],[392,35],[354,104],[418,-23],[376,-81],[381,-104],[147,254],[-180,197],[-136,209],[-359,46],[-158,220],[-60,220],[-98,440],[213,-81],[364,-35],[359,35],[327,-93],[283,-174],[119,-208],[376,-35],[359,81],[381,116],[342,70],[283,-139],[370,46],[239,451],[224,-266],[321,-104],[348,58],[228,-232],[365,-23],[337,-69],[332,-128],[218,220],[108,209],[278,-232],[381,58],[283,-127],[190,-197],[370,58],[288,127],[283,151],[337,81],[392,69],[354,81],[272,127],[163,186],[65,254],[-32,244],[-87,231],[-98,232],[-87,231],[-71,209],[-16,231],[27,232],[130,220],[109,243],[44,231],[-55,255],[-32,232],[136,266],[152,173],[180,220],[190,186],[223,173],[109,255],[152,162],[174,151],[267,34],[174,186],[196,115],[228,70],[202,150],[157,186],[218,69],[163,-151],[-103,-196],[-283,-174],[-120,-127],[-206,92],[-229,-58],[-190,-139],[-202,-150],[-136,
 -174],[-38,-231],[17,-220],[130,-197],[-190,-139],[-261,-46],[-153,-197],[-163,-185],[-174,-255],[-44,-220],[98,-243],[147,-185],[229,-139],[212,-185],[114,-232],[60,-220],[82,-232],[130,-196],[82,-220],[38,-544],[81,-220],[22,-232],[87,-231],[-38,-313],[-152,-243],[-163,-197],[-370,-81],[-125,-208],[-169,-197],[-419,-220],[-370,-93],[-348,-127],[-376,-128],[-223,-243],[-446,-23],[-489,23],[-441,-46],[-468,0],[87,-232],[424,-104],[311,-162],[174,-208],[-310,-185],[-479,58],[-397,-151],[-17,-243],[-11,-232],[327,-196],[60,-220],[353,-220],[588,-93],[500,-162],[398,-185],[506,-186],[690,-92],[681,-162],[473,-174],[517,-197],[272,-278],[136,-220],[337,209],[457,173],[484,186],[577,150],[495,162],[691,12],[680,-81],[560,-139],[180,255],[386,173],[702,12],[550,127],[522,128],[577,81],[614,104],[430,150],[-196,209],[-119,208],[0,220],[-539,-23],[-571,-93],[-544,0],[-77,220],[39,440],[125,128],[397,138],[468,139],[337,174],[337,174],[251,231],[380,104],[376,81],[190,47],[430,23],[408,81],[
 343,116],[337,139],[305,139],[386,185],[245,197],[261,173],[82,232],[-294,139],[98,243],[185,185],[288,116],[305,139],[283,185],[217,232],[136,277],[202,163],[331,-35],[136,-197],[332,-23],[11,220],[142,231],[299,-58],[71,-220],[331,-34],[360,104],[348,69],[315,-34],[120,-243],[305,196],[283,105],[315,81],[310,81],[283,139],[310,92],[240,128],[168,208],[207,-151],[288,81],[202,-277],[157,-209],[316,116],[125,232],[283,162],[365,-35],[108,-220],[229,220],[299,69],[326,23],[294,-11],[310,-70],[300,-34],[130,-197],[180,-174],[304,104],[327,24],[315,0],[310,11],[278,81],[294,70],[245,162],[261,104],[283,58],[212,162],[152,324],[158,197],[288,-93],[109,-208],[239,-139],[289,46],[196,-208],[206,-151],[283,139],[98,255],[250,104],[289,197],[272,81],[326,116],[218,127],[228,139],[218,127],[261,-69],[250,208],[180,162],[261,-11],[229,139],[54,208],[234,162],[228,116],[278,93],[256,46],[244,-35],[262,-58],[223,-162],[27,-254],[245,-197],[168,-162],[332,-70],[185,-162],[229,-162],[266,-35],[22
 3,116],[240,243],[261,-127],[272,-70],[261,-69],[272,-46],[277,0],[229,-614],[-11,-150],[-33,-267],[-266,-150],[-218,-220],[38,-232],[310,12],[-38,-232],[-141,-220],[-131,-243],[212,-185],[321,-58],[321,104],[153,232],[92,220],[153,185],[174,174],[70,208],[147,289],[174,58],[316,24],[277,69],[283,93],[136,231],[82,220],[190,220],[272,151],[234,115],[153,197],[157,104],[202,93],[277,-58],[250,58],[272,69],[305,-34],[201,162],[142,393],[103,-162],[131,-278],[234,-115],[266,-47],[267,70],[283,-46],[261,-12],[174,58],[234,-35],[212,-127],[250,81],[300,0],[255,81],[289,-81],[185,197],[141,196],[191,163],[348,439],[179,-81],[212,-162],[185,-208],[354,-359],[272,-12],[256,0],[299,70],[299,81],[229,162],[190,174],[310,23],[207,127],[218,-116],[141,-185],[196,-185],[305,23],[190,-150],[332,-151],[348,-58],[288,47],[218,185],[185,185],[250,46],[251,-81],[288,-58],[261,93],[250,0],[245,-58],[256,-58],[250,104],[299,93],[283,23],[316,0],[255,58],[251,46],[76,290],[11,243],[174,-162],[49,-266],[
 92,-244],[115,-196],[234,-105],[315,35],[365,12],[250,35],[364,0],[262,11],[364,-23],[310,-46],[196,-186],[-54,-220],[179,-173],[299,-139],[310,-151],[360,-104],[375,-92],[283,-93],[315,-12],[180,197],[245,-162],[212,-185],[245,-139],[337,-58],[321,-69],[136,-232],[316,-139],[212,-208],[310,-93],[321,12],[299,-35],[332,12],[332,-47],[310,-81],[288,-139],[289,-116],[195,-173],[-32,-232],[-147,-208],[-125,-266],[-98,-209],[-131,-243],[-364,-93],[-163,-208],[-360,-127],[-125,-232],[-190,-220],[-201,-185],[-115,-243],[-70,-220],[-28,-266],[6,-220],[158,-232],[60,-220],[130,-208],[517,-81],[109,-255],[-501,-93],[-424,-127],[-528,-23],[-234,-336],[-49,-278],[-119,-220],[-147,-220],[370,-196],[141,-244],[239,-219],[338,-197],[386,-186],[419,-185],[636,-185],[142,-289],[800,-128],[53,-45],[208,-175],[767,151],[636,-186],[-99504,-147],[245,344],[501,-185],[32,21],[294,188]],[[54716,79012],[-21,-241],[-156,-2],[53,-128],[-92,-380]],[[54500,78261],[-53,-100],[-243,-14],[-140,-134],[-229,45]],[
 [53835,78058],[-398,153],[-62,205],[-274,-102],[-32,-113],[-169,84]],[[52900,78285],[-142,16],[-125,108],[42,145],[-10,104]],[[52665,78658],[83,33],[141,-164],[39,156],[245,-25],[199,106],[133,-18],[87,-121],[26,100],[-40,385],[100,75],[98,272]],[[53776,79457],[206,-190],[157,242],[98,44],[215,-180],[131,30],[128,-111]],[[54711,79292],[-23,-75],[28,-205]],[[62817,73469],[-190,78],[-141,273],[-44,223]],[[63720,73858],[-48,-207],[-101,-138]],[[63578,73220],[-69,-29],[-173,309],[95,292],[-82,174],[-104,-44],[-327,-436]],[[62492,74950],[68,96],[207,-169],[149,-36],[38,70],[-136,319],[72,82]],[[62890,75312],[78,-20],[191,-359],[122,-40],[48,150],[166,238]],[[58149,47921],[-17,713],[-70,268]],[[58062,48902],[169,-46],[85,336],[147,-38]],[[58463,49154],[16,-233],[60,-134],[3,-192],[-69,-124],[-108,-308],[-101,-214],[-115,-28]],[[50920,80916],[204,-47],[257,123],[176,-258],[153,-138]],[[51710,80596],[-32,-400]],[[51678,80196],[-72,-22],[-30,-331]],[[51576,79843],[-243,269],[-143,-46],[-194,
 279],[-129,237],[-129,10],[-40,207]],[[50518,54209],[-69,407],[13,1357],[-56,122],[-11,290],[-96,207],[-85,174],[35,311]],[[50249,57077],[96,67],[56,258],[136,56],[61,176]],[[50598,57634],[93,173],[100,2],[212,-340]],[[51003,57469],[-11,-197],[62,-350],[-54,-238],[29,-159],[-135,-366],[-86,-181],[-52,-372],[7,-376],[-16,-952]],[[49214,56277],[-190,152],[-130,-22],[-97,-149],[-125,125],[-49,195],[-125,129]],[[48498,56707],[-18,343],[76,250],[-7,200],[221,490],[41,405],[76,144],[134,-79],[116,120],[38,152],[216,265],[53,184],[259,246],[153,84],[70,-114],[178,3]],[[50104,59400],[-22,-286],[37,-269],[156,-386],[9,-286],[320,-134],[-6,-405]],[[50249,57077],[-243,13]],[[50006,57090],[-128,47],[-90,-96],[-123,43],[-482,-27],[-7,-336],[38,-444]],[[75742,63602],[-6,-424],[-97,90],[18,-476]],[[75657,62792],[-79,308],[-16,301],[-53,285]],[[74730,63611],[-43,486],[-96,444],[47,356],[-171,159],[62,215],[173,220],[-200,313],[98,401],[220,-255],[133,-30],[24,-410],[265,-81],[257,8],[160,-101],[-12
 8,-500],[-124,-34],[-86,-336],[152,-306],[46,377],[76,2],[147,-937]],[[56293,76715],[80,-243],[108,43],[213,-92],[408,-31],[138,150],[327,138],[202,-215],[163,-62]],[[57776,75399],[-239,79],[-283,-186]],[[57254,75292],[-3,-294],[-252,-56],[-196,206],[-222,-162],[-206,17]],[[56375,75003],[-20,391],[-139,189]],[[56216,75583],[46,84],[-30,70],[47,188],[105,185],[-135,255],[-24,216],[68,134]],[[55279,77084],[100,2],[-69,-260],[134,-227],[-41,-278],[-65,-27]],[[55338,76294],[-52,-53],[-90,-138],[-41,-325]],[[55155,75778],[-246,224],[-105,247],[-106,130],[-127,221],[-61,183],[-136,277],[59,245],[99,-136],[60,123],[130,13],[239,-98],[192,8],[126,-131]],[[56523,82432],[268,-4],[302,223],[64,333],[228,190],[-26,264]],[[57359,83438],[169,100],[298,228]],[[57826,83766],[293,-149],[39,-146],[146,70],[272,-141],[27,-277],[-60,-159],[174,-387],[113,-108],[-16,-107],[187,-104],[80,-157],[-108,-129],[-224,20],[-54,-55],[66,-196],[68,-379]],[[58829,81362],[-239,-35],[-85,-129],[-18,-298],[-111,57],[
 -250,-28],[-73,138],[-104,-103],[-105,86],[-218,12],[-310,141],[-281,47],[-215,-14],[-152,-160],[-133,-23]],[[56535,81053],[-6,263],[-85,274],[166,121],[2,235],[-77,225],[-12,261]],[[25238,61101],[-2,87],[33,27],[51,-70],[99,357],[53,8]],[[25297,59966],[-83,0],[22,667],[2,468]],[[31359,37147],[-200,-81],[-109,814],[-150,663],[88,572],[-146,250],[-37,426],[-136,402]],[[30669,40193],[175,638],[-119,496],[63,199],[-49,219],[108,295],[6,503],[13,415],[60,200],[-240,951]],[[30686,44109],[206,-50],[143,13],[62,179],[243,239],[147,222],[363,100],[-29,-443],[34,-227],[-23,-396],[302,-529],[311,-98],[109,-220],[188,-117],[115,-172],[175,6],[161,-175],[12,-342],[55,-172],[3,-255],[-81,-10],[107,-688],[533,-24],[-41,-342],[30,-233],[151,-166],[66,-367],[-49,-465],[-77,-259],[27,-337],[-87,-122]],[[33842,38659],[-4,182],[-259,302],[-258,9],[-484,-172],[-133,-520],[-7,-318],[-110,-708]],[[34826,35372],[54,341],[38,350],[0,325],[-100,107],[-104,-96],[-103,26],[-33,228],[-26,541],[-52,177],[-187,1
 60],[-114,-116],[-293,113],[18,802],[-82,329]],[[30686,44109],[-157,-102],[-126,68],[18,898],[-228,-348],[-245,15],[-105,315],[-184,34],[59,254],[-155,359],[-115,532],[73,108],[0,250],[168,171],[-28,319],[71,206],[20,275],[318,402],[227,114],[37,89],[251,-28]],[[30585,48040],[125,1620],[6,256],[-43,339],[-123,215],[1,430],[156,97],[56,-61],[9,226],[-162,61],[-4,370],[541,-13],[92,203],[77,-187],[55,-349],[52,73]],[[31423,51320],[153,-312],[216,38],[54,181],[206,138],[115,97],[32,250],[198,168],[-15,124],[-235,51],[-39,372],[12,396],[-125,153],[52,55],[206,-76],[221,-148],[80,140],[200,92],[310,221],[102,225],[-37,167]],[[33129,53652],[145,26],[64,-136],[-36,-259],[96,-90],[63,-274],[-77,-209],[-44,-502],[71,-299],[20,-274],[171,-277],[137,-29],[30,116],[88,25],[126,104],[90,157],[154,-50],[67,21]],[[34294,51702],[151,-48],[25,120],[-46,118],[28,171],[112,-53],[131,61],[159,-125]],[[34854,51946],[121,-122],[86,160],[62,-25],[38,-166],[133,42],[107,224],[85,436],[164,540]],[[35174,306
 29],[-77,334],[122,280],[-160,402],[-218,327],[-286,379],[-103,-18],[-279,457],[-180,-63]],[[82069,53798],[-13,-291],[-16,-377],[-133,19],[-58,-202],[-126,307]],[[75471,66988],[113,-189],[-20,-363],[-227,-17],[-234,39],[-175,-92],[-252,224],[-6,119]],[[74670,66709],[184,439],[150,150],[198,-137],[147,-14],[122,-159]],[[58175,3752

<TRUNCATED>

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[16/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/data/places1.json
----------------------------------------------------------------------
diff --git a/console/plugin/data/places1.json b/console/plugin/data/places1.json
deleted file mode 100644
index d1942c8..0000000
--- a/console/plugin/data/places1.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-"type": "FeatureCollection",
-                                                                                
-"features": [
-{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Boston", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Boston", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 1.000000, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "Massachusetts", "ISO_A2": "US", "NOTE": null, "LATITUDE": 42.329960, "LONGITUDE": -71.070014, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 4467000, "POP_MIN": 589141, "POP_OTHER": 2238083, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 4930956.000000, "MEGANAME": "Boston", "LS_NAME": "Boston", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2338688.000000, "MAX_POP20": 2663082.000000, "MAX_POP50": 4880817.000000, "MAX_POP300": 4880817.000000, "MAX_POP310": 4880817.000000, "MAX_NATSCA": 300.000000, "MIN_AREAKM": 1365.000000, "MAX_AREAKM": 3880.000000, "MIN_AR
 EAMI": 527.000000, "MAX_AREAMI": 1498.000000, "MIN_PERKM": 1077.000000, "MAX_PERKM": 3538.000000, "MIN_PERMI": 669.000000, "MAX_PERMI": 2199.000000, "MIN_BBXMIN": -71.675000, "MAX_BBXMIN": -71.433881, "MIN_BBXMAX": -70.658333, "MAX_BBXMAX": -70.658333, "MIN_BBYMIN": 41.533333, "MAX_BBYMIN": 42.008333, "MIN_BBYMAX": 42.554143, "MAX_BBYMAX": 43.075000, "MEAN_BBXC": -71.177127, "MEAN_BBYC": 42.277571, "COMPARE": 0, "GN_ASCII": "Boston", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 0.000000, "GN_POP": 589141.000000, "ELEVATION": 13.000000, "GTOPO30": 11.000000, "TIMEZONE": "America\/New_York", "GEONAMESNO": "GeoNames match general.", "UN_FID": 527, "UN_ADM0": "United States of America", "UN_LAT": 42.370000, "UN_LONG": -71.100000, "POP1950": 2551.000000, "POP1955": 2680.000000, "POP1960": 2818.000000, "POP1965": 3000.000000, "POP1970": 3187.000000, "POP1975": 3233.000000, "POP1980": 3281.000000, "POP1985": 3349.000000, "POP1990": 3428.000000, "POP1995": 3726.000000, "POP2000": 
 4049.000000, "POP2005": 4364.000000, "POP2010": 4467.000000, "POP2015": 4597.000000, "POP2020": 4774.000000, "POP2025": 4919.000000, "POP2050": 5032.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -71.071959532186838, 42.331906001702293 ] } },
-{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital alt", "NAME": "Tel Aviv-Yafo", "NAMEPAR": null, "NAMEALT": "Tel Aviv-Jaffa", "DIFFASCII": 0, "NAMEASCII": "Tel Aviv-Yafo", "ADM0CAP": 0.000000, "CAPALT": 1.000000, "CAPIN": "While Jerulsale", "WORLDCITY": 0.000000, "MEGACITY": 1, "SOV0NAME": "Israel", "SOV_A3": "IS1", "ADM0NAME": "Israel", "ADM0_A3": "ISR", "ADM1NAME": "Tel Aviv", "ISO_A2": "IL", "NOTE": null, "LATITUDE": 32.079991, "LONGITUDE": 34.770012, "CHANGED": 4.000000, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 3112000, "POP_MIN": 378358, "POP_OTHER": 2306851, "RANK_MAX": 12, "RANK_MIN": 10, "GEONAMEID": 293394.000000, "MEGANAME": "Tel Aviv-Yafo", "LS_NAME": "Tel Aviv-Yafo", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2324568.000000, "MAX_POP20": 2324568.000000, "MAX_POP50": 2324568.000000, "MAX_POP300": 0.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 50.000000, "MIN_AREAKM": 436.000000, "MAX_A
 REAKM": 436.000000, "MIN_AREAMI": 168.000000, "MAX_AREAMI": 168.000000, "MIN_PERKM": 386.000000, "MAX_PERKM": 386.000000, "MIN_PERMI": 240.000000, "MAX_PERMI": 240.000000, "MIN_BBXMIN": 34.716667, "MAX_BBXMIN": 34.716667, "MIN_BBXMAX": 34.958333, "MAX_BBXMAX": 34.958333, "MIN_BBYMIN": 31.850000, "MAX_BBYMIN": 31.850000, "MIN_BBYMAX": 32.208333, "MAX_BBYMAX": 32.208333, "MEAN_BBXC": 34.836735, "MEAN_BBYC": 32.030266, "COMPARE": 0, "GN_ASCII": "Tel Aviv-Yafo", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 5.000000, "GN_POP": 378358.000000, "ELEVATION": 0.000000, "GTOPO30": -9999.000000, "TIMEZONE": "Asia\/Jerusalem", "GEONAMESNO": "GeoNames match general.", "UN_FID": 304, "UN_ADM0": "Israel", "UN_LAT": 32.040000, "UN_LONG": 34.760000, "POP1950": 418.000000, "POP1955": 556.000000, "POP1960": 738.000000, "POP1965": 882.000000, "POP1970": 1029.000000, "POP1975": 1206.000000, "POP1980": 1416.000000, "POP1985": 1681.000000, "POP1990": 2026.000000, "POP1995": 2442.000000, "POP2000":
  2752.000000, "POP2005": 3012.000000, "POP2010": 3112.000000, "POP2015": 3256.000000, "POP2020": 3453.000000, "POP2025": 3600.000000, "POP2050": 3726.000000, "CITYALT": "Tel Aviv-Jaffa" }, "geometry": { "type": "Point", "coordinates": [ 34.768065899551743, 32.081937333041651 ] } },
-{ "type": "Feature", "properties": { "SCALERANK": 7, "NATSCALE": 20, "LABELRANK": 7, "FEATURECLA": "Admin-1 capital", "NAME": "Brno", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Brno", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 0.000000, "MEGACITY": 0, "SOV0NAME": "Czech Republic", "SOV_A3": "CZE", "ADM0NAME": "Czech Republic", "ADM0_A3": "CZE", "ADM1NAME": "Kraj Vysocina", "ISO_A2": "CZ", "NOTE": null, "LATITUDE": 49.200393, "LONGITUDE": 16.609983, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 388277, "POP_MIN": 369559, "POP_OTHER": 380022, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 3078610.000000, "MEGANAME": null, "LS_NAME": "Brno", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 388277.000000, "MAX_POP20": 388277.000000, "MAX_POP50": 0.000000, "MAX_POP300": 0.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 20.000000, "MIN_AREAKM": 141.000000, "MAX_AREAKM": 141.000000, "MIN_AREAMI": 54.000000, "MAX_AREAMI": 54.000000, "MI
 N_PERKM": 149.000000, "MAX_PERKM": 149.000000, "MIN_PERMI": 92.000000, "MAX_PERMI": 92.000000, "MIN_BBXMIN": 16.483333, "MAX_BBXMIN": 16.483333, "MIN_BBXMAX": 16.708333, "MAX_BBXMAX": 16.708333, "MIN_BBYMIN": 49.116667, "MAX_BBYMIN": 49.116667, "MIN_BBYMAX": 49.300000, "MAX_BBYMAX": 49.300000, "MEAN_BBXC": 16.601967, "MEAN_BBYC": 49.196167, "COMPARE": 0, "GN_ASCII": "Brno", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 78.000000, "GN_POP": 369559.000000, "ELEVATION": 0.000000, "GTOPO30": 226.000000, "TIMEZONE": "Europe\/Prague", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_ADM0": null, "UN_LAT": 0.000000, "UN_LONG": 0.000000, "POP1950": 0.000000, "POP1955": 0.000000, "POP1960": 0.000000, "POP1965": 0.000000, "POP1970": 0.000000, "POP1975": 0.000000, "POP1980": 0.000000, "POP1985": 0.000000, "POP1990": 0.000000, "POP1995": 0.000000, "POP2000": 0.000000, "POP2005": 0.000000, "POP2010": 0.000000, "POP2015": 0.000000, "POP2020": 0.000000, "POP2025": 0.000000, "POP2
 050": 0.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ 16.60998327501909, 49.200393492726221 ] } },
-{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 2, "FEATURECLA": "Admin-1 capital", "NAME": "Toronto", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Toronto", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 1.000000, "MEGACITY": 1, "SOV0NAME": "Canada", "SOV_A3": "CAN", "ADM0NAME": "Canada", "ADM0_A3": "CAN", "ADM1NAME": "Ontario", "ISO_A2": "CA", "NOTE": null, "LATITUDE": 43.699980, "LONGITUDE": -79.420021, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 5213000, "POP_MIN": 3934421, "POP_OTHER": 3749229, "RANK_MAX": 13, "RANK_MIN": 12, "GEONAMEID": 6167865.000000, "MEGANAME": "Toronto", "LS_NAME": "Toronto", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 3934421.000000, "MAX_POP20": 4377344.000000, "MAX_POP50": 5190755.000000, "MAX_POP300": 5190755.000000, "MAX_POP310": 5190755.000000, "MAX_NATSCA": 300.000000, "MIN_AREAKM": 1432.000000, "MAX_AREAKM": 2286.000000, "MIN_AREAMI": 553.000000, "MAX_AR
 EAMI": 883.000000, "MIN_PERKM": 464.000000, "MAX_PERKM": 1161.000000, "MIN_PERMI": 289.000000, "MAX_PERMI": 721.000000, "MIN_BBXMIN": -80.008333, "MAX_BBXMIN": -79.806554, "MIN_BBXMAX": -79.130272, "MAX_BBXMAX": -78.608333, "MIN_BBYMIN": 43.141667, "MAX_BBYMIN": 43.475000, "MIN_BBYMAX": 44.090162, "MAX_BBYMAX": 44.125000, "MEAN_BBXC": -79.464213, "MEAN_BBYC": 43.712937, "COMPARE": 0, "GN_ASCII": "Toronto", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 8.000000, "GN_POP": 4612191.000000, "ELEVATION": 0.000000, "GTOPO30": 173.000000, "TIMEZONE": "America\/Toronto", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 14, "UN_ADM0": "Canada", "UN_LAT": 43.720000, "UN_LONG": -79.410000, "POP1950": 1068.000000, "POP1955": 1365.000000, "POP1960": 1744.000000, "POP1965": 2093.000000, "POP1970": 2535.000000, "POP1975": 2770.000000, "POP1980": 3008.000000, "POP1985": 3355.000000, "POP1990": 3807.000000, "POP1995": 4197.000000, "POP2000": 4607.000000, "POP2005": 5
 035.000000, "POP2010": 5213.000000, "POP2015": 5447.000000, "POP2020": 5687.000000, "POP2025": 5827.000000, "POP2050": 5946.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -79.421966652988431, 43.701925736408441 ] } },
-{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Admin-0 capital", "NAME": "Beijing", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Beijing", "ADM0CAP": 1.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 1.000000, "MEGACITY": 1, "SOV0NAME": "China", "SOV_A3": "CHN", "ADM0NAME": "China", "ADM0_A3": "CHN", "ADM1NAME": "Beijing", "ISO_A2": "CN", "NOTE": null, "LATITUDE": 39.928892, "LONGITUDE": 116.388286, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 11106000, "POP_MIN": 7480601, "POP_OTHER": 9033231, "RANK_MAX": 14, "RANK_MIN": 13, "GEONAMEID": 1816670.000000, "MEGANAME": "Beijing", "LS_NAME": "Beijing", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 10190861.000000, "MAX_POP20": 11120470.000000, "MAX_POP50": 16510327.000000, "MAX_POP300": 23647944.000000, "MAX_POP310": 137121250.000000, "MAX_NATSCA": 300.000000, "MIN_AREAKM": 2512.000000, "MAX_AREAKM": 118844.000000, "MIN_AREAMI": 970.000000, 
 "MAX_AREAMI": 45886.000000, "MIN_PERKM": 1837.000000, "MAX_PERKM": 93615.000000, "MIN_PERMI": 1141.000000, "MAX_PERMI": 58169.000000, "MIN_BBXMIN": 111.441667, "MAX_BBXMIN": 116.058333, "MIN_BBXMAX": 117.208333, "MAX_BBXMAX": 117.325000, "MIN_BBYMIN": 31.883333, "MAX_BBYMIN": 39.658333, "MIN_BBYMAX": 40.433333, "MAX_BBYMAX": 40.466667, "MEAN_BBXC": 115.929521, "MEAN_BBYC": 38.837783, "COMPARE": 0, "GN_ASCII": "Beijing", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 22.000000, "GN_POP": 7480601.000000, "ELEVATION": 0.000000, "GTOPO30": 63.000000, "TIMEZONE": "Asia\/Harbin", "GEONAMESNO": "GeoNames match general.", "UN_FID": 24, "UN_ADM0": "China", "UN_LAT": 39.900000, "UN_LONG": 116.380000, "POP1950": 4331.000000, "POP1955": 4628.000000, "POP1960": 4945.000000, "POP1965": 5284.000000, "POP1970": 5646.000000, "POP1975": 6034.000000, "POP1980": 6448.000000, "POP1985": 6890.000000, "POP1990": 7362.000000, "POP1995": 8486.000000, "POP2000": 9782.000000, "POP2005": 10717.000000, 
 "POP2010": 11106.000000, "POP2015": 11741.000000, "POP2020": 12842.000000, "POP2025": 13807.000000, "POP2050": 14545.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ 116.386339825659434, 39.930838089909059 ] } },
-{ "type": "Feature", "properties": { "SCALERANK": 4, "NATSCALE": 50, "LABELRANK": 1, "FEATURECLA": "Populated place", "NAME": "Ashburn", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Ashburn", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 0.000000, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "Maryland", "ISO_A2": "US", "NOTE": null, "LATITUDE": 39.299990, "LONGITUDE": -76.619985, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 2255000, "POP_MIN": 610892, "POP_OTHER": 1689307, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 4347778.000000, "MEGANAME": "Ashburn", "LS_NAME": "Ashburn", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1776808.000000, "MAX_POP20": 1912760.000000, "MAX_POP50": 1912760.000000, "MAX_POP300": 0.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 50.000000, "MIN_AREAKM": 1079.000000, "MAX_AREAKM": 1256.000000, "MIN_AREAMI": 417.0000
 00, "MAX_AREAMI": 485.000000, "MIN_PERKM": 645.000000, "MAX_PERKM": 832.000000, "MIN_PERMI": 401.000000, "MAX_PERMI": 517.000000, "MIN_BBXMIN": -76.934897, "MAX_BBXMIN": -76.934897, "MIN_BBXMAX": -76.400000, "MAX_BBXMAX": -76.400000, "MIN_BBYMIN": 38.975000, "MAX_BBYMIN": 39.075599, "MIN_BBYMAX": 39.533333, "MAX_BBYMAX": 39.533333, "MEAN_BBXC": -76.655503, "MEAN_BBYC": 39.269123, "COMPARE": 0, "GN_ASCII": "Ashburn", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0.000000, "GN_POP": 610892.000000, "ELEVATION": 10.000000, "GTOPO30": 2.000000, "TIMEZONE": "America\/New_York", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 526, "UN_ADM0": "United States of America", "UN_LAT": 39.320000, "UN_LONG": -76.610000, "POP1950": 1168.000000, "POP1955": 1290.000000, "POP1960": 1422.000000, "POP1965": 1486.000000, "POP1970": 1555.000000, "POP1975": 1650.000000, "POP1980": 1749.000000, "POP1985": 1797.000000, "POP1990": 1849.000000, "POP1995": 1962.000000, "POP2000
 ": 2083.000000, "POP2005": 2207.000000, "POP2010": 2255.000000, "POP2015": 2322.000000, "POP2020": 2422.000000, "POP2025": 2508.000000, "POP2050": 2578.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -76.621930845685483, 39.301935908916732 ] } },
-{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Raleigh", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Raleigh", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 0.000000, "MEGACITY": 0, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "North Carolina", "ISO_A2": "US", "NOTE": null, "LATITUDE": 35.818781, "LONGITUDE": -78.644693, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 1163515, "POP_MIN": 416468, "POP_OTHER": 656353, "RANK_MAX": 12, "RANK_MIN": 10, "GEONAMEID": 4487042.000000, "MEGANAME": null, "LS_NAME": "Raleigh", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 672592.000000, "MAX_POP20": 686323.000000, "MAX_POP50": 686323.000000, "MAX_POP300": 686323.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 100.000000, "MIN_AREAKM": 665.000000, "MAX_AREAKM": 691.000000, "MIN_AREAMI": 257.00
 0000, "MAX_AREAMI": 267.000000, "MIN_PERKM": 520.000000, "MAX_PERKM": 553.000000, "MIN_PERMI": 323.000000, "MAX_PERMI": 344.000000, "MIN_BBXMIN": -78.916667, "MAX_BBXMIN": -78.903728, "MIN_BBXMAX": -78.458333, "MAX_BBXMAX": -78.458333, "MIN_BBYMIN": 35.625000, "MAX_BBYMIN": 35.625000, "MIN_BBYMAX": 36.000000, "MAX_BBYMAX": 36.000000, "MEAN_BBXC": -78.682861, "MEAN_BBYC": 35.811316, "COMPARE": 0, "GN_ASCII": "Raleigh", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 0.000000, "GN_POP": 276093.000000, "ELEVATION": 96.000000, "GTOPO30": 91.000000, "TIMEZONE": "America\/New_York", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_ADM0": null, "UN_LAT": 0.000000, "UN_LONG": 0.000000, "POP1950": 0.000000, "POP1955": 0.000000, "POP1960": 0.000000, "POP1965": 0.000000, "POP1970": 0.000000, "POP1975": 0.000000, "POP1980": 0.000000, "POP1985": 0.000000, "POP1990": 0.000000, "POP1995": 0.000000, "POP2000": 0.000000, "POP2005": 0.000000, "POP2010": 0.000000, "POP2015": 0.000000, 
 "POP2020": 0.000000, "POP2025": 0.000000, "POP2050": 0.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -78.644693442484481, 35.818781350745724 ] } }
-]
-}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[06/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrCharts.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrCharts.html b/console/stand-alone/plugin/html/qdrCharts.html
new file mode 100644
index 0000000..8ba1ffe
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrCharts.html
@@ -0,0 +1,150 @@
+<div class="main-display row-fluid qdrCharts" ng-controller="QDR.ChartsController">
+    <div ng-show="hasCharts()">
+        <div ng-repeat="chart in svgCharts" class="chartContainer">
+            <p class="chartLabels">
+                <button ng-click="delChart(chart)" title="Delete"><i class="icon-trash"></i></button>
+                <button ng-click="editChart(chart)" title="Configure"><i class="icon-edit"></i></button>
+                <button ng-click="zoomChart(chart)" title="Zoom {{chart.zoomed ? 'in' : 'out'}}" ng-if="!chart.chart.request().nodeList"><i ng-class="chart.zoomed ? 'icon-zoom-in' : 'icon-zoom-out'"></i></button>
+            </p><div style="clear:both"></div>
+            <div id="{{chart.chart.id()}}" class="aChart d3Chart"></div>
+        </div>
+        <div ng-init="chartsLoaded()"></div>
+    </div>
+    <div ng-hide="hasCharts()" class="centered">
+        There are no charts. To add charts to this page, click on a <i class="icon-bar-chart"></i> icon on the <button ng-click="showListPage()"><i class="icon-list "></i> List</button> page.
+    </div>
+</div>
+
+<!--
+    This is the template for the graph dialog that is displayed. It uses the
+    dialogCtrl controller in qdrCharts.js.
+-->
+<script type="text/ng-template" id="chart-config-template.html">
+<div class="chartOptions">
+    <div class="modal-header">
+        <h3 class="modal-title">Chart {{chart.attr() | humanify}}</h3>
+    </div>
+    <div class="modal-body">
+        <div id="{{svgDivId}}" class="d3Chart"></div>
+        <uib-tabset>
+            <uib-tab heading="Type">
+                <legend>Chart type</legend>
+                <label><input type="radio" ng-model="dialogChart.type" value="value" ng-change="chartChanged()" /> Value Chart</label>
+                <label><input type="radio" ng-model="dialogChart.type" value="rate" ng-change="chartChanged()" /> Rate Chart</label>
+                <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
+                    <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span>
+                    <div class="slider" ui-slider="slider.options" ng-model="rateWindow"></div>
+                </div>
+                <div style="clear:both;"> </div>
+            </uib-tab>
+            <uib-tab heading="Colors">
+                <legend>Chart colors</legend>
+                <div class="colorPicker">
+                    <div>Area</div><input minicolors="areaColor" id="position-bottom-left" type="text" ng-model="dialogChart.areaColor" />
+                </div>
+                <div class="colorPicker">
+                    <div>Line</div><input minicolors="lineColor" id="position-bottom-left" type="text" ng-model="dialogChart.lineColor" />
+                </div>
+                <div style="clear:both;"> </div>
+            </uib-tab>
+            <uib-tab heading="Duration">
+                <legend>Chart duration</legend>
+                <div class="dlg-slider duration">
+                    <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="duration.options" ng-model="dialogChart.visibleDuration"></div>
+                </div>
+                <div style="clear:both;"> </div>
+
+            </uib-tab>
+        </uib-tabset>
+    </div>
+    <div class="modal-footer">
+        <button class="btn btn-success" type="button" ng-click="apply()">Apply to existing chart</button>
+        <button class="btn btn-info" type="button" ng-click="copyToDashboard()">Create new chart</button>
+        <button class="btn btn-primary" type="button" ng-click="okClick()">Close</button>
+    </div>
+</div>
+<!--
+    <div class="chartOptions" title="Configure chart" ng-controller="QDR.ChartDialogController">
+        <p class="dialogHeader">Title: <input type="text" ng-model="userTitle" /></p>
+        <div id="{{svgDivId}}" class="d3Chart"></div>
+        <p></p>
+        <uib-tabset>
+            <uib-tab heading="Type">
+                <legend>Chart type</legend>
+                <label><input type="radio" ng-model="dialogChart.type" value="value" ng-change="chartChanged()" /> Value Chart</label>
+                <label><input type="radio" ng-model="dialogChart.type" value="rate" ng-change="chartChanged()" /> Rate Chart</label>
+
+                <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
+                    <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span>
+                    <div class="slider" ui-slider="slider.options" ng-model="rateWindow"></div>
+                </div>
+                <div style="clear:both;"> </div>
+            </uib-tab>
+            <uib-tab heading="Colors">
+                <legend>Chart colors</legend>
+                <div class="colorPicker">
+                    <div>Area</div><input minicolors="areaColor" id="position-bottom-left" type="text" ng-model="dialogChart.areaColor" />
+                </div>
+                <div class="colorPicker">
+                    <div>Line</div><input minicolors="lineColor" id="position-bottom-left" type="text" ng-model="dialogChart.lineColor" />
+                </div>
+                <div style="clear:both;"> </div>
+            </uib-tab>
+            <uib-tab heading="Duration">
+                <legend>Chart duration</legend>
+                <div class="dlg-slider duration">
+                    <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="duration.options" ng-model="dialogChart.visibleDuration"></div>
+                </div>
+                <div style="clear:both;"> </div>
+
+            </uib-tab>
+        </uib-tabset>
+
+        <tabset>
+            <tab heading="Type">
+                <div>
+                    <legend>Chart type</legend>
+                    <label>
+                        <input type="radio" ng-model="dialogChart.type" value="value" ng-change="chartChanged()" />
+                        Value Chart
+                    </label>
+                    <label class="rateGroup">
+                        <input type="radio" ng-model="dialogChart.type" value="rate" ng-change="chartChanged()" /> Rate Chart
+                    </label>
+                    <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
+                        <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="slider.options" ng-model="rateWindow"></div>
+                    </div>
+                </div>
+                <div style="clear:both;"> </div>
+            </tab>
+            <tab heading="Colors">
+                <div>
+                    <legend>Chart colors</legend>
+                    <div class="colorPicker">
+                        <div>Area</div><input minicolors="areaColor" id="position-bottom-left" type="text" ng-model="dialogChart.areaColor" />
+                    </div>
+                    <div class="colorPicker">
+                        <div>Line</div><input minicolors="lineColor" id="position-bottom-left" type="text" ng-model="dialogChart.lineColor" />
+                    </div>
+                </div>
+                <div style="clear:both;"> </div>
+            </tab>
+            <tab heading="Duration">
+                <div>
+                    <legend>Chart duration</legend>
+                </div>
+                <div class="dlg-slider duration">
+                    <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="duration.options" ng-model="dialogChart.visibleDuration"></div>
+                </div>
+                <div style="clear:both;"> </div>
+            </tab>
+        </tabset>
+        <div class="okButton">
+            <button ng-click="apply()">Apply to existing chart</button>
+            <button ng-click="copyToDashboard()">Create new chart</button>
+            <button ng-click="okClick()">Close</button>
+        </div>
+    </div>
+-->
+</script>
+

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrConnect.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrConnect.html b/console/stand-alone/plugin/html/qdrConnect.html
new file mode 100644
index 0000000..34e452f
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrConnect.html
@@ -0,0 +1,65 @@
+<div class="row-fluid" ng-controller="QDR.SettingsController">
+      <div class="login container" ng-hide="connecting">
+          <div class="row" id="login-container">
+              <div class="span2 offset4">
+                  <!-- <div simple-form name="settings" data="formConfig" entity="formEntity"></div> -->
+                  <form class="form-horizontal no-bottom-margin" novalidate name="settings" action="" method="post">
+                      <fieldset>
+                          <div class="control-group">
+                              <label class="control-label">Address: </label>
+                              <div class="controls">
+                                  <input type="text" description="Router address" ng-model="formEntity.address" name="address" required="required" autofocus="autofocus" class="ng-pristine ng-valid ng-valid-required">
+                                  <span class="help-block"></span>
+                              </div>
+                          </div>
+                          <div class="control-group">
+                              <label class="control-label" title="Port to connect to, by default 5673">Port: </label>
+                              <div class="controls">
+                                  <input type="number" description="Router port" tooltip="Ports to connect to, by default 5672" ng-model="formEntity.port" name="port" title="Port to connect to, by default 5673" class="ng-scope ng-pristine ng-valid ng-valid-number">
+                                  <span class="help-block"></span>
+                              </div>
+                          </div>
+                          <!--
+                                          <div class="control-group">
+                                              <label class="control-label">Username: </label>
+                                              <div class="controls">
+                                                  <input type="text" description="User Name" ng-model="formEntity.username" name="username" class="ng-pristine ng-valid">
+                                                  <span class="help-block"></span>
+                                              </div>
+                                          </div>
+                                          <div class="control-group">
+                                              <label class="control-label">Password: </label>
+                                              <div class="controls">
+                                                  <input type="password" description="Password" ng-model="formEntity.password" name="password" class="ng-pristine ng-valid">
+                                                  <span class="help-block"></span>
+                                              </div>
+                                          </div>
+                          -->
+                          <div class="control-group">
+                              <label class="control-label" title="Whether or not the connection should be started as soon as you navigate to the console">Autostart: </label>
+                              <div class="controls">
+                                  <input type="checkbox" description="Connect at startup" tooltip="Whether or not the connection should be started as soon as you navigate to the console" ng-model="formEntity.autostart" name="autostart" title="Whether or not the connection should be started as soon as you log into hawtio" class="ng-scope ng-pristine ng-valid">
+                                  <span class="help-block"></span>
+                              </div>
+                          </div>
+                          <input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;">
+                      </fieldset>
+                  </form>
+                  <p></p>
+                  <div>
+                      <button class="btn btn-primary pull-right" ng-disabled="settings.$invalid" ng-click="connect()">{{buttonText()}}</button>
+                  </div>
+              </div>
+          </div>
+      </div>
+
+  <div class="span4 centered" ng-show="connecting">
+    <i class="icon-spin icon-spinner icon-4x"></i>
+    <p>Please wait, connecting now...</p>
+  </div>
+  <div class="centered" ng-show="connectionError">
+    <p>There was a connection error: {{connectionErrorText}}</p>
+  </div>
+
+  <div class="span4"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrGraphs.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrGraphs.html b/console/stand-alone/plugin/html/qdrGraphs.html
new file mode 100644
index 0000000..c311246
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrGraphs.html
@@ -0,0 +1,15 @@
+<div ng-controller="QDR.ListController" title=""
+     class="prefs">
+  <div class="row-fluid">
+    <div class="tabbable">
+      <div value="graphs"
+           class="tab-pane" 
+           title="graphs">
+          <div>
+              <div id="graph"></div>
+
+          </div>
+      </div>
+     </div>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrLayout.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrLayout.html b/console/stand-alone/plugin/html/qdrLayout.html
new file mode 100644
index 0000000..d164f8a
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrLayout.html
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<ul class="nav nav-tabs connected" ng-controller="QDR.NavBarController">
+  <li ng-repeat="link in breadcrumbs" ng-show="isValid(link)" ng-class='{active : isActive(link.href), "pull-right" : isRight(link), haschart: hasChart(link)}'>
+    <a ng-href="{{link.href}}{{hash}}" ng-bind-html="link.content | to_trusted"></a>
+  </li>
+</ul>
+<div class="row-fluid">
+  <div ng-view></div>
+</div>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrList.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrList.html b/console/stand-alone/plugin/html/qdrList.html
new file mode 100644
index 0000000..156b21a
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrList.html
@@ -0,0 +1,56 @@
+<!--
+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.
+-->
+<div class="main-display row-fluid qdrList" ng-controller="QDR.ListController">
+    <ul class="nav nav-tabs qdrListNodes">
+          <li ng-repeat="node in nodes" ng-click="selectNode(node)" ng-class="{active : isNodeSelected(node.id)}"> <span>{{node.name}}</span> </li>
+    </ul>
+
+    <div class="row-fluid qdrListActions">
+        <ul class="nav nav-tabs ng-scope">
+            <li ng-repeat="entity in entities" ng-class="{active : isActionActive(entity.name)}" ng-click="selectAction(entity.name)" >
+                <a title="{{entity.title}}" data-placement="bottom"> {{entity.humanName}} </a></li>
+        </ul>
+            <div class="gridStyle" ng-style="getTableHeight()" ui-grid-auto-resize ui-grid-selection ui-grid="gridDef"></div>
+            <div class="selectedItems">
+                <div ng-style="getDetailsTableHeight()" ui-grid-auto-resize ui-grid-selection ui-grid="details"></div>
+            </div>
+    </div>
+</div>
+<!--
+    This is the template for the graph dialog that is displayed. It uses the
+    dialogCtrl controller in qdrList.js.
+-->
+<script type="text/ng-template" id="template-from-script.html">
+    <div class="modal-header">
+        <h3 class="modal-title">Chart {{chart.attr() | humanify}}</h3>
+    </div>
+    <div class="modal-body">
+            <div id="{{svgDivId}}" class="d3Chart"></div>
+    </div>
+    <div class="modal-footer">
+        <span ng-hide="isOnChartsPage()">
+            <button class="btn btn-success" type="button" ng-click="addChartsPage()"><i class="icon-bar-chart"></i> Add</button> this chart to the Charts page.
+        </span>
+        <span ng-show="isOnChartsPage()">
+            <button class="btn btn-danger" type="button" ng-click="delChartsPage()">Remove</button> this chart from the <button class="btn btn-success" type="button" ng-click="showChartsPage()"><i class="icon-bar-chart"></i> Charts</button> page.
+        </span>
+        <button class="btn btn-primary" type="button" ng-click="ok()">Close</button>
+    </div>
+</script>
+

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrOverview.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrOverview.html b/console/stand-alone/plugin/html/qdrOverview.html
new file mode 100644
index 0000000..d63ea0e
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrOverview.html
@@ -0,0 +1,83 @@
+<!--
+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.
+-->
+<div ng-controller="QDR.OverviewController">
+
+    <div class="treeContainer">
+        <div id="overtree"></div>
+    </div>
+
+    <div class="treeDetails" ng-include="template.url"></div>
+</div>
+
+
+<!-- the following scripts are content that gets loaded into the above div that has the temple.url -->
+<script type="text/ng-template" id="routers.html">
+    <div class="row-fluid">
+        <h3>Routers</h3>
+        <div class="overview">
+            <div class="gridStyle" ng-style="getGridHeight(allRouters)" ui-grid-auto-resize ui-grid-selection ui-grid="allRouters"></div>
+        </div>
+    </div>
+</script>
+
+<script type="text/ng-template" id="router.html">
+    <div class="row-fluid">
+        <h3>Router {{router.data.title}}</h3>
+        <div ng-style="getGridHeight(routerGrid)" ui-grid-auto-resize ui-grid="routerGrid" class="gridStyle noHighlight"></div>
+    </div>
+</script>
+
+<script type="text/ng-template" id="addresses.html">
+    <div class="row-fluid">
+    <h3>Addresses</h3>
+    <div class="overview">
+        <div class="gridStyle" ng-style="getGridHeight(addressGrid)" ui-grid-auto-resize ui-grid-selection ui-grid="addressGrid"></div>
+    </div>
+    </div>
+</script>
+<script type="text/ng-template" id="address.html">
+    <div class="row-fluid">
+    <h3>Address {{address.data.title}}</h3>
+    <div ng-style="getGridHeight(addressGrid)" ui-grid-auto-resize class="gridStyle noHighlight" ui-grid="addressGrid"></div>
+    </div>
+</script>
+<script type="text/ng-template" id="connections.html">
+    <div class="row-fluid">
+    <h3>Connections</h3>
+    <div class="overview">
+        <div class="gridStyle" ng-style="getGridHeight(allConnectionGrid)" ui-grid-auto-resize ui-grid-selection ui-grid="allConnectionGrid"></div>
+    </div>
+    </div>
+</script>
+<script type="text/ng-template" id="connection.html">
+    <div class="row-fluid">
+    <h3>Connection {{connection.data.title}}</h3>
+    <div ng-style="getGridHeight(connectionGrid)" ui-grid-auto-resize class="gridStyle noHighlight" ui-grid="connectionGrid"></div>
+    </div>
+</script>
+<script type="text/ng-template" id="logs.html">
+    <div class="row-fluid">
+    <h3>Logs</h3>
+    </div>
+</script>
+<script type="text/ng-template" id="log.html">
+    <div class="row-fluid">
+    <h3>Log {{log.data.title}}</h3>
+    </div>
+</script>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrSchema.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrSchema.html b/console/stand-alone/plugin/html/qdrSchema.html
new file mode 100644
index 0000000..15ebb46
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrSchema.html
@@ -0,0 +1,21 @@
+<!--
+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.
+-->
+<div class="main-display row-fluid" ng-controller="QDR.SchemaController">
+    <json-formatter json="schema" open="2"></json-formatter>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/img/ZeroClipboard.swf
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/img/ZeroClipboard.swf b/console/stand-alone/plugin/img/ZeroClipboard.swf
new file mode 100644
index 0000000..a3aaa20
Binary files /dev/null and b/console/stand-alone/plugin/img/ZeroClipboard.swf differ

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/img/ajax-loader.gif
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/img/ajax-loader.gif b/console/stand-alone/plugin/img/ajax-loader.gif
new file mode 100644
index 0000000..3c2f7c0
Binary files /dev/null and b/console/stand-alone/plugin/img/ajax-loader.gif differ

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/img/dynatree/icons.gif
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/img/dynatree/icons.gif b/console/stand-alone/plugin/img/dynatree/icons.gif
new file mode 100644
index 0000000..6e237a0
Binary files /dev/null and b/console/stand-alone/plugin/img/dynatree/icons.gif differ

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/img/dynatree/loading.gif
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/img/dynatree/loading.gif b/console/stand-alone/plugin/img/dynatree/loading.gif
new file mode 100644
index 0000000..2a96840
Binary files /dev/null and b/console/stand-alone/plugin/img/dynatree/loading.gif differ

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/navbar.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/navbar.js b/console/stand-alone/plugin/js/navbar.js
new file mode 100644
index 0000000..ebda4d4
--- /dev/null
+++ b/console/stand-alone/plugin/js/navbar.js
@@ -0,0 +1,119 @@
+/*
+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.
+*/
+/**
+ * @module QDR
+ */
+var QDR = (function (QDR) {
+
+  /**
+   * @property breadcrumbs
+   * @type {{content: string, title: string, isValid: isValid, href: string}[]}
+   *
+   * Data structure that defines the sub-level tabs for
+   * our plugin, used by the navbar controller to show
+   * or hide tabs based on some criteria
+   */
+  QDR.breadcrumbs = [
+    {
+        content: '<i class="icon-cogs"></i> Connect',
+        title: "Connect to a router",
+        isValid: function () { return true; },
+        href: "#connect"
+    },
+    {
+        content: '<i class="fa fa-home"></i> Overview',
+        title: "View router overview",
+        isValid: function (QDRService) { return QDRService.isConnected(); },
+        href: "#/overview"
+      },
+    {
+        content: '<i class="icon-star-empty"></i> Topology',
+        title: "View router network topology",
+        isValid: function (QDRService) { return QDRService.isConnected(); },
+        href: "#/topology"
+      },
+    {
+        content: '<i class="icon-list "></i> List',
+        title: "View router nodes as a list",
+        isValid: function (QDRService) { return QDRService.isConnected(); },
+        href: "#/list"
+      },
+    {
+        content: '<i class="icon-bar-chart"></i> Charts',
+        title: "View charts",
+        isValid: function (QDRService, $location) { return QDRService.isConnected(); },
+        href: "#/charts"
+    },
+    {
+        content: '<i class="icon-align-left"></i> Schema',
+        title: "View dispatch schema",
+        isValid: function (QDRService) { return QDRService.isConnected(); },
+        href: "#/schema",
+        right: true
+
+      }
+  ];
+  /**
+   * @function NavBarController
+   *
+   * @param $scope
+   * @param workspace
+   *
+   * The controller for this plugin's navigation bar
+   *
+   */
+  QDR.module.controller("QDR.NavBarController", ['$scope', '$sce', 'QDRService', 'QDRChartService', '$location', function($scope, $sce, QDRService, QDRChartService, $location) {
+
+	QDR.log.debug("navbar started with location.url: " + $location.url());
+	QDR.log.debug("navbar started with window.location.pathname : " + window.location.pathname);
+
+    if ($location.path().startsWith("/topology")
+    && !QDRService.isConnected()) {
+      $location.path("/connect");
+    }
+
+    if ($location.path().startsWith("/connect")
+    && QDRService.isConnected()) {
+      $location.path("/topology");
+    }
+
+    $scope.breadcrumbs = QDR.breadcrumbs;
+
+    $scope.isValid = function(link) {
+      return link.isValid(QDRService, $location);
+    };
+
+    $scope.isActive = function(href) {
+        return href.split("#")[1] == $location.path();
+    };
+
+    $scope.isRight = function (link) {
+        return angular.isDefined(link.right);
+    };
+
+    $scope.hasChart = function (link) {
+        if (link.href == "#/charts") {
+            return QDRChartService.charts.some(function (c) { return c.dashboard });
+        }
+    }
+  }]);
+
+  return QDR;
+
+} (QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrChartService.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrChartService.js b/console/stand-alone/plugin/js/qdrChartService.js
new file mode 100644
index 0000000..6535384
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrChartService.js
@@ -0,0 +1,956 @@
+/*
+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.
+*/
+/**
+ * @module QDR
+ */
+var QDR = (function(QDR) {
+
+    // The QDR chart service handles periodic gathering data for charts and displaying the charts
+    QDR.module.factory("QDRChartService", ['$rootScope', 'QDRService', '$http', '$resource',
+    function($rootScope, QDRService, $http, $resource) {
+
+        var instance = 0;   // counter for chart instances
+        var bases = [];
+        var findBase = function (name, attr, request) {
+            for (var i=0; i<bases.length; ++i) {
+                var base = bases[i];
+                if (base.equals(name, attr, request))
+                    return base;
+            }
+            return null;
+        }
+
+        function ChartBase(name, attr, request) {
+            // the base chart attributes
+            this.name = name;           // the record's "name" field
+            this.attr = attr;           // the record's attr field to chart
+            this.request = request;     // the associated request that fetches the data
+
+            // copy the savable properties to an object
+            this.copyProps = function (o) {
+                o.name = this.name;
+                o.attr = this.attr;
+                this.request.copyProps(o);
+            }
+
+            this.equals = function (name, attr, request) {
+                return (this.name == name && this.attr == attr && this.request.equals(request));
+            }
+        };
+
+        // Object that represents a visible chart
+        // There can be multiple of these per ChartBase (eg. one rate  and one value chart)
+        function Chart(name, attr, request) {
+
+            var base = findBase(name, attr, request);
+            if (!base) {
+                base = new ChartBase(name, attr, request);
+                bases.push(base);
+            }
+            this.base = base;
+            this.instance = instance++;
+            this.dashboard = false;     // is this chart on the dashboard page
+            this.type = "value";        // value or rate
+            this.rateWindow = 1000;     // calculate the rate of change over this time interval. higher == smother graph
+            this.areaColor = "#c0e0ff"; // the chart's area color when not an empty string
+            this.lineColor = "#4682b4"; // the chart's line color when not an empty string
+            this.visibleDuration = 10;  // number of minutes of data to show (<= base.duration)
+            this.userTitle = null;      // user title overrides title()
+
+            // generate a unique id for this chart
+            this.id = function () {
+                var key = this.request().nodeId + this.request().entity + this.name() + this.attr() + "_" + this.instance;
+                // remove all characters except letters,numbers, and _
+                return key.replace(/[^\w]/gi, '')
+            }
+            // copy the savable properties to an object
+            this.copyProps = function (o) {
+                o.type = this.type;
+                o.rateWindow = this.rateWindow;
+                o.areaColor = this.areaColor;
+                o.lineColor = this.lineColor;
+                o.visibleDuration = this.visibleDuration;
+                o.userTitle = this.userTitle;
+                this.base.copyProps(o);
+            }
+            this.name = function (_) {
+                if (!arguments.length) return this.base.name;
+                this.base.name = _;
+                return this;
+            }
+            this.attr = function (_) {
+                if (!arguments.length) return this.base.attr;
+                this.base.attr = _;
+                return this;
+            }
+            this.nodeId = function (_) {
+                if (!arguments.length) return this.base.request.nodeId;
+                this.base.request.nodeId = _;
+                return this;
+            }
+            this.entity = function (_) {
+                if (!arguments.length) return this.base.request.entity;
+                this.base.request.entity = _;
+                return this;
+            }
+            this.request = function (_) {
+                if (!arguments.length) return this.base.request;
+                this.base.request = _;
+                return this;
+            }
+            this.data = function () {
+                return this.base.request.data(this.base.name, this.base.attr); // refernce to chart's data array
+            }
+            this.interval = function (_) {
+                if (!arguments.length) return this.base.request.interval;
+                this.base.request.interval = _;
+                return this;
+            }
+            this.duration = function (_) {
+                if (!arguments.length) return this.base.request.duration;
+                this.base.request.duration = _;
+                return this;
+            }
+            this.title = function (_) {
+				var name = this.request().aggregate ? 'Aggregate' : QDRService.nameFromId(this.nodeId());
+                var computed = name +
+                                   " " + QDRService.humanify(this.attr()) +
+                                   " - " + this.name()
+                if (!arguments.length) return this.userTitle || computed;
+
+                // don't store computed title in userTitle
+                if (_ === computed)
+                    _ = null;
+                this.userTitle = _;
+                return this;
+            }
+            this.title_short = function (_) {
+                if (!arguments.length) return this.userTitle || this.name();
+                return this;
+            }
+            this.copy = function () {
+                var chart = self.registerChart(this.nodeId(), this.entity(),
+                            this.name(), this.attr(), this.interval(), true, this.base.request.aggregate);
+                chart.type = this.type;
+                chart.areaColor = this.areaColor;
+                chart.lineColor = this.lineColor;
+                chart.rateWindow = this.rateWindow;
+                chart.visibleDuration = this.visibleDuration;
+                chart.userTitle = this.userTitle;
+                return chart;
+            }
+            // compare to a chart
+            this.equals = function (c) {
+                return (c.instance == this.instance &&
+                        c.base.equals(this.base.name, this.base.attr, this.base.request) &&
+                        c.type == this.type &&
+                        c.rateWindow == this.rateWindow &&
+                        c.areaColor == this.areaColor &&
+                        c.lineColor == this.lineColor)
+            }
+        }
+
+        // Object that represents the management request to fetch and store data for multiple charts
+        function ChartRequest(nodeId, entity, name, attr, interval, aggregate) {
+            this.duration = 10;         // number of minutes to keep the data
+            this.nodeId = nodeId;       // eg amqp:/_topo/0/QDR.A/$management
+            this.entity = entity;       // eg .router.address
+			// sorted since the responses will always be sorted
+			this.aggregate = aggregate;   // list of nodeIds for aggregate charts
+            this.datum = {};            // object containing array of arrays for each attr
+                                        // like {attr1: [[date,value],[date,value]...], attr2: [[date,value]...]}
+
+            this.interval = interval;   // number of milliseconds between updates to data
+            this.setTimeoutHandle = null;   // used to cancel the next request
+            // copy the savable properties to an object
+
+			this.data = function (name, attr) {
+				if (this.datum[name] && this.datum[name][attr])
+					return this.datum[name][attr]
+				return null;
+			}
+			this.addAttrName = function (name, attr) {
+				if (Object.keys(this.datum).indexOf(name) == -1) {
+					this.datum[name] = {}
+				}
+				if (Object.keys(this.datum[name]).indexOf(attr) == -1) {
+					this.datum[name][attr] = [];
+				}
+			}
+			this.addAttrName(name, attr)
+
+            this.copyProps = function (o) {
+                o.nodeId = this.nodeId;
+                o.entity = this.entity;
+                o.interval = this.interval;
+				o.aggregate = this.aggregate;
+				o.duration = this.duration;
+            }
+
+			this.removeAttr = function (name, attr) {
+				if (this.datum[name]) {
+					if (this.datum[name][attr]) {
+						delete this.datum[name][attr]
+					}
+				}
+				return this.attrs().length;
+			}
+
+            this.equals = function (r, entity, aggregate) {
+				if (arguments.length == 3) {
+					var o = {nodeId: r, entity: entity, aggregate: aggregate}
+					r = o;
+				}
+                return (this.nodeId === r.nodeId && this.entity === r.entity && this.aggregate == r.aggregate)
+			}
+			this.names = function () {
+				return Object.keys(this.datum)
+			}
+			this.attrs = function () {
+				var attrs = {}
+				Object.keys(this.datum).forEach( function (name) {
+					Object.keys(this.datum[name]).forEach( function (attr) {
+						attrs[attr] = 1;
+					})
+				}, this)
+				return Object.keys(attrs);
+			}
+        };
+        var self = {
+            charts: [],         // list of charts to gather data for
+            chartRequests: [],  // the management request info (multiple charts can be driven off of a single request
+
+            init: function () {
+                self.loadCharts();
+            },
+
+			findChartRequest: function (nodeId, entity, aggregate) {
+				var ret = null;
+				self.chartRequests.some( function (request) {
+					if (request.equals(nodeId, entity, aggregate)) {
+						ret = request;
+						return true;
+					}
+				})
+				return ret;
+			},
+
+            findCharts: function (name, attr, nodeId, entity) {
+                return self.charts.filter( function (chart) {
+                    return (chart.name() == name &&
+                            chart.attr() == attr &&
+                            chart.nodeId() == nodeId &&
+                            chart.entity() == entity)
+                });
+            },
+
+            delChartRequest: function (request) {
+                for (var i=0; i<self.chartRequests.length; ++i) {
+                    var r = self.chartRequests[i];
+                    if (request.equals(r)) {
+	                    QDR.log.debug("removed request: " + request.nodeId + " " + request.entity);
+                        self.chartRequests.splice(i, 1);
+                        self.stopCollecting(request);
+                        return;
+                    }
+                }
+            },
+
+            delChart: function (chart) {
+                var foundBases = 0;
+                for (var i=0; i<self.charts.length; ++i) {
+                    var c = self.charts[i];
+					if (c.base === chart.base)
+						++foundBases;
+                    if (c.equals(chart)) {
+                        self.charts.splice(i, 1);
+                        if (chart.dashboard)
+                            self.saveCharts();
+                    }
+                }
+                if (foundBases == 1) {
+                    var baseIndex = bases.indexOf(chart.base)
+                    bases.splice(baseIndex, 1);
+                }
+            },
+
+            registerChart: function (nodeId, entity, name, attr, interval, forceCreate, aggregate) {
+                var request = self.findChartRequest(nodeId, entity, aggregate);
+                if (request) {
+                    // add any new attr or name to the list
+                    request.addAttrName(name, attr)
+                } else {
+                    // the nodeId/entity did not already exist, so add a new request and chart
+                    QDR.log.debug("added new request: " + nodeId + " " + entity);
+                    request = new ChartRequest(nodeId, entity, name, attr, interval, aggregate);
+                    self.chartRequests.push(request);
+                    self.startCollecting(request);
+                }
+                var charts = self.findCharts(name, attr, nodeId, entity);
+                var chart;
+                if (charts.length == 0 || forceCreate) {
+                    chart = new Chart(name, attr, request);
+                    self.charts.push(chart);
+                } else {
+                    chart = charts[0];
+                }
+                return chart;
+            },
+
+            // remove the chart for name/attr
+            // if all attrs are gone for this request, remove the request
+            unRegisterChart: function (chart) {
+                // remove the chart
+                for (var i=0; i<self.charts.length; ++i) {
+                    var c = self.charts[i];
+                    if (chart.equals(c)) {
+                        var request = chart.request();
+                        self.delChart(chart);
+                        if (request) {
+                            // see if any other charts use this attr
+                            for (var i=0; i<self.charts.length; ++i) {
+                                var c = self.charts[i];
+                                if (c.attr() == chart.attr() && c.request().equals(chart.request()))
+                                    return;
+                            }
+                            // no other charts use this attr, so remove it
+                            if (request.removeAttr(chart.name(), chart.attr()) == 0) {
+                                self.stopCollecting(request);
+                                self.delChartRequest(request);
+                            }
+                        }
+                    }
+                }
+            },
+
+            stopCollecting: function (request) {
+                if (request.setTimeoutHandle) {
+                    clearTimeout(request.setTimeoutHandle);
+                    request.setTimeoutHandle = null;
+                }
+            },
+
+            startCollecting: function (request) {
+                // Using setTimeout instead of setInterval because the response may take longer than interval
+                request.setTimeoutHandle = setTimeout(self.sendChartRequest, request.interval, request);
+            },
+            // send the request
+            sendChartRequest: function (request) {
+                // ensure the response has the name field so we can associate the response values with the correct chart
+                var attrs = request.attrs();
+                attrs.push("name");
+
+	            // this is called when the response is received
+				var saveResponse = function (nodeId, entity, response) {
+	                //QDR.log.debug("got chart results for " + nodeId + " " + entity);
+	                // records an array that has data for all names
+	                var records = response.results;
+	                if (!records)
+	                    return;
+
+	                var now = new Date();
+	                var cutOff = new Date(now.getTime() - request.duration * 60 * 1000);
+	                // index of the "name" attr in the response
+	                var nameIndex = response.attributeNames.indexOf("name");
+	                if (nameIndex < 0)
+	                    return;
+
+					var names = request.names();
+	                // for each record returned, find the name/attr for this request and save the data with this timestamp
+	                for (var i=0; i<records.length; ++i) {
+	                    var name = records[i][nameIndex];
+						// if we want to store the values for some attrs for this name
+	                    if (names.indexOf(name) > -1) {
+	                        attrs.forEach( function (attr) {
+		                        var data = request.data(name, attr) // get a reference to the data array
+								if (data) {
+		                            var attrIndex = response.attributeNames.indexOf(attr)
+			                        if (request.aggregate) {
+			                            data.push([now, response.aggregates[i][attrIndex].sum, response.aggregates[i][attrIndex].detail])
+			                        } else {
+										data.push([now, records[i][attrIndex]])
+			                        }
+	                                // expire the old data
+	                                while (data[0][0] < cutOff) {
+	                                    data.shift();
+	                                }
+								}
+	                        })
+	                    }
+	                }
+				}
+				if (request.aggregate) {
+					var nodeList = QDRService.nodeIdList()
+					QDRService.getMultipleNodeInfo(nodeList, request.entity, attrs, saveResponse, request.nodeId);
+				} else {
+                    QDRService.getNodeInfo(request.nodeId, request.entity, attrs, saveResponse);
+				}
+                // it is now safe to send another request
+                request.setTimeoutHandle = setTimeout(self.sendChartRequest, request.interval, request)
+            },
+
+            numCharts: function () {
+                return self.charts.length;
+            },
+
+            isAttrCharted: function (nodeId, entity, name, attr) {
+                var charts = self.findCharts(name, attr, nodeId, entity);
+                // if any of the matching charts are on the dashboard page, return true
+                return charts.some(function (chart) {
+                    return (chart.dashboard) });
+            },
+
+            addDashboard: function (chart) {
+                chart.dashboard = true;
+                self.saveCharts();
+            },
+            delDashboard: function (chart) {
+                chart.dashboard = false;
+                self.saveCharts();
+            },
+            // save the charts to local storage
+            saveCharts: function () {
+                var charts = [];
+                var minCharts = [];
+
+                self.charts.forEach(function (chart) {
+                    var minChart = {};
+                    // don't save chart unless it is on the dashboard
+                    if (chart.dashboard) {
+                        chart.copyProps(minChart);
+                        minCharts.push(minChart);
+                    }
+                })
+                localStorage["QDRCharts"] = angular.toJson(minCharts);
+            },
+            loadCharts: function () {
+                var charts = angular.fromJson(localStorage["QDRCharts"]);
+                if (charts) {
+                    charts.forEach(function (chart) {
+                        if (!chart.interval)
+                            chart.interval = 1000;
+                        if (!chart.duration)
+                            chart.duration = 10;
+                        if (chart.nodeList)
+                            chart.aggregate = true;
+                        var newChart = self.registerChart(chart.nodeId, chart.entity, chart.name, chart.attr, chart.interval, true, chart.aggregate);
+                        newChart.dashboard = true;  // we only save the dashboard charts
+                        newChart.type = chart.type;
+                        newChart.rateWindow = chart.rateWindow;
+                        newChart.areaColor = chart.areaColor ? chart.areaColor : "#c0e0ff";
+                        newChart.lineColor = chart.lineColor ? chart.lineColor : "#4682b4";
+                        newChart.duration(chart.duration);
+                        newChart.visibleDuration = chart.visibleDuration ? chart.visibleDuration : 10;
+                        if (chart.userTitle)
+                            newChart.title(chart.userTitle);
+                    })
+                }
+            },
+
+            AreaChart: function (chart, url) {
+                if (!chart)
+                    return;
+
+				// if this is an aggregate chart, show it stacked
+				var stacked = chart.request().aggregate;
+                this.chart = chart; // reference to underlying chart
+                this.svgchart = null;
+                if (url)
+                    url = "/dispatch" + url;
+                else
+                    url = "";
+                this.url = url;
+
+                // callback function. called by svgchart when binding data
+                // the variable 'this' refers to the svg and not the AreaChart,
+                // but since we are still in the scope of the AreaChart we have access to the passed in chart argument
+                this.chartData = function () {
+
+                    var now = new Date();
+                    var visibleDate = new Date(now.getTime() - chart.visibleDuration * 60 * 1000);
+					var data = chart.data();
+					var nodeList = QDRService.nodeIdList();
+
+                    if (chart.type == "rate") {
+                        var rateData = [];
+                        var datalen = data.length;
+                        k = 0;  // inner loop optimization
+                        for (var i=0; i<datalen; ++i) {
+                            var d = data[i];
+                            if (d[0] >= visibleDate) {
+                                for (var j=k+1; j<datalen; ++j) {
+                                    var d1 = data[j];
+                                    if (d1[0] - d[0] >= chart.rateWindow) { // rateWindow is the timespan to calculate rates
+										var elapsed = Math.max((d1[0] - d[0]) / 1000, 1); // number of seconds that elapsed
+										var rd = [d1[0],(d1[1] - d[1])/elapsed]
+                                        k = j; // start here next time
+										// this is a stacked (aggregate) chart
+										if (stacked) {
+											var detail = [];
+											nodeList.forEach( function (node, nodeIndex) {
+												if (d1[2][nodeIndex] && d[2][nodeIndex])
+													detail.push({node: QDRService.nameFromId(node), val: (d1[2][nodeIndex].val- d[2][nodeIndex].val)/elapsed})
+											})
+											rd.push(detail)
+										}
+										rateData.push(rd);
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                        // we need at least a point to chart
+                        if (rateData.length == 0) {
+                            rateData[0] = [chart.data()[0][0],0,[{node:'',val:0}]];
+                        }
+                        return rateData;
+                    }
+                    if (chart.visibleDuration != chart.duration()) {
+                        return data.filter(function (d) { return d[0]>=visibleDate});
+                    } else
+                        return data;
+                }
+
+                this.zoom = function (id, zoom) {
+                    if (this.svgchart) {
+                        this.svgchart.attr("zoom", zoom)
+						d3.select('#' + id)
+							.data([this.chartData()])
+							.call(this.svgchart)
+                    }
+                }
+
+                // called by the controller on the page that displays the chart
+                // called whenever the controller wants to redraw the chart
+                // note: the data is collected independently of how often the chart is redrawn
+                this.tick = function (id) {
+
+                    // can't draw charts that don't have data yet
+                    if (this.chart.data().length == 0) {
+                        return;
+                    }
+
+                    // if we haven't created the svg yet
+                    if (!this.svgchart) {
+
+						// make sure the dom element exists on the page
+                        var div = angular.element('#' + id);
+                        if (!div)
+                            return;
+
+                        var width = div.width();
+                        var height = div.height();
+
+						// make sure the dom element has a size. otherwise we wouldn't see anything anyway
+                        if (!width)
+                            return;
+
+						var tooltipGenerator;
+						// stacked charts have a different tooltip
+                        if (stacked) {
+							tooltipGenerator = function (d, color, format) {
+			                    var html = "<table class='fo-table'><tbody><tr class='fo-title'>"+
+			                    "<td align='center' colspan='2' nowrap>Time: "+d[0].toTimeString().substring(0, 8)+"</td></tr>"
+			                    d[2].forEach( function (detail) {
+			                        html += "<tr class='detail'><td align='right' nowrap>"
+			                        + detail.node
+			                        + "<div class='fo-table-legend' style='background-color: "+color(detail.node)+"'></div>"
+			                        + "</td><td>"+format(detail.val)+"</td></tr>"
+			                    })
+			                    html += "</tbody></table>"
+			                    return html;
+							}
+                        } else {
+                            tooltipGenerator = function (d, color, format) {
+								var html = "<table class='fo-table'><tbody><tr class='fo-title'>"+
+		                                "<td align='center'>Time</td><td align='center'>Value</td></tr><tr><td>" +
+		                                    d[0].toTimeString().substring(0, 8) +
+		                                "</td><td>" +
+		                                   format(d[1]) +
+		                                "</td></tr></tbody></table>"
+			                    return html;
+                            }
+						}
+                        // create and initialize the chart
+                        this.svgchart = self.timeSeriesStackedChart(id, width, height,
+                                QDRService.humanify(this.chart.attr()),
+                                this.chart.name(),
+                                QDRService.nameFromId(this.chart.nodeId()),
+                                this.chart.entity(),
+                                stacked)
+                            .tooltipGenerator(tooltipGenerator);
+
+                    }
+                    // in case the chart properties have changed, set the new props
+                    this.svgchart
+                        .attr("type", this.chart.type)
+                        .attr("areaColor", this.chart.areaColor)
+                        .attr("lineColor", this.chart.lineColor)
+                        .attr("url", this.url)
+                        .attr("title", this.chart.userTitle);
+
+                    // bind the new data and update the chart
+                    d3.select('#' + id)         // the div id on the page/dialog
+						.data([this.chartData()])
+                        .call(this.svgchart);       // the charting function
+                }
+            },
+
+            timeSeriesStackedChart: function (id, width, height, attrName, name, node, entity, stacked) {
+				var margin = {top: 20, right: 18, bottom: 10, left: 15}
+				// attrs that can be changed after the chart is created by using
+				// chart.attr(<attrname>, <attrvalue>);
+				var attrs = {
+							attrName: attrName, // like Deliveries to Container. Put at top of chart
+							name: name,         // like router.address/qdrhello  Put at bottom of chart with node
+							node: node,         // put at bottom of chart with name
+							entity: entity,     // like .router.address  Not used atm
+							title: "",          // user title overrides the node and name at the bottom of the chart
+							url: "",            // needed to reference filters and clip because of angular's location service
+							type: "value",      // value or rate
+							areaColor: "",      // can be set for non-stacked charts
+							lineColor: "",      // can be set for non-stacked charts
+							zoom: false         // should the y-axis range start at 0 or the min data value
+				}
+				var width = width - margin.left - margin.right,
+					height = height - margin.top - margin.bottom
+					yAxisTransitionDuration = 0
+
+				var x = d3.time.scale()
+			    var y = d3.scale.linear()
+			          .rangeRound([height, 0]);
+                // The x-accessor for the path generator; xScale ∘ xValue.
+				var X = function (d) { return x(d[0]) }
+                // The x-accessor for the path generator; yScale ∘ yValue.
+                var Y = function Y(d) { return y(d[1]) }
+
+                var xAxis = d3.svg.axis().scale(x).orient("bottom")
+					.outerTickSize(6)
+					.innerTickSize(-(height-margin.top-margin.bottom))
+                    .tickPadding(2)
+                    .ticks(d3.time.minutes, 2)
+                var yAxis = d3.svg.axis().scale(y).orient("right")
+                    .outerTickSize(8)
+                    .innerTickSize(-(width-margin.left-margin.right))
+                    .tickPadding(10)
+                    .ticks(3)
+                    .tickFormat(function(d) { return formatValue(d)})
+
+				var tooltipGenerator = function (d, color, format) {return ""}; // should be overridden to set an appropriate tooltip
+                var formatValue = d3.format(".2s");
+                var formatPrecise = d3.format(",");
+                var bisectDate = d3.bisector(function(d) { return d[0]; }).left;
+				var line = d3.svg.line();
+
+		        var stack = d3.layout.stack()
+			          .offset("zero")
+			          .values(function (d) { return d.values; })
+			          .x(function (d) { return x(d.date); })
+			          .y(function (d) { return d.value; });
+
+			    var area = d3.svg.area()
+
+				if (stacked) {
+			        area.interpolate("cardinal")
+			          .x(function (d) { return x(d.date); })
+			          .y0(function (d) { return y(d.y0); })
+			          .y1(function (d) { return y(d.y0 + d.y); });
+				} else {
+                    area.interpolate("basis").x(X).y1(Y)
+                    line.x(X).y(Y)
+				}
+				var color = d3.scale.category20();
+
+			    var sv = d3.select("#"+id).append("svg")
+			          .attr("width",  width  + margin.left + margin.right)
+			          .attr("height", height + margin.top  + margin.bottom)
+				var svg = sv
+			        .append("g")
+			          .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
+
+			    var clip = svg.append("defs").append("svg:clipPath")
+			        .attr("id", "clip")
+			        .append("svg:rect")
+			        .attr("id", "clip-rect")
+			        .attr("x", "0")
+			        .attr("y", "0")
+			        .attr("width", width)
+			        .attr("height", height);
+
+				// we want all our areas to appear before the axiis
+				svg.append("g")
+					.attr("class", "section-container")
+
+		        svg.append("g")
+			            .attr("class", "x axis")
+
+		        svg.append("g")
+			            .attr("class", "y axis")
+
+                svg.append("text").attr("class", "title")
+                        .attr("x", (width / 2) - (margin.left + margin.right) / 2)
+                        .attr("y", 0 - (margin.top / 2))
+                        .attr("text-anchor", "middle")
+                        .text(attrs.attrName);
+
+                svg.append("text").attr("class", "legend")
+                        .attr("x", (width / 2) - (margin.left + margin.right) / 2)
+                        .attr("y", height + (margin.bottom / 2) )
+                        .attr("text-anchor", "middle")
+                        .text(!stacked ? attrs.node + " " + attrs.name : attrs.name);
+
+                var focus = sv.append("g")
+                  .attr("class", "focus")
+                  .style("display", "none");
+
+                focus.append("circle")
+                  .attr("r", 4.5);
+
+                var focusg = focus.append("g");
+                focusg.append("rect")
+                    .attr("class", "mo-guide y")
+                    .attr("width", 1)
+                    .attr("height", height - (margin.top + margin.bottom));
+                focusg.append("rect")
+                    .attr("class", "mo-guide x")
+                    .attr("width", width - (margin.left + margin.right))
+                    .attr("height", 1);
+				focus.append("foreignObject")
+					.attr('class', 'svg-tooltip')
+					.append("xhtml:span");
+
+
+                function chart(selection) {
+                    selection.each(function(data) {
+
+					var seriesArr = []
+					if (stacked) {
+						var detailNames = data[0][2].map(function (detail){ return detail.node })
+						var revNames = angular.copy(detailNames).reverse();
+						color.domain(revNames);
+
+				        var series = {};
+				        detailNames.forEach(function (name) {
+							series[name] = {name: name, values:[]};
+							seriesArr.unshift(series[name]);    // insert at beginning
+				        });
+
+				        data.forEach(function (d) {
+							detailNames.map(function (name, i) {
+								series[name].values.push({date: d[0], value: d[2][i] ? d[2][i].val : 0});
+							});
+				        });
+
+				        // this decorates seriesArr with x,y,and y0 properties
+				        stack(seriesArr);
+					}
+
+                    var extent = d3.extent(data, function(d) {return d[0];});
+                    x.domain(extent)
+                      .range([0, width - margin.left - margin.right]);
+
+                    // Update the y-scale.
+                    var min = attrs.zoom ? 0 : d3.min(data, function(d) {return d[1]});
+                    var max = d3.max(data, function(d) {return d[1]});
+                    var mean = d3.mean(data, function(d) {return d[1]});
+                    //max = max * 1.01;
+                    var diff = (max - min);
+                    if (diff == 0) {
+                        max = max + 1;
+                        diff = 1;
+                    }
+                    var ratio = mean != 0 ? diff / mean : 1;
+                    if (ratio < .05)
+                        formatValue = d3.format(".3s")
+
+					if (stacked) {
+	                    y.domain([min, max])
+	                      .range([height - margin.top - margin.bottom, 0]);
+					} else {
+                        y
+                          .domain([min, max])
+                          .range([height - margin.top - margin.bottom, 0]);
+					}
+                        if (attrs.type == "rate") {
+                            area.interpolate("basis");  // rate charts look better smoothed
+                            line.interpolate("basis");
+                        }
+                        else {
+                            area.interpolate("linear"); // don't smooth value charts
+                            line.interpolate("linear");
+                        }
+
+                    // adjust the xaxis based on the range of x values (domain)
+                    var timeSpan = (extent[1] - extent[0]) / (1000 * 60);   // number of minutes
+                    if (timeSpan < 1.5)
+                        xAxis.ticks(d3.time.seconds, 10);
+                    else if (timeSpan < 3)
+                        xAxis.ticks(d3.time.seconds, 30);
+                    else if (timeSpan < 8)
+                        xAxis.ticks(d3.time.minutes, 1);
+                    else
+                        xAxis.ticks(d3.time.minutes, 2);
+
+                    // adjust the number of yaxis ticks based on the range of y values
+                    if (formatValue(min) === formatValue(max))
+                        yAxis.ticks(2);
+
+					var container = svg.select('.section-container');
+					container.selectAll('.series').remove();
+					if (stacked) {
+	                    y.domain([Math.min(min, 0), d3.max(seriesArr, function (c) {
+	                        return d3.max(c.values, function (d) { return d.y0 + d.y; });
+	                      })]);
+
+						// creates a .series g path for each section in the detail
+						// since we don't get more sections this selection is only run once
+	                    var series = container.selectAll(".series")
+	                      .data(seriesArr)
+
+						series.enter().append("g")
+	                        .attr("class", "series")
+				          .append("path")
+							.attr("class", "streamPath")
+							.style("fill", function (d) { return color(d.name); })
+							.style("stroke", "grey");
+
+						series.exit().remove()
+
+						//series.exit().remove()
+						// each time the data is updated, update each section
+						container.selectAll(".series .streamPath").data(seriesArr)
+							.attr("d", function (d) { return area(d.values); })
+					} else {
+	                    var series = container.selectAll(".series")
+	                      .data([data], function(d) { return d; })
+
+	                      series.enter().append("g")
+	                        .append("path")
+	                        .attr("class", "area")
+						  series.enter().append("path")
+	                        .attr("class", "line")
+
+						series.exit().remove()
+
+                        // Update the area path.
+                        container.select(".area").data([data])
+                          .attr("d", area.y0(y.range()[0]))
+						  .style("fill", attrs.areaColor);
+
+                        //Update the line path.
+                        container.select(".line").data([data])
+                          .attr("d", line)
+						  .style("stroke", attrs.lineColor)
+					}
+                    // Update the x-axis.
+                    svg.select(".x.axis")
+                      .attr("transform", "translate(0," + (height - margin.top - margin.bottom + 1) + ")")
+                      .call(xAxis);
+
+                    svg.select(".y.axis")
+						.transition().duration(yAxisTransitionDuration)  // animate the y axis
+                      .attr("transform", "translate(" + (width - margin.right - margin.left) + ",0)")
+                      .call(yAxis);
+                    yAxisTransitionDuration = 1000  // only do a transition after the chart is 1st drawn
+
+                    // TODO: fix this
+                    // need to recreate this every update... not sure why
+                    var overlay = sv.select(".overlay");
+                    if (!overlay.empty())
+                            overlay.remove();
+                    sv.append("rect")
+                      .attr("class", "overlay")
+                      .attr("width", width)
+                      .attr("height", height)
+                      .on("mouseover", function () {focus.style("display", null)})
+                      .on("mouseout", function () {focus.style("display", "none")})
+                      .on("mousemove", mousemove)
+
+	                    function mousemove() {
+	                        var x0 = x.invert(d3.mouse(this)[0] - margin.left);
+	                        var i = bisectDate(data, x0, 1);
+	                        if (i < data.length && i > 0) {
+	                            var d0 = data[i - 1];
+	                            var d1 = data[i];
+								// set d to the data that is closest to the mouse position
+	                            var d = x0 - d0[0] > d1[0] - x0 ? d1 : d0;
+	                            focus.attr("transform", "translate(" + (x(d[0]) + margin.left) + "," + (y(d[1]) + margin.top) + ")");
+
+								var tipFormat = formatPrecise;
+								if (attrs.type === "rate")
+									tipFormat = d3.format(".2n")
+								// set the tooltip html and position it
+								focus.select('.svg-tooltip span')
+									.html(tooltipGenerator(d, color, tipFormat))
+
+								var foBounds = focus.select('table')[0][0].getBoundingClientRect();
+	                            var mx = x(d[0]); // mouse x
+	                            var my = y(d[1]); // mouse y
+
+	                            // perfer to put the tooltip in the nw corner relative to the focus circle
+	                            var foy = -foBounds.height;
+								var fox = -foBounds.width;
+								// off the left side
+								if (mx - foBounds.width - margin.left < 0)
+									fox = 0;
+								// above the top
+								if (my - foBounds.height - margin.top < 0)
+									foy = 0;
+								// won't fit above or below, just put it at bottom
+								if (my + foBounds.height > height)
+									foy = -(foBounds.height - (height - my));
+
+								focus.select('.svg-tooltip')
+									.attr('x', fox).attr('y', foy);
+
+								// position the guide lines
+	                            focus.select(".mo-guide.y")
+	                                .attr("y", -my);
+	                            focus.select(".mo-guide.x")
+	                                .attr("x", -mx);
+
+	                        } else {
+	                            focus.attr("transform", "translate(-10,-10)");
+	                        }
+	                    }
+
+                    })
+
+
+                }
+				chart.attr = function (attrName, value) {
+					if (arguments.length < 2)
+						return arguments.length == 1 ? attrs[attrName] : chart;
+					if (angular.isDefined(attrs[attrName]))
+						attrs[attrName] = value;
+					return chart;
+				}
+				chart.tooltipGenerator = function (_) {
+					tooltipGenerator = _;
+					return chart;
+				}
+
+				return chart;
+            }
+        }
+        return self;
+  }]);
+
+  return QDR;
+}(QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrCharts.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrCharts.js b/console/stand-alone/plugin/js/qdrCharts.js
new file mode 100644
index 0000000..e484b07
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrCharts.js
@@ -0,0 +1,230 @@
+/*
+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.
+*/
+/**
+ * @module QDR
+ */
+/**
+ * @module QDR
+ */
+var QDR = (function (QDR) {
+
+  /**
+   * @method ChartsController
+   * @param $scope
+   * @param QDRServer
+   * @param QDRChartServer
+   *
+   * Controller that handles the QDR charts page
+   */
+  QDR.module.controller("QDR.ChartsController", ['$scope', 'QDRService', 'QDRChartService', '$uibModal', '$location',
+  function($scope, QDRService, QDRChartService, $uibModal, $location) {
+    var updateTimer = null;
+
+    QDR.log.debug("started Charts controller");
+    if (!angular.isDefined(QDRService.schema))
+        return;
+
+    $scope.svgCharts = [];
+    // create an svg object for each chart
+    QDRChartService.charts.filter(function (chart) {return chart.dashboard}).forEach(function (chart) {
+        var svgChart = new QDRChartService.AreaChart(chart, $location.$$path)
+        svgChart.zoomed = false;
+        $scope.svgCharts.push(svgChart);
+    })
+
+    // redraw the charts every second
+    var updateCharts = function () {
+        $scope.svgCharts.forEach(function (svgChart) {
+            svgChart.tick(svgChart.chart.id()); // on this page we are using the chart.id() as the div id in which to render the chart
+        })
+        updateHandle = setTimeout(updateCharts, 1100);
+    }
+	$scope.chartsLoaded = function () {
+		setTimeout(updateCharts, 0);
+	}
+
+	$scope.zoomChart = function (chart) {
+		chart.zoomed = !chart.zoomed;
+		chart.zoom(chart.chart.id(), chart.zoomed);
+	}
+    $scope.showListPage = function () {
+        $location.path("/list");
+    };
+
+    $scope.hasCharts = function () {
+        return QDRChartService.numCharts() > 0;
+    };
+
+    $scope.editChart = function (chart) {
+        doDialog("chart-config-template.html", chart.chart);
+    };
+
+    $scope.delChart = function (chart) {
+        QDRChartService.unRegisterChart(chart.chart);
+        // remove from svgCharts
+        $scope.svgCharts.forEach(function (svgChart, i) {
+            if (svgChart === chart) {
+                delete $scope.svgCharts.splice(i, 1);
+            }
+        })
+    };
+
+    // called from dialog when we want to clone the dialog chart
+    // the chart argument here is a QDRChartService chart
+    $scope.addChart = function (chart) {
+        $scope.svgCharts.push(new QDRChartService.AreaChart(chart, $location.$$path));
+    };
+
+    $scope.$on("$destroy", function( event ) {
+        if (updateTimer) {
+            cancelTimer(updateTimer);
+            updateTimer = null;
+        }
+        for (var i=$scope.svgCharts.length-1; i>=0; --i) {
+            delete $scope.svgCharts.splice(i, 1);
+        }
+    });
+
+    function doDialog(template, chart) {
+
+	    var modalInstance = $uibModal.open({
+	      animation: true,
+	      templateUrl: template,
+	      controller: 'QDR.ChartDialogController',
+	      resolve: {
+	        chart: function () {
+	          return chart;
+	        },
+	        dashboard: function () {
+	            return $scope;
+	        }
+	      }
+	    });
+    };
+
+  }]);
+
+  QDR.module.controller("QDR.ChartDialogController", function($scope, QDRChartService, $location, $uibModalInstance, $rootScope, chart, dashboard) {
+        var dialogSvgChart = null;
+        $scope.svgDivId = "dialogChart";    // the div id for the svg chart
+
+		$scope.updateTimer = null;
+        $scope.chart = chart;  // the underlying chart object from the dashboard
+        $scope.dialogChart = $scope.chart.copy(); // the chart object for this dialog
+        $scope.userTitle = $scope.chart.title();
+
+        $scope.$watch('userTitle', function(newValue, oldValue) {
+            if (newValue !== oldValue) {
+                $scope.dialogChart.title(newValue);
+            }
+        })
+        // the stored rateWindow is in milliseconds, but the slider is in seconds
+        $scope.rateWindow = $scope.chart.rateWindow / 1000;
+
+		var cleanup = function () {
+			if ($scope.updateTimer) {
+				clearTimeout($scope.updateTimer);
+				$scope.updateTimer = null;
+			}
+			QDRChartService.unRegisterChart($scope.dialogChart);     // remove the chart
+		}
+		$scope.okClick = function () {
+			cleanup();
+	        $uibModalInstance.close();
+	    };
+
+        // initialize the rateWindow slider
+        $scope.slider = {
+            'options': {
+                min: 1,
+                max: 10,
+                step: 1,
+                tick: true,
+                stop: function (event, ui) {
+                    $scope.dialogChart.rateWindow = ui.value * 1000;
+                    if (dialogSvgChart)
+                        dialogSvgChart.tick($scope.svgDivId);
+                }
+            }
+		};
+
+        $scope.visibleDuration =
+        $scope.duration = {
+            'options': {
+                min: 1,
+                max: 10,
+                step: 1,
+                tick: true,
+                stop: function (event, ui) {
+                    if (dialogSvgChart)
+                        dialogSvgChart.tick($scope.svgDivId);
+                }
+            }
+		};
+
+        // handle the Apply button click
+        // update the dashboard chart's properties
+        $scope.apply = function () {
+            $scope.chart.areaColor = $scope.dialogChart.areaColor;
+            $scope.chart.lineColor = $scope.dialogChart.lineColor;
+            $scope.chart.type = $scope.dialogChart.type;
+            $scope.chart.rateWindow = $scope.dialogChart.rateWindow;
+            $scope.chart.title($scope.dialogChart.title());
+            $scope.chart.visibleDuration = $scope.dialogChart.visibleDuration;
+            QDRChartService.saveCharts();
+        }
+
+        // add a new chart to the dashboard based on the current dialog settings
+        $scope.copyToDashboard = function () {
+            var chart = $scope.dialogChart.copy();
+            // set the new chart's dashboard state
+            QDRChartService.addDashboard(chart);
+            // notify the chart controller that it needs to display a new chart
+            dashboard.addChart(chart);
+        }
+
+        // update the chart on the popup dialog
+        var updateDialogChart = function () {
+            // draw the chart using the current data
+            if (dialogSvgChart)
+                dialogSvgChart.tick($scope.svgDivId);
+
+            // draw the chart again in 1 second
+            $scope.updateTimer = setTimeout(updateDialogChart, 1000);
+        }
+
+        var showChart = function () {
+            // ensure the div for our chart is loaded in the dom
+            var div = angular.element("#dialogChart");
+            if (!div.width()) {
+                setTimeout(showChart, 100);
+                return;
+            }
+            dialogSvgChart = new QDRChartService.AreaChart($scope.dialogChart, $location.$$path);
+            updateDialogChart();
+        }
+        showChart();
+
+
+  });
+
+  return QDR;
+
+}(QDR || {}));
+


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[13/19] qpid-dispatch git commit: moved standalone to a subdir

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrCharts.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrCharts.js b/console/plugin/js/qdrCharts.js
deleted file mode 100644
index e484b07..0000000
--- a/console/plugin/js/qdrCharts.js
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-
-  /**
-   * @method ChartsController
-   * @param $scope
-   * @param QDRServer
-   * @param QDRChartServer
-   *
-   * Controller that handles the QDR charts page
-   */
-  QDR.module.controller("QDR.ChartsController", ['$scope', 'QDRService', 'QDRChartService', '$uibModal', '$location',
-  function($scope, QDRService, QDRChartService, $uibModal, $location) {
-    var updateTimer = null;
-
-    QDR.log.debug("started Charts controller");
-    if (!angular.isDefined(QDRService.schema))
-        return;
-
-    $scope.svgCharts = [];
-    // create an svg object for each chart
-    QDRChartService.charts.filter(function (chart) {return chart.dashboard}).forEach(function (chart) {
-        var svgChart = new QDRChartService.AreaChart(chart, $location.$$path)
-        svgChart.zoomed = false;
-        $scope.svgCharts.push(svgChart);
-    })
-
-    // redraw the charts every second
-    var updateCharts = function () {
-        $scope.svgCharts.forEach(function (svgChart) {
-            svgChart.tick(svgChart.chart.id()); // on this page we are using the chart.id() as the div id in which to render the chart
-        })
-        updateHandle = setTimeout(updateCharts, 1100);
-    }
-	$scope.chartsLoaded = function () {
-		setTimeout(updateCharts, 0);
-	}
-
-	$scope.zoomChart = function (chart) {
-		chart.zoomed = !chart.zoomed;
-		chart.zoom(chart.chart.id(), chart.zoomed);
-	}
-    $scope.showListPage = function () {
-        $location.path("/list");
-    };
-
-    $scope.hasCharts = function () {
-        return QDRChartService.numCharts() > 0;
-    };
-
-    $scope.editChart = function (chart) {
-        doDialog("chart-config-template.html", chart.chart);
-    };
-
-    $scope.delChart = function (chart) {
-        QDRChartService.unRegisterChart(chart.chart);
-        // remove from svgCharts
-        $scope.svgCharts.forEach(function (svgChart, i) {
-            if (svgChart === chart) {
-                delete $scope.svgCharts.splice(i, 1);
-            }
-        })
-    };
-
-    // called from dialog when we want to clone the dialog chart
-    // the chart argument here is a QDRChartService chart
-    $scope.addChart = function (chart) {
-        $scope.svgCharts.push(new QDRChartService.AreaChart(chart, $location.$$path));
-    };
-
-    $scope.$on("$destroy", function( event ) {
-        if (updateTimer) {
-            cancelTimer(updateTimer);
-            updateTimer = null;
-        }
-        for (var i=$scope.svgCharts.length-1; i>=0; --i) {
-            delete $scope.svgCharts.splice(i, 1);
-        }
-    });
-
-    function doDialog(template, chart) {
-
-	    var modalInstance = $uibModal.open({
-	      animation: true,
-	      templateUrl: template,
-	      controller: 'QDR.ChartDialogController',
-	      resolve: {
-	        chart: function () {
-	          return chart;
-	        },
-	        dashboard: function () {
-	            return $scope;
-	        }
-	      }
-	    });
-    };
-
-  }]);
-
-  QDR.module.controller("QDR.ChartDialogController", function($scope, QDRChartService, $location, $uibModalInstance, $rootScope, chart, dashboard) {
-        var dialogSvgChart = null;
-        $scope.svgDivId = "dialogChart";    // the div id for the svg chart
-
-		$scope.updateTimer = null;
-        $scope.chart = chart;  // the underlying chart object from the dashboard
-        $scope.dialogChart = $scope.chart.copy(); // the chart object for this dialog
-        $scope.userTitle = $scope.chart.title();
-
-        $scope.$watch('userTitle', function(newValue, oldValue) {
-            if (newValue !== oldValue) {
-                $scope.dialogChart.title(newValue);
-            }
-        })
-        // the stored rateWindow is in milliseconds, but the slider is in seconds
-        $scope.rateWindow = $scope.chart.rateWindow / 1000;
-
-		var cleanup = function () {
-			if ($scope.updateTimer) {
-				clearTimeout($scope.updateTimer);
-				$scope.updateTimer = null;
-			}
-			QDRChartService.unRegisterChart($scope.dialogChart);     // remove the chart
-		}
-		$scope.okClick = function () {
-			cleanup();
-	        $uibModalInstance.close();
-	    };
-
-        // initialize the rateWindow slider
-        $scope.slider = {
-            'options': {
-                min: 1,
-                max: 10,
-                step: 1,
-                tick: true,
-                stop: function (event, ui) {
-                    $scope.dialogChart.rateWindow = ui.value * 1000;
-                    if (dialogSvgChart)
-                        dialogSvgChart.tick($scope.svgDivId);
-                }
-            }
-		};
-
-        $scope.visibleDuration =
-        $scope.duration = {
-            'options': {
-                min: 1,
-                max: 10,
-                step: 1,
-                tick: true,
-                stop: function (event, ui) {
-                    if (dialogSvgChart)
-                        dialogSvgChart.tick($scope.svgDivId);
-                }
-            }
-		};
-
-        // handle the Apply button click
-        // update the dashboard chart's properties
-        $scope.apply = function () {
-            $scope.chart.areaColor = $scope.dialogChart.areaColor;
-            $scope.chart.lineColor = $scope.dialogChart.lineColor;
-            $scope.chart.type = $scope.dialogChart.type;
-            $scope.chart.rateWindow = $scope.dialogChart.rateWindow;
-            $scope.chart.title($scope.dialogChart.title());
-            $scope.chart.visibleDuration = $scope.dialogChart.visibleDuration;
-            QDRChartService.saveCharts();
-        }
-
-        // add a new chart to the dashboard based on the current dialog settings
-        $scope.copyToDashboard = function () {
-            var chart = $scope.dialogChart.copy();
-            // set the new chart's dashboard state
-            QDRChartService.addDashboard(chart);
-            // notify the chart controller that it needs to display a new chart
-            dashboard.addChart(chart);
-        }
-
-        // update the chart on the popup dialog
-        var updateDialogChart = function () {
-            // draw the chart using the current data
-            if (dialogSvgChart)
-                dialogSvgChart.tick($scope.svgDivId);
-
-            // draw the chart again in 1 second
-            $scope.updateTimer = setTimeout(updateDialogChart, 1000);
-        }
-
-        var showChart = function () {
-            // ensure the div for our chart is loaded in the dom
-            var div = angular.element("#dialogChart");
-            if (!div.width()) {
-                setTimeout(showChart, 100);
-                return;
-            }
-            dialogSvgChart = new QDRChartService.AreaChart($scope.dialogChart, $location.$$path);
-            updateDialogChart();
-        }
-        showChart();
-
-
-  });
-
-  return QDR;
-
-}(QDR || {}));
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrList.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrList.js b/console/plugin/js/qdrList.js
deleted file mode 100644
index 7352d82..0000000
--- a/console/plugin/js/qdrList.js
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
-  /**
-   * @method ListController
-   * @param $scope
-   * @param QDRService
-   *
-   * Controller for the main interface
-   */
-	QDR.module.controller("QDR.ListController", ['$scope', '$location', 'uiGridConstants', 'QDRService', 'QDRChartService', '$uibModal',
-		function ($scope, $location, uiGridConstants, QDRService, QDRChartService, $uibModal) {
-
-		//QDR.log.debug("started List controller");
-		if (!angular.isDefined(QDRService.schema))
-			return;
-		$scope.selectedAction = localStorage['QDRSelectedAction'];
-		$scope.selectedNode = localStorage['QDRSelectedNode'];
-		$scope.selectedNodeId = localStorage['QDRSelectedNodeId'];
-		$scope.selectedRecordName = localStorage['QDRSelectedRecordName'];
-
-		var excludedEntities = ["management", "org.amqp.management", "operationalEntity", "entity", "configurationEntity", "dummy", "console"];
-		var aggregateEntities = ["router.address"];
-
-		$scope.entities = [];
-		for (var entity in QDRService.schema.entityTypes) {
-			if (excludedEntities.indexOf(entity) == -1) {
-				$scope.entities.push( {
-					title: angular.isDefined(QDRService.schema.entityTypes[entity].description) ? QDRService.schema.entityTypes[entity].description : '',
-					humanName: QDRService.humanify(entity),
-					name: entity}
-				 );
-			}
-		}
-		if (!angular.isDefined($scope.selectedAction)) {
-			$scope.selectedAction = $scope.entities[0].name;
-			//QDR.log.debug("defaulted selectedAction to " + $scope.selectedAction);
-		}
-
-		$scope.nodes = QDRService.nodeList().sort(function (a, b) { return a.name.toLowerCase() > b.name.toLowerCase()});
-		if (!angular.isDefined($scope.selectedNode)) {
-			//QDR.log.debug("selectedNode was " + $scope.selectedNode);
-			if ($scope.nodes.length > 0) {
-				$scope.selectedNode = $scope.nodes[0].name;
-				$scope.selectedNodeId = $scope.nodes[0].id;
-				//QDR.log.debug("forcing selectedNode to " + $scope.selectedNode);
-			}
-		}
-
-		$scope.isActionActive = function(name) {
-			//QDR.log.debug("isActionActive(" + name + ")  selectedAction is " + $scope.selectedAction);
-			return $scope.selectedAction === name;
-		};
-		$scope.isNodeSelected = function (id) {
-			return $scope.selectedNodeId === id;
-		};
-
-		$scope.selectNode = function(node) {
-			//QDR.log.debug("setting selectedNode to " + node.name);
-			$scope.selectedNode = node.name;
-			$scope.selectedNodeId = node.id;
-			//QDR.log.debug("location is " + $location.url());
-			$location.search('n', node.name);
-		};
-		$scope.selectAction = function(action) {
-			$scope.selectedAction = action;
-			$location.search('a', action);
-			//QDR.log.debug("selectAction called with " + action + "  location is now " + $location.url());
-		};
-
-		$scope.$watch('selectedAction', function(newValue, oldValue) {
-			if (newValue !== oldValue) {
-				localStorage['QDRSelectedAction'] = $scope.selectedAction;
-				//QDR.log.debug("saving selectedAction as " + $scope.selectedAction + " newValue is " + newValue);
-			}
-		})
-		$scope.$watch('selectedNode', function(newValue, oldValue) {
-		    if (newValue !== oldValue) {
-				localStorage['QDRSelectedNode'] = $scope.selectedNode;
-				localStorage['QDRSelectedNodeId'] = $scope.selectedNodeId;
-				//QDR.log.debug("saving selectedNode as " + $scope.selectedNode + " newValue is " + newValue);
-			}
-		})
-		$scope.$watch('selectedRecordName', function(newValue, oldValue) {
-			if (newValue != oldValue) {
-				localStorage['QDRSelectedRecordName'] = $scope.selectedRecordName;
-				//QDR.log.debug("saving selectedRecordName as " + $scope.selectedRecordName);
-			}
-		})
-
-		$scope.tableRows = [];
-		var selectedRowIndex = 0;
-		var updateTableData = function (entity) {
-			var gotNodeInfo = function (nodeName, dotentity, response) {
-				//QDR.log.debug("got results for  " + nodeName);
-				//console.dump(response);
-
-				var records = response.results;
-				var aggregates = response.aggregates;
-				var attributeNames = response.attributeNames;
-				var nameIndex = attributeNames.indexOf("name");
-				var ent = QDRService.schema.entityTypes[entity];
-				var tableRows = [];
-				for (var i=0; i<records.length; ++i) {
-					var record = records[i];
-					var aggregate = aggregates ? aggregates[i] : undefined;
-					var row = {};
-					var rowName;
-					if (nameIndex > -1) {
-						rowName = record[nameIndex];
-					} else {
-						QDR.log.error("response attributeNames did not contain a name field");
-						console.dump(response.attributeNames);
-						return;
-					}
-					if (rowName == $scope.selectedRecordName)
-						selectedRowIndex = i;
-					for (var j=0; j<attributeNames.length; ++j) {
-						var col = attributeNames[j];
-						row[col] = {value: record[j], type: undefined, graph: false, title: '', aggregate: '', aggregateTip: ''};
-						if (ent) {
-							var att = ent.attributes[col];
-							if (att) {
-								row[col].type = att.type;
-								row[col].graph = att.graph;
-								row[col].title = att.description;
-
-								if (aggregate) {
-									if (att.graph) {
-										row[col].aggregate = att.graph ? aggregate[j].sum : '';
-										var tip = [];
-										aggregate[j].detail.forEach( function (line) {
-											tip.push(line);
-										})
-										row[col].aggregateTip = angular.toJson(tip);
-									}
-								}
-							}
-						}
-					}
-					tableRows.push(row);
-				}
-				setTimeout(selectRow, 0, tableRows);
-			}
-
-			// if this entity should show an aggregate column, send the request to get the info for this entity from all the nedes
-			if (aggregateEntities.indexOf(entity) > -1) {
-				var nodeInfo = QDRService.topology.nodeInfo();
-				QDRService.getMultipleNodeInfo(Object.keys(nodeInfo), entity, [], gotNodeInfo, $scope.selectedNodeId);
-			} else {
-				QDRService.getNodeInfo($scope.selectedNodeId, '.' + entity, [], gotNodeInfo);
-			}
-		};
-
-		// tableRows are the records that were returned, this populates the left hand table on the page
-		var selectRow = function (tableRows) {
-			$scope.tableRows = tableRows;
-			// must apply scope here to update the tableRows before selecting the row
-			$scope.$apply();
-            $scope.gridApi.selection.selectRow($scope.tableRows[selectedRowIndex]);
-			fixTooltips();
-		}
-
-		$scope.getTableHeight = function() {
-	       return {height: ($scope.tableRows.length * 30) + "px"};
-	    };
-	    var titleFromAlt = function (alt) {
-			if (alt && alt.length) {
-				var data = angular.fromJson(alt);
-				var table = "<table class='tiptable'><tbody>";
-				data.forEach (function (row) {
-					table += "<tr>";
-					table += "<td>" + row.node + "</td><td align='right'>" + QDRService.pretty(row.val) + "</td>";
-					table += "</tr>"
-				})
-				table += "</tbody></table>"
-				return table;
-			}
-			return '';
-	    }
-		var fixTooltips = function () {
-			if ($('.hastip').length == 0) {
-				setTimeout(fixTooltips, 100);
-				return;
-			}
-			$('.hastip').each( function (i, tip) {
-				var tipset = tip.getAttribute('tipset')
-				if (!tipset) {
-					$(tip).tipsy({html: true, className: 'subTip', opacity: 1, title: function () {
-						return titleFromAlt(this.getAttribute('alt'))
-					} });
-					tip.setAttribute('tipset', true)
-				} else {
-					var title = titleFromAlt(tip.getAttribute('alt'))
-					tip.setAttribute('original-title', title)
-				}
-/*
-				$(tip).tipsy({html: true, className: 'subTip', opacity: 1, title: function () {
-					var alt = this.getAttribute('alt');
-					if (alt && alt.length) {
-						var data = angular.fromJson(alt);
-						var table = "<table class='tiptable'><tbody>";
-						data.forEach (function (row) {
-							table += "<tr>";
-							table += "<td>" + row.node + "</td><td align='right'>" + QDRService.pretty(row.val) + "</td>";
-							table += "</tr>"
-						})
-						table += "</tbody></table>"
-						return table;
-					}
-					return '';
-				} });
-				*/
-			})
-		}
-		$scope.selectedEntity = undefined;
-		for (var i=0; i<$scope.entities.length; ++i) {
-			if ($scope.selectedAction === $scope.entities[i].name) {
-				$scope.selectedEntity = $scope.entities[i].name;
-				break;
-			}
-		}
-		if (!angular.isDefined($scope.selectedEntity)) {
-			$scope.selectedAction = $scope.entities[0].name;
-			$scope.selectedEntity = $scope.entities[0].name;
-		}
-		var savedCharts = angular.fromJson(localStorage['QDRListCharts']);
-		var getCurrentSavedCharts = function () {
-			if (angular.isDefined(savedCharts)) {
-				if (angular.isDefined(savedCharts[$scope.selectedEntity])) {
-					//graphFields = savedCharts[$scope.selectedEntity];
-				}
-			} else {
-				savedCharts = {};
-			}
-		}
-		getCurrentSavedCharts();
-
-		//QDR.log.debug("using entity of " + $scope.selectedEntity);
-		var stop = undefined;
-
-		// The left-hand table that lists the names
-		var gridCols = [
-			{ field: 'name',
-			  displayName: '',
-			  cellTemplate: '<div class="ngCellText"><span ng-cell-text>{{row.entity.name.value}}</span></div>'
-			}
-		];
-		// the table on the left of the page contains the name field for each record that was returned
-		$scope.gridDef = {
-			data: 'tableRows',
-			hideHeader: true,
-			showHeader: false,
-			enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-			enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
-			columnDefs: gridCols,
-			enableColumnResize: true,
-			multiSelect: false,
-			enableRowHeaderSelection: false,
-			noUnselect: true,
-			enableSelectAll: false,
-			enableRowSelection: true,
-			onRegisterApi: function (gridApi) {
-				$scope.gridApi = gridApi;
-				gridApi.selection.on.rowSelectionChanged($scope, function(row) {
-					if (row.isSelected)  {
-						selectedRowIndex = row.rowIndex;
-						$scope.selectedRecordName = row.entity.name.value;
-						var details = [];
-						// for each field in the new row, add a row in the details grid
-						for (var name in row.entity) {
-							details.push( { attributeName: QDRService.humanify(name),
-											attributeValue: QDRService.pretty(row.entity[name].value),
-											type: row.entity[name].type,
-											name: name,
-											rawValue: row.entity[name].value,
-											graph: row.entity[name].graph,
-											title: row.entity[name].title,
-											aggregateValue: QDRService.pretty(row.entity[name].aggregate),
-											aggregateTip: row.entity[name].aggregateTip})
-						}
-						setTimeout(updateDetails, 10, details);
-					}
-				});
-		    }
-		};
-
-		$scope.detailFields = [];
-		updateDetails = function (details) {
-			$scope.detailFields = details;
-			$scope.$apply();
-		}
-
-		$scope.isFieldGraphed = function(rowEntity, aggregate) {
-			var dot = !aggregate ? '.' : '';
-			return QDRChartService.isAttrCharted($scope.selectedNodeId, dot + $scope.selectedEntity, $scope.selectedRecordName, rowEntity.name);
-		}
-
-		$scope.addToGraph = function(rowEntity) {
-			var chart = QDRChartService.registerChart($scope.selectedNodeId, "." + $scope.selectedEntity, $scope.selectedRecordName, rowEntity.name, 1000);
-			doDialog("template-from-script.html", chart);
-			reset();
-		}
-
-		$scope.addAllToGraph = function(rowEntity) {
-			var chart = QDRChartService.registerChart($scope.selectedNodeId,
-						$scope.selectedEntity,
-						$scope.selectedRecordName,
-						rowEntity.name,
-						1000,
-						false,
-						true);
-			doDialog("template-from-script.html", chart);
-			reset();
-		}
-
-		var detailCols = [
-			 {
-				 field: 'attributeName',
-				 cellTemplate: '<div title="{{row.entity.title}}" class="listAttrName">{{row.entity.name}}<i ng-if="row.entity.graph" ng-click="grid.appScope.addToGraph(row.entity)" ng-class="{\'active\': grid.appScope.isFieldGraphed(row.entity, false), \'icon-bar-chart\': row.entity.graph == true }"></i></div>',
-				 displayName: 'Attribute'
-			 },
-			 {
-				 field: 'attributeValue',
-				 displayName: 'Value'
-			 }
-		];
-		if (aggregateEntities.indexOf($scope.selectedEntity) > -1) {
-			detailCols.push(
-			 {
-				 width: '10%',
-				 field: 'aggregateValue',
-				 displayName: 'Aggregate',
-				 cellTemplate: '<div class="hastip" alt="{{row.entity.aggregateTip}}">{{row.entity.aggregateValue}}<i ng-if="row.entity.graph" ng-click="grid.appScope.addAllToGraph(row.entity)" ng-class="{\'active\': grid.appScope.isFieldGraphed(row.entity, true), \'icon-bar-chart\': row.entity.graph == true }"></i></div>',
-				 cellClass: 'aggregate'
-			 }
-			)
-		}
-
-		// the table on the right of the page contains a row for each field in the selected record in the table on the left
-		$scope.details = {
-			data: 'detailFields',
-			columnDefs: detailCols,
-			enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-			enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
-			enableColumnResize: true,
-			multiSelect: false,
-			enableRowHeaderSelection: false,
-			noUnselect: true,
-			enableSelectAll: false,
-			enableRowSelection: true
-		};
-
-		updateTableData($scope.selectedEntity);
-		stop = setInterval(updateTableData, 5000, $scope.selectedEntity);
-		$scope.getDetailsTableHeight = function() {
-	       return {height: ($scope.detailFields.length * 30) + "px"};
-	    };
-
-		$scope.$on("$destroy", function( event ) {
-			//QDR.log.debug("scope destroyed for qdrList");
-			reset();
-			if (angular.isDefined(stop)) {
-				clearInterval(stop);
-				stop = undefined;
-			};
-		});
-
-		var reset = function () {
-			if ($scope.context) {
-				$scope.context.stop();
-				$scope.context = null;
-			}
-		};
-
-		function doDialog(template, chart) {
-
-		    var modalInstance = $uibModal.open({
-		      animation: true,
-		      templateUrl: template,
-		      controller: 'QDR.ListChartController',
-		      resolve: {
-		        chart: function () {
-		          return chart;
-		        }
-		      }
-		    });
-		};
-
-	}]);
-
-
-	QDR.module.controller('QDR.ListChartController', function ($scope, $uibModalInstance, $location, QDRChartService, chart) {
-
-	    $scope.chart = chart;
-		$scope.dialogSvgChart = null;
-		$scope.updateTimer = null;
-		$scope.svgDivId = "dialogChart";    // the div id for the svg chart
-
-		$scope.showChartsPage = function () {
-			cleanup();
-		    $uibModalInstance.close();
-			$location.path("/charts");
-		};
-
-		$scope.addChartsPage = function () {
-			QDRChartService.addDashboard($scope.chart);
-		};
-
-		$scope.delChartsPage = function () {
-			QDRChartService.delDashboard($scope.chart);
-		};
-
-		$scope.isOnChartsPage = function () {
-			return $scope.chart.dashboard;
-		}
-
-		var showChart = function () {
-			// the chart divs are generated by angular and aren't available immediately
-			var div = angular.element("#" + $scope.svgDivId);
-			if (!div.width()) {
-				setTimeout(showChart, 100);
-				return;
-			}
-			dialogSvgChart = new QDRChartService.AreaChart($scope.chart, $location.$$path);
-			$scope.dialogSvgChart = dialogSvgChart;
-			updateDialogChart();
-		}
-		showChart();
-
-		var updateDialogChart = function () {
-			if ($scope.dialogSvgChart)
-				$scope.dialogSvgChart.tick($scope.svgDivId);
-			$scope.updateTimer = setTimeout(updateDialogChart, 1000);
-		}
-
-		var cleanup = function () {
-			if ($scope.updateTimer) {
-				clearTimeout($scope.updateTimer);
-				$scope.updateTimer = null;
-			}
-			if (!$scope.chart.dashboard)
-				QDRChartService.unRegisterChart(chart);     // remove the chart
-
-		}
-		$scope.ok = function () {
-			cleanup();
-	        $uibModalInstance.close();
-	    };
-
-	});
-    return QDR;
-
-} (QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrOverview.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrOverview.js b/console/plugin/js/qdrOverview.js
deleted file mode 100644
index d787a5e..0000000
--- a/console/plugin/js/qdrOverview.js
+++ /dev/null
@@ -1,696 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-
-  /**
-   * @method OverviewController
-   * @param $scope
-   * @param QDRService
-   * @param QDRChartServer
-   * dialogServer
-   * $location
-   *
-   * Controller that handles the QDR overview page
-   */
-	QDR.module.controller("QDR.OverviewController", ['$scope', 'uiGridConstants', 'QDRService', function($scope, uiGridConstants, QDRService) {
-
-
-		if (!angular.isDefined(QDRService.schema))
-		    return;
-
-		var nodeIds = QDRService.nodeIdList();
-		var currentTimer;
-		var refreshInterval = 5000
-		var Folder = (function () {
-            function Folder(title) {
-                this.title = title;
-				this.children = [];
-				this.folder = true;
-            }
-            return Folder;
-        })();
-		var Leaf = (function () {
-            function Leaf(title) {
-                this.title = title;
-            }
-            return Leaf;
-        })();
-	    $scope.modes = [
-	    	{title: 'Overview', name: 'Overview', right: false}
-	    	];
-
-		$scope.templates =
-		    [ { name: 'Routers', url: 'routers.html'},
-		      { name: 'Router', url: 'router.html'},
-              { name: 'Addresses', url: 'addresses.html'},
-		      { name: 'Address', url: 'address.html'},
-              { name: 'Connections', url: 'connections.html'},
-		      { name: 'Connection', url: 'connection.html'},
-              { name: 'Logs', url: 'logs.html'},
-              { name: 'Log', url: 'log.html'} ];
-
-		$scope.getGridHeight = function (data) {
-	       // add 1 for the header row
-	       return {height: (($scope[data.data].length + 1) * 30) + "px"};
-		}
-		$scope.overview = new Folder("Overview");
-
-		$scope.allRouterFields = [];
-		var allRouterCols = [
-			 {
-				 field: 'routerId',
-				 displayName: 'Router'
-			 },
-			 {
-				 field: 'area',
-				 displayName: 'Area'
-			 },
-			 {
-				 field: 'mode',
-				 displayName: 'Mode'
-			 },
-			 {
-				 field: 'connections',
-				 displayName: 'External connections'
-			 },
-             {
-                 field: 'addrCount',
-                 displayName: 'Address count'
-             },
-             {
-                 field: 'linkCount',
-                 displayName: 'Link count'
-             }
-		];
-		$scope.allRouters = {
-			data: 'allRouterFields',
-			columnDefs: allRouterCols,
-			enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
-			enableColumnResize: true,
-			multiSelect: false,
-			enableRowHeaderSelection: false,
-			noUnselect: true,
-			enableSelectAll: false,
-			enableRowSelection: true,
-			onRegisterApi: function (gridApi) {
-				gridApi.selection.on.rowSelectionChanged($scope, function(row) {
-					if (row.isSelected) {
-						var nodeId = row.entity.nodeId;
-						$("#overtree").fancytree("getTree").activateKey(nodeId);
-					}
-				});
-		    }
-		};
-		// get info for all routers
-		var allRouterInfo = function () {
-			nodeIds = QDRService.nodeIdList()
-			var expected = Object.keys(nodeIds).length
-			var received = 0;
-			var allRouterFields = [];
-			var gotNodeInfo = function (nodeName, entity, response) {
-				var results = response.results;
-				var name = QDRService.nameFromId(nodeName)
-				var connections = 0;
-				results.forEach( function (result) {
-					var role = QDRService.valFor(response.attributeNames, result, "role")
-					if (role != 'inter-router') {
-						++connections
-					}
-				})
-				allRouterFields.push({routerId: name, connections: connections, nodeId: nodeName})
-				++received
-				if (expected == received) {
-					allRouterFields.sort ( function (a,b) { return a.routerId < b.routerId ? -1 : a.routerId > b.routerId ? 1 : 0})
-					// now get each router's node info
-					QDRService.getMultipleNodeInfo(nodeIds, "router", [], function (nodeIds, entity, response) {
-						var results = response.aggregates
-						results.forEach ( function (result) {
-
-							var routerId = QDRService.valFor(response.attributeNames, result, "routerId").sum
-							allRouterFields.some( function (connField) {
-								if (routerId === connField.routerId) {
-									response.attributeNames.forEach ( function (attrName) {
-										connField[attrName] = QDRService.valFor(response.attributeNames, result, attrName).sum
-									})
-									return true
-								}
-								return false
-							})
-						})
-						$scope.allRouterFields = allRouterFields
-						$scope.$apply()
-						if (currentTimer) {
-							clearTimeout(currentTimer)
-						}
-						currentTimer = setTimeout(allRouterInfo, refreshInterval);
-					}, nodeIds[0])
-				}
-			}
-			nodeIds.forEach ( function (nodeId) {
-				QDRService.getNodeInfo(nodeId, ".connection", ["role"], gotNodeInfo)
-			})
-
-		}
-
-		// get info for a single router
-		var routerInfo = function (node) {
-			$scope.router = node
-			$scope.routerFields = []
-			var cols = [
-				 {
-					 field: 'attribute',
-					 displayName: 'Attribute',
-					 width: '40%'
-				 },
-				 {
-					 field: 'value',
-					 displayName: 'Value',
-					 width: '40%'
-				 }
-			]
-			$scope.routerGrid = {
-				data: 'routerFields',
-				columnDefs: cols,
-				enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-	            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
-				enableColumnResize: true,
-				multiSelect: false
-			}
-
-			$scope.allRouterFields.some( function (field) {
-				if (field.routerId === node.title) {
-					Object.keys(field).forEach ( function (key) {
-						if (key !== '$$hashKey')
-							$scope.routerFields.push({attribute: key, value: field[key]})
-					})
-					return true
-				}
-			})
-
-			$scope.$apply()
-			if (currentTimer) {
-				clearTimeout(currentTimer)
-				currentTimer = null
-			}
-		}
-
-		// get info for a all addresses
-		var allAddressInfo = function () {
-			$scope.addressFields = []
-			var addressCols = [
-				 {
-					 field: 'address',
-					 displayName: 'address'
-				 },
-				 {
-					 field: 'class',
-					 displayName: 'class'
-				 },
-				 {
-					 field: 'phase',
-					 displayName: 'phase',
-					 cellClass: 'grid-align-value'
-				 },
-				 {
-					 field: 'inproc',
-					 displayName: 'in-proc'
-				 },
-				 {
-					 field: 'local',
-					 displayName: 'local',
-					 cellClass: 'grid-align-value'
-				 },
-				 {
-					 field: 'remote',
-					 displayName: 'remote',
-					 cellClass: 'grid-align-value'
-				 },
-				 {
-					 field: 'in',
-					 displayName: 'in',
-					 cellClass: 'grid-align-value'
-				 },
-				 {
-					 field: 'out',
-					 displayName: 'out',
-					 cellClass: 'grid-align-value'
-				 }
-			]
-			$scope.selectedAddresses = []
-			$scope.addressGrid = {
-				data: 'addressFields',
-				columnDefs: addressCols,
-				enableColumnResize: true,
-				enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-	            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
-				multiSelect: false,
-				enableRowHeaderSelection: false,
-				noUnselect: true,
-				enableSelectAll: false,
-				enableRowSelection: true,
-				onRegisterApi: function (gridApi) {
-					gridApi.selection.on.rowSelectionChanged($scope, function(row) {
-						if (row.isSelected) {
-							var key = row.entity.uid;
-							$("#overtree").fancytree("getTree").activateKey(key);
-						}
-					});
-			    }
-			}
-
-			var gotAllAddressFields = function ( addressFields ) {
-				$scope.addressFields = 	addressFields
-				$scope.$apply()
-				if (currentTimer) {
-					clearTimeout(currentTimer)
-				}
-				currentTimer = setTimeout(allAddressInfo, refreshInterval);
-			}
-			getAllAddressFields(gotAllAddressFields)
-		}
-
-		var getAllAddressFields = function (callback) {
-			var addr_class = function (addr) {
-				if (!addr) return "-"
-		        if (addr[0] == 'M')  return "mobile"
-		        if (addr[0] == 'R')  return "router"
-		        if (addr[0] == 'A')  return "area"
-		        if (addr[0] == 'L')  return "local"
-		        if (addr[0] == 'C')  return "link-incoming"
-		        if (addr[0] == 'D')  return "link-outgoing"
-		        return "unknown: " + addr[0]
-			}
-
-			var addr_text = function (addr) {
-		        if (!addr)
-		            return "-"
-		        if (addr[0] == 'M')
-		            return addr.substring(2)
-		        else
-		            return addr.substring(1)
-			}
-
-			var addr_phase = function (addr) {
-		        if (!addr)
-		            return "-"
-		        if (addr[0] == 'M')
-		            return addr[1]
-		        return ''
-			}
-
-			var identity_clean = function (identity) {
-		        if (!identity)
-		            return "-"
-		        var pos = identity.indexOf('/')
-		        if (pos >= 0)
-		            return identity.substring(pos + 1)
-		        return identity
-			}
-
-			var addressFields = []
-			nodeIds = QDRService.nodeIdList()
-			QDRService.getMultipleNodeInfo(nodeIds, "router.address", [], function (nodeIds, entity, response) {
-				response.aggregates.forEach( function (result) {
-					var prettySum = function (field) {
-						var fieldIndex = response.attributeNames.indexOf(field)
-						if (fieldIndex < 0) {
-							return "-"
-						}
-						var val = result[fieldIndex].sum
-						return QDRService.pretty(val)
-					}
-
-					var uid = QDRService.valFor(response.attributeNames, result, "identity").sum
-					var identity = identity_clean(uid)
-
-					addressFields.push({
-						address: addr_text(identity),
-						'class': addr_class(identity),
-						phase:   addr_phase(identity),
-						inproc:  prettySum("inProcess"),
-						local:   prettySum("subscriberCount"),
-						remote:  prettySum("remoteCount"),
-						'in':    prettySum("deliveriesIngress"),
-						out:     prettySum("deliveriesEgress"),
-						thru:    prettySum("deliveriesTransit"),
-						toproc:  prettySum("deliveriesToContainer"),
-						fromproc:prettySum("deliveriesFromContainer"),
-						uid:     uid
-					})
-				})
-				callback(addressFields)
-			}, nodeIds[0])
-		}
-
-
-		// get info for a all connections
-		var allConnectionInfo = function () {
-			$scope.allConnectionFields = []
-			var allConnectionCols = [
-				 {
-					 field: 'host',
-					 displayName: 'host'
-				 },
-				 {
-					 field: 'container',
-					 displayName: 'container'
-				 },
-				 {
-					 field: 'role',
-					 displayName: 'role'
-				 },
-				 {
-					 field: 'dir',
-					 displayName: 'dir'
-				 },
-				 {
-					 field: 'security',
-					 displayName: 'security'
-				 },
-				 {
-					 field: 'authentication',
-					 displayName: 'authentication'
-				 }
-			]
-			$scope.allConnectionGrid = {
-				data: 'allConnectionFields',
-				columnDefs: allConnectionCols,
-				enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-	            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
-				enableColumnResize: true,
-				multiSelect: false,
-				enableRowHeaderSelection: false,
-				noUnselect: true,
-				enableSelectAll: false,
-				enableRowSelection: true,
-				onRegisterApi: function (gridApi) {
-					gridApi.selection.on.rowSelectionChanged($scope, function(row) {
-						if (row.isSelected) {
-							var host = row.entity.host;
-							$("#overtree").fancytree("getTree").activateKey(host);
-						}
-					});
-			    }
-			}
-			connections.children.forEach( function (connection) {
-				$scope.allConnectionFields.push(connection.fields)
-			})
-			$scope.$apply()
-			if (currentTimer) {
-				clearTimeout(currentTimer)
-				currentTimer = null
-			}
-		}
-
-		// get info for a single address
-		var addressInfo = function (address) {
-			$scope.address = address
-			$scope.addressFields = []
-			var cols = [
-				 {
-					 field: 'attribute',
-					 displayName: 'Attribute',
-					 width: '40%'
-				 },
-				 {
-					 field: 'value',
-					 displayName: 'Value',
-					 width: '40%'
-				 }
-			]
-			$scope.addressGrid = {
-				data: 'addressFields',
-				columnDefs: cols,
-				enableColumnResize: true,
-				enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-	            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
-				multiSelect: false
-			}
-
-			var fields = Object.keys(address.data.fields)
-			fields.forEach( function (field) {
-				if (field != "title" && field != "uid")
-					$scope.addressFields.push({attribute: field, value: address.data.fields[field]})
-			})
-
-			$scope.$apply()
-			if (currentTimer) {
-				clearTimeout(currentTimer)
-				currentTimer = null
-			}
-		}
-
-		// get info for a single connection
-		var connectionInfo = function (connection) {
-			$scope.connection = connection
-			$scope.connectionFields = []
-			var cols = [
-				 {
-					 field: 'attribute',
-					 displayName: 'Attribute',
-					 width: '40%'
-				 },
-				 {
-					 field: 'value',
-					 displayName: 'Value',
-					 width: '40%'
-				 }
-			]
-			$scope.connectionGrid = {
-				data: 'connectionFields',
-				columnDefs: cols,
-				enableColumnResize: true,
-				enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-	            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
-				multiSelect: false
-			}
-
-			var fields = Object.keys(connection.data.fields)
-			fields.forEach( function (field) {
-				$scope.connectionFields.push({attribute: field, value: connection.data.fields[field]})
-			})
-
-			$scope.$apply()
-			if (currentTimer) {
-				clearTimeout(currentTimer)
-				currentTimer = null
-			}
-		}
-
-		// get info for a all logs
-		var allLogInfo = function () {
-		}
-
-		// get info for a single log
-		var logInfo = function (node) {
-			$scope.log = node
-		}
-
-		var activated = function (event, node) {
-			//QDR.log.debug("node activated: " + node.data.title)
-			node = node.node;
-			var type = node.data.type;
-			var template = $scope.templates.filter( function (tpl) {
-				return tpl.name == type;
-			})
-			$scope.template = template[0];
-			// Call the function associated with this type passing in the node that was selected
-			// In dynatree I could save the function to call in the node, but not in FancyTree
-			if (treeTypeMap[type])
-				treeTypeMap[type](node);
-
-			/*if (node.data.info)
-				node.data.info(node)
-			*/
-			$scope.$apply();
-		}
-        $scope.template = $scope.templates[0];
-
-		var routers = new Folder("Routers")
-		routers.type = "Routers"
-		//routers.info = allRouterInfo
-		routers.focus = true
-		routers.expanded = true
-		routers.key = "Routers"
-		$scope.overview.children.push(routers)
-		nodeIds.forEach( function (node) {
-			var name = QDRService.nameFromId(node)
-			var router = new Leaf(name)
-			router.type = "Router"
-			//router.info = routerInfo
-			router.nodeId = node
-			router.key = node
-			routers.children.push(router)
-		})
-
-		var expected = nodeIds.length;
-		var addresses = new Folder("Addresses")
-		addresses.type = "Addresses"
-		//addresses.info = allAddressInfo
-		addresses.key = "Addresses"
-		$scope.overview.children.push(addresses)
-
-		var gotAddressFields = function (addressFields) {
-			addressFields.sort ( function (a,b) { return a.address < b.address ? -1 : a.address > b.address ? 1 : 0})
-			addressFields[0].title = addressFields[0].address
-			for (var i=1; i<addressFields.length; ++i) {
-				if (addressFields[i].address === addressFields[i-1].address) {
-					addressFields[i-1].title = addressFields[i-1].address + " (" + addressFields[i-1]['class'] + ")"
-					addressFields[i].title = addressFields[i].address + " (" + addressFields[i]['class'] + ")"
-				} else
-					addressFields[i].title = addressFields[i].address
-			}
-			addressFields.forEach( function (address) {
-				var a = new Leaf(address.title)
-				//a.info = addressInfo
-				a.key = address.uid
-				a.fields = address
-				a.type = "Address"
-				addresses.children.push(a)
-			} )
-		}
-		getAllAddressFields(gotAddressFields)
-
-
-		var connreceived = 0;
-		var connectionsObj = {}
-		var connections = new Folder("Connections")
-		connections.type = "Connections"
-		//connections.info = allConnectionInfo
-		connections.key = "Connections"
-		$scope.overview.children.push(connections)
-		nodeIds.forEach( function (nodeId) {
-
-			QDRService.getNodeInfo(nodeId, ".connection", [], function (nodeName, entity, response) {
-				response.results.forEach( function (result) {
-
-					var auth = "no_auth"
-					var sasl = QDRService.valFor(response.attributeNames, result, "sasl")
-					if (QDRService.valFor(response.attributeNames, result, "isAuthenticated")) {
-						auth = sasl
-						if (sasl === "ANONYMOUS")
-							auth = "anonymous-user"
-						else {
-							if (sasl === "GSSAPI")
-								sasl = "Kerberos"
-							if (sasl === "EXTERNAL")
-								sasl = "x.509"
-							auth = QDRService.valFor(response.attributeNames, result, "user") + "(" +
-									QDRService.valFor(response.attributeNames, result, "sslCipher") + ")"
-							}
-					}
-
-					var sec = "no-security"
-					if (QDRService.valFor(response.attributeNames, result, "isEncrypted")) {
-						if (sasl === "GSSAPI")
-							sec = "Kerberos"
-						else
-							sec = QDRService.valFor(response.attributeNames, result, "sslProto") + "(" +
-									QDRService.valFor(response.attributeNames, result, "sslCipher") + ")"
-					}
-
-					var host = QDRService.valFor(response.attributeNames, result, "host")
-					connectionsObj[host] = {}
-					response.attributeNames.forEach( function (attribute, i) {
-						connectionsObj[host][attribute] = result[i]
-					})
-					connectionsObj[host].security = sec
-					connectionsObj[host].authentication = auth
-				})
-				++connreceived;
-				if (connreceived == expected) {
-					var allConnections = Object.keys(connectionsObj).sort()
-					allConnections.forEach(function (connection) {
-						var c = new Leaf(connection)
-						c.type = "Connection"
-						c.icon = "ui-icon "
-						c.icon += connectionsObj[connection].role === "inter-router" ? "ui-icon-refresh" : "ui-icon-transfer-e-w"
-						//c.info = connectionInfo
-						c.key = connection
-						c.fields = connectionsObj[connection]
-						c.tooltip = connectionsObj[connection].role === "inter-router" ? "inter-router connection" : "external connection"
-						connections.children.push(c)
-					})
-				}
-			})
-		})
-
-		var logsreceived = 0;
-		var logObj = {}
-		var logs = new Folder("Logs")
-		logs.type = "Logs"
-		//logs.info = allLogInfo
-		logs.key = "Logs"
-		//$scope.overview.children.push(logs)
-		nodeIds.forEach( function (nodeId) {
-			QDRService.getNodeInfo(nodeId, ".log", ["name"], function (nodeName, entity, response) {
-				response.results.forEach( function (result) {
-					logObj[result[0]] = 1    // use object to collapse duplicates
-				})
-				++logsreceived;
-				if (logsreceived == expected) {
-					var allLogs = Object.keys(logObj).sort()
-					allLogs.forEach(function (log) {
-						var l = new Leaf(log)
-						l.type = "Log"
-						//l.info = logInfo
-						l.key = log
-						logs.children.push(l)
-					})
-					//console.log("---------------")
-					//console.dump($scope.overview.children)
-					//console.log("---------------")
-					$("#overtree").fancytree({
-						activate: activated,
-						clickFolderMode: 1,
-						source: $scope.overview.children
-						})
-					allRouterInfo();
-				}
-			})
-		})
-
-        $scope.$on("$destroy", function( event ) {
-			if (currentTimer) {
-				clearTimeout(currentTimer)
-				currentTimer = null;
-			}
-        });
-		var treeTypeMap = {
-			Routers:     allRouterInfo,
-			Router:      routerInfo,
-			Addresses:   allAddressInfo,
-			Address:     addressInfo,
-			Connections: allConnectionInfo,
-			Connection:  connectionInfo
-		}
-
-    }]);
-
-  return QDR;
-
-}(QDR || {}));
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrPlugin.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrPlugin.js b/console/plugin/js/qdrPlugin.js
deleted file mode 100644
index 3d14f72..0000000
--- a/console/plugin/js/qdrPlugin.js
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- * @main QDR
- *
- * The main entrypoint for the QDR module
- *
- */
-var QDR = (function(QDR) {
-
-  /**
-   * @property pluginName
-   * @type {string}
-   *
-   * The name of this plugin
-   */
-  QDR.pluginName = "QDR";
-
-  /**
-   * @property log
-   * @type {Logging.Logger}
-   *
-   * This plugin's logger instance
-   */
-  //HIO QDR.log = Logger.get(QDR.pluginName);
-  /**
-   * @property templatePath
-   * @type {string}
-   *
-   * The top level path to this plugin's partials
-   */
-  QDR.srcBase = "../dispatch/plugin/";
-  QDR.templatePath = QDR.srcBase + "html/";
-  QDR.cssPath = QDR.srcBase + "css/";
-
-  /**
-   * @property SETTINGS_KEY
-   * @type {string}
-   *
-   * The key used to fetch our settings from local storage
-   */
-  QDR.SETTINGS_KEY = 'QDRSettings';
-  QDR.LAST_LOCATION = "QDRLastLocation";
-
-  /**
-   * @property module
-   * @type {object}
-   *
-   * This plugin's angularjs module instance
-   */
-  QDR.module = angular.module(QDR.pluginName, ['ngAnimate', 'ngResource', 'ngRoute', 'ui.grid', 'ui.grid.selection',
-    'ui.grid.autoResize', 'jsonFormatter', 'ui.bootstrap', 'ui.slider'/*, 'minicolors' */]);
-
-  // set up the routing for this plugin
-  QDR.module.config(function($routeProvider) {
-    $routeProvider
-      .when('/', {
-        templateUrl: QDR.templatePath + 'qdrConnect.html'
-        })
-      .when('/overview', {
-          templateUrl: QDR.templatePath + 'qdrOverview.html'
-        })
-      .when('/topology', {
-          templateUrl: QDR.templatePath + 'qdrTopology.html'
-        })
-      .when('/list', {
-          templateUrl: QDR.templatePath + 'qdrList.html'
-        })
-      .when('/schema', {
-          templateUrl: QDR.templatePath + 'qdrSchema.html'
-        })
-      .when('/charts', {
-          templateUrl: QDR.templatePath + 'qdrCharts.html'
-        })
-      .when('/connect', {
-          templateUrl: QDR.templatePath + 'qdrConnect.html'
-        })
-  });
-
-  QDR.module.config(['$compileProvider', function ($compileProvider) {
-	var cur = $compileProvider.aHrefSanitizationWhitelist();
-    $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|blob):/);
-	cur = $compileProvider.aHrefSanitizationWhitelist();
-  }]);
-
-	QDR.module.config(function (JSONFormatterConfigProvider) {
-		// Enable the hover preview feature
-        JSONFormatterConfigProvider.hoverPreviewEnabled = true;
-	});
-
-	QDR.module.filter('to_trusted', ['$sce', function($sce){
-          return function(text) {
-              return $sce.trustAsHtml(text);
-          };
-    }]);
-
-	QDR.module.filter('humanify', function (QDRService) {
-		return function (input) {
-			return QDRService.humanify(input);
-		};
-	});
-
-	QDR.logger = function ($log) {
-		var log = $log;
-
-		this.debug = function (msg) { msg = "QDR: " + msg; log.debug(msg)};
-		this.error = function (msg) {msg = "QDR: " + msg; log.error(msg)}
-		this.info = function (msg) {msg = "QDR: " + msg; log.info(msg)}
-		this.warn = function (msg) {msg = "QDR: " + msg; log.warn(msg)}
-
-		return this;
-	}
-    // one-time initialization happens in the run function
-    // of our module
-	QDR.module.run( ["$rootScope", "$location", "$log", "QDRService", "QDRChartService",  function ($rootScope, $location, $log, QDRService, QDRChartService) {
-		QDR.log = new QDR.logger($log);
-		QDR.log.debug("QDR.module.run()")
-
-		QDRService.initProton();
-		var settings = angular.fromJson(localStorage[QDR.SETTINGS_KEY]);
-		var lastLocation = localStorage[QDR.LAST_LOCATION];
-		if (!angular.isDefined(lastLocation))
-			lastLocation = "/overview";
-
-		QDRService.addConnectAction(function() {
-			QDRChartService.init(); // initialize charting service after we are connected
-		});
-		if (settings && settings.autostart) {
-			QDRService.addConnectAction(function() {
-				$location.path(lastLocation);
-				$location.replace();
-				$rootScope.$apply();
-			});
-			QDRService.connect(settings);
-        } else {
-			setTimeout(function () {
-	            $location.url('/connect')
-				$location.replace();
-			}, 100)
-        }
-
-        $rootScope.$on('$routeChangeSuccess', function() {
-            localStorage[QDR.LAST_LOCATION] = $location.$$path;
-        });
-
-
-	}]);
-
-	QDR.module.controller ("QDR.MainController", ['$scope', '$location', function ($scope, $location) {
-		QDR.log.debug("started QDR.MainController with location.url: " + $location.url());
-		QDR.log.debug("started QDR.MainController with window.location.pathname : " + window.location.pathname);
-		$scope.topLevelTabs = [];
-		$scope.topLevelTabs.push({
-			id: "qdr",
-			content: "Qpid Dispatch Router Console",
-			title: "Dispatch Router Console",
-			isValid: function() { return true; },
-			href: function() { return "#connect"; },
-			isActive: function() { return true; }
-		});
-	}])
-
-	QDR.module.controller ("QDR.Core", function ($scope, $rootScope) {
-		$scope.alerts = [];
-		$scope.closeAlert = function(index) {
-            $scope.alerts.splice(index, 1);
-        };
-		$scope.$on('newAlert', function(event, data) {
-			$scope.alerts.push(data);
-			$scope.$apply();
-		});
-		$scope.$on("clearAlerts", function () {
-			$scope.alerts = [];
-			$scope.$apply();
-		})
-
-	})
-
-  return QDR;
-}(QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrSchema.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrSchema.js b/console/plugin/js/qdrSchema.js
deleted file mode 100644
index 0e94351..0000000
--- a/console/plugin/js/qdrSchema.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-
-    QDR.module.controller("QDR.SchemaController", ['$scope', 'QDRService', function($scope, QDRService) {
-
-        $scope.schema = QDRService.schema;
-
-    }]);
-
-    return QDR;
-}(QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrService.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrService.js b/console/plugin/js/qdrService.js
deleted file mode 100644
index 47029d7..0000000
--- a/console/plugin/js/qdrService.js
+++ /dev/null
@@ -1,742 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
-  // The QDR service handles the connection to
-  // the server in the background
-  QDR.module.factory("QDRService", ['$rootScope', '$http', '$resource', '$location', function($rootScope, $http, $resource, $location) {
-    var self = {
-
-	  rhea: require("rhea"),
-
-      timeout: 10,
-      connectActions: [],
-      disconnectActions: [],
-      updatedActions: {},
-      stop: undefined,  // update interval handle
-
-      addConnectAction: function(action) {
-        if (angular.isFunction(action)) {
-          self.connectActions.push(action);
-        }
-      },
-      addDisconnectAction: function(action) {
-        if (angular.isFunction(action)) {
-          self.disconnectActions.push(action);
-        }
-      },
-      addUpdatedAction: function(key, action) {
-        if (angular.isFunction(action)) {
-            self.updatedActions[key] = action;
-        }
-      },
-      delUpdatedAction: function(key) {
-        if (key in self.updatedActions)
-            delete self.updatedActions[key];
-      },
-
-      executeConnectActions: function() {
-        self.connectActions.forEach(function(action) {
-          //QDR.log.debug("executing connect action " + action);
-          action.apply();
-        });
-        self.connectActions = [];
-      },
-      executeDisconnectActions: function() {
-        self.disconnectActions.forEach(function(action) {
-          action.apply();
-        });
-        self.disconnectActions = [];
-      },
-      executeUpdatedActions: function() {
-        for (action in self.updatedActions) {
-            self.updatedActions[action].apply();
-        }
-      },
-
-      notifyTopologyDone: function() {
-        //QDR.log.debug("got Toplogy done notice");
-
-        if (!angular.isDefined(self.schema))
-            return;
-        else if (self.topology._gettingTopo)
-            return;
-        if (!self.gotTopology) {
-            QDR.log.debug("topology was just initialized");
-            self.gotTopology = true;
-            self.executeConnectActions();
-            $rootScope.$apply();
-        } else {
-            QDR.log.debug("topology model was just updated");
-            self.executeUpdatedActions();
-        }
-
-      },
-      /**
-       * @property options
-       * Holds a reference to the connection options when
-       * a connection is started
-       */
-      options: undefined,
-
-      /*
-       * @property message
-       * The proton message that is used to send commands
-       * and receive responses
-       */
-		sender: undefined,
-		receiver: undefined,
-		sendable: false,
-
-      schema: undefined,
-
-      toAddress: undefined,
-      connected: false,
-      gotTopology: false,
-      errorText: undefined,
-	  connectionError: undefined,
-
-      isConnected: function() {
-        return self.gotTopology;
-      },
-
-    correlator: {
-        _objects: {},
-        _corremationID: 0,
-
-        corr: function () {
-            var id = ++this._corremationID + "";
-			this._objects[id] = {resolver: null}
-            return id;
-        },
-        request: function() {
-            //QDR.log.debug("correlator:request");
-            return this;
-        },
-        then: function(id, resolver, error) {
-            //QDR.log.debug("registered then resolver for correlationID: " + id);
-			if (error) {
-	            delete this._objects[id];
-				return;
-			}
-            this._objects[id].resolver = resolver;
-        },
-        // called by receiver's on('message') handler when a response arrives
-        resolve: function(context) {
-			var correlationID = context.message.properties.correlation_id;
-            this._objects[correlationID].resolver(context.message.body);
-            delete this._objects[correlationID];
-        }
-    },
-    
-    onSubscription: function() {
-        self.getSchema();
-        self.topology.get();
-     },
-
-    startUpdating: function () {
-        QDR.log.info("startUpdating called")
-        self.stopUpdating();
-        self.topology.get();
-        self.stop = setInterval(function() {
-            self.topology.get();
-        }, 2000);
-    },
-    stopUpdating: function () {
-        if (angular.isDefined(self.stop)) {
-            QDR.log.info("stoptUpdating called")
-            clearInterval(self.stop);
-            self.stop = undefined;
-        }
-    },
-
-      initProton: function() {
-        //QDR.log.debug("*************QDR init proton called ************");
-      },
-      cleanUp: function() {
-      },
-      error: function(line) {
-        if (line.num) {
-          QDR.log.debug("error - num: ", line.num, " message: ", line.message);
-        } else {
-          QDR.log.debug("error - message: ", line.message);
-        }
-      },
-      disconnected: function(line) {
-        QDR.log.debug("Disconnected from QDR server");
-        self.executeDisconnectActions();
-      },
-
-      nameFromId: function (id) {
-		return id.split('/')[3];
-      },
-
-      humanify: function (s) {
-          var t = s.charAt(0).toUpperCase() + s.substr(1).replace(/[A-Z]/g, ' $&');
-          return t.replace(".", " ");
-      },
-	  pretty: function(v) {
-    	var formatComma = d3.format(",");
-		if (!isNaN(parseFloat(v)) && isFinite(v))
-			return formatComma(v);
-		return v;
-	  },
-
-      nodeNameList: function() {
-        var nl = [];
-        // if we are in the middel of updating the topology
-        // then use the last known node info
-        var ni = self.topology._nodeInfo;
-        if (self.topology._gettingTopo)
-            ni = self.topology._lastNodeInfo;
-		for (var id in ni) {
-            nl.push(self.nameFromId(id));
-        }
-        return nl.sort();
-      },
-
-      nodeIdList: function() {
-        var nl = [];
-        // if we are in the middel of updating the topology
-        // then use the last known node info
-        var ni = self.topology._nodeInfo;
-        if (self.topology._gettingTopo)
-            ni = self.topology._lastNodeInfo;
-		for (var id in ni) {
-            nl.push(id);
-        }
-        return nl.sort();
-      },
-
-      nodeList: function () {
-        var nl = [];
-        var ni = self.topology._nodeInfo;
-        if (self.topology._gettingTopo)
-            ni = self.topology._lastNodeInfo;
-		for (var id in ni) {
-            nl.push({name: self.nameFromId(id), id: id});
-        }
-        return nl;
-      },
-
-      // given an attribute name array, find the value at the same index in the values array
-      valFor: function (aAr, vAr, key) {
-          var idx = aAr.indexOf(key);
-          if ((idx > -1) && (idx < vAr.length)) {
-              return vAr[idx];
-          }
-          return null;
-      },
-
-      /*
-       * send the management messages that build up the topology
-       *
-       *
-       */
-      topology: {
-        _gettingTopo: false,
-        _nodeInfo: {},
-        _lastNodeInfo: {},
-        _expected: {},
-        _timerHandle: null,
-
-        nodeInfo: function () {
-            return this._gettingTopo ? this._lastNodeInfo : this._nodeInfo;
-        },
-
-        get: function () {
-            if (this._gettingTopo)
-                return;
-            if (!self.connected) {
-				QDR.log.debug("topology get failed because !self.connected")
-                return;
-            }
-            this._lastNodeInfo = angular.copy(this._nodeInfo);
-            this._gettingTopo = true;
-
-            self.errorText = undefined;
-            this.cleanUp(this._nodeInfo);
-            this._nodeInfo = {};
-            this._expected = {};
-
-            // get the list of nodes to query.
-            // once this completes, we will get the info for each node returned
-            self.getRemoteNodeInfo( function (response) {
-                //QDR.log.debug("got remote node list of ");
-                //console.dump(response);
-                if( Object.prototype.toString.call( response ) === '[object Array]' ) {
-                    // we expect a response for each of these nodes
-                    self.topology.wait(self.timeout);
-                    for (var i=0; i<response.length; ++i) {
-                        self.makeMgmtCalls(response[i]);
-                    }
-                };
-            });
-        },
-
-        cleanUp: function (obj) {
-/*
-            for (var o in obj) {
-                QDR.log.debug("cleaning up");
-                console.dump(obj[o]);
-                if (isNaN(parseInt(o)))
-                    this.cleanUp(obj[o]);
-            }
-*/
-            if (obj)
-                delete obj;
-        },
-        wait: function (timeout) {
-            this.timerHandle = setTimeout(this.timedOut, timeout * 1000);
-         },
-        timedOut: function () {
-        // a node dropped out. this happens when the get-mgmt-nodex
-        // results contains more nodes than actually respond within
-        // the timeout. However, if the responses we get don't contain
-        // the missing node, assume we are done.
-            QDR.log.debug("timed out waiting for management responses");
-            // note: can't use 'this' in a timeout handler
-            self.topology.dump("state at timeout");
-            // check if _nodeInfo is consistent
-            if (self.topology.isConsistent()) {
-                //TODO: notify controllers which node was dropped
-                // so they can keep an event log
-                self.topology.ondone();
-                return;
-            }
-            self.topology.onerror(Error("Timed out waiting for management responses"));
-        },
-        isConsistent: function () {
-            // see if the responses we have so far reference any nodes
-            // for which we don't have a response
-            var gotKeys = {};
-            for (var id in this._nodeInfo) {
-                var onode = this._nodeInfo[id];
-                var conn = onode['.connection'];
-                // get list of node names in the connection data
-                if (conn) {
-                    var containerIndex = conn.attributeNames.indexOf('container');
-                    var connectionResults = conn.results;
-                    if (containerIndex >= 0)
-                        for (var j=0; j < connectionResults.length; ++j) {
-                            // inter-router connection to a valid dispatch connection name
-                            gotKeys[connectionResults[j][containerIndex]] = ""; // just add the key
-                        }
-                }
-            }
-            // gotKeys now contains all the container names that we have received
-            // Are any of the keys that are still expected in the gotKeys list?
-            var keys = Object.keys(gotKeys);
-            for (var id in this._expected) {
-                var key = self.nameFromId(id);
-                if (key in keys)
-                    return false;
-            }
-            return true;
-        },
-            
-        addNodeInfo: function (id, entity, values) {
-            // save the results in the nodeInfo object
-            if (id) {
-                if (!(id in self.topology._nodeInfo)) {
-                    self.topology._nodeInfo[id] = {};
-                }
-                self.topology._nodeInfo[id][entity] = values;
-            }
-  
-            // remove the id / entity from _expected
-            if (id in self.topology._expected) {
-                var entities = self.topology._expected[id];
-                var idx = entities.indexOf(entity);
-                if (idx > -1) {
-                    entities.splice(idx, 1);
-                    if (entities.length == 0)
-                        delete self.topology._expected[id];
-                }
-            }
-            // see if the expected obj is empty
-            if (Object.getOwnPropertyNames(self.topology._expected).length == 0)
-                self.topology.ondone();
-            self.topology.cleanUp(values);
-        },
-        expect: function (id, key) {
-            if (!key || !id)
-                return;
-            if (!(id in this._expected))
-                this._expected[id] = [];
-            if (this._expected[id].indexOf(key) == -1)
-                this._expected[id].push(key);
-        },
-/*
-The response looks like:
-{
-    ".router": {
-        "results": [
-            [4, "router/QDR.X", 1, "0", 3, 60, 60, 11, "QDR.X", 30, "interior", "org.apache.qpid.dispatch.router", 5, 12, "router/QDR.X"]
-        ],
-        "attributeNames": ["raIntervalFlux", "name", "helloInterval", "area", "helloMaxAge", "mobileAddrMaxAge", "remoteLsMaxAge", "addrCount", "routerId", "raInterval", "mode", "type", "nodeCount", "linkCount", "identity"]
-    },
-    ".connection": {
-        "results": [
-            ["QDR.B", "connection/0.0.0.0:20002", "operational", "0.0.0.0:20002", "inter-router", "connection/0.0.0.0:20002", "ANONYMOUS", "org.apache.qpid.dispatch.connection", "out"],
-            ["QDR.A", "connection/0.0.0.0:20001", "operational", "0.0.0.0:20001", "inter-router", "connection/0.0.0.0:20001", "ANONYMOUS", "org.apache.qpid.dispatch.connection", "out"],
-            ["b2de2f8c-ef4a-4415-9a23-000c2f86e85d", "connection/localhost:33669", "operational", "localhost:33669", "normal", "connection/localhost:33669", "ANONYMOUS", "org.apache.qpid.dispatch.connection", "in"]
-        ],
-        "attributeNames": ["container", "name", "state", "host", "role", "identity", "sasl", "type", "dir"]
-    },
-    ".router.node": {
-        "results": [
-            ["QDR.A", null],
-            ["QDR.B", null],
-            ["QDR.C", "QDR.A"],
-            ["QDR.D", "QDR.A"],
-            ["QDR.Y", "QDR.A"]
-        ],
-        "attributeNames": ["routerId", "nextHop"]
-    }
-}*/
-        ondone: function () {
-            clearTimeout(this.timerHandle);
-            this._gettingTopo = false;
-            //this.miniDump();
-            //this.dump();
-            self.notifyTopologyDone();
-
-         },
-         dump: function (prefix) {
-            if (prefix)
-                QDR.log.debug(prefix);
-            QDR.log.debug("---");
-            for (var key in this._nodeInfo) {
-                QDR.log.debug(key);
-                console.dump(this._nodeInfo[key]);
-                QDR.log.debug("---");
-            }
-            QDR.log.debug("was still expecting:");
-            console.dump(this._expected);
-        },
-         miniDump: function (prefix) {
-            if (prefix)
-                QDR.log.debug(prefix);
-            QDR.log.debug("---");
-            console.dump(Object.keys(this._nodeInfo));
-            QDR.log.debug("---");
-        },
-        onerror: function (err) {
-            this._gettingTopo = false;
-            QDR.log.debug("Err:" + err);
-            self.executeDisconnectActions();
-
-        }
-
-      },
-
-      getRemoteNodeInfo: function (callback) {
-	 	//QDR.log.debug("getRemoteNodeInfo called");
-        var ret;
-        // first get the list of remote node names
-	 	self.correlator.request(
-                ret = self.sendMgmtQuery('GET-MGMT-NODES')
-            ).then(ret.id, function(response) {
-                callback(response);
-                self.topology.cleanUp(response);
-            }, ret.error);
-      },
-
-      makeMgmtCalls: function (id) {
-            var keys = [".router", ".connection", ".container", ".router.node", ".listener", ".router.link"];
-            $.each(keys, function (i, key) {
-                self.topology.expect(id, key);
-                self.getNodeInfo(id, key, [], self.topology.addNodeInfo);
-            });
-      },
-
-      getNodeInfo: function (nodeName, entity, attrs, callback) {
-        //QDR.log.debug("getNodeInfo called with nodeName: " + nodeName + " and entity " + entity);
-        var ret;
-        self.correlator.request(
-            ret = self.sendQuery(nodeName, entity, attrs)
-        ).then(ret.id, function(response) {
-            // TODO: file a bug against rhea - large numbers are coming back as Uint8Array
-			response.results.forEach( function (result) {
-				result.forEach( function (val, i) {
-					if (val instanceof Uint8Array) {
-						var ua2num = function(ua) {
-	                        var n = 0;
-	                        for (var i = 0; i<ua.length; i++) {
-	                            n *= 256;
-	                            n += ua[i];
-	                        }
-	                        return n;
-	                    }
-	                    result[i] = ua2num(val);
-					}
-				})
-			})
-            callback(nodeName, entity, response);
-            //self.topology.addNodeInfo(nodeName, entity, response);
-            //self.topology.cleanUp(response);
-        }, ret.error);
-      },
-
-		getMultipleNodeInfo: function (nodeNames, entity, attrs, callback, selectedNodeId) {
-			var responses = {};
-			var gotNodesResult = function (nodeName, dotentity, response) {
-				responses[nodeName] = response;
-				if (Object.keys(responses).length == nodeNames.length) {
-					aggregateNodeInfo(nodeNames, entity, responses, callback);
-				}
-			}
-
-			var aggregateNodeInfo = function (nodeNames, entity, responses, callback) {
-				//QDR.log.debug("got all results for  " + entity);
-				// aggregate the responses
-				var newResponse = {};
-				var thisNode = responses[selectedNodeId];
-				newResponse['attributeNames'] = thisNode.attributeNames;
-				newResponse['results'] = thisNode.results;
-				newResponse['aggregates'] = [];
-				for (var i=0; i<thisNode.results.length; ++i) {
-					var result = thisNode.results[i];
-					var vals = [];
-					result.forEach( function (val) {
-						vals.push({sum: val, detail: []})
-					})
-					newResponse.aggregates.push(vals);
-				}
-				var nameIndex = thisNode.attributeNames.indexOf("name");
-				var ent = self.schema.entityTypes[entity];
-				var ids = Object.keys(responses);
-				ids.sort();
-				ids.forEach( function (id) {
-					var response = responses[id];
-					var results = response.results;
-					results.forEach( function (result) {
-						// find the matching result in the aggregates
-						var found = newResponse.aggregates.some( function (aggregate, j) {
-							if (aggregate[nameIndex].sum === result[nameIndex]) {
-								// result and aggregate are now the same record, add the graphable values
-								newResponse.attributeNames.forEach( function (key, i) {
-									if (ent.attributes[key] && ent.attributes[key].graph) {
-										if (id != selectedNodeId)
-											aggregate[i].sum += result[i];
-										aggregate[i].detail.push({node: self.nameFromId(id)+':', val: result[i]})
-									}
-								})
-								return true; // stop looping
-							}
-							return false; // continute looking for the aggregate record
-						})
-						if (!found) {
-							// this attribute was not found in the aggregates yet
-							// because it was not in the selectedNodeId's results
-							var vals = [];
-							result.forEach( function (val) {
-								vals.push({sum: val, detail: []})
-							})
-							newResponse.aggregates.push(vals)
-						}
-					})
-				})
-				callback(nodeNames, entity, newResponse);
-			}
-
-			nodeNames.forEach( function (id) {
-	            self.getNodeInfo(id, '.'+entity, attrs, gotNodesResult);
-	        })
-			//TODO: implement a timeout in case not all requests complete
-		},
-
-      getSchema: function () {
-        //QDR.log.debug("getting schema");
-        var ret;
-        self.correlator.request(
-            ret = self.sendMgmtQuery('GET-SCHEMA')
-        ).then(ret.id, function(response) {
-            //QDR.log.debug("Got schema response");
-			self.schema = response;
-            //self.schema = angular.copy(response);
-            //self.topology.cleanUp(response);
-            self.notifyTopologyDone();
-        }, ret.error);
-      },
-
-    sendQuery: function(toAddr, entity, attrs) {
-        var toAddrParts = toAddr.split('/');
-        if (toAddrParts.shift() != "amqp:") {
-            self.topology.error(Error("unexpected format for router address: " + toAddr));
-            return;
-        }
-        var fullAddr =  self.toAddress + "/" + toAddrParts.join('/');
-
-		var body;
-        if (attrs)
-            body = {
-                    "attributeNames": attrs,
-            }
-        else
-            body = {
-                "attributeNames": [],
-            }
-
-		return self._send(body, fullAddr, "QUERY", "org.apache.qpid.dispatch" + entity);
-    },
-
-    sendMgmtQuery: function (operation) {
-		// TODO: file bug against dispatch - We should be able to just pass body: [], but that generates an 'invalid body'
-		return self._send([' '], self.toAddress + "/$management", operation);
-    },
-
-	_send: function (body, to, operation, entityType) {
-		var ret = {id: self.correlator.corr()};
-		if (!self.sender || !self.sendable) {
-			ret.error = "no sender"
-			return ret;
-		}
-		try {
-			var application_properties = {
-				operation:  operation,
-                type:       "org.amqp.management",
-                name:       "self"
-            };
-			if (entityType)
-                application_properties.entityType = entityType;
-
-	        self.sender.send({
-	                body: body,
-	                properties: {
-	                    to:                     to,
-                        reply_to:               self.receiver.remote.attach.source.address,
-	                    correlation_id:         ret.id
-	                },
-	                application_properties: application_properties
-            })
-		}
-		catch (e) {
-			error = "error sending: " + e;
-			QDR.log.error(error)
-			ret.error = error;
-		}
-		return ret;
-	},
-
-      disconnect: function() {
-        self.connection.close();
-      },
-
-      connect: function(options) {
-        self.options = options;
-        self.topologyInitialized = false;
-		if (!self.connected) {
-			var okay = {connection: false, sender: false, receiver: false}
-            var port = options.port || 5673;
-            var baseAddress = options.address + ':' + port;
-			var ws = self.rhea.websocket_connect(WebSocket);
-			self.toAddress = "amqp://" + baseAddress;
-			self.connectionError = undefined;
-
-			var stop = function (context) {
-				//self.stopUpdating();
-				if (self.connected) {
-				    $rootScope.$broadcast('newAlert', { type: 'danger', msg: 'Connection to ' + baseAddress + " was lost. Retrying..." });
-				}
-				okay.sender = false;
-				okay.receiver = false;
-				okay.connected = false;
-				self.connected = false;
-				self.sender = null;
-				self.receiver = null;
-				self.sendable = false;
-			}
-
-			var maybeStart = function () {
-				if (okay.connection && okay.sender && okay.receiver && self.sendable && !self.connected) {
-					QDR.log.info("okay to start")
-					self.connected = true;
-					self.connection = connection;
-					self.sender = sender;
-					self.receiver = receiver;
-					self.onSubscription();
-					$rootScope.$broadcast("clearAlerts");
-				}
-			}
-
-			QDR.log.debug("****** calling rhea.connect ********")
-            var connection = self.rhea.connect({
-                    connection_details:ws('ws://' + baseAddress),
-                    reconnect:true,
-                    properties: {console_identifier: 'Dispatch console'}
-            });
-			connection.on('connection_open', function (context) {
-				QDR.log.debug("connection_opened")
-				okay.connection = true;
-				okay.receiver = false;
-				okay.sender = false;
-			})
-			connection.on('disconnected', function (context) {
-				QDR.log.warn("disconnected");
-				stop();
-				self.errorText = "Error: Connection failed."
-				self.executeDisconnectActions();
-				self.connectionError = true;
-			})
-			connection.on('connection_close', function (context) { QDR.log.warn("connection_close"); stop()})
-
-			var sender = connection.open_sender("/$management");
-			sender.on('sender_open', function (context) {
-				QDR.log.debug("sender_opened")
-				okay.sender = true
-				maybeStart()
-			})
-			sender.on('sendable', function (context) {
-				//QDR.log.debug("sendable")
-				self.sendable = true;
-				maybeStart();
-			})
-
-			var receiver = connection.open_receiver({source: {dynamic: true}});
-			receiver.on('receiver_open', function (context) {
-				QDR.log.debug("receiver_opened")
-				okay.receiver = true;
-				maybeStart()
-			})
-			receiver.on("message", function (context) {
-				self.correlator.resolve(context);
-			});
-
-		}
-      }
-    }
-      return self;
-  }]);
-
-  return QDR;
-}(QDR || {}));
-
-(function() {
-    console.dump = function(object) {
-        if (window.JSON && window.JSON.stringify)
-            console.log(JSON.stringify(object));
-        else
-            console.log(object);
-    };
-})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrSettings.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrSettings.js b/console/plugin/js/qdrSettings.js
deleted file mode 100644
index 950e1c5..0000000
--- a/console/plugin/js/qdrSettings.js
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-
-  /**
-   * @method SettingsController
-   * @param $scope
-   * @param QDRServer
-   *
-   * Controller that handles the QDR settings page
-   */
-  QDR.module.controller("QDR.SettingsController", ['$scope', 'QDRService', '$location', function($scope, QDRService, $location) {
-
-    $scope.connecting = false;
-    $scope.connectionError = false;
-    $scope.connectionErrorText = undefined;
-    $scope.forms = {};
-
-    $scope.formEntity = angular.fromJson(localStorage[QDR.SETTINGS_KEY]) || {address: '', port: '', username: '', password: '', autostart: false};
-    $scope.formConfig = {
-      properties: {
-        address: {
-          description: "Router address",
-          'type': 'java.lang.String',
-          required: true
-        },
-        port: {
-          description: 'Router port',
-          'type': 'Integer',
-          tooltip: 'Ports to connect to, by default 5672'
-        },
-        username: {
-          description: 'User Name',
-          'type': 'java.lang.String'
-        },
-        password: {
-          description: 'Password',
-          'type': 'password'
-        },
-        /*
-        useSSL: {
-          description: 'SSL',
-          'type': 'boolean'
-        },*/
-        autostart: {
-          description: 'Connect at startup',
-          'type': 'boolean',
-          tooltip: 'Whether or not the connection should be started as soon as you log into hawtio'
-        }
-      }
-    };
-
-    $scope.$watch('formEntity', function(newValue, oldValue) {
-      if (newValue !== oldValue) {
-        localStorage[QDR.SETTINGS_KEY] = angular.toJson(newValue);
-      }
-    }, true);
-
-    $scope.buttonText = function() {
-      if (QDRService.isConnected()) {
-        return "Reconnect";
-      } else {
-        return "Connect";
-      }
-    };
-
-    
-    $scope.connect = function() {
-      if ($scope.settings.$valid) {
-        $scope.connectionError = false;
-        $scope.connecting = true;
-        console.log("attempting to connect");
-        QDRService.addDisconnectAction(function() {
-          //QDR.log.debug("disconnect action called");
-          $scope.connecting = false;
-          $scope.connectionErrorText = QDRService.errorText;
-          $scope.connectionError = true;
-          $scope.$apply();
-        });
-        QDRService.addConnectAction(function() {
-          //QDR.log.debug("got connection notification");
-          $scope.connecting = false;
-          //console.log("we were on connect page. let's switch to topo now that we are connected");
-          //QDR.log.debug("location before the connect " + $location.path());
-          $location.path("/overview");
-          //QDR.log.debug("location after the connect " + $location.path());
-          $scope.$apply();
-        });
-        QDRService.connect($scope.formEntity);
-      }
-    };
-
-  }]);
-
-  return QDR;
-}(QDR || {}));


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[02/19] qpid-dispatch git commit: removed canvas class

Posted by ea...@apache.org.
removed canvas class


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/739dff26
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/739dff26
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/739dff26

Branch: refs/heads/master
Commit: 739dff26cd730faa9f41d0416ca9c5b523cc8e88
Parents: 58143c8
Author: Ernest Allen <ea...@redhat.com>
Authored: Thu Feb 18 12:59:27 2016 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Thu Feb 18 12:59:27 2016 -0500

----------------------------------------------------------------------
 console/stand-alone/plugin/js/qdrTopology.js | 1871 +++++++++++++++++++++
 1 file changed, 1871 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/739dff26/console/stand-alone/plugin/js/qdrTopology.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrTopology.js b/console/stand-alone/plugin/js/qdrTopology.js
new file mode 100644
index 0000000..c8921ff
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrTopology.js
@@ -0,0 +1,1871 @@
+/*
+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.
+*/
+/**
+ * @module QDR
+ */
+var QDR = (function (QDR) {
+
+  /**
+   * @method SettingsController
+   * @param $scope
+   * @param QDRServer
+   *
+   * Controller that handles the QDR settings page
+   */
+
+  /**
+   * @function NavBarController
+   *
+   * @param $scope
+   * @param workspace
+   *
+   * The controller for this plugin's navigation bar
+   *
+   */
+   
+    QDR.module.controller("QDR.TopologyController", ['$scope', '$rootScope', 'uiGridConstants', 'QDRService', '$uibModal', '$location', '$timeout',
+    function($scope, $rootScope, uiGridConstants, QDRService, $uibModal, $location, $timeout) {
+
+		QDR.log.debug("started QDR.TopologyController with location.url: " + $location.url());
+		var urlPrefix = window.location.pathname;
+
+		$scope.attributes = [];
+        $scope.connAttributes = [];
+        $scope.topoForm = "general";
+        $scope.topoFormSelected = "";
+		$scope.addingNode = {
+			step: 0,
+			hasLink: false,
+			trigger: ''
+		}; // shared object about the node that is be	    $scope.topoForm = "general";
+
+        var generalCellTemplate = '<div class="ngCellText"><span title="{{row.entity.description}}">{{row.entity.attributeName}}</span></div>';
+
+		$scope.isGeneral = function () {
+    	    //QDR.log.debug("$scope.topoForm=" + $scope.topoForm)
+    	    return $scope.topoForm === 'general';
+		};
+		$scope.isConnections = function () {
+    	    //QDR.log.debug("$scope.topoForm=" + $scope.topoForm)
+    	    return $scope.topoForm === 'connections';
+		};
+		$scope.isAddNode = function () {
+    	    //QDR.log.debug("$scope.topoForm=" + $scope.topoForm)
+			return $scope.topoForm === 'addNode';
+		}
+
+		$scope.getTableHeight = function (rows) {
+	        return {height: (rows.length * 30) + "px"};
+		}
+        $scope.isSelected = function () {
+            return ($scope.topoFormSelected != "");
+        }
+
+        $scope.cancel = function () {
+            $scope.addingNode.step = 0;
+        }
+		$scope.editNewRouter = function () {
+			$scope.addingNode.trigger = 'editNode';
+		}
+
+        $scope.topoGridOptions = {
+            data: 'attributes',
+			enableColumnResize: true,
+			enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+            enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+			multiSelect: false,
+            columnDefs: [
+            {
+                field: 'attributeName',
+                displayName: 'Attribute',
+                cellTemplate: generalCellTemplate
+            },
+            {
+                field: 'attributeValue',
+                displayName: 'Value'
+            }
+            ]
+        };
+        $scope.topoConnOptions = angular.copy($scope.topoGridOptions);
+        $scope.topoConnOptions.data = 'connAttributes';
+		var NewRouterName = "__NEW__";
+	    // mouse event vars
+	    var selected_node = null,
+	        selected_link = null,
+	        mousedown_link = null,
+	        mousedown_node = null,
+	        mouseup_node = null,
+	        initial_mouse_down_position = null;
+
+        $scope.schema = "Not connected";
+
+	    $scope.modes = [
+	    	{title: 'Topology view', name: 'Diagram', right: false},
+	    	/* {title: '3D Globe view', name: 'Globe', right: false}, */
+	    	/* {title: 'Add a new router node', name: 'Add Router', right: true} */
+	    	];
+		$scope.mode = "Diagram";
+		$scope.contextNode = null; // node that is associated with the current context menu
+
+		$scope.isModeActive = function (name) {
+			if ((name == 'Add Router' || name == 'Diagram') && $scope.addingNode.step > 0)
+				return true;
+			return ($scope.mode == name);
+		}
+		$scope.selectMode = function (name) {
+			if (name == "Add Router") {
+				name = 'Diagram';
+				if ($scope.addingNode.step > 0) {
+					$scope.topoForm = 'general'
+					$scope.topoFormSelected = '';
+					$scope.addingNode.step = 0;
+				} else {
+					// start adding node mode
+					$scope.addingNode.step = 1;
+				}
+			} else {
+				$scope.topoForm = 'general'
+				$scope.topoFormSelected = '';
+				$scope.addingNode.step = 0;
+			}
+
+			$scope.mode = name;
+		}
+		$scope.$watch(function () {return $scope.addingNode.step}, function (newValue, oldValue) {
+			if (newValue == 0 && oldValue != 0) {
+				// we are cancelling the add
+
+				// find the New node
+				nodes.every(function (n, i) {
+					// for the placeholder node, the key will be __internal__
+					if (QDRService.nameFromId(n.key) == '__internal__') {
+						var newLinks = links.filter(function (e, i) {
+							return e.source.id == n.id || e.target.id == n.id;
+						})
+						// newLinks is an array of links to remove
+						newLinks.map(function (e) {
+							links.splice(links.indexOf(e), 1);
+						})
+						// i is the index of the node to remove
+						nodes.splice(i, 1);
+						force.nodes(nodes).links(links).start();
+		                restart(false);
+						return false; // stop looping
+					}
+					return true;
+				})
+				$scope.topoForm = 'general'
+				$scope.topoFormSelected = '';
+			} else if (newValue > 0) {
+				// we are starting the add mode
+				$scope.topoForm = 'addNode';
+                $scope.topoFormSelected = 'addNode';
+
+				resetMouseVars();
+                selected_node = null;
+                selected_link = null;
+                // add a new node
+                var id = "amqp:/_topo/0/__internal__/$management";
+                var x = radiusNormal * 4;
+                var y = x;;
+                if (newValue > 1) {   // add at current mouse position
+                    var offset = jQuery('#topology').offset();
+                    x = mouseX - offset.left + $(document).scrollLeft();
+                    y = mouseY - offset.top + $(document).scrollTop();;
+                }
+                NewRouterName = genNewName();
+                nodes.push( aNode(id, NewRouterName, "inter-router", undefined, nodes.length, x, y, undefined, true) );
+                force.nodes(nodes).links(links).start();
+                restart(false);
+			}
+
+		})
+		$scope.isRight = function (mode) {
+			return mode.right;
+		}
+
+
+		// generate unique name for router and containerName
+		var genNewName = function () {
+			var nodeInfo = QDRService.topology.nodeInfo();
+			var nameIndex = 1;
+			var newName = "R." + nameIndex;
+
+			var names = [];
+			for (key in nodeInfo) {
+				var node = nodeInfo[key];
+				var router = node['.router'];
+				var attrNames = router.attributeNames;
+				var name = QDRService.valFor(attrNames, router.results[0], 'routerId')
+				if (!name)
+					name = QDRService.valFor(attrNames, router.results[0], 'name')
+				names.push(name);
+			}
+
+			while (names.indexOf(newName) >= 0) {
+				newName = "R." + nameIndex++;
+			}
+			return newName;
+		}
+
+		$scope.$watch(function () {return $scope.addingNode.trigger}, function (newValue, oldValue) {
+			if (newValue == 'editNode') {
+				$scope.addingNode.trigger = "";
+				editNode();
+			}
+		})
+
+	    function editNode() {
+	        doAddDialog(NewRouterName);
+	    };
+		$scope.reverseLink = function () {
+			if (!mousedown_link)
+				return;
+			var d = mousedown_link;
+			var tmp = d.left;
+			d.left = d.right;;
+			d.right = tmp;
+		    restart(false);
+		    tick();
+		}
+		$scope.removeLink = function () {
+			if (!mousedown_link)
+				return;
+			var d = mousedown_link;
+			 links.every( function (l, i) {
+				if (l.source.id == d.source.id && l.target.id == d.target.id) {
+			        links.splice(i, 1);
+					force.links(links).start();
+					return false; // exit the 'every' loop
+				}
+				return true;
+			});
+		    restart(false);
+		    tick();
+		}
+		$scope.setFixed = function (b) {
+			if ($scope.contextNode) {
+				$scope.contextNode.fixed = b;
+			}
+			restart();
+		}
+		$scope.isFixed = function () {
+			if (!$scope.contextNode)
+				return false;
+			return ($scope.contextNode.fixed & 0b1);
+		}
+
+		var mouseX, mouseY;
+		// event handlers for popup context menu
+		$(document).mousemove(function (e) {
+		    mouseX = e.clientX;
+		    mouseY = e.clientY;
+		});
+		$(document).mousemove();
+		$(document).click(function (e) {
+			$scope.contextNode = null;
+            $(".contextMenu").fadeOut(200);
+        });
+
+
+		// set up SVG for D3
+	    var width, height;
+	    var tpdiv = $('#topology');
+	    var colors = {'inter-router': "#EAEAEA", 'normal': "#F0F000", 'on-demand': '#00F000'};
+	    var gap = 5;
+	    var radii = {'inter-router': 25, 'normal': 15, 'on-demand': 15};
+	    var radius = 25;
+	    var radiusNormal = 15;
+	    width = tpdiv.width() - gap;
+	    height = $(document).height() - gap;
+
+	    var svg;
+		var force;
+		var animate = false; // should the force graph organize itself when it is displayed
+		var path, circle;
+		var savedKeys = {};
+
+	    // set up initial nodes and links
+	    //  - nodes are known by 'id', not by index in array.
+	    //  - selected edges are indicated on the node (as a bold red circle).
+	    //  - links are always source < target; edge directions are set by 'left' and 'right'.
+		var nodes = [];
+		var links = [];
+
+		var aNode = function (id, name, nodeType, nodeInfo, nodeIndex, x, y, resultIndex, fixed) {
+			var containerName;
+			if (nodeInfo) {
+				var node = nodeInfo[id];
+				if (node) {
+					containerName = node['.container'].results[0][0];
+				}
+			}
+			return {   key: id,
+				name: name,
+				nodeType: nodeType,
+				containerName: containerName,
+				x: x,
+				y: y,
+				id: nodeIndex,
+				resultIndex: resultIndex,
+				fixed: fixed,
+				cls: name == NewRouterName ? 'temp' : ''
+			};
+		};
+
+
+        var initForm = function (attributes, results, entityType, formFields) {
+        
+            while(formFields.length > 0) {
+                // remove all existing attributes
+                    formFields.pop();
+            }
+
+            for (var i=0; i<attributes.length; ++i) {
+                var name = attributes[i];
+                var val = results[i];
+                var desc = "";
+                if (entityType.attributes[name])
+                    if (entityType.attributes[name].description)
+                        desc = entityType.attributes[name].description;
+
+                formFields.push({'attributeName': name, 'attributeValue': val, 'description': desc});
+            }
+        }
+
+		var cities = ["Raleigh"];
+		var possibleCities = ["Boston","Tel Aviv-Yafo", "Brno", "Toronto", "Beijing", , "Ashburn", "Raleigh"]
+		//var drag;
+		// create an bare svg element and
+		// initialize the nodes and links array from the QDRService.topology._nodeInfo object
+		var initForceGraph = function () {
+            //QDR.log.debug("initForceGraph called");
+			nodes = [];
+			links = [];
+
+			svg = d3.select('#topology')
+				.append('svg')
+				.attr("id", "SVG_ID")
+				.attr('width', width)
+				.attr('height', height)
+	            .on("contextmenu", function(d) {
+	                if (d3.event.defaultPrevented)
+	                    return;
+                    d3.event.preventDefault();
+					if ($scope.addingNode.step != 0)
+						return;
+					if (d3.select('#svg_context_menu').style('display') !== 'block')
+	                    $(document).click();
+                    d3.select('#svg_context_menu')
+                      .style('left', (mouseX + $(document).scrollLeft()) + "px")
+                      .style('top', (mouseY + $(document).scrollTop()) + "px")
+                      .style('display', 'block');
+                })
+                .on('click', function (d) {
+					d3.select("#crosssection").style("display","none");
+					d3.select("#crosssection svg").remove();
+
+                });
+
+			// mouse event vars
+			selected_node = null;
+			selected_link = null;
+			mousedown_link = null;
+			mousedown_node = null;
+			mouseup_node = null;
+
+			// initialize the list of nodes
+			var yInit = 10;
+			var nodeInfo = QDRService.topology.nodeInfo();
+			var nodeCount = Object.keys(nodeInfo).length;
+			for (var id in nodeInfo) {
+				var name = QDRService.nameFromId(id);
+                // if we have any new nodes, animate the force graph to position them
+				var position = angular.fromJson(localStorage[name]);
+				if (!angular.isDefined(position)) {
+				    animate = true;
+				    position = {x: width / 4 + ((width / 2)/nodeCount) * nodes.length,
+                				y: height / 2 + yInit,
+                				fixed: false};
+				}
+				nodes.push( aNode(id, name, "inter-router", nodeInfo, nodes.length, position.x, position.y, undefined, position.fixed) );
+				yInit *= -1;
+				//QDR.log.debug("adding node " + nodes.length-1);
+			}
+
+			// initialize the list of links
+			var source = 0;
+			var client = 1;
+			cities = ["Raleigh"];
+			for (var id in nodeInfo) {
+				var onode = nodeInfo[id];
+				var conns = onode['.connection'].results;
+				var attrs = onode['.connection'].attributeNames;
+
+				for (var j = 0; j < conns.length; j++) {
+                    var role = QDRService.valFor(attrs, conns[j], "role");
+                    var dir = QDRService.valFor(attrs, conns[j], "dir");
+					if (role == "inter-router") {
+						var connId = QDRService.valFor(attrs, conns[j], "container");
+						var target = getContainerIndex(connId);
+						if (target >= 0)
+							getLink(source, target, dir);
+					} else if (role == "normal" || role == "on-demand") {
+						// not a router, but an external client
+						//QDR.log.debug("found an external client for " + id);
+						var name = QDRService.nameFromId(id) + "." + client;
+						//QDR.log.debug("external client name is  " + name + " and the role is " + role);
+						var parent = getNodeIndex(QDRService.nameFromId(id));
+						//QDR.log.debug("external client parent is " + parent);
+
+                        // if we have any new clients, animate the force graph to position them
+                        var position = angular.fromJson(localStorage[name]);
+                        if (!angular.isDefined(position)) {
+                            animate = true;
+                            position = {x: nodes[parent].x + 40 + Math.sin(Math.PI/2 * client),
+                                        y: nodes[parent].y + 40 + Math.cos(Math.PI/2 * client),
+                                        fixed: false};
+                        }
+						//QDR.log.debug("adding node " + nodeIndex);
+						nodes.push(	aNode(id, name, role, nodeInfo, nodes.length, position.x, position.y, j, position.fixed) );
+						// now add a link
+						getLink(parent, nodes.length-1, dir);
+						client++;
+
+/*
+	                    var container = QDRService.valFor(attrs, conns[j], "container");
+	                    var parts = container.split('.')
+	                    if (parts.length) {
+	                        var city = parts[parts.length-1]
+	                        if (city === 'TelAvivYafo')
+	                            city = 'Tel Aviv-Yafo'
+	                        if (possibleCities.indexOf(city) > -1) {
+	                            if (cities.indexOf(city) == -1) {
+	                                cities.push(city);
+	                            }
+	                        }
+	                    } else {
+	                        // there was no city
+		                    var user = QDRService.valFor(attrs, conns[j], "user");
+	                        city = 'Boston'
+                            if (cities.indexOf(city) == -1 && role == 'normal' && user != "anonymous") {
+                                cities.push(city);
+                            }
+
+	                    }
+*/
+					}
+				}
+				source++;
+			}
+
+            $scope.schema = QDRService.schema;
+			// add a row for each attribute in .router attributeNames array
+			for (var id in nodeInfo) {
+				var onode = nodeInfo[id];
+
+                initForm(onode['.connection'].attributeNames, onode['.connection'].results[0], QDRService.schema.entityTypes.connection, $scope.connAttributes);
+                initForm(onode['.router'].attributeNames, onode['.router'].results[0], QDRService.schema.entityTypes.router, $scope.attributes);
+                
+				break;
+			}
+			// init D3 force layout
+			force = d3.layout.force()
+				.nodes(nodes)
+				.links(links)
+				.size([width, height])
+				.linkDistance(function(d) { return d.target.nodeType === 'inter-router' ? 150 : 65 })
+				.charge(-1800)
+				.friction(.10)
+				.gravity(0.0001)
+				.on('tick', tick)
+				.start()
+
+			//drag = force.drag()
+            //    .on("dragstart", dragstart);
+
+			svg.append("svg:defs").selectAll('marker')
+				.data(["end-arrow", "end-arrow-selected"])      // Different link/path types can be defined here
+				.enter().append("svg:marker")    // This section adds in the arrows
+				.attr("id", String)
+				.attr("viewBox", "0 -5 10 10")
+				//.attr("refX", 25)
+				.attr("markerWidth", 4)
+				.attr("markerHeight", 4)
+				.attr("orient", "auto")
+				.append("svg:path")
+				.attr('d', 'M 0 -5 L 10 0 L 0 5 z')
+
+			svg.append("svg:defs").selectAll('marker')
+				.data(["start-arrow", "start-arrow-selected"])      // Different link/path types can be defined here
+				.enter().append("svg:marker")    // This section adds in the arrows
+				.attr("id", String)
+				.attr("viewBox", "0 -5 10 10")
+				.attr("refX", 5)
+				.attr("markerWidth", 4)
+				.attr("markerHeight", 4)
+				.attr("orient", "auto")
+				.append("svg:path")
+				.attr('d', 'M 10 -5 L 0 0 L 10 5 z');
+
+			// handles to link and node element groups
+			path = svg.append('svg:g').selectAll('path'),
+			circle = svg.append('svg:g').selectAll('g');
+            
+			force.on('end', function() {
+				//QDR.log.debug("force end called");
+				circle
+					.attr('cx', function(d) {
+						localStorage[d.name] = angular.toJson({x: d.x, y: d.y, fixed: d.fixed});
+						return d.x; });
+			});
+
+			// app starts here
+			restart(false);
+    	    force.start();
+		}
+/*
+		function dragstart(d) {
+		  d3.select(this).classed("fixed", d.fixed = true);
+		}
+
+		function dblclick(d) {
+		  d3.select(this).classed("fixed", d.fixed = false);
+		}
+*/
+        var initGlobe = function (clients) {
+			d3.select(window)
+				.on("mousemove", mousemove)
+				.on("mouseup", mouseup);
+
+			var width = 960,
+				height = 500;
+
+			var proj = d3.geo.orthographic()
+				.scale(220)
+				.translate([width / 2, height / 2])
+				.clipAngle(90);
+
+			var path = d3.geo.path().projection(proj).pointRadius(1.5);
+
+			var links = [],
+				arcLines = [];
+
+			var graticule = d3.geo.graticule();
+			d3.select("#geology svg").remove();
+			var svg = d3.select("#geology").append("svg")
+				.attr("width", width)
+				.attr("height", height)
+				.on("mousedown", mousedown);
+
+			queue()
+				.defer(d3.json, "plugin/data/world-110m.json")
+				.defer(d3.json, "plugin/data/places1.json")
+				.await(ready);
+
+			function ready(error, world, places) {
+			  var ocean_fill = svg.append("defs").append("radialGradient")
+					.attr("id", "ocean_fill")
+					.attr("cx", "75%")
+					.attr("cy", "25%");
+				  ocean_fill.append("stop").attr("offset", "5%").attr("stop-color", "#fff");
+				  ocean_fill.append("stop").attr("offset", "100%").attr("stop-color", "#eef");
+
+			  var globe_highlight = svg.append("defs").append("radialGradient")
+					.attr("id", "globe_highlight")
+					.attr("cx", "75%")
+					.attr("cy", "25%");
+				  globe_highlight.append("stop")
+					.attr("offset", "5%").attr("stop-color", "#ffd")
+					.attr("stop-opacity","0.6");
+				  globe_highlight.append("stop")
+					.attr("offset", "100%").attr("stop-color", "#ba9")
+					.attr("stop-opacity","0.1");
+
+			  var globe_shading = svg.append("defs").append("radialGradient")
+					.attr("id", "globe_shading")
+					.attr("cx", "55%")
+					.attr("cy", "45%");
+				  globe_shading.append("stop")
+					.attr("offset","30%").attr("stop-color", "#fff")
+					.attr("stop-opacity","0")
+				  globe_shading.append("stop")
+					.attr("offset","100%").attr("stop-color", "#505962")
+					.attr("stop-opacity","0.2")
+
+			  var drop_shadow = svg.append("defs").append("radialGradient")
+					.attr("id", "drop_shadow")
+					.attr("cx", "50%")
+					.attr("cy", "50%");
+				  drop_shadow.append("stop")
+					.attr("offset","20%").attr("stop-color", "#000")
+					.attr("stop-opacity",".5")
+				  drop_shadow.append("stop")
+					.attr("offset","100%").attr("stop-color", "#000")
+					.attr("stop-opacity","0")
+
+			  svg.append("ellipse")
+				.attr("cx", 440).attr("cy", 450)
+				.attr("rx", proj.scale()*.90)
+				.attr("ry", proj.scale()*.25)
+				.attr("class", "noclicks")
+				.style("fill", "url("+urlPrefix+"#drop_shadow)");
+
+			  svg.append("circle")
+				.attr("cx", width / 2).attr("cy", height / 2)
+				.attr("r", proj.scale())
+				.attr("class", "noclicks")
+				.style("fill", "url("+urlPrefix+"#ocean_fill)");
+
+			  svg.append("path")
+				.datum(topojson.object(world, world.objects.land))
+				.attr("class", "land noclicks")
+				.attr("d", path);
+
+			  svg.append("path")
+				.datum(graticule)
+				.attr("class", "graticule noclicks")
+				.attr("d", path);
+
+			  svg.append("circle")
+				.attr("cx", width / 2).attr("cy", height / 2)
+				.attr("r", proj.scale())
+				.attr("class","noclicks")
+				.style("fill", "url("+urlPrefix+"#globe_highlight)");
+
+			  svg.append("circle")
+				.attr("cx", width / 2).attr("cy", height / 2)
+				.attr("r", proj.scale())
+				.attr("class","noclicks")
+				.style("fill", "url("+urlPrefix+"#globe_shading)");
+
+			  var filtered = places.features.filter( function (feature) {
+			    return clients.indexOf(feature.properties.NAME) > -1
+			  })
+			  svg.append("g").attr("class","points")
+				  .selectAll("text").data(filtered)
+				.enter().append("path")
+				  .attr("class", "point")
+				  .attr("d", path);
+
+				svg.append("g").attr("class","labels")
+				  .selectAll("text").data(filtered)
+				  .enter().append("text")
+				  .attr("class", "label")
+				  .text(function(d) { return d.properties.NAME })
+
+				position_labels();
+
+			  // spawn links between cities as source/target coord pairs
+			  places.features.forEach(function(a, i) {
+				if (clients.indexOf(a.properties.NAME) > -1) {
+					places.features.forEach(function(b, j) {
+					  if (b.properties.NAME === 'Raleigh') {
+					  if (j > i) {	// avoid duplicates
+						links.push({
+						  source: a.geometry.coordinates,
+						  target: b.geometry.coordinates
+						});
+					  }
+					  }
+					});
+				}
+			  });
+
+			  // build geoJSON features from links array
+			  links.forEach(function(e,i,a) {
+				var feature =   { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [e.source,e.target] }}
+				arcLines.push(feature)
+			  })
+
+			  svg.append("g").attr("class","arcs")
+				.selectAll("path").data(arcLines)
+				.enter().append("path")
+				  .attr("class","arc")
+				  .attr("d",path)
+			  refresh();
+			}
+
+			function position_labels() {
+			  var centerPos = proj.invert([width/2,height/2]);
+
+			  var arc = d3.geo.greatArc();
+
+			  svg.selectAll(".label")
+				.attr("transform", function(d) {
+				  var loc = proj(d.geometry.coordinates),
+					x = loc[0],
+					y = loc[1];
+				  var offset = x < width/2 ? -5 : 5;
+				  return "translate(" + (x+offset) + "," + (y-2) + ")"
+				})
+				.style("display",function(d) {
+				  var d = arc.distance({source: d.geometry.coordinates, target: centerPos});
+				  return (d > 1.57) ? 'none' : 'inline';
+				})
+			}
+
+			function refresh() {
+			  svg.selectAll(".land").attr("d", path);
+			  svg.selectAll(".point").attr("d", path);
+			  svg.selectAll(".graticule").attr("d", path);
+			  svg.selectAll(".arc").attr("d", path);
+			  position_labels();
+			}
+
+			// modified from http://bl.ocks.org/1392560
+			var m0, o0;
+			o0 = angular.fromJson(localStorage["QDR.rotate"]);
+			if (o0)
+				proj.rotate(o0);
+
+			function mousedown() {
+			  m0 = [d3.event.pageX, d3.event.pageY];
+			  o0 = proj.rotate();
+			  d3.event.preventDefault();
+			}
+			function mousemove() {
+			  if (m0) {
+				var m1 = [d3.event.pageX, d3.event.pageY]
+				  , o1 = [o0[0] + (m1[0] - m0[0]) / 6, o0[1] + (m0[1] - m1[1]) / 6];
+				o1[1] = o1[1] > 30  ? 30  :
+						o1[1] < -30 ? -30 :
+						o1[1];
+				proj.rotate(o1);
+				refresh();
+			  }
+			}
+			function mouseup() {
+			  if (m0) {
+				mousemove();
+				m0 = null;
+				localStorage["QDR.rotate"] = angular.toJson(proj.rotate());
+			  }
+			}
+        }
+
+        // called when we mouseover a node
+        // we need to update the table
+		function updateNodeForm (d) {
+			//QDR.log.debug("update form info for ");
+			//console.dump(d);
+			var nodeInfo = QDRService.topology.nodeInfo();
+			var onode = nodeInfo[d.key];
+			if (onode) {
+				var nodeResults = onode['.router'].results[0];
+				var nodeAttributes = onode['.router'].attributeNames;
+
+                for (var i=0; i<$scope.attributes.length; ++i) {
+                    var idx = nodeAttributes.indexOf($scope.attributes[i].attributeName);
+                    if (idx > -1) {
+                        if ($scope.attributes[i].attributeValue != nodeResults[idx]) {
+                            // highlight the changed data
+                            $scope.attributes[i].attributeValue = nodeResults[idx];
+
+                        }
+                    }
+                }
+			}
+            $scope.topoForm = "general";
+            $scope.$apply();
+		}
+
+		function updateConnForm (d, resultIndex) {
+			var nodeInfo = QDRService.topology.nodeInfo();
+			var onode = nodeInfo[d.key];
+			if (onode && onode['.connection']) {
+				var nodeResults = onode['.connection'].results[resultIndex];
+				var nodeAttributes = onode['.connection'].attributeNames;
+
+                for (var i=0; i<$scope.connAttributes.length; ++i) {
+                    var idx = nodeAttributes.indexOf($scope.connAttributes[i].attributeName);
+                    if (idx > -1) {
+                    	try {
+                        if ($scope.connAttributes[i].attributeValue != nodeResults[idx]) {
+                            // highlight the changed data
+                            $scope.connAttributes[i].attributeValue = nodeResults[idx];
+
+                        }
+                        } catch (err) {
+							QDR.log.error("error updating form" + err)
+                        }
+                    }
+                }
+			}
+            $scope.topoForm = "connections";
+            $scope.$apply();
+		}
+
+
+        function getContainerIndex(_id) {
+            var nodeIndex = 0;
+            var nodeInfo = QDRService.topology.nodeInfo();
+            for (var id in nodeInfo) {
+                var node = nodeInfo[id];
+                if (node['.container'].results[0][0] == _id)
+                    return nodeIndex;
+                nodeIndex++
+            }
+            QDR.log.warn("unable to find containerIndex for " + _id);
+            return -1;
+        }
+
+        function getNodeIndex (_id) {
+            var nodeIndex = 0;
+            var nodeInfo = QDRService.topology.nodeInfo();
+            for (var id in nodeInfo) {
+                if (QDRService.nameFromId(id) == _id) return nodeIndex;
+                nodeIndex++
+            }
+            QDR.log.warn("unable to find nodeIndex for " + _id);
+            return -1;
+        }
+
+        function getLink (_source, _target, dir, cls) {
+            for (var i=0; i < links.length; i++) {
+                var s = links[i].source, t = links[i].target;
+                if (typeof links[i].source == "object") {
+                    s = s.id;
+                    t = t.id;
+				}
+                if (s == _source && t == _target) {
+                    return i;
+                }
+				// same link, just reversed
+                if (s == _target && t == _source) {
+                    return -i;
+				}
+            }
+
+            //QDR.log.debug("creating new link (" + (links.length) + ") between " + nodes[_source].name + " and " + nodes[_target].name);
+            var link = {
+                source: _source,
+                target: _target,
+                left: dir != "out",
+                right: dir == "out",
+                cls: cls
+            };
+            return links.push(link) - 1;
+        }
+
+
+	    function resetMouseVars() {
+	        mousedown_node = null;
+	        mouseup_node = null;
+	        mousedown_link = null;
+	    }
+
+	    // update force layout (called automatically each iteration)
+	    function tick() {
+	        // draw directed edges with proper padding from node centers
+	        path.attr('d', function (d) {
+				//QDR.log.debug("in tick for d");
+				//console.dump(d);
+
+	            var deltaX = d.target.x - d.source.x,
+	                deltaY = d.target.y - d.source.y,
+	                dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY),
+	                normX = deltaX / dist,
+	                normY = deltaY / dist;
+	                var sourcePadding, targetPadding;
+	                if (d.target.nodeType == "inter-router") {
+						//                       right arrow  left line start
+						sourcePadding = d.left ? radius + 8  : radius;
+						//                      left arrow      right line start
+						targetPadding = d.right ? radius + 16 : radius;
+	                } else {
+						sourcePadding = d.left ? radiusNormal + 18  : radiusNormal;
+						targetPadding = d.right ? radiusNormal + 16 : radiusNormal;
+	                }
+	                var sourceX = d.source.x + (sourcePadding * normX),
+	                sourceY = d.source.y + (sourcePadding * normY),
+	                targetX = d.target.x - (targetPadding * normX),
+	                targetY = d.target.y - (targetPadding * normY);
+	            return 'M' + sourceX + ',' + sourceY + 'L' + targetX + ',' + targetY;
+	        });
+
+	        circle.attr('transform', function (d) {
+	            d.x = Math.max(d.x, radiusNormal * 2);
+	            d.y = Math.max(d.y, radiusNormal * 2);
+	            return 'translate(' + d.x + ',' + d.y + ')';
+	        });
+	        if (!animate) {
+	            animate = true;
+	            force.stop();
+	        }
+	    }
+
+        // highlight the paths between the selected node and the hovered node
+        function findNextHopNode(from, d) {
+            // d is the node that the mouse is over
+            // from is the selected_node ....
+            if (!from)
+                return null;
+
+            if (from == d)
+                return selected_node;
+
+            //QDR.log.debug("finding nextHop from: " + from.name + " to " + d.name);
+            var sInfo = QDRService.topology.nodeInfo()[from.key];
+
+            if (!sInfo) {
+                QDR.log.warn("unable to find topology node info for " + from.key);
+                return null;
+            }
+
+            // find the hovered name in the selected name's .router.node results
+            if (!sInfo['.router.node'])
+                return null;
+            var aAr = sInfo['.router.node'].attributeNames;
+            var vAr = sInfo['.router.node'].results;
+            for (var hIdx=0; hIdx<vAr.length; ++hIdx) {
+                var addrT = QDRService.valFor(aAr, vAr[hIdx], "routerId" );
+                if (addrT == d.name) {
+                    //QDR.log.debug("found " + d.name + " at " + hIdx);
+                    var nextHop = QDRService.valFor(aAr, vAr[hIdx], "nextHop");
+                    //QDR.log.debug("nextHop was " + nextHop);
+                    return (nextHop == null) ? nodeFor(addrT) : nodeFor(nextHop);
+                }
+            }
+            return null;
+        }
+
+        function nodeFor(name) {
+            for (var i=0; i<nodes.length; ++i) {
+                if (nodes[i].name == name)
+                    return nodes[i];
+            }
+            return null;
+        }
+
+        function linkFor(source, target) {
+            for (var i=0; i<links.length; ++i) {
+                if ((links[i].source == source) && (links[i].target == target))
+                    return links[i];
+                if ((links[i].source == target) && (links[i].target == source))
+                    return links[i];
+            }
+            // the selected node was a client/broker
+            //QDR.log.debug("failed to find a link between ");
+            //console.dump(source);
+            //QDR.log.debug(" and ");
+            //console.dump(target);
+            return null;
+        }
+
+	    // takes the nodes and links array of objects and adds svg elements for everything that hasn't already
+	    // been added
+	    function restart(start) {
+	        circle.call(force.drag);
+	        //svg.classed('ctrl', true);
+
+	        // path (link) group
+	        path = path.data(links);
+
+			// update existing links
+  			path.classed('selected', function(d) { return d === selected_link; })
+  			    .classed('highlighted', function(d) { return d.highlighted; } )
+  			    .classed('temp', function(d) { return d.cls == 'temp'; } )
+                .attr('marker-start', function(d) {
+                    var sel = d===selected_link ? '-selected' : '';
+                    return d.left ? 'url('+urlPrefix+'#start-arrow' + sel + ')' : ''; })
+                .attr('marker-end', function(d) {
+                    var sel = d===selected_link ? '-selected' : '';
+                    return d.right ? 'url('+urlPrefix+'#end-arrow' + sel +')' : ''; })
+
+
+			// add new links. if links[] is longer than the existing paths, add a new path for each new element
+			path.enter().append('svg:path')
+				.attr('class', 'link')
+                .attr('marker-start', function(d) {
+                        var sel = d===selected_link ? '-selected' : '';
+						return d.left ? 'url('+urlPrefix+'#start-arrow' + sel + ')' : ''; })
+                .attr('marker-end', function(d) {
+					var sel = d===selected_link ? '-selected' : '';
+                    return d.right ? 'url('+urlPrefix+'#end-arrow' + sel + ')' : ''; })
+  			    .classed('temp', function(d) { return d.cls == 'temp'; } )
+	            .on('mouseover', function (d) {
+				  if($scope.addingNode.step > 0) {
+				    if (d.cls == 'temp') {
+				        d3.select(this).classed('over', true);
+				    }
+				    return;
+				  }
+				        //QDR.log.debug("showing connections form");
+					var resultIndex = 0; // the connection to use
+                    var left = d.left ? d.target : d.source;
+					// right is the node that the arrow points to, left is the other node
+					var right = d.left ? d.source : d.target;
+					var onode = QDRService.topology.nodeInfo()[left.key];
+					// loop through all the connections for left, and find the one for right
+					if (!onode || !onode['.connection'])
+						return;
+                    // update the info dialog for the link the mouse is over
+                    if (!selected_node && !selected_link) {
+                        for (resultIndex=0; resultIndex < onode['.connection'].results.length; ++resultIndex) {
+                            var conn = onode['.connection'].results[resultIndex];
+                            /// find the connection whose container is the right's name
+                            var name = QDRService.valFor(onode['.connection'].attributeNames, conn, "container");
+                            if (name == right.name) {
+                                break;
+                            }
+                        }
+                        // did not find connection. this is a connection to a non-interrouter node
+                        if (resultIndex === onode['.connection'].results.length) {
+                            // use the non-interrouter node's connection info
+                            left = d.target;
+                            resultIndex = left.resultIndex;
+                        }
+                        updateConnForm(left, resultIndex);
+                    }
+
+					// select link
+					mousedown_link = d;
+					selected_link = mousedown_link;
+					//selected_node = null;
+					//mousedown_node = null;
+					restart();
+				})
+	            .on('mouseout', function (d) {
+				  if($scope.addingNode.step > 0) {
+				    if (d.cls == 'temp') {
+				        d3.select(this).classed('over', false);
+				    }
+				    return;
+				  }
+				        //QDR.log.debug("showing connections form");
+					// select link
+					selected_link = null;
+					//selected_node = null;
+					//mousedown_node = null;
+					restart();
+				})
+	            .on("contextmenu", function(d) {
+	                $(document).click();
+                    d3.event.preventDefault();
+	                if (d.cls !== "temp")
+	                    return;
+
+					mousedown_link = d;
+                    d3.select('#link_context_menu')
+                      .style('left', (mouseX + $(document).scrollLeft()) + "px")
+                      .style('top', (mouseY + $(document).scrollTop()) + "px")
+                      .style('display', 'block');
+                })
+                .on("dblclick", function (d) {
+                    var pos = d3.mouse(this);
+                    var diameter = 400;
+                    var format = d3.format(",d");
+                    var pack = d3.layout.pack()
+                        .size([diameter - 4, diameter - 4])
+                        .padding(3)
+                        .value(function(d) { return d.size; });
+
+                    var svg = d3.select("#crosssection").append("svg")
+                        .attr("width", diameter)
+                        .attr("height", diameter);
+                    var svgg = svg.append("g")
+                        .attr("transform", "translate(2,2)");
+
+					svg.on('click', function (d) {
+		                d3.select("#crosssection").style("display","none");
+					})
+
+					var root = {
+						name: "links between " + d.source.name + " and " + d.target.name,
+						children: []
+					}
+					var nodeInfo = QDRService.topology.nodeInfo();
+					var connections = nodeInfo[d.source.key]['.connection'];
+					var containerIndex = connections.attributeNames.indexOf('container');
+					connections.results.some ( function (connection) {
+                        if (connection[containerIndex] == d.target.containerName) {
+                            root.attributeNames = connections.attributeNames;
+                            root.obj = connection;
+                            root.desc = "Connection";
+                            return true;    // stop looping after 1 match
+                        }
+                        return false;
+                    })
+
+					// find router.links where link.remoteContainer is d.source.name
+					var links = nodeInfo[d.source.key]['.router.link'];
+					containerIndex = links.attributeNames.indexOf('remoteContainer');
+					var nameIndex = links.attributeNames.indexOf('name');
+					var linkDirIndex = links.attributeNames.indexOf('linkDir');
+					links.results.forEach ( function (link) {
+						if (link[containerIndex] == d.target.containerName)
+							root.children.push (
+								{ name: "(" + link[linkDirIndex] + ") " + link[nameIndex],
+								size: 100,
+								obj: link,
+	                            desc: "Link",
+								attributeNames: links.attributeNames
+							})
+					})
+					if (root.children.length == 0)
+						return;
+	                var node = svgg.datum(root).selectAll(".node")
+	                      .data(pack.nodes)
+	                    .enter().append("g")
+	                      .attr("class", function(d) { return d.children ? "parent node hastip" : "leaf node hastip"; })
+	                      .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
+	                      .attr("title", function (d) {
+	                          var title = "<h4>" + d.desc + "</h4><table class='tiptable'><tbody>";
+	                          if (d.attributeNames)
+		                            d.attributeNames.forEach( function (n, i) {
+		                                title += "<tr><td>" + n + "</td><td>";
+		                                title += d.obj[i] != null ? d.obj[i] : '';
+		                                title += '</td></tr>';
+		                            })
+		                      title += "</tbody></table>"
+	                          return title
+	                      })
+
+	                node.append("circle")
+	                      .attr("r", function(d) { return d.r; });
+
+//	                node.filter(function(d) { return !d.children; }).append("text")
+	                node.append("text")
+	                      .attr("dy", function (d) { return d.children ? "-10em" : ".3em"})
+	                      .style("text-anchor", "middle")
+	                      .text(function(d) {
+	                          return d.name.substring(0, d.r / 3);
+	                      });
+
+					$('.hastip').tooltipsy({ alignTo: 'cursor'});
+	                d3.select("#crosssection").style("display","block");
+                })
+
+
+	        // remove old links
+	        path.exit().remove();
+
+
+	        // circle (node) group
+	        // nodes are known by id
+	        circle = circle.data(nodes, function (d) {
+	            return d.id;
+	        });
+
+	        // update existing nodes visual states
+	        circle.selectAll('circle')
+	            .classed('selected', function (d) { return (d === selected_node) })
+	            .classed('fixed', function (d) { return (d.fixed & 0b1) })
+
+			// add new circle nodes. if nodes[] is longer than the existing paths, add a new path for each new element
+	        var g = circle.enter().append('svg:g');
+
+			// add new circles and set their attr/class/behavior
+	        g.append('svg:circle')
+	            .attr('class', 'node')
+	            .attr('r', function (d) {
+	            	return radii[d.nodeType];
+	            })
+	            .classed('fixed', function (d) {return d.fixed})
+  			    .classed('temp', function(d) { return QDRService.nameFromId(d.key) == '__internal__'; } )
+  			    .classed('normal', function(d) { return d.nodeType == 'normal' } )
+  			    .classed('inter-router', function(d) { return d.nodeType == 'inter-router' } )
+  			    .classed('on-demand', function(d) { return d.nodeType == 'on-demand' } )
+
+/*
+	            .style('fill', function (d) {
+	                var sColor = colors[d.nodeType];
+	                return (d === selected_node) ? d3.rgb(sColor).brighter().toString() : d3.rgb(sColor);
+	            })
+	            .style('stroke', function (d) {
+	                var sColor = colors[d.nodeType];
+	                return d3.rgb(sColor).darker().toString();
+	            })
+*/
+	            .on('mouseover', function (d) {
+	                if ($scope.addingNode.step > 0) {
+		                d3.select(this).attr('transform', 'scale(1.1)');
+						return;
+	                }
+					if (!selected_node) {
+                        if (d.nodeType === 'inter-router') {
+                            //QDR.log.debug("showing general form");
+                            updateNodeForm(d);
+                        } else if (d.nodeType === 'normal' || d.nodeType === 'on-demand') {
+                            //QDR.log.debug("showing connections form");
+                            updateConnForm(d, d.resultIndex);
+                        }
+					}
+
+	                if (d === mousedown_node) 
+	                    return;
+	                //if (d === selected_node)
+	                //    return;
+	                // enlarge target node
+	                d3.select(this).attr('transform', 'scale(1.1)');
+                    // highlight the next-hop route from the selected node to this node
+                    mousedown_node = null;
+
+	                if (!selected_node) {
+	                    return;
+	                }
+                    setTimeout(nextHop, 1, selected_node, d);
+	            })
+	            .on('mouseout', function (d) {
+	                // unenlarge target node
+	                d3.select(this).attr('transform', '');
+                    for (var i=0; i<links.length; ++i) {
+                        links[i]['highlighted'] = false;
+                    }
+                    restart();
+	            })
+	            .on('mousedown', function (d) {
+	                if (d3.event.button !== 0) {   // ignore all but left button
+	                    return;
+	                }
+	                mousedown_node = d;
+	                // mouse position relative to svg
+	                initial_mouse_down_position = d3.mouse(this.parentElement.parentElement.parentElement).slice();
+	            })
+	            .on('mouseup', function (d) {
+	                if (!mousedown_node)
+	                    return;
+
+                    selected_link = null;
+	                // unenlarge target node
+	                d3.select(this).attr('transform', '');
+
+	                // check for drag
+	                mouseup_node = d;
+	                var mySvg = this.parentElement.parentElement.parentElement;
+                    // if we dragged the node, make it fixed
+                    var cur_mouse = d3.mouse(mySvg);
+                    if (cur_mouse[0] != initial_mouse_down_position[0] ||
+                        cur_mouse[1] != initial_mouse_down_position[1]) {
+						console.log("mouse pos changed. making this node fixed")
+						d3.select(this).classed("fixed", d.fixed = true);
+                        resetMouseVars();
+                        return;
+	                }
+
+					// we didn't drag, we just clicked on the node
+	                if ($scope.addingNode.step > 0) {
+                        if (d.nodeType !== 'inter-router')
+                            return;
+						if (QDRService.nameFromId(d.key) == '__internal__')
+							return;
+
+						// add a link from the clicked node to the new node
+						getLink(d.id, nodes.length-1, "in", "temp");
+						$scope.addingNode.hasLink = true;
+						$scope.$apply();
+						// add new elements to the svg
+						force.links(links).start();
+						restart();
+						return;
+
+	                }
+
+					// if this node was selected, unselect it
+                    if (mousedown_node === selected_node) {
+                        selected_node = null;
+                        $scope.topoFormSelected = "";
+                    }
+                    else {
+                        selected_node = mousedown_node;
+                        if (d.nodeType === 'inter-router') {
+                            //QDR.log.debug("showing general form");
+                            updateNodeForm(d);
+                            $scope.topoFormSelected = "general";
+                        } else if (d.nodeType === 'normal' || d.nodeType === 'on-demand') {
+                            //QDR.log.debug("showing connections form");
+                            updateConnForm(d, d.resultIndex);
+                            $scope.topoFormSelected = "connections";
+                        }
+                    }
+                    for (var i=0; i<links.length; ++i) {
+                        links[i]['highlighted'] = false;
+                    }
+	                mousedown_node = null;
+                    $scope.$apply();
+                    restart(false);
+
+	            })
+	            .on("dblclick", function (d) {
+	                if (d.fixed) {
+						d3.select(this).classed("fixed", d.fixed = false);
+						force.start();  // let the nodes move to a new position
+	                }
+	                if (QDRService.nameFromId(d.key) == '__internal__') {
+	                    editNode();
+	                    $scope.$apply();
+	                }
+	            })
+	            .on("contextmenu", function(d) {
+	                $(document).click();
+                    d3.event.preventDefault();
+	                $scope.contextNode = d;
+	                $scope.$apply();    // we just changed a scope valiable during an async event
+                    d3.select('#node_context_menu')
+                      .style('left', (mouseX + $(document).scrollLeft()) + "px")
+                      .style('top', (mouseY + $(document).scrollTop()) + "px")
+                      .style('display', 'block');
+
+                });
+
+	        // show node IDs
+	        g.append('svg:text')
+	            .attr('x', 0)
+	            .attr('y', 4)
+	            .attr('class', 'id')
+	            .text(function (d) {
+	                return (d.nodeType === 'normal' || d.nodeType == 'on-demand') ? d.name.slice(-1) :
+	                    d.name.length>7 ? d.name.substr(0,6)+'...' : d.name;
+	        });
+
+	        // remove old nodes
+	        circle.exit().remove();
+
+	        if (!mousedown_node || !selected_node)
+	            return;
+
+            if (!start)
+                return;
+	        // set the graph in motion
+	        //QDR.log.debug("mousedown_node is " + mousedown_node);
+	        force.start();
+
+	    }
+
+        function nextHop(thisNode, d) {
+            if ((thisNode) && (thisNode != d)) {
+                var target = findNextHopNode(thisNode, d);
+                //QDR.log.debug("highlight link from node ");
+                 //console.dump(nodeFor(selected_node.name));
+                 //console.dump(target);
+                if (target) {
+                    var hlLink = linkFor(nodeFor(thisNode.name), target);
+                    //QDR.log.debug("need to highlight");
+                    //console.dump(hlLink);
+                    if (hlLink)
+                        hlLink['highlighted'] = true;
+                    else
+                        target = null;
+                }
+                setTimeout(nextHop, 1, target, d);
+            }
+            restart();
+        }
+
+
+	    function mousedown() {
+	        // prevent I-bar on drag
+	        //d3.event.preventDefault();
+
+	        // because :active only works in WebKit?
+	        svg.classed('active', true);
+	    }
+
+        QDRService.addUpdatedAction("topology", function() {
+            //QDR.log.debug("Topology controller was notified that the model was updated");
+            if (hasChanged()) {
+                QDR.log.info("svg graph changed")
+                saveChanged();
+                // TODO: update graph nodes instead of rebuilding entire graph
+                d3.select("#SVG_ID").remove();
+                animate = true;
+                initForceGraph();
+                initGlobe(cities);
+                //if ($location.path().startsWith("/topology"))
+                //    Core.notification('info', "Qpid dispatch router topology changed");
+
+            } else {
+                //QDR.log.debug("no changes")
+            }
+        });
+
+		function hasChanged () {
+			var nodeInfo = QDRService.topology.nodeInfo();
+			if (Object.keys(nodeInfo).length != Object.keys(savedKeys).length)
+				return true;
+			for (var key in nodeInfo) {
+                // if this node isn't in the saved node list
+                if (!savedKeys.hasOwnProperty(key))
+                    return true;
+                // if the number of connections for this node chaanged
+                if (nodeInfo[key]['.connection'].results.length != savedKeys[key]) {
+					/*
+					QDR.log.debug("number of connections changed for " + key);
+					QDR.log.debug("QDRService.topology._nodeInfo[key]['.connection'].results.length");
+					console.dump(QDRService.topology._nodeInfo[key]['.connection'].results.length);
+					QDR.log.debug("savedKeys[key]");
+					console.dump(savedKeys[key]);
+					*/
+                    return true;
+                }
+			}
+			return false;
+		};
+		function saveChanged () {
+            savedKeys = {};
+            var nodeInfo = QDRService.topology.nodeInfo();
+            // save the number of connections per node
+		    for (var key in nodeInfo) {
+		        savedKeys[key] = nodeInfo[key]['.connection'].results.length;
+		    }
+			//QDR.log.debug("saving current keys");
+			console.dump(savedKeys);
+		};
+		// we are about to leave the page, save the node positions
+		$rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl) {
+			//QDR.log.debug("locationChangeStart");
+			nodes.forEach( function (d) {
+	           localStorage[d.name] = angular.toJson({x: d.x, y: d.y, fixed: d.fixed});
+			});
+            $scope.addingNode.step = 0;
+
+		});
+		// When the DOM element is removed from the page,
+        // AngularJS will trigger the $destroy event on
+        // the scope
+        $scope.$on("$destroy", function( event ) {
+   			//QDR.log.debug("scope on destroy");
+            QDRService.stopUpdating();
+            QDRService.delUpdatedAction("topology");
+			d3.select("#SVG_ID").remove();
+        });
+
+		initForceGraph();
+		saveChanged();
+        QDRService.startUpdating();
+
+		initGlobe(cities)//, "Boston", "Tel Aviv-Yafo"]);
+
+	    function doAddDialog(NewRouterName) {
+		    var modalInstance = $uibModal.open({
+		        animation: true,
+		        controller: 'QDR.NodeDialogController',
+		        templateUrl: 'node-config-template.html',
+		        size: 'lg',
+		        resolve: {
+		            newname: function () {
+		                return NewRouterName;
+		            }
+		        }
+		    });
+		    modalInstance.result.then(function (result) {
+				if (result)
+					setTimeout(doDownloadDialog, 100, result);
+		    });
+        };
+
+	    function doDownloadDialog(result) {
+		    var modalInstance = $uibModal.open({
+		        animation: true,
+				controller: 'QDR.DownloadDialogController',
+		        templateUrl: 'download-dialog-template.html',
+		        resolve: {
+		            results: function () {
+		                return result;
+		            }
+		        }
+		    });
+        };
+  }]);
+
+  QDR.module.controller("QDR.NodeDialogController", function($scope, QDRService, $uibModalInstance, newname) {
+   		var schema = QDRService.schema;
+   		var myEntities = ['container', 'router', 'log', 'listener' ];
+   		var typeMap = {integer: 'number', string: 'text', path: 'text', boolean: 'boolean'};
+		var newLinks = $('path.temp').toArray();    // jquery array of new links for the added router
+		var nodeInfo = QDRService.topology.nodeInfo();
+		var separatedEntities = []; // additional entities required if a link is reversed
+		var myPort = 0, myAddr = '0.0.0.0'; // port and address for new router
+   		$scope.entities = [];
+
+		// find max port number that is used in all the listeners
+		var getMaxPort = function (nodeInfo) {
+			var maxPort = 5674;
+			for (var key in nodeInfo) {
+				var node = nodeInfo[key];
+				var listeners = node['.listener'];
+				var attrs = listeners.attributeNames;
+				for (var i=0; i<listeners.results.length; ++i) {
+					var res = listeners.results[i];
+					var port = QDRService.valFor(attrs, res, 'port');
+					if (parseInt(port, 10) > maxPort)
+						maxPort = parseInt(port, 10);
+				}
+			}
+			return maxPort;
+		}
+		var maxPort = getMaxPort(nodeInfo);
+
+		// construct an object that contains all the info needed for a single tab's fields
+		var entity = function (actualName, tabName, humanName, ent, icon, link) {
+			var nameIndex = -1; // the index into attributes that the name field was placed
+			var index = 0;
+			var info = {
+			    actualName: actualName,
+				tabName:    tabName,
+				humanName:  humanName,
+				description:ent.description,
+				icon:       angular.isDefined(icon) ? icon : '',
+				references: ent.references,
+				link:       link,
+
+   		        attributes: $.map(ent.attributes, function (value, key) {
+					// skip identity and depricated fields
+   		            if (key == 'identity' || value.description.startsWith('Deprecated'))
+   		                return null;
+					var val = value['default'];
+					if (key == 'name')
+						nameIndex = index;
+					index++;
+					return {    name:       key,
+								humanName:  QDRService.humanify(key),
+                                description:value.description,
+                                type:       typeMap[value.type],
+                                rawtype:    value.type,
+                                input:      typeof value.type == 'string' ? value.type == 'boolean' ? 'boolean' : 'input'
+                                                                          : 'select',
+                                selected:   val ? val : undefined,
+                                'default':  value['default'],
+                                value:      val,
+                                required:   value.required,
+                                unique:     value.unique
+                    };
+                })
+			}
+			// move the 'name' attribute to the 1st position
+			if (nameIndex > -1) {
+				var tmp = info.attributes[0];
+				info.attributes[0] = info.attributes[nameIndex];
+				info.attributes[nameIndex] = tmp;
+			}
+			return info;
+		}
+
+		// remove the annotation fields
+		var stripAnnotations = function (entityName, ent, annotations) {
+			if (ent.references) {
+				var newEnt = {attributes: {}};
+				ent.references.forEach( function (annoKey) {
+					if (!annotations[annoKey])
+						annotations[annoKey] = {};
+					annotations[annoKey][entityName] = true;    // create the key/consolidate duplicates
+					var keys = Object.keys(schema.annotations[annoKey].attributes);
+					for (var attrib in ent.attributes) {
+						if (keys.indexOf(attrib) == -1) {
+							newEnt.attributes[attrib] = ent.attributes[attrib];
+						}
+					}
+					// add a field for the reference name
+					newEnt.attributes[annoKey] = {type: 'string',
+							description: 'Name of the ' + annoKey + ' section.',
+							'default': annoKey, required: true};
+				})
+				newEnt.references = ent.references;
+				newEnt.description = ent.description;
+				return newEnt;
+			}
+			return ent;
+		}
+
+		var annotations = {};
+   		myEntities.forEach(function (entityName) {
+   		    var ent = schema.entityTypes[entityName];
+   		    var hName = QDRService.humanify(entityName);
+   		    if (entityName == 'listener')
+   		        hName = "Listener for clients";
+   		    var noAnnotations = stripAnnotations(entityName, ent, annotations);
+			var ediv = entity(entityName, entityName, hName, noAnnotations, undefined);
+			if (ediv.actualName == 'router') {
+				ediv.attributes.filter(function (attr) { return attr.name == 'name'})[0].value = newname;
+				// if we have any new links (connectors), then the router's mode should be interior
+				if (newLinks.length) {
+					var roleAttr = ediv.attributes.filter(function (attr) { return attr.name == 'mode'})[0];
+					roleAttr.value = roleAttr.selected = "interior";
+				}
+			}
+			if (ediv.actualName == 'container') {
+				ediv.attributes.filter(function (attr) { return attr.name == 'containerName'})[0].value = newname + "-container";
+			}
+			if (ediv.actualName == 'listener') {
+				// find max port number that is used in all the listeners
+				ediv.attributes.filter(function (attr) { return attr.name == 'port'})[0].value = ++maxPort;
+			}
+			// special case for required log.module since it doesn't have a default
+			if (ediv.actualName == 'log') {
+				var moduleAttr = ediv.attributes.filter(function (attr) { return attr.name == 'module'})[0];
+				moduleAttr.value = moduleAttr.selected = "DEFAULT";
+			}
+			$scope.entities.push( ediv );
+   		})
+
+		// add a tab for each annotation that was found
+		var annotationEnts = [];
+		for (var key in annotations) {
+			ent = angular.copy(schema.annotations[key]);
+			ent.attributes.name = {type: "string", unique: true, description: "Unique name that is used to refer to this set of attributes."}
+			var ediv = entity(key, key+'tab', QDRService.humanify(key), ent, undefined);
+			ediv.attributes.filter(function (attr) { return attr.name == 'name'})[0].value = key;
+			$scope.entities.push( ediv );
+			annotationEnts.push( ediv );
+		}
+
+		// add an additional listener tab if any links are reversed
+		ent = schema.entityTypes['listener'];
+		newLinks.some(function (link) {
+			if (link.__data__.right) {
+	   		    var noAnnotations = stripAnnotations('listener', ent, annotations);
+				var ediv = entity("listener", "listener0", "Listener (internal)", noAnnotations, undefined);
+				ediv.attributes.filter(function (attr) { return attr.name == 'port'})[0].value = ++maxPort;
+				// connectors from other routers need to connect to this addr:port
+				myPort = maxPort;
+				myAddr = ediv.attributes.filter(function (attr) { return attr.name == 'addr'})[0].value
+
+				// override the role. 'normal' is the default, but we want inter-router
+				ediv.attributes.filter(function( attr ) { return attr.name == 'role'})[0].selected = 'inter-router';
+				separatedEntities.push( ediv );
+				return true; // stop looping
+			}
+			return false;   // continue looping
+		})
+
+		// Add connector tabs for each new link on the topology graph
+		ent = schema.entityTypes['connector'];
+		newLinks.forEach(function (link, i) {
+   		    var noAnnotations = stripAnnotations('connector', ent, annotations);
+			var ediv = entity('connector', 'connector' + i, " " + link.__data__.source.name, noAnnotations, link.__data__.right, link)
+
+			// override the connector role. 'normal' is the default, but we want inter-router
+			ediv.attributes.filter(function( attr ) { return attr.name == 'role'})[0].selected = 'inter-router';
+
+			// find the addr:port of the inter-router listener to use
+			var listener = nodeInfo[link.__data__.source.key]['.listener'];
+			var attrs = listener.attributeNames;
+			for (var i=0; i<listener.results.length; ++i) {
+				var res = listener.results[i];
+				var role = QDRService.valFor(attrs, res, 'role');
+				if (role == 'inter-router') {
+					ediv.attributes.filter(function( attr ) { return attr.name == 'addr'})[0].value =
+						QDRService.valFor(attrs, res, 'addr')
+					ediv.attributes.filter(function( attr ) { return attr.name == 'port'})[0].value =
+						QDRService.valFor(attrs, res, 'port')
+					break;
+				}
+			}
+			if (link.__data__.right) {
+				// connectors from other nodes need to connect to the new router's listener addr:port
+   				ediv.attributes.filter(function (attr) { return attr.name == 'port'})[0].value = myPort;
+   				ediv.attributes.filter(function (attr) { return attr.name == 'addr'})[0].value = myAddr;
+
+				separatedEntities.push(ediv)
+			}
+			else
+				$scope.entities.push( ediv );
+		})
+		Array.prototype.push.apply($scope.entities, separatedEntities);
+
+		// update the description on all the annotation tabs
+		annotationEnts.forEach ( function (ent) {
+			var shared = Object.keys(annotations[ent.actualName]);
+			ent.description += " These fields are shared by " + shared.join(" and ") + ".";
+
+		})
+
+        $scope.cancel = function () {
+            $uibModalInstance.close()
+        };
+		$scope.testPattern = function (attr) {
+			if (attr.rawtype == 'path')
+				return /^(\/)?([^/\0]+(\/)?)+$/;
+				//return /^(.*\/)([^/]*)$/;
+			return /(.*?)/;
+		}
+
+		$scope.attributeDescription = '';
+		$scope.attributeType = '';
+		$scope.attributeRequired = '';
+		$scope.attributeUnique = '';
+		$scope.active = 'container'
+		$scope.fieldsetDivs = "/fieldsetDivs.html"
+		$scope.setActive = function (tabName) {
+			$scope.active = tabName
+		}
+		$scope.isActive = function (tabName) {
+			return $scope.active === tabName
+		}
+		$scope.showDescription = function (attr, e) {
+			$scope.attributeDescription = attr.description;
+			var offset = jQuery(e.currentTarget).offset()
+			jQuery('.attr-description').offset({top: offset.top})
+
+			$scope.attributeType = "Type: " + JSON.stringify(attr.rawtype);
+			$scope.attributeRequired = attr.required ? 'required' : '';
+			$scope.attributeUnique = attr.unique ? 'Must be unique' : '';
+		}
+        // handle the download button click
+        // copy the dialog's values to the original node
+        $scope.download = function () {
+	        $uibModalInstance.close({entities: $scope.entities, annotations: annotations});
+        }
+
+		$scope.selectAnnotationTab = function (tabName) {
+            var tabs = $( "#tabs" ).tabs();
+            tabs.tabs("select", tabName);
+		}
+
+        var initTabs = function () {
+            var div = angular.element("#tabs");
+            if (!div.width()) {
+                setTimeout(initTabs, 100);
+                return;
+            }
+            $( "#tabs" )
+                .tabs()
+                .addClass('ui-tabs-vertical ui-helper-clearfix');
+        }
+        // start the update loop
+        initTabs();
+
+  });
+
+QDR.module.controller("QDR.DownloadDialogController", function($scope, QDRService, $templateCache, $window, $uibModalInstance, results) {
+
+		var result = results.entities;
+		var annotations = results.annotations;
+		var annotationKeys = Object.keys(annotations);
+		var annotationSections = {};
+
+		// use the router's name as the file name if present
+		$scope.newRouterName = 'router';
+		result.forEach( function (e) {
+			if (e.actualName == 'router') {
+				e.attributes.forEach( function (a) {
+					if (a.name == 'name') {
+						$scope.newRouterName = a.value;
+					}
+				})
+			}
+		})
+		$scope.newRouterName = $scope.newRouterName + ".conf";
+
+		var template = $templateCache.get('config-file-header.html');
+		$scope.verbose = true;
+		$scope.$watch('verbose', function (newVal) {
+			if (newVal !== undefined) {
+				// recreate output using current verbose setting
+				getOutput();
+			}
+		})
+
+		var getOutput = function () {
+			$scope.output = template + '\n';
+			$scope.parts = [];
+			var commentChar = '#'
+			result.forEach(function (entity) {
+				// don't output a section for annotations, they get flattened into the entities
+				var section = "";
+				if (entity.icon) {
+					section += "##\n## Add to " + entity.link.__data__.source.name + "'s configuration file\n##\n";
+				}
+				section += "##\n## " + QDRService.humanify(entity.actualName) + " - " + entity.description + "\n##\n";
+				section += entity.actualName + " {\n";
+				entity.attributes.forEach(function (attribute) {
+					if (attribute.input == 'select')
+						attribute.value = attribute.selected;
+
+					// treat values with all spaces and empty strings as undefined
+					attribute.value = String(attribute.value).trim();
+					if (attribute.value === 'undefined' || attribute.value === '')
+						attribute.value = undefined;
+
+					if ($scope.verbose) {
+						commentChar = attribute.required || attribute.value != attribute['default'] ? ' ' : '#';
+						if (!attribute.value) {
+							commentChar = '#';
+							attribute.value = '';
+						}
+						section += commentChar + "    "
+							+ attribute.name + ":" + Array(Math.max(20 - attribute.name.length, 1)).join(" ")
+							+ attribute.value
+						    + Array(Math.max(20 - ((attribute.value)+"").length, 1)).join(" ")
+							+ '# ' + attribute.description
+						    + "\n";
+					} else {
+						if (attribute.value) {
+							if (attribute.value != attribute['default'] || attribute.required)
+								section += "    "
+									+ attribute.name + ":" + Array(20 - attribute.name.length).join(" ")
+									+ attribute.value + "\n";
+
+						}
+					}
+				})
+				section += "}\n\n";
+				// if entity.icon is true, this is a connector intended for another router
+				if (entity.icon)
+					$scope.parts.push({output: section,
+								link: entity.link,
+								name: entity.link.__data__.source.name,
+								references: entity.references});
+				else
+					$scope.output += section;
+
+				// if this section is actually an annotation
+				if (annotationKeys.indexOf(entity.actualName) > -1) {
+					annotationSections[entity.actualName] = section;
+				}
+			})
+			// go back and add annotation sections to the parts
+			$scope.parts.forEach (function (part) {
+				for (var section in annotationSections) {
+					if (part.references.indexOf(section) > -1) {
+						part.output += annotationSections[section];
+					}
+				}
+			})
+			QDR.log.debug($scope.output);
+		}
+
+        // handle the download button click
+        $scope.download = function () {
+			var blob = new Blob([$scope.output], { type: 'text/plain' });
+	        var downloadLink = angular.element('<a></a>');
+	        downloadLink.attr('href', ($window.URL || $window.webkitURL).createObjectURL(blob));
+	        downloadLink.attr('download', $scope.newRouterName);
+	        downloadLink[0].click();
+        }
+
+		$scope.downloadPart = function (part) {
+			var linkName = part.link.__data__.source.name + 'additional.conf';
+			var blob = new Blob([part.output], { type: 'text/plain' });
+	        var downloadLink = angular.element('<a></a>');
+	        downloadLink.attr('href', ($window.URL || $window.webkitURL).createObjectURL(blob));
+	        downloadLink.attr('download', linkName);
+	        downloadLink[0].click();
+
+			QDR.log.debug(part);
+		}
+
+		$scope.done = function () {
+	        $uibModalInstance.close();
+		}
+});
+
+  return QDR;
+}(QDR || {}));


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org