Full Code of filearts/plunker for AI

master 84071165b63e cached
360 files
8.7 MB
2.3M tokens
822 symbols
1 requests
Download .txt
Showing preview only (9,231K chars total). Download the full file or copy to clipboard to get everything.
Repository: filearts/plunker
Branch: master
Commit: 84071165b63e
Files: 360
Total size: 8.7 MB

Directory structure:
gitextract_2z_jhlig/

├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── config.sample.json
├── package.json
├── server.js
└── servers/
    ├── api/
    │   ├── .gitignore
    │   ├── .npmignore
    │   ├── errors.coffee
    │   ├── index.coffee
    │   ├── lib/
    │   │   └── database.coffee
    │   ├── middleware/
    │   │   ├── cache.coffee
    │   │   ├── cors.coffee
    │   │   ├── json.coffee
    │   │   ├── session.coffee
    │   │   └── user.coffee
    │   ├── package.json
    │   ├── schema/
    │   │   ├── packages/
    │   │   │   ├── create.json
    │   │   │   └── update.json
    │   │   └── plunks/
    │   │       ├── create.json
    │   │       └── update.json
    │   └── server.js
    ├── embed/
    │   ├── .gitignore
    │   ├── assets/
    │   │   ├── bootstrap/
    │   │   │   ├── js/
    │   │   │   │   ├── bootstrap-affix.js
    │   │   │   │   ├── bootstrap-alert.js
    │   │   │   │   ├── bootstrap-all.js
    │   │   │   │   ├── bootstrap-button.js
    │   │   │   │   ├── bootstrap-carousel.js
    │   │   │   │   ├── bootstrap-collapse.js
    │   │   │   │   ├── bootstrap-dropdown.js
    │   │   │   │   ├── bootstrap-modal.js
    │   │   │   │   ├── bootstrap-popover.js
    │   │   │   │   ├── bootstrap-scrollspy.js
    │   │   │   │   ├── bootstrap-tab.js
    │   │   │   │   ├── bootstrap-tooltip.js
    │   │   │   │   ├── bootstrap-transition.js
    │   │   │   │   └── bootstrap-typeahead.js
    │   │   │   └── less/
    │   │   │       ├── accordion.less
    │   │   │       ├── alerts.less
    │   │   │       ├── bootstrap.less
    │   │   │       ├── breadcrumbs.less
    │   │   │       ├── button-groups.less
    │   │   │       ├── buttons.less
    │   │   │       ├── carousel.less
    │   │   │       ├── close.less
    │   │   │       ├── code.less
    │   │   │       ├── component-animations.less
    │   │   │       ├── dropdowns.less
    │   │   │       ├── font-awesome.less
    │   │   │       ├── forms.less
    │   │   │       ├── grid.less
    │   │   │       ├── hero-unit.less
    │   │   │       ├── labels-badges.less
    │   │   │       ├── layouts.less
    │   │   │       ├── mixins.less
    │   │   │       ├── modals.less
    │   │   │       ├── navbar.less
    │   │   │       ├── navs.less
    │   │   │       ├── pager.less
    │   │   │       ├── pagination.less
    │   │   │       ├── popovers.less
    │   │   │       ├── progress-bars.less
    │   │   │       ├── reset.less
    │   │   │       ├── responsive-1200px-min.less
    │   │   │       ├── responsive-767px-max.less
    │   │   │       ├── responsive-768px-979px.less
    │   │   │       ├── responsive-navbar.less
    │   │   │       ├── responsive-utilities.less
    │   │   │       ├── responsive.less
    │   │   │       ├── scaffolding.less
    │   │   │       ├── sprites.less
    │   │   │       ├── tables.less
    │   │   │       ├── thumbnails.less
    │   │   │       ├── tooltip.less
    │   │   │       ├── type.less
    │   │   │       ├── utilities.less
    │   │   │       ├── variables.less
    │   │   │       └── wells.less
    │   │   ├── css/
    │   │   │   ├── components/
    │   │   │   │   └── navbar.less
    │   │   │   ├── pages/
    │   │   │   │   └── embed.less
    │   │   │   └── vendor/
    │   │   │       └── prettify.less
    │   │   └── js/
    │   │       ├── pages/
    │   │       │   └── embed.coffee
    │   │       ├── services/
    │   │       │   ├── importer.coffee
    │   │       │   ├── plunks.coffee
    │   │       │   └── url.coffee
    │   │       └── vendor/
    │   │           ├── angular-sanitize.js
    │   │           ├── angular-ui.js
    │   │           ├── angular.js
    │   │           ├── jquery.cookie.js
    │   │           ├── jquery.js
    │   │           ├── overthrow.js
    │   │           ├── prettify.js
    │   │           └── showdown.js
    │   ├── index.coffee
    │   ├── middleware/
    │   │   └── expose.coffee
    │   ├── package.json
    │   ├── server.js
    │   └── views/
    │       └── embed.jade
    ├── raw/
    │   ├── .gitignore
    │   ├── index.coffee
    │   ├── package.json
    │   ├── server.js
    │   └── views/
    │       └── directory.jade
    ├── run/
    │   ├── .gitignore
    │   ├── index.coffee
    │   ├── middleware/
    │   │   ├── cors.coffee
    │   │   └── json.coffee
    │   ├── package.json
    │   ├── schema/
    │   │   └── previews/
    │   │       └── create.json
    │   ├── server.js
    │   └── views/
    │       └── directory.jade
    └── www/
        ├── .gitignore
        ├── assets/
        │   ├── bootstrap/
        │   │   ├── js/
        │   │   │   ├── bootstrap-affix.js
        │   │   │   ├── bootstrap-alert.js
        │   │   │   ├── bootstrap-all.js
        │   │   │   ├── bootstrap-button.js
        │   │   │   ├── bootstrap-carousel.js
        │   │   │   ├── bootstrap-collapse.js
        │   │   │   ├── bootstrap-dropdown.js
        │   │   │   ├── bootstrap-modal.js
        │   │   │   ├── bootstrap-popover.js
        │   │   │   ├── bootstrap-scrollspy.js
        │   │   │   ├── bootstrap-tab.js
        │   │   │   ├── bootstrap-tooltip.js
        │   │   │   ├── bootstrap-transition.js
        │   │   │   └── bootstrap-typeahead.js
        │   │   └── less/
        │   │       ├── accordion.less
        │   │       ├── alerts.less
        │   │       ├── bootstrap.less
        │   │       ├── breadcrumbs.less
        │   │       ├── button-groups.less
        │   │       ├── buttons.less
        │   │       ├── carousel.less
        │   │       ├── close.less
        │   │       ├── code.less
        │   │       ├── component-animations.less
        │   │       ├── dropdowns.less
        │   │       ├── font-awesome.less
        │   │       ├── forms.less
        │   │       ├── grid.less
        │   │       ├── hero-unit.less
        │   │       ├── labels-badges.less
        │   │       ├── layouts.less
        │   │       ├── mixins.less
        │   │       ├── modals.less
        │   │       ├── navbar.less
        │   │       ├── navs.less
        │   │       ├── pager.less
        │   │       ├── pagination.less
        │   │       ├── popovers.less
        │   │       ├── progress-bars.less
        │   │       ├── reset.less
        │   │       ├── responsive-1200px-min.less
        │   │       ├── responsive-767px-max.less
        │   │       ├── responsive-768px-979px.less
        │   │       ├── responsive-navbar.less
        │   │       ├── responsive-utilities.less
        │   │       ├── responsive.less
        │   │       ├── scaffolding.less
        │   │       ├── sprites.less
        │   │       ├── tables.less
        │   │       ├── thumbnails.less
        │   │       ├── tooltip.less
        │   │       ├── type.less
        │   │       ├── utilities.less
        │   │       ├── variables.less
        │   │       └── wells.less
        │   ├── css/
        │   │   ├── common/
        │   │   │   └── style.less
        │   │   ├── components/
        │   │   │   ├── discussion.less
        │   │   │   ├── gallery.less
        │   │   │   ├── importer.less
        │   │   │   ├── multipanel.less
        │   │   │   ├── navbar.less
        │   │   │   ├── previewer.less
        │   │   │   ├── share.less
        │   │   │   ├── sidebar.less
        │   │   │   ├── statusbar.less
        │   │   │   ├── streamer.less
        │   │   │   ├── tags.less
        │   │   │   ├── toolbar.less
        │   │   │   └── userpanel.less
        │   │   ├── pages/
        │   │   │   ├── editor.less
        │   │   │   ├── landing.less
        │   │   │   └── preview.less
        │   │   └── vendor/
        │   │       ├── jquery-layout.less
        │   │       └── prettify.less
        │   └── js/
        │       ├── directives/
        │       │   ├── ace.coffee
        │       │   ├── builder.coffee
        │       │   ├── card.coffee
        │       │   ├── chat.coffee
        │       │   ├── discussion.coffee
        │       │   ├── layout.coffee
        │       │   ├── multipanel.coffee
        │       │   ├── share.coffee
        │       │   ├── statusbar.coffee
        │       │   ├── toolbar.coffee
        │       │   └── userpanel.coffee
        │       ├── pages/
        │       │   ├── editor.coffee
        │       │   └── landing.coffee
        │       ├── services/
        │       │   ├── catalogue.coffee
        │       │   ├── downloader.coffee
        │       │   ├── importer.coffee
        │       │   ├── modes.coffee
        │       │   ├── notifier.coffee
        │       │   ├── pages.coffee
        │       │   ├── panels.coffee
        │       │   ├── panes/
        │       │   │   ├── builder.coffee
        │       │   │   ├── explore.coffee
        │       │   │   ├── lint.coffee
        │       │   │   ├── previewer.coffee
        │       │   │   ├── readme.coffee
        │       │   │   └── streamer.coffee
        │       │   ├── panes-dev/
        │       │   │   ├── about.coffee
        │       │   │   ├── compiler.coffee
        │       │   │   ├── discussion.coffee
        │       │   │   └── settings.coffee
        │       │   ├── plunks.coffee
        │       │   ├── scratch.coffee
        │       │   ├── session.coffee
        │       │   ├── url.coffee
        │       │   └── whitelist.coffee
        │       ├── socialbuttons.js
        │       └── vendor/
        │           ├── ace/
        │           │   ├── ace.js
        │           │   ├── keybinding-emacs.js
        │           │   ├── keybinding-vim.js
        │           │   ├── mode-c9search.js
        │           │   ├── mode-c_cpp.js
        │           │   ├── mode-clojure.js
        │           │   ├── mode-coffee.js
        │           │   ├── mode-coldfusion.js
        │           │   ├── mode-csharp.js
        │           │   ├── mode-css.js
        │           │   ├── mode-diff.js
        │           │   ├── mode-glsl.js
        │           │   ├── mode-golang.js
        │           │   ├── mode-groovy.js
        │           │   ├── mode-haxe.js
        │           │   ├── mode-html.js
        │           │   ├── mode-jade.js
        │           │   ├── mode-java.js
        │           │   ├── mode-javascript.js
        │           │   ├── mode-json.js
        │           │   ├── mode-jsp.js
        │           │   ├── mode-jsx.js
        │           │   ├── mode-latex.js
        │           │   ├── mode-less.js
        │           │   ├── mode-liquid.js
        │           │   ├── mode-lua.js
        │           │   ├── mode-luapage.js
        │           │   ├── mode-markdown.js
        │           │   ├── mode-ocaml.js
        │           │   ├── mode-perl.js
        │           │   ├── mode-pgsql.js
        │           │   ├── mode-php.js
        │           │   ├── mode-powershell.js
        │           │   ├── mode-python.js
        │           │   ├── mode-ruby.js
        │           │   ├── mode-scad.js
        │           │   ├── mode-scala.js
        │           │   ├── mode-scss.js
        │           │   ├── mode-sh.js
        │           │   ├── mode-sql.js
        │           │   ├── mode-svg.js
        │           │   ├── mode-tcl.js
        │           │   ├── mode-text.js
        │           │   ├── mode-textile.js
        │           │   ├── mode-xml.js
        │           │   ├── mode-xquery.js
        │           │   ├── mode-yaml.js
        │           │   ├── theme-ambiance.js
        │           │   ├── theme-chrome.js
        │           │   ├── theme-clouds.js
        │           │   ├── theme-clouds_midnight.js
        │           │   ├── theme-cobalt.js
        │           │   ├── theme-crimson_editor.js
        │           │   ├── theme-dawn.js
        │           │   ├── theme-dreamweaver.js
        │           │   ├── theme-eclipse.js
        │           │   ├── theme-github.js
        │           │   ├── theme-idle_fingers.js
        │           │   ├── theme-kr_theme.js
        │           │   ├── theme-merbivore.js
        │           │   ├── theme-merbivore_soft.js
        │           │   ├── theme-mono_industrial.js
        │           │   ├── theme-monokai.js
        │           │   ├── theme-pastel_on_dark.js
        │           │   ├── theme-solarized_dark.js
        │           │   ├── theme-solarized_light.js
        │           │   ├── theme-textmate.js
        │           │   ├── theme-tomorrow.js
        │           │   ├── theme-tomorrow_night.js
        │           │   ├── theme-tomorrow_night_blue.js
        │           │   ├── theme-tomorrow_night_bright.js
        │           │   ├── theme-tomorrow_night_eighties.js
        │           │   ├── theme-twilight.js
        │           │   ├── theme-vibrant_ink.js
        │           │   ├── theme-xcode.js
        │           │   ├── worker-coffee.js
        │           │   ├── worker-css.js
        │           │   ├── worker-javascript.js
        │           │   ├── worker-json.js
        │           │   └── worker-xquery.js
        │           ├── angular-cookies.js
        │           ├── angular-jq.js
        │           ├── angular-resource.js
        │           ├── angular-sanitize.js
        │           ├── angular-ui.js
        │           ├── angular.js
        │           ├── backbone.js
        │           ├── beautify.js
        │           ├── handlebars.js
        │           ├── jquery.cookie.js
        │           ├── jquery.history.js
        │           ├── jquery.js
        │           ├── jquery.layout.js
        │           ├── jquery.lazyload.js
        │           ├── jquery.timeago.js
        │           ├── jquery.ui.custom.js
        │           ├── jszip.js
        │           ├── noty/
        │           │   ├── jquery.noty.js
        │           │   ├── layouts/
        │           │   │   ├── bottom.js
        │           │   │   ├── bottomCenter.js
        │           │   │   ├── bottomLeft.js
        │           │   │   ├── bottomRight.js
        │           │   │   ├── center.js
        │           │   │   ├── centerLeft.js
        │           │   │   ├── centerRight.js
        │           │   │   ├── inline.js
        │           │   │   ├── top.js
        │           │   │   ├── topCenter.js
        │           │   │   ├── topLeft.js
        │           │   │   └── topRight.js
        │           │   ├── promise.js
        │           │   └── themes/
        │           │       └── default.js
        │           ├── overthrow.js
        │           ├── page.js
        │           ├── postmessage.js
        │           ├── prettify.js
        │           ├── semver.js
        │           ├── showdown.js
        │           └── underscore.js
        ├── index.coffee
        ├── middleware/
        │   ├── error.coffee
        │   ├── expose.coffee
        │   └── session.coffee
        ├── models/
        │   └── user.coffee
        ├── package.json
        ├── server.js
        └── views/
            ├── auth/
            │   ├── error.jade
            │   └── success.jade
            ├── editor.jade
            ├── landing.jade
            └── partials/
                ├── discuss.jade
                ├── home.jade
                ├── preview.jade
                ├── tag.jade
                ├── tags.jade
                ├── user.jade
                └── users.jade

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz

pids
logs
results
tests

config.json

node_modules
npm-debug.log

.c9revisions

builtAssets

================================================
FILE: .gitmodules
================================================
[submodule "servers/www/assets/select2"]
	path = servers/www/assets/select2
	url = git://github.com/ivaynberg/select2.git


================================================
FILE: LICENSE
================================================
Copyright (C) 2015 Filearts

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.


================================================
FILE: README.md
================================================
# Plunker

[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/filearts/plunker?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

The next generation of lightweight collaborative online editing.

#### WARNING: This repository does not contain the code for what you see running on http://plnkr.co

 > The current code for Plunker is in the repositories listed below

Originally, Plunker was coded in a single repository with different sub-servers existing in the `/servers`
path. The entire application was run on a single server.

However, with increasing popularity, reality decided to come hang out and make everyone's lives difficult.
The solution was simple; since the components of Plunker were designed as 'sub-servers', it should be easy
to split them out and run them separately. However, having different logical entities with different
functions in the same repository doesn't make sense.

I decided to create separate repositories for each of the Plunker servers that are currently deployed on
Nodejitsu. They are as follows:

#### Plunker component repositories

* [plunker_api](//github.com/filearts/plunker_api) The server that connects to a mongodb database and serves requests over a restful api.
* [plunker_www](//github.com/filearts/plunker_www) The server that is responsible for hosting and running the front-end that users see and touch everyday.
* [plunker-run-plugin](//github.com/ggoodman/plunker-run-plugin) The server that allows for previewing of plunks and temporary previews and also does the dynamic transpilation.
* [plunker_collab](//github.com/filearts/plunker_collab) The server that serves the code necessary for collaborative coding as well as doing the actual operational transformation over a browserchannel connection.
* [plunker_embed](//github.com/filearts/plunker_embed) The server that hosts the embedded views of plunks.

### Plunker config files

Each server, once cloned locally, requires one or two `config.json` files to run.

**Servers that use the environment-specific config files `config.development.json` and `config.production.json`:**

* plunker_api
* plunker_www
* plunker_run
* plunker_collab

Only `plunker_embed` uses a single `config.json` file.

**Sample configuration file:**

 > Not all fields are required by each server, but if all are present no harm *should* come to any small animals.
 
```javascript
{
  "host": "hostname.com",
  "url": {
    "www": "http://hostname.com",
    "collab": "http://collab.hostname.com",
    "api": "http://api.hostname.com",
    "embed": "http://embed.hostname.com",
    "run": "http://run.hostname.com",
    "carbonadsH": "OOPS, this is pretty specific to my current deploy",
    "carbonadsV": "OOPS, this is pretty specific to my current deploy"
  },
  "port": 8080,
  "oauth": {
    "github": {
      "id": "series_of_random_chars",
      "secret": "longer_series_of_random_chars"
    }
  }
}
```



# Everything below this point is out of date or incorrect!

 > ...And there be dragons

# Usage

```
git clone git://github.com/filearts/plunker.git
git submodule update --init

npm install

node server.js
```

## Editor API

### `POST /edit/`

You can send a `POST` request to `/edit/` to bootstrap the editor with the basic structure of a plunk.  The JSON format for this is described below.

```javascript
{
  "description": "Description of Plunk",
  "tags": ["array", "of", "tags"],
  "files": [
    {
      "filename": "index.html",
      "content": "<html><script src=\"script.js\"></script></html>"
    },
    {
      "filename": "script.js",
      "content": "alert('hello world');"
    }
  ]
}
```

## License

Copyright [Filearts](https://github.com/filearts)


================================================
FILE: config.sample.json
================================================
{
  "host": "localhost", // (Required) The hostname at which Plunk will be run
  "nosubdomains": true, // Run Plunker off of a single domain (instead of {api,run,embed,raw}.host)
  "oauth": {
    "github": { // To enable logging in via github
      "id": "111111111111111",
      "secret": "11111111111111111111111111111111"
    }
  },
  "mongodb": {
    "hostname": "localhost",
    "port": 27017,
    "pathname": "plunker",
    "auth": "plunker:plunker"
  }
}

================================================
FILE: package.json
================================================
{
  "name": "plunker",
  "subdomain": "plunker",
  "scripts": {
    "start": "server.js"
  },
  "engines": {
    "node": "0.6.x"
  },
  "version": "0.3.13-4",
  "private": true,
  "dependencies": {
    "coffee-script": "1.3.x",
    "express": "2.5.x",
    "gzippo": "0.1.x",
    "jade": "0.25.x",
    "less": "1.3.x",
    "mime": "1.2.x",
    "underscore": "1.3.x",
    "backbone": "0.9.x",
    "connect-assets": "2.2.x",
    "share": "0.5.x",
    "express-subdomains": "0.0.x",
    "authom": "0.4.x",
    "nconf": "0.5.x",
    "json-schema": "https://github.com/kriszyp/json-schema/tarball/master",
    "request": "2.9.x",
    "connect": "1.x",
    "async": "0.1.x",
    "mongoose": "3.x",
    "lru-cache": "1.1.x"
  },
  "bundledDependencies": [
    "json-schema"
  ]
}

================================================
FILE: server.js
================================================
// Everything starts better with coffee
var coffee = require("coffee-script");
var express = require("express");


var nconf = require("nconf").use("memory")
  .argv()
  .env()
  .file({file: "config.json"})
  .defaults({
    "PORT": 8080
  });

if (!nconf.get("host")) {
  console.error("The host option is required for Plunker to start");
} else {
  
  var host = nconf.get("host");

  // Configure global paths
  if (nconf.get("nosubdomains")) {
    nconf.set("url:www", "http://" + host);
    nconf.set("url:raw", "http://" + host + "/raw");
    nconf.set("url:run", "http://" + host + "/run");
    nconf.set("url:api", "http://" + host + "/api");
  } else {
    nconf.set("url:www", "http://" + host);
    nconf.set("url:raw", "http://raw." + host);
    nconf.set("url:run", "http://run." + host);
    nconf.set("url:api", "http://api." + host);
  }
  
  // Create and start the parent server
  express.createServer()
    //.use(express.logger())
    .use(require("express-subdomains").use("raw").use("api").use("run").use("embed").middleware)
    .use("/api", require("./servers/api"))
    .use("/raw", require("./servers/raw"))
    .use("/run", require("./servers/run"))
    .use("/embed", require("./servers/embed"))
    .use(require("./servers/www"))
    .listen(nconf.get("PORT"));
  
  console.log("Started plunker in", nconf.get("NODE_ENV") || "development", "at", nconf.get("host"), "on port", nconf.get("PORT"), "using subdomains:", !nconf.get("nosubdomains"));
}


================================================
FILE: servers/api/.gitignore
================================================
lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz

pids
logs
results
tests

node_modules
npm-debug.log

.c9revisions

builtAssets

================================================
FILE: servers/api/.npmignore
================================================
lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz

pids
logs
results
tests

node_modules
npm-debug.log

.c9revisions

builtAssets

================================================
FILE: servers/api/errors.coffee
================================================
class APIError extends Error
  toJSON: -> {@code, @message}

module.exports =
  ParseError: class extends APIError
    constructor: ->
      @code = 400
      @message = "Problems parsing JSON"
  ValidationError: class extends APIError
    constructor: (@errors) ->
      @code = 422
      @message = "Validation failed"
    toJSON: -> {@errors, @code, @message}
  NotFound: class extends APIError
    constructor: ->
      @code = 404
      @message = "Not found"
  PermissionDenied: class extends APIError
    constructor: ->
      @code = 404
      @message = "Permission denied"
  InternalServerError: class extends APIError
    constructor: ->
      @code = 500
      @message = "Internal server error"

================================================
FILE: servers/api/index.coffee
================================================
nconf = require("nconf")
request = require("request")
mime = require("mime")
express = require("express")
url = require("url")
querystring = require("querystring")
_ = require("underscore")._
validator = require("json-schema")
mime = require("mime")
gate = require("json-gate")
semver = require("semver")

apiErrors = require("./errors")
apiUrl = nconf.get('url:api')

module.exports = app = express.createServer()


genid = (len = 16, prefix = "", keyspace = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") ->
  prefix += keyspace.charAt(Math.floor(Math.random() * keyspace.length)) while len-- > 0
  prefix


database = require("./lib/database")

Session = database.model("Session")
User = database.model("User")
Plunk = database.model("Plunk")
Package = database.model("Package")



PRUNE_FREQUENCY = 1000 * 60 * 60 * 6 # Prune the sessions every 6 hours
SCORE_INCREMENT = 1000 * 60 * 60 * 6 # Each vote bumps the plunk forward 6 hours

pruneSessions = ->
  console.log "Pruning sessions"
  Session.prune()

setInterval pruneSessions, PRUNE_FREQUENCY
pruneSessions()

app.configure ->
  app.use require("./middleware/cors").middleware()
  app.use require("./middleware/cache").middleware()
  app.use require("./middleware/json").middleware()
  app.use require("./middleware/session").middleware(sessions: database.model("Session"))
    
  app.use app.router
  
  app.use (err, req, res, next) ->
    json = if err.toJSON? then err.toJSON() else
      message: err.message or "Unknown error"
      code: err.code or 500
    
    res.json(json, json.code)
    
    throw err
    
  app.set "jsonp callback", true

###
# RESTful sessions
###


createSession = (token, user, cb) ->
  session = new Session
    last_access: new Date
    keychain: {}
    
  session.user = user if user
  
  session.save (err) -> cb(err, session)

# Convenience endpoint to get the current session or create a new one
app.get "/session", (req, res, next) ->
  res.header "Cache-Control", "no-cache"
  
  if req.session then res.json(req.session)
  else createSession null, null, (err, session) ->
    if err then next(err)
    else res.json(session, 201)


app.post "/sessions", (req, res, next) ->
  createSession null, null, (err, session) ->
    if err then next(err)
    else res.json(session, 201)

app.get "/sessions/:id", (req, res, next) ->
  Session.findById(req.params.id).populate("user").exec (err, session) ->
    if err then next(err)
    else unless session then next(new apiErrors.NotFound)
    else if Date.now() - session.last_access.valueOf() > nconf.get("session:max_age") then next(new apiErrors.NotFound)
    else
      unless session.user then res.json(session.toJSON())
      else User.findById session.user, (err, user) ->
        if err then next(err)
        else res.json(_.extend(session, user: user.toJSON()))



app.del "/sessions/:id/user", (req, res, next) ->
  Session.findById req.params.id, (err, session) ->
    if err then next(err)
    else unless session then next(new apiErrors.NotFound)
    else
      session.user = null
      session.save (err) ->
        if err then next(err)
        else res.json(session)

app.post "/sessions/:id/user", (req, res, next) ->
  Session.findById req.params.id, (err, session) ->
    if err then next(new apiErrors.NotFound)
    else
      unless token = req.param("token") then next(new apiErrors.MissingArgument("token"))
      else
        sessid = req.param("id")
        
        request.get "https://api.github.com/user?access_token=#{token}", (err, response, body) ->
          return next(new apiErrors.Error(err)) if err
          return next(new apiErrors.PermissionDenied) if response.status >= 400
      
          try
            body = JSON.parse(body)
          catch e
            return next(new apiErrors.ParseError)
          
          service_id = "github:#{body.id}"
          
          createUser = (cb) ->
            user_json =
              login: body.login
              gravatar_id: body.gravatar_id
              service_id: service_id
              
            User.create(user_json, cb)
          
          withUser = (err, user) ->
            if err then next(err)
            else
              session.user = user
              session.auth =
                service_name: "github"
                service_token: token
              session.save (err) ->
                if err then next(err)
                else res.json(_.extend(session.toJSON(), user: user.toJSON()), 201)
              
          User.findOne { service_id: service_id }, (err, user) ->
            unless err or not user then withUser(null, user)
            else createUser(withUser)




###
# Plunks
###

ownsPlunk = (session, json) ->
  owner = false
  
  if session
    owner ||= !!(json.user and session.user and json.user.login is session.user.login)
    owner ||= !!(session.keychain and session.keychain.id(json.id)?.token is json.token)

  owner
  
preparePlunk = (session, plunk, populate = {}) ->
  json = _.extend plunk.toJSON(), populate
  
  delete json.token unless ownsPlunk(session, json)
  delete json.voters
  
  if json.files then json.files = do ->
    files = {}
    for file in json.files
      file.raw_url = "#{json.raw_url}#{file.filename}"
      files[file.filename] = file
    files
  
  json.thumbed = session?.user? and plunk.voters.indexOf(""+session.user._id) >= 0
  
  json

preparePlunks = (session, plunks) -> _.map plunks, (plunk) -> preparePlunk(session, plunk)


fetchPlunks = (options, req, res, next) ->
  page = parseInt(req.param("p", "1"), 10)
  limit = parseInt(req.param("pp", "8"))
  
  options.baseUrl ||= "#{apiUrl}/plunks"
  
  search = options.query or {}
  
  if req.user
    search.$or = [
      'private': $ne: true
    ,
      user: req.user._id
    ]
  else
    search.private = $ne: true
  
  query = Plunk.find(search)
  query.sort(options.sort or {updated_at: -1})
  query.select("-files")
  
  query.populate("user").paginate page, limit, (err, plunks, count, pages, current) ->
    if err then next(err)
    else
      link = []
      
      if current < pages
        link.push "<#{options.baseUrl}?p=#{page+1}&pp=#{limit}>; rel=\"next\""
        link.push "<#{options.baseUrl}?p=#{pages}&pp=#{limit}>; rel=\"last\""
      if current > 1
        link.push "<#{options.baseUrl}?p=#{page-1}&pp=#{limit}>; rel=\"prev\""
        link.push "<#{options.baseUrl}?p=1&pp=#{limit}>; rel=\"first\""
        
      res.header("Link", link.join(", ")) if link.length
      res.json(preparePlunks(req.session, plunks))

# List plunks
app.get "/plunks", (req, res, next) ->
  fetchPlunks({}, req, res, next)
  
# List plunks
app.get "/plunks/trending", (req, res, next) ->
  options =
    baseUrl: "#{apiUrl}/plunks/trending"
    sort: "-score -updated_at"
    
  fetchPlunks(options, req, res, next)
  
# List plunks
app.get "/plunks/popular", (req, res, next) ->
  options =
    baseUrl: "#{apiUrl}/plunks/popular"
    sort: "-thumbs -updated_at"
    
  fetchPlunks(options, req, res, next)
  
# Create plunk
app.post "/plunks", (req, res, next) ->
  json = req.body
  schema = require("./schema/plunks/create")
  {valid, errors} = validator.validate(json, schema)
  
  # Despite its awesomeness, revalidator does not support disallow or additionalProperties; we need to check plunk.files size
  if json.files and _.isEmpty(json.files)
    valid = false
    errors.push
      attribute: "minProperties"
      property: "files"
      message: "A minimum of one file is required"
  
  unless valid then next(new apiErrors.ValidationError(errors))
  else
    
    json.files = _.map json.files, (file, filename) ->
      filename: filename
      content: file.content
      mime: mime.lookup(filename, "text/plain")
      
    json.tags = _.uniq(json.tags) if json.tags

    plunk = new Plunk(json)
    plunk.user = req.user._id if req.user
    
    # TODO: This is inefficient as the number space fills up; consider: http://www.faqs.org/patents/app/20090063601
    # Keep generating new ids until not taken
    savePlunk = ->
      plunk._id = if json.private then genid(20) else genid(6)
    
      plunk.save (err) ->
        if err
          if err.code is 11000 then savePlunk()
          else next(err)
        else
          unless req.user and req.session and req.session.keychain
            req.session.keychain.push _id: plunk._id, token: plunk.token
            req.session.save()
          
          populate = {}
          populate.user = req.user.toJSON() if req.user
          
          # User is not populated so we shove it in **UGLY**
          res.json(preparePlunk(req.session, plunk, populate), 201)
          
    savePlunk()

# Read plunk
app.get "/plunks/:id", (req, res, next) ->
  Plunk.findById(req.params.id).populate("user").exec (err, plunk) ->
    if err or not plunk then next(new apiErrors.NotFound)
    else res.json(preparePlunk(req.session, plunk))
    
# Update plunk
app.post "/plunks/:id", (req, res, next) ->
  Plunk.findById(req.params.id).populate("user").exec (err, plunk) ->
    if err or not plunk or not ownsPlunk(req.session, plunk) then next(new apiErrors.NotFound)
    else
      json = req.body
      schema = require("./schema/plunks/update")
      {valid, errors} = validator.validate(json, schema)
      
      # Despite its awesomeness, validator does not support disallow or additionalProperties; we need to check plunk.files size
      if json.files and _.isEmpty(json.files)
        valid = false
        errors.push
          attribute: "minProperties"
          property: "files"
          message: "A minimum of one file is required"
      
      unless valid then next(new apiErrors.ValidationError(errors))
      else
        oldFiles = {}
        
        for file, index in plunk.files
          oldFiles[file.filename] = file
        
        for filename, file of json.files
          # Attempt to delete
          if file is null
            oldFiles[filename].remove() if oldFiles[filename]
          # Modification to an existing file
          else if old = oldFiles[filename]
            if file.filename
              old.filename = file.filename
              old.mime = mime.lookup(file.filename, "text/plain")
            if file.content?
              old.content = file.content
            
            if file.filename or file.content then old.save()
          # New file; handle only if content provided
          else if file.content
            plunk.files.push
              filename: filename
              content: file.content
              
        if json.tags
          plunk.tags ||= []
          
          for tagname, add of json.tags
            if add
              plunk.tags.push(tagname)
            else
              plunk.tags.splice(idx, 1) if (idx = plunk.tags.indexOf(tagname)) >= 0
        
        plunk.tags = _.uniq(plunk.tags)
        plunk.updated_at = new Date
        plunk.description = json.description if json.description
        plunk.user = req.user._id if req.user
        plunk.save (err) ->
          if err then next(new apiErrors.InternalServerError(err))
          else
            populate = {}
            populate.user = req.user.toJSON() if req.user
                
            res.json(preparePlunk(req.session, plunk, populate))
            
# Obtain a list of a plunk's forks
app.get "/plunks/:id/forks", (req, res, next) ->
  Plunk.findOne({_id: req.params.id}).exec (err, plunk) ->
    if err or not plunk then next(new apiErrors.NotFound)
    else
      options =
        query: {fork_of: req.params.id}
        baseUrl: "#{apiUrl}/plunk/#{req.params.id}/forks"
        sort: "-updated_at"
        
      fetchPlunks(options, req, res, next)

# Give a thumbs-up to a plunk
app.post "/plunks/:id/thumb", (req, res, next) ->
  unless req.user then return next(new apiErrors.NotFound)
  
  Plunk.findOne(_id: req.params.id).where("voters").ne(req.user).exec (err, plunk) ->
    if err or not plunk then next(new apiErrors.NotFound)
    else
      plunk.score ||= plunk.created_at.valueOf()
      plunk.thumbs ||= 0
      
      plunk.voters.addToSet(req.user._id)
      plunk.score += SCORE_INCREMENT
      plunk.thumbs++
      
      plunk.save (err) ->
        if err then next(new apiErrors.InternalServerError(err))
        else res.json({ thumbs: plunk.get("thumbs"), score: plunk.score}, 201)

# Remove a thumbs-up to a plunk
app.del "/plunks/:id/thumb", (req, res, next) ->
  unless req.user then return next(new apiErrors.NotFound)
  
  Plunk.findOne(_id: req.params.id).where("voters").equals(req.user).exec (err, plunk) ->
    if err or not plunk then next(new apiErrors.NotFound)
    else
      plunk.voters.remove(req.user)
      plunk.score -= SCORE_INCREMENT
      plunk.thumbs--
      plunk.save (err) ->
        if err then next(new apiErrors.InternalServerError(err))
        else res.json({ thumbs: plunk.get("thumbs"), score: plunk.score}, 200)
        
# Fork an existing plunk
app.post "/plunks/:id/forks", (req, res, next) ->
  Plunk.findById(req.params.id).populate("user").exec (err, parent) ->
    if err or not parent then next(new apiErrors.NotFound)
    else
      json = req.body
      schema = require("./schema/plunks/create")
      {valid, errors} = validator.validate(json, schema)
      
      # Despite its awesomeness, revalidator does not support disallow or additionalProperties; we need to check plunk.files size
      if json.files and _.isEmpty(json.files)
        valid = false
        errors.push
          attribute: "minProperties"
          property: "files"
          message: "A minimum of one file is required"
      
      unless valid then next(new apiErrors.ValidationError(errors))
      else
        
        json.files = _.map json.files, (file, filename) ->
          filename: filename
          content: file.content
          mime: mime.lookup(filename, "text/plain")
      
        json.tags = _.uniq(json.tags) if json.tags
    
        plunk = new Plunk(json)
        plunk.user = req.user._id if req.user
        plunk.fork_of = parent._id
                
        # TODO: This is inefficient as the number space fills up; consider: http://www.faqs.org/patents/app/20090063601
        # Keep generating new ids until not taken
        savePlunk = ->
          plunk._id = if json.private then genid(20) else genid(6)
        
          plunk.save (err) ->
            if err
              if err.code is 11000 then savePlunk()
              else next(err)
            else
              # Update syntax to avoid triggering auto-update of updated_at on parent
              parent.forks.push(plunk._id)
              parent.save()
              
              if not req.user and req.session and req.session.keychain
                req.session.keychain.push _id: plunk._id, token: plunk.token
                req.session.save()
              
              populate = {}
              populate.user = req.user.toJSON() if req.user
                
              res.json(preparePlunk(req.session, plunk, populate), 201)
              
        savePlunk()
    
# Delete plunk
app.del "/plunks/:id", (req, res, next) ->
  Plunk.findById(req.params.id).populate("user").exec (err, plunk) ->
    if err or not plunk or not ownsPlunk(req.session, plunk) then next(new apiErrors.NotFound)
    else plunk.remove ->
      res.send(204)
      
fetchUser = (req, res, next) ->
  User.findOne({login: req.params.username}).exec (err, user) ->
    if err or not user then next(new apiErrors.NotFound)
    else
      req.found_user = user
      next()

# Fetch a user
app.get "/users/:username", fetchUser, (req, res, next) ->
  res.json(req.found_user)

# List a user's plunks
app.get "/users/:username/plunks", fetchUser, (req, res, next) ->
  options =
    query: {user: req.found_user._id}
    baseUrl: "#{apiUrl}/users/#{req.params.username}/plunks"

  fetchPlunks(options, req, res, next)

# List plunks a user gave a thumbs-up
app.get "/users/:username/thumbed", fetchUser, (req, res, next) ->
  options =
    query: {voters: req.found_user._id}
    baseUrl: "#{apiUrl}/users/#{req.params.username}/thumbed"

  fetchPlunks(options, req, res, next)
  
app.get "/tags", (req, res, next) ->
  Plunk.aggregate [
    $unwind: "$tags"
  ,
    $group: _id: "$tags", count: { $sum: 1 }
  ], (err, json) ->
    if err then res.send(404, err)
    else res.json(json)
    
# List plunks having a specific tag
app.get "/tags/:tagname/plunks", (req, res, next) ->
  options =
    query: {tags: req.params.tagname}
    baseUrl: "#{apiUrl}/tags/#{req.params.tagname}/plunks"
    
  fetchPlunks(options, req, res, next)
  


createSchema = gate.createSchema(require("./schema/packages/create.json"))
updateSchema = gate.createSchema(require("./schema/packages/update.json"))


withUser = (req, res, next) ->
  unless req.user then res.send(400)
  else next()

withPackage = (req, res, next) ->
  Package.findOne({name: req.params.name}).select("-_id -versions._id").exec (err, pkg) ->
    if err then res.send(404)
    else
      req.package = pkg
      next()
      

preparePackage = (session, pkg, populate = {}) ->
  json = _.extend pkg.toJSON(), populate
  
  delete json.id
  
  json.editable = true if session?.user and 0 <= json.maintainers.indexOf(session.user.login)
  
  json.versions.sort (v1, v2) -> semver.rcompare(v1.semver, v2.semver)
  
  json

preparePackages = (session, pkgs) -> _.map pkgs, (pkg) -> preparePackage(session, pkg)

app.get "/packages", (req, res, next) ->
  Package.find({}).select("-_id -versions._id").exec (err, docs) ->
    if err then res.send(err, 404)
    else res.json(preparePackages(req.session, docs))
    
    

app.post "/packages", withUser, (req, res, next) ->
  createSchema.validate req.body, (err, json) ->
    if err then res.json err, 400
    else
      json.maintainers = [req.user.login]
      
      versions = []
      versions.push versionDef for version, versionDef of req.body.versions
      
      json.versions = versions
      
      Package.create json, (err, pkg) ->
        if err
          if err.code is 11000 then res.json "A package with that name already exists", 409
          else res.json err.message, 500
        else res.json preparePackage(req.session, pkg), 201

app.get "/packages/:name", withPackage, (req, res, next) ->
  res.json(preparePackage(req.session, req.package))

app.post "/packages/:name", withUser, (req, res, next) ->
  updateSchema.validate req.body, (err, json) ->
    if err
      console.log "Invalid request", arguments...
      res.json err, 400
    else
      for keyword, val of json.keywords
        if val is null then (json.$pullAll ||= keywords: []).keywords.push keyword
        else (json.$pushAll ||= keywords: []).keywords.push keyword
      
      delete json.keywords
      
      
      Package.findOneAndUpdate
        name: req.params.name
        maintainers: req.user.login
      , json, (err, pkg) ->
        if err then res.json(err, 404)
        else res.json(preparePackage(req.session, pkg), 200)

app.del "/packages/:name", withUser, (req, res, next) ->
  Package.findOneAndRemove
    name: req.params.name
    maintainers: req.user.login
  , (err, pkg) ->
    if err then res.json(err, 404)
    else if pkg then res.send(204)
    else res.send(404)


app.all "*", (req, res, next) ->
  next new apiErrors.NotFound

================================================
FILE: servers/api/lib/database.coffee
================================================
mongoose = require("mongoose")
nconf = require("nconf")
mime = require("mime")
url = require("url")
mime = require("mime")

mongoose.connect "mongodb:" + url.format(nconf.get("mongodb"))

connectTimeout = setTimeout(errorConnecting, 1000 * 30)

apiUrl = nconf.get('url:api')
wwwUrl = nconf.get('url:www')
runUrl = nconf.get('url:run')

errorConnecting = ->
  console.error "Error connecting to mongodb"
  process.exit(1)
  
mongoose.connection.on "open", -> clearTimeout(connectTimeout)

{Schema, Document, Query} = mongoose
{ObjectId} = Schema

genid = (len = 16, prefix = "", keyspace = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") ->
  prefix += keyspace.charAt(Math.floor(Math.random() * keyspace.length)) while len-- > 0
  prefix


# Change object _id to normal id
Document::toJSON = ->
  json = @toObject(json: true, virtuals: true)
  json.id = json._id if json._id
  delete json._id
  delete json.__v
  
  json
  
Query::paginate = (page, limit, cb) ->
  page = Math.max(1, parseInt(page, 10))
  limit = Math.max(4, Math.min(12, parseInt(limit, 10))) # [4, 10]
  query = @
  model = @model
  
  query.skip(page * limit - limit).limit(limit).exec (err, docs) ->
    if err then return cb(err, null, null)
    model.count query._conditions, (err, count) ->
      if err then return cb(err, null, null)
      cb(null, docs, count, Math.ceil(count / limit), page)
  
lastModified = (schema, options = {}) ->
  schema.add updated_at: Date
  schema.pre "save", (next) ->
    @updated_at = new Date
    next()
  
  if options.index then schema.path("updated_at").index(options.index)
  
TokenSchema = new Schema
  _id: String
  token: String


SessionSchema = new Schema
  user:
    type: Schema.ObjectId
    ref: "User"
  last_access: { type: Date, index: true, 'default': Date.now }
  public_id: { type: String, 'default': genid }
  auth: {}
  keychain: [TokenSchema]

SessionSchema.virtual("url").get -> apiUrl + "/sessions/#{@_id}"
SessionSchema.virtual("user_url").get -> apiUrl + "/sessions/#{@_id}/user"
SessionSchema.virtual("age").get -> Date.now() - @last_access

SessionSchema.plugin(lastModified)

SessionSchema.statics.prune = (max_age = 1000 * 60 * 60 * 24 * 7 * 2, cb = ->) ->
  @find({}).where("last_access").lt(new Date(Date.now() - max_age)).remove()

mongoose.model "Session", SessionSchema



mongoose.model "User", UserSchema = new Schema
  login: { type: String, index: true }
  gravatar_id: String
  service_id: { type: String, index: { unique: true } }
  profile: {}


PlunkFileSchema = new Schema
  filename: String
  content: String
  
PlunkFileSchema.virtual("mime").get -> mime.lookup(@filename, "text/plain")
  
PlunkVoteSchema = new Schema
  user: { type: Schema.ObjectId, ref: "User" }
  created_at: { type: Date, 'default': Date.now }

PlunkSchema = new Schema
  _id: { type: String, index: true }
  description: String
  score: { type: Number, 'default': Date.now }
  thumbs: { type: Number, 'default': 0 }
  created_at: { type: Date, 'default': Date.now }
  updated_at: { type: Date, 'default': Date.now }
  token: { type: String, 'default': genid.bind(null, 16) }
  'private': { type: Boolean, 'default': false }
  source: {}
  files: [PlunkFileSchema]
  user: { type: Schema.ObjectId, ref: "User", index: true }
  comments: { type: Number, 'default': 0 }
  fork_of: { type: String, ref: "Plunk", index: true }
  forks: [{ type: String, ref: "Plunk", index: true }]
  tags: [{ type: String, index: true}]
  voters: [{ type: Schema.ObjectId, ref: "Users", index: true }]
  
PlunkSchema.index(score: -1, updated_at: -1)
PlunkSchema.index(thumbs: -1, updated_at: -1)

PlunkSchema.virtual("url").get -> apiUrl + "/plunks/#{@_id}"
PlunkSchema.virtual("raw_url").get -> runUrl + "/plunks/#{@_id}/"
PlunkSchema.virtual("comments_url").get -> wwwUrl + "/#{@_id}/comments"

mongoose.model "Plunk", PlunkSchema



PackageVersionSchema = new Schema
  semver: String
  scripts: [String]
  styles: [String]

PackageSchema = new Schema
  name: { type: String, match: /^[-_.a-z0-9]+$/i, index: true, unique: true }
  description: { type: String }
  homepage: String
  keywords: [{type: String, index: true}]
  versions: [PackageVersionSchema]
  maintainers: [{ type: String, index: true }]

mongoose.model "Package", PackageSchema



module.exports = mongoose

================================================
FILE: servers/api/middleware/cache.coffee
================================================
module.exports.middleware = (config = {}) ->
  (req, res, next) ->
    res.header("Cache-Control", "no-cache")
    res.header("Expires", "0")
    
    next()

================================================
FILE: servers/api/middleware/cors.coffee
================================================
nconf = require("nconf")

module.exports.middleware = (config = {}) ->
  
  valid = [nconf.get('url:www'), nconf.get('url:embed'), "http://plnkr.co"]
  
  (req, res, next) ->
    # Just send the headers all the time. That way we won't miss the right request ;-)
    # Other CORS middleware just wouldn't work for me
    # TODO: Minimize these headers to only those needed at the right time

    res.header("Access-Control-Allow-Origin", if req.headers.origin in valid then req.headers.origin else "*")
    res.header("Access-Control-Allow-Methods", "OPTIONS,GET,PUT,POST,DELETE")
    res.header("Access-Control-Allow-Headers", "Authorization, User-Agent, Referer, X-Requested-With, Proxy-Authorization, Proxy-Connection, Accept-Language, Accept-Encoding, Accept-Charset, Connection, Content-Length, Host, Origin, Pragma, Accept-Charset, Cache-Control, Accept, Content-Type")
    res.header("Access-Control-Expose-Headers", "Link")
    res.header("Access-Control-Max-Age", "60")

    if "OPTIONS" == req.method then res.send(200)
    else next()

================================================
FILE: servers/api/middleware/json.coffee
================================================
apiErrors = require("../errors")


module.exports.middleware = (config = {}) ->
  (req, res, next) ->
    if "GET" == req.method or "HEAD" == req.method then return next()
    
    req.body ||= {}
    
    buf = '';
    
    req.setEncoding('utf8');
    req.on "data", (chunk) -> buf += chunk
    req.on "end", ->
      return next() unless buf
      try
        req.body = JSON.parse(buf)
        next()
      catch err
        next(new apiErrors.ParseError())

================================================
FILE: servers/api/middleware/session.coffee
================================================
nconf = require("nconf")

module.exports.middleware = (config = {}) ->
  (req, res, next) ->
    if req.query.sessid then sessid = req.query.sessid
    else if auth = req.header("Authorization") then [header, sessid] = auth.match(/^token (\S+)$/i)

    if sessid and sessid.length then config.sessions.findById(sessid).populate("user").exec (err, session) ->
      return next(err) if err
      return next() unless session
      return next() if Date.now() - session.last_access.valueOf() > nconf.get("session:max_age")
      session.last_access = new Date
      session.save -> # Don't wait for the response
      
      req.session = session
      req.user = session.user if session.user

      next()
    else next()

================================================
FILE: servers/api/middleware/user.coffee
================================================
module.exports.middleware = (config = {}) ->
  (req, res, next) ->
    unless req.session and req.session.user then next()
    else config.users.findById req.session.user, (err, user) ->
      return next(err) if err
      
      unless user
        delete req.user
        delete req.session.user
      else req.user = user
      
      next()

================================================
FILE: servers/api/package.json
================================================
{
  "name": "plunker-api",
  "subdomain": "plunker-api",
  "domains": [
    "api.plnkr.co"
  ],
  "scripts": {
    "start": "server.js"
  },
  "engines": {
    "node": "0.8.x"
  },
  "version": "0.3.14-27",
  "private": true,
  "dependencies": {
    "coffee-script": "1.3.x",
    "express": "2.5.11",
    "mime": "1.2.x",
    "underscore": "1.3.x",
    "backbone": "0.9.x",
    "nconf": "0.5.x",
    "json-schema": "https://github.com/kriszyp/json-schema/tarball/master",
    "request": "2.9.x",
    "connect": "1.x",
    "async": "0.1.x",
    "mongoose": "3.4.x",
    "lru-cache": "1.1.x",
    "json-gate": "0.8.x",
    "semver": "1.1.x"
  }
}

================================================
FILE: servers/api/schema/packages/create.json
================================================
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "name": {
      "type": "string",
      "required": true
    },
    "description": {
      "type": "string",
      "default": ""
    },
    "homepage": {
      "type": "string",
      "default": ""
    },
    "keywords": {
      "type": "array",
      "additionalItems": false,
      "uniqueItems": true,
      "items": {
        "type": "string"
      }
    },
    "versions": {
      "required": true,
      "type": "object",
      "additionalProperties": false,
      "patternProperties": {
        "^(\\d+\\.\\d+\\.\\d+)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$": {
          "type": "object",
          "required": true,
          "additionalProperties": false,
          "properties": {
            "semver": {
              "type": "string",
              "required": true,
              "pattern": "^(\\d+\\.\\d+\\.\\d+)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$"
            },
            "scripts": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "styles": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  }
}

================================================
FILE: servers/api/schema/packages/update.json
================================================
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "name": {
      "type": "string"
    },
    "description": {
      "type": "string",
      "default": ""
    },
    "homepage": {
      "type": "string",
      "default": ""
    },
    "keywords": {
      "type": "object",
      "additionalProperties": false,
      "patternProperties": {
        "^(.+)?$": {
          "type": "boolean",
          "required": true
        }
      }
    }
  }
}

================================================
FILE: servers/api/schema/plunks/create.json
================================================
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "description": {
      "type": "string",
      "default": ""
    },
    "tags": {
      "type": "array",
      "additionalItems": false,
      "uniqueItems": true,
      "items": {
        "type": "string"
      }
    },
    "private": {
      "type": "boolean",
      "default": false
    },
    "source": {
      "type": [
        {
          "type": "null"
        }, {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "required": true,
              "enum": [ "plunker_no_de", "gist" ]
            },
            "url": {
              "type": "string",
              "required": true
            },
            "title": {
              "type": "string",
              "required": true
            },
            "description": {
              "type": "string"
            }
          }
        }
      ]
    },
    "files": {
      "required": true,
      "type": "object",
      "additionalProperties": false,
      "patternProperties": {
        "^[a-zA-z0-9_-]+(\\.[a-zA-Z0-9]+)?$": {
          "type": "object",
          "properties": {
            "content": {
              "type": "string",
              "required": true
            }
          }
        }
      }
    }
  }
}

================================================
FILE: servers/api/schema/plunks/update.json
================================================
{
  "type": "object",
  "additionalProperties": false,
  "minProperties": 1,
  "properties": {
    "description": {
      "type": "string",
      "default": ""
    },
    "tags": {
      "type": "object",
      "additionalProperties": false,
      "patternProperties": {
        "^[a-zA-Z0-9_][-a-zA-Z0-9_ :]*$": {
          "type": "boolean"
        }
      }
    },
    "files": {
      "type": "object",
      "additionalProperties": false,
      "patternProperties": {
        "^[-a-zA-Z0-9_]+(\\.[a-zA-Z0-9]+)?$": {
          "type": [
            {
              "type": "null"
            }, {
              "type": "object",
              "properties": {
                "filename": {
                  "type": "string"
                },
                "content": {
                  "type": "string"
                }
              },
              "minProperties": 1
            }
          ]
        }
      }
    }
  }
}

================================================
FILE: servers/api/server.js
================================================
// Everything starts better with coffee
var coffee = require("coffee-script");
var express = require("express");


var nconf = require("nconf").use("memory")
  .argv()
  .env()
  .file({file: "config.json"})
  .defaults({
    "PORT": 8080
  });

if (!nconf.get("host")) {
  console.error("The host option is required for Plunker to start");
} else {
  
  //process.env.NODE_ENV = "production";

  var host = nconf.get("host");

  // Configure global paths
  if (nconf.get("nosubdomains")) {
    nconf.set("url:www", "http://" + host);
    nconf.set("url:raw", "http://" + host + "/raw");
    nconf.set("url:run", "http://" + host + "/run");
    nconf.set("url:api", "http://" + host + "/api");
  } else {
    nconf.set("url:www", "http://" + host);
    nconf.set("url:raw", "http://raw." + host);
    nconf.set("url:run", "http://run." + host);
    nconf.set("url:api", "http://api." + host);
  }
  
  // Create and start the parent server
  require("./index").listen(nconf.get("PORT"));
  
  console.log("Started plunker-www in", nconf.get("NODE_ENV") || "development", "at", nconf.get("host"), "on port", nconf.get("PORT"), "using subdomains:", !nconf.get("nosubdomains"));
}


================================================
FILE: servers/embed/.gitignore
================================================
lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz

pids
logs
results
tests

node_modules
npm-debug.log

.c9revisions

builtAssets

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-affix.js
================================================
/* ==========================================================
 * bootstrap-affix.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#affix
 * ==========================================================
 * Copyright 2012 Twitter, 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.
 * ========================================================== */


!function ($) {

  "use strict"; // jshint ;_;


 /* AFFIX CLASS DEFINITION
  * ====================== */

  var Affix = function (element, options) {
    this.options = $.extend({}, $.fn.affix.defaults, options)
    this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
    this.$element = $(element)
    this.checkPosition()
  }

  Affix.prototype.checkPosition = function () {
    if (!this.$element.is(':visible')) return

    var scrollHeight = $(document).height()
      , scrollTop = this.$window.scrollTop()
      , position = this.$element.offset()
      , offset = this.options.offset
      , offsetBottom = offset.bottom
      , offsetTop = offset.top
      , reset = 'affix affix-top affix-bottom'
      , affix

    if (typeof offset != 'object') offsetBottom = offsetTop = offset
    if (typeof offsetTop == 'function') offsetTop = offset.top()
    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()

    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
      'top'    : false

    if (this.affixed === affix) return

    this.affixed = affix
    this.unpin = affix == 'bottom' ? position.top - scrollTop : null

    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
  }


 /* AFFIX PLUGIN DEFINITION
  * ======================= */

  $.fn.affix = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('affix')
        , options = typeof option == 'object' && option
      if (!data) $this.data('affix', (data = new Affix(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.affix.Constructor = Affix

  $.fn.affix.defaults = {
    offset: 0
  }


 /* AFFIX DATA-API
  * ============== */

  $(window).on('load', function () {
    $('[data-spy="affix"]').each(function () {
      var $spy = $(this)
        , data = $spy.data()

      data.offset = data.offset || {}

      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
      data.offsetTop && (data.offset.top = data.offsetTop)

      $spy.affix(data)
    })
  })


}(window.jQuery);

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-alert.js
================================================
/* ==========================================================
 * bootstrap-alert.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#alerts
 * ==========================================================
 * Copyright 2012 Twitter, 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.
 * ========================================================== */


!function ($) {

  "use strict"; // jshint ;_;


 /* ALERT CLASS DEFINITION
  * ====================== */

  var dismiss = '[data-dismiss="alert"]'
    , Alert = function (el) {
        $(el).on('click', dismiss, this.close)
      }

  Alert.prototype.close = function (e) {
    var $this = $(this)
      , selector = $this.attr('data-target')
      , $parent

    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    }

    $parent = $(selector)

    e && e.preventDefault()

    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())

    $parent.trigger(e = $.Event('close'))

    if (e.isDefaultPrevented()) return

    $parent.removeClass('in')

    function removeElement() {
      $parent
        .trigger('closed')
        .remove()
    }

    $.support.transition && $parent.hasClass('fade') ?
      $parent.on($.support.transition.end, removeElement) :
      removeElement()
  }


 /* ALERT PLUGIN DEFINITION
  * ======================= */

  $.fn.alert = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('alert')
      if (!data) $this.data('alert', (data = new Alert(this)))
      if (typeof option == 'string') data[option].call($this)
    })
  }

  $.fn.alert.Constructor = Alert


 /* ALERT DATA-API
  * ============== */

  $(function () {
    $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
  })

}(window.jQuery);

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-all.js
================================================
//= require bootstrap-transition
//= require bootstrap-button
//= require bootstrap-dropdown

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-button.js
================================================
/* ============================================================
 * bootstrap-button.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#buttons
 * ============================================================
 * Copyright 2012 Twitter, 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.
 * ============================================================ */


!function ($) {

  "use strict"; // jshint ;_;


 /* BUTTON PUBLIC CLASS DEFINITION
  * ============================== */

  var Button = function (element, options) {
    this.$element = $(element)
    this.options = $.extend({}, $.fn.button.defaults, options)
  }

  Button.prototype.setState = function (state) {
    var d = 'disabled'
      , $el = this.$element
      , data = $el.data()
      , val = $el.is('input') ? 'val' : 'html'

    state = state + 'Text'
    data.resetText || $el.data('resetText', $el[val]())

    $el[val](data[state] || this.options[state])

    // push to event loop to allow forms to submit
    setTimeout(function () {
      state == 'loadingText' ?
        $el.addClass(d).attr(d, d) :
        $el.removeClass(d).removeAttr(d)
    }, 0)
  }

  Button.prototype.toggle = function () {
    var $parent = this.$element.parent('[data-toggle="buttons-radio"]')

    $parent && $parent
      .find('.active')
      .removeClass('active')

    this.$element.toggleClass('active')
  }


 /* BUTTON PLUGIN DEFINITION
  * ======================== */

  $.fn.button = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('button')
        , options = typeof option == 'object' && option
      if (!data) $this.data('button', (data = new Button(this, options)))
      if (option == 'toggle') data.toggle()
      else if (option) data.setState(option)
    })
  }

  $.fn.button.defaults = {
    loadingText: 'loading...'
  }

  $.fn.button.Constructor = Button


 /* BUTTON DATA-API
  * =============== */

  $(function () {
    $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
      var $btn = $(e.target)
      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
      $btn.button('toggle')
    })
  })

}(window.jQuery);

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-carousel.js
================================================
/* ==========================================================
 * bootstrap-carousel.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#carousel
 * ==========================================================
 * Copyright 2012 Twitter, 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.
 * ========================================================== */


!function ($) {

  "use strict"; // jshint ;_;


 /* CAROUSEL CLASS DEFINITION
  * ========================= */

  var Carousel = function (element, options) {
    this.$element = $(element)
    this.options = options
    this.options.slide && this.slide(this.options.slide)
    this.options.pause == 'hover' && this.$element
      .on('mouseenter', $.proxy(this.pause, this))
      .on('mouseleave', $.proxy(this.cycle, this))
  }

  Carousel.prototype = {

    cycle: function (e) {
      if (!e) this.paused = false
      this.options.interval
        && !this.paused
        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
      return this
    }

  , to: function (pos) {
      var $active = this.$element.find('.item.active')
        , children = $active.parent().children()
        , activePos = children.index($active)
        , that = this

      if (pos > (children.length - 1) || pos < 0) return

      if (this.sliding) {
        return this.$element.one('slid', function () {
          that.to(pos)
        })
      }

      if (activePos == pos) {
        return this.pause().cycle()
      }

      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
    }

  , pause: function (e) {
      if (!e) this.paused = true
      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
        this.$element.trigger($.support.transition.end)
        this.cycle()
      }
      clearInterval(this.interval)
      this.interval = null
      return this
    }

  , next: function () {
      if (this.sliding) return
      return this.slide('next')
    }

  , prev: function () {
      if (this.sliding) return
      return this.slide('prev')
    }

  , slide: function (type, next) {
      var $active = this.$element.find('.item.active')
        , $next = next || $active[type]()
        , isCycling = this.interval
        , direction = type == 'next' ? 'left' : 'right'
        , fallback  = type == 'next' ? 'first' : 'last'
        , that = this
        , e = $.Event('slide', {
            relatedTarget: $next[0]
          })

      this.sliding = true

      isCycling && this.pause()

      $next = $next.length ? $next : this.$element.find('.item')[fallback]()

      if ($next.hasClass('active')) return

      if ($.support.transition && this.$element.hasClass('slide')) {
        this.$element.trigger(e)
        if (e.isDefaultPrevented()) return
        $next.addClass(type)
        $next[0].offsetWidth // force reflow
        $active.addClass(direction)
        $next.addClass(direction)
        this.$element.one($.support.transition.end, function () {
          $next.removeClass([type, direction].join(' ')).addClass('active')
          $active.removeClass(['active', direction].join(' '))
          that.sliding = false
          setTimeout(function () { that.$element.trigger('slid') }, 0)
        })
      } else {
        this.$element.trigger(e)
        if (e.isDefaultPrevented()) return
        $active.removeClass('active')
        $next.addClass('active')
        this.sliding = false
        this.$element.trigger('slid')
      }

      isCycling && this.cycle()

      return this
    }

  }


 /* CAROUSEL PLUGIN DEFINITION
  * ========================== */

  $.fn.carousel = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('carousel')
        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
        , action = typeof option == 'string' ? option : options.slide
      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
      if (typeof option == 'number') data.to(option)
      else if (action) data[action]()
      else if (options.interval) data.cycle()
    })
  }

  $.fn.carousel.defaults = {
    interval: 5000
  , pause: 'hover'
  }

  $.fn.carousel.Constructor = Carousel


 /* CAROUSEL DATA-API
  * ================= */

  $(function () {
    $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
      var $this = $(this), href
        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
        , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
      $target.carousel(options)
      e.preventDefault()
    })
  })

}(window.jQuery);

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-collapse.js
================================================
/* =============================================================
 * bootstrap-collapse.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#collapse
 * =============================================================
 * Copyright 2012 Twitter, 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.
 * ============================================================ */


!function ($) {

  "use strict"; // jshint ;_;


 /* COLLAPSE PUBLIC CLASS DEFINITION
  * ================================ */

  var Collapse = function (element, options) {
    this.$element = $(element)
    this.options = $.extend({}, $.fn.collapse.defaults, options)

    if (this.options.parent) {
      this.$parent = $(this.options.parent)
    }

    this.options.toggle && this.toggle()
  }

  Collapse.prototype = {

    constructor: Collapse

  , dimension: function () {
      var hasWidth = this.$element.hasClass('width')
      return hasWidth ? 'width' : 'height'
    }

  , show: function () {
      var dimension
        , scroll
        , actives
        , hasData

      if (this.transitioning) return

      dimension = this.dimension()
      scroll = $.camelCase(['scroll', dimension].join('-'))
      actives = this.$parent && this.$parent.find('> .accordion-group > .in')

      if (actives && actives.length) {
        hasData = actives.data('collapse')
        if (hasData && hasData.transitioning) return
        actives.collapse('hide')
        hasData || actives.data('collapse', null)
      }

      this.$element[dimension](0)
      this.transition('addClass', $.Event('show'), 'shown')
      $.support.transition && this.$element[dimension](this.$element[0][scroll])
    }

  , hide: function () {
      var dimension
      if (this.transitioning) return
      dimension = this.dimension()
      this.reset(this.$element[dimension]())
      this.transition('removeClass', $.Event('hide'), 'hidden')
      this.$element[dimension](0)
    }

  , reset: function (size) {
      var dimension = this.dimension()

      this.$element
        .removeClass('collapse')
        [dimension](size || 'auto')
        [0].offsetWidth

      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')

      return this
    }

  , transition: function (method, startEvent, completeEvent) {
      var that = this
        , complete = function () {
            if (startEvent.type == 'show') that.reset()
            that.transitioning = 0
            that.$element.trigger(completeEvent)
          }

      this.$element.trigger(startEvent)

      if (startEvent.isDefaultPrevented()) return

      this.transitioning = 1

      this.$element[method]('in')

      $.support.transition && this.$element.hasClass('collapse') ?
        this.$element.one($.support.transition.end, complete) :
        complete()
    }

  , toggle: function () {
      this[this.$element.hasClass('in') ? 'hide' : 'show']()
    }

  }


 /* COLLAPSIBLE PLUGIN DEFINITION
  * ============================== */

  $.fn.collapse = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('collapse')
        , options = typeof option == 'object' && option
      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.collapse.defaults = {
    toggle: true
  }

  $.fn.collapse.Constructor = Collapse


 /* COLLAPSIBLE DATA-API
  * ==================== */

  $(function () {
    $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
      var $this = $(this), href
        , target = $this.attr('data-target')
          || e.preventDefault()
          || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
        , option = $(target).data('collapse') ? 'toggle' : $this.data()
      $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
      $(target).collapse(option)
    })
  })

}(window.jQuery);

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-dropdown.js
================================================
/* ============================================================
 * bootstrap-dropdown.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#dropdowns
 * ============================================================
 * Copyright 2012 Twitter, 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.
 * ============================================================ */


!function ($) {

  "use strict"; // jshint ;_;


 /* DROPDOWN CLASS DEFINITION
  * ========================= */

  var toggle = '[data-toggle=dropdown]'
    , Dropdown = function (element) {
        var $el = $(element).on('click.dropdown.data-api', this.toggle)
        $('html').on('click.dropdown.data-api', function () {
          $el.parent().removeClass('open')
        })
      }

  Dropdown.prototype = {

    constructor: Dropdown

  , toggle: function (e) {
      var $this = $(this)
        , $parent
        , isActive

      if ($this.is('.disabled, :disabled')) return

      $parent = getParent($this)

      isActive = $parent.hasClass('open')

      clearMenus()

      if (!isActive) {
        $parent.toggleClass('open')
        $this.focus()
      }

      return false
    }

  , keydown: function (e) {
      var $this
        , $items
        , $active
        , $parent
        , isActive
        , index

      if (!/(38|40|27)/.test(e.keyCode)) return

      $this = $(this)

      e.preventDefault()
      e.stopPropagation()

      if ($this.is('.disabled, :disabled')) return

      $parent = getParent($this)

      isActive = $parent.hasClass('open')

      if (!isActive || (isActive && e.keyCode == 27)) return $this.click()

      $items = $('[role=menu] li:not(.divider) a', $parent)

      if (!$items.length) return

      index = $items.index($items.filter(':focus'))

      if (e.keyCode == 38 && index > 0) index--                                        // up
      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
      if (!~index) index = 0

      $items
        .eq(index)
        .focus()
    }

  }

  function clearMenus() {
    getParent($(toggle))
      .removeClass('open')
  }

  function getParent($this) {
    var selector = $this.attr('data-target')
      , $parent

    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    }

    $parent = $(selector)
    $parent.length || ($parent = $this.parent())

    return $parent
  }


  /* DROPDOWN PLUGIN DEFINITION
   * ========================== */

  $.fn.dropdown = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('dropdown')
      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
      if (typeof option == 'string') data[option].call($this)
    })
  }

  $.fn.dropdown.Constructor = Dropdown


  /* APPLY TO STANDARD DROPDOWN ELEMENTS
   * =================================== */

  $(function () {
    $('html')
      .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
    $('body')
      .on('click.dropdown touchstart.dropdown.data-api', '.dropdown', function (e) { e.stopPropagation() })
      .on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
      .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
  })

}(window.jQuery);

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-modal.js
================================================
/* =========================================================
 * bootstrap-modal.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#modals
 * =========================================================
 * Copyright 2012 Twitter, 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.
 * ========================================================= */


!function ($) {

  "use strict"; // jshint ;_;


 /* MODAL CLASS DEFINITION
  * ====================== */

  var Modal = function (element, options) {
    this.options = options
    this.$element = $(element)
      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
  }

  Modal.prototype = {

      constructor: Modal

    , toggle: function () {
        return this[!this.isShown ? 'show' : 'hide']()
      }

    , show: function () {
        var that = this
          , e = $.Event('show')

        this.$element.trigger(e)

        if (this.isShown || e.isDefaultPrevented()) return

        $('body').addClass('modal-open')

        this.isShown = true

        this.escape()

        this.backdrop(function () {
          var transition = $.support.transition && that.$element.hasClass('fade')

          if (!that.$element.parent().length) {
            that.$element.appendTo(document.body) //don't move modals dom position
          }

          that.$element
            .show()

          if (transition) {
            that.$element[0].offsetWidth // force reflow
          }

          that.$element
            .addClass('in')
            .attr('aria-hidden', false)
            .focus()

          that.enforceFocus()

          transition ?
            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
            that.$element.trigger('shown')

        })
      }

    , hide: function (e) {
        e && e.preventDefault()

        var that = this

        e = $.Event('hide')

        this.$element.trigger(e)

        if (!this.isShown || e.isDefaultPrevented()) return

        this.isShown = false

        $('body').removeClass('modal-open')

        this.escape()

        $(document).off('focusin.modal')

        this.$element
          .removeClass('in')
          .attr('aria-hidden', true)

        $.support.transition && this.$element.hasClass('fade') ?
          this.hideWithTransition() :
          this.hideModal()
      }

    , enforceFocus: function () {
        var that = this
        $(document).on('focusin.modal', function (e) {
          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
            that.$element.focus()
          }
        })
      }

    , escape: function () {
        var that = this
        if (this.isShown && this.options.keyboard) {
          this.$element.on('keyup.dismiss.modal', function ( e ) {
            e.which == 27 && that.hide()
          })
        } else if (!this.isShown) {
          this.$element.off('keyup.dismiss.modal')
        }
      }

    , hideWithTransition: function () {
        var that = this
          , timeout = setTimeout(function () {
              that.$element.off($.support.transition.end)
              that.hideModal()
            }, 500)

        this.$element.one($.support.transition.end, function () {
          clearTimeout(timeout)
          that.hideModal()
        })
      }

    , hideModal: function (that) {
        this.$element
          .hide()
          .trigger('hidden')

        this.backdrop()
      }

    , removeBackdrop: function () {
        this.$backdrop.remove()
        this.$backdrop = null
      }

    , backdrop: function (callback) {
        var that = this
          , animate = this.$element.hasClass('fade') ? 'fade' : ''

        if (this.isShown && this.options.backdrop) {
          var doAnimate = $.support.transition && animate

          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
            .appendTo(document.body)

          if (this.options.backdrop != 'static') {
            this.$backdrop.click($.proxy(this.hide, this))
          }

          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow

          this.$backdrop.addClass('in')

          doAnimate ?
            this.$backdrop.one($.support.transition.end, callback) :
            callback()

        } else if (!this.isShown && this.$backdrop) {
          this.$backdrop.removeClass('in')

          $.support.transition && this.$element.hasClass('fade')?
            this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
            this.removeBackdrop()

        } else if (callback) {
          callback()
        }
      }
  }


 /* MODAL PLUGIN DEFINITION
  * ======================= */

  $.fn.modal = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('modal')
        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
      if (!data) $this.data('modal', (data = new Modal(this, options)))
      if (typeof option == 'string') data[option]()
      else if (options.show) data.show()
    })
  }

  $.fn.modal.defaults = {
      backdrop: true
    , keyboard: true
    , show: true
  }

  $.fn.modal.Constructor = Modal


 /* MODAL DATA-API
  * ============== */

  $(function () {
    $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
      var $this = $(this)
        , href = $this.attr('href')
        , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
        , option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())

      e.preventDefault()

      $target
        .modal(option)
        .one('hide', function () {
          $this.focus()
        })
    })
  })

}(window.jQuery);

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-popover.js
================================================
/* ===========================================================
 * bootstrap-popover.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#popovers
 * ===========================================================
 * Copyright 2012 Twitter, 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.
 * =========================================================== */


!function ($) {

  "use strict"; // jshint ;_;


 /* POPOVER PUBLIC CLASS DEFINITION
  * =============================== */

  var Popover = function (element, options) {
    this.init('popover', element, options)
  }


  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
     ========================================== */

  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {

    constructor: Popover

  , setContent: function () {
      var $tip = this.tip()
        , title = this.getTitle()
        , content = this.getContent()

      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
      $tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content)

      $tip.removeClass('fade top bottom left right in')
    }

  , hasContent: function () {
      return this.getTitle() || this.getContent()
    }

  , getContent: function () {
      var content
        , $e = this.$element
        , o = this.options

      content = $e.attr('data-content')
        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)

      return content
    }

  , tip: function () {
      if (!this.$tip) {
        this.$tip = $(this.options.template)
      }
      return this.$tip
    }

  , destroy: function () {
      this.hide().$element.off('.' + this.type).removeData(this.type)
    }

  })


 /* POPOVER PLUGIN DEFINITION
  * ======================= */

  $.fn.popover = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('popover')
        , options = typeof option == 'object' && option
      if (!data) $this.data('popover', (data = new Popover(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.popover.Constructor = Popover

  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
    placement: 'right'
  , trigger: 'click'
  , content: ''
  , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
  })

}(window.jQuery);

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-scrollspy.js
================================================
/* =============================================================
 * bootstrap-scrollspy.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#scrollspy
 * =============================================================
 * Copyright 2012 Twitter, 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.
 * ============================================================== */


!function ($) {

  "use strict"; // jshint ;_;


 /* SCROLLSPY CLASS DEFINITION
  * ========================== */

  function ScrollSpy(element, options) {
    var process = $.proxy(this.process, this)
      , $element = $(element).is('body') ? $(window) : $(element)
      , href
    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
    this.selector = (this.options.target
      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
      || '') + ' .nav li > a'
    this.$body = $('body')
    this.refresh()
    this.process()
  }

  ScrollSpy.prototype = {

      constructor: ScrollSpy

    , refresh: function () {
        var self = this
          , $targets

        this.offsets = $([])
        this.targets = $([])

        $targets = this.$body
          .find(this.selector)
          .map(function () {
            var $el = $(this)
              , href = $el.data('target') || $el.attr('href')
              , $href = /^#\w/.test(href) && $(href)
            return ( $href
              && $href.length
              && [[ $href.position().top, href ]] ) || null
          })
          .sort(function (a, b) { return a[0] - b[0] })
          .each(function () {
            self.offsets.push(this[0])
            self.targets.push(this[1])
          })
      }

    , process: function () {
        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
          , maxScroll = scrollHeight - this.$scrollElement.height()
          , offsets = this.offsets
          , targets = this.targets
          , activeTarget = this.activeTarget
          , i

        if (scrollTop >= maxScroll) {
          return activeTarget != (i = targets.last()[0])
            && this.activate ( i )
        }

        for (i = offsets.length; i--;) {
          activeTarget != targets[i]
            && scrollTop >= offsets[i]
            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
            && this.activate( targets[i] )
        }
      }

    , activate: function (target) {
        var active
          , selector

        this.activeTarget = target

        $(this.selector)
          .parent('.active')
          .removeClass('active')

        selector = this.selector
          + '[data-target="' + target + '"],'
          + this.selector + '[href="' + target + '"]'

        active = $(selector)
          .parent('li')
          .addClass('active')

        if (active.parent('.dropdown-menu').length)  {
          active = active.closest('li.dropdown').addClass('active')
        }

        active.trigger('activate')
      }

  }


 /* SCROLLSPY PLUGIN DEFINITION
  * =========================== */

  $.fn.scrollspy = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('scrollspy')
        , options = typeof option == 'object' && option
      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.scrollspy.Constructor = ScrollSpy

  $.fn.scrollspy.defaults = {
    offset: 10
  }


 /* SCROLLSPY DATA-API
  * ================== */

  $(window).on('load', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      $spy.scrollspy($spy.data())
    })
  })

}(window.jQuery);

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-tab.js
================================================
/* ========================================================
 * bootstrap-tab.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#tabs
 * ========================================================
 * Copyright 2012 Twitter, 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.
 * ======================================================== */


!function ($) {

  "use strict"; // jshint ;_;


 /* TAB CLASS DEFINITION
  * ==================== */

  var Tab = function (element) {
    this.element = $(element)
  }

  Tab.prototype = {

    constructor: Tab

  , show: function () {
      var $this = this.element
        , $ul = $this.closest('ul:not(.dropdown-menu)')
        , selector = $this.attr('data-target')
        , previous
        , $target
        , e

      if (!selector) {
        selector = $this.attr('href')
        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
      }

      if ( $this.parent('li').hasClass('active') ) return

      previous = $ul.find('.active a').last()[0]

      e = $.Event('show', {
        relatedTarget: previous
      })

      $this.trigger(e)

      if (e.isDefaultPrevented()) return

      $target = $(selector)

      this.activate($this.parent('li'), $ul)
      this.activate($target, $target.parent(), function () {
        $this.trigger({
          type: 'shown'
        , relatedTarget: previous
        })
      })
    }

  , activate: function ( element, container, callback) {
      var $active = container.find('> .active')
        , transition = callback
            && $.support.transition
            && $active.hasClass('fade')

      function next() {
        $active
          .removeClass('active')
          .find('> .dropdown-menu > .active')
          .removeClass('active')

        element.addClass('active')

        if (transition) {
          element[0].offsetWidth // reflow for transition
          element.addClass('in')
        } else {
          element.removeClass('fade')
        }

        if ( element.parent('.dropdown-menu') ) {
          element.closest('li.dropdown').addClass('active')
        }

        callback && callback()
      }

      transition ?
        $active.one($.support.transition.end, next) :
        next()

      $active.removeClass('in')
    }
  }


 /* TAB PLUGIN DEFINITION
  * ===================== */

  $.fn.tab = function ( option ) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('tab')
      if (!data) $this.data('tab', (data = new Tab(this)))
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.tab.Constructor = Tab


 /* TAB DATA-API
  * ============ */

  $(function () {
    $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
      e.preventDefault()
      $(this).tab('show')
    })
  })

}(window.jQuery);

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-tooltip.js
================================================
/* ===========================================================
 * bootstrap-tooltip.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#tooltips
 * Inspired by the original jQuery.tipsy by Jason Frame
 * ===========================================================
 * Copyright 2012 Twitter, 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.
 * ========================================================== */


!function ($) {

  "use strict"; // jshint ;_;


 /* TOOLTIP PUBLIC CLASS DEFINITION
  * =============================== */

  var Tooltip = function (element, options) {
    this.init('tooltip', element, options)
  }

  Tooltip.prototype = {

    constructor: Tooltip

  , init: function (type, element, options) {
      var eventIn
        , eventOut

      this.type = type
      this.$element = $(element)
      this.options = this.getOptions(options)
      this.enabled = true

      if (this.options.trigger == 'click') {
        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
      } else if (this.options.trigger != 'manual') {
        eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
        this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
      }

      this.options.selector ?
        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
        this.fixTitle()
    }

  , getOptions: function (options) {
      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())

      if (options.delay && typeof options.delay == 'number') {
        options.delay = {
          show: options.delay
        , hide: options.delay
        }
      }

      return options
    }

  , enter: function (e) {
      var self = $(e.currentTarget)[this.type](this._options).data(this.type)

      if (!self.options.delay || !self.options.delay.show) return self.show()

      clearTimeout(this.timeout)
      self.hoverState = 'in'
      this.timeout = setTimeout(function() {
        if (self.hoverState == 'in') self.show()
      }, self.options.delay.show)
    }

  , leave: function (e) {
      var self = $(e.currentTarget)[this.type](this._options).data(this.type)

      if (this.timeout) clearTimeout(this.timeout)
      if (!self.options.delay || !self.options.delay.hide) return self.hide()

      self.hoverState = 'out'
      this.timeout = setTimeout(function() {
        if (self.hoverState == 'out') self.hide()
      }, self.options.delay.hide)
    }

  , show: function () {
      var $tip
        , inside
        , pos
        , actualWidth
        , actualHeight
        , placement
        , tp

      if (this.hasContent() && this.enabled) {
        $tip = this.tip()
        this.setContent()

        if (this.options.animation) {
          $tip.addClass('fade')
        }

        placement = typeof this.options.placement == 'function' ?
          this.options.placement.call(this, $tip[0], this.$element[0]) :
          this.options.placement

        inside = /in/.test(placement)

        $tip
          .remove()
          .css({ top: 0, left: 0, display: 'block' })
          .appendTo(inside ? this.$element : document.body)

        pos = this.getPosition(inside)

        actualWidth = $tip[0].offsetWidth
        actualHeight = $tip[0].offsetHeight

        switch (inside ? placement.split(' ')[1] : placement) {
          case 'bottom':
            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
            break
          case 'top':
            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
            break
          case 'left':
            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
            break
          case 'right':
            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
            break
        }

        $tip
          .css(tp)
          .addClass(placement)
          .addClass('in')
      }
    }

  , setContent: function () {
      var $tip = this.tip()
        , title = this.getTitle()

      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
      $tip.removeClass('fade in top bottom left right')
    }

  , hide: function () {
      var that = this
        , $tip = this.tip()

      $tip.removeClass('in')

      function removeWithAnimation() {
        var timeout = setTimeout(function () {
          $tip.off($.support.transition.end).remove()
        }, 500)

        $tip.one($.support.transition.end, function () {
          clearTimeout(timeout)
          $tip.remove()
        })
      }

      $.support.transition && this.$tip.hasClass('fade') ?
        removeWithAnimation() :
        $tip.remove()

      return this
    }

  , fixTitle: function () {
      var $e = this.$element
      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
      }
    }

  , hasContent: function () {
      return this.getTitle()
    }

  , getPosition: function (inside) {
      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
        width: this.$element[0].offsetWidth
      , height: this.$element[0].offsetHeight
      })
    }

  , getTitle: function () {
      var title
        , $e = this.$element
        , o = this.options

      title = $e.attr('data-original-title')
        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)

      return title
    }

  , tip: function () {
      return this.$tip = this.$tip || $(this.options.template)
    }

  , 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
    }

  , toggle: function () {
      this[this.tip().hasClass('in') ? 'hide' : 'show']()
    }

  , destroy: function () {
      this.hide().$element.off('.' + this.type).removeData(this.type)
    }

  }


 /* TOOLTIP PLUGIN DEFINITION
  * ========================= */

  $.fn.tooltip = function ( option ) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('tooltip')
        , options = typeof option == 'object' && option
      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.tooltip.Constructor = Tooltip

  $.fn.tooltip.defaults = {
    animation: true
  , placement: 'top'
  , selector: false
  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
  , trigger: 'hover'
  , title: ''
  , delay: 0
  , html: true
  }

}(window.jQuery);


================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-transition.js
================================================
/* ===================================================
 * bootstrap-transition.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#transitions
 * ===================================================
 * Copyright 2012 Twitter, 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.
 * ========================================================== */


!function ($) {

  $(function () {

    "use strict"; // jshint ;_;


    /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
     * ======================================================= */

    $.support.transition = (function () {

      var transitionEnd = (function () {

        var el = document.createElement('bootstrap')
          , transEndEventNames = {
               'WebkitTransition' : 'webkitTransitionEnd'
            ,  'MozTransition'    : 'transitionend'
            ,  'OTransition'      : 'oTransitionEnd otransitionend'
            ,  'transition'       : 'transitionend'
            }
          , name

        for (name in transEndEventNames){
          if (el.style[name] !== undefined) {
            return transEndEventNames[name]
          }
        }

      }())

      return transitionEnd && {
        end: transitionEnd
      }

    })()

  })

}(window.jQuery);

================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-typeahead.js
================================================
/* =============================================================
 * bootstrap-typeahead.js v2.1.0
 * http://twitter.github.com/bootstrap/javascript.html#typeahead
 * =============================================================
 * Copyright 2012 Twitter, 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.
 * ============================================================ */


!function($){

  "use strict"; // jshint ;_;


 /* TYPEAHEAD PUBLIC CLASS DEFINITION
  * ================================= */

  var Typeahead = function (element, options) {
    this.$element = $(element)
    this.options = $.extend({}, $.fn.typeahead.defaults, options)
    this.matcher = this.options.matcher || this.matcher
    this.sorter = this.options.sorter || this.sorter
    this.highlighter = this.options.highlighter || this.highlighter
    this.updater = this.options.updater || this.updater
    this.$menu = $(this.options.menu).appendTo('body')
    this.source = this.options.source
    this.shown = false
    this.listen()
  }

  Typeahead.prototype = {

    constructor: Typeahead

  , select: function () {
      var val = this.$menu.find('.active').attr('data-value')
      this.$element
        .val(this.updater(val))
        .change()
      return this.hide()
    }

  , updater: function (item) {
      return item
    }

  , show: function () {
      var pos = $.extend({}, this.$element.offset(), {
        height: this.$element[0].offsetHeight
      })

      this.$menu.css({
        top: pos.top + pos.height
      , left: pos.left
      })

      this.$menu.show()
      this.shown = true
      return this
    }

  , hide: function () {
      this.$menu.hide()
      this.shown = false
      return this
    }

  , lookup: function (event) {
      var items

      this.query = this.$element.val()

      if (!this.query || this.query.length < this.options.minLength) {
        return this.shown ? this.hide() : this
      }

      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source

      return items ? this.process(items) : this
    }

  , process: function (items) {
      var that = this

      items = $.grep(items, function (item) {
        return that.matcher(item)
      })

      items = this.sorter(items)

      if (!items.length) {
        return this.shown ? this.hide() : this
      }

      return this.render(items.slice(0, this.options.items)).show()
    }

  , matcher: function (item) {
      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
    }

  , sorter: function (items) {
      var beginswith = []
        , caseSensitive = []
        , caseInsensitive = []
        , item

      while (item = items.shift()) {
        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
        else if (~item.indexOf(this.query)) caseSensitive.push(item)
        else caseInsensitive.push(item)
      }

      return beginswith.concat(caseSensitive, caseInsensitive)
    }

  , highlighter: function (item) {
      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
        return '<strong>' + match + '</strong>'
      })
    }

  , render: function (items) {
      var that = this

      items = $(items).map(function (i, item) {
        i = $(that.options.item).attr('data-value', item)
        i.find('a').html(that.highlighter(item))
        return i[0]
      })

      items.first().addClass('active')
      this.$menu.html(items)
      return this
    }

  , next: function (event) {
      var active = this.$menu.find('.active').removeClass('active')
        , next = active.next()

      if (!next.length) {
        next = $(this.$menu.find('li')[0])
      }

      next.addClass('active')
    }

  , prev: function (event) {
      var active = this.$menu.find('.active').removeClass('active')
        , prev = active.prev()

      if (!prev.length) {
        prev = this.$menu.find('li').last()
      }

      prev.addClass('active')
    }

  , listen: function () {
      this.$element
        .on('blur',     $.proxy(this.blur, this))
        .on('keypress', $.proxy(this.keypress, this))
        .on('keyup',    $.proxy(this.keyup, this))

      if ($.browser.webkit || $.browser.msie) {
        this.$element.on('keydown', $.proxy(this.keydown, this))
      }

      this.$menu
        .on('click', $.proxy(this.click, this))
        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
    }

  , move: function (e) {
      if (!this.shown) return

      switch(e.keyCode) {
        case 9: // tab
        case 13: // enter
        case 27: // escape
          e.preventDefault()
          break

        case 38: // up arrow
          e.preventDefault()
          this.prev()
          break

        case 40: // down arrow
          e.preventDefault()
          this.next()
          break
      }

      e.stopPropagation()
    }

  , keydown: function (e) {
      this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40,38,9,13,27])
      this.move(e)
    }

  , keypress: function (e) {
      if (this.suppressKeyPressRepeat) return
      this.move(e)
    }

  , keyup: function (e) {
      switch(e.keyCode) {
        case 40: // down arrow
        case 38: // up arrow
          break

        case 9: // tab
        case 13: // enter
          if (!this.shown) return
          this.select()
          break

        case 27: // escape
          if (!this.shown) return
          this.hide()
          break

        default:
          this.lookup()
      }

      e.stopPropagation()
      e.preventDefault()
  }

  , blur: function (e) {
      var that = this
      setTimeout(function () { that.hide() }, 150)
    }

  , click: function (e) {
      e.stopPropagation()
      e.preventDefault()
      this.select()
    }

  , mouseenter: function (e) {
      this.$menu.find('.active').removeClass('active')
      $(e.currentTarget).addClass('active')
    }

  }


  /* TYPEAHEAD PLUGIN DEFINITION
   * =========================== */

  $.fn.typeahead = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('typeahead')
        , options = typeof option == 'object' && option
      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.typeahead.defaults = {
    source: []
  , items: 8
  , menu: '<ul class="typeahead dropdown-menu"></ul>'
  , item: '<li><a href="#"></a></li>'
  , minLength: 1
  }

  $.fn.typeahead.Constructor = Typeahead


 /*   TYPEAHEAD DATA-API
  * ================== */

  $(function () {
    $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
      var $this = $(this)
      if ($this.data('typeahead')) return
      e.preventDefault()
      $this.typeahead($this.data())
    })
  })

}(window.jQuery);


================================================
FILE: servers/embed/assets/bootstrap/less/accordion.less
================================================
//
// Accordion
// --------------------------------------------------


// Parent container
.accordion {
  margin-bottom: @baseLineHeight;
}

// Group == heading + body
.accordion-group {
  margin-bottom: 2px;
  border: 1px solid #e5e5e5;
  .border-radius(4px);
}
.accordion-heading {
  border-bottom: 0;
}
.accordion-heading .accordion-toggle {
  display: block;
  padding: 8px 15px;
}

// General toggle styles
.accordion-toggle {
  cursor: pointer;
}

// Inner needs the styles because you can't animate properly with any styles on the element
.accordion-inner {
  padding: 9px 15px;
  border-top: 1px solid #e5e5e5;
}


================================================
FILE: servers/embed/assets/bootstrap/less/alerts.less
================================================
//
// Alerts
// --------------------------------------------------


// Base styles
// -------------------------

.alert {
  padding: 8px 35px 8px 14px;
  margin-bottom: @baseLineHeight;
  text-shadow: 0 1px 0 rgba(255,255,255,.5);
  background-color: @warningBackground;
  border: 1px solid @warningBorder;
  .border-radius(4px);
  color: @warningText;
}
.alert h4 {
  margin: 0;
}

// Adjust close link position
.alert .close {
  position: relative;
  top: -2px;
  right: -21px;
  line-height: @baseLineHeight;
}


// Alternate styles
// -------------------------

.alert-success {
  background-color: @successBackground;
  border-color: @successBorder;
  color: @successText;
}
.alert-danger,
.alert-error {
  background-color: @errorBackground;
  border-color: @errorBorder;
  color: @errorText;
}
.alert-info {
  background-color: @infoBackground;
  border-color: @infoBorder;
  color: @infoText;
}


// Block alerts
// -------------------------

.alert-block {
  padding-top: 14px;
  padding-bottom: 14px;
}
.alert-block > p,
.alert-block > ul {
  margin-bottom: 0;
}
.alert-block p + p {
  margin-top: 5px;
}


================================================
FILE: servers/embed/assets/bootstrap/less/bootstrap.less
================================================
/*!
 * Bootstrap v2.1.0
 *
 * Copyright 2012 Twitter, Inc
 * Licensed under the Apache License v2.0
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Designed and built with all the love in the world @twitter by @mdo and @fat.
 */

// CSS Reset
@import "reset.less";

// Core variables and mixins
@import "variables.less"; // Modify this for custom colors, font-sizes, etc
@import "mixins.less";

// Grid system and page structure
@import "scaffolding.less";
@import "grid.less";
@import "layouts.less";

// Base CSS
@import "type.less";
@import "code.less";
@import "forms.less";
@import "tables.less";

// Components: common
@import "font-awesome.less";
@import "dropdowns.less";
@import "wells.less";
@import "component-animations.less";
@import "close.less";

// Components: Buttons & Alerts
@import "buttons.less";
@import "button-groups.less";
@import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less

// Components: Nav
@import "navs.less";
@import "navbar.less";
@import "breadcrumbs.less";
@import "pagination.less";
@import "pager.less";

// Components: Popovers
@import "modals.less";
@import "tooltip.less";
@import "popovers.less";

// Components: Misc
@import "thumbnails.less";
@import "labels-badges.less";
@import "progress-bars.less";
@import "accordion.less";
@import "carousel.less";
@import "hero-unit.less";

// Utility classes
@import "utilities.less"; // Has to be last to override when necessary


================================================
FILE: servers/embed/assets/bootstrap/less/breadcrumbs.less
================================================
//
// Breadcrumbs
// --------------------------------------------------


.breadcrumb {
  padding: 8px 15px;
  margin: 0 0 @baseLineHeight;
  list-style: none;
  background-color: #f5f5f5;
  .border-radius(4px);
  li {
    display: inline-block;
    .ie7-inline-block();
    text-shadow: 0 1px 0 @white;
  }
  .divider {
    padding: 0 5px;
    color: #ccc;
  }
  .active {
    color: @grayLight;
  }
}


================================================
FILE: servers/embed/assets/bootstrap/less/button-groups.less
================================================
//
// Button groups
// --------------------------------------------------


// Make the div behave like a button
.btn-group {
  position: relative;
  font-size: 0; // remove as part 1 of font-size inline-block hack
  white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page)
  .ie7-restore-left-whitespace();
}

// Space out series of button groups
.btn-group + .btn-group {
  margin-left: 5px;
}

// Optional: Group multiple button groups together for a toolbar
.btn-toolbar {
  font-size: 0; // Hack to remove whitespace that results from using inline-block
  margin-top: @baseLineHeight / 2;
  margin-bottom: @baseLineHeight / 2;
  .btn-group {
    display: inline-block;
    .ie7-inline-block();
  }
  .btn + .btn,
  .btn-group + .btn,
  .btn + .btn-group {
    margin-left: 5px;
  }
}

// Float them, remove border radius, then re-add to first and last elements
.btn-group > .btn {
  position: relative;
  .border-radius(0);
}
.btn-group > .btn + .btn {
  margin-left: -1px;
}
.btn-group > .btn,
.btn-group > .dropdown-menu {
  font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack
}

// Reset fonts for other sizes
.btn-group > .btn-mini {
  font-size: 11px;
}
.btn-group > .btn-small {
  font-size: 12px;
}
.btn-group > .btn-large {
  font-size: 16px;
}

// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
.btn-group > .btn:first-child {
  margin-left: 0;
     -webkit-border-top-left-radius: 4px;
         -moz-border-radius-topleft: 4px;
             border-top-left-radius: 4px;
  -webkit-border-bottom-left-radius: 4px;
      -moz-border-radius-bottomleft: 4px;
          border-bottom-left-radius: 4px;
}
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
.btn-group > .btn:last-child,
.btn-group > .dropdown-toggle {
     -webkit-border-top-right-radius: 4px;
         -moz-border-radius-topright: 4px;
             border-top-right-radius: 4px;
  -webkit-border-bottom-right-radius: 4px;
      -moz-border-radius-bottomright: 4px;
          border-bottom-right-radius: 4px;
}
// Reset corners for large buttons
.btn-group > .btn.large:first-child {
  margin-left: 0;
     -webkit-border-top-left-radius: 6px;
         -moz-border-radius-topleft: 6px;
             border-top-left-radius: 6px;
  -webkit-border-bottom-left-radius: 6px;
      -moz-border-radius-bottomleft: 6px;
          border-bottom-left-radius: 6px;
}
.btn-group > .btn.large:last-child,
.btn-group > .large.dropdown-toggle {
     -webkit-border-top-right-radius: 6px;
         -moz-border-radius-topright: 6px;
             border-top-right-radius: 6px;
  -webkit-border-bottom-right-radius: 6px;
      -moz-border-radius-bottomright: 6px;
          border-bottom-right-radius: 6px;
}

// On hover/focus/active, bring the proper btn to front
.btn-group > .btn:hover,
.btn-group > .btn:focus,
.btn-group > .btn:active,
.btn-group > .btn.active {
  z-index: 2;
}

// On active and open, don't show outline
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle {
  outline: 0;
}



// Split button dropdowns
// ----------------------

// Give the line between buttons some depth
.btn-group > .btn + .dropdown-toggle {
  padding-left: 8px;
  padding-right: 8px;
  .box-shadow(~"inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
  *padding-top: 5px;
  *padding-bottom: 5px;
}
.btn-group > .btn-mini + .dropdown-toggle {
  padding-left: 5px;
  padding-right: 5px;
  *padding-top: 2px;
  *padding-bottom: 2px;
}
.btn-group > .btn-small + .dropdown-toggle {
  *padding-top: 5px;
  *padding-bottom: 4px;
}
.btn-group > .btn-large + .dropdown-toggle {
  padding-left: 12px;
  padding-right: 12px;
  *padding-top: 7px;
  *padding-bottom: 7px;
}

.btn-group.open {

  // The clickable button for toggling the menu
  // Remove the gradient and set the same inset shadow as the :active state
  .dropdown-toggle {
    background-image: none;
    .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
  }

  // Keep the hover's background when dropdown is open
  .btn.dropdown-toggle {
    background-color: @btnBackgroundHighlight;
  }
  .btn-primary.dropdown-toggle {
    background-color: @btnPrimaryBackgroundHighlight;
  }
  .btn-warning.dropdown-toggle {
    background-color: @btnWarningBackgroundHighlight;
  }
  .btn-danger.dropdown-toggle {
    background-color: @btnDangerBackgroundHighlight;
  }
  .btn-success.dropdown-toggle {
    background-color: @btnSuccessBackgroundHighlight;
  }
  .btn-info.dropdown-toggle {
    background-color: @btnInfoBackgroundHighlight;
  }
  .btn-inverse.dropdown-toggle {
    background-color: @btnInverseBackgroundHighlight;
  }
}


// Reposition the caret
.btn .caret {
  margin-top: 8px;
  margin-left: 0;
}
// Carets in other button sizes
.btn-mini .caret,
.btn-small .caret,
.btn-large .caret {
  margin-top: 6px;
}
.btn-large .caret {
  border-left-width:  5px;
  border-right-width: 5px;
  border-top-width:   5px;
}
// Upside down carets for .dropup
.dropup .btn-large .caret {
  border-bottom: 5px solid @black;
  border-top: 0;
}



// Account for other colors
.btn-primary,
.btn-warning,
.btn-danger,
.btn-info,
.btn-success,
.btn-inverse {
  .caret {
    border-top-color: @white;
    border-bottom-color: @white;
  }
}



// Vertical button groups
// ----------------------

.btn-group-vertical {
  display: inline-block; // makes buttons only take up the width they need
  .ie7-inline-block();
}
.btn-group-vertical .btn {
  display: block;
  float: none;
  width: 100%;
  .border-radius(0);
}
.btn-group-vertical .btn + .btn {
  margin-left: 0;
  margin-top: -1px;
}
.btn-group-vertical .btn:first-child {
  .border-radius(4px 4px 0 0);
}
.btn-group-vertical .btn:last-child {
  .border-radius(0 0 4px 4px);
}
.btn-group-vertical .btn-large:first-child {
  .border-radius(6px 6px 0 0);
}
.btn-group-vertical .btn-large:last-child {
  .border-radius(0 0 6px 6px);
}


================================================
FILE: servers/embed/assets/bootstrap/less/buttons.less
================================================
//
// Buttons
// --------------------------------------------------


// Base styles
// --------------------------------------------------

// Core
.btn {
  display: inline-block;
  .ie7-inline-block();
  padding: 4px 14px;
  margin-bottom: 0; // For input.btn
  font-size: @baseFontSize;
  line-height: @baseLineHeight;
  *line-height: @baseLineHeight;
  text-align: center;
  vertical-align: middle;
  cursor: pointer;
  .buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75));
  border: 1px solid @btnBorder;
  *border: 0; // Remove the border to prevent IE7's black border on input:focus
  border-bottom-color: darken(@btnBorder, 10%);
  .border-radius(4px);
  .ie7-restore-left-whitespace(); // Give IE7 some love
  .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");

  // Hover state
  &:hover {
    color: @grayDark;
    text-decoration: none;
    background-color: darken(@white, 10%);
    *background-color: darken(@white, 15%); /* Buttons in IE7 don't get borders, so darken on hover */
    background-position: 0 -15px;

    // transition is only when going to hover, otherwise the background
    // behind the gradient (there for IE<=9 fallback) gets mismatched
    .transition(background-position .1s linear);
  }

  // Focus state for keyboard and accessibility
  &:focus {
    .tab-focus();
  }

  // Active state
  &.active,
  &:active {
    background-color: darken(@white, 10%);
    background-color: darken(@white, 15%) e("\9");
    background-image: none;
    outline: 0;
    .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
  }

  // Disabled state
  &.disabled,
  &[disabled] {
    cursor: default;
    background-color: darken(@white, 10%);
    background-image: none;
    .opacity(65);
    .box-shadow(none);
  }

}



// Button Sizes
// --------------------------------------------------

// Large
.btn-large {
  padding: 9px 14px;
  font-size: @baseFontSize + 2px;
  line-height: normal;
  .border-radius(5px);
}
.btn-large [class^="icon-"] {
  margin-top: 2px;
}

// Small
.btn-small {
  padding: 3px 9px;
  font-size: @baseFontSize - 2px;
  line-height: @baseLineHeight - 2px;
}
.btn-small [class^="icon-"] {
  margin-top: 0;
}

// Mini
.btn-mini {
  padding: 2px 6px;
  font-size: @baseFontSize - 3px;
  line-height: @baseLineHeight - 4px;
}

// Block button
.btn-block {
  display: block;
  width: 100%;
  padding-left: 0;
  padding-right: 0;
  .box-sizing(border-box);
}
.btn-block + .btn-block {
  margin-top: 5px;
}


// Alternate buttons
// --------------------------------------------------

// Provide *some* extra contrast for those who can get it
.btn-primary.active,
.btn-warning.active,
.btn-danger.active,
.btn-success.active,
.btn-info.active,
.btn-inverse.active {
  color: rgba(255,255,255,.75);
}

// Set the backgrounds
// -------------------------
.btn {
  // reset here as of 2.0.3 due to Recess property order
  border-color: #c5c5c5;
  border-color: rgba(0,0,0,.15) rgba(0,0,0,.15) rgba(0,0,0,.25);
}
.btn-primary {
  .buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight);
}
// Warning appears are orange
.btn-warning {
  .buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight);
}
// Danger and error appear as red
.btn-danger {
  .buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight);
}
// Success appears as green
.btn-success {
  .buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight);
}
// Info appears as a neutral blue
.btn-info {
  .buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight);
}
// Inverse appears as dark gray
.btn-inverse {
  .buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight);
}


// Cross-browser Jank
// --------------------------------------------------

button.btn,
input[type="submit"].btn {

  // Firefox 3.6 only I believe
  &::-moz-focus-inner {
    padding: 0;
    border: 0;
  }

  // IE7 has some default padding on button controls
  *padding-top: 3px;
  *padding-bottom: 3px;

  &.btn-large {
    *padding-top: 7px;
    *padding-bottom: 7px;
  }
  &.btn-small {
    *padding-top: 3px;
    *padding-bottom: 3px;
  }
  &.btn-mini {
    *padding-top: 1px;
    *padding-bottom: 1px;
  }
}


// Link buttons
// --------------------------------------------------

// Make a button look and behave like a link
.btn-link,
.btn-link:active {
  background-color: transparent;
  background-image: none;
  .box-shadow(none);
}
.btn-link {
  border-color: transparent;
  cursor: pointer;
  color: @linkColor;
  .border-radius(0);
}
.btn-link:hover {
  color: @linkColorHover;
  text-decoration: underline;
  background-color: transparent;
}


================================================
FILE: servers/embed/assets/bootstrap/less/carousel.less
================================================
//
// Carousel
// --------------------------------------------------


.carousel {
  position: relative;
  margin-bottom: @baseLineHeight;
  line-height: 1;
}

.carousel-inner {
  overflow: hidden;
  width: 100%;
  position: relative;
}

.carousel {

  .item {
    display: none;
    position: relative;
    .transition(.6s ease-in-out left);
  }

  // Account for jankitude on images
  .item > img {
    display: block;
    line-height: 1;
  }

  .active,
  .next,
  .prev { display: block; }

  .active {
    left: 0;
  }

  .next,
  .prev {
    position: absolute;
    top: 0;
    width: 100%;
  }

  .next {
    left: 100%;
  }
  .prev {
    left: -100%;
  }
  .next.left,
  .prev.right {
    left: 0;
  }

  .active.left {
    left: -100%;
  }
  .active.right {
    left: 100%;
  }

}

// Left/right controls for nav
// ---------------------------

.carousel-control {
  position: absolute;
  top: 40%;
  left: 15px;
  width: 40px;
  height: 40px;
  margin-top: -20px;
  font-size: 60px;
  font-weight: 100;
  line-height: 30px;
  color: @white;
  text-align: center;
  background: @grayDarker;
  border: 3px solid @white;
  .border-radius(23px);
  .opacity(50);

  // we can't have this transition here
  // because webkit cancels the carousel
  // animation if you trip this while
  // in the middle of another animation
  // ;_;
  // .transition(opacity .2s linear);

  // Reposition the right one
  &.right {
    left: auto;
    right: 15px;
  }

  // Hover state
  &:hover {
    color: @white;
    text-decoration: none;
    .opacity(90);
  }
}


// Caption for text below images
// -----------------------------

.carousel-caption {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 15px;
  background: @grayDark;
  background: rgba(0,0,0,.75);
}
.carousel-caption h4,
.carousel-caption p {
  color: @white;
  line-height: @baseLineHeight;
}
.carousel-caption h4 {
  margin: 0 0 5px;
}
.carousel-caption p {
  margin-bottom: 0;
}


================================================
FILE: servers/embed/assets/bootstrap/less/close.less
================================================
//
// Close icons
// --------------------------------------------------


.close {
  float: right;
  font-size: 20px;
  font-weight: bold;
  line-height: @baseLineHeight;
  color: @black;
  text-shadow: 0 1px 0 rgba(255,255,255,1);
  .opacity(20);
  &:hover {
    color: @black;
    text-decoration: none;
    cursor: pointer;
    .opacity(40);
  }
}

// Additional properties for button version
// iOS requires the button element instead of an anchor tag.
// If you want the anchor version, it requires `href="#"`.
button.close {
  padding: 0;
  cursor: pointer;
  background: transparent;
  border: 0;
  -webkit-appearance: none;
}

================================================
FILE: servers/embed/assets/bootstrap/less/code.less
================================================
//
// Code (inline and blocK)
// --------------------------------------------------


// Inline and block code styles
code,
pre {
  padding: 0 3px 2px;
  #font > #family > .monospace;
  font-size: @baseFontSize - 2;
  color: @grayDark;
  .border-radius(3px);
}

// Inline code
code {
  padding: 2px 4px;
  color: #d14;
  background-color: #f7f7f9;
  border: 1px solid #e1e1e8;
}

// Blocks of code
pre {
  display: block;
  padding: (@baseLineHeight - 1) / 2;
  margin: 0 0 @baseLineHeight / 2;
  font-size: @baseFontSize - 1; // 14px to 13px
  line-height: @baseLineHeight;
  word-break: break-all;
  word-wrap: break-word;
  white-space: pre;
  white-space: pre-wrap;
  background-color: #f5f5f5;
  border: 1px solid #ccc; // fallback for IE7-8
  border: 1px solid rgba(0,0,0,.15);
  .border-radius(4px);

  // Make prettyprint styles more spaced out for readability
  &.prettyprint {
    margin-bottom: @baseLineHeight;
  }

  // Account for some code outputs that place code tags in pre tags
  code {
    padding: 0;
    color: inherit;
    background-color: transparent;
    border: 0;
  }
}

// Enable scrollable blocks of code
.pre-scrollable {
  max-height: 340px;
  overflow-y: scroll;
}

================================================
FILE: servers/embed/assets/bootstrap/less/component-animations.less
================================================
//
// Component animations
// --------------------------------------------------


.fade {
  opacity: 0;
  .transition(opacity .15s linear);
  &.in {
    opacity: 1;
  }
}

.collapse {
  position: relative;
  height: 0;
  overflow: hidden;
  overflow: visible \9;
  .transition(height .35s ease);
  &.in {
    height: auto;
  }
}


================================================
FILE: servers/embed/assets/bootstrap/less/dropdowns.less
================================================
//
// Dropdown menus
// --------------------------------------------------


// Use the .menu class on any <li> element within the topbar or ul.tabs and you'll get some superfancy dropdowns
.dropup,
.dropdown {
  position: relative;
}
.dropdown-toggle {
  // The caret makes the toggle a bit too tall in IE7
  *margin-bottom: -3px;
}
.dropdown-toggle:active,
.open .dropdown-toggle {
  outline: 0;
}

// Dropdown arrow/caret
// --------------------
.caret {
  display: inline-block;
  width: 0;
  height: 0;
  vertical-align: top;
  border-top:   4px solid @black;
  border-right: 4px solid transparent;
  border-left:  4px solid transparent;
  content: "";
}

// Place the caret
.dropdown .caret {
  margin-top: 8px;
  margin-left: 2px;
}

// The dropdown menu (ul)
// ----------------------
.dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: @zindexDropdown;
  display: none; // none by default, but block on "open" of the menu
  float: left;
  min-width: 160px;
  padding: 5px 0;
  margin: 2px 0 0; // override default ul
  list-style: none;
  background-color: @dropdownBackground;
  border: 1px solid #ccc; // Fallback for IE7-8
  border: 1px solid @dropdownBorder;
  *border-right-width: 2px;
  *border-bottom-width: 2px;
  .border-radius(6px);
  .box-shadow(0 5px 10px rgba(0,0,0,.2));
  -webkit-background-clip: padding-box;
     -moz-background-clip: padding;
          background-clip: padding-box;

  // Aligns the dropdown menu to right
  &.pull-right {
    right: 0;
    left: auto;
  }

  // Dividers (basically an hr) within the dropdown
  .divider {
    .nav-divider(@dropdownDividerTop, @dropdownDividerBottom);
  }

  // Links within the dropdown menu
  a {
    display: block;
    padding: 3px 20px;
    clear: both;
    font-weight: normal;
    line-height: @baseLineHeight;
    color: @dropdownLinkColor;
    white-space: nowrap;
  }
}

// Hover state
// -----------
.dropdown-menu li > a:hover,
.dropdown-menu li > a:focus,
.dropdown-submenu:hover > a {
  text-decoration: none;
  color: @dropdownLinkColorHover;
  background-color: @dropdownLinkBackgroundHover;
  #gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%));
}

// Active state
// ------------
.dropdown-menu .active > a,
.dropdown-menu .active > a:hover {
  color: @dropdownLinkColorHover;
  text-decoration: none;
  outline: 0;
  background-color: @dropdownLinkBackgroundActive;
  #gradient > .vertical(@dropdownLinkBackgroundActive, darken(@dropdownLinkBackgroundActive, 5%));
}

// Disabled state
// --------------
// Gray out text and ensure the hover state remains gray
.dropdown-menu .disabled > a,
.dropdown-menu .disabled > a:hover {
  color: @grayLight;
}
// Nuke hover effects
.dropdown-menu .disabled > a:hover {
  text-decoration: none;
  background-color: transparent;
  cursor: default;
}

// Open state for the dropdown
// ---------------------------
.open {
  // IE7's z-index only goes to the nearest positioned ancestor, which would
  // make the menu appear below buttons that appeared later on the page
  *z-index: @zindexDropdown;

  & > .dropdown-menu {
    display: block;
  }
}

// Right aligned dropdowns
// ---------------------------
.pull-right > .dropdown-menu {
  right: 0;
  left: auto;
}

// Allow for dropdowns to go bottom up (aka, dropup-menu)
// ------------------------------------------------------
// Just add .dropup after the standard .dropdown class and you're set, bro.
// TODO: abstract this so that the navbar fixed styles are not placed here?
.dropup,
.navbar-fixed-bottom .dropdown {
  // Reverse the caret
  .caret {
    border-top: 0;
    border-bottom: 4px solid @black;
    content: "\2191";
  }
  // Different positioning for bottom up menu
  .dropdown-menu {
    top: auto;
    bottom: 100%;
    margin-bottom: 1px;
  }
}

// Sub menus
// ---------------------------
.dropdown-submenu {
  position: relative;
}
.dropdown-submenu > .dropdown-menu {
  top: 0;
  left: 100%;
  margin-top: -6px;
  margin-left: -1px;
  -webkit-border-radius: 0 6px 6px 6px;
     -moz-border-radius: 0 6px 6px 6px;
          border-radius: 0 6px 6px 6px;
}
.dropdown-submenu:hover .dropdown-menu {
  display: block;
}

.dropdown-submenu > a:after {
  display: block;
  content: " ";
  float: right;
  width: 0;
  height: 0;
  border-color: transparent;
  border-style: solid;
  border-width: 5px 0 5px 5px;
  border-left-color: darken(@dropdownBackground, 20%);
  margin-top: 5px;
  margin-right: -10px;
}
.dropdown-submenu:hover > a:after {
  border-left-color: @dropdownLinkColorHover;
}


// Tweak nav headers
// -----------------
// Increase padding from 15px to 20px on sides
.dropdown .dropdown-menu .nav-header {
  padding-left: 20px;
  padding-right: 20px;
}

// Typeahead
// ---------
.typeahead {
  margin-top: 2px; // give it some space to breathe
  .border-radius(4px);
}


================================================
FILE: servers/embed/assets/bootstrap/less/font-awesome.less
================================================
/*  Font Awesome
    the iconic font designed for use with Twitter Bootstrap
    -------------------------------------------------------
    The full suite of pictographic icons, examples, and documentation
    can be found at: http://fortawesome.github.com/Font-Awesome/

    License
    -------------------------------------------------------
    The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0:
    http://creativecommons.org/licenses/by/3.0/ A mention of
    'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable
    source code is considered acceptable attribution (most common on the web).
    If human readable source code is not available to the end user, a mention in
    an 'About' or 'Credits' screen is considered acceptable (most common in desktop
    or mobile software).

    Contact
    -------------------------------------------------------
    Email: dave@davegandy.com
    Twitter: http://twitter.com/fortaweso_me
    Work: Lead Product Designer @ http://kyruus.com

    */

@font-face {
  font-family: 'FontAwesome';
  src: url('../../font/fontawesome-webfont.eot');
  src: url('../../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),
    url('../../font/fontawesome-webfont.woff') format('woff'),
    url('../../font/fontawesome-webfont.ttf') format('truetype'),
    url('../../font/fontawesome-webfont.svg#FontAwesome') format('svg');
  font-weight: normal;
  font-style: normal;
}

/*  Font Awesome styles
    ------------------------------------------------------- */
[class^="icon-"]:before,
[class*=" icon-"]:before {
  font-family: FontAwesome;
  font-weight: normal;
  font-style: normal;
  display: inline-block;
  text-decoration: inherit;
}

a [class^="icon-"],
a [class*=" icon-"] {
  display: inline-block;
  text-decoration: inherit;
}

/* makes the font 33% larger relative to the icon container */
.icon-large:before {
  vertical-align: middle;
  font-size: 4/3em;
}

.btn, .nav-tabs {
  [class^="icon-"],
  [class*=" icon-"] {
  /* keeps button heights with and without icons the same */
    line-height: .9em;
  }
}

li {
  [class^="icon-"],
  [class*=" icon-"] {
    display: inline-block;
    width: 1.25em;
    text-align: center;
  }
  .icon-large:before,
  .icon-large:before {
    /* 1.5 increased font size for icon-large * 1.25 width */
    width: 1.5*1.25em;
  }
}

ul.icons {
  list-style-type: none;
  margin-left: 2em;
  text-indent: -.8em;

  li {
    [class^="icon-"],
    [class*=" icon-"] {
      width: .8em;
    }
    .icon-large:before,
    .icon-large:before {
      /* 1.5 increased font size for icon-large * 1.25 width */
      vertical-align: initial;
//      width: 1.5*1.25em;
    }
  }
}

/*  Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
    readers do not read off random characters that represent icons */
.icon-glass:before                { content: "\f000"; }
.icon-music:before                { content: "\f001"; }
.icon-search:before               { content: "\f002"; }
.icon-envelope:before             { content: "\f003"; }
.icon-heart:before                { content: "\f004"; }
.icon-star:before                 { content: "\f005"; }
.icon-star-empty:before           { content: "\f006"; }
.icon-user:before                 { content: "\f007"; }
.icon-film:before                 { content: "\f008"; }
.icon-th-large:before             { content: "\f009"; }
.icon-th:before                   { content: "\f00a"; }
.icon-th-list:before              { content: "\f00b"; }
.icon-ok:before                   { content: "\f00c"; }
.icon-remove:before               { content: "\f00d"; }
.icon-zoom-in:before              { content: "\f00e"; }

.icon-zoom-out:before             { content: "\f010"; }
.icon-off:before                  { content: "\f011"; }
.icon-signal:before               { content: "\f012"; }
.icon-cog:before                  { content: "\f013"; }
.icon-trash:before                { content: "\f014"; }
.icon-home:before                 { content: "\f015"; }
.icon-file:before                 { content: "\f016"; }
.icon-time:before                 { content: "\f017"; }
.icon-road:before                 { content: "\f018"; }
.icon-download-alt:before         { content: "\f019"; }
.icon-download:before             { content: "\f01a"; }
.icon-upload:before               { content: "\f01b"; }
.icon-inbox:before                { content: "\f01c"; }
.icon-play-circle:before          { content: "\f01d"; }
.icon-repeat:before               { content: "\f01e"; }

/* \f020 is not a valid unicode character. all shifted one down */
.icon-refresh:before              { content: "\f021"; }
.icon-list-alt:before             { content: "\f022"; }
.icon-lock:before                 { content: "\f023"; }
.icon-flag:before                 { content: "\f024"; }
.icon-headphones:before           { content: "\f025"; }
.icon-volume-off:before           { content: "\f026"; }
.icon-volume-down:before          { content: "\f027"; }
.icon-volume-up:before            { content: "\f028"; }
.icon-qrcode:before               { content: "\f029"; }
.icon-barcode:before              { content: "\f02a"; }
.icon-tag:before                  { content: "\f02b"; }
.icon-tags:before                 { content: "\f02c"; }
.icon-book:before                 { content: "\f02d"; }
.icon-bookmark:before             { content: "\f02e"; }
.icon-print:before                { content: "\f02f"; }

.icon-camera:before               { content: "\f030"; }
.icon-font:before                 { content: "\f031"; }
.icon-bold:before                 { content: "\f032"; }
.icon-italic:before               { content: "\f033"; }
.icon-text-height:before          { content: "\f034"; }
.icon-text-width:before           { content: "\f035"; }
.icon-align-left:before           { content: "\f036"; }
.icon-align-center:before         { content: "\f037"; }
.icon-align-right:before          { content: "\f038"; }
.icon-align-justify:before        { content: "\f039"; }
.icon-list:before                 { content: "\f03a"; }
.icon-indent-left:before          { content: "\f03b"; }
.icon-indent-right:before         { content: "\f03c"; }
.icon-facetime-video:before       { content: "\f03d"; }
.icon-picture:before              { content: "\f03e"; }

.icon-pencil:before               { content: "\f040"; }
.icon-map-marker:before           { content: "\f041"; }
.icon-adjust:before               { content: "\f042"; }
.icon-tint:before                 { content: "\f043"; }
.icon-edit:before                 { content: "\f044"; }
.icon-share:before                { content: "\f045"; }
.icon-check:before                { content: "\f046"; }
.icon-move:before                 { content: "\f047"; }
.icon-step-backward:before        { content: "\f048"; }
.icon-fast-backward:before        { content: "\f049"; }
.icon-backward:before             { content: "\f04a"; }
.icon-play:before                 { content: "\f04b"; }
.icon-pause:before                { content: "\f04c"; }
.icon-stop:before                 { content: "\f04d"; }
.icon-forward:before              { content: "\f04e"; }

.icon-fast-forward:before         { content: "\f050"; }
.icon-step-forward:before         { content: "\f051"; }
.icon-eject:before                { content: "\f052"; }
.icon-chevron-left:before         { content: "\f053"; }
.icon-chevron-right:before        { content: "\f054"; }
.icon-plus-sign:before            { content: "\f055"; }
.icon-minus-sign:before           { content: "\f056"; }
.icon-remove-sign:before          { content: "\f057"; }
.icon-ok-sign:before              { content: "\f058"; }
.icon-question-sign:before        { content: "\f059"; }
.icon-info-sign:before            { content: "\f05a"; }
.icon-screenshot:before           { content: "\f05b"; }
.icon-remove-circle:before        { content: "\f05c"; }
.icon-ok-circle:before            { content: "\f05d"; }
.icon-ban-circle:before           { content: "\f05e"; }

.icon-arrow-left:before           { content: "\f060"; }
.icon-arrow-right:before          { content: "\f061"; }
.icon-arrow-up:before             { content: "\f062"; }
.icon-arrow-down:before           { content: "\f063"; }
.icon-share-alt:before            { content: "\f064"; }
.icon-resize-full:before          { content: "\f065"; }
.icon-resize-small:before         { content: "\f066"; }
.icon-plus:before                 { content: "\f067"; }
.icon-minus:before                { content: "\f068"; }
.icon-asterisk:before             { content: "\f069"; }
.icon-exclamation-sign:before     { content: "\f06a"; }
.icon-gift:before                 { content: "\f06b"; }
.icon-leaf:before                 { content: "\f06c"; }
.icon-fire:before                 { content: "\f06d"; }
.icon-eye-open:before             { content: "\f06e"; }

.icon-eye-close:before            { content: "\f070"; }
.icon-warning-sign:before         { content: "\f071"; }
.icon-plane:before                { content: "\f072"; }
.icon-calendar:before             { content: "\f073"; }
.icon-random:before               { content: "\f074"; }
.icon-comment:before              { content: "\f075"; }
.icon-magnet:before               { content: "\f076"; }
.icon-chevron-up:before           { content: "\f077"; }
.icon-chevron-down:before         { content: "\f078"; }
.icon-retweet:before              { content: "\f079"; }
.icon-shopping-cart:before        { content: "\f07a"; }
.icon-folder-close:before         { content: "\f07b"; }
.icon-folder-open:before          { content: "\f07c"; }
.icon-resize-vertical:before      { content: "\f07d"; }
.icon-resize-horizontal:before    { content: "\f07e"; }

.icon-bar-chart:before            { content: "\f080"; }
.icon-twitter-sign:before         { content: "\f081"; }
.icon-facebook-sign:before        { content: "\f082"; }
.icon-camera-retro:before         { content: "\f083"; }
.icon-key:before                  { content: "\f084"; }
.icon-cogs:before                 { content: "\f085"; }
.icon-comments:before             { content: "\f086"; }
.icon-thumbs-up:before            { content: "\f087"; }
.icon-thumbs-down:before          { content: "\f088"; }
.icon-star-half:before            { content: "\f089"; }
.icon-heart-empty:before          { content: "\f08a"; }
.icon-signout:before              { content: "\f08b"; }
.icon-linkedin-sign:before        { content: "\f08c"; }
.icon-pushpin:before              { content: "\f08d"; }
.icon-external-link:before        { content: "\f08e"; }

.icon-signin:before               { content: "\f090"; }
.icon-trophy:before               { content: "\f091"; }
.icon-github-sign:before          { content: "\f092"; }
.icon-upload-alt:before           { content: "\f093"; }
.icon-lemon:before                { content: "\f094"; }
.icon-phone:before                { content: "\f095"; }
.icon-check-empty:before          { content: "\f096"; }
.icon-bookmark-empty:before       { content: "\f097"; }
.icon-phone-sign:before           { content: "\f098"; }
.icon-twitter:before              { content: "\f099"; }
.icon-facebook:before             { content: "\f09a"; }
.icon-github:before               { content: "\f09b"; }
.icon-unlock:before               { content: "\f09c"; }
.icon-credit-card:before          { content: "\f09d"; }
.icon-rss:before                  { content: "\f09e"; }

.icon-hdd:before                  { content: "\f0a0"; }
.icon-bullhorn:before             { content: "\f0a1"; }
.icon-bell:before                 { content: "\f0a2"; }
.icon-certificate:before          { content: "\f0a3"; }
.icon-hand-right:before           { content: "\f0a4"; }
.icon-hand-left:before            { content: "\f0a5"; }
.icon-hand-up:before              { content: "\f0a6"; }
.icon-hand-down:before            { content: "\f0a7"; }
.icon-circle-arrow-left:before    { content: "\f0a8"; }
.icon-circle-arrow-right:before   { content: "\f0a9"; }
.icon-circle-arrow-up:before      { content: "\f0aa"; }
.icon-circle-arrow-down:before    { content: "\f0ab"; }
.icon-globe:before                { content: "\f0ac"; }
.icon-wrench:before               { content: "\f0ad"; }
.icon-tasks:before                { content: "\f0ae"; }

.icon-filter:before               { content: "\f0b0"; }
.icon-briefcase:before            { content: "\f0b1"; }
.icon-fullscreen:before           { content: "\f0b2"; }

.icon-group:before                { content: "\f0c0"; }
.icon-link:before                 { content: "\f0c1"; }
.icon-cloud:before                { content: "\f0c2"; }
.icon-beaker:before               { content: "\f0c3"; }
.icon-cut:before                  { content: "\f0c4"; }
.icon-copy:before                 { content: "\f0c5"; }
.icon-paper-clip:before           { content: "\f0c6"; }
.icon-save:before                 { content: "\f0c7"; }
.icon-sign-blank:before           { content: "\f0c8"; }
.icon-reorder:before              { content: "\f0c9"; }
.icon-list-ul:before              { content: "\f0ca"; }
.icon-list-ol:before              { content: "\f0cb"; }
.icon-strikethrough:before        { content: "\f0cc"; }
.icon-underline:before            { content: "\f0cd"; }
.icon-table:before                { content: "\f0ce"; }
.icon-table:before                { content: "\f0ce"; }

.icon-magic:before                { content: "\f0d0"; }
.icon-truck:before                { content: "\f0d1"; }
.icon-pinterest:before            { content: "\f0d2"; }
.icon-pinterest-sign:before       { content: "\f0d3"; }
.icon-google-plus-sign:before     { content: "\f0d4"; }
.icon-google-plus:before          { content: "\f0d5"; }
.icon-money:before                { content: "\f0d6"; }
.icon-caret-down:before           { content: "\f0d7"; }
.icon-caret-up:before             { content: "\f0d8"; }
.icon-caret-left:before           { content: "\f0d9"; }
.icon-caret-right:before          { content: "\f0da"; }
.icon-columns:before              { content: "\f0db"; }
.icon-sort:before                 { content: "\f0dc"; }
.icon-sort-down:before            { content: "\f0dd"; }
.icon-sort-up:before              { content: "\f0de"; }

.icon-envelope-alt:before         { content: "\f0e0"; }
.icon-linkedin:before             { content: "\f0e1"; }
.icon-undo:before                 { content: "\f0e2"; }
.icon-legal:before                { content: "\f0e3"; }
.icon-dashboard:before            { content: "\f0e4"; }
.icon-comment-alt:before          { content: "\f0e5"; }
.icon-comments-alt:before         { content: "\f0e6"; }
.icon-bolt:before                 { content: "\f0e7"; }
.icon-sitemap:before              { content: "\f0e8"; }
.icon-umbrella:before             { content: "\f0e9"; }
.icon-paste:before                { content: "\f0ea"; }

.icon-user-md:before              { content: "\f200"; }

.icon-apple-logo:before           { content: "\f500"; }
.icon-windows-8:before            { content: "\f501"; }
.icon-js-fiddle:before            { content: "\f502"; }
.icon-skype:before                { content: "\f503"; }
.icon-youtube-sign:before         { content: "\f504"; }
.icon-youtube:before              { content: "\f505"; }
.icon-vimeo-sign:before           { content: "\f506"; }
.icon-vimeo:before                { content: "\f507"; }
.icon-lastfm-sign:before          { content: "\f508"; }
.icon-lastfm:before               { content: "\f509"; }
.icon-rss-sign:before             { content: "\f50a"; }
.icon-reddit:before               { content: "\f50b"; }
.icon-delicious-sign:before       { content: "\f50c"; }
.icon-wordpress-sign:before       { content: "\f50d"; }
.icon-wordpress:before            { content: "\f50e"; }
.icon-git-fork:before             { content: "\f50f"; }

.icon-blogger-sign:before         { content: "\f510"; }
.icon-blogger:before              { content: "\f511"; }
.icon-tumblr-sign:before          { content: "\f512"; }
.icon-tumblr:before               { content: "\f513"; }
.icon-flickr-sign:before          { content: "\f514"; }
.icon-flickr:before               { content: "\f515"; }
.icon-picasa-sign:before          { content: "\f516"; }
.icon-picasa:before               { content: "\f517"; }
.icon-amazon-sign:before          { content: "\f518"; }
.icon-amazon:before               { content: "\f519"; }
.icon-yelp-sign:before            { content: "\f51a"; }
.icon-yelp:before                 { content: "\f51b"; }
.icon-soundcloud:before           { content: "\f51c"; }
.icon-spotify:before              { content: "\f51d"; }

.icon-yahoo-sign:before           { content: "\f520"; }
.icon-yahoo:before                { content: "\f521"; }
.icon-evernote-sign:before        { content: "\f522"; }
.icon-evernote:before             { content: "\f523"; }
.icon-google-sign:before          { content: "\f524"; }
.icon-google:before               { content: "\f525"; }
.icon-hacker-news:before          { content: "\f526"; }
.icon-map:before          				{ content: "\f529"; }
.icon-bus-sign:before             { content: "\f52a"; }
.icon-bike-sign:before            { content: "\f52b"; }
.icon-car-sign:before             { content: "\f52c"; }
.icon-taxi-sign:before            { content: "\f52d"; }
.icon-truck-sign:before           { content: "\f52e"; }
.icon-handicap-sign:before        { content: "\f52f"; }


================================================
FILE: servers/embed/assets/bootstrap/less/forms.less
================================================
//
// Forms
// --------------------------------------------------


// GENERAL STYLES
// --------------

// Make all forms have space below them
form {
  margin: 0 0 @baseLineHeight;
}

fieldset {
  padding: 0;
  margin: 0;
  border: 0;
}

// Groups of fields with labels on top (legends)
legend {
  display: block;
  width: 100%;
  padding: 0;
  margin-bottom: @baseLineHeight;
  font-size: @baseFontSize * 1.5;
  line-height: @baseLineHeight * 2;
  color: @grayDark;
  border: 0;
  border-bottom: 1px solid #e5e5e5;

  // Small
  small {
    font-size: @baseLineHeight * .75;
    color: @grayLight;
  }
}

// Set font for forms
label,
input,
button,
select,
textarea {
  #font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here
}
input,
button,
select,
textarea {
  font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element)
}

// Identify controls by their labels
label {
  display: block;
  margin-bottom: 5px;
}

// Form controls
// -------------------------

// Shared size and type resets
select,
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
  display: inline-block;
  height: @baseLineHeight;
  padding: 4px 6px;
  margin-bottom: 9px;
  font-size: @baseFontSize;
  line-height: @baseLineHeight;
  color: @gray;
  .border-radius(@inputBorderRadius);
}

// Reset appearance properties for textual inputs and textarea
// Declare width for legacy (can't be on input[type=*] selectors or it's too specific)
input,
textarea {
  width: 210px;
}
// Reset height since textareas have rows
textarea {
  height: auto;
}
// Everything else
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
  background-color: @inputBackground;
  border: 1px solid @inputBorder;
  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
  .transition(~"border linear .2s, box-shadow linear .2s");

  // Focus state
  &:focus {
    border-color: rgba(82,168,236,.8);
    outline: 0;
    outline: thin dotted \9; /* IE6-9 */
    .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)");
  }
}

// Position radios and checkboxes better
input[type="radio"],
input[type="checkbox"] {
  margin: 4px 0 0;
  *margin-top: 0; /* IE7 */
  margin-top: 1px \9; /* IE8-9 */
  line-height: normal;
  cursor: pointer;
}

// Reset width of input images, buttons, radios, checkboxes
input[type="file"],
input[type="image"],
input[type="submit"],
input[type="reset"],
input[type="button"],
input[type="radio"],
input[type="checkbox"] {
  width: auto; // Override of generic input selector
}

// Set the height of select and file controls to match text inputs
select,
input[type="file"] {
  height: 30px; /* In IE7, the height of the select element cannot be changed by height, only font-size */
  *margin-top: 4px; /* For IE7, add top margin to align select with labels */
  line-height: 30px;
}

// Make select elements obey height by applying a border
select {
  width: 220px; // default input width + 10px of padding that doesn't get applied
  border: 1px solid #bbb;
  background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color
}

// Make multiple select elements height not fixed
select[multiple],
select[size] {
  height: auto;
}

// Focus for select, file, radio, and checkbox
select:focus,
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
  .tab-focus();
}


// Uneditable inputs
// -------------------------

// Make uneditable inputs look inactive
.uneditable-input,
.uneditable-textarea {
  color: @grayLight;
  background-color: darken(@inputBackground, 1%);
  border-color: @inputBorder;
  .box-shadow(inset 0 1px 2px rgba(0,0,0,.025));
  cursor: not-allowed;
}

// For text that needs to appear as an input but should not be an input
.uneditable-input {
  overflow: hidden; // prevent text from wrapping, but still cut it off like an input does
  white-space: nowrap;
}

// Make uneditable textareas behave like a textarea
.uneditable-textarea {
  width: auto;
  height: auto;
}


// Placeholder
// -------------------------

// Placeholder text gets special styles; can't be bundled together though for some reason
input,
textarea {
  .placeholder();
}


// CHECKBOXES & RADIOS
// -------------------

// Indent the labels to position radios/checkboxes as hanging
.radio,
.checkbox {
  min-height: 18px; // clear the floating input if there is no label text
  padding-left: 18px;
}
.radio input[type="radio"],
.checkbox input[type="checkbox"] {
  float: left;
  margin-left: -18px;
}

// Move the options list down to align with labels
.controls > .radio:first-child,
.controls > .checkbox:first-child {
  padding-top: 5px; // has to be padding because margin collaspes
}

// Radios and checkboxes on same line
// TODO v3: Convert .inline to .control-inline
.radio.inline,
.checkbox.inline {
  display: inline-block;
  padding-top: 5px;
  margin-bottom: 0;
  vertical-align: middle;
}
.radio.inline + .radio.inline,
.checkbox.inline + .checkbox.inline {
  margin-left: 10px; // space out consecutive inline controls
}



// INPUT SIZES
// -----------

// General classes for quick sizes
.input-mini       { width: 60px; }
.input-small      { width: 90px; }
.input-medium     { width: 150px; }
.input-large      { width: 210px; }
.input-xlarge     { width: 270px; }
.input-xxlarge    { width: 530px; }

// Grid style input sizes
input[class*="span"],
select[class*="span"],
textarea[class*="span"],
.uneditable-input[class*="span"],
// Redeclare since the fluid row class is more specific
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"] {
  float: none;
  margin-left: 0;
}
// Ensure input-prepend/append never wraps
.input-append input[class*="span"],
.input-append .uneditable-input[class*="span"],
.input-prepend input[class*="span"],
.input-prepend .uneditable-input[class*="span"],
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"],
.row-fluid .input-prepend [class*="span"],
.row-fluid .input-append [class*="span"] {
  display: inline-block;
}



// GRID SIZING FOR INPUTS
// ----------------------

// Grid sizes
#grid > .input(@gridColumnWidth, @gridGutterWidth);

// Control row for multiple inputs per line
.controls-row {
  .clearfix(); // Clear the float from controls
}
.controls-row [class*="span"] {
  float: left; // Float to collapse white-space for proper grid alignment
}




// DISABLED STATE
// --------------

// Disabled and read-only inputs
input[disabled],
select[disabled],
textarea[disabled],
input[readonly],
select[readonly],
textarea[readonly] {
  cursor: not-allowed;
  background-color: @inputDisabledBackground;
}
// Explicitly reset the colors here
input[type="radio"][disabled],
input[type="checkbox"][disabled],
input[type="radio"][readonly],
input[type="checkbox"][readonly] {
  background-color: transparent;
}




// FORM FIELD FEEDBACK STATES
// --------------------------

// Warning
.control-group.warning {
  .formFieldState(@warningText, @warningText, @warningBackground);
}
// Error
.control-group.error {
  .formFieldState(@errorText, @errorText, @errorBackground);
}
// Success
.control-group.success {
  .formFieldState(@successText, @successText, @successBackground);
}

// HTML5 invalid states
// Shares styles with the .control-group.error above
input:focus:required:invalid,
textarea:focus:required:invalid,
select:focus:required:invalid {
  color: #b94a48;
  border-color: #ee5f5b;
  &:focus {
    border-color: darken(#ee5f5b, 10%);
    .box-shadow(0 0 6px lighten(#ee5f5b, 20%));
  }
}



// FORM ACTIONS
// ------------

.form-actions {
  padding: (@baseLineHeight - 1) 20px @baseLineHeight;
  margin-top: @baseLineHeight;
  margin-bottom: @baseLineHeight;
  background-color: @formActionsBackground;
  border-top: 1px solid #e5e5e5;
  .clearfix(); // Adding clearfix to allow for .pull-right button containers
}



// HELP TEXT
// ---------

.help-block,
.help-inline {
  color: lighten(@textColor, 15%); // lighten the text some for contrast
}

.help-block {
  display: block; // account for any element using help-block
  margin-bottom: @baseLineHeight / 2;
}

.help-inline {
  display: inline-block;
  .ie7-inline-block();
  vertical-align: middle;
  padding-left: 5px;
}



// INPUT GROUPS
// ------------

// Allow us to put symbols and text within the input field for a cleaner look
.input-append,
.input-prepend {
  margin-bottom: 5px;
  font-size: 0;
  white-space: nowrap; // Prevent span and input from separating

  input,
  select,
  .uneditable-input {
    position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness
    margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms
    *margin-left: 0;
    font-size: @baseFontSize;
    vertical-align: top;
    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
    // Make input on top when focused so blue border and shadow always show
    &:focus {
      z-index: 2;
    }
  }
  .add-on {
    display: inline-block;
    width: auto;
    height: @baseLineHeight;
    min-width: 16px;
    padding: 4px 5px;
    font-size: @baseFontSize;
    font-weight: normal;
    line-height: @baseLineHeight;
    text-align: center;
    text-shadow: 0 1px 0 @white;
    background-color: @grayLighter;
    border: 1px solid #ccc;
  }
  .add-on,
  .btn {
    margin-left: -1px;
    vertical-align: top;
    .border-radius(0);
  }
  .active {
    background-color: lighten(@green, 30);
    border-color: @green;
  }
}
.input-prepend {
  .add-on,
  .btn {
    margin-right: -1px;
  }
  .add-on:first-child,
  .btn:first-child {
    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
  }
}
.input-append {
  input,
  select,
  .uneditable-input {
    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
  }
  .add-on:last-child,
  .btn:last-child {
    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
  }
}
// Remove all border-radius for inputs with both prepend and append
.input-prepend.input-append {
  input,
  select,
  .uneditable-input {
    .border-radius(0);
  }
  .add-on:first-child,
  .btn:first-child {
    margin-right: -1px;
    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
  }
  .add-on:last-child,
  .btn:last-child {
    margin-left: -1px;
    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
  }
}



// SEARCH FORM
// -----------

input.search-query {
  padding-right: 14px;
  padding-right: 4px \9;
  padding-left: 14px;
  padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */
  margin-bottom: 0; // Remove the default margin on all inputs
  .border-radius(15px);
}

/* Allow for input prepend/append in search forms */
.form-search .input-append .search-query,
.form-search .input-prepend .search-query {
  .border-radius(0); // Override due to specificity
}
.form-search .input-append .search-query {
  .border-radius(14px 0 0 14px)
}
.form-search .input-append .btn {
  .border-radius(0 14px 14px 0)
}
.form-search .input-prepend .search-query {
  .border-radius(0 14px 14px 0)
}
.form-search .input-prepend .btn {
  .border-radius(14px 0 0 14px)
}




// HORIZONTAL & VERTICAL FORMS
// ---------------------------

// Common properties
// -----------------

.form-search,
.form-inline,
.form-horizontal {
  input,
  textarea,
  select,
  .help-inline,
  .uneditable-input,
  .input-prepend,
  .input-append {
    display: inline-block;
    .ie7-inline-block();
    margin-bottom: 0;
    vertical-align: middle;
  }
  // Re-hide hidden elements due to specifity
  .hide {
    display: none;
  }
}
.form-search label,
.form-inline label,
.form-search .btn-group,
.form-inline .btn-group {
  display: inline-block;
}
// Remove margin for input-prepend/-append
.form-search .input-append,
.form-inline .input-append,
.form-search .input-prepend,
.form-inline .input-prepend {
  margin-bottom: 0;
}
// Inline checkbox/radio labels (remove padding on left)
.form-search .radio,
.form-search .checkbox,
.form-inline .radio,
.form-inline .checkbox {
  padding-left: 0;
  margin-bottom: 0;
  vertical-align: middle;
}
// Remove float and margin, set to inline-block
.form-search .radio input[type="radio"],
.form-search .checkbox input[type="checkbox"],
.form-inline .radio input[type="radio"],
.form-inline .checkbox input[type="checkbox"] {
  float: left;
  margin-right: 3px;
  margin-left: 0;
}


// Margin to space out fieldsets
.control-group {
  margin-bottom: @baseLineHeight / 2;
}

// Legend collapses margin, so next element is responsible for spacing
legend + .control-group {
  margin-top: @baseLineHeight;
  -webkit-margin-top-collapse: separate;
}

// Horizontal-specific styles
// --------------------------

.form-horizontal {
  // Increase spacing between groups
  .control-group {
    margin-bottom: @baseLineHeight;
    .clearfix();
  }
  // Float the labels left
  .control-label {
    float: left;
    width: 140px;
    padding-top: 5px;
    text-align: right;
  }
  // Move over all input controls and content
  .controls {
    // Super jank IE7 fix to ensure the inputs in .input-append and input-prepend
    // don't inherit the margin of the parent, in this case .controls
    *display: inline-block;
    *padding-left: 20px;
    margin-left: 160px;
    *margin-left: 0;
    &:first-child {
      *padding-left: 160px;
    }
  }
  // Remove bottom margin on block level help text since that's accounted for on .control-group
  .help-block {
    margin-top: @baseLineHeight / 2;
    margin-bottom: 0;
  }
  // Move over buttons in .form-actions to align with .controls
  .form-actions {
    padding-left: 160px;
  }
}


================================================
FILE: servers/embed/assets/bootstrap/less/grid.less
================================================
//
// Grid system
// --------------------------------------------------


// Fixed (940px)
#grid > .core(@gridColumnWidth, @gridGutterWidth);

// Fluid (940px)
#grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth);

// Reset utility classes due to specificity
[class*="span"].hide,
.row-fluid [class*="span"].hide {
  display: none;
}

[class*="span"].pull-right,
.row-fluid [class*="span"].pull-right {
  float: right;
}


================================================
FILE: servers/embed/assets/bootstrap/less/hero-unit.less
================================================
//
// Hero unit
// --------------------------------------------------


.hero-unit {
  padding: 60px;
  margin-bottom: 30px;
  background-color: @heroUnitBackground;
  .border-radius(6px);
  h1 {
    margin-bottom: 0;
    font-size: 60px;
    line-height: 1;
    color: @heroUnitHeadingColor;
    letter-spacing: -1px;
  }
  p {
    font-size: 18px;
    font-weight: 200;
    line-height: @baseLineHeight * 1.5;
    color: @heroUnitLeadColor;
  }
}


================================================
FILE: servers/embed/assets/bootstrap/less/labels-badges.less
================================================
//
// Labels and badges
// --------------------------------------------------


// Base classes
.label,
.badge {
  font-size: @baseFontSize * .846;
  font-weight: bold;
  line-height: 14px; // ensure proper line-height if floated
  color: @white;
  vertical-align: baseline;
  white-space: nowrap;
  text-shadow: 0 -1px 0 rgba(0,0,0,.25);
  background-color: @grayLight;
}
// Set unique padding and border-radii
.label {
  padding: 1px 4px 2px;
  .border-radius(3px);
}
.badge {
  padding: 1px 9px 2px;
  .border-radius(9px);
}

// Hover state, but only for links
a {
  &.label:hover,
  &.badge:hover {
    color: @white;
    text-decoration: none;
    cursor: pointer;
  }
}

// Colors
// Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute)
.label,
.badge {
  // Important (red)
  &-important         { background-color: @errorText; }
  &-important[href]   { background-color: darken(@errorText, 10%); }
  // Warnings (orange)
  &-warning           { background-color: @orange; }
  &-warning[href]     { background-color: darken(@orange, 10%); }
  // Success (green)
  &-success           { background-color: @successText; }
  &-success[href]     { background-color: darken(@successText, 10%); }
  // Info (turquoise)
  &-info              { background-color: @infoText; }
  &-info[href]        { background-color: darken(@infoText, 10%); }
  // Inverse (black)
  &-inverse           { background-color: @grayDark; }
  &-inverse[href]     { background-color: darken(@grayDark, 10%); }
}

// Quick fix for labels/badges in buttons
.btn {
  .label,
  .badge {
    position: relative;
    top: -1px;
  }
}
.btn-mini {
  .label,
  .badge {
    top: 0;
  }
}


================================================
FILE: servers/embed/assets/bootstrap/less/layouts.less
================================================
//
// Layouts
// --------------------------------------------------


// Container (centered, fixed-width layouts)
.container {
  .container-fixed();
}

// Fluid layouts (left aligned, with sidebar, min- & max-width content)
.container-fluid {
  padding-right: @gridGutterWidth;
  padding-left: @gridGutterWidth;
  .clearfix();
}

================================================
FILE: servers/embed/assets/bootstrap/less/mixins.less
================================================
//
// Mixins
// --------------------------------------------------


// UTILITY MIXINS
// --------------------------------------------------

// Clearfix
// --------
// For clearing floats like a boss h5bp.com/q
.clearfix {
  *zoom: 1;
  &:before,
  &:after {
    display: table;
    content: "";
    // Fixes Opera/contenteditable bug:
    // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
    line-height: 0;
  }
  &:after {
    clear: both;
  }
}

// Webkit-style focus
// ------------------
.tab-focus() {
  // Default
  outline: thin dotted #333;
  // Webkit
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}

// Center-align a block level element
// ----------------------------------
.center-block() {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

// IE7 inline-block
// ----------------
.ie7-inline-block() {
  *display: inline; /* IE7 inline-block hack */
  *zoom: 1;
}

// IE7 likes to collapse whitespace on either side of the inline-block elements.
// Ems because we're attempting to match the width of a space character. Left
// version is for form buttons, which typically come after other elements, and
// right version is for icons, which come before. Applying both is ok, but it will
// mean that space between those elements will be .6em (~2 space characters) in IE7,
// instead of the 1 space in other browsers.
.ie7-restore-left-whitespace() {
  *margin-left: .3em;

  &:first-child {
    *margin-left: 0;
  }
}

.ie7-restore-right-whitespace() {
  *margin-right: .3em;
}

// Sizing shortcuts
// -------------------------
.size(@height, @width) {
  width: @width;
  height: @height;
}
.square(@size) {
  .size(@size, @size);
}

// Placeholder text
// -------------------------
.placeholder(@color: @placeholderText) {
  &:-moz-placeholder {
    color: @color;
  }
  &:-ms-input-placeholder {
    color: @color;
  }
  &::-webkit-input-placeholder {
    color: @color;
  }
}

// Text overflow
// -------------------------
// Requires inline-block or block for proper styling
.text-overflow() {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

// CSS image replacement
// -------------------------
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
.hide-text {
  font: 0/0 a;
  color: transparent;
  text-shadow: none;
  background-color: transparent;
  border: 0;
}


// FONTS
// --------------------------------------------------

#font {
  #family {
    .serif() {
      font-family: @serifFontFamily;
    }
    .sans-serif() {
      font-family: @sansFontFamily;
    }
    .monospace() {
      font-family: @monoFontFamily;
    }
  }
  .shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
    font-size: @size;
    font-weight: @weight;
    line-height: @lineHeight;
  }
  .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
    #font > #family > .serif;
    #font > .shorthand(@size, @weight, @lineHeight);
  }
  .sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
    #font > #family > .sans-serif;
    #font > .shorthand(@size, @weight, @lineHeight);
  }
  .monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
    #font > #family > .monospace;
    #font > .shorthand(@size, @weight, @lineHeight);
  }
}


// FORMS
// --------------------------------------------------

// Block level inputs
.input-block-level {
  display: block;
  width: 100%;
  min-height: 30px;        // Make inputs at least the height of their button counterpart
  .box-sizing(border-box); // Makes inputs behave like true block-level elements
}



// Mixin for form field states
.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {
  // Set the text color
  > label,
  .help-block,
  .help-inline {
    color: @textColor;
  }
  // Style inputs accordingly
  .checkbox,
  .radio,
  input,
  select,
  textarea {
    color: @textColor;
    border-color: @borderColor;
    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
    &:focus {
      border-color: darken(@borderColor, 10%);
      // Write out in full since the lighten() function isn't easily escaped
      -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
         -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
              box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
    }
  }
  // Give a small background color for input-prepend/-append
  .input-prepend .add-on,
  .input-append .add-on {
    color: @textColor;
    background-color: @backgroundColor;
    border-color: @textColor;
  }
}



// CSS3 PROPERTIES
// --------------------------------------------------

// Border Radius
.border-radius(@radius) {
  -webkit-border-radius: @radius;
     -moz-border-radius: @radius;
          border-radius: @radius;
}

// Single Corner Border Radius
.border-top-left-radius(@radius) {
  -webkit-border-top-left-radius: @radius;
      -moz-border-radius-topleft: @radius;
          border-top-left-radius: @radius;
}
.border-top-right-radius(@radius) {
  -webkit-border-top-right-radius: @radius;
      -moz-border-radius-topright: @radius;
          border-top-right-radius: @radius;
}
.border-bottom-right-radius(@radius) {
  -webkit-border-bottom-right-radius: @radius;
      -moz-border-radius-bottomright: @radius;
          border-bottom-right-radius: @radius;
}
.border-bottom-left-radius(@radius) {
  -webkit-border-bottom-left-radius: @radius;
      -moz-border-radius-bottomleft: @radius;
          border-bottom-left-radius: @radius;
}

// Single Side Border Radius
.border-top-radius(@radius) {
  .border-top-right-radius(@radius);
  .border-top-left-radius(@radius);
}
.border-right-radius(@radius) {
  .border-top-right-radius(@radius);
  .border-bottom-right-radius(@radius);
}
.border-bottom-radius(@radius) {
  .border-bottom-right-radius(@radius);
  .border-bottom-left-radius(@radius);
}
.border-left-radius(@radius) {
  .border-top-left-radius(@radius);
  .border-bottom-left-radius(@radius);
}

// Drop shadows
.box-shadow(@shadow) {
  -webkit-box-shadow: @shadow;
     -moz-box-shadow: @shadow;
          box-shadow: @shadow;
}

// Transitions
.transition(@transition) {
  -webkit-transition: @transition;
     -moz-transition: @transition;
       -o-transition: @transition;
          transition: @transition;
}

// Transformations
.rotate(@degrees) {
  -webkit-transform: rotate(@degrees);
     -moz-transform: rotate(@degrees);
      -ms-transform: rotate(@degrees);
       -o-transform: rotate(@degrees);
          transform: rotate(@degrees);
}
.scale(@ratio) {
  -webkit-transform: scale(@ratio);
     -moz-transform: scale(@ratio);
      -ms-transform: scale(@ratio);
       -o-transform: scale(@ratio);
          transform: scale(@ratio);
}
.translate(@x, @y) {
  -webkit-transform: translate(@x, @y);
     -moz-transform: translate(@x, @y);
      -ms-transform: translate(@x, @y);
       -o-transform: translate(@x, @y);
          transform: translate(@x, @y);
}
.skew(@x, @y) {
  -webkit-transform: skew(@x, @y);
     -moz-transform: skew(@x, @y);
      -ms-transform: skew(@x, @y);
       -o-transform: skew(@x, @y);
          transform: skew(@x, @y);
}
.translate3d(@x, @y, @z) {
  -webkit-transform: translate3d(@x, @y, @z);
     -moz-transform: translate3d(@x, @y, @z);
       -o-transform: translate3d(@x, @y, @z);
          transform: translate3d(@x, @y, @z);
}

// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
// Default value is `visible`, but can be changed to `hidden
// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples
.backface-visibility(@visibility){
	-webkit-backface-visibility: @visibility;
	   -moz-backface-visibility: @visibility;
	        backface-visibility: @visibility;
}

// Background clipping
// Heads up: FF 3.6 and under need "padding" instead of "padding-box"
.background-clip(@clip) {
  -webkit-background-clip: @clip;
     -moz-background-clip: @clip;
          background-clip: @clip;
}

// Background sizing
.background-size(@size){
  -webkit-background-size: @size;
     -moz-background-size: @size;
       -o-background-size: @size;
          background-size: @size;
}


// Box sizing
.box-sizing(@boxmodel) {
  -webkit-box-sizing: @boxmodel;
     -moz-box-sizing: @boxmodel;
          box-sizing: @boxmodel;
}

// User select
// For selecting text on the page
.user-select(@select) {
  -webkit-user-select: @select;
     -moz-user-select: @select;
      -ms-user-select: @select;
       -o-user-select: @select;
          user-select: @select;
}

// Resize anything
.resizable(@direction) {
  resize: @direction; // Options: horizontal, vertical, both
  overflow: auto; // Safari fix
}

// CSS3 Content Columns
.content-columns(@columnCount, @columnGap: @gridGutterWidth) {
  -webkit-column-count: @columnCount;
     -moz-column-count: @columnCount;
          column-count: @columnCount;
  -webkit-column-gap: @columnGap;
     -moz-column-gap: @columnGap;
          column-gap: @columnGap;
}

// Optional hyphenation
.hyphens(@mode: auto) {
  word-wrap: break-word;
  -webkit-hyphens: @mode;
     -moz-hyphens: @mode;
      -ms-hyphens: @mode;
       -o-hyphens: @mode;
          hyphens: @mode;
}

// Opacity
.opacity(@opacity) {
  opacity: @opacity / 100;
  filter: ~"alpha(opacity=@{opacity})";
}



// BACKGROUNDS
// --------------------------------------------------

// Add an alphatransparency value to any background or border color (via Elyse Holladay)
#translucent {
  .background(@color: @white, @alpha: 1) {
    background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
  }
  .border(@color: @white, @alpha: 1) {
    border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
    .background-clip(padding-box);
  }
}

// Gradient Bar Colors for buttons and alerts
.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
  color: @textColor;
  text-shadow: @textShadow;
  #gradient > .vertical(@primaryColor, @secondaryColor);
  border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);
  border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
}

// Gradients
#gradient {
  .horizontal(@startColor: #555, @endColor: #333) {
    background-color: @endColor;
    background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+
    background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
    background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+
    background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10
    background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10
    background-repeat: repeat-x;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@startColor),argb(@endColor))); // IE9 and down
  }
  .vertical(@startColor: #555, @endColor: #333) {
    background-color: mix(@startColor, @endColor, 60%);
    background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
    background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+
    background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10
    background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10
    background-repeat: repeat-x;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down
  }
  .directional(@startColor: #555, @endColor: #333, @deg: 45deg) {
    background-color: @endColor;
    background-repeat: repeat-x;
    background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+
    background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+
    background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10
    background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10
  }
  .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
    background-color: mix(@midColor, @endColor, 80%);
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
    background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);
    background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop*100%, @endColor);
    background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);
    background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);
    background-repeat: no-repeat;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
  }
  .radial(@innerColor: #555, @outerColor: #333)  {
    background-color: @outerColor;
    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));
    background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);
    background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);
    background-image: -o-radial-gradient(circle, @innerColor, @outerColor);
    background-repeat: no-repeat;
  }
  .striped(@color, @angle: 45deg) {
    background-color: @color;
    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
    background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
    background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
    background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
    background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
  }
}
// Reset filters for IE
.reset-filter() {
  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
}



// COMPONENT MIXINS
// --------------------------------------------------

// Horizontal dividers
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
.nav-divider(@top: #e5e5e5, @bottom: @white) {
  // IE7 needs a set width since we gave a height. Restricting just
  // to IE7 to keep the 1px left/right space in other browsers.
  // It is unclear where IE is getting the extra space that we need
  // to negative-margin away, but so it goes.
  *width: 100%;
  height: 1px;
  margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px
  *margin: -5px 0 5px;
  overflow: hidden;
  background-color: @top;
  border-bottom: 1px solid @bottom;
}

// Button backgrounds
// ------------------
.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
  // gradientBar will set the background to a pleasing blend of these, to support IE<=9
  .gradientBar(@startColor, @endColor, @textColor, @textShadow);
  *background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */
  .reset-filter();

  // in these cases the gradient won't cover the background, so we override
  &:hover, &:active, &.active, &.disabled, &[disabled] {
    color: @textColor;
    background-color: @endColor;
    *background-color: darken(@endColor, 5%);
  }

  // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
  &:active,
  &.active {
    background-color: darken(@endColor, 10%) e("\9");
  }
}

// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin.
.navbarVerticalAlign(@elementHeight) {
  margin-top: (@navbarHeight - @elementHeight) / 2;
}



// Grid System
// -----------

// Centered container element
.container-fixed() {
  margin-right: auto;
  margin-left: auto;
  .clearfix();
}

// Table columns
.tableColumns(@columnSpan: 1) {
  float: none; // undo default grid column styles
  width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells
  margin-left: 0; // undo default grid column styles
}

// Make a Grid
// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior
.makeRow() {
  margin-left: @gridGutterWidth * -1;
  .clearfix();
}
.makeColumn(@columns: 1, @offset: 0) {
  float: left;
  margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);
  width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
}

// The Grid
#grid {

  .core (@gridColumnWidth, @gridGutterWidth) {

    .spanX (@index) when (@index > 0) {
      (~".span@{index}") { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}

    .offsetX (@index) when (@index > 0) {
      (~".offset@{index}") { .offset(@index); }
      .offsetX(@index - 1);
    }
    .offsetX (0) {}

    .offset (@columns) {
      margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));
    }

    .span (@columns) {
      width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
    }

    .row {
      margin-left: @gridGutterWidth * -1;
      .clearfix();
    }

    [class*="span"] {
      float: left;
      margin-left: @gridGutterWidth;
    }

    // Set the container width, and override it for fixed navbars in media queries
    .container,
    .navbar-static-top .container,
    .navbar-fixed-top .container,
    .navbar-fixed-bottom .container { .span(@gridColumns); }

    // generate .spanX and .offsetX
    .spanX (@gridColumns);
    .offsetX (@gridColumns);

  }

  .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {

    .spanX (@index) when (@index > 0) {
      (~".span@{index}") { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}

    .offsetX (@index) when (@index > 0) {
      (~'.offset@{index}') { .offset(@index); }
      (~'.offset@{index}:first-child') { .offsetFirstChild(@index); }
      .offsetX(@index - 1);
    }
    .offsetX (0) {}

    .offset (@columns) {
      margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2);
  	  *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%);
    }

    .offsetFirstChild (@columns) {
      margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth);
      *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
    }

    .span (@columns) {
      width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));
      *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);
    }

    .row-fluid {
      width: 100%;
      .clearfix();
      [class*="span"] {
        .input-block-level();
        float: left;
        margin-left: @fluidGridGutterWidth;
        *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
      }
      [class*="span"]:first-child {
        margin-left: 0;
      }

      // generate .spanX and .offsetX
      .spanX (@gridColumns);
      .offsetX (@gridColumns);
    }

  }

  .input(@gridColumnWidth, @gridGutterWidth) {

    .spanX (@index) when (@index > 0) {
      (~"input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index}") { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}

    .span(@columns) {
      width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14;
    }

    input,
    textarea,
    .uneditable-input {
      margin-left: 0; // override margin-left from core grid system
    }

    // Space grid-sized controls properly if multiple per line
    .controls-row [class*="span"] + [class*="span"] {
      margin-left: @gridGutterWidth;
    }

    // generate .spanX
    .spanX (@gridColumns);

  }

}


================================================
FILE: servers/embed/assets/bootstrap/less/modals.less
================================================
//
// Modals
// --------------------------------------------------


// Recalculate z-index where appropriate
.modal-open {
  .dropdown-menu {  z-index: @zindexDropdown + @zindexModal; }
  .dropdown.open { *z-index: @zindexDropdown + @zindexModal; }
  .popover       {  z-index: @zindexPopover  + @zindexModal; }
  .tooltip       {  z-index: @zindexTooltip  + @zindexModal; }
}

// Background
.modal-backdrop {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: @zindexModalBackdrop;
  background-color: @black;
  // Fade for backdrop
  &.fade { opacity: 0; }
}

.modal-backdrop,
.modal-backdrop.fade.in {
  .opacity(80);
}

// Base modal
.modal {
  position: fixed;
  top: 50%;
  left: 50%;
  z-index: @zindexModal;
  overflow: auto;
  width: 560px;
  margin: -250px 0 0 -280px;
  background-color: @white;
  border: 1px solid #999;
  border: 1px solid rgba(0,0,0,.3);
  *border: 1px solid #999; /* IE6-7 */
  .border-radius(6px);
  .box-shadow(0 3px 7px rgba(0,0,0,0.3));
  .background-clip(padding-box);
  &.fade {
    .transition(e('opacity .3s linear, top .3s ease-out'));
    top: -25%;
  }
  &.fade.in { top: 50%; }
}
.modal-header {
  padding: 9px 15px;
  border-bottom: 1px solid #eee;
  // Close icon
  .close { margin-top: 2px; }
  // Heading
  h3 {
    margin: 0;
    line-height: 30px;
  }
}

// Body (where all modal content resides)
.modal-body {
  overflow-y: auto;
  max-height: 400px;
  padding: 15px;
}
// Remove bottom margin if need be
.modal-form {
  margin-bottom: 0;
}

// Footer (for actions)
.modal-footer {
  padding: 14px 15px 15px;
  margin-bottom: 0;
  text-align: right; // right align buttons
  background-color: #f5f5f5;
  border-top: 1px solid #ddd;
  .border-radius(0 0 6px 6px);
  .box-shadow(inset 0 1px 0 @white);
  .clearfix(); // clear it in case folks use .pull-* classes on buttons

  // Properly space out buttons
  .btn + .btn {
    margin-left: 5px;
    margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
  }
  // but override that for button groups
  .btn-group .btn + .btn {
    margin-left: -1px;
  }
}


================================================
FILE: servers/embed/assets/bootstrap/less/navbar.less
================================================
//
// Navbars (Redux)
// --------------------------------------------------


// COMMON STYLES
// -------------

// Base class and wrapper
.navbar {
  overflow: visible;
  margin-bottom: @baseLineHeight;
  color: @navbarText;

  // Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar
  *position: relative;
  *z-index: 2;
}

// Inner for background effects
// Gradient is applied to its own element because overflow visible is not honored by IE when filter is present
.navbar-inner {
  min-height: @navbarHeight;
  padding-left:  20px;
  padding-right: 20px;
  #gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground);
  border: 1px solid @navbarBorder;
  .border-radius(4px);
  .box-shadow(0 1px 4px rgba(0,0,0,.065));
}

// Set width to auto for default container
// We then reset it for fixed navbars in the #gridSystem mixin
.navbar .container {
  width: auto;
}

// Override the default collapsed state
.nav-collapse.collapse {
  height: auto;
}


// Brand: website or project name
// -------------------------
.navbar .brand {
  float: left;
  display: block;
  // Vertically center the text given @navbarHeight
  padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2);
  margin-left: -20px; // negative indent to left-align the text down the page
  font-size: 20px;
  font-weight: 200;
  color: @navbarBrandColor;
  text-shadow: 0 1px 0 @navbarBackgroundHighlight;
  &:hover {
    text-decoration: none;
  }
}

// Plain text in topbar
// -------------------------
.navbar-text {
  margin-bottom: 0;
  line-height: @navbarHeight;
}

// Janky solution for now to account for links outside the .nav
// -------------------------
.navbar-link {
  color: @navbarLinkColor;
  &:hover {
    color: @navbarLinkColorHover;
  }
}

// Dividers in navbar
// -------------------------
.navbar .divider-vertical {
  height: @navbarHeight;
  margin: 0 9px;
  border-left: 1px solid @navbarBackground;
  border-right: 1px solid @navbarBackgroundHighlight;
}

// Buttons in navbar
// -------------------------
.navbar .btn,
.navbar .btn-group {
  .navbarVerticalAlign(28px); // Vertically center in navbar
}
.navbar .btn-group .btn {
  margin: 0; // then undo the margin here so we don't accidentally double it
}

// Navbar forms
.navbar-form {
  margin-bottom: 0; // remove default bottom margin
  .clearfix();
  input,
  select,
  .radio,
  .checkbox {
    .navbarVerticalAlign(30px); // Vertically center in navbar
  }
  input,
  select,
  .btn {
    display: inline-block;
    margin-bottom: 0;
  }
  input[type="image"],
  input[type="checkbox"],
  input[type="radio"] {
    margin-top: 3px;
  }
  .input-append,
  .input-prepend {
    margin-top: 6px;
    white-space: nowrap; // preven two  items from separating within a .navbar-form that has .pull-left
    input {
      margin-top: 0; // remove the margin on top since it's on the parent
    }
  }
}

// Navbar search
.navbar-search {
  position: relative;
  float: left;
  .navbarVerticalAlign(30px); // Vertically center in navbar
  margin-bottom: 0;
  .search-query {
    margin-bottom: 0;
    padding: 4px 14px;
    #font > .sans-serif(13px, normal, 1);
    .border-radius(15px); // redeclare because of specificity of the type attribute
  }
}



// Static navbar
// -------------------------

.navbar-static-top {
  position: static;
  width: 100%;
  margin-bottom: 0; // remove 18px margin for default navbar
  .navbar-inner {
    .border-radius(0);
  }
}



// Fixed navbar
// -------------------------

// Shared (top/bottom) styles
.navbar-fixed-top,
.navbar-fixed-bottom {
  position: fixed;
  right: 0;
  left: 0;
  z-index: @zindexFixedNavbar;
  margin-bottom: 0; // remove 18px margin for default navbar
}
.navbar-fixed-top,
.navbar-fixed-bottom,
.navbar-static-top {
  .navbar-inner {
    border: 0;
  }
}
.navbar-fixed-top .navbar-inner,
.navbar-fixed-bottom .navbar-inner {
  padding-left:  0;
  padding-right: 0;
  .border-radius(0);
}

// Reset container width
// Required here as we reset the width earlier on and the grid mixins don't override early enough
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
  #grid > .core > .span(@gridColumns);
}

// Fixed to top
.navbar-fixed-top {
  top: 0;
}
.navbar-fixed-top,
.navbar-static-top {
  .navbar-inner {
    .box-shadow(~"inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1)");
  }
}

// Fixed to bottom
.navbar-fixed-bottom {
  bottom: 0;
  .navbar-inner {
    .box-shadow(~"inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1)");
  }
}



// NAVIGATION
// ----------

.navbar .nav {
  position: relative;
  left: 0;
  display: block;
  float: left;
  margin: 0 10px 0 0;
}
.navbar .nav.pull-right {
  float: right; // redeclare due to specificity
}
.navbar .nav > li {
  float: left;
}

// Links
.navbar .nav > li > a {
  float: none;
  // Vertically center the text given @navbarHeight
  padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2);
  color: @navbarLinkColor;
  text-decoration: none;
  text-shadow: 0 1px 0 @navbarBackgroundHighlight;
}
.navbar .nav .dropdown-toggle .caret {
  margin-top: 8px;
}

// Hover
.navbar .nav > li > a:focus,
.navbar .nav > li > a:hover {
  background-color: @navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover from .active
  color: @navbarLinkColorHover;
  text-decoration: none;
}

// Active nav items
.navbar .nav > .active > a,
.navbar .nav > .active > a:hover,
.navbar .nav > .active > a:focus {
  color: @navbarLinkColorActive;
  text-decoration: none;
  background-color: @navbarLinkBackgroundActive;
  -webkit-box-shadow: inset 0 3px 8px rgba(0,0,0,.125);
     -moz-box-shadow: inset 0 3px 8px rgba(0,0,0,.125);
          box-shadow: inset 0 3px 8px rgba(0,0,0,.125);
}

// Navbar button for toggling navbar items in responsive layouts
// These definitions need to come after '.navbar .btn'
.navbar .btn-navbar {
  display: none;
  float: right;
  padding: 7px 10px;
  margin-left: 5px;
  margin-right: 5px;
  .buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%));
  .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)");
}
.navbar .btn-navbar .icon-bar {
  display: block;
  width: 18px;
  height: 2px;
  background-color: #f5f5f5;
  .border-radius(1px);
  .box-shadow(0 1px 0 rgba(0,0,0,.25));
}
.btn-navbar .icon-bar + .icon-bar {
  margin-top: 3px;
}



// Dropdown menus
// --------------

// Menu position and menu carets
.navbar .nav > li > .dropdown-menu {
  &:before {
    content: '';
    display: inline-block;
    border-left:   7px solid transparent;
    border-right:  7px solid transparent;
    border-bottom: 7px solid #ccc;
    border-bottom-color: @dropdownBorder;
    position: absolute;
    top: -7px;
    left: 9px;
  }
  &:after {
    content: '';
    display: inline-block;
    border-left:   6px solid transparent;
    border-right:  6px solid transparent;
    border-bottom: 6px solid @dropdownBackground;
    position: absolute;
    top: -6px;
    left: 10px;
  }
}
// Menu position and menu caret support for dropups via extra dropup class
.navbar-fixed-bottom .nav > li > .dropdown-menu {
  &:before {
    border-top: 7px solid #ccc;
    border-top-color: @dropdownBorder;
    border-bottom: 0;
    bottom: -7px;
    top: auto;
  }
  &:after {
    border-top: 6px solid @dropdownBackground;
    border-bottom: 0;
    bottom: -6px;
    top: auto;
  }
}

// Remove background color from open dropdown
.navbar .nav li.dropdown.open > .dropdown-toggle,
.navbar .nav li.dropdown.active > .dropdown-toggle,
.navbar .nav li.dropdown.open.active > .dropdown-toggle {
  background-color: @navbarLinkBackgroundActive;
  color: @navbarLinkColorActive;
}
.navbar .nav li.dropdown > .dropdown-toggle .caret {
  border-top-color: @navbarLinkColor;
  border-bottom-color: @navbarLinkColor;
}
.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
  border-top-color: @navbarLinkColorActive;
  border-bottom-color: @navbarLinkColorActive;
}

// Right aligned menus need alt position
.navbar .pull-right > li > .dropdown-menu,
.navbar .nav > li > .dropdown-menu.pull-right {
  left: auto;
  right: 0;
  &:before {
    left: auto;
    right: 12px;
  }
  &:after {
    left: auto;
    right: 13px;
  }
  .dropdown-menu {
    left: auto;
    right: 100%;
    margin-left: 0;
    margin-right: -1px;
    .border-radius(6px 0 6px 6px);
  }
}


// Inverted navbar
// -------------------------

.navbar-inverse {
  color: @navbarInverseText;

  .navbar-inner {
    #gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground);
    border-color: @navbarInverseBorder;
  }

  .brand,
  .nav > li > a {
    color: @navbarInverseLinkColor;
    text-shadow: 0 -1px 0 rgba(0,0,0,.25);
    &:hover {
      color: @navbarInverseLinkColorHover;
    }
  }

  .nav > li > a:focus,
  .nav > li > a:hover {
    background-color: @navbarInverseLinkBackgroundHover;
    color: @navbarInverseLinkColorHover;
  }

  .nav .active > a,
  .nav .active > a:hover,
  .nav .active > a:focus {
    color: @navbarInverseLinkColorActive;
    background-color: @navbarInverseLinkBackgroundActive;
  }

  // Inline text links
  .navbar-link {
    color: @navbarInverseLinkColor;
    &:hover {
      color: @navbarInverseLinkColorHover;
    }
  }

  // Dividers in navbar
  .divider-vertical {
    border-left-color: @navbarInverseBackground;
    border-right-color: @navbarInverseBackgroundHighlight;
  }

  // Dropdowns
  .nav li.dropdown.open > .dropdown-toggle,
  .nav li.dropdown.active > .dropdown-toggle,
  .nav li.dropdown.open.active > .dropdown-toggle {
    background-color: @navbarInverseLinkBackgroundActive;
    color: @navbarInverseLinkColorActive;
  }
  .nav li.dropdown > .dropdown-toggle .caret {
    border-top-color: @navbarInverseLinkColor;
    border-bottom-color: @navbarInverseLinkColor;
  }
  .nav li.dropdown.open > .dropdown-toggle .caret,
  .nav li.dropdown.active > .dropdown-toggle .caret,
  .nav li.dropdown.open.active > .dropdown-toggle .caret {
    border-top-color: @navbarInverseLinkColorActive;
    border-bottom-color: @navbarInverseLinkColorActive;
  }

  // Navbar search
  .navbar-search {
    .search-query {
      color: @white;
      background-color: @navbarInverseSearchBackground;
      border-color: @navbarInverseSearchBorder;
      .box-shadow(~"inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15)");
      .transition(none);
      .placeholder(@navbarInverseSearchPlaceholderColor);

      // Focus states (we use .focused since IE7-8 and down doesn't support :focus)
      &:focus,
      &.focused {
        padding: 5px 15px;
        color: @grayDark;
        text-shadow: 0 1px 0 @white;
        background-color: @navbarInverseSearchBackgroundFocus;
        border: 0;
        .box-shadow(0 0 3px rgba(0,0,0,.15));
        outline: 0;
      }
    }
  }

  // Navbar collapse button
  .btn-navbar {
    .buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%));
  }

}





================================================
FILE: servers/embed/assets/bootstrap/less/navs.less
================================================
//
// Navs
// --------------------------------------------------


// BASE CLASS
// ----------

.
Download .txt
gitextract_2z_jhlig/

├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── config.sample.json
├── package.json
├── server.js
└── servers/
    ├── api/
    │   ├── .gitignore
    │   ├── .npmignore
    │   ├── errors.coffee
    │   ├── index.coffee
    │   ├── lib/
    │   │   └── database.coffee
    │   ├── middleware/
    │   │   ├── cache.coffee
    │   │   ├── cors.coffee
    │   │   ├── json.coffee
    │   │   ├── session.coffee
    │   │   └── user.coffee
    │   ├── package.json
    │   ├── schema/
    │   │   ├── packages/
    │   │   │   ├── create.json
    │   │   │   └── update.json
    │   │   └── plunks/
    │   │       ├── create.json
    │   │       └── update.json
    │   └── server.js
    ├── embed/
    │   ├── .gitignore
    │   ├── assets/
    │   │   ├── bootstrap/
    │   │   │   ├── js/
    │   │   │   │   ├── bootstrap-affix.js
    │   │   │   │   ├── bootstrap-alert.js
    │   │   │   │   ├── bootstrap-all.js
    │   │   │   │   ├── bootstrap-button.js
    │   │   │   │   ├── bootstrap-carousel.js
    │   │   │   │   ├── bootstrap-collapse.js
    │   │   │   │   ├── bootstrap-dropdown.js
    │   │   │   │   ├── bootstrap-modal.js
    │   │   │   │   ├── bootstrap-popover.js
    │   │   │   │   ├── bootstrap-scrollspy.js
    │   │   │   │   ├── bootstrap-tab.js
    │   │   │   │   ├── bootstrap-tooltip.js
    │   │   │   │   ├── bootstrap-transition.js
    │   │   │   │   └── bootstrap-typeahead.js
    │   │   │   └── less/
    │   │   │       ├── accordion.less
    │   │   │       ├── alerts.less
    │   │   │       ├── bootstrap.less
    │   │   │       ├── breadcrumbs.less
    │   │   │       ├── button-groups.less
    │   │   │       ├── buttons.less
    │   │   │       ├── carousel.less
    │   │   │       ├── close.less
    │   │   │       ├── code.less
    │   │   │       ├── component-animations.less
    │   │   │       ├── dropdowns.less
    │   │   │       ├── font-awesome.less
    │   │   │       ├── forms.less
    │   │   │       ├── grid.less
    │   │   │       ├── hero-unit.less
    │   │   │       ├── labels-badges.less
    │   │   │       ├── layouts.less
    │   │   │       ├── mixins.less
    │   │   │       ├── modals.less
    │   │   │       ├── navbar.less
    │   │   │       ├── navs.less
    │   │   │       ├── pager.less
    │   │   │       ├── pagination.less
    │   │   │       ├── popovers.less
    │   │   │       ├── progress-bars.less
    │   │   │       ├── reset.less
    │   │   │       ├── responsive-1200px-min.less
    │   │   │       ├── responsive-767px-max.less
    │   │   │       ├── responsive-768px-979px.less
    │   │   │       ├── responsive-navbar.less
    │   │   │       ├── responsive-utilities.less
    │   │   │       ├── responsive.less
    │   │   │       ├── scaffolding.less
    │   │   │       ├── sprites.less
    │   │   │       ├── tables.less
    │   │   │       ├── thumbnails.less
    │   │   │       ├── tooltip.less
    │   │   │       ├── type.less
    │   │   │       ├── utilities.less
    │   │   │       ├── variables.less
    │   │   │       └── wells.less
    │   │   ├── css/
    │   │   │   ├── components/
    │   │   │   │   └── navbar.less
    │   │   │   ├── pages/
    │   │   │   │   └── embed.less
    │   │   │   └── vendor/
    │   │   │       └── prettify.less
    │   │   └── js/
    │   │       ├── pages/
    │   │       │   └── embed.coffee
    │   │       ├── services/
    │   │       │   ├── importer.coffee
    │   │       │   ├── plunks.coffee
    │   │       │   └── url.coffee
    │   │       └── vendor/
    │   │           ├── angular-sanitize.js
    │   │           ├── angular-ui.js
    │   │           ├── angular.js
    │   │           ├── jquery.cookie.js
    │   │           ├── jquery.js
    │   │           ├── overthrow.js
    │   │           ├── prettify.js
    │   │           └── showdown.js
    │   ├── index.coffee
    │   ├── middleware/
    │   │   └── expose.coffee
    │   ├── package.json
    │   ├── server.js
    │   └── views/
    │       └── embed.jade
    ├── raw/
    │   ├── .gitignore
    │   ├── index.coffee
    │   ├── package.json
    │   ├── server.js
    │   └── views/
    │       └── directory.jade
    ├── run/
    │   ├── .gitignore
    │   ├── index.coffee
    │   ├── middleware/
    │   │   ├── cors.coffee
    │   │   └── json.coffee
    │   ├── package.json
    │   ├── schema/
    │   │   └── previews/
    │   │       └── create.json
    │   ├── server.js
    │   └── views/
    │       └── directory.jade
    └── www/
        ├── .gitignore
        ├── assets/
        │   ├── bootstrap/
        │   │   ├── js/
        │   │   │   ├── bootstrap-affix.js
        │   │   │   ├── bootstrap-alert.js
        │   │   │   ├── bootstrap-all.js
        │   │   │   ├── bootstrap-button.js
        │   │   │   ├── bootstrap-carousel.js
        │   │   │   ├── bootstrap-collapse.js
        │   │   │   ├── bootstrap-dropdown.js
        │   │   │   ├── bootstrap-modal.js
        │   │   │   ├── bootstrap-popover.js
        │   │   │   ├── bootstrap-scrollspy.js
        │   │   │   ├── bootstrap-tab.js
        │   │   │   ├── bootstrap-tooltip.js
        │   │   │   ├── bootstrap-transition.js
        │   │   │   └── bootstrap-typeahead.js
        │   │   └── less/
        │   │       ├── accordion.less
        │   │       ├── alerts.less
        │   │       ├── bootstrap.less
        │   │       ├── breadcrumbs.less
        │   │       ├── button-groups.less
        │   │       ├── buttons.less
        │   │       ├── carousel.less
        │   │       ├── close.less
        │   │       ├── code.less
        │   │       ├── component-animations.less
        │   │       ├── dropdowns.less
        │   │       ├── font-awesome.less
        │   │       ├── forms.less
        │   │       ├── grid.less
        │   │       ├── hero-unit.less
        │   │       ├── labels-badges.less
        │   │       ├── layouts.less
        │   │       ├── mixins.less
        │   │       ├── modals.less
        │   │       ├── navbar.less
        │   │       ├── navs.less
        │   │       ├── pager.less
        │   │       ├── pagination.less
        │   │       ├── popovers.less
        │   │       ├── progress-bars.less
        │   │       ├── reset.less
        │   │       ├── responsive-1200px-min.less
        │   │       ├── responsive-767px-max.less
        │   │       ├── responsive-768px-979px.less
        │   │       ├── responsive-navbar.less
        │   │       ├── responsive-utilities.less
        │   │       ├── responsive.less
        │   │       ├── scaffolding.less
        │   │       ├── sprites.less
        │   │       ├── tables.less
        │   │       ├── thumbnails.less
        │   │       ├── tooltip.less
        │   │       ├── type.less
        │   │       ├── utilities.less
        │   │       ├── variables.less
        │   │       └── wells.less
        │   ├── css/
        │   │   ├── common/
        │   │   │   └── style.less
        │   │   ├── components/
        │   │   │   ├── discussion.less
        │   │   │   ├── gallery.less
        │   │   │   ├── importer.less
        │   │   │   ├── multipanel.less
        │   │   │   ├── navbar.less
        │   │   │   ├── previewer.less
        │   │   │   ├── share.less
        │   │   │   ├── sidebar.less
        │   │   │   ├── statusbar.less
        │   │   │   ├── streamer.less
        │   │   │   ├── tags.less
        │   │   │   ├── toolbar.less
        │   │   │   └── userpanel.less
        │   │   ├── pages/
        │   │   │   ├── editor.less
        │   │   │   ├── landing.less
        │   │   │   └── preview.less
        │   │   └── vendor/
        │   │       ├── jquery-layout.less
        │   │       └── prettify.less
        │   └── js/
        │       ├── directives/
        │       │   ├── ace.coffee
        │       │   ├── builder.coffee
        │       │   ├── card.coffee
        │       │   ├── chat.coffee
        │       │   ├── discussion.coffee
        │       │   ├── layout.coffee
        │       │   ├── multipanel.coffee
        │       │   ├── share.coffee
        │       │   ├── statusbar.coffee
        │       │   ├── toolbar.coffee
        │       │   └── userpanel.coffee
        │       ├── pages/
        │       │   ├── editor.coffee
        │       │   └── landing.coffee
        │       ├── services/
        │       │   ├── catalogue.coffee
        │       │   ├── downloader.coffee
        │       │   ├── importer.coffee
        │       │   ├── modes.coffee
        │       │   ├── notifier.coffee
        │       │   ├── pages.coffee
        │       │   ├── panels.coffee
        │       │   ├── panes/
        │       │   │   ├── builder.coffee
        │       │   │   ├── explore.coffee
        │       │   │   ├── lint.coffee
        │       │   │   ├── previewer.coffee
        │       │   │   ├── readme.coffee
        │       │   │   └── streamer.coffee
        │       │   ├── panes-dev/
        │       │   │   ├── about.coffee
        │       │   │   ├── compiler.coffee
        │       │   │   ├── discussion.coffee
        │       │   │   └── settings.coffee
        │       │   ├── plunks.coffee
        │       │   ├── scratch.coffee
        │       │   ├── session.coffee
        │       │   ├── url.coffee
        │       │   └── whitelist.coffee
        │       ├── socialbuttons.js
        │       └── vendor/
        │           ├── ace/
        │           │   ├── ace.js
        │           │   ├── keybinding-emacs.js
        │           │   ├── keybinding-vim.js
        │           │   ├── mode-c9search.js
        │           │   ├── mode-c_cpp.js
        │           │   ├── mode-clojure.js
        │           │   ├── mode-coffee.js
        │           │   ├── mode-coldfusion.js
        │           │   ├── mode-csharp.js
        │           │   ├── mode-css.js
        │           │   ├── mode-diff.js
        │           │   ├── mode-glsl.js
        │           │   ├── mode-golang.js
        │           │   ├── mode-groovy.js
        │           │   ├── mode-haxe.js
        │           │   ├── mode-html.js
        │           │   ├── mode-jade.js
        │           │   ├── mode-java.js
        │           │   ├── mode-javascript.js
        │           │   ├── mode-json.js
        │           │   ├── mode-jsp.js
        │           │   ├── mode-jsx.js
        │           │   ├── mode-latex.js
        │           │   ├── mode-less.js
        │           │   ├── mode-liquid.js
        │           │   ├── mode-lua.js
        │           │   ├── mode-luapage.js
        │           │   ├── mode-markdown.js
        │           │   ├── mode-ocaml.js
        │           │   ├── mode-perl.js
        │           │   ├── mode-pgsql.js
        │           │   ├── mode-php.js
        │           │   ├── mode-powershell.js
        │           │   ├── mode-python.js
        │           │   ├── mode-ruby.js
        │           │   ├── mode-scad.js
        │           │   ├── mode-scala.js
        │           │   ├── mode-scss.js
        │           │   ├── mode-sh.js
        │           │   ├── mode-sql.js
        │           │   ├── mode-svg.js
        │           │   ├── mode-tcl.js
        │           │   ├── mode-text.js
        │           │   ├── mode-textile.js
        │           │   ├── mode-xml.js
        │           │   ├── mode-xquery.js
        │           │   ├── mode-yaml.js
        │           │   ├── theme-ambiance.js
        │           │   ├── theme-chrome.js
        │           │   ├── theme-clouds.js
        │           │   ├── theme-clouds_midnight.js
        │           │   ├── theme-cobalt.js
        │           │   ├── theme-crimson_editor.js
        │           │   ├── theme-dawn.js
        │           │   ├── theme-dreamweaver.js
        │           │   ├── theme-eclipse.js
        │           │   ├── theme-github.js
        │           │   ├── theme-idle_fingers.js
        │           │   ├── theme-kr_theme.js
        │           │   ├── theme-merbivore.js
        │           │   ├── theme-merbivore_soft.js
        │           │   ├── theme-mono_industrial.js
        │           │   ├── theme-monokai.js
        │           │   ├── theme-pastel_on_dark.js
        │           │   ├── theme-solarized_dark.js
        │           │   ├── theme-solarized_light.js
        │           │   ├── theme-textmate.js
        │           │   ├── theme-tomorrow.js
        │           │   ├── theme-tomorrow_night.js
        │           │   ├── theme-tomorrow_night_blue.js
        │           │   ├── theme-tomorrow_night_bright.js
        │           │   ├── theme-tomorrow_night_eighties.js
        │           │   ├── theme-twilight.js
        │           │   ├── theme-vibrant_ink.js
        │           │   ├── theme-xcode.js
        │           │   ├── worker-coffee.js
        │           │   ├── worker-css.js
        │           │   ├── worker-javascript.js
        │           │   ├── worker-json.js
        │           │   └── worker-xquery.js
        │           ├── angular-cookies.js
        │           ├── angular-jq.js
        │           ├── angular-resource.js
        │           ├── angular-sanitize.js
        │           ├── angular-ui.js
        │           ├── angular.js
        │           ├── backbone.js
        │           ├── beautify.js
        │           ├── handlebars.js
        │           ├── jquery.cookie.js
        │           ├── jquery.history.js
        │           ├── jquery.js
        │           ├── jquery.layout.js
        │           ├── jquery.lazyload.js
        │           ├── jquery.timeago.js
        │           ├── jquery.ui.custom.js
        │           ├── jszip.js
        │           ├── noty/
        │           │   ├── jquery.noty.js
        │           │   ├── layouts/
        │           │   │   ├── bottom.js
        │           │   │   ├── bottomCenter.js
        │           │   │   ├── bottomLeft.js
        │           │   │   ├── bottomRight.js
        │           │   │   ├── center.js
        │           │   │   ├── centerLeft.js
        │           │   │   ├── centerRight.js
        │           │   │   ├── inline.js
        │           │   │   ├── top.js
        │           │   │   ├── topCenter.js
        │           │   │   ├── topLeft.js
        │           │   │   └── topRight.js
        │           │   ├── promise.js
        │           │   └── themes/
        │           │       └── default.js
        │           ├── overthrow.js
        │           ├── page.js
        │           ├── postmessage.js
        │           ├── prettify.js
        │           ├── semver.js
        │           ├── showdown.js
        │           └── underscore.js
        ├── index.coffee
        ├── middleware/
        │   ├── error.coffee
        │   ├── expose.coffee
        │   └── session.coffee
        ├── models/
        │   └── user.coffee
        ├── package.json
        ├── server.js
        └── views/
            ├── auth/
            │   ├── error.jade
            │   └── success.jade
            ├── editor.jade
            ├── landing.jade
            └── partials/
                ├── discuss.jade
                ├── home.jade
                ├── preview.jade
                ├── tag.jade
                ├── tags.jade
                ├── user.jade
                └── users.jade
Download .txt
SYMBOL INDEX (822 symbols across 55 files)

FILE: servers/embed/assets/bootstrap/js/bootstrap-alert.js
  function removeElement (line 56) | function removeElement() {

FILE: servers/embed/assets/bootstrap/js/bootstrap-dropdown.js
  function clearMenus (line 102) | function clearMenus() {
  function getParent (line 107) | function getParent($this) {

FILE: servers/embed/assets/bootstrap/js/bootstrap-scrollspy.js
  function ScrollSpy (line 29) | function ScrollSpy(element, options) {

FILE: servers/embed/assets/bootstrap/js/bootstrap-tab.js
  function next (line 79) | function next() {

FILE: servers/embed/assets/bootstrap/js/bootstrap-tooltip.js
  function removeWithAnimation (line 167) | function removeWithAnimation() {

FILE: servers/embed/assets/js/vendor/angular-sanitize.js
  function makeMap (line 175) | function makeMap(str) {
  function htmlParser (line 194) | function htmlParser( html, handler ) {
  function decodeEntities (line 323) | function decodeEntities(value) {
  function encodeEntities (line 335) | function encodeEntities(value) {
  function htmlSanitizeWriter (line 355) | function htmlSanitizeWriter(buf){

FILE: servers/embed/assets/js/vendor/angular.js
  function fromCharCode (line 55) | function fromCharCode(code) {return String.fromCharCode(code);}
  function forEach (line 100) | function forEach(obj, iterator, context) {
  function sortedKeys (line 125) | function sortedKeys(obj) {
  function forEachSorted (line 135) | function forEachSorted(obj, iterator, context) {
  function reverseParams (line 149) | function reverseParams(iteratorFn) {
  function nextUid (line 161) | function nextUid() {
  function extend (line 195) | function extend(dst) {
  function int (line 206) | function int(str) {
  function inherit (line 211) | function inherit(parent, extra) {
  function noop (line 231) | function noop() {}
  function identity (line 250) | function identity($) {return $;}
  function valueFn (line 254) | function valueFn(value) {return function() {return value;};}
  function isUndefined (line 267) | function isUndefined(value){return typeof value == 'undefined';}
  function isDefined (line 281) | function isDefined(value){return typeof value != 'undefined';}
  function isObject (line 296) | function isObject(value){return value != null && typeof value == 'object';}
  function isString (line 310) | function isString(value){return typeof value == 'string';}
  function isNumber (line 324) | function isNumber(value){return typeof value == 'number';}
  function isDate (line 338) | function isDate(value){
  function isArray (line 354) | function isArray(value) {
  function isFunction (line 370) | function isFunction(value){return typeof value == 'function';}
  function isWindow (line 380) | function isWindow(obj) {
  function isScope (line 385) | function isScope(obj) {
  function isFile (line 390) | function isFile(obj) {
  function isBoolean (line 395) | function isBoolean(value) {
  function trim (line 400) | function trim(value) {
  function isElement (line 415) | function isElement(node) {
  function makeMap (line 425) | function makeMap(str){
  function map (line 446) | function map(obj, iterator, context) {
  function size (line 467) | function size(obj, ownPropsOnly) {
  function includes (line 482) | function includes(array, obj) {
  function indexOf (line 486) | function indexOf(array, obj) {
  function arrayRemove (line 495) | function arrayRemove(array, value) {
  function isLeafNode (line 502) | function isLeafNode (node) {
  function copy (line 536) | function copy(source, destination){
  function shallowCopy (line 573) | function shallowCopy(src, dst) {
  function equals (line 610) | function equals(o1, o2) {
  function concat (line 646) | function concat(array1, array2, index) {
  function sliceArgs (line 650) | function sliceArgs(args, startIndex) {
  function bind (line 670) | function bind(self, fn) {
  function toJsonReplacer (line 691) | function toJsonReplacer(key, value) {
  function toJson (line 720) | function toJson(obj, pretty) {
  function fromJson (line 736) | function fromJson(json) {
  function toBoolean (line 743) | function toBoolean(value) {
  function startingTag (line 756) | function startingTag(element) {
  function parseKeyValue (line 775) | function parseKeyValue(/**string*/keyValue) {
  function toKeyValue (line 787) | function toKeyValue(obj) {
  function encodeUriSegment (line 807) | function encodeUriSegment(val) {
  function encodeUriQuery (line 826) | function encodeUriQuery(val, pctEncodeSpaces) {
  function angularInit (line 864) | function angularInit(element, bootstrap) {
  function bootstrap (line 920) | function bootstrap(element, modules) {
  function snake_case (line 940) | function snake_case(name, separator){
  function bindJQuery (line 947) | function bindJQuery() {
  function assertArg (line 971) | function assertArg(arg, name, reason) {
  function assertArgFn (line 978) | function assertArgFn(arg, name, acceptArrayAnnotation) {
  function setupModuleLoader (line 996) | function setupModuleLoader(window) {
  function publishExternalAPI (line 1258) | function publishExternalAPI(angular){
  function jqNextId (line 1451) | function jqNextId() { return ++jqId; }
  function camelCase (line 1462) | function camelCase(name) {
  function JQLitePatchJQueryRemove (line 1478) | function JQLitePatchJQueryRemove(name, dispatchThis) {
  function JQLite (line 1517) | function JQLite(element) {
  function JQLiteClone (line 1541) | function JQLiteClone(element) {
  function JQLiteDealoc (line 1545) | function JQLiteDealoc(element){
  function JQLiteUnbind (line 1552) | function JQLiteUnbind(element, type, fn) {
  function JQLiteRemoveData (line 1573) | function JQLiteRemoveData(element) {
  function JQLiteExpandoStore (line 1587) | function JQLiteExpandoStore(element, key, value) {
  function JQLiteData (line 1602) | function JQLiteData(element, key, value) {
  function JQLiteHasClass (line 1628) | function JQLiteHasClass(element, selector) {
  function JQLiteRemoveClass (line 1633) | function JQLiteRemoveClass(element, selector) {
  function JQLiteAddClass (line 1645) | function JQLiteAddClass(element, selector) {
  function JQLiteAddNodes (line 1655) | function JQLiteAddNodes(root, elements) {
  function JQLiteController (line 1666) | function JQLiteController(element, name) {
  function JQLiteInheritedData (line 1670) | function JQLiteInheritedData(element, name, value) {
  function trigger (line 1692) | function trigger() {
  function getBooleanAttrName (line 1732) | function getBooleanAttrName(element, name) {
  function createEventHandler (line 1898) | function createEventHandler(element, events) {
  function hashKey (line 2129) | function hashKey(obj) {
  function HashMap (line 2150) | function HashMap(array){
  function HashQueueMap (line 2186) | function HashQueueMap() {}
  function annotate (line 2258) | function annotate(fn) {
  function createInjector (line 2611) | function createInjector(modulesToLoad) {
  function $AnchorScrollProvider (line 2833) | function $AnchorScrollProvider() {
  function Browser (line 2906) | function Browser(window, document, $log, $sniffer) {
  function $BrowserProvider (line 3238) | function $BrowserProvider(){
  function $CacheFactoryProvider (line 3267) | function $CacheFactoryProvider() {
  function $TemplateCacheProvider (line 3407) | function $TemplateCacheProvider() {
  function $CompileProvider (line 3577) | function $CompileProvider($provide) {
  function directiveNormalize (line 4492) | function directiveNormalize(name) {
  function nodesetLinkingFn (line 4539) | function nodesetLinkingFn(
  function directiveLinkingFn (line 4546) | function directiveLinkingFn(
  function $ControllerProvider (line 4564) | function $ControllerProvider() {
  function $DocumentProvider (line 4634) | function $DocumentProvider(){
  function $ExceptionHandlerProvider (line 4657) | function $ExceptionHandlerProvider() {
  function $InterpolateProvider (line 4674) | function $InterpolateProvider() {
  function encodePath (line 4820) | function encodePath(path) {
  function stripHash (line 4831) | function stripHash(url) {
  function matchUrl (line 4836) | function matchUrl(url, obj) {
  function composeProtocolHostPort (line 4858) | function composeProtocolHostPort(protocol, host, port) {
  function pathPrefixFromBase (line 4863) | function pathPrefixFromBase(basePath) {
  function convertToHtml5Url (line 4868) | function convertToHtml5Url(url, basePath, hashPrefix) {
  function convertToHashbangUrl (line 4883) | function convertToHashbangUrl(url, basePath, hashPrefix) {
  function LocationUrl (line 4914) | function LocationUrl(url, pathPrefix, appBaseUrl) {
  function LocationHashbangUrl (line 4969) | function LocationHashbangUrl(url, hashPrefix, appBaseUrl) {
  function LocationHashbangInHtml5Url (line 5207) | function LocationHashbangInHtml5Url(url, hashPrefix, appBaseUrl, baseExt...
  function locationGetter (line 5220) | function locationGetter(property) {
  function locationGetterSetter (line 5227) | function locationGetterSetter(property, preprocess) {
  function $LocationProvider (line 5275) | function $LocationProvider(){
  function $LogProvider (line 5459) | function $LogProvider(){
  function lex (line 5566) | function lex(text, csp){
  function parser (line 5800) | function parser(text, json, $filter, csp){
  function setter (line 6180) | function setter(obj, path, setValue) {
  function getter (line 6203) | function getter(obj, path, bindFnToScope) {
  function cspSafeGetterFn (line 6229) | function cspSafeGetterFn(key0, key1, key2, key3, key4) {
  function getterFn (line 6293) | function getterFn(path, csp) {
  function $ParseProvider (line 6379) | function $ParseProvider() {
  function $QProvider (line 6521) | function $QProvider() {
  function qFactory (line 6539) | function qFactory(nextTick, exceptionHandler) {
  function $RouteProvider (line 6796) | function $RouteProvider(){
  function $RouteParamsProvider (line 7260) | function $RouteParamsProvider() {
  function $RootScopeProvider (line 7322) | function $RootScopeProvider(){
  function $SnifferProvider (line 8065) | function $SnifferProvider() {
  function $WindowProvider (line 8121) | function $WindowProvider(){
  function parseHeaders (line 8131) | function parseHeaders(headers) {
  function headersGetter (line 8166) | function headersGetter(headers) {
  function transformData (line 8191) | function transformData(data, headers, fns) {
  function isSuccess (line 8203) | function isSuccess(status) {
  function $HttpProvider (line 8208) | function $HttpProvider() {
  function $HttpBackendProvider (line 8913) | function $HttpBackendProvider() {
  function createHttpBackend (line 8920) | function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawD...
  function $LocaleProvider (line 9025) | function $LocaleProvider(){
  function $TimeoutProvider (line 9086) | function $TimeoutProvider() {
  function $FilterProvider (line 9246) | function $FilterProvider($provide) {
  function filterFilter (line 9353) | function filterFilter() {
  function currencyFilter (line 9478) | function currencyFilter($locale) {
  function numberFilter (line 9535) | function numberFilter($locale) {
  function formatNumber (line 9544) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
  function padNumber (line 9604) | function padNumber(num, digits, trim) {
  function dateGetter (line 9618) | function dateGetter(name, size, offset, trim) {
  function dateStrGetter (line 9628) | function dateStrGetter(name, shortForm) {
  function timeZoneGetter (line 9637) | function timeZoneGetter(date) {
  function ampmGetter (line 9642) | function ampmGetter(date, formats) {
  function dateFilter (line 9753) | function dateFilter($locale) {
  function jsonFilter (line 9848) | function jsonFilter() {
  function limitToFilter (line 9929) | function limitToFilter(){
  function orderByFilter (line 10049) | function orderByFilter($parse){
  function ngDirective (line 10098) | function ngDirective(directive) {
  function FormController (line 10482) | function FormController(element, attrs) {
  function isEmpty (line 11074) | function isEmpty(value) {
  function textInputType (line 11079) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function numberInputType (line 11192) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function urlInputType (line 11254) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function emailInputType (line 11271) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function radioInputType (line 11288) | function radioInputType(scope, element, attr, ctrl) {
  function checkboxInputType (line 11310) | function checkboxInputType(scope, element, attr, ctrl) {
  function toggleValidCss (line 11611) | function toggleValidCss(isValid, validationErrorKey) {
  function classDirective (line 12101) | function classDirective(name, selector) {
  function destroyLastScope (line 13665) | function destroyLastScope() {
  function clearContent (line 13672) | function clearContent() {
  function update (line 13677) | function update() {
  function Single (line 13988) | function Single(scope, selectElement, ngModelCtrl, selectCtrl) {
  function Multiple (line 14013) | function Multiple(scope, selectElement, ctrl) {
  function Options (line 14044) | function Options(scope, selectElement, ctrl) {

FILE: servers/embed/assets/js/vendor/jquery.js
  function jQuerySub (line 897) | function jQuerySub( selector, context ) {
  function doScrollCheck (line 963) | function doScrollCheck() {
  function createFlags (line 990) | function createFlags( flags ) {
  function resolveFunc (line 1325) | function resolveFunc( i ) {
  function progressFunc (line 1333) | function progressFunc( i ) {
  function dataAttr (line 1985) | function dataAttr( elem, key, data ) {
  function isEmptyDataObject (line 2016) | function isEmptyDataObject( obj ) {
  function handleQueueMarkDefer (line 2034) | function handleQueueMarkDefer( elem, type, src ) {
  function resolve (line 2193) | function resolve() {
  function returnFalse (line 3546) | function returnFalse() {
  function returnTrue (line 3549) | function returnTrue() {
  function dirNodeCheck (line 5260) | function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  function dirCheck (line 5293) | function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  function isDisconnected (line 5566) | function isDisconnected( node ) {
  function winnow (line 5683) | function winnow( elements, qualifier, keep ) {
  function createSafeFragment (line 5720) | function createSafeFragment( document ) {
  function root (line 6092) | function root( elem, cur ) {
  function cloneCopyEvent (line 6099) | function cloneCopyEvent( src, dest ) {
  function cloneFixAttributes (line 6127) | function cloneFixAttributes( src, dest ) {
  function getAll (line 6272) | function getAll( elem ) {
  function fixDefaultChecked (line 6285) | function fixDefaultChecked( elem ) {
  function findInputs (line 6291) | function findInputs( elem ) {
  function shimCloneNode (line 6302) | function shimCloneNode( elem ) {
  function getWidthOrHeight (line 6793) | function getWidthOrHeight( elem, name, extra ) {
  function addToPrefiltersOrTransports (line 7034) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 7070) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 7112) | function ajaxExtend( target, src ) {
  function done (line 7454) | function done( status, nativeStatusText, responses, headers ) {
  function buildParams (line 7769) | function buildParams( prefix, obj, traditional, add ) {
  function ajaxHandleResponses (line 7819) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 7884) | function ajaxConvert( s, response ) {
  function createStandardXHR (line 8149) | function createStandardXHR() {
  function createActiveXHR (line 8155) | function createActiveXHR() {
  function doAnimation (line 8494) | function doAnimation() {
  function stopQueue (line 8650) | function stopQueue( elem, data, index ) {
  function createFxNow (line 8692) | function createFxNow() {
  function clearFxNow (line 8697) | function clearFxNow() {
  function genFx (line 8702) | function genFx( type, num ) {
  function t (line 8817) | function t( gotoEnd ) {
  function defaultDisplay (line 9015) | function defaultDisplay( nodeName ) {
  function getWindow (line 9299) | function getWindow( elem ) {

FILE: servers/embed/assets/js/vendor/prettify.js
  function L (line 2) | function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var...
  function M (line 6) | function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.classN...
  function B (line 7) | function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}
  function x (line 7) | function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(...
  function u (line 9) | function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''...
  function D (line 12) | function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.clas...
  function k (line 15) | function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(...
  function C (line 15) | function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-m...
  function E (line 15) | function E(a){var m=
  function m (line 25) | function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Inf...

FILE: servers/embed/assets/js/vendor/showdown.js
  function headerId (line 698) | function headerId(m) {
  function char2hex (line 1212) | function char2hex(ch) {

FILE: servers/www/assets/bootstrap/js/bootstrap-alert.js
  function removeElement (line 56) | function removeElement() {

FILE: servers/www/assets/bootstrap/js/bootstrap-dropdown.js
  function clearMenus (line 102) | function clearMenus() {
  function getParent (line 107) | function getParent($this) {

FILE: servers/www/assets/bootstrap/js/bootstrap-scrollspy.js
  function ScrollSpy (line 29) | function ScrollSpy(element, options) {

FILE: servers/www/assets/bootstrap/js/bootstrap-tab.js
  function next (line 79) | function next() {

FILE: servers/www/assets/bootstrap/js/bootstrap-tooltip.js
  function removeWithAnimation (line 167) | function removeWithAnimation() {

FILE: servers/www/assets/js/socialbuttons.js
  function initSocialButtons (line 1) | function initSocialButtons() {

FILE: servers/www/assets/js/vendor/ace/ace.js
  function exportAce (line 166) | function exportAce(ns) {
  function getNativeFlags (line 360) | function getNativeFlags (regex) {
  function indexOf (line 368) | function indexOf (array, item, from) {
  function doesDefinePropertyWork (line 958) | function doesDefinePropertyWork(object) {
  function onReleaseCapture (line 1738) | function onReleaseCapture(e) {
  function onMouseUp (line 1761) | function onMouseUp(e) {
  function normalizeCommandKeys (line 1852) | function normalizeCommandKeys(callback, e, keyCode) {
  function reset (line 3568) | function reset(full) {
  function sendText (line 3579) | function sendText(valueToSend) {
  function isFocused (line 3773) | function isFocused() {
  function onContextMenuClose (line 3810) | function onContextMenuClose() {
  function DefaultHandlers (line 3973) | function DefaultHandlers(mouseHandler) {
  function calcDistance (line 4264) | function calcDistance(ax, ay, bx, by) {
  function calcRangeOrientation (line 4268) | function calcRangeOrientation(range, cursor) {
  function GutterHandler (line 4287) | function GutterHandler(mouseHandler) {
  function FoldHandler (line 4557) | function FoldHandler(editor) {
  function done (line 5305) | function done(module) {
  function fetch (line 5318) | function fetch(name, callback) {
  function isInsert (line 5554) | function isInsert(delta) {
  function addSplit (line 6043) | function addSplit(screenPos) {
  function isFullWidth (line 6448) | function isFullWidth(c) {
  function deHyphenate (line 6592) | function deHyphenate(str) {
  function addUnicodePackage (line 8303) | function addUnicodePackage (pack) {
  function Folding (line 9069) | function Folding() {
  function FoldLine (line 9745) | function FoldLine(foldData, folds) {
  function BracketMatch (line 10160) | function BracketMatch() {
  function HashHandler (line 10772) | function HashHandler(config, platform) {
  function bindKey (line 10906) | function bindKey(win, mac) {
  function afterLoad (line 12314) | function afterLoad(theme) {
  function addTokens (line 13259) | function addTokens(tokens, from, to) {
  function find (line 13997) | function find(session, needle, dir) {
  function strRepeat (line 14643) | function strRepeat(n, ch) {
  function alignLeft (line 14647) | function alignLeft(m) {
  function alignRight (line 14652) | function alignRight(m) {
  function unAlign (line 14657) | function unAlign(m) {
  function isSamePoint (line 14666) | function isSamePoint(p1, p2) {
  function MultiSelect (line 14711) | function MultiSelect(editor) {
  function addAltCursorListeners (line 14726) | function addAltCursorListeners(editor){
  function isSamePoint (line 14955) | function isSamePoint(p1, p2) {
  function onMouseDown (line 14959) | function onMouseDown(e) {
  function StateHandler (line 15292) | function StateHandler(keymapping) {

FILE: servers/www/assets/js/vendor/ace/keybinding-vim.js
  function setPreviousCommand (line 596) | function setPreviousCommand(fn) {
  function Motion (line 844) | function Motion(getRange, type){
  function find (line 947) | function find(editor, needle, dir) {

FILE: servers/www/assets/js/vendor/ace/mode-coffee.js
  function Mode (line 43) | function Mode() {
  function CoffeeHighlightRules (line 124) | function CoffeeHighlightRules() {

FILE: servers/www/assets/js/vendor/ace/mode-coldfusion.js
  function string (line 171) | function string(state) {
  function multiLineString (line 191) | function multiLineString(quote, state) {
  function hasType (line 259) | function hasType(token, type) {

FILE: servers/www/assets/js/vendor/ace/mode-html.js
  function string (line 1411) | function string(state) {
  function multiLineString (line 1431) | function multiLineString(quote, state) {
  function hasType (line 1500) | function hasType(token, type) {
  function hasType (line 1560) | function hasType(token, type) {

FILE: servers/www/assets/js/vendor/ace/mode-jade.js
  function mixin_embed (line 75) | function mixin_embed(tag, prefix) {
  function github_embed (line 328) | function github_embed(tag, prefix) {
  function string (line 971) | function string(state) {
  function multiLineString (line 991) | function multiLineString(quote, state) {
  function CoffeeHighlightRules (line 1864) | function CoffeeHighlightRules() {

FILE: servers/www/assets/js/vendor/ace/mode-jsp.js
  function string (line 836) | function string(state) {
  function multiLineString (line 856) | function multiLineString(quote, state) {

FILE: servers/www/assets/js/vendor/ace/mode-jsx.js
  function Mode (line 12) | function Mode() {

FILE: servers/www/assets/js/vendor/ace/mode-liquid.js
  function string (line 880) | function string(state) {
  function multiLineString (line 900) | function multiLineString(quote, state) {

FILE: servers/www/assets/js/vendor/ace/mode-lua.js
  function getNetIndentLevel (line 63) | function getNetIndentLevel(tokens) {

FILE: servers/www/assets/js/vendor/ace/mode-luapage.js
  function string (line 1404) | function string(state) {
  function multiLineString (line 1424) | function multiLineString(quote, state) {
  function hasType (line 1493) | function hasType(token, type) {
  function hasType (line 1553) | function hasType(token, type) {
  function getNetIndentLevel (line 1977) | function getNetIndentLevel(tokens) {

FILE: servers/www/assets/js/vendor/ace/mode-markdown.js
  function string (line 1139) | function string(state) {
  function multiLineString (line 1159) | function multiLineString(quote, state) {
  function hasType (line 1227) | function hasType(token, type) {
  function hasType (line 1942) | function hasType(token, type) {
  function github_embed (line 2106) | function github_embed(tag, prefix) {

FILE: servers/www/assets/js/vendor/ace/mode-php.js
  function string (line 1867) | function string(state) {
  function multiLineString (line 1887) | function multiLineString(quote, state) {

FILE: servers/www/assets/js/vendor/ace/mode-svg.js
  function string (line 178) | function string(state) {
  function multiLineString (line 198) | function multiLineString(quote, state) {
  function hasType (line 266) | function hasType(token, type) {

FILE: servers/www/assets/js/vendor/ace/mode-xml.js
  function string (line 136) | function string(state) {
  function multiLineString (line 156) | function multiLineString(quote, state) {
  function hasType (line 224) | function hasType(token, type) {

FILE: servers/www/assets/js/vendor/ace/worker-coffee.js
  function initBaseUrls (line 91) | function initBaseUrls(topLevelNamespaces) {
  function initSender (line 95) | function initSender() {
  function getNativeFlags (line 249) | function getNativeFlags (regex) {
  function indexOf (line 257) | function indexOf (array, item, from) {
  function doesDefinePropertyWork (line 847) | function doesDefinePropertyWork(object) {
  function Lexer (line 2679) | function Lexer() {}
  function Rewriter (line 3391) | function Rewriter() {}
  function popStack (line 4260) | function popStack(n) {
  function lex (line 4265) | function lex() {
  function ctor (line 4358) | function ctor() { this.constructor = child; }
  function Base (line 4390) | function Base() {}
  function Block (line 4552) | function Block(nodes) {
  function Literal (line 4752) | function Literal(value) {
  function Return (line 4810) | function Return(expr) {
  function Value (line 4846) | function Value(base, props, tag) {
  function Comment (line 5000) | function Comment(comment) {
  function Call (line 5025) | function Call(variable, args, soak) {
  function Extends (line 5198) | function Extends(child, parent) {
  function Access (line 5219) | function Access(name, tag) {
  function Index (line 5249) | function Index(index) {
  function Range (line 5275) | function Range(from, to, tag) {
  function Slice (line 5360) | function Slice(range) {
  function Obj (line 5386) | function Obj(props, generated) {
  function Arr (line 5467) | function Arr(objs) {
  function Class (line 5517) | function Class(variable, parent, body) {
  function Assign (line 5693) | function Assign(variable, value, context, options) {
  function Code (line 5901) | function Code(params, body, tag) {
  function Param (line 6039) | function Param(name, value, splat) {
  function Splat (line 6121) | function Splat(name) {
  function While (line 6185) | function While(condition, options) {
  function Op (line 6260) | function Op(op, first, second, flip) {
  function In (line 6434) | function In(object, array) {
  function Try (line 6508) | function Try(attempt, error, recovery, ensure) {
  function Throw (line 6563) | function Throw(expression) {
  function Existence (line 6589) | function Existence(expression) {
  function Parens (line 6624) | function Parens(body) {
  function For (line 6664) | function For(body, source) {
  function Switch (line 6805) | function Switch(subject, cases, otherwise) {
  function If (line 6882) | function If(condition, body, options) {
  function Scope (line 7098) | function Scope(parent, expressions, method) {

FILE: servers/www/assets/js/vendor/ace/worker-css.js
  function initBaseUrls (line 91) | function initBaseUrls(topLevelNamespaces) {
  function initSender (line 95) | function initSender() {
  function getNativeFlags (line 249) | function getNativeFlags (regex) {
  function indexOf (line 257) | function indexOf (array, item, from) {
  function doesDefinePropertyWork (line 847) | function doesDefinePropertyWork(object) {
  function EventTarget (line 2671) | function EventTarget(){
  function StringReader (line 2752) | function StringReader(text){
  function SyntaxError (line 2983) | function SyntaxError(message, line, col){
  function SyntaxUnit (line 2998) | function SyntaxUnit(text, line, col, type){
  function TokenStreamBase (line 3058) | function TokenStreamBase(input, tokenData){
  function Combinator (line 3593) | function Combinator(text, line, col){
  function MediaFeature (line 3622) | function MediaFeature(name, value){
  function MediaQuery (line 3643) | function MediaQuery(modifier, mediaType, features, line, col){
  function Parser (line 3667) | function Parser(options){
  function PropertyName (line 6336) | function PropertyName(text, hack, line, col){
  function PropertyValue (line 6360) | function PropertyValue(parts, line, col){
  function PropertyValueIterator (line 6377) | function PropertyValueIterator(value){
  function PropertyValuePart (line 6434) | function PropertyValuePart(text, line, col){
  function Selector (line 6603) | function Selector(parts, line, col){
  function SelectorPart (line 6629) | function SelectorPart(elementName, modifiers, text, line, col){
  function SelectorSubPart (line 6651) | function SelectorSubPart(text, type, line, col){
  function Specificity (line 6671) | function Specificity(a, b, c, d){
  function updateValues (line 6727) | function updateValues(part){
  function isHexDigit (line 6785) | function isHexDigit(c){
  function isDigit (line 6789) | function isDigit(c){
  function isWhitespace (line 6793) | function isWhitespace(c){
  function isNewLine (line 6797) | function isNewLine(c){
  function isNameStart (line 6801) | function isNameStart(c){
  function isNameChar (line 6805) | function isNameChar(c){
  function isIdentStart (line 6809) | function isIdentStart(c){
  function mix (line 6813) | function mix(receiver, supplier){
  function TokenStream (line 6834) | function TokenStream(input){
  function ValidationError (line 8074) | function ValidationError(message, line, col){
  function Reporter (line 8588) | function Reporter(lines, ruleset){
  function startRule (line 8856) | function startRule(){
  function endRule (line 8860) | function endRule(){
  function reportProperty (line 9141) | function reportProperty(name, display, msg){
  function startRule (line 9149) | function startRule(){
  function endRule (line 9153) | function endRule(){
  function startRule (line 9268) | function startRule(event){
  function startRule (line 9365) | function startRule(event){
  function startRule (line 9995) | function startRule(event){
  function endRule (line 10009) | function endRule(event){
  function startRule (line 10249) | function startRule(event){
  function endRule (line 10254) | function endRule(event){
  function startRule (line 10308) | function startRule(event){
  function endRule (line 10313) | function endRule(event){
  function startRule (line 10561) | function startRule(){
  function endRule (line 10567) | function endRule(event){

FILE: servers/www/assets/js/vendor/ace/worker-javascript.js
  function initBaseUrls (line 91) | function initBaseUrls(topLevelNamespaces) {
  function initSender (line 95) | function initSender() {
  function getNativeFlags (line 249) | function getNativeFlags (regex) {
  function indexOf (line 257) | function indexOf (array, item, from) {
  function doesDefinePropertyWork (line 847) | function doesDefinePropertyWork(object) {
  function F (line 3423) | function F() {}     // Used by Object.create
  function is_own (line 3425) | function is_own(object, name) {
  function checkOption (line 3433) | function checkOption(name, t) {
  function combine (line 3525) | function combine(t, o) {
  function assume (line 3534) | function assume() {
  function quit (line 3591) | function quit(message, line, chr) {
  function isundef (line 3603) | function isundef(scope, m, t, a) {
  function warning (line 3607) | function warning(m, t, a, b, c, d) {
  function warningAt (line 3638) | function warningAt(m, l, ch, a, b, c, d) {
  function error (line 3645) | function error(m, t, a, b, c, d) {
  function errorAt (line 3649) | function errorAt(m, l, ch, a, b, c, d) {
  function nextLine (line 3665) | function nextLine() {
  function it (line 3705) | function it(type, value) {
  function match (line 3805) | function match(x) {
  function string (line 3818) | function string(x) {
  function addlabel (line 4348) | function addlabel(t, type) {
  function doOption (line 4379) | function doOption() {
  function peek (line 4497) | function peek(p) {
  function advance (line 4514) | function advance(id, t) {
  function expression (line 4584) | function expression(rbp, initial) {
  function adjacent (line 4633) | function adjacent(left, right) {
  function nobreak (line 4644) | function nobreak(left, right) {
  function nospace (line 4652) | function nospace(left, right) {
  function nonadjacent (line 4662) | function nonadjacent(left, right) {
  function nobreaknonadjacent (line 4674) | function nobreaknonadjacent(left, right) {
  function indentation (line 4690) | function indentation(bias) {
  function nolinebreak (line 4702) | function nolinebreak(t) {
  function comma (line 4710) | function comma() {
  function symbol (line 4731) | function symbol(s, p) {
  function delim (line 4744) | function delim(s) {
  function stmt (line 4749) | function stmt(s, f) {
  function blockstmt (line 4757) | function blockstmt(s, f) {
  function reserveName (line 4764) | function reserveName(x) {
  function prefix (line 4773) | function prefix(s, f) {
  function type (line 4793) | function type(s, f) {
  function reserve (line 4801) | function reserve(s, f) {
  function reservevar (line 4808) | function reservevar(s, v) {
  function infix (line 4818) | function infix(s, f, p, w) {
  function relation (line 4841) | function relation(s, f) {
  function isPoorRelation (line 4866) | function isPoorRelation(node) {
  function assignop (line 4877) | function assignop(s, f) {
  function bitwise (line 4916) | function bitwise(s, f, p) {
  function bitwiseassignop (line 4931) | function bitwiseassignop(s) {
  function suffix (line 4957) | function suffix(s, f) {
  function optionalidentifier (line 4975) | function optionalidentifier(fnparam) {
  function identifier (line 4993) | function identifier(fnparam) {
  function reachable (line 5007) | function reachable(s) {
  function statement (line 5034) | function statement(noindent) {
  function statements (line 5106) | function statements(startLine) {
  function directives (line 5129) | function directives() {
  function block (line 5191) | function block(ordinary, stmt, isfunc) {
  function countMember (line 5271) | function countMember(m) {
  function note_implied (line 5283) | function note_implied(token) {
  function property_name (line 5853) | function property_name() {
  function functionparams (line 5868) | function functionparams() {
  function doFunction (line 5891) | function doFunction(i, statement) {
  function saveProperty (line 5930) | function saveProperty(name, token) {
  function saveSetter (line 5940) | function saveSetter(name, token) {
  function saveGetter (line 5952) | function saveGetter(name) {
  function jsonValue (line 6630) | function jsonValue() {
  function detail (line 6970) | function detail(h, array) {
  function pushDestructuringVarDecls (line 7121) | function pushDestructuringVarDecls(n, s) {
  function Parser (line 7132) | function Parser(tokenizer) {
  function StaticContext (line 7141) | function StaticContext(parentScript, parentBlock, inModule, inFunction, ...
  function Pragma (line 7266) | function Pragma(n) {
  function Node (line 7280) | function Node(t, init) {
  function SyntheticNode (line 7305) | function SyntheticNode(init) {
  function unevalableConst (line 7324) | function unevalableConst(code) {
  function tokenString (line 7376) | function tokenString(tt) {
  function blockInit (line 7409) | function blockInit() {
  function scriptInit (line 7413) | function scriptInit() {
  function Export (line 7493) | function Export(node, isDefinition) {
  function registerExport (line 7502) | function registerExport(exports, decl) {
  function Module (line 7563) | function Module(node) {
  function isPragmaToken (line 7993) | function isPragmaToken(tt) {
  function parse (line 8997) | function parse(s, f, l) {
  function parseFunction (line 9009) | function parseFunction(s, requireName, form, f, l) {
  function parseStdin (line 9019) | function parseStdin(s, ln, prefix, isCommand) {
  function parseMultiline (line 9059) | function parseMultiline(ln, prefix) {
  function isValidIdentifierChar (line 9127) | function isValidIdentifierChar(ch, first) {
  function isIdentifier (line 9151) | function isIdentifier(str) {
  function Tokenizer (line 9172) | function Tokenizer(s, f, l, allowHTMLComments) {
  method done (line 9186) | get done() {
  method token (line 9192) | get token() {
  function defineGetter (line 9856) | function defineGetter(obj, prop, fn, dontDelete, dontEnum) {
  function defineGetterSetter (line 9861) | function defineGetterSetter(obj, prop, getter, setter, dontDelete, dontE...
  function defineMemoGetter (line 9870) | function defineMemoGetter(obj, prop, fn, dontDelete, dontEnum) {
  function defineProperty (line 9882) | function defineProperty(obj, prop, val, dontDelete, readOnly, dontEnum) {
  function isNativeCode (line 9889) | function isNativeCode(fn) {
  function apply (line 9896) | function apply(f, o, a) {
  function getPropertyDescriptor (line 9927) | function getPropertyDescriptor(obj, name) {
  function getPropertyNames (line 9935) | function getPropertyNames(obj) {
  function getOwnProperties (line 9946) | function getOwnProperties(obj) {
  function blacklistHandler (line 9953) | function blacklistHandler(target, blacklist) {
  function whitelistHandler (line 9959) | function whitelistHandler(target, whitelist) {
  function mixinHandler (line 9983) | function mixinHandler(redirect, catchall) {
  function makePassthruHandler (line 10049) | function makePassthruHandler(obj) {
  function hasOwn (line 10100) | function hasOwn(obj, name) {
  function Dict (line 10104) | function Dict(table, size) {
  function WeakMap (line 10183) | function WeakMap(array) {
  function searchMap (line 10187) | function searchMap(map, key, found, notFound) {
  function Stack (line 10225) | function Stack(elts) {

FILE: servers/www/assets/js/vendor/ace/worker-json.js
  function initBaseUrls (line 91) | function initBaseUrls(topLevelNamespaces) {
  function initSender (line 95) | function initSender() {
  function getNativeFlags (line 249) | function getNativeFlags (regex) {
  function indexOf (line 257) | function indexOf (array, item, from) {
  function doesDefinePropertyWork (line 847) | function doesDefinePropertyWork(object) {

FILE: servers/www/assets/js/vendor/ace/worker-xquery.js
  function initBaseUrls (line 91) | function initBaseUrls(topLevelNamespaces) {
  function initSender (line 95) | function initSender() {
  function getNativeFlags (line 249) | function getNativeFlags (regex) {
  function indexOf (line 257) | function indexOf (array, item, from) {
  function doesDefinePropertyWork (line 847) | function doesDefinePropertyWork(object) {

FILE: servers/www/assets/js/vendor/angular-cookies.js
  function push (line 61) | function push() {

FILE: servers/www/assets/js/vendor/angular-resource.js
  function encodeUriSegment (line 244) | function encodeUriSegment(val) {
  function encodeUriQuery (line 263) | function encodeUriQuery(val, pctEncodeSpaces) {
  function Route (line 272) | function Route(template, defaults) {
  function ResourceFactory (line 309) | function ResourceFactory(url, paramDefaults, actions, parser) {

FILE: servers/www/assets/js/vendor/angular-sanitize.js
  function makeMap (line 175) | function makeMap(str) {
  function htmlParser (line 194) | function htmlParser( html, handler ) {
  function decodeEntities (line 323) | function decodeEntities(value) {
  function encodeEntities (line 335) | function encodeEntities(value) {
  function htmlSanitizeWriter (line 355) | function htmlSanitizeWriter(buf){

FILE: servers/www/assets/js/vendor/angular.js
  function fromCharCode (line 55) | function fromCharCode(code) {return String.fromCharCode(code);}
  function forEach (line 100) | function forEach(obj, iterator, context) {
  function sortedKeys (line 125) | function sortedKeys(obj) {
  function forEachSorted (line 135) | function forEachSorted(obj, iterator, context) {
  function reverseParams (line 149) | function reverseParams(iteratorFn) {
  function nextUid (line 161) | function nextUid() {
  function extend (line 195) | function extend(dst) {
  function int (line 206) | function int(str) {
  function inherit (line 211) | function inherit(parent, extra) {
  function noop (line 231) | function noop() {}
  function identity (line 250) | function identity($) {return $;}
  function valueFn (line 254) | function valueFn(value) {return function() {return value;};}
  function isUndefined (line 267) | function isUndefined(value){return typeof value == 'undefined';}
  function isDefined (line 281) | function isDefined(value){return typeof value != 'undefined';}
  function isObject (line 296) | function isObject(value){return value != null && typeof value == 'object';}
  function isString (line 310) | function isString(value){return typeof value == 'string';}
  function isNumber (line 324) | function isNumber(value){return typeof value == 'number';}
  function isDate (line 338) | function isDate(value){
  function isArray (line 354) | function isArray(value) {
  function isFunction (line 370) | function isFunction(value){return typeof value == 'function';}
  function isWindow (line 380) | function isWindow(obj) {
  function isScope (line 385) | function isScope(obj) {
  function isFile (line 390) | function isFile(obj) {
  function isBoolean (line 395) | function isBoolean(value) {
  function trim (line 400) | function trim(value) {
  function isElement (line 415) | function isElement(node) {
  function makeMap (line 425) | function makeMap(str){
  function map (line 446) | function map(obj, iterator, context) {
  function size (line 467) | function size(obj, ownPropsOnly) {
  function includes (line 482) | function includes(array, obj) {
  function indexOf (line 486) | function indexOf(array, obj) {
  function arrayRemove (line 495) | function arrayRemove(array, value) {
  function isLeafNode (line 502) | function isLeafNode (node) {
  function copy (line 536) | function copy(source, destination){
  function shallowCopy (line 573) | function shallowCopy(src, dst) {
  function equals (line 610) | function equals(o1, o2) {
  function concat (line 646) | function concat(array1, array2, index) {
  function sliceArgs (line 650) | function sliceArgs(args, startIndex) {
  function bind (line 670) | function bind(self, fn) {
  function toJsonReplacer (line 691) | function toJsonReplacer(key, value) {
  function toJson (line 720) | function toJson(obj, pretty) {
  function fromJson (line 736) | function fromJson(json) {
  function toBoolean (line 743) | function toBoolean(value) {
  function startingTag (line 756) | function startingTag(element) {
  function parseKeyValue (line 775) | function parseKeyValue(/**string*/keyValue) {
  function toKeyValue (line 787) | function toKeyValue(obj) {
  function encodeUriSegment (line 807) | function encodeUriSegment(val) {
  function encodeUriQuery (line 826) | function encodeUriQuery(val, pctEncodeSpaces) {
  function angularInit (line 864) | function angularInit(element, bootstrap) {
  function bootstrap (line 920) | function bootstrap(element, modules) {
  function snake_case (line 940) | function snake_case(name, separator){
  function bindJQuery (line 947) | function bindJQuery() {
  function assertArg (line 971) | function assertArg(arg, name, reason) {
  function assertArgFn (line 978) | function assertArgFn(arg, name, acceptArrayAnnotation) {
  function setupModuleLoader (line 996) | function setupModuleLoader(window) {
  function publishExternalAPI (line 1258) | function publishExternalAPI(angular){
  function jqNextId (line 1451) | function jqNextId() { return ++jqId; }
  function camelCase (line 1462) | function camelCase(name) {
  function JQLitePatchJQueryRemove (line 1478) | function JQLitePatchJQueryRemove(name, dispatchThis) {
  function JQLite (line 1517) | function JQLite(element) {
  function JQLiteClone (line 1541) | function JQLiteClone(element) {
  function JQLiteDealoc (line 1545) | function JQLiteDealoc(element){
  function JQLiteUnbind (line 1552) | function JQLiteUnbind(element, type, fn) {
  function JQLiteRemoveData (line 1573) | function JQLiteRemoveData(element) {
  function JQLiteExpandoStore (line 1587) | function JQLiteExpandoStore(element, key, value) {
  function JQLiteData (line 1602) | function JQLiteData(element, key, value) {
  function JQLiteHasClass (line 1628) | function JQLiteHasClass(element, selector) {
  function JQLiteRemoveClass (line 1633) | function JQLiteRemoveClass(element, selector) {
  function JQLiteAddClass (line 1645) | function JQLiteAddClass(element, selector) {
  function JQLiteAddNodes (line 1655) | function JQLiteAddNodes(root, elements) {
  function JQLiteController (line 1666) | function JQLiteController(element, name) {
  function JQLiteInheritedData (line 1670) | function JQLiteInheritedData(element, name, value) {
  function trigger (line 1692) | function trigger() {
  function getBooleanAttrName (line 1732) | function getBooleanAttrName(element, name) {
  function createEventHandler (line 1898) | function createEventHandler(element, events) {
  function hashKey (line 2129) | function hashKey(obj) {
  function HashMap (line 2150) | function HashMap(array){
  function HashQueueMap (line 2186) | function HashQueueMap() {}
  function annotate (line 2258) | function annotate(fn) {
  function createInjector (line 2611) | function createInjector(modulesToLoad) {
  function $AnchorScrollProvider (line 2833) | function $AnchorScrollProvider() {
  function Browser (line 2906) | function Browser(window, document, $log, $sniffer) {
  function $BrowserProvider (line 3238) | function $BrowserProvider(){
  function $CacheFactoryProvider (line 3267) | function $CacheFactoryProvider() {
  function $TemplateCacheProvider (line 3407) | function $TemplateCacheProvider() {
  function $CompileProvider (line 3577) | function $CompileProvider($provide) {
  function directiveNormalize (line 4492) | function directiveNormalize(name) {
  function nodesetLinkingFn (line 4539) | function nodesetLinkingFn(
  function directiveLinkingFn (line 4546) | function directiveLinkingFn(
  function $ControllerProvider (line 4564) | function $ControllerProvider() {
  function $DocumentProvider (line 4634) | function $DocumentProvider(){
  function $ExceptionHandlerProvider (line 4657) | function $ExceptionHandlerProvider() {
  function $InterpolateProvider (line 4674) | function $InterpolateProvider() {
  function encodePath (line 4820) | function encodePath(path) {
  function stripHash (line 4831) | function stripHash(url) {
  function matchUrl (line 4836) | function matchUrl(url, obj) {
  function composeProtocolHostPort (line 4858) | function composeProtocolHostPort(protocol, host, port) {
  function pathPrefixFromBase (line 4863) | function pathPrefixFromBase(basePath) {
  function convertToHtml5Url (line 4868) | function convertToHtml5Url(url, basePath, hashPrefix) {
  function convertToHashbangUrl (line 4883) | function convertToHashbangUrl(url, basePath, hashPrefix) {
  function LocationUrl (line 4914) | function LocationUrl(url, pathPrefix, appBaseUrl) {
  function LocationHashbangUrl (line 4969) | function LocationHashbangUrl(url, hashPrefix, appBaseUrl) {
  function LocationHashbangInHtml5Url (line 5207) | function LocationHashbangInHtml5Url(url, hashPrefix, appBaseUrl, baseExt...
  function locationGetter (line 5220) | function locationGetter(property) {
  function locationGetterSetter (line 5227) | function locationGetterSetter(property, preprocess) {
  function $LocationProvider (line 5275) | function $LocationProvider(){
  function $LogProvider (line 5459) | function $LogProvider(){
  function lex (line 5566) | function lex(text, csp){
  function parser (line 5800) | function parser(text, json, $filter, csp){
  function setter (line 6180) | function setter(obj, path, setValue) {
  function getter (line 6203) | function getter(obj, path, bindFnToScope) {
  function cspSafeGetterFn (line 6229) | function cspSafeGetterFn(key0, key1, key2, key3, key4) {
  function getterFn (line 6293) | function getterFn(path, csp) {
  function $ParseProvider (line 6379) | function $ParseProvider() {
  function $QProvider (line 6521) | function $QProvider() {
  function qFactory (line 6539) | function qFactory(nextTick, exceptionHandler) {
  function $RouteProvider (line 6796) | function $RouteProvider(){
  function $RouteParamsProvider (line 7260) | function $RouteParamsProvider() {
  function $RootScopeProvider (line 7322) | function $RootScopeProvider(){
  function $SnifferProvider (line 8065) | function $SnifferProvider() {
  function $WindowProvider (line 8121) | function $WindowProvider(){
  function parseHeaders (line 8131) | function parseHeaders(headers) {
  function headersGetter (line 8166) | function headersGetter(headers) {
  function transformData (line 8191) | function transformData(data, headers, fns) {
  function isSuccess (line 8203) | function isSuccess(status) {
  function $HttpProvider (line 8208) | function $HttpProvider() {
  function $HttpBackendProvider (line 8913) | function $HttpBackendProvider() {
  function createHttpBackend (line 8920) | function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawD...
  function $LocaleProvider (line 9025) | function $LocaleProvider(){
  function $TimeoutProvider (line 9086) | function $TimeoutProvider() {
  function $FilterProvider (line 9246) | function $FilterProvider($provide) {
  function filterFilter (line 9353) | function filterFilter() {
  function currencyFilter (line 9478) | function currencyFilter($locale) {
  function numberFilter (line 9535) | function numberFilter($locale) {
  function formatNumber (line 9544) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
  function padNumber (line 9604) | function padNumber(num, digits, trim) {
  function dateGetter (line 9618) | function dateGetter(name, size, offset, trim) {
  function dateStrGetter (line 9628) | function dateStrGetter(name, shortForm) {
  function timeZoneGetter (line 9637) | function timeZoneGetter(date) {
  function ampmGetter (line 9642) | function ampmGetter(date, formats) {
  function dateFilter (line 9753) | function dateFilter($locale) {
  function jsonFilter (line 9848) | function jsonFilter() {
  function limitToFilter (line 9929) | function limitToFilter(){
  function orderByFilter (line 10049) | function orderByFilter($parse){
  function ngDirective (line 10098) | function ngDirective(directive) {
  function FormController (line 10482) | function FormController(element, attrs) {
  function isEmpty (line 11074) | function isEmpty(value) {
  function textInputType (line 11079) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function numberInputType (line 11192) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function urlInputType (line 11254) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function emailInputType (line 11271) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function radioInputType (line 11288) | function radioInputType(scope, element, attr, ctrl) {
  function checkboxInputType (line 11310) | function checkboxInputType(scope, element, attr, ctrl) {
  function toggleValidCss (line 11611) | function toggleValidCss(isValid, validationErrorKey) {
  function classDirective (line 12101) | function classDirective(name, selector) {
  function destroyLastScope (line 13665) | function destroyLastScope() {
  function clearContent (line 13672) | function clearContent() {
  function update (line 13677) | function update() {
  function Single (line 13988) | function Single(scope, selectElement, ngModelCtrl, selectCtrl) {
  function Multiple (line 14013) | function Multiple(scope, selectElement, ctrl) {
  function Options (line 14044) | function Options(scope, selectElement, ctrl) {

FILE: servers/www/assets/js/vendor/beautify.js
  function style_html (line 39) | function style_html(html_source, options) {

FILE: servers/www/assets/js/vendor/handlebars.js
  function popStack (line 207) | function popStack(n) {
  function lex (line 212) | function lex() {
  function compile (line 1471) | function compile() {

FILE: servers/www/assets/js/vendor/jquery.js
  function jQuerySub (line 897) | function jQuerySub( selector, context ) {
  function doScrollCheck (line 963) | function doScrollCheck() {
  function createFlags (line 990) | function createFlags( flags ) {
  function resolveFunc (line 1325) | function resolveFunc( i ) {
  function progressFunc (line 1333) | function progressFunc( i ) {
  function dataAttr (line 1985) | function dataAttr( elem, key, data ) {
  function isEmptyDataObject (line 2016) | function isEmptyDataObject( obj ) {
  function handleQueueMarkDefer (line 2034) | function handleQueueMarkDefer( elem, type, src ) {
  function resolve (line 2193) | function resolve() {
  function returnFalse (line 3546) | function returnFalse() {
  function returnTrue (line 3549) | function returnTrue() {
  function dirNodeCheck (line 5260) | function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  function dirCheck (line 5293) | function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  function isDisconnected (line 5566) | function isDisconnected( node ) {
  function winnow (line 5683) | function winnow( elements, qualifier, keep ) {
  function createSafeFragment (line 5720) | function createSafeFragment( document ) {
  function root (line 6092) | function root( elem, cur ) {
  function cloneCopyEvent (line 6099) | function cloneCopyEvent( src, dest ) {
  function cloneFixAttributes (line 6127) | function cloneFixAttributes( src, dest ) {
  function getAll (line 6272) | function getAll( elem ) {
  function fixDefaultChecked (line 6285) | function fixDefaultChecked( elem ) {
  function findInputs (line 6291) | function findInputs( elem ) {
  function shimCloneNode (line 6302) | function shimCloneNode( elem ) {
  function getWidthOrHeight (line 6793) | function getWidthOrHeight( elem, name, extra ) {
  function addToPrefiltersOrTransports (line 7034) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 7070) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 7112) | function ajaxExtend( target, src ) {
  function done (line 7454) | function done( status, nativeStatusText, responses, headers ) {
  function buildParams (line 7769) | function buildParams( prefix, obj, traditional, add ) {
  function ajaxHandleResponses (line 7819) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 7884) | function ajaxConvert( s, response ) {
  function createStandardXHR (line 8149) | function createStandardXHR() {
  function createActiveXHR (line 8155) | function createActiveXHR() {
  function doAnimation (line 8494) | function doAnimation() {
  function stopQueue (line 8650) | function stopQueue( elem, data, index ) {
  function createFxNow (line 8692) | function createFxNow() {
  function clearFxNow (line 8697) | function clearFxNow() {
  function genFx (line 8702) | function genFx( type, num ) {
  function t (line 8817) | function t( gotoEnd ) {
  function defaultDisplay (line 9015) | function defaultDisplay( nodeName ) {
  function getWindow (line 9299) | function getWindow( elem ) {

FILE: servers/www/assets/js/vendor/jquery.layout.js
  function isStr (line 36) | function isStr (v) { return $.type(v) === "string"; }
  function runPluginCallbacks (line 38) | function runPluginCallbacks (Instance, a_fn) {
  function createLog (line 601) | function createLog () {
  function getBranch (line 893) | function getBranch (path, create) {
  function createFxOptions (line 1835) | function createFxOptions ( pane ) {
  function close_2 (line 2996) | function close_2 () {
  function open_2 (line 3175) | function open_2 () {
  function open_NOW (line 3296) | function open_NOW () {
  function close_NOW (line 3329) | function close_NOW () {
  function cancelMouseOut (line 3465) | function cancelMouseOut (evt) {
  function sizePane_2 (line 3663) | function sizePane_2 () {
  function _below (line 4016) | function _below ($E) {
  function _measure (line 4020) | function _measure () {
  function copy (line 4354) | function copy (n) { // n = pane
  function move (line 4368) | function move (oPane, pane) {
  function keyDown (line 4460) | function keyDown (evt) {
  function allowOverflow (line 4518) | function allowOverflow (el) {
  function resetOverflow (line 4587) | function resetOverflow (el) {
  function parse (line 4999) | function parse (h) {
  function calc (line 5442) | function calc (x,y) { return (parseInt(x,10) / parseInt(y,10) * 100).toF...

FILE: servers/www/assets/js/vendor/jquery.lazyload.js
  function update (line 33) | function update() {

FILE: servers/www/assets/js/vendor/jquery.timeago.js
  function substitute (line 69) | function substitute(stringOrFunction, number) {
  function refresh (line 117) | function refresh() {
  function prepareData (line 125) | function prepareData(element) {
  function inWords (line 137) | function inWords(date) {
  function distance (line 141) | function distance(date) {

FILE: servers/www/assets/js/vendor/jquery.ui.custom.js
  function reduce (line 144) | function reduce( elem, size, border, margin ) {
  function focusable (line 179) | function focusable( element, isTabIndexNotNaN ) {
  function visible (line 200) | function visible( element ) {

FILE: servers/www/assets/js/vendor/noty/jquery.noty.js
  function F (line 14) | function F() {
  function noty (line 416) | function noty(options) {

FILE: servers/www/assets/js/vendor/noty/promise.js
  function createFlags (line 27) | function createFlags( flags ) {
  function resolve (line 167) | function resolve() {
  function handleQueueMarkDefer (line 186) | function handleQueueMarkDefer( elem, type, src ) {
  function resolve (line 414) | function resolve() {

FILE: servers/www/assets/js/vendor/page.js
  function page (line 30) | function page(path, fn) {
  function next (line 138) | function next() {
  function unhandled (line 156) | function unhandled(ctx) {
  function Context (line 172) | function Context(path, state) {
  function Route (line 206) | function Route(path, options) {
  function pathtoRegexp (line 285) | function pathtoRegexp(path, keys, sensitive, strict) {
  function onpopstate (line 312) | function onpopstate(e) {
  function onclick (line 325) | function onclick(e) {
  function sameOrigin (line 344) | function sameOrigin(href) {

FILE: servers/www/assets/js/vendor/postmessage.js
  function sendReply (line 241) | function sendReply ( data ) {
  function sendReply (line 388) | function sendReply ( data ) {
  function f (line 438) | function f(n){return n<10?"0"+n:n}
  function quote (line 438) | function quote(string){escapable.lastIndex=0;return escapable.test(strin...
  function str (line 438) | function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[...
  function walk (line 438) | function walk(holder,key){var k,v,value=holder[key];if(value&&typeof val...

FILE: servers/www/assets/js/vendor/prettify.js
  function L (line 2) | function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var...
  function M (line 6) | function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.classN...
  function B (line 7) | function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}
  function x (line 7) | function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(...
  function u (line 9) | function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''...
  function D (line 12) | function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.clas...
  function k (line 15) | function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(...
  function C (line 15) | function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-m...
  function E (line 15) | function E(a){var m=
  function m (line 25) | function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Inf...

FILE: servers/www/assets/js/vendor/semver.js
  function stringify (line 58) | function stringify (version) {
  function clean (line 63) | function clean (version) {
  function valid (line 69) | function valid (version) {
  function validPackage (line 74) | function validPackage (version) {
  function toComparators (line 91) | function toComparators (range) {
  function replaceStars (line 116) | function replaceStars (stars) {
  function replaceXRanges (line 122) | function replaceXRanges (ranges) {
  function replaceXRange (line 128) | function replaceXRange (version) {
  function replaceSpermies (line 163) | function replaceSpermies (version) {
  function validRange (line 186) | function validRange (range) {
  function maxSatisfying (line 195) | function maxSatisfying (versions, range) {
  function satisfies (line 201) | function satisfies (version, range) {
  function compare (line 226) | function compare (v1, v2) {
  function rcompare (line 231) | function rcompare (v1, v2) {
  function lt (line 235) | function lt (v1, v2) { return gt(v2, v1) }
  function gte (line 236) | function gte (v1, v2) { return !lt(v1, v2) }
  function lte (line 237) | function lte (v1, v2) { return !gt(v1, v2) }
  function eq (line 238) | function eq (v1, v2) { return gt(v1, v2) === null }
  function neq (line 239) | function neq (v1, v2) { return gt(v1, v2) !== null }
  function cmp (line 240) | function cmp (v1, c, v2) {
  function num (line 255) | function num (v) {
  function gt (line 258) | function gt (v1, v2) {
  function inc (line 281) | function inc (version, release) {

FILE: servers/www/assets/js/vendor/showdown.js
  function headerId (line 698) | function headerId(m) {
  function char2hex (line 1212) | function char2hex(ch) {

FILE: servers/www/assets/js/vendor/underscore.js
  function eq (line 682) | function eq(a, b, stack) {
Condensed preview — 360 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,703K chars).
[
  {
    "path": ".gitignore",
    "chars": 142,
    "preview": "lib-cov\n*.seed\n*.log\n*.csv\n*.dat\n*.out\n*.pid\n*.gz\n\npids\nlogs\nresults\ntests\n\nconfig.json\n\nnode_modules\nnpm-debug.log\n\n.c9"
  },
  {
    "path": ".gitmodules",
    "chars": 122,
    "preview": "[submodule \"servers/www/assets/select2\"]\n\tpath = servers/www/assets/select2\n\turl = git://github.com/ivaynberg/select2.gi"
  },
  {
    "path": "LICENSE",
    "chars": 1071,
    "preview": "Copyright (C) 2015 Filearts\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis sof"
  },
  {
    "path": "README.md",
    "chars": 3718,
    "preview": "# Plunker\n\n[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/filearts/plunker?utm_source=badge&utm"
  },
  {
    "path": "config.sample.json",
    "chars": 476,
    "preview": "{\r\n  \"host\": \"localhost\", // (Required) The hostname at which Plunk will be run\r\n  \"nosubdomains\": true, // Run Plunker "
  },
  {
    "path": "package.json",
    "chars": 771,
    "preview": "{\n  \"name\": \"plunker\",\n  \"subdomain\": \"plunker\",\n  \"scripts\": {\n    \"start\": \"server.js\"\n  },\n  \"engines\": {\n    \"node\":"
  },
  {
    "path": "server.js",
    "chars": 1478,
    "preview": "// Everything starts better with coffee\nvar coffee = require(\"coffee-script\");\nvar express = require(\"express\");\n\n\nvar n"
  },
  {
    "path": "servers/api/.gitignore",
    "chars": 148,
    "preview": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r"
  },
  {
    "path": "servers/api/.npmignore",
    "chars": 148,
    "preview": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r"
  },
  {
    "path": "servers/api/errors.coffee",
    "chars": 707,
    "preview": "class APIError extends Error\n  toJSON: -> {@code, @message}\n\nmodule.exports =\n  ParseError: class extends APIError\n    c"
  },
  {
    "path": "servers/api/index.coffee",
    "chars": 19953,
    "preview": "nconf = require(\"nconf\")\r\nrequest = require(\"request\")\r\nmime = require(\"mime\")\r\nexpress = require(\"express\")\r\nurl = requ"
  },
  {
    "path": "servers/api/lib/database.coffee",
    "chars": 4300,
    "preview": "mongoose = require(\"mongoose\")\nnconf = require(\"nconf\")\nmime = require(\"mime\")\nurl = require(\"url\")\nmime = require(\"mime"
  },
  {
    "path": "servers/api/middleware/cache.coffee",
    "chars": 162,
    "preview": "module.exports.middleware = (config = {}) ->\r\n  (req, res, next) ->\r\n    res.header(\"Cache-Control\", \"no-cache\")\r\n    re"
  },
  {
    "path": "servers/api/middleware/cors.coffee",
    "chars": 1044,
    "preview": "nconf = require(\"nconf\")\n\nmodule.exports.middleware = (config = {}) ->\n  \n  valid = [nconf.get('url:www'), nconf.get('ur"
  },
  {
    "path": "servers/api/middleware/json.coffee",
    "chars": 480,
    "preview": "apiErrors = require(\"../errors\")\r\n\r\n\r\nmodule.exports.middleware = (config = {}) ->\r\n  (req, res, next) ->\r\n    if \"GET\" "
  },
  {
    "path": "servers/api/middleware/session.coffee",
    "chars": 738,
    "preview": "nconf = require(\"nconf\")\r\n\r\nmodule.exports.middleware = (config = {}) ->\r\n  (req, res, next) ->\r\n    if req.query.sessid"
  },
  {
    "path": "servers/api/middleware/user.coffee",
    "chars": 355,
    "preview": "module.exports.middleware = (config = {}) ->\r\n  (req, res, next) ->\r\n    unless req.session and req.session.user then ne"
  },
  {
    "path": "servers/api/package.json",
    "chars": 644,
    "preview": "{\n  \"name\": \"plunker-api\",\n  \"subdomain\": \"plunker-api\",\n  \"domains\": [\n    \"api.plnkr.co\"\n  ],\n  \"scripts\": {\n    \"star"
  },
  {
    "path": "servers/api/schema/packages/create.json",
    "chars": 1440,
    "preview": "{\r\n  \"type\": \"object\",\r\n  \"additionalProperties\": false,\r\n  \"properties\": {\r\n    \"name\": {\r\n      \"type\": \"string\",\r\n   "
  },
  {
    "path": "servers/api/schema/packages/update.json",
    "chars": 498,
    "preview": "{\r\n  \"type\": \"object\",\r\n  \"additionalProperties\": false,\r\n  \"properties\": {\r\n    \"name\": {\r\n      \"type\": \"string\"\r\n    "
  },
  {
    "path": "servers/api/schema/plunks/create.json",
    "chars": 1404,
    "preview": "{\r\n  \"type\": \"object\",\r\n  \"additionalProperties\": false,\r\n  \"properties\": {\r\n    \"description\": {\r\n      \"type\": \"string"
  },
  {
    "path": "servers/api/schema/plunks/update.json",
    "chars": 977,
    "preview": "{\r\n  \"type\": \"object\",\r\n  \"additionalProperties\": false,\r\n  \"minProperties\": 1,\r\n  \"properties\": {\r\n    \"description\": {"
  },
  {
    "path": "servers/api/server.js",
    "chars": 1217,
    "preview": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\n"
  },
  {
    "path": "servers/embed/.gitignore",
    "chars": 148,
    "preview": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-affix.js",
    "chars": 3205,
    "preview": "/* ==========================================================\n * bootstrap-affix.js v2.1.0\n * http://twitter.github.com/"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-alert.js",
    "chars": 2392,
    "preview": "/* ==========================================================\n * bootstrap-alert.js v2.1.0\n * http://twitter.github.com/"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-all.js",
    "chars": 94,
    "preview": "//= require bootstrap-transition\r\n//= require bootstrap-button\r\n//= require bootstrap-dropdown"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-button.js",
    "chars": 2713,
    "preview": "/* ============================================================\n * bootstrap-button.js v2.1.0\n * http://twitter.github.c"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-carousel.js",
    "chars": 5270,
    "preview": "/* ==========================================================\n * bootstrap-carousel.js v2.1.0\n * http://twitter.github.c"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-collapse.js",
    "chars": 4500,
    "preview": "/* =============================================================\n * bootstrap-collapse.js v2.1.0\n * http://twitter.githu"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-dropdown.js",
    "chars": 3948,
    "preview": "/* ============================================================\n * bootstrap-dropdown.js v2.1.0\n * http://twitter.github"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-modal.js",
    "chars": 6490,
    "preview": "/* =========================================================\n * bootstrap-modal.js v2.1.0\n * http://twitter.github.com/b"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-popover.js",
    "chars": 2993,
    "preview": "/* ===========================================================\n * bootstrap-popover.js v2.1.0\n * http://twitter.github.c"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-scrollspy.js",
    "chars": 4401,
    "preview": "/* =============================================================\n * bootstrap-scrollspy.js v2.1.0\n * http://twitter.gith"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-tab.js",
    "chars": 3382,
    "preview": "/* ========================================================\n * bootstrap-tab.js v2.1.0\n * http://twitter.github.com/boot"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-tooltip.js",
    "chars": 7696,
    "preview": "/* ===========================================================\n * bootstrap-tooltip.js v2.1.0\n * http://twitter.github.c"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-transition.js",
    "chars": 1762,
    "preview": "/* ===================================================\n * bootstrap-transition.js v2.1.0\n * http://twitter.github.com/bo"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-typeahead.js",
    "chars": 7464,
    "preview": "/* =============================================================\n * bootstrap-typeahead.js v2.1.0\n * http://twitter.gith"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/accordion.less",
    "chars": 622,
    "preview": "//\n// Accordion\n// --------------------------------------------------\n\n\n// Parent container\n.accordion {\n  margin-bottom"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/alerts.less",
    "chars": 1116,
    "preview": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/bootstrap.less",
    "chars": 1472,
    "preview": "/*!\n * Bootstrap v2.1.0\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/breadcrumbs.less",
    "chars": 403,
    "preview": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin: 0"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/button-groups.less",
    "chars": 6099,
    "preview": "//\n// Button groups\n// --------------------------------------------------\n\n\n// Make the div behave like a button\n.btn-gr"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/buttons.less",
    "chars": 4718,
    "preview": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/carousel.less",
    "chars": 1960,
    "preview": "//\n// Carousel\n// --------------------------------------------------\n\n\n.carousel {\n  position: relative;\n  margin-bottom"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/close.less",
    "chars": 633,
    "preview": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: 20px;\n  "
  },
  {
    "path": "servers/embed/assets/bootstrap/less/code.less",
    "chars": 1196,
    "preview": "//\n// Code (inline and blocK)\n// --------------------------------------------------\n\n\n// Inline and block code styles\nco"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/component-animations.less",
    "chars": 330,
    "preview": "//\n// Component animations\n// --------------------------------------------------\n\n\n.fade {\n  opacity: 0;\n  .transition(o"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/dropdowns.less",
    "chars": 4862,
    "preview": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Use the .menu class on any <li> element "
  },
  {
    "path": "servers/embed/assets/bootstrap/less/font-awesome.less",
    "chars": 17228,
    "preview": "/*  Font Awesome\n    the iconic font designed for use with Twitter Bootstrap\n    ---------------------------------------"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/forms.less",
    "chars": 14394,
    "preview": "//\n// Forms\n// --------------------------------------------------\n\n\n// GENERAL STYLES\n// --------------\n\n// Make all for"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/grid.less",
    "chars": 429,
    "preview": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Fixed (940px)\n#grid > .core(@gridColumnWidt"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/hero-unit.less",
    "chars": 449,
    "preview": "//\n// Hero unit\n// --------------------------------------------------\n\n\n.hero-unit {\n  padding: 60px;\n  margin-bottom: 3"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/labels-badges.less",
    "chars": 1717,
    "preview": "//\n// Labels and badges\n// --------------------------------------------------\n\n\n// Base classes\n.label,\n.badge {\n  font-"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/layouts.less",
    "chars": 329,
    "preview": "//\n// Layouts\n// --------------------------------------------------\n\n\n// Container (centered, fixed-width layouts)\n.cont"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/mixins.less",
    "chars": 21424,
    "preview": "//\n// Mixins\n// --------------------------------------------------\n\n\n// UTILITY MIXINS\n// ------------------------------"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/modals.less",
    "chars": 2130,
    "preview": "//\n// Modals\n// --------------------------------------------------\n\n\n// Recalculate z-index where appropriate\n.modal-ope"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/navbar.less",
    "chars": 11250,
    "preview": "//\n// Navbars (Redux)\n// --------------------------------------------------\n\n\n// COMMON STYLES\n// -------------\n\n// Base"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/navs.less",
    "chars": 7343,
    "preview": "//\n// Navs\n// --------------------------------------------------\n\n\n// BASE CLASS\n// ----------\n\n.nav {\n  margin-left: 0;"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/pager.less",
    "chars": 604,
    "preview": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  margin: @baseLineHeight 0;\n  l"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/pagination.less",
    "chars": 1297,
    "preview": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n\n\n.pagination {\n  height: @baseL"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/popovers.less",
    "chars": 3015,
    "preview": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/progress-bars.less",
    "chars": 2844,
    "preview": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// ANIMATIONS\n// ----------\n\n// Webkit\n@-web"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/reset.less",
    "chars": 2596,
    "preview": "//\n// Modals\n// Adapted from http://github.com/necolas/normalize.css\n// ------------------------------------------------"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/responsive-1200px-min.less",
    "chars": 565,
    "preview": "//\n// Responsive: Large desktop and up\n// --------------------------------------------------\n\n\n@media (min-width: 1200px"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/responsive-767px-max.less",
    "chars": 3328,
    "preview": "//\n// Responsive: Landscape phone to desktop/tablet\n// --------------------------------------------------\n\n\n@media (max-"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/responsive-768px-979px.less",
    "chars": 463,
    "preview": "//\n// Responsive: Tablet to desktop\n// --------------------------------------------------\n\n\n@media (min-width: 768px) an"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/responsive-navbar.less",
    "chars": 3599,
    "preview": "//\n// Responsive: Navbar\n// --------------------------------------------------\n\n\n// TABLETS AND BELOW\n// ---------------"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/responsive-utilities.less",
    "chars": 1187,
    "preview": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// Hide from screenreaders and"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/responsive.less",
    "chars": 1069,
    "preview": "/*!\n * Bootstrap Responsive v2.1.0\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http:/"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/scaffolding.less",
    "chars": 842,
    "preview": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Body reset\n// -------------------------\n\nbo"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/sprites.less",
    "chars": 10315,
    "preview": "//\n// Sprites\n// --------------------------------------------------\n\n\n// ICONS\n// -----\n\n// All icons receive the styles"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/tables.less",
    "chars": 5760,
    "preview": "//\n// Tables\n// --------------------------------------------------\n\n\n// BASE TABLES\n// -----------------\n\ntable {\n  max-"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/thumbnails.less",
    "chars": 1153,
    "preview": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Note: `.thumbnails` and `.thumbnails > li` a"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/tooltip.less",
    "chars": 1606,
    "preview": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  "
  },
  {
    "path": "servers/embed/assets/bootstrap/less/type.less",
    "chars": 3437,
    "preview": "//\n// Typography\n// --------------------------------------------------\n\n\n// Body text\n// -------------------------\n\np {\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/utilities.less",
    "chars": 335,
    "preview": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Quick floats\n.pull-right {\n  float: rig"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/variables.less",
    "chars": 8378,
    "preview": "//\n// Variables\n// --------------------------------------------------\n\n\n// Global values\n// ----------------------------"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/wells.less",
    "chars": 508,
    "preview": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding:"
  },
  {
    "path": "servers/embed/assets/css/components/navbar.less",
    "chars": 451,
    "preview": ".navbar {\r\n  .navbar-inner {\r\n    padding: 0 8px;\r\n    min-height: 30px;\r\n  }\r\n  \r\n  .brand {\r\n    background: rgba(0,0,"
  },
  {
    "path": "servers/embed/assets/css/pages/embed.less",
    "chars": 1266,
    "preview": "@import \"../../bootstrap/less/bootstrap\";\r\n\r\n@import \"../components/navbar\";\r\n\r\n@import \"../vendor/prettify\";\r\n\r\n#embed "
  },
  {
    "path": "servers/embed/assets/css/vendor/prettify.less",
    "chars": 844,
    "preview": ".com { color: #93a1a1; }\r\n.lit { color: #195f91; }\r\n.pun, .opn, .clo { color: #93a1a1; }\r\n.fun { color: #dc322f; }\r\n.str"
  },
  {
    "path": "servers/embed/assets/js/pages/embed.coffee",
    "chars": 3158,
    "preview": "#= require ../vendor/showdown\r\n#= require ../vendor/prettify\r\n#= require ../vendor/overthrow\r\n\r\n#= require ../services/i"
  },
  {
    "path": "servers/embed/assets/js/services/importer.coffee",
    "chars": 2135,
    "preview": "#= require ../services/plunks\r\n\r\nplunkerRegex = ///\r\n  ^\r\n    \\s*                   # Leading whitespace\r\n    (?:plunk:)"
  },
  {
    "path": "servers/embed/assets/js/services/plunks.coffee",
    "chars": 6815,
    "preview": "#= require ../vendor/jquery.cookie\n\n#= require ../services/url\n\nmodule = angular.module(\"plunker.plunks\", [\"plunker.url\""
  },
  {
    "path": "servers/embed/assets/js/services/url.coffee",
    "chars": 165,
    "preview": "\nmodule = angular.module(\"plunker.url\", [])\n\nmodule.service \"url\", [ ->\n  if _plunker and _plunker.url then _plunker.url"
  },
  {
    "path": "servers/embed/assets/js/vendor/angular-sanitize.js",
    "chars": 17880,
    "preview": "/**\r\n * @license AngularJS v1.0.1\r\n * (c) 2010-2012 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(w"
  },
  {
    "path": "servers/embed/assets/js/vendor/angular-ui.js",
    "chars": 2951,
    "preview": "/**\r\n * AngularUI for AngularJS\r\n * v0.1.0\r\n * \r\n * @link http://angular-ui.github.com/\r\n */\r\n\r\nangular.module('ui.confi"
  },
  {
    "path": "servers/embed/assets/js/vendor/angular.js",
    "chars": 487581,
    "preview": "/**\r\n * @license AngularJS v1.0.1\r\n * (c) 2010-2012 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(w"
  },
  {
    "path": "servers/embed/assets/js/vendor/jquery.cookie.js",
    "chars": 1986,
    "preview": "/*!\r\n * jQuery Cookie Plugin\r\n * https://github.com/carhartl/jquery-cookie\r\n *\r\n * Copyright 2011, Klaus Hartl\r\n * Dual "
  },
  {
    "path": "servers/embed/assets/js/vendor/jquery.js",
    "chars": 262284,
    "preview": "/*!\r\n * jQuery JavaScript Library v1.7.2\r\n * http://jquery.com/\r\n *\r\n * Copyright 2011, John Resig\r\n * Dual licensed und"
  },
  {
    "path": "servers/embed/assets/js/vendor/overthrow.js",
    "chars": 13743,
    "preview": "/*! Overthrow v.0.1.0. An overflow:auto polyfill for responsive design. (c) 2012: Scott Jehl, Filament Group, Inc. http:"
  },
  {
    "path": "servers/embed/assets/js/vendor/prettify.js",
    "chars": 13658,
    "preview": "var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;\r\n(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==9"
  },
  {
    "path": "servers/embed/assets/js/vendor/showdown.js",
    "chars": 36503,
    "preview": "//\r\n// showdown.js -- A javascript port of Markdown.\r\n//\r\n// Copyright (c) 2007 John Fraser.\r\n//\r\n// Original Markdown C"
  },
  {
    "path": "servers/embed/index.coffee",
    "chars": 1225,
    "preview": "coffee = require(\"coffee-script\")\r\nless = require(\"less\")\r\njade = require(\"jade\")\r\nexpress = require(\"express\")\r\ngzippo "
  },
  {
    "path": "servers/embed/middleware/expose.coffee",
    "chars": 132,
    "preview": "module.exports.middleware = (options = {}) ->\n  (req, res, next) ->\n    res.locals[key] = value for key, value of option"
  },
  {
    "path": "servers/embed/package.json",
    "chars": 452,
    "preview": "{\n  \"name\": \"plunker-embed\",\n  \"subdomain\": \"plunker-embed\",\n  \"domains\": [\n    \"embed.plnkr.co\"\n  ],\n  \"scripts\": {\n   "
  },
  {
    "path": "servers/embed/server.js",
    "chars": 1331,
    "preview": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\n"
  },
  {
    "path": "servers/embed/views/embed.jade",
    "chars": 3560,
    "preview": "!!! 5\r\nhtml(ng-app=\"plunker.embed\")\r\n  head\r\n    meta(charset=\"utf-8\")\r\n    meta(name=\"viewport\",content=\"width=device-w"
  },
  {
    "path": "servers/raw/.gitignore",
    "chars": 148,
    "preview": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r"
  },
  {
    "path": "servers/raw/index.coffee",
    "chars": 1450,
    "preview": "express = require(\"express\")\r\nrequest = require(\"request\")\r\nnconf = require(\"nconf\")\r\nurl = require(\"url\")\r\n\r\nmodule.exp"
  },
  {
    "path": "servers/raw/package.json",
    "chars": 371,
    "preview": "{\n  \"name\": \"plunker-raw\",\n  \"subdomain\": \"plunker-raw\",\n  \"domains\": [\n    \"raw.plnkr.co\"\n  ],\n  \"scripts\": {\n    \"star"
  },
  {
    "path": "servers/raw/server.js",
    "chars": 1326,
    "preview": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\n"
  },
  {
    "path": "servers/raw/views/directory.jade",
    "chars": 1135,
    "preview": "!!! 5\r\nhtml\r\n  head\r\n    title #{plunk.description}\r\n    link(href=\"http://twitter.github.com/bootstrap/assets/css/boots"
  },
  {
    "path": "servers/run/.gitignore",
    "chars": 148,
    "preview": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r"
  },
  {
    "path": "servers/run/index.coffee",
    "chars": 5847,
    "preview": "express = require(\"express\")\r\nnconf = require(\"nconf\")\r\n_ = require(\"underscore\")._\r\nvalidator = require(\"json-schema\")\r"
  },
  {
    "path": "servers/run/middleware/cors.coffee",
    "chars": 898,
    "preview": "module.exports.middleware = (config = {}) ->\n  (req, res, next) ->\n    # Just send the headers all the time. That way we"
  },
  {
    "path": "servers/run/middleware/json.coffee",
    "chars": 419,
    "preview": "module.exports.middleware = (config = {}) ->\r\n  (req, res, next) ->\r\n    if \"GET\" == req.method or \"HEAD\" == req.method "
  },
  {
    "path": "servers/run/package.json",
    "chars": 726,
    "preview": "{\n  \"name\": \"plunker-run\",\n  \"subdomain\": \"plunker-run\",\n  \"domains\": [\n    \"run.plnkr.co\"\n  ],\n  \"scripts\": {\n    \"star"
  },
  {
    "path": "servers/run/schema/previews/create.json",
    "chars": 510,
    "preview": "{\r\n  \"type\": \"object\",\r\n  \"additionalProperties\": false,\r\n  \"properties\": {\r\n    \"files\": {\r\n      \"required\": true,\r\n  "
  },
  {
    "path": "servers/run/server.js",
    "chars": 1326,
    "preview": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\n"
  },
  {
    "path": "servers/run/views/directory.jade",
    "chars": 1037,
    "preview": "!!! 5\r\nhtml\r\n  head\r\n    title Plunker - Preview\r\n    link(href=\"http://twitter.github.com/bootstrap/assets/css/bootstra"
  },
  {
    "path": "servers/www/.gitignore",
    "chars": 148,
    "preview": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-affix.js",
    "chars": 3205,
    "preview": "/* ==========================================================\n * bootstrap-affix.js v2.1.0\n * http://twitter.github.com/"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-alert.js",
    "chars": 2392,
    "preview": "/* ==========================================================\n * bootstrap-alert.js v2.1.0\n * http://twitter.github.com/"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-all.js",
    "chars": 374,
    "preview": "//= require bootstrap-transition\r\n//= require bootstrap-alert\r\n//= require bootstrap-button\r\n//= require bootstrap-carou"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-button.js",
    "chars": 2713,
    "preview": "/* ============================================================\n * bootstrap-button.js v2.1.0\n * http://twitter.github.c"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-carousel.js",
    "chars": 5270,
    "preview": "/* ==========================================================\n * bootstrap-carousel.js v2.1.0\n * http://twitter.github.c"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-collapse.js",
    "chars": 4500,
    "preview": "/* =============================================================\n * bootstrap-collapse.js v2.1.0\n * http://twitter.githu"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-dropdown.js",
    "chars": 3948,
    "preview": "/* ============================================================\n * bootstrap-dropdown.js v2.1.0\n * http://twitter.github"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-modal.js",
    "chars": 6490,
    "preview": "/* =========================================================\n * bootstrap-modal.js v2.1.0\n * http://twitter.github.com/b"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-popover.js",
    "chars": 2993,
    "preview": "/* ===========================================================\n * bootstrap-popover.js v2.1.0\n * http://twitter.github.c"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-scrollspy.js",
    "chars": 4401,
    "preview": "/* =============================================================\n * bootstrap-scrollspy.js v2.1.0\n * http://twitter.gith"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-tab.js",
    "chars": 3382,
    "preview": "/* ========================================================\n * bootstrap-tab.js v2.1.0\n * http://twitter.github.com/boot"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-tooltip.js",
    "chars": 7696,
    "preview": "/* ===========================================================\n * bootstrap-tooltip.js v2.1.0\n * http://twitter.github.c"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-transition.js",
    "chars": 1762,
    "preview": "/* ===================================================\n * bootstrap-transition.js v2.1.0\n * http://twitter.github.com/bo"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-typeahead.js",
    "chars": 7464,
    "preview": "/* =============================================================\n * bootstrap-typeahead.js v2.1.0\n * http://twitter.gith"
  },
  {
    "path": "servers/www/assets/bootstrap/less/accordion.less",
    "chars": 622,
    "preview": "//\n// Accordion\n// --------------------------------------------------\n\n\n// Parent container\n.accordion {\n  margin-bottom"
  },
  {
    "path": "servers/www/assets/bootstrap/less/alerts.less",
    "chars": 1116,
    "preview": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert"
  },
  {
    "path": "servers/www/assets/bootstrap/less/bootstrap.less",
    "chars": 1472,
    "preview": "/*!\n * Bootstrap v2.1.1\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache"
  },
  {
    "path": "servers/www/assets/bootstrap/less/breadcrumbs.less",
    "chars": 403,
    "preview": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin: 0"
  },
  {
    "path": "servers/www/assets/bootstrap/less/button-groups.less",
    "chars": 6170,
    "preview": "//\n// Button groups\n// --------------------------------------------------\n\n\n// Make the div behave like a button\n.btn-gr"
  },
  {
    "path": "servers/www/assets/bootstrap/less/buttons.less",
    "chars": 5019,
    "preview": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------"
  },
  {
    "path": "servers/www/assets/bootstrap/less/carousel.less",
    "chars": 1960,
    "preview": "//\n// Carousel\n// --------------------------------------------------\n\n\n.carousel {\n  position: relative;\n  margin-bottom"
  },
  {
    "path": "servers/www/assets/bootstrap/less/close.less",
    "chars": 633,
    "preview": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: 20px;\n  "
  },
  {
    "path": "servers/www/assets/bootstrap/less/code.less",
    "chars": 1196,
    "preview": "//\n// Code (inline and blocK)\n// --------------------------------------------------\n\n\n// Inline and block code styles\nco"
  },
  {
    "path": "servers/www/assets/bootstrap/less/component-animations.less",
    "chars": 306,
    "preview": "//\n// Component animations\n// --------------------------------------------------\n\n\n.fade {\n  opacity: 0;\n  .transition(o"
  },
  {
    "path": "servers/www/assets/bootstrap/less/dropdowns.less",
    "chars": 4859,
    "preview": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Use the .menu class on any <li> element "
  },
  {
    "path": "servers/www/assets/bootstrap/less/font-awesome.less",
    "chars": 17228,
    "preview": "/*  Font Awesome\n    the iconic font designed for use with Twitter Bootstrap\n    ---------------------------------------"
  },
  {
    "path": "servers/www/assets/bootstrap/less/forms.less",
    "chars": 14835,
    "preview": "//\n// Forms\n// --------------------------------------------------\n\n\n// GENERAL STYLES\n// --------------\n\n// Make all for"
  },
  {
    "path": "servers/www/assets/bootstrap/less/grid.less",
    "chars": 429,
    "preview": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Fixed (940px)\n#grid > .core(@gridColumnWidt"
  },
  {
    "path": "servers/www/assets/bootstrap/less/hero-unit.less",
    "chars": 449,
    "preview": "//\n// Hero unit\n// --------------------------------------------------\n\n\n.hero-unit {\n  padding: 60px;\n  margin-bottom: 3"
  },
  {
    "path": "servers/www/assets/bootstrap/less/labels-badges.less",
    "chars": 1717,
    "preview": "//\n// Labels and badges\n// --------------------------------------------------\n\n\n// Base classes\n.label,\n.badge {\n  font-"
  },
  {
    "path": "servers/www/assets/bootstrap/less/layouts.less",
    "chars": 329,
    "preview": "//\n// Layouts\n// --------------------------------------------------\n\n\n// Container (centered, fixed-width layouts)\n.cont"
  },
  {
    "path": "servers/www/assets/bootstrap/less/mixins.less",
    "chars": 21706,
    "preview": "//\n// Mixins\n// --------------------------------------------------\n\n\n// UTILITY MIXINS\n// ------------------------------"
  },
  {
    "path": "servers/www/assets/bootstrap/less/modals.less",
    "chars": 2181,
    "preview": "//\n// Modals\n// --------------------------------------------------\n\n\n// Recalculate z-index where appropriate,\n// but on"
  },
  {
    "path": "servers/www/assets/bootstrap/less/navbar.less",
    "chars": 11412,
    "preview": "//\n// Navbars (Redux)\n// --------------------------------------------------\n\n\n// COMMON STYLES\n// -------------\n\n// Base"
  },
  {
    "path": "servers/www/assets/bootstrap/less/navs.less",
    "chars": 7343,
    "preview": "//\n// Navs\n// --------------------------------------------------\n\n\n// BASE CLASS\n// ----------\n\n.nav {\n  margin-left: 0;"
  },
  {
    "path": "servers/www/assets/bootstrap/less/pager.less",
    "chars": 659,
    "preview": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  margin: @baseLineHeight 0;\n  l"
  },
  {
    "path": "servers/www/assets/bootstrap/less/pagination.less",
    "chars": 1405,
    "preview": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n\n\n.pagination {\n  height: @baseL"
  },
  {
    "path": "servers/www/assets/bootstrap/less/popovers.less",
    "chars": 3015,
    "preview": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left"
  },
  {
    "path": "servers/www/assets/bootstrap/less/progress-bars.less",
    "chars": 2841,
    "preview": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// ANIMATIONS\n// ----------\n\n// Webkit\n@-web"
  },
  {
    "path": "servers/www/assets/bootstrap/less/reset.less",
    "chars": 2799,
    "preview": "//\n// Modals\n// Adapted from http://github.com/necolas/normalize.css\n// ------------------------------------------------"
  },
  {
    "path": "servers/www/assets/bootstrap/less/responsive-1200px-min.less",
    "chars": 565,
    "preview": "//\n// Responsive: Large desktop and up\n// --------------------------------------------------\n\n\n@media (min-width: 1200px"
  },
  {
    "path": "servers/www/assets/bootstrap/less/responsive-767px-max.less",
    "chars": 3442,
    "preview": "//\n// Responsive: Landscape phone to desktop/tablet\n// --------------------------------------------------\n\n\n@media (max-"
  },
  {
    "path": "servers/www/assets/bootstrap/less/responsive-768px-979px.less",
    "chars": 463,
    "preview": "//\n// Responsive: Tablet to desktop\n// --------------------------------------------------\n\n\n@media (min-width: 768px) an"
  },
  {
    "path": "servers/www/assets/bootstrap/less/responsive-navbar.less",
    "chars": 3898,
    "preview": "//\n// Responsive: Navbar\n// --------------------------------------------------\n\n\n// TABLETS AND BELOW\n// ---------------"
  },
  {
    "path": "servers/www/assets/bootstrap/less/responsive-utilities.less",
    "chars": 1187,
    "preview": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// Hide from screenreaders and"
  },
  {
    "path": "servers/www/assets/bootstrap/less/responsive.less",
    "chars": 1069,
    "preview": "/*!\n * Bootstrap Responsive v2.1.1\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http:/"
  },
  {
    "path": "servers/www/assets/bootstrap/less/scaffolding.less",
    "chars": 876,
    "preview": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Body reset\n// -------------------------\n\nbo"
  },
  {
    "path": "servers/www/assets/bootstrap/less/sprites.less",
    "chars": 10616,
    "preview": "//\n// Sprites\n// --------------------------------------------------\n\n\n// ICONS\n// -----\n\n// All icons receive the styles"
  },
  {
    "path": "servers/www/assets/bootstrap/less/tables.less",
    "chars": 6187,
    "preview": "//\n// Tables\n// --------------------------------------------------\n\n\n// BASE TABLES\n// -----------------\n\ntable {\n  max-"
  },
  {
    "path": "servers/www/assets/bootstrap/less/thumbnails.less",
    "chars": 1153,
    "preview": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Note: `.thumbnails` and `.thumbnails > li` a"
  },
  {
    "path": "servers/www/assets/bootstrap/less/tooltip.less",
    "chars": 1606,
    "preview": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  "
  },
  {
    "path": "servers/www/assets/bootstrap/less/type.less",
    "chars": 3744,
    "preview": "//\n// Typography\n// --------------------------------------------------\n\n\n// Body text\n// -------------------------\n\np {\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/utilities.less",
    "chars": 335,
    "preview": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Quick floats\n.pull-right {\n  float: rig"
  },
  {
    "path": "servers/www/assets/bootstrap/less/variables.less",
    "chars": 8473,
    "preview": "//\n// Variables\n// --------------------------------------------------\n\n\n// Global values\n// ----------------------------"
  },
  {
    "path": "servers/www/assets/bootstrap/less/wells.less",
    "chars": 508,
    "preview": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding:"
  },
  {
    "path": "servers/www/assets/css/common/style.less",
    "chars": 55,
    "preview": ".help-block {\n  font-style: italic;\n  font-size: 80%;\n}"
  },
  {
    "path": "servers/www/assets/css/components/discussion.less",
    "chars": 898,
    "preview": ".plunker-discussion {\r\n  .thumbnails {\r\n    margin-bottom: 4px;\r\n    margin-left: -10px;\r\n  }\r\n  \r\n  form {\r\n    margin-"
  },
  {
    "path": "servers/www/assets/css/components/gallery.less",
    "chars": 2363,
    "preview": "@import \"./tags\";\r\n\r\n.card.span3 {\r\n  width: 270px;\r\n}\r\n\r\n.page-header {\r\n  margin: 18px 0 10px;\r\n  border-bottom: 1px s"
  },
  {
    "path": "servers/www/assets/css/components/importer.less",
    "chars": 581,
    "preview": "#importer {\r\n  position: relative;\r\n\r\n  .import-form {\r\n    padding-top: 46px;\r\n    padding-left: 5px;\r\n    margin-botto"
  },
  {
    "path": "servers/www/assets/css/components/multipanel.less",
    "chars": 1249,
    "preview": "#multipanel {\n  .panel {\n    width: 100%;\n    height: 100%;\n    position: relative;\n  }\n}\n\n#multipane-buttons {\n  backgr"
  },
  {
    "path": "servers/www/assets/css/components/navbar.less",
    "chars": 755,
    "preview": ".navbar {\r\n  .navbar-inner {\r\n    padding: 0 8px;\r\n  }\r\n  \r\n  .brand {\r\n    background: rgba(0,0,0,0.0) url('../../img/p"
  },
  {
    "path": "servers/www/assets/css/components/previewer.less",
    "chars": 1085,
    "preview": ".plnk-previewer {\n  width: 100%; height: 100%;\n  overflow: hidden;\n}\n.plnk-runner {\n  border: 0; margin: 0; padding: 0;\n"
  },
  {
    "path": "servers/www/assets/css/components/share.less",
    "chars": 121,
    "preview": "div.share-panel {\n  padding: 8px;\n  \n  #share-embed {\n    //width: 100%;\n  }\n  .share-button {\n    margin-top: 6px;\n  }\n"
  },
  {
    "path": "servers/www/assets/css/components/sidebar.less",
    "chars": 1969,
    "preview": ".plnk-sidebar {\n  position: absolute;\n  top: 0; bottom: 0; left: 0; right: 0;\n  background-color: #f5f5f5;\n  \n  details "
  },
  {
    "path": "servers/www/assets/css/components/statusbar.less",
    "chars": 629,
    "preview": "#editor-file-list {\n  .file {\n    position: relative;\n    \n    .file-ops {\n      display: none;\n    }\n  }\n  \n  .file:hov"
  },
  {
    "path": "servers/www/assets/css/components/streamer.less",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "servers/www/assets/css/components/tags.less",
    "chars": 1353,
    "preview": "ul.tags {\r\n  margin: 0 11px; padding: 0; border: 0;\r\n  list-style: none;\r\n  display: block;\r\n  overflow: hidden;\r\n  widt"
  },
  {
    "path": "servers/www/assets/css/components/toolbar.less",
    "chars": 411,
    "preview": "#toolbar {\n  margin: 0; padding: 0;\n  \n  > .btn-group {\n    padding-bottom: 0;\n  }\n  \n  .dropdown-menu > li {\n    positi"
  },
  {
    "path": "servers/www/assets/css/components/userpanel.less",
    "chars": 281,
    "preview": "#userpanel {\r\n  margin-left: 18px;\r\n  \r\n  .user-menu {\r\n    position: relative;\r\n    padding-left: 30px;\r\n    \r\n    .gra"
  },
  {
    "path": "servers/www/assets/css/pages/editor.less",
    "chars": 2007,
    "preview": "@import url(http://fonts.googleapis.com/css?family=Exo:900);\r\n\r\n@import \"../../bootstrap/less/bootstrap\";\r\n@import \"../."
  },
  {
    "path": "servers/www/assets/css/pages/landing.less",
    "chars": 1089,
    "preview": "@import url(http://fonts.googleapis.com/css?family=Exo:900);\n\n@import \"../common/style\";\n\n@import \"../../bootstrap/less/"
  },
  {
    "path": "servers/www/assets/css/pages/preview.less",
    "chars": 871,
    "preview": "@import url(http://fonts.googleapis.com/css?family=Exo:900);\r\n\r\n@import \"../../bootstrap/less/bootstrap\";\r\n@import \"../."
  },
  {
    "path": "servers/www/assets/css/vendor/jquery-layout.less",
    "chars": 5135,
    "preview": "/*\r\n * Default Layout Theme\r\n *\r\n * Created for jquery.layout \r\n *\r\n * Copyright (c) 2010 \r\n *   Fabrizio Balliano (http"
  },
  {
    "path": "servers/www/assets/css/vendor/prettify.less",
    "chars": 844,
    "preview": ".com { color: #93a1a1; }\r\n.lit { color: #195f91; }\r\n.pun, .opn, .clo { color: #93a1a1; }\r\n.fun { color: #dc322f; }\r\n.str"
  },
  {
    "path": "servers/www/assets/js/directives/ace.coffee",
    "chars": 2984,
    "preview": "#= require ../services/modes\r\n\r\nEditSession = require(\"ace/edit_session\").EditSession\r\nUndoManager = require(\"ace/undoma"
  },
  {
    "path": "servers/www/assets/js/directives/builder.coffee",
    "chars": 5823,
    "preview": "#= require ../../select2/select2\r\n\r\n#= require ../vendor/underscore\r\n#= require ../vendor/semver\r\n#= require ../vendor/b"
  },
  {
    "path": "servers/www/assets/js/directives/card.coffee",
    "chars": 5372,
    "preview": "#= require ../vendor/jquery.timeago\r\n#= require ../vendor/jquery.lazyload\r\n\r\n#= require ../services/plunks\r\n\r\nmodule = a"
  },
  {
    "path": "servers/www/assets/js/directives/chat.coffee",
    "chars": 1673,
    "preview": "#= require ../services/session\r\n\r\nmodule = angular.module(\"plunker.chat\", [])\r\n\r\nmodule.directive \"plunkerChat\", [\"$time"
  },
  {
    "path": "servers/www/assets/js/directives/discussion.coffee",
    "chars": 5830,
    "preview": "#= require ../vendor/angular-ui\r\n#= require ../vendor/showdown\r\n#= require ../vendor/prettify\r\n#= require ../vendor/jque"
  },
  {
    "path": "servers/www/assets/js/directives/layout.coffee",
    "chars": 3246,
    "preview": "#= require ../vendor/jquery.ui.custom\n#= require ../vendor/jquery.layout\n\n#= require_tree ../services/panes\n#= require ."
  },
  {
    "path": "servers/www/assets/js/directives/multipanel.coffee",
    "chars": 1082,
    "preview": "#= require ../services/panels\n#= require_tree ../services/panes\n\nmodule = angular.module(\"plunker.multipanel\", [\"plunker"
  },
  {
    "path": "servers/www/assets/js/directives/share.coffee",
    "chars": 1806,
    "preview": "#= require ../services/url\r\n\r\n#= require ../socialbuttons\r\n\r\n\r\nmodule = angular.module(\"plunker.share\", [])\r\n\r\nmodule.di"
  },
  {
    "path": "servers/www/assets/js/directives/statusbar.coffee",
    "chars": 1606,
    "preview": "#= require ../services/scratch\r\n\r\nmodule = angular.module(\"plunker.statusbar\", [])\r\n\r\nmodule.directive \"plunkerStatusbar"
  },
  {
    "path": "servers/www/assets/js/directives/toolbar.coffee",
    "chars": 5727,
    "preview": "#= require ../services/scratch\r\n#= require ../services/downloader\r\n\r\n#= require ../directives/share\r\n\r\n\r\nmodule = angula"
  },
  {
    "path": "servers/www/assets/js/directives/userpanel.coffee",
    "chars": 2157,
    "preview": "#= require ../services/session\n\nmodule = angular.module(\"plunker.userpanel\", [\"plunker.session\"])\n\nmodule.directive \"pln"
  },
  {
    "path": "servers/www/assets/js/pages/editor.coffee",
    "chars": 2393,
    "preview": "#= require ../../bootstrap/js/bootstrap-all\r\n\r\n#= require ../../select2/select2\r\n\r\n#= require ../vendor/angular-ui\r\n#= r"
  },
  {
    "path": "servers/www/assets/js/pages/landing.coffee",
    "chars": 7909,
    "preview": "#= require ../../bootstrap/js/bootstrap-all\r\n\r\n#= require ../services/plunks\r\n#= require ../services/url\r\n#= require ../"
  }
]

// ... and 160 more files (download for full content)

About this extraction

This page contains the full source code of the filearts/plunker GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 360 files (8.7 MB), approximately 2.3M tokens, and a symbol index with 822 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!