diff --git a/README.md b/README.md
index 64c26b1..77e1be8 100644
--- a/README.md
+++ b/README.md
@@ -25,21 +25,22 @@ Once installed, the following components need to be registered by adding:
* `\Dot\DebugBar\ConfigProvider::class,` to `config/config.php` (preferably at the beginning of the section where the `DotKernel packages` are loaded)
* `\Dot\DebugBar\Extension\DebugBarExtension::class` to `config/autoload/templates.global.php` (inside the array founder under the key `twig` => `extensions`)
-Locate the library's assets directory `vendor/maximebf/debugbar/src/DebugBar/Resources` and copy its contents to your application under `public/debugbar` directory.
+Locate the library's assets directory, called `assets` and copy **its contents** to your application under `public/debugbar` directory.
-Locate the library's config file `vendor/dotkernel/dot-debugbar/config/debugbar.local.php` and make a copy of it inside your application as:
-* `config/autoload/debugbar.local.php`
+Locate the library's config file `config/debugbar.local.php.dist` and clone it inside your application as:
* `config/autoload/debugbar.local.php.dist`
+* `config/autoload/debugbar.local.php`
-By default, the debug bar is enabled only on the local environment, by whitelisting `127.0.0.1` in the config file, inside the array located under the `ipWhitelist` key.
-If you need to enable it on other environments as well, just whitelist your public IP address.
+By default, dot-debugbar is enabled only on the local environment, by whitelisting `127.0.0.1` in the config file, inside the array located under the `ipv4Whitelist` key.
+If you need to enable it on other environments as well, just whitelist your public IPV4 address.
It can also be enabled globally, by whitelisting the string `*`.
+Finally, if you want to keep the whitelists but disable dot-debugbar, you can set `enabled` to **false**.
Inside the config file, you will find additional configurations under the `javascript_renderer` key.
For more configuration values, follow the link in the related comment block.
-At this step, the debug bar is not displayed yet. In order to display it, you need to call the following Twig functions from your base layout:
+At this step, dot-debugbar is not displayed yet. In order to display it, you need to call the following Twig functions from your base layout:
* `{{ debugBarCss()|raw }}` (needs to be placed in the head section of the layout, where the CSS files are included)
* `{{ debugBarJs()|raw }}` (needs to be placed in the footer of the layout, where the JS files are included)
@@ -47,14 +48,14 @@ If you plan to enable dot-debugbar on production, make sure you clear the releva
* the config cache file: `data/cache/config-cache.php`
* Twig cache directory: `data/cache/twig`
-Additionally, you can check if the debug bar is enabled for your session by calling `debugBarEnabled()` inside a template.
-This feature can be useful if you need to add custom logic for when the debug bar is enabled.
+Additionally, you can check if dot-debugbar is enabled for your session by calling `debugBarEnabled()` inside a template.
+This feature can be useful if you need to add custom logic for when dot-debugbar is enabled.
## Usage
-Other than the data being automatically collected during a session, the debug bar can also be used to log messages, measure durations, debug database queries and more...
+Other than the data being automatically collected during a session, dot-debugbar can also be used to log messages, measure durations, debug database queries and more...
-When you need an instance of the debug bar, locate an instance of it in your application's container using:
+When you need an instance of DebugBar, locate an instance of it in your application's container using:
```php
$debugBar = $container->get(\Dot\DebugBar\DebugBar::class);
```
@@ -73,6 +74,8 @@ Results will show up in the debug bar under the `Messages` tab.
Log messages (can be of any type):
```php
+$this->debugBar->addMessage(1);
+$this->debugBar->addMessage(true);
$this->debugBar->addMessage('foo');
$this->debugBar->addMessage(['foo']);
$this->debugBar->addMessage(new \stdClass());
@@ -87,16 +90,24 @@ $this->debugBar->addMessage('some warning', 'warning');
$this->debugBar->addMessage('custom message', 'custom');
```
-Also, clicking on a label will toggle the visibility of all messages with that specific label.
+Also, clicking on a label (found on the bottom right of the debugbar) will toggle the visibility of all messages with that specific label.
### Measure durations
Results will show up in the debug bar under the `Timeline` tab.
In order to measure how long does it take for a piece of code to execute, do the following:
+```php
+$this->debugBar->measure('long operation', function () {
+ // your code here
+});
+```
+
+OR
+
```php
$this->debugBar->startTimer('long operation', 'measuring long operation');
-// do stuff that needs to be measured
+// your code here
$this->debugBar->stopTimer('long operation');
```
@@ -112,3 +123,8 @@ $this->debugBar->stackData();
The method needs to be called after all database operations have finished AND before emitting the redirect response.
In this case, next to the `Memory usage` widget you'll see a dropdown that allows you to select between the previous page load (with the redirect) and the current one.
+
+### Debug Exceptions
+Results will show up in the debug bar under the `Exceptions` tab.
+
+By registering `Dot\DebugBar\Middleware\DebugBarMiddleware`, dot-debugbar is ready to capture Exceptions.
diff --git a/assets/debugbar.css b/assets/debugbar.css
new file mode 100644
index 0000000..502d248
--- /dev/null
+++ b/assets/debugbar.css
@@ -0,0 +1,314 @@
+/* Hide debugbar when printing a page */
+@media print {
+ div.phpdebugbar {
+ display: none;
+ }
+}
+
+div.phpdebugbar {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ border-top: 0;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif;
+ background: #fff;
+ z-index: 10000;
+ font-size: 14px;
+ color: #000;
+ text-align: left;
+ line-height: 1;
+ letter-spacing: normal;
+ direction: ltr;
+}
+
+div.phpdebugbar a,
+div.phpdebugbar-openhandler {
+ cursor: pointer;
+}
+
+div.phpdebugbar-drag-capture {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ z-index: 10001;
+ background: none;
+ display: none;
+ cursor: ns-resize;
+}
+
+div.phpdebugbar-closed {
+ width: auto;
+}
+
+div.phpdebugbar * {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-weight: normal;
+ text-decoration: none;
+ clear: initial;
+ width: auto;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+div.phpdebugbar ol, div.phpdebugbar ul {
+ list-style: none;
+}
+
+div.phpdebugbar table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+div.phpdebugbar input[type='text'], div.phpdebugbar input[type='password'] {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif;
+ background: #fff;
+ font-size: 14px;
+ color: #000;
+ border: 0;
+ padding: 0;
+ margin: 0;
+}
+
+div.phpdebugbar code, div.phpdebugbar pre, div.phpdebugbar samp {
+ background: none;
+ font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+ font-size: 1em;
+ border: 0;
+ padding: 0;
+ margin: 0;
+}
+
+div.phpdebugbar code, div.phpdebugbar pre {
+ color: #000;
+}
+
+div.phpdebugbar pre.sf-dump {
+ color: #a0a000;
+ outline: 0;
+}
+
+a.phpdebugbar-restore-btn {
+ float: left;
+ padding: 5px 8px;
+ font-size: 14px;
+ color: #555;
+ text-decoration: none;
+ border-right: 1px solid #ddd;
+}
+
+div.phpdebugbar-resize-handle {
+ display: none;
+ height: 4px;
+ margin-top: -4px;
+ width: 100%;
+ background: none;
+ border-bottom: 1px solid #ccc;
+ cursor: ns-resize;
+}
+
+div.phpdebugbar-closed, div.phpdebugbar-minimized{
+ border-top: 1px solid #ccc;
+}
+/* -------------------------------------- */
+
+div.phpdebugbar-header, a.phpdebugbar-restore-btn {
+ background: #efefef url(data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2020%2020%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Ccircle%20fill%3D%22%23000%22%20cx%3D%2210%22%20cy%3D%2210%22%20r%3D%229%22%2F%3E%3Cpath%20d%3D%22M6.039%208.342c.463%200%20.772.084.927.251.154.168.191.455.11.862-.084.424-.247.727-.487.908-.241.182-.608.272-1.1.272h-.743l.456-2.293h.837zm-2.975%204.615h1.22l.29-1.457H5.62c.461%200%20.84-.047%201.139-.142.298-.095.569-.254.812-.477.205-.184.37-.387.497-.608.127-.222.217-.466.27-.734.13-.65.032-1.155-.292-1.518-.324-.362-.84-.543-1.545-.543H4.153l-1.089%205.479zM9.235%206.02h1.21l-.289%201.458h1.079c.679%200%201.147.115%201.405.347.258.231.335.607.232%201.125l-.507%202.55h-1.23l.481-2.424c.055-.276.035-.464-.06-.565-.095-.1-.298-.15-.608-.15H9.98L9.356%2011.5h-1.21l1.089-5.48M15.566%208.342c.464%200%20.773.084.928.251.154.168.19.455.11.862-.084.424-.247.727-.488.908-.24.182-.607.272-1.1.272h-.742l.456-2.293h.836zm-2.974%204.615h1.22l.29-1.457h1.046c.461%200%20.84-.047%201.139-.142.298-.095.569-.254.812-.477.205-.184.37-.387.497-.608.127-.222.217-.466.27-.734.129-.65.032-1.155-.292-1.518-.324-.362-.84-.543-1.545-.543H13.68l-1.089%205.479z%22%20fill%3D%22%23FFF%22%2F%3E%3C%2Fsvg%3E) no-repeat 5px 4px / 20px 20px;
+}
+div.phpdebugbar-header {
+ padding-left: 29px;
+ min-height: 26px;
+ line-height: 16px;
+}
+div.phpdebugbar-header:before, div.phpdebugbar-header:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+div.phpdebugbar-header:after {
+ clear: both;
+}
+div.phpdebugbar-header-left {
+ float: left;
+}
+div.phpdebugbar-header-right {
+ float: right;
+}
+div.phpdebugbar-header > div > * {
+ padding: 5px 5px;
+ font-size: 14px;
+ color: #555;
+ text-decoration: none;
+}
+div.phpdebugbar-header-left > * {
+ float: left;
+}
+div.phpdebugbar-header-right > * {
+ float: right;
+}
+div.phpdebugbar-header-right > select {
+ padding: 0;
+}
+
+/* -------------------------------------- */
+
+span.phpdebugbar-indicator,
+a.phpdebugbar-indicator,
+a.phpdebugbar-close-btn {
+ border-right: 1px solid #ddd;
+}
+
+a.phpdebugbar-tab.phpdebugbar-active {
+ background: #ccc;
+ color: #444;
+ background-image: linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
+ background-image: -o-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
+ background-image: -moz-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
+ background-image: -webkit-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
+ background-image: -ms-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.41, rgb(173,173,173)), color-stop(0.71, rgb(209,209,209)));
+}
+ a.phpdebugbar-tab span.phpdebugbar-badge {
+ display: none;
+ margin-left: 5px;
+ font-size: 11px;
+ line-height: 14px;
+ padding: 0 6px;
+ background: #ccc;
+ border-radius: 4px;
+ color: #555;
+ font-weight: normal;
+ text-shadow: none;
+ vertical-align: middle;
+ }
+ a.phpdebugbar-tab i {
+ display: none;
+ vertical-align: middle;
+ }
+ a.phpdebugbar-tab span.phpdebugbar-badge.phpdebugbar-visible {
+ display: inline;
+ }
+ a.phpdebugbar-tab span.phpdebugbar-badge.phpdebugbar-important {
+ background: #ed6868;
+ color: white;
+ }
+
+a.phpdebugbar-close-btn, a.phpdebugbar-open-btn, a.phpdebugbar-restore-btn, a.phpdebugbar-minimize-btn , a.phpdebugbar-maximize-btn {
+ width: 16px;
+ height: 16px;
+}
+
+a.phpdebugbar-minimize-btn , a.phpdebugbar-maximize-btn {
+ padding-right: 0 !important;
+}
+
+a.phpdebugbar-maximize-btn { display: none}
+
+a.phpdebugbar-minimize-btn { display: block}
+
+div.phpdebugbar-minimized a.phpdebugbar-maximize-btn { display: block}
+
+div.phpdebugbar-minimized a.phpdebugbar-minimize-btn { display: none}
+
+a.phpdebugbar-minimize-btn {
+ background:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201792%201792%22%20id%3D%22chevron-down%22%3E%3Cpath%20d%3D%22M1683%20808l-742%20741q-19%2019-45%2019t-45-19l-742-741q-19-19-19-45.5t19-45.5l166-165q19-19%2045-19t45%2019l531%20531%20531-531q19-19%2045-19t45%2019l166%20165q19%2019%2019%2045.5t-19%2045.5z%22%2F%3E%3C%2Fsvg%3E) no-repeat 6px 6px / 14px 14px;
+}
+
+a.phpdebugbar-maximize-btn {
+ background:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201792%201792%22%20id%3D%22chevron-up%22%3E%3Cpath%20d%3D%22M1683%201331l-166%20165q-19%2019-45%2019t-45-19l-531-531-531%20531q-19%2019-45%2019t-45-19l-166-165q-19-19-19-45.5t19-45.5l742-741q19-19%2045-19t45%2019l742%20741q19%2019%2019%2045.5t-19%2045.5z%22%2F%3E%3C%2Fsvg%3E) no-repeat 6px 6px / 14px 14px;
+}
+
+a.phpdebugbar-close-btn {
+ background: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201792%201792%22%20id%3D%22close%22%3E%3Cpath%20d%3D%22M1490%201322q0%2040-28%2068l-136%20136q-28%2028-68%2028t-68-28l-294-294-294%20294q-28%2028-68%2028t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28%2068-28t68%2028l294%20294%20294-294q28-28%2068-28t68%2028l136%20136q28%2028%2028%2068t-28%2068l-294%20294%20294%20294q28%2028%2028%2068z%22%2F%3E%3C%2Fsvg%3E) no-repeat 9px 6px / 14px 14px;
+}
+
+a.phpdebugbar-open-btn {
+ background: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201792%201792%22%20id%3D%22folder-open%22%3E%3Cpath%20d%3D%22M1815%20952q0%2031-31%2066l-336%20396q-43%2051-120.5%2086.5t-143.5%2035.5h-1088q-34%200-60.5-13t-26.5-43q0-31%2031-66l336-396q43-51%20120.5-86.5t143.5-35.5h1088q34%200%2060.5%2013t26.5%2043zm-343-344v160h-832q-94%200-197%2047.5t-164%20119.5l-337%20396-5%206q0-4-.5-12.5t-.5-12.5v-960q0-92%2066-158t158-66h320q92%200%20158%2066t66%20158v32h544q92%200%20158%2066t66%20158z%22%2F%3E%3C%2Fsvg%3E) no-repeat 8px 6px / 14px 14px;
+}
+
+.phpdebugbar-indicator {
+ position: relative;
+ cursor: pointer;
+}
+ .phpdebugbar-indicator span.phpdebugbar-text {
+ margin-left: 5px;
+ }
+ .phpdebugbar-indicator span.phpdebugbar-tooltip {
+ display: none;
+ position: absolute;
+ top: -30px;
+ background: #efefef;
+ opacity: .7;
+ border: 1px solid #ccc;
+ color: #555;
+ font-size: 11px;
+ padding: 2px 3px;
+ z-index: 1000;
+ text-align: center;
+ width: 200%;
+ right: 0;
+ }
+ .phpdebugbar-indicator:hover span.phpdebugbar-tooltip:not(.phpdebugbar-disabled) {
+ display: block;
+ }
+
+select.phpdebugbar-datasets-switcher {
+ float: right;
+ display: none;
+ margin: 2px 0 0 7px;
+ max-width: 200px;
+ max-height: 23px;
+ padding: 0;
+}
+
+/* -------------------------------------- */
+
+div.phpdebugbar-body {
+ border-top: 1px solid #ccc;
+ display: none;
+ position: relative;
+ height: 300px;
+}
+
+/* -------------------------------------- */
+
+div.phpdebugbar-panel {
+ display: none;
+ height: 100%;
+ overflow: auto;
+ width: 100%;
+}
+div.phpdebugbar-panel.phpdebugbar-active {
+ display: block;
+}
+
+/* -------------------------------------- */
+
+div.phpdebugbar-mini-design a.phpdebugbar-tab {
+ position: relative;
+ border-right: 1px solid #ddd;
+}
+ div.phpdebugbar-mini-design a.phpdebugbar-tab span.phpdebugbar-text {
+ display: none;
+ }
+ div.phpdebugbar-mini-design a.phpdebugbar-tab:hover span.phpdebugbar-text {
+ display: block;
+ position: absolute;
+ top: -30px;
+ background: #efefef;
+ opacity: .7;
+ border: 1px solid #ccc;
+ color: #555;
+ font-size: 11px;
+ padding: 2px 3px;
+ z-index: 1000;
+ text-align: center;
+ right: 0;
+ }
+ div.phpdebugbar-mini-design a.phpdebugbar-tab i {
+ display:inline-block;
+ }
diff --git a/assets/debugbar.js b/assets/debugbar.js
new file mode 100644
index 0000000..144b3f5
--- /dev/null
+++ b/assets/debugbar.js
@@ -0,0 +1,1216 @@
+if (typeof(PhpDebugBar) == 'undefined') {
+ // namespace
+ var PhpDebugBar = {};
+ PhpDebugBar.$ = jQuery;
+}
+
+(function($) {
+
+ if (typeof(localStorage) == 'undefined') {
+ // provide mock localStorage object for dumb browsers
+ localStorage = {
+ setItem: function(key, value) {},
+ getItem: function(key) { return null; }
+ };
+ }
+
+ if (typeof(PhpDebugBar.utils) == 'undefined') {
+ PhpDebugBar.utils = {};
+ }
+
+ /**
+ * Returns the value from an object property.
+ * Using dots in the key, it is possible to retrieve nested property values
+ *
+ * @param {Object} dict
+ * @param {String} key
+ * @param {Object} default_value
+ * @return {Object}
+ */
+ var getDictValue = PhpDebugBar.utils.getDictValue = function(dict, key, default_value) {
+ var d = dict, parts = key.split('.');
+ for (var i = 0; i < parts.length; i++) {
+ if (!d[parts[i]]) {
+ return default_value;
+ }
+ d = d[parts[i]];
+ }
+ return d;
+ }
+
+ /**
+ * Counts the number of properties in an object
+ *
+ * @param {Object} obj
+ * @return {Integer}
+ */
+ var getObjectSize = PhpDebugBar.utils.getObjectSize = function(obj) {
+ if (Object.keys) {
+ return Object.keys(obj).length;
+ }
+ var count = 0;
+ for (var k in obj) {
+ if (obj.hasOwnProperty(k)) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ /**
+ * Returns a prefixed css class name
+ *
+ * @param {String} cls
+ * @return {String}
+ */
+ PhpDebugBar.utils.csscls = function(cls, prefix) {
+ if (cls.indexOf(' ') > -1) {
+ var clss = cls.split(' '), out = [];
+ for (var i = 0, c = clss.length; i < c; i++) {
+ out.push(PhpDebugBar.utils.csscls(clss[i], prefix));
+ }
+ return out.join(' ');
+ }
+ if (cls.indexOf('.') === 0) {
+ return '.' + prefix + cls.substr(1);
+ }
+ return prefix + cls;
+ };
+
+ /**
+ * Creates a partial function of csscls where the second
+ * argument is already defined
+ *
+ * @param {string} prefix
+ * @return {Function}
+ */
+ PhpDebugBar.utils.makecsscls = function(prefix) {
+ var f = function(cls) {
+ return PhpDebugBar.utils.csscls(cls, prefix);
+ };
+ return f;
+ }
+
+ var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-');
+
+
+ // ------------------------------------------------------------------
+
+ /**
+ * Base class for all elements with a visual component
+ *
+ * @param {Object} options
+ * @constructor
+ */
+ var Widget = PhpDebugBar.Widget = function(options) {
+ this._attributes = $.extend({}, this.defaults);
+ this._boundAttributes = {};
+ this.$el = $('<' + this.tagName + ' />');
+ if (this.className) {
+ this.$el.addClass(this.className);
+ }
+ this.initialize.apply(this, [options || {}]);
+ this.render.apply(this);
+ };
+
+ $.extend(Widget.prototype, {
+
+ tagName: 'div',
+
+ className: null,
+
+ defaults: {},
+
+ /**
+ * Called after the constructor
+ *
+ * @param {Object} options
+ */
+ initialize: function(options) {
+ this.set(options);
+ },
+
+ /**
+ * Called after the constructor to render the element
+ */
+ render: function() {},
+
+ /**
+ * Sets the value of an attribute
+ *
+ * @param {String} attr Can also be an object to set multiple attributes at once
+ * @param {Object} value
+ */
+ set: function(attr, value) {
+ if (typeof(attr) != 'string') {
+ for (var k in attr) {
+ this.set(k, attr[k]);
+ }
+ return;
+ }
+
+ this._attributes[attr] = value;
+ if (typeof(this._boundAttributes[attr]) !== 'undefined') {
+ for (var i = 0, c = this._boundAttributes[attr].length; i < c; i++) {
+ this._boundAttributes[attr][i].apply(this, [value]);
+ }
+ }
+ },
+
+ /**
+ * Checks if an attribute exists and is not null
+ *
+ * @param {String} attr
+ * @return {[type]} [description]
+ */
+ has: function(attr) {
+ return typeof(this._attributes[attr]) !== 'undefined' && this._attributes[attr] !== null;
+ },
+
+ /**
+ * Returns the value of an attribute
+ *
+ * @param {String} attr
+ * @return {Object}
+ */
+ get: function(attr) {
+ return this._attributes[attr];
+ },
+
+ /**
+ * Registers a callback function that will be called whenever the value of the attribute changes
+ *
+ * If cb is a jQuery element, text() will be used to fill the element
+ *
+ * @param {String} attr
+ * @param {Function} cb
+ */
+ bindAttr: function(attr, cb) {
+ if ($.isArray(attr)) {
+ for (var i = 0, c = attr.length; i < c; i++) {
+ this.bindAttr(attr[i], cb);
+ }
+ return;
+ }
+
+ if (typeof(this._boundAttributes[attr]) == 'undefined') {
+ this._boundAttributes[attr] = [];
+ }
+ if (typeof(cb) == 'object') {
+ var el = cb;
+ cb = function(value) { el.text(value || ''); };
+ }
+ this._boundAttributes[attr].push(cb);
+ if (this.has(attr)) {
+ cb.apply(this, [this._attributes[attr]]);
+ }
+ }
+
+ });
+
+
+ /**
+ * Creates a subclass
+ *
+ * Code from Backbone.js
+ *
+ * @param {Array} props Prototype properties
+ * @return {Function}
+ */
+ Widget.extend = function(props) {
+ var parent = this;
+
+ var child = function() { return parent.apply(this, arguments); };
+ $.extend(child, parent);
+
+ var Surrogate = function() { this.constructor = child; };
+ Surrogate.prototype = parent.prototype;
+ child.prototype = new Surrogate;
+ $.extend(child.prototype, props);
+
+ child.__super__ = parent.prototype;
+
+ return child;
+ };
+
+ // ------------------------------------------------------------------
+
+ /**
+ * Tab
+ *
+ * A tab is composed of a tab label which is always visible and
+ * a tab panel which is visible only when the tab is active.
+ *
+ * The panel must contain a widget. A widget is an object which has
+ * an element property containing something appendable to a jQuery object.
+ *
+ * Options:
+ * - title
+ * - badge
+ * - widget
+ * - data: forward data to widget data
+ */
+ var Tab = Widget.extend({
+
+ className: csscls('panel'),
+
+ render: function() {
+ this.$tab = $('').addClass(csscls('tab'));
+
+ this.$icon = $('').appendTo(this.$tab);
+ this.bindAttr('icon', function(icon) {
+ if (icon) {
+ this.$icon.attr('class', 'phpdebugbar-fa phpdebugbar-fa-' + icon);
+ } else {
+ this.$icon.attr('class', '');
+ }
+ });
+
+ this.bindAttr('title', $('').addClass(csscls('text')).appendTo(this.$tab));
+
+ this.$badge = $('').addClass(csscls('badge')).appendTo(this.$tab);
+ this.bindAttr('badge', function(value) {
+ if (value !== null) {
+ this.$badge.text(value);
+ this.$badge.addClass(csscls('visible'));
+ } else {
+ this.$badge.removeClass(csscls('visible'));
+ }
+ });
+
+ this.bindAttr('widget', function(widget) {
+ this.$el.empty().append(widget.$el);
+ });
+
+ this.bindAttr('data', function(data) {
+ if (this.has('widget')) {
+ this.get('widget').set('data', data);
+ }
+ })
+ }
+
+ });
+
+ // ------------------------------------------------------------------
+
+ /**
+ * Indicator
+ *
+ * An indicator is a text and an icon to display single value information
+ * right inside the always visible part of the debug bar
+ *
+ * Options:
+ * - icon
+ * - title
+ * - tooltip
+ * - data: alias of title
+ */
+ var Indicator = Widget.extend({
+
+ tagName: 'span',
+
+ className: csscls('indicator'),
+
+ render: function() {
+ this.$icon = $('').appendTo(this.$el);
+ this.bindAttr('icon', function(icon) {
+ if (icon) {
+ this.$icon.attr('class', 'phpdebugbar-fa phpdebugbar-fa-' + icon);
+ } else {
+ this.$icon.attr('class', '');
+ }
+ });
+
+ this.bindAttr(['title', 'data'], $('').addClass(csscls('text')).appendTo(this.$el));
+
+ this.$tooltip = $('').addClass(csscls('tooltip disabled')).appendTo(this.$el);
+ this.bindAttr('tooltip', function(tooltip) {
+ if (tooltip) {
+ this.$tooltip.text(tooltip).removeClass(csscls('disabled'));
+ } else {
+ this.$tooltip.addClass(csscls('disabled'));
+ }
+ });
+ }
+
+ });
+
+ // ------------------------------------------------------------------
+
+ /**
+ * Dataset title formater
+ *
+ * Formats the title of a dataset for the select box
+ */
+ var DatasetTitleFormater = PhpDebugBar.DatasetTitleFormater = function(debugbar) {
+ this.debugbar = debugbar;
+ };
+
+ $.extend(DatasetTitleFormater.prototype, {
+
+ /**
+ * Formats the title of a dataset
+ *
+ * @this {DatasetTitleFormater}
+ * @param {String} id
+ * @param {Object} data
+ * @param {String} suffix
+ * @return {String}
+ */
+ format: function(id, data, suffix) {
+ if (suffix) {
+ suffix = ' ' + suffix;
+ } else {
+ suffix = '';
+ }
+
+ var nb = getObjectSize(this.debugbar.datasets) + 1;
+
+ if (typeof(data['__meta']) === 'undefined') {
+ return "#" + nb + suffix;
+ }
+
+ var uri = data['__meta']['uri'], filename;
+ if (uri.length && uri.charAt(uri.length - 1) === '/') {
+ // URI ends in a trailing /: get the portion before then to avoid returning an empty string
+ filename = uri.substr(0, uri.length - 1); // strip trailing '/'
+ filename = filename.substr(filename.lastIndexOf('/') + 1); // get last path segment
+ filename += '/'; // add the trailing '/' back
+ } else {
+ filename = uri.substr(uri.lastIndexOf('/') + 1);
+ }
+
+ // truncate the filename in the label, if it's too long
+ var maxLength = 150;
+ if (filename.length > maxLength) {
+ filename = filename.substr(0, maxLength) + '...';
+ }
+
+ var label = "#" + nb + " " + filename + suffix + ' (' + data['__meta']['datetime'].split(' ')[1] + ')';
+ return label;
+ }
+
+ });
+
+ // ------------------------------------------------------------------
+
+
+ /**
+ * DebugBar
+ *
+ * Creates a bar that appends itself to the body of your page
+ * and sticks to the bottom.
+ *
+ * The bar can be customized by adding tabs and indicators.
+ * A data map is used to fill those controls with data provided
+ * from datasets.
+ */
+ var DebugBar = PhpDebugBar.DebugBar = Widget.extend({
+
+ className: "phpdebugbar " + csscls('minimized'),
+
+ options: {
+ bodyMarginBottom: true,
+ bodyMarginBottomHeight: 0
+ },
+
+ initialize: function() {
+ this.controls = {};
+ this.dataMap = {};
+ this.datasets = {};
+ this.firstTabName = null;
+ this.activePanelName = null;
+ this.datesetTitleFormater = new DatasetTitleFormater(this);
+ this.options.bodyMarginBottomHeight = parseInt($('body').css('margin-bottom'));
+ this.registerResizeHandler();
+ },
+
+ /**
+ * Register resize event, for resize debugbar with reponsive css.
+ *
+ * @this {DebugBar}
+ */
+ registerResizeHandler: function() {
+ if (typeof this.resize.bind == 'undefined') return;
+
+ var f = this.resize.bind(this);
+ this.respCSSSize = 0;
+ $(window).resize(f);
+ setTimeout(f, 20);
+ },
+
+ /**
+ * Resizes the debugbar to fit the current browser window
+ */
+ resize: function() {
+ var contentSize = this.respCSSSize;
+ if (this.respCSSSize == 0) {
+ this.$header.find("> div > *:visible").each(function () {
+ contentSize += $(this).outerWidth();
+ });
+ }
+
+ var currentSize = this.$header.width();
+ var cssClass = "phpdebugbar-mini-design";
+ var bool = this.$header.hasClass(cssClass);
+
+ if (currentSize <= contentSize && !bool) {
+ this.respCSSSize = contentSize;
+ this.$header.addClass(cssClass);
+ } else if (contentSize < currentSize && bool) {
+ this.respCSSSize = 0;
+ this.$header.removeClass(cssClass);
+ }
+
+ // Reset height to ensure bar is still visible
+ this.setHeight(this.$body.height());
+ },
+
+ /**
+ * Initialiazes the UI
+ *
+ * @this {DebugBar}
+ */
+ render: function() {
+ var self = this;
+ this.$el.appendTo('body');
+ this.$dragCapture = $('
').addClass(csscls('drag-capture')).appendTo(this.$el);
+ this.$resizehdle = $('').addClass(csscls('resize-handle')).appendTo(this.$el);
+ this.$header = $('').addClass(csscls('header')).appendTo(this.$el);
+ this.$headerLeft = $('').addClass(csscls('header-left')).appendTo(this.$header);
+ this.$headerRight = $('').addClass(csscls('header-right')).appendTo(this.$header);
+ var $body = this.$body = $('').addClass(csscls('body')).appendTo(this.$el);
+ this.recomputeBottomOffset();
+
+ // dragging of resize handle
+ var pos_y, orig_h;
+ this.$resizehdle.on('mousedown', function(e) {
+ orig_h = $body.height(), pos_y = e.pageY;
+ $body.parents().on('mousemove', mousemove).on('mouseup', mouseup);
+ self.$dragCapture.show();
+ e.preventDefault();
+ });
+ var mousemove = function(e) {
+ var h = orig_h + (pos_y - e.pageY);
+ self.setHeight(h);
+ };
+ var mouseup = function() {
+ $body.parents().off('mousemove', mousemove).off('mouseup', mouseup);
+ self.$dragCapture.hide();
+ };
+
+ // close button
+ this.$closebtn = $('').addClass(csscls('close-btn')).appendTo(this.$headerRight);
+ this.$closebtn.click(function() {
+ self.close();
+ });
+
+ // minimize button
+ this.$minimizebtn = $('').addClass(csscls('minimize-btn') ).appendTo(this.$headerRight);
+ this.$minimizebtn.click(function() {
+ self.minimize();
+ });
+
+ // maximize button
+ this.$maximizebtn = $('').addClass(csscls('maximize-btn') ).appendTo(this.$headerRight);
+ this.$maximizebtn.click(function() {
+ self.restore();
+ });
+
+ // restore button
+ this.$restorebtn = $('').addClass(csscls('restore-btn')).hide().appendTo(this.$el);
+ this.$restorebtn.click(function() {
+ self.restore();
+ });
+
+ // open button
+ this.$openbtn = $('').addClass(csscls('open-btn')).appendTo(this.$headerRight).hide();
+ this.$openbtn.click(function() {
+ self.openHandler.show(function(id, dataset) {
+ self.addDataSet(dataset, id, "(opened)");
+ self.showTab();
+ });
+ });
+
+ // select box for data sets
+ this.$datasets = $('').addClass(csscls('datasets-switcher')).appendTo(this.$headerRight);
+ this.$datasets.change(function() {
+ self.dataChangeHandler(self.datasets[this.value]);
+ self.showTab();
+ });
+ },
+
+ /**
+ * Sets the height of the debugbar body section
+ * Forces the height to lie within a reasonable range
+ * Stores the height in local storage so it can be restored
+ * Resets the document body bottom offset
+ *
+ * @this {DebugBar}
+ */
+ setHeight: function(height) {
+ var min_h = 40;
+ var max_h = $(window).innerHeight() - this.$header.height() - 10;
+ height = Math.min(height, max_h);
+ height = Math.max(height, min_h);
+ this.$body.css('height', height);
+ localStorage.setItem('phpdebugbar-height', height);
+ this.recomputeBottomOffset();
+ },
+
+ /**
+ * Restores the state of the DebugBar using localStorage
+ * This is not called by default in the constructor and
+ * needs to be called by subclasses in their init() method
+ *
+ * @this {DebugBar}
+ */
+ restoreState: function() {
+ // bar height
+ var height = localStorage.getItem('phpdebugbar-height');
+ this.setHeight(height || this.$body.height());
+
+ // bar visibility
+ var open = localStorage.getItem('phpdebugbar-open');
+ if (open && open == '0') {
+ this.close();
+ } else {
+ var visible = localStorage.getItem('phpdebugbar-visible');
+ if (visible && visible == '1') {
+ var tab = localStorage.getItem('phpdebugbar-tab');
+ if (this.isTab(tab)) {
+ this.showTab(tab);
+ }
+ }
+ }
+ },
+
+ /**
+ * Creates and adds a new tab
+ *
+ * @this {DebugBar}
+ * @param {String} name Internal name
+ * @param {Object} widget A widget object with an element property
+ * @param {String} title The text in the tab, if not specified, name will be used
+ * @return {Tab}
+ */
+ createTab: function(name, widget, title) {
+ var tab = new Tab({
+ title: title || (name.replace(/[_\-]/g, ' ').charAt(0).toUpperCase() + name.slice(1)),
+ widget: widget
+ });
+ return this.addTab(name, tab);
+ },
+
+ /**
+ * Adds a new tab
+ *
+ * @this {DebugBar}
+ * @param {String} name Internal name
+ * @param {Tab} tab Tab object
+ * @return {Tab}
+ */
+ addTab: function(name, tab) {
+ if (this.isControl(name)) {
+ throw new Error(name + ' already exists');
+ }
+
+ var self = this;
+ tab.$tab.appendTo(this.$headerLeft).click(function() {
+ if (!self.isMinimized() && self.activePanelName == name) {
+ self.minimize();
+ } else {
+ self.showTab(name);
+ }
+ });
+ tab.$el.appendTo(this.$body);
+
+ this.controls[name] = tab;
+ if (this.firstTabName == null) {
+ this.firstTabName = name;
+ }
+ return tab;
+ },
+
+ /**
+ * Creates and adds an indicator
+ *
+ * @this {DebugBar}
+ * @param {String} name Internal name
+ * @param {String} icon
+ * @param {String} tooltip
+ * @param {String} position "right" or "left", default is "right"
+ * @return {Indicator}
+ */
+ createIndicator: function(name, icon, tooltip, position) {
+ var indicator = new Indicator({
+ icon: icon,
+ tooltip: tooltip
+ });
+ return this.addIndicator(name, indicator, position);
+ },
+
+ /**
+ * Adds an indicator
+ *
+ * @this {DebugBar}
+ * @param {String} name Internal name
+ * @param {Indicator} indicator Indicator object
+ * @return {Indicator}
+ */
+ addIndicator: function(name, indicator, position) {
+ if (this.isControl(name)) {
+ throw new Error(name + ' already exists');
+ }
+
+ if (position == 'left') {
+ indicator.$el.insertBefore(this.$headerLeft.children().first());
+ } else {
+ indicator.$el.appendTo(this.$headerRight);
+ }
+
+ this.controls[name] = indicator;
+ return indicator;
+ },
+
+ /**
+ * Returns a control
+ *
+ * @param {String} name
+ * @return {Object}
+ */
+ getControl: function(name) {
+ if (this.isControl(name)) {
+ return this.controls[name];
+ }
+ },
+
+ /**
+ * Checks if there's a control under the specified name
+ *
+ * @this {DebugBar}
+ * @param {String} name
+ * @return {Boolean}
+ */
+ isControl: function(name) {
+ return typeof(this.controls[name]) != 'undefined';
+ },
+
+ /**
+ * Checks if a tab with the specified name exists
+ *
+ * @this {DebugBar}
+ * @param {String} name
+ * @return {Boolean}
+ */
+ isTab: function(name) {
+ return this.isControl(name) && this.controls[name] instanceof Tab;
+ },
+
+ /**
+ * Checks if an indicator with the specified name exists
+ *
+ * @this {DebugBar}
+ * @param {String} name
+ * @return {Boolean}
+ */
+ isIndicator: function(name) {
+ return this.isControl(name) && this.controls[name] instanceof Indicator;
+ },
+
+ /**
+ * Removes all tabs and indicators from the debug bar and hides it
+ *
+ * @this {DebugBar}
+ */
+ reset: function() {
+ this.minimize();
+ var self = this;
+ $.each(this.controls, function(name, control) {
+ if (self.isTab(name)) {
+ control.$tab.remove();
+ }
+ control.$el.remove();
+ });
+ this.controls = {};
+ },
+
+ /**
+ * Open the debug bar and display the specified tab
+ *
+ * @this {DebugBar}
+ * @param {String} name If not specified, display the first tab
+ */
+ showTab: function(name) {
+ if (!name) {
+ if (this.activePanelName) {
+ name = this.activePanelName;
+ } else {
+ name = this.firstTabName;
+ }
+ }
+
+ if (!this.isTab(name)) {
+ throw new Error("Unknown tab '" + name + "'");
+ }
+
+ this.$resizehdle.show();
+ this.$body.show();
+ this.recomputeBottomOffset();
+
+ $(this.$header).find('> div > .' + csscls('active')).removeClass(csscls('active'));
+ $(this.$body).find('> .' + csscls('active')).removeClass(csscls('active'));
+
+ this.controls[name].$tab.addClass(csscls('active'));
+ this.controls[name].$el.addClass(csscls('active'));
+ this.activePanelName = name;
+
+ this.$el.removeClass(csscls('minimized'));
+ localStorage.setItem('phpdebugbar-visible', '1');
+ localStorage.setItem('phpdebugbar-tab', name);
+ this.resize();
+ },
+
+ /**
+ * Hide panels and minimize the debug bar
+ *
+ * @this {DebugBar}
+ */
+ minimize: function() {
+ this.$header.find('> div > .' + csscls('active')).removeClass(csscls('active'));
+ this.$body.hide();
+ this.$resizehdle.hide();
+ this.recomputeBottomOffset();
+ localStorage.setItem('phpdebugbar-visible', '0');
+ this.$el.addClass(csscls('minimized'));
+ this.resize();
+ },
+
+ /**
+ * Checks if the panel is minimized
+ *
+ * @return {Boolean}
+ */
+ isMinimized: function() {
+ return this.$el.hasClass(csscls('minimized'));
+ },
+
+ /**
+ * Close the debug bar
+ *
+ * @this {DebugBar}
+ */
+ close: function() {
+ this.$resizehdle.hide();
+ this.$header.hide();
+ this.$body.hide();
+ this.$restorebtn.show();
+ localStorage.setItem('phpdebugbar-open', '0');
+ this.$el.addClass(csscls('closed'));
+ this.recomputeBottomOffset();
+ },
+
+ /**
+ * Checks if the panel is closed
+ *
+ * @return {Boolean}
+ */
+ isClosed: function() {
+ return this.$el.hasClass(csscls('closed'));
+ },
+
+ /**
+ * Restore the debug bar
+ *
+ * @this {DebugBar}
+ */
+ restore: function() {
+ this.$resizehdle.show();
+ this.$header.show();
+ this.$restorebtn.hide();
+ localStorage.setItem('phpdebugbar-open', '1');
+ var tab = localStorage.getItem('phpdebugbar-tab');
+ if (this.isTab(tab)) {
+ this.showTab(tab);
+ } else {
+ this.showTab();
+ }
+ this.$el.removeClass(csscls('closed'));
+ this.resize();
+ },
+
+ /**
+ * Recomputes the margin-bottom css property of the body so
+ * that the debug bar never hides any content
+ */
+ recomputeBottomOffset: function() {
+ if (this.options.bodyMarginBottom) {
+ if (this.isClosed()) {
+ return $('body').css('margin-bottom', this.options.bodyMarginBottomHeight || '');
+ }
+
+ var offset = parseInt(this.$el.height()) + (this.options.bodyMarginBottomHeight || 0);
+ $('body').css('margin-bottom', offset);
+ }
+ },
+
+ /**
+ * Sets the data map used by dataChangeHandler to populate
+ * indicators and widgets
+ *
+ * A data map is an object where properties are control names.
+ * The value of each property should be an array where the first
+ * item is the name of a property from the data object (nested properties
+ * can be specified) and the second item the default value.
+ *
+ * Example:
+ * {"memory": ["memory.peak_usage_str", "0B"]}
+ *
+ * @this {DebugBar}
+ * @param {Object} map
+ */
+ setDataMap: function(map) {
+ this.dataMap = map;
+ },
+
+ /**
+ * Same as setDataMap() but appends to the existing map
+ * rather than replacing it
+ *
+ * @this {DebugBar}
+ * @param {Object} map
+ */
+ addDataMap: function(map) {
+ $.extend(this.dataMap, map);
+ },
+
+ /**
+ * Resets datasets and add one set of data
+ *
+ * For this method to be usefull, you need to specify
+ * a dataMap using setDataMap()
+ *
+ * @this {DebugBar}
+ * @param {Object} data
+ * @return {String} Dataset's id
+ */
+ setData: function(data) {
+ this.datasets = {};
+ return this.addDataSet(data);
+ },
+
+ /**
+ * Adds a dataset
+ *
+ * If more than one dataset are added, the dataset selector
+ * will be displayed.
+ *
+ * For this method to be usefull, you need to specify
+ * a dataMap using setDataMap()
+ *
+ * @this {DebugBar}
+ * @param {Object} data
+ * @param {String} id The name of this set, optional
+ * @param {String} suffix
+ * @param {Bool} show Whether to show the new dataset, optional (default: true)
+ * @return {String} Dataset's id
+ */
+ addDataSet: function(data, id, suffix, show) {
+ var label = this.datesetTitleFormater.format(id, data, suffix);
+ id = id || (getObjectSize(this.datasets) + 1);
+ this.datasets[id] = data;
+
+ this.$datasets.append($(''));
+ if (this.$datasets.children().length > 1) {
+ this.$datasets.show();
+ }
+
+ if (typeof(show) == 'undefined' || show) {
+ this.showDataSet(id);
+ }
+ return id;
+ },
+
+ /**
+ * Loads a dataset using the open handler
+ *
+ * @param {String} id
+ * @param {Bool} show Whether to show the new dataset, optional (default: true)
+ */
+ loadDataSet: function(id, suffix, callback, show) {
+ if (!this.openHandler) {
+ throw new Error('loadDataSet() needs an open handler');
+ }
+ var self = this;
+ this.openHandler.load(id, function(data) {
+ self.addDataSet(data, id, suffix, show);
+ self.resize();
+ callback && callback(data);
+ });
+ },
+
+ /**
+ * Returns the data from a dataset
+ *
+ * @this {DebugBar}
+ * @param {String} id
+ * @return {Object}
+ */
+ getDataSet: function(id) {
+ return this.datasets[id];
+ },
+
+ /**
+ * Switch the currently displayed dataset
+ *
+ * @this {DebugBar}
+ * @param {String} id
+ */
+ showDataSet: function(id) {
+ this.dataChangeHandler(this.datasets[id]);
+ this.$datasets.val(id);
+ },
+
+ /**
+ * Called when the current dataset is modified.
+ *
+ * @this {DebugBar}
+ * @param {Object} data
+ */
+ dataChangeHandler: function(data) {
+ var self = this;
+ $.each(this.dataMap, function(key, def) {
+ var d = getDictValue(data, def[0], def[1]);
+ if (key.indexOf(':') != -1) {
+ key = key.split(':');
+ self.getControl(key[0]).set(key[1], d);
+ } else {
+ self.getControl(key).set('data', d);
+ }
+ });
+ },
+
+ /**
+ * Sets the handler to open past dataset
+ *
+ * @this {DebugBar}
+ * @param {object} handler
+ */
+ setOpenHandler: function(handler) {
+ this.openHandler = handler;
+ if (handler !== null) {
+ this.$openbtn.show();
+ } else {
+ this.$openbtn.hide();
+ }
+ },
+
+ /**
+ * Returns the handler to open past dataset
+ *
+ * @this {DebugBar}
+ * @return {object}
+ */
+ getOpenHandler: function() {
+ return this.openHandler;
+ }
+
+ });
+
+ DebugBar.Tab = Tab;
+ DebugBar.Indicator = Indicator;
+
+ // ------------------------------------------------------------------
+
+ /**
+ * AjaxHandler
+ *
+ * Extract data from headers of an XMLHttpRequest and adds a new dataset
+ *
+ * @param {Bool} autoShow Whether to immediately show new datasets, optional (default: true)
+ */
+ var AjaxHandler = PhpDebugBar.AjaxHandler = function(debugbar, headerName, autoShow) {
+ this.debugbar = debugbar;
+ this.headerName = headerName || 'phpdebugbar';
+ this.autoShow = typeof(autoShow) == 'undefined' ? true : autoShow;
+ };
+
+ $.extend(AjaxHandler.prototype, {
+
+ /**
+ * Handles a Fetch API Response or an XMLHttpRequest
+ *
+ * @this {AjaxHandler}
+ * @param {Response|XMLHttpRequest} response
+ * @return {Bool}
+ */
+ handle: function(response) {
+ // Check if the debugbar header is available
+ if (this.isFetch(response) && !response.headers.has(this.headerName + '-id')) {
+ return true;
+ } else if (this.isXHR(response) && response.getAllResponseHeaders().indexOf(this.headerName) === -1) {
+ return true;
+ }
+ if (!this.loadFromId(response)) {
+ return this.loadFromData(response);
+ }
+ return true;
+ },
+
+ getHeader: function(response, header) {
+ if (this.isFetch(response)) {
+ return response.headers.get(header)
+ }
+
+ return response.getResponseHeader(header)
+ },
+
+ isFetch: function(response) {
+ return Object.prototype.toString.call(response) == '[object Response]'
+ },
+
+ isXHR: function(response) {
+ return Object.prototype.toString.call(response) == '[object XMLHttpRequest]'
+ },
+
+ /**
+ * Checks if the HEADER-id exists and loads the dataset using the open handler
+ *
+ * @param {Response|XMLHttpRequest} response
+ * @return {Bool}
+ */
+ loadFromId: function(response) {
+ var id = this.extractIdFromHeaders(response);
+ if (id && this.debugbar.openHandler) {
+ this.debugbar.loadDataSet(id, "(ajax)", undefined, this.autoShow);
+ return true;
+ }
+ return false;
+ },
+
+ /**
+ * Extracts the id from the HEADER-id
+ *
+ * @param {Response|XMLHttpRequest} response
+ * @return {String}
+ */
+ extractIdFromHeaders: function(response) {
+ return this.getHeader(response, this.headerName + '-id');
+ },
+
+ /**
+ * Checks if the HEADER exists and loads the dataset
+ *
+ * @param {Response|XMLHttpRequest} response
+ * @return {Bool}
+ */
+ loadFromData: function(response) {
+ var raw = this.extractDataFromHeaders(response);
+ if (!raw) {
+ return false;
+ }
+
+ var data = this.parseHeaders(raw);
+ if (data.error) {
+ throw new Error('Error loading debugbar data: ' + data.error);
+ } else if(data.data) {
+ this.debugbar.addDataSet(data.data, data.id, "(ajax)", this.autoShow);
+ }
+ return true;
+ },
+
+ /**
+ * Extract the data as a string from headers of an XMLHttpRequest
+ *
+ * @this {AjaxHandler}
+ * @param {Response|XMLHttpRequest} response
+ * @return {string}
+ */
+ extractDataFromHeaders: function(response) {
+ var data = this.getHeader(response, this.headerName);
+ if (!data) {
+ return;
+ }
+ for (var i = 1;; i++) {
+ var header = this.getHeader(response, this.headerName + '-' + i);
+ if (!header) {
+ break;
+ }
+ data += header;
+ }
+ return decodeURIComponent(data);
+ },
+
+ /**
+ * Parses the string data into an object
+ *
+ * @this {AjaxHandler}
+ * @param {string} data
+ * @return {string}
+ */
+ parseHeaders: function(data) {
+ return JSON.parse(data);
+ },
+
+ /**
+ * Attaches an event listener to fetch
+ *
+ * @this {AjaxHandler}
+ */
+ bindToFetch: function() {
+ var self = this;
+ var proxied = window.fetch;
+
+ if (proxied !== undefined && proxied.polyfill !== undefined) {
+ return;
+ }
+
+ window.fetch = function () {
+ var promise = proxied.apply(this, arguments);
+
+ promise.then(function (response) {
+ self.handle(response);
+ });
+
+ return promise;
+ };
+ },
+
+ /**
+ * Attaches an event listener to jQuery.ajaxComplete()
+ *
+ * @this {AjaxHandler}
+ * @param {jQuery} jq Optional
+ */
+ bindToJquery: function(jq) {
+ var self = this;
+ jq(document).ajaxComplete(function(e, xhr, settings) {
+ if (!settings.ignoreDebugBarAjaxHandler) {
+ self.handle(xhr);
+ }
+ });
+ },
+
+ /**
+ * Attaches an event listener to XMLHttpRequest
+ *
+ * @this {AjaxHandler}
+ */
+ bindToXHR: function() {
+ var self = this;
+ var proxied = XMLHttpRequest.prototype.open;
+ XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
+ var xhr = this;
+ this.addEventListener("readystatechange", function() {
+ var skipUrl = self.debugbar.openHandler ? self.debugbar.openHandler.get('url') : null;
+ if (xhr.readyState == 4 && url.indexOf(skipUrl) !== 0) {
+ self.handle(xhr);
+ }
+ }, false);
+ proxied.apply(this, Array.prototype.slice.call(arguments));
+ };
+ }
+
+ });
+
+})(PhpDebugBar.$);
diff --git a/assets/dotkernel.css b/assets/dotkernel.css
new file mode 100644
index 0000000..2567232
--- /dev/null
+++ b/assets/dotkernel.css
@@ -0,0 +1,46 @@
+.phpdebugbar-header {
+ background-color: #C60B31 !important;
+}
+
+.phpdebugbar-tab, .phpdebugbar-indicator {
+ color: #FFFFFF !important;
+}
+
+.phpdebugbar-badge {
+ vertical-align: baseline !important;
+}
+
+.phpdebugbar-active {
+ color: #000000 !important;
+}
+
+.phpdebugbar-panel {
+ background-color: #F8F8F8 !important;
+}
+
+.phpdebugbar-widgets-kvlist {
+ font-size: .75rem !important;
+}
+
+.phpdebugbar-widgets-key {
+ text-align: right !important;
+}
+
+.phpdebugbar-widgets-value {
+ border-left: 1px solid #DDDDDD !important;
+ background-color: #FFFFFF !important;
+}
+
+.phpdebugbar-widgets-list-item {
+ background-color: #FFFFFF !important;
+ padding: .75rem .5rem !important;
+}
+
+.phpdebugbar-widgets-params tr > td:nth-child(1) {
+ background-color: #F8F8F8 !important;
+ text-align: right !important;
+}
+
+.phpdebugbar-widgets-params tr > td:nth-child(2) {
+ background-color: #FFFFFF !important;
+}
diff --git a/assets/openhandler.css b/assets/openhandler.css
new file mode 100644
index 0000000..863a8bd
--- /dev/null
+++ b/assets/openhandler.css
@@ -0,0 +1,70 @@
+div.phpdebugbar-openhandler-overlay {
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ background: #000;
+ opacity: .3;
+ z-index: 20000;
+}
+
+div.phpdebugbar-openhandler {
+ position: fixed;
+ margin: auto;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ width: 70%;
+ height: 70%;
+ background: #fff;
+ color: #000;
+ border: 2px solid #888;
+ overflow: auto;
+ z-index: 20001;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ padding-bottom: 10px;
+}
+ div.phpdebugbar-openhandler a {
+ color: #555;
+ }
+ div.phpdebugbar-openhandler .phpdebugbar-openhandler-header {
+ background: #efefef url(data:image/png;base64,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) no-repeat 5px 4px;
+ padding-left: 29px;
+ min-height: 26px;
+ line-height: 25px;
+ color: #555;
+ margin-bottom: 10px;
+ }
+ div.phpdebugbar-openhandler .phpdebugbar-openhandler-header a {
+ font-size: 14px;
+ color: #555;
+ text-decoration: none;
+ float: right;
+ padding: 5px 8px;
+ }
+ div.phpdebugbar-openhandler table {
+ width: 100%;
+ table-layout: fixed;
+ font-size: 14px;
+ }
+ div.phpdebugbar-openhandler table td {
+ padding: 6px 3px;
+ border-bottom: 1px solid #ddd;
+ }
+ div.phpdebugbar-openhandler table td a{
+ display: block;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions {
+ text-align: center;
+ padding: 7px 0;
+ }
+ div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions a {
+ margin: 0 10px;
+ color: #555;
+ }
diff --git a/assets/openhandler.js b/assets/openhandler.js
new file mode 100644
index 0000000..5633043
--- /dev/null
+++ b/assets/openhandler.js
@@ -0,0 +1,202 @@
+if (typeof(PhpDebugBar) == 'undefined') {
+ // namespace
+ var PhpDebugBar = {};
+ PhpDebugBar.$ = jQuery;
+}
+
+(function($) {
+
+ var csscls = function(cls) {
+ return PhpDebugBar.utils.csscls(cls, 'phpdebugbar-openhandler-');
+ };
+
+ PhpDebugBar.OpenHandler = PhpDebugBar.Widget.extend({
+
+ className: 'phpdebugbar-openhandler',
+
+ defaults: {
+ items_per_page: 20
+ },
+
+ render: function() {
+ var self = this;
+
+ this.$el.appendTo('body').hide();
+ this.$closebtn = $('');
+ this.$table = $('');
+ $('PHP DebugBar | Open
').addClass(csscls('header')).append(this.$closebtn).appendTo(this.$el);
+ $('Date | Method | URL | IP | Filter data |
---|
').append(this.$table).appendTo(this.$el);
+ this.$actions = $('').addClass(csscls('actions')).appendTo(this.$el);
+
+ this.$closebtn.on('click', function() {
+ self.hide();
+ });
+
+ this.$loadmorebtn = $('Load more')
+ .appendTo(this.$actions)
+ .on('click', function() {
+ self.find(self.last_find_request, self.last_find_request.offset + self.get('items_per_page'), self.handleFind.bind(self));
+ });
+
+ this.$showonlycurrentbtn = $('Show only current URL')
+ .appendTo(this.$actions)
+ .on('click', function() {
+ self.$table.empty();
+ self.find({uri: window.location.pathname}, 0, self.handleFind.bind(self));
+ });
+
+ this.$showallbtn = $('Show all')
+ .appendTo(this.$actions)
+ .on('click', function() {
+ self.refresh();
+ });
+
+ this.$clearbtn = $('Delete all')
+ .appendTo(this.$actions)
+ .on('click', function() {
+ self.clear(function() {
+ self.hide();
+ });
+ });
+
+ this.addSearch();
+
+ this.$overlay = $('').addClass(csscls('overlay')).hide().appendTo('body');
+ this.$overlay.on('click', function() {
+ self.hide();
+ });
+ },
+
+ refresh: function() {
+ this.$table.empty();
+ this.$loadmorebtn.show();
+ this.find({}, 0, this.handleFind.bind(this));
+ },
+
+ addSearch: function(){
+ var self = this;
+ var searchBtn = $('')
+ .text('Search')
+ .attr('type', 'submit')
+ .on('click', function(e) {
+ self.$table.empty();
+ var search = {};
+ var a = $(this).parent().serializeArray();
+ $.each(a, function() {
+ if(this.value){
+ search[this.name] = this.value;
+ }
+ });
+
+ self.find(search, 0, self.handleFind.bind(self));
+ e.preventDefault();
+ });
+
+ $('')
+ .append('
Filter results
')
+ .append('Method:
')
+ .append('Uri:
')
+ .append('IP:
')
+ .append(searchBtn)
+ .appendTo(this.$actions);
+ },
+
+ handleFind: function(data) {
+ var self = this;
+ $.each(data, function(i, meta) {
+ var a = $('')
+ .text('Load dataset')
+ .on('click', function(e) {
+ self.hide();
+ self.load(meta['id'], function(data) {
+ self.callback(meta['id'], data);
+ });
+ e.preventDefault();
+ });
+
+ var method = $('')
+ .text(meta['method'])
+ .on('click', function(e) {
+ self.$table.empty();
+ self.find({method: meta['method']}, 0, self.handleFind.bind(self));
+ e.preventDefault();
+ });
+
+ var uri = $('')
+ .text(meta['uri'])
+ .on('click', function(e) {
+ self.hide();
+ self.load(meta['id'], function(data) {
+ self.callback(meta['id'], data);
+ });
+ e.preventDefault();
+ });
+
+ var ip = $('')
+ .text(meta['ip'])
+ .on('click', function(e) {
+ self.$table.empty();
+ self.find({ip: meta['ip']}, 0, self.handleFind.bind(self));
+ e.preventDefault();
+ });
+
+ var search = $('')
+ .text('Show URL')
+ .on('click', function(e) {
+ self.$table.empty();
+ self.find({uri: meta['uri']}, 0, self.handleFind.bind(self));
+ e.preventDefault();
+ });
+
+ $('
')
+ .append('' + meta['datetime'] + ' | ')
+ .append('' + meta['method'] + ' | ')
+ .append($(' | ').append(uri))
+ .append($(' | ').append(ip))
+ .append($(' | ').append(search))
+ .appendTo(self.$table);
+ });
+ if (data.length < this.get('items_per_page')) {
+ this.$loadmorebtn.hide();
+ }
+ },
+
+ show: function(callback) {
+ this.callback = callback;
+ this.$el.show();
+ this.$overlay.show();
+ this.refresh();
+ },
+
+ hide: function() {
+ this.$el.hide();
+ this.$overlay.hide();
+ },
+
+ find: function(filters, offset, callback) {
+ var data = $.extend({}, filters, {max: this.get('items_per_page'), offset: offset || 0});
+ this.last_find_request = data;
+ this.ajax(data, callback);
+ },
+
+ load: function(id, callback) {
+ this.ajax({op: "get", id: id}, callback);
+ },
+
+ clear: function(callback) {
+ this.ajax({op: "clear"}, callback);
+ },
+
+ ajax: function(data, callback) {
+ $.ajax({
+ dataType: 'json',
+ url: this.get('url'),
+ data: data,
+ success: callback,
+ ignoreDebugBarAjaxHandler: true
+ });
+ }
+
+ });
+
+})(PhpDebugBar.$);
diff --git a/assets/vendor/font-awesome/css/font-awesome.min.css b/assets/vendor/font-awesome/css/font-awesome.min.css
new file mode 100644
index 0000000..3559d52
--- /dev/null
+++ b/assets/vendor/font-awesome/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'PhpDebugbarFontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.phpdebugbar-fa{display:inline-block;font:normal normal normal 14px/1 PhpDebugbarFontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.phpdebugbar-fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.phpdebugbar-fa-2x{font-size:2em}.phpdebugbar-fa-3x{font-size:3em}.phpdebugbar-fa-4x{font-size:4em}.phpdebugbar-fa-5x{font-size:5em}.phpdebugbar-fa-fw{width:1.28571429em;text-align:center}.phpdebugbar-fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.phpdebugbar-fa-ul>li{position:relative}.phpdebugbar-fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.phpdebugbar-fa-li.phpdebugbar-fa-lg{left:-1.85714286em}.phpdebugbar-fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.phpdebugbar-fa-pull-left{float:left}.phpdebugbar-fa-pull-right{float:right}.phpdebugbar-fa.phpdebugbar-fa-pull-left{margin-right:.3em}.phpdebugbar-fa.phpdebugbar-fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.phpdebugbar-fa.pull-left{margin-right:.3em}.phpdebugbar-fa.pull-right{margin-left:.3em}.phpdebugbar-fa-spin{-webkit-animation:phpdebugbar-fa-spin 2s infinite linear;animation:phpdebugbar-fa-spin 2s infinite linear}.phpdebugbar-fa-pulse{-webkit-animation:phpdebugbar-fa-spin 1s infinite steps(8);animation:phpdebugbar-fa-spin 1s infinite steps(8)}@-webkit-keyframes phpdebugbar-fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes phpdebugbar-fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.phpdebugbar-fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.phpdebugbar-fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.phpdebugbar-fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.phpdebugbar-fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.phpdebugbar-fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .phpdebugbar-fa-rotate-90,:root .phpdebugbar-fa-rotate-180,:root .phpdebugbar-fa-rotate-270,:root .phpdebugbar-fa-flip-horizontal,:root .phpdebugbar-fa-flip-vertical{filter:none}.phpdebugbar-fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.phpdebugbar-fa-stack-1x,.phpdebugbar-fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.phpdebugbar-fa-stack-1x{line-height:inherit}.phpdebugbar-fa-stack-2x{font-size:2em}.phpdebugbar-fa-inverse{color:#fff}.phpdebugbar-fa-glass:before{content:"\f000"}.phpdebugbar-fa-music:before{content:"\f001"}.phpdebugbar-fa-search:before{content:"\f002"}.phpdebugbar-fa-envelope-o:before{content:"\f003"}.phpdebugbar-fa-heart:before{content:"\f004"}.phpdebugbar-fa-star:before{content:"\f005"}.phpdebugbar-fa-star-o:before{content:"\f006"}.phpdebugbar-fa-user:before{content:"\f007"}.phpdebugbar-fa-film:before{content:"\f008"}.phpdebugbar-fa-th-large:before{content:"\f009"}.phpdebugbar-fa-th:before{content:"\f00a"}.phpdebugbar-fa-th-list:before{content:"\f00b"}.phpdebugbar-fa-check:before{content:"\f00c"}.phpdebugbar-fa-remove:before,.phpdebugbar-fa-close:before,.phpdebugbar-fa-times:before{content:"\f00d"}.phpdebugbar-fa-search-plus:before{content:"\f00e"}.phpdebugbar-fa-search-minus:before{content:"\f010"}.phpdebugbar-fa-power-off:before{content:"\f011"}.phpdebugbar-fa-signal:before{content:"\f012"}.phpdebugbar-fa-gear:before,.phpdebugbar-fa-cog:before{content:"\f013"}.phpdebugbar-fa-trash-o:before{content:"\f014"}.phpdebugbar-fa-home:before{content:"\f015"}.phpdebugbar-fa-file-o:before{content:"\f016"}.phpdebugbar-fa-clock-o:before{content:"\f017"}.phpdebugbar-fa-road:before{content:"\f018"}.phpdebugbar-fa-download:before{content:"\f019"}.phpdebugbar-fa-arrow-circle-o-down:before{content:"\f01a"}.phpdebugbar-fa-arrow-circle-o-up:before{content:"\f01b"}.phpdebugbar-fa-inbox:before{content:"\f01c"}.phpdebugbar-fa-play-circle-o:before{content:"\f01d"}.phpdebugbar-fa-rotate-right:before,.phpdebugbar-fa-repeat:before{content:"\f01e"}.phpdebugbar-fa-refresh:before{content:"\f021"}.phpdebugbar-fa-list-alt:before{content:"\f022"}.phpdebugbar-fa-lock:before{content:"\f023"}.phpdebugbar-fa-flag:before{content:"\f024"}.phpdebugbar-fa-headphones:before{content:"\f025"}.phpdebugbar-fa-volume-off:before{content:"\f026"}.phpdebugbar-fa-volume-down:before{content:"\f027"}.phpdebugbar-fa-volume-up:before{content:"\f028"}.phpdebugbar-fa-qrcode:before{content:"\f029"}.phpdebugbar-fa-barcode:before{content:"\f02a"}.phpdebugbar-fa-tag:before{content:"\f02b"}.phpdebugbar-fa-tags:before{content:"\f02c"}.phpdebugbar-fa-book:before{content:"\f02d"}.phpdebugbar-fa-bookmark:before{content:"\f02e"}.phpdebugbar-fa-print:before{content:"\f02f"}.phpdebugbar-fa-camera:before{content:"\f030"}.phpdebugbar-fa-font:before{content:"\f031"}.phpdebugbar-fa-bold:before{content:"\f032"}.phpdebugbar-fa-italic:before{content:"\f033"}.phpdebugbar-fa-text-height:before{content:"\f034"}.phpdebugbar-fa-text-width:before{content:"\f035"}.phpdebugbar-fa-align-left:before{content:"\f036"}.phpdebugbar-fa-align-center:before{content:"\f037"}.phpdebugbar-fa-align-right:before{content:"\f038"}.phpdebugbar-fa-align-justify:before{content:"\f039"}.phpdebugbar-fa-list:before{content:"\f03a"}.phpdebugbar-fa-dedent:before,.phpdebugbar-fa-outdent:before{content:"\f03b"}.phpdebugbar-fa-indent:before{content:"\f03c"}.phpdebugbar-fa-video-camera:before{content:"\f03d"}.phpdebugbar-fa-photo:before,.phpdebugbar-fa-image:before,.phpdebugbar-fa-picture-o:before{content:"\f03e"}.phpdebugbar-fa-pencil:before{content:"\f040"}.phpdebugbar-fa-map-marker:before{content:"\f041"}.phpdebugbar-fa-adjust:before{content:"\f042"}.phpdebugbar-fa-tint:before{content:"\f043"}.phpdebugbar-fa-edit:before,.phpdebugbar-fa-pencil-square-o:before{content:"\f044"}.phpdebugbar-fa-share-square-o:before{content:"\f045"}.phpdebugbar-fa-check-square-o:before{content:"\f046"}.phpdebugbar-fa-arrows:before{content:"\f047"}.phpdebugbar-fa-step-backward:before{content:"\f048"}.phpdebugbar-fa-fast-backward:before{content:"\f049"}.phpdebugbar-fa-backward:before{content:"\f04a"}.phpdebugbar-fa-play:before{content:"\f04b"}.phpdebugbar-fa-pause:before{content:"\f04c"}.phpdebugbar-fa-stop:before{content:"\f04d"}.phpdebugbar-fa-forward:before{content:"\f04e"}.phpdebugbar-fa-fast-forward:before{content:"\f050"}.phpdebugbar-fa-step-forward:before{content:"\f051"}.phpdebugbar-fa-eject:before{content:"\f052"}.phpdebugbar-fa-chevron-left:before{content:"\f053"}.phpdebugbar-fa-chevron-right:before{content:"\f054"}.phpdebugbar-fa-plus-circle:before{content:"\f055"}.phpdebugbar-fa-minus-circle:before{content:"\f056"}.phpdebugbar-fa-times-circle:before{content:"\f057"}.phpdebugbar-fa-check-circle:before{content:"\f058"}.phpdebugbar-fa-question-circle:before{content:"\f059"}.phpdebugbar-fa-info-circle:before{content:"\f05a"}.phpdebugbar-fa-crosshairs:before{content:"\f05b"}.phpdebugbar-fa-times-circle-o:before{content:"\f05c"}.phpdebugbar-fa-check-circle-o:before{content:"\f05d"}.phpdebugbar-fa-ban:before{content:"\f05e"}.phpdebugbar-fa-arrow-left:before{content:"\f060"}.phpdebugbar-fa-arrow-right:before{content:"\f061"}.phpdebugbar-fa-arrow-up:before{content:"\f062"}.phpdebugbar-fa-arrow-down:before{content:"\f063"}.phpdebugbar-fa-mail-forward:before,.phpdebugbar-fa-share:before{content:"\f064"}.phpdebugbar-fa-expand:before{content:"\f065"}.phpdebugbar-fa-compress:before{content:"\f066"}.phpdebugbar-fa-plus:before{content:"\f067"}.phpdebugbar-fa-minus:before{content:"\f068"}.phpdebugbar-fa-asterisk:before{content:"\f069"}.phpdebugbar-fa-exclamation-circle:before{content:"\f06a"}.phpdebugbar-fa-gift:before{content:"\f06b"}.phpdebugbar-fa-leaf:before{content:"\f06c"}.phpdebugbar-fa-fire:before{content:"\f06d"}.phpdebugbar-fa-eye:before{content:"\f06e"}.phpdebugbar-fa-eye-slash:before{content:"\f070"}.phpdebugbar-fa-warning:before,.phpdebugbar-fa-exclamation-triangle:before{content:"\f071"}.phpdebugbar-fa-plane:before{content:"\f072"}.phpdebugbar-fa-calendar:before{content:"\f073"}.phpdebugbar-fa-random:before{content:"\f074"}.phpdebugbar-fa-comment:before{content:"\f075"}.phpdebugbar-fa-magnet:before{content:"\f076"}.phpdebugbar-fa-chevron-up:before{content:"\f077"}.phpdebugbar-fa-chevron-down:before{content:"\f078"}.phpdebugbar-fa-retweet:before{content:"\f079"}.phpdebugbar-fa-shopping-cart:before{content:"\f07a"}.phpdebugbar-fa-folder:before{content:"\f07b"}.phpdebugbar-fa-folder-open:before{content:"\f07c"}.phpdebugbar-fa-arrows-v:before{content:"\f07d"}.phpdebugbar-fa-arrows-h:before{content:"\f07e"}.phpdebugbar-fa-bar-chart-o:before,.phpdebugbar-fa-bar-chart:before{content:"\f080"}.phpdebugbar-fa-twitter-square:before{content:"\f081"}.phpdebugbar-fa-facebook-square:before{content:"\f082"}.phpdebugbar-fa-camera-retro:before{content:"\f083"}.phpdebugbar-fa-key:before{content:"\f084"}.phpdebugbar-fa-gears:before,.phpdebugbar-fa-cogs:before{content:"\f085"}.phpdebugbar-fa-comments:before{content:"\f086"}.phpdebugbar-fa-thumbs-o-up:before{content:"\f087"}.phpdebugbar-fa-thumbs-o-down:before{content:"\f088"}.phpdebugbar-fa-star-half:before{content:"\f089"}.phpdebugbar-fa-heart-o:before{content:"\f08a"}.phpdebugbar-fa-sign-out:before{content:"\f08b"}.phpdebugbar-fa-linkedin-square:before{content:"\f08c"}.phpdebugbar-fa-thumb-tack:before{content:"\f08d"}.phpdebugbar-fa-external-link:before{content:"\f08e"}.phpdebugbar-fa-sign-in:before{content:"\f090"}.phpdebugbar-fa-trophy:before{content:"\f091"}.phpdebugbar-fa-github-square:before{content:"\f092"}.phpdebugbar-fa-upload:before{content:"\f093"}.phpdebugbar-fa-lemon-o:before{content:"\f094"}.phpdebugbar-fa-phone:before{content:"\f095"}.phpdebugbar-fa-square-o:before{content:"\f096"}.phpdebugbar-fa-bookmark-o:before{content:"\f097"}.phpdebugbar-fa-phone-square:before{content:"\f098"}.phpdebugbar-fa-twitter:before{content:"\f099"}.phpdebugbar-fa-facebook-f:before,.phpdebugbar-fa-facebook:before{content:"\f09a"}.phpdebugbar-fa-github:before{content:"\f09b"}.phpdebugbar-fa-unlock:before{content:"\f09c"}.phpdebugbar-fa-credit-card:before{content:"\f09d"}.phpdebugbar-fa-feed:before,.phpdebugbar-fa-rss:before{content:"\f09e"}.phpdebugbar-fa-hdd-o:before{content:"\f0a0"}.phpdebugbar-fa-bullhorn:before{content:"\f0a1"}.phpdebugbar-fa-bell:before{content:"\f0f3"}.phpdebugbar-fa-certificate:before{content:"\f0a3"}.phpdebugbar-fa-hand-o-right:before{content:"\f0a4"}.phpdebugbar-fa-hand-o-left:before{content:"\f0a5"}.phpdebugbar-fa-hand-o-up:before{content:"\f0a6"}.phpdebugbar-fa-hand-o-down:before{content:"\f0a7"}.phpdebugbar-fa-arrow-circle-left:before{content:"\f0a8"}.phpdebugbar-fa-arrow-circle-right:before{content:"\f0a9"}.phpdebugbar-fa-arrow-circle-up:before{content:"\f0aa"}.phpdebugbar-fa-arrow-circle-down:before{content:"\f0ab"}.phpdebugbar-fa-globe:before{content:"\f0ac"}.phpdebugbar-fa-wrench:before{content:"\f0ad"}.phpdebugbar-fa-tasks:before{content:"\f0ae"}.phpdebugbar-fa-filter:before{content:"\f0b0"}.phpdebugbar-fa-briefcase:before{content:"\f0b1"}.phpdebugbar-fa-arrows-alt:before{content:"\f0b2"}.phpdebugbar-fa-group:before,.phpdebugbar-fa-users:before{content:"\f0c0"}.phpdebugbar-fa-chain:before,.phpdebugbar-fa-link:before{content:"\f0c1"}.phpdebugbar-fa-cloud:before{content:"\f0c2"}.phpdebugbar-fa-flask:before{content:"\f0c3"}.phpdebugbar-fa-cut:before,.phpdebugbar-fa-scissors:before{content:"\f0c4"}.phpdebugbar-fa-copy:before,.phpdebugbar-fa-files-o:before{content:"\f0c5"}.phpdebugbar-fa-paperclip:before{content:"\f0c6"}.phpdebugbar-fa-save:before,.phpdebugbar-fa-floppy-o:before{content:"\f0c7"}.phpdebugbar-fa-square:before{content:"\f0c8"}.phpdebugbar-fa-navicon:before,.phpdebugbar-fa-reorder:before,.phpdebugbar-fa-bars:before{content:"\f0c9"}.phpdebugbar-fa-list-ul:before{content:"\f0ca"}.phpdebugbar-fa-list-ol:before{content:"\f0cb"}.phpdebugbar-fa-strikethrough:before{content:"\f0cc"}.phpdebugbar-fa-underline:before{content:"\f0cd"}.phpdebugbar-fa-table:before{content:"\f0ce"}.phpdebugbar-fa-magic:before{content:"\f0d0"}.phpdebugbar-fa-truck:before{content:"\f0d1"}.phpdebugbar-fa-pinterest:before{content:"\f0d2"}.phpdebugbar-fa-pinterest-square:before{content:"\f0d3"}.phpdebugbar-fa-google-plus-square:before{content:"\f0d4"}.phpdebugbar-fa-google-plus:before{content:"\f0d5"}.phpdebugbar-fa-money:before{content:"\f0d6"}.phpdebugbar-fa-caret-down:before{content:"\f0d7"}.phpdebugbar-fa-caret-up:before{content:"\f0d8"}.phpdebugbar-fa-caret-left:before{content:"\f0d9"}.phpdebugbar-fa-caret-right:before{content:"\f0da"}.phpdebugbar-fa-columns:before{content:"\f0db"}.phpdebugbar-fa-unsorted:before,.phpdebugbar-fa-sort:before{content:"\f0dc"}.phpdebugbar-fa-sort-down:before,.phpdebugbar-fa-sort-desc:before{content:"\f0dd"}.phpdebugbar-fa-sort-up:before,.phpdebugbar-fa-sort-asc:before{content:"\f0de"}.phpdebugbar-fa-envelope:before{content:"\f0e0"}.phpdebugbar-fa-linkedin:before{content:"\f0e1"}.phpdebugbar-fa-rotate-left:before,.phpdebugbar-fa-undo:before{content:"\f0e2"}.phpdebugbar-fa-legal:before,.phpdebugbar-fa-gavel:before{content:"\f0e3"}.phpdebugbar-fa-dashboard:before,.phpdebugbar-fa-tachometer:before{content:"\f0e4"}.phpdebugbar-fa-comment-o:before{content:"\f0e5"}.phpdebugbar-fa-comments-o:before{content:"\f0e6"}.phpdebugbar-fa-flash:before,.phpdebugbar-fa-bolt:before{content:"\f0e7"}.phpdebugbar-fa-sitemap:before{content:"\f0e8"}.phpdebugbar-fa-umbrella:before{content:"\f0e9"}.phpdebugbar-fa-paste:before,.phpdebugbar-fa-clipboard:before{content:"\f0ea"}.phpdebugbar-fa-lightbulb-o:before{content:"\f0eb"}.phpdebugbar-fa-exchange:before{content:"\f0ec"}.phpdebugbar-fa-cloud-download:before{content:"\f0ed"}.phpdebugbar-fa-cloud-upload:before{content:"\f0ee"}.phpdebugbar-fa-user-md:before{content:"\f0f0"}.phpdebugbar-fa-stethoscope:before{content:"\f0f1"}.phpdebugbar-fa-suitcase:before{content:"\f0f2"}.phpdebugbar-fa-bell-o:before{content:"\f0a2"}.phpdebugbar-fa-coffee:before{content:"\f0f4"}.phpdebugbar-fa-cutlery:before{content:"\f0f5"}.phpdebugbar-fa-file-text-o:before{content:"\f0f6"}.phpdebugbar-fa-building-o:before{content:"\f0f7"}.phpdebugbar-fa-hospital-o:before{content:"\f0f8"}.phpdebugbar-fa-ambulance:before{content:"\f0f9"}.phpdebugbar-fa-medkit:before{content:"\f0fa"}.phpdebugbar-fa-fighter-jet:before{content:"\f0fb"}.phpdebugbar-fa-beer:before{content:"\f0fc"}.phpdebugbar-fa-h-square:before{content:"\f0fd"}.phpdebugbar-fa-plus-square:before{content:"\f0fe"}.phpdebugbar-fa-angle-double-left:before{content:"\f100"}.phpdebugbar-fa-angle-double-right:before{content:"\f101"}.phpdebugbar-fa-angle-double-up:before{content:"\f102"}.phpdebugbar-fa-angle-double-down:before{content:"\f103"}.phpdebugbar-fa-angle-left:before{content:"\f104"}.phpdebugbar-fa-angle-right:before{content:"\f105"}.phpdebugbar-fa-angle-up:before{content:"\f106"}.phpdebugbar-fa-angle-down:before{content:"\f107"}.phpdebugbar-fa-desktop:before{content:"\f108"}.phpdebugbar-fa-laptop:before{content:"\f109"}.phpdebugbar-fa-tablet:before{content:"\f10a"}.phpdebugbar-fa-mobile-phone:before,.phpdebugbar-fa-mobile:before{content:"\f10b"}.phpdebugbar-fa-circle-o:before{content:"\f10c"}.phpdebugbar-fa-quote-left:before{content:"\f10d"}.phpdebugbar-fa-quote-right:before{content:"\f10e"}.phpdebugbar-fa-spinner:before{content:"\f110"}.phpdebugbar-fa-circle:before{content:"\f111"}.phpdebugbar-fa-mail-reply:before,.phpdebugbar-fa-reply:before{content:"\f112"}.phpdebugbar-fa-github-alt:before{content:"\f113"}.phpdebugbar-fa-folder-o:before{content:"\f114"}.phpdebugbar-fa-folder-open-o:before{content:"\f115"}.phpdebugbar-fa-smile-o:before{content:"\f118"}.phpdebugbar-fa-frown-o:before{content:"\f119"}.phpdebugbar-fa-meh-o:before{content:"\f11a"}.phpdebugbar-fa-gamepad:before{content:"\f11b"}.phpdebugbar-fa-keyboard-o:before{content:"\f11c"}.phpdebugbar-fa-flag-o:before{content:"\f11d"}.phpdebugbar-fa-flag-checkered:before{content:"\f11e"}.phpdebugbar-fa-terminal:before{content:"\f120"}.phpdebugbar-fa-code:before{content:"\f121"}.phpdebugbar-fa-mail-reply-all:before,.phpdebugbar-fa-reply-all:before{content:"\f122"}.phpdebugbar-fa-star-half-empty:before,.phpdebugbar-fa-star-half-full:before,.phpdebugbar-fa-star-half-o:before{content:"\f123"}.phpdebugbar-fa-location-arrow:before{content:"\f124"}.phpdebugbar-fa-crop:before{content:"\f125"}.phpdebugbar-fa-code-fork:before{content:"\f126"}.phpdebugbar-fa-unlink:before,.phpdebugbar-fa-chain-broken:before{content:"\f127"}.phpdebugbar-fa-question:before{content:"\f128"}.phpdebugbar-fa-info:before{content:"\f129"}.phpdebugbar-fa-exclamation:before{content:"\f12a"}.phpdebugbar-fa-superscript:before{content:"\f12b"}.phpdebugbar-fa-subscript:before{content:"\f12c"}.phpdebugbar-fa-eraser:before{content:"\f12d"}.phpdebugbar-fa-puzzle-piece:before{content:"\f12e"}.phpdebugbar-fa-microphone:before{content:"\f130"}.phpdebugbar-fa-microphone-slash:before{content:"\f131"}.phpdebugbar-fa-shield:before{content:"\f132"}.phpdebugbar-fa-calendar-o:before{content:"\f133"}.phpdebugbar-fa-fire-extinguisher:before{content:"\f134"}.phpdebugbar-fa-rocket:before{content:"\f135"}.phpdebugbar-fa-maxcdn:before{content:"\f136"}.phpdebugbar-fa-chevron-circle-left:before{content:"\f137"}.phpdebugbar-fa-chevron-circle-right:before{content:"\f138"}.phpdebugbar-fa-chevron-circle-up:before{content:"\f139"}.phpdebugbar-fa-chevron-circle-down:before{content:"\f13a"}.phpdebugbar-fa-html5:before{content:"\f13b"}.phpdebugbar-fa-css3:before{content:"\f13c"}.phpdebugbar-fa-anchor:before{content:"\f13d"}.phpdebugbar-fa-unlock-alt:before{content:"\f13e"}.phpdebugbar-fa-bullseye:before{content:"\f140"}.phpdebugbar-fa-ellipsis-h:before{content:"\f141"}.phpdebugbar-fa-ellipsis-v:before{content:"\f142"}.phpdebugbar-fa-rss-square:before{content:"\f143"}.phpdebugbar-fa-play-circle:before{content:"\f144"}.phpdebugbar-fa-ticket:before{content:"\f145"}.phpdebugbar-fa-minus-square:before{content:"\f146"}.phpdebugbar-fa-minus-square-o:before{content:"\f147"}.phpdebugbar-fa-level-up:before{content:"\f148"}.phpdebugbar-fa-level-down:before{content:"\f149"}.phpdebugbar-fa-check-square:before{content:"\f14a"}.phpdebugbar-fa-pencil-square:before{content:"\f14b"}.phpdebugbar-fa-external-link-square:before{content:"\f14c"}.phpdebugbar-fa-share-square:before{content:"\f14d"}.phpdebugbar-fa-compass:before{content:"\f14e"}.phpdebugbar-fa-toggle-down:before,.phpdebugbar-fa-caret-square-o-down:before{content:"\f150"}.phpdebugbar-fa-toggle-up:before,.phpdebugbar-fa-caret-square-o-up:before{content:"\f151"}.phpdebugbar-fa-toggle-right:before,.phpdebugbar-fa-caret-square-o-right:before{content:"\f152"}.phpdebugbar-fa-euro:before,.phpdebugbar-fa-eur:before{content:"\f153"}.phpdebugbar-fa-gbp:before{content:"\f154"}.phpdebugbar-fa-dollar:before,.phpdebugbar-fa-usd:before{content:"\f155"}.phpdebugbar-fa-rupee:before,.phpdebugbar-fa-inr:before{content:"\f156"}.phpdebugbar-fa-cny:before,.phpdebugbar-fa-rmb:before,.phpdebugbar-fa-yen:before,.phpdebugbar-fa-jpy:before{content:"\f157"}.phpdebugbar-fa-ruble:before,.phpdebugbar-fa-rouble:before,.phpdebugbar-fa-rub:before{content:"\f158"}.phpdebugbar-fa-won:before,.phpdebugbar-fa-krw:before{content:"\f159"}.phpdebugbar-fa-bitcoin:before,.phpdebugbar-fa-btc:before{content:"\f15a"}.phpdebugbar-fa-file:before{content:"\f15b"}.phpdebugbar-fa-file-text:before{content:"\f15c"}.phpdebugbar-fa-sort-alpha-asc:before{content:"\f15d"}.phpdebugbar-fa-sort-alpha-desc:before{content:"\f15e"}.phpdebugbar-fa-sort-amount-asc:before{content:"\f160"}.phpdebugbar-fa-sort-amount-desc:before{content:"\f161"}.phpdebugbar-fa-sort-numeric-asc:before{content:"\f162"}.phpdebugbar-fa-sort-numeric-desc:before{content:"\f163"}.phpdebugbar-fa-thumbs-up:before{content:"\f164"}.phpdebugbar-fa-thumbs-down:before{content:"\f165"}.phpdebugbar-fa-youtube-square:before{content:"\f166"}.phpdebugbar-fa-youtube:before{content:"\f167"}.phpdebugbar-fa-xing:before{content:"\f168"}.phpdebugbar-fa-xing-square:before{content:"\f169"}.phpdebugbar-fa-youtube-play:before{content:"\f16a"}.phpdebugbar-fa-dropbox:before{content:"\f16b"}.phpdebugbar-fa-stack-overflow:before{content:"\f16c"}.phpdebugbar-fa-instagram:before{content:"\f16d"}.phpdebugbar-fa-flickr:before{content:"\f16e"}.phpdebugbar-fa-adn:before{content:"\f170"}.phpdebugbar-fa-bitbucket:before{content:"\f171"}.phpdebugbar-fa-bitbucket-square:before{content:"\f172"}.phpdebugbar-fa-tumblr:before{content:"\f173"}.phpdebugbar-fa-tumblr-square:before{content:"\f174"}.phpdebugbar-fa-long-arrow-down:before{content:"\f175"}.phpdebugbar-fa-long-arrow-up:before{content:"\f176"}.phpdebugbar-fa-long-arrow-left:before{content:"\f177"}.phpdebugbar-fa-long-arrow-right:before{content:"\f178"}.phpdebugbar-fa-apple:before{content:"\f179"}.phpdebugbar-fa-windows:before{content:"\f17a"}.phpdebugbar-fa-android:before{content:"\f17b"}.phpdebugbar-fa-linux:before{content:"\f17c"}.phpdebugbar-fa-dribbble:before{content:"\f17d"}.phpdebugbar-fa-skype:before{content:"\f17e"}.phpdebugbar-fa-foursquare:before{content:"\f180"}.phpdebugbar-fa-trello:before{content:"\f181"}.phpdebugbar-fa-female:before{content:"\f182"}.phpdebugbar-fa-male:before{content:"\f183"}.phpdebugbar-fa-gittip:before,.phpdebugbar-fa-gratipay:before{content:"\f184"}.phpdebugbar-fa-sun-o:before{content:"\f185"}.phpdebugbar-fa-moon-o:before{content:"\f186"}.phpdebugbar-fa-archive:before{content:"\f187"}.phpdebugbar-fa-bug:before{content:"\f188"}.phpdebugbar-fa-vk:before{content:"\f189"}.phpdebugbar-fa-weibo:before{content:"\f18a"}.phpdebugbar-fa-renren:before{content:"\f18b"}.phpdebugbar-fa-pagelines:before{content:"\f18c"}.phpdebugbar-fa-stack-exchange:before{content:"\f18d"}.phpdebugbar-fa-arrow-circle-o-right:before{content:"\f18e"}.phpdebugbar-fa-arrow-circle-o-left:before{content:"\f190"}.phpdebugbar-fa-toggle-left:before,.phpdebugbar-fa-caret-square-o-left:before{content:"\f191"}.phpdebugbar-fa-dot-circle-o:before{content:"\f192"}.phpdebugbar-fa-wheelchair:before{content:"\f193"}.phpdebugbar-fa-vimeo-square:before{content:"\f194"}.phpdebugbar-fa-turkish-lira:before,.phpdebugbar-fa-try:before{content:"\f195"}.phpdebugbar-fa-plus-square-o:before{content:"\f196"}.phpdebugbar-fa-space-shuttle:before{content:"\f197"}.phpdebugbar-fa-slack:before{content:"\f198"}.phpdebugbar-fa-envelope-square:before{content:"\f199"}.phpdebugbar-fa-wordpress:before{content:"\f19a"}.phpdebugbar-fa-openid:before{content:"\f19b"}.phpdebugbar-fa-institution:before,.phpdebugbar-fa-bank:before,.phpdebugbar-fa-university:before{content:"\f19c"}.phpdebugbar-fa-mortar-board:before,.phpdebugbar-fa-graduation-cap:before{content:"\f19d"}.phpdebugbar-fa-yahoo:before{content:"\f19e"}.phpdebugbar-fa-google:before{content:"\f1a0"}.phpdebugbar-fa-reddit:before{content:"\f1a1"}.phpdebugbar-fa-reddit-square:before{content:"\f1a2"}.phpdebugbar-fa-stumbleupon-circle:before{content:"\f1a3"}.phpdebugbar-fa-stumbleupon:before{content:"\f1a4"}.phpdebugbar-fa-delicious:before{content:"\f1a5"}.phpdebugbar-fa-digg:before{content:"\f1a6"}.phpdebugbar-fa-pied-piper-pp:before{content:"\f1a7"}.phpdebugbar-fa-pied-piper-alt:before{content:"\f1a8"}.phpdebugbar-fa-drupal:before{content:"\f1a9"}.phpdebugbar-fa-joomla:before{content:"\f1aa"}.phpdebugbar-fa-language:before{content:"\f1ab"}.phpdebugbar-fa-fax:before{content:"\f1ac"}.phpdebugbar-fa-building:before{content:"\f1ad"}.phpdebugbar-fa-child:before{content:"\f1ae"}.phpdebugbar-fa-paw:before{content:"\f1b0"}.phpdebugbar-fa-spoon:before{content:"\f1b1"}.phpdebugbar-fa-cube:before{content:"\f1b2"}.phpdebugbar-fa-cubes:before{content:"\f1b3"}.phpdebugbar-fa-behance:before{content:"\f1b4"}.phpdebugbar-fa-behance-square:before{content:"\f1b5"}.phpdebugbar-fa-steam:before{content:"\f1b6"}.phpdebugbar-fa-steam-square:before{content:"\f1b7"}.phpdebugbar-fa-recycle:before{content:"\f1b8"}.phpdebugbar-fa-automobile:before,.phpdebugbar-fa-car:before{content:"\f1b9"}.phpdebugbar-fa-cab:before,.phpdebugbar-fa-taxi:before{content:"\f1ba"}.phpdebugbar-fa-tree:before{content:"\f1bb"}.phpdebugbar-fa-spotify:before{content:"\f1bc"}.phpdebugbar-fa-deviantart:before{content:"\f1bd"}.phpdebugbar-fa-soundcloud:before{content:"\f1be"}.phpdebugbar-fa-database:before{content:"\f1c0"}.phpdebugbar-fa-file-pdf-o:before{content:"\f1c1"}.phpdebugbar-fa-file-word-o:before{content:"\f1c2"}.phpdebugbar-fa-file-excel-o:before{content:"\f1c3"}.phpdebugbar-fa-file-powerpoint-o:before{content:"\f1c4"}.phpdebugbar-fa-file-photo-o:before,.phpdebugbar-fa-file-picture-o:before,.phpdebugbar-fa-file-image-o:before{content:"\f1c5"}.phpdebugbar-fa-file-zip-o:before,.phpdebugbar-fa-file-archive-o:before{content:"\f1c6"}.phpdebugbar-fa-file-sound-o:before,.phpdebugbar-fa-file-audio-o:before{content:"\f1c7"}.phpdebugbar-fa-file-movie-o:before,.phpdebugbar-fa-file-video-o:before{content:"\f1c8"}.phpdebugbar-fa-file-code-o:before{content:"\f1c9"}.phpdebugbar-fa-vine:before{content:"\f1ca"}.phpdebugbar-fa-codepen:before{content:"\f1cb"}.phpdebugbar-fa-jsfiddle:before{content:"\f1cc"}.phpdebugbar-fa-life-bouy:before,.phpdebugbar-fa-life-buoy:before,.phpdebugbar-fa-life-saver:before,.phpdebugbar-fa-support:before,.phpdebugbar-fa-life-ring:before{content:"\f1cd"}.phpdebugbar-fa-circle-o-notch:before{content:"\f1ce"}.phpdebugbar-fa-ra:before,.phpdebugbar-fa-resistance:before,.phpdebugbar-fa-rebel:before{content:"\f1d0"}.phpdebugbar-fa-ge:before,.phpdebugbar-fa-empire:before{content:"\f1d1"}.phpdebugbar-fa-git-square:before{content:"\f1d2"}.phpdebugbar-fa-git:before{content:"\f1d3"}.phpdebugbar-fa-y-combinator-square:before,.phpdebugbar-fa-yc-square:before,.phpdebugbar-fa-hacker-news:before{content:"\f1d4"}.phpdebugbar-fa-tencent-weibo:before{content:"\f1d5"}.phpdebugbar-fa-qq:before{content:"\f1d6"}.phpdebugbar-fa-wechat:before,.phpdebugbar-fa-weixin:before{content:"\f1d7"}.phpdebugbar-fa-send:before,.phpdebugbar-fa-paper-plane:before{content:"\f1d8"}.phpdebugbar-fa-send-o:before,.phpdebugbar-fa-paper-plane-o:before{content:"\f1d9"}.phpdebugbar-fa-history:before{content:"\f1da"}.phpdebugbar-fa-circle-thin:before{content:"\f1db"}.phpdebugbar-fa-header:before{content:"\f1dc"}.phpdebugbar-fa-paragraph:before{content:"\f1dd"}.phpdebugbar-fa-sliders:before{content:"\f1de"}.phpdebugbar-fa-share-alt:before{content:"\f1e0"}.phpdebugbar-fa-share-alt-square:before{content:"\f1e1"}.phpdebugbar-fa-bomb:before{content:"\f1e2"}.phpdebugbar-fa-soccer-ball-o:before,.phpdebugbar-fa-futbol-o:before{content:"\f1e3"}.phpdebugbar-fa-tty:before{content:"\f1e4"}.phpdebugbar-fa-binoculars:before{content:"\f1e5"}.phpdebugbar-fa-plug:before{content:"\f1e6"}.phpdebugbar-fa-slideshare:before{content:"\f1e7"}.phpdebugbar-fa-twitch:before{content:"\f1e8"}.phpdebugbar-fa-yelp:before{content:"\f1e9"}.phpdebugbar-fa-newspaper-o:before{content:"\f1ea"}.phpdebugbar-fa-wifi:before{content:"\f1eb"}.phpdebugbar-fa-calculator:before{content:"\f1ec"}.phpdebugbar-fa-paypal:before{content:"\f1ed"}.phpdebugbar-fa-google-wallet:before{content:"\f1ee"}.phpdebugbar-fa-cc-visa:before{content:"\f1f0"}.phpdebugbar-fa-cc-mastercard:before{content:"\f1f1"}.phpdebugbar-fa-cc-discover:before{content:"\f1f2"}.phpdebugbar-fa-cc-amex:before{content:"\f1f3"}.phpdebugbar-fa-cc-paypal:before{content:"\f1f4"}.phpdebugbar-fa-cc-stripe:before{content:"\f1f5"}.phpdebugbar-fa-bell-slash:before{content:"\f1f6"}.phpdebugbar-fa-bell-slash-o:before{content:"\f1f7"}.phpdebugbar-fa-trash:before{content:"\f1f8"}.phpdebugbar-fa-copyright:before{content:"\f1f9"}.phpdebugbar-fa-at:before{content:"\f1fa"}.phpdebugbar-fa-eyedropper:before{content:"\f1fb"}.phpdebugbar-fa-paint-brush:before{content:"\f1fc"}.phpdebugbar-fa-birthday-cake:before{content:"\f1fd"}.phpdebugbar-fa-area-chart:before{content:"\f1fe"}.phpdebugbar-fa-pie-chart:before{content:"\f200"}.phpdebugbar-fa-line-chart:before{content:"\f201"}.phpdebugbar-fa-lastfm:before{content:"\f202"}.phpdebugbar-fa-lastfm-square:before{content:"\f203"}.phpdebugbar-fa-toggle-off:before{content:"\f204"}.phpdebugbar-fa-toggle-on:before{content:"\f205"}.phpdebugbar-fa-bicycle:before{content:"\f206"}.phpdebugbar-fa-bus:before{content:"\f207"}.phpdebugbar-fa-ioxhost:before{content:"\f208"}.phpdebugbar-fa-angellist:before{content:"\f209"}.phpdebugbar-fa-cc:before{content:"\f20a"}.phpdebugbar-fa-shekel:before,.phpdebugbar-fa-sheqel:before,.phpdebugbar-fa-ils:before{content:"\f20b"}.phpdebugbar-fa-meanpath:before{content:"\f20c"}.phpdebugbar-fa-buysellads:before{content:"\f20d"}.phpdebugbar-fa-connectdevelop:before{content:"\f20e"}.phpdebugbar-fa-dashcube:before{content:"\f210"}.phpdebugbar-fa-forumbee:before{content:"\f211"}.phpdebugbar-fa-leanpub:before{content:"\f212"}.phpdebugbar-fa-sellsy:before{content:"\f213"}.phpdebugbar-fa-shirtsinbulk:before{content:"\f214"}.phpdebugbar-fa-simplybuilt:before{content:"\f215"}.phpdebugbar-fa-skyatlas:before{content:"\f216"}.phpdebugbar-fa-cart-plus:before{content:"\f217"}.phpdebugbar-fa-cart-arrow-down:before{content:"\f218"}.phpdebugbar-fa-diamond:before{content:"\f219"}.phpdebugbar-fa-ship:before{content:"\f21a"}.phpdebugbar-fa-user-secret:before{content:"\f21b"}.phpdebugbar-fa-motorcycle:before{content:"\f21c"}.phpdebugbar-fa-street-view:before{content:"\f21d"}.phpdebugbar-fa-heartbeat:before{content:"\f21e"}.phpdebugbar-fa-venus:before{content:"\f221"}.phpdebugbar-fa-mars:before{content:"\f222"}.phpdebugbar-fa-mercury:before{content:"\f223"}.phpdebugbar-fa-intersex:before,.phpdebugbar-fa-transgender:before{content:"\f224"}.phpdebugbar-fa-transgender-alt:before{content:"\f225"}.phpdebugbar-fa-venus-double:before{content:"\f226"}.phpdebugbar-fa-mars-double:before{content:"\f227"}.phpdebugbar-fa-venus-mars:before{content:"\f228"}.phpdebugbar-fa-mars-stroke:before{content:"\f229"}.phpdebugbar-fa-mars-stroke-v:before{content:"\f22a"}.phpdebugbar-fa-mars-stroke-h:before{content:"\f22b"}.phpdebugbar-fa-neuter:before{content:"\f22c"}.phpdebugbar-fa-genderless:before{content:"\f22d"}.phpdebugbar-fa-facebook-official:before{content:"\f230"}.phpdebugbar-fa-pinterest-p:before{content:"\f231"}.phpdebugbar-fa-whatsapp:before{content:"\f232"}.phpdebugbar-fa-server:before{content:"\f233"}.phpdebugbar-fa-user-plus:before{content:"\f234"}.phpdebugbar-fa-user-times:before{content:"\f235"}.phpdebugbar-fa-hotel:before,.phpdebugbar-fa-bed:before{content:"\f236"}.phpdebugbar-fa-viacoin:before{content:"\f237"}.phpdebugbar-fa-train:before{content:"\f238"}.phpdebugbar-fa-subway:before{content:"\f239"}.phpdebugbar-fa-medium:before{content:"\f23a"}.phpdebugbar-fa-yc:before,.phpdebugbar-fa-y-combinator:before{content:"\f23b"}.phpdebugbar-fa-optin-monster:before{content:"\f23c"}.phpdebugbar-fa-opencart:before{content:"\f23d"}.phpdebugbar-fa-expeditedssl:before{content:"\f23e"}.phpdebugbar-fa-battery-4:before,.phpdebugbar-fa-battery:before,.phpdebugbar-fa-battery-full:before{content:"\f240"}.phpdebugbar-fa-battery-3:before,.phpdebugbar-fa-battery-three-quarters:before{content:"\f241"}.phpdebugbar-fa-battery-2:before,.phpdebugbar-fa-battery-half:before{content:"\f242"}.phpdebugbar-fa-battery-1:before,.phpdebugbar-fa-battery-quarter:before{content:"\f243"}.phpdebugbar-fa-battery-0:before,.phpdebugbar-fa-battery-empty:before{content:"\f244"}.phpdebugbar-fa-mouse-pointer:before{content:"\f245"}.phpdebugbar-fa-i-cursor:before{content:"\f246"}.phpdebugbar-fa-object-group:before{content:"\f247"}.phpdebugbar-fa-object-ungroup:before{content:"\f248"}.phpdebugbar-fa-sticky-note:before{content:"\f249"}.phpdebugbar-fa-sticky-note-o:before{content:"\f24a"}.phpdebugbar-fa-cc-jcb:before{content:"\f24b"}.phpdebugbar-fa-cc-diners-club:before{content:"\f24c"}.phpdebugbar-fa-clone:before{content:"\f24d"}.phpdebugbar-fa-balance-scale:before{content:"\f24e"}.phpdebugbar-fa-hourglass-o:before{content:"\f250"}.phpdebugbar-fa-hourglass-1:before,.phpdebugbar-fa-hourglass-start:before{content:"\f251"}.phpdebugbar-fa-hourglass-2:before,.phpdebugbar-fa-hourglass-half:before{content:"\f252"}.phpdebugbar-fa-hourglass-3:before,.phpdebugbar-fa-hourglass-end:before{content:"\f253"}.phpdebugbar-fa-hourglass:before{content:"\f254"}.phpdebugbar-fa-hand-grab-o:before,.phpdebugbar-fa-hand-rock-o:before{content:"\f255"}.phpdebugbar-fa-hand-stop-o:before,.phpdebugbar-fa-hand-paper-o:before{content:"\f256"}.phpdebugbar-fa-hand-scissors-o:before{content:"\f257"}.phpdebugbar-fa-hand-lizard-o:before{content:"\f258"}.phpdebugbar-fa-hand-spock-o:before{content:"\f259"}.phpdebugbar-fa-hand-pointer-o:before{content:"\f25a"}.phpdebugbar-fa-hand-peace-o:before{content:"\f25b"}.phpdebugbar-fa-trademark:before{content:"\f25c"}.phpdebugbar-fa-registered:before{content:"\f25d"}.phpdebugbar-fa-creative-commons:before{content:"\f25e"}.phpdebugbar-fa-gg:before{content:"\f260"}.phpdebugbar-fa-gg-circle:before{content:"\f261"}.phpdebugbar-fa-tripadvisor:before{content:"\f262"}.phpdebugbar-fa-odnoklassniki:before{content:"\f263"}.phpdebugbar-fa-odnoklassniki-square:before{content:"\f264"}.phpdebugbar-fa-get-pocket:before{content:"\f265"}.phpdebugbar-fa-wikipedia-w:before{content:"\f266"}.phpdebugbar-fa-safari:before{content:"\f267"}.phpdebugbar-fa-chrome:before{content:"\f268"}.phpdebugbar-fa-firefox:before{content:"\f269"}.phpdebugbar-fa-opera:before{content:"\f26a"}.phpdebugbar-fa-internet-explorer:before{content:"\f26b"}.phpdebugbar-fa-tv:before,.phpdebugbar-fa-television:before{content:"\f26c"}.phpdebugbar-fa-contao:before{content:"\f26d"}.phpdebugbar-fa-500px:before{content:"\f26e"}.phpdebugbar-fa-amazon:before{content:"\f270"}.phpdebugbar-fa-calendar-plus-o:before{content:"\f271"}.phpdebugbar-fa-calendar-minus-o:before{content:"\f272"}.phpdebugbar-fa-calendar-times-o:before{content:"\f273"}.phpdebugbar-fa-calendar-check-o:before{content:"\f274"}.phpdebugbar-fa-industry:before{content:"\f275"}.phpdebugbar-fa-map-pin:before{content:"\f276"}.phpdebugbar-fa-map-signs:before{content:"\f277"}.phpdebugbar-fa-map-o:before{content:"\f278"}.phpdebugbar-fa-map:before{content:"\f279"}.phpdebugbar-fa-commenting:before{content:"\f27a"}.phpdebugbar-fa-commenting-o:before{content:"\f27b"}.phpdebugbar-fa-houzz:before{content:"\f27c"}.phpdebugbar-fa-vimeo:before{content:"\f27d"}.phpdebugbar-fa-black-tie:before{content:"\f27e"}.phpdebugbar-fa-fonticons:before{content:"\f280"}.phpdebugbar-fa-reddit-alien:before{content:"\f281"}.phpdebugbar-fa-edge:before{content:"\f282"}.phpdebugbar-fa-credit-card-alt:before{content:"\f283"}.phpdebugbar-fa-codiepie:before{content:"\f284"}.phpdebugbar-fa-modx:before{content:"\f285"}.phpdebugbar-fa-fort-awesome:before{content:"\f286"}.phpdebugbar-fa-usb:before{content:"\f287"}.phpdebugbar-fa-product-hunt:before{content:"\f288"}.phpdebugbar-fa-mixcloud:before{content:"\f289"}.phpdebugbar-fa-scribd:before{content:"\f28a"}.phpdebugbar-fa-pause-circle:before{content:"\f28b"}.phpdebugbar-fa-pause-circle-o:before{content:"\f28c"}.phpdebugbar-fa-stop-circle:before{content:"\f28d"}.phpdebugbar-fa-stop-circle-o:before{content:"\f28e"}.phpdebugbar-fa-shopping-bag:before{content:"\f290"}.phpdebugbar-fa-shopping-basket:before{content:"\f291"}.phpdebugbar-fa-hashtag:before{content:"\f292"}.phpdebugbar-fa-bluetooth:before{content:"\f293"}.phpdebugbar-fa-bluetooth-b:before{content:"\f294"}.phpdebugbar-fa-percent:before{content:"\f295"}.phpdebugbar-fa-gitlab:before{content:"\f296"}.phpdebugbar-fa-wpbeginner:before{content:"\f297"}.phpdebugbar-fa-wpforms:before{content:"\f298"}.phpdebugbar-fa-envira:before{content:"\f299"}.phpdebugbar-fa-universal-access:before{content:"\f29a"}.phpdebugbar-fa-wheelchair-alt:before{content:"\f29b"}.phpdebugbar-fa-question-circle-o:before{content:"\f29c"}.phpdebugbar-fa-blind:before{content:"\f29d"}.phpdebugbar-fa-audio-description:before{content:"\f29e"}.phpdebugbar-fa-volume-control-phone:before{content:"\f2a0"}.phpdebugbar-fa-braille:before{content:"\f2a1"}.phpdebugbar-fa-assistive-listening-systems:before{content:"\f2a2"}.phpdebugbar-fa-asl-interpreting:before,.phpdebugbar-fa-american-sign-language-interpreting:before{content:"\f2a3"}.phpdebugbar-fa-deafness:before,.phpdebugbar-fa-hard-of-hearing:before,.phpdebugbar-fa-deaf:before{content:"\f2a4"}.phpdebugbar-fa-glide:before{content:"\f2a5"}.phpdebugbar-fa-glide-g:before{content:"\f2a6"}.phpdebugbar-fa-signing:before,.phpdebugbar-fa-sign-language:before{content:"\f2a7"}.phpdebugbar-fa-low-vision:before{content:"\f2a8"}.phpdebugbar-fa-viadeo:before{content:"\f2a9"}.phpdebugbar-fa-viadeo-square:before{content:"\f2aa"}.phpdebugbar-fa-snapchat:before{content:"\f2ab"}.phpdebugbar-fa-snapchat-ghost:before{content:"\f2ac"}.phpdebugbar-fa-snapchat-square:before{content:"\f2ad"}.phpdebugbar-fa-pied-piper:before{content:"\f2ae"}.phpdebugbar-fa-first-order:before{content:"\f2b0"}.phpdebugbar-fa-yoast:before{content:"\f2b1"}.phpdebugbar-fa-themeisle:before{content:"\f2b2"}.phpdebugbar-fa-google-plus-circle:before,.phpdebugbar-fa-google-plus-official:before{content:"\f2b3"}.phpdebugbar-fa-fa:before,.phpdebugbar-fa-font-awesome:before{content:"\f2b4"}.phpdebugbar-fa-handshake-o:before{content:"\f2b5"}.phpdebugbar-fa-envelope-open:before{content:"\f2b6"}.phpdebugbar-fa-envelope-open-o:before{content:"\f2b7"}.phpdebugbar-fa-linode:before{content:"\f2b8"}.phpdebugbar-fa-address-book:before{content:"\f2b9"}.phpdebugbar-fa-address-book-o:before{content:"\f2ba"}.phpdebugbar-fa-vcard:before,.phpdebugbar-fa-address-card:before{content:"\f2bb"}.phpdebugbar-fa-vcard-o:before,.phpdebugbar-fa-address-card-o:before{content:"\f2bc"}.phpdebugbar-fa-user-circle:before{content:"\f2bd"}.phpdebugbar-fa-user-circle-o:before{content:"\f2be"}.phpdebugbar-fa-user-o:before{content:"\f2c0"}.phpdebugbar-fa-id-badge:before{content:"\f2c1"}.phpdebugbar-fa-drivers-license:before,.phpdebugbar-fa-id-card:before{content:"\f2c2"}.phpdebugbar-fa-drivers-license-o:before,.phpdebugbar-fa-id-card-o:before{content:"\f2c3"}.phpdebugbar-fa-quora:before{content:"\f2c4"}.phpdebugbar-fa-free-code-camp:before{content:"\f2c5"}.phpdebugbar-fa-telegram:before{content:"\f2c6"}.phpdebugbar-fa-thermometer-4:before,.phpdebugbar-fa-thermometer:before,.phpdebugbar-fa-thermometer-full:before{content:"\f2c7"}.phpdebugbar-fa-thermometer-3:before,.phpdebugbar-fa-thermometer-three-quarters:before{content:"\f2c8"}.phpdebugbar-fa-thermometer-2:before,.phpdebugbar-fa-thermometer-half:before{content:"\f2c9"}.phpdebugbar-fa-thermometer-1:before,.phpdebugbar-fa-thermometer-quarter:before{content:"\f2ca"}.phpdebugbar-fa-thermometer-0:before,.phpdebugbar-fa-thermometer-empty:before{content:"\f2cb"}.phpdebugbar-fa-shower:before{content:"\f2cc"}.phpdebugbar-fa-bathtub:before,.phpdebugbar-fa-s15:before,.phpdebugbar-fa-bath:before{content:"\f2cd"}.phpdebugbar-fa-podcast:before{content:"\f2ce"}.phpdebugbar-fa-window-maximize:before{content:"\f2d0"}.phpdebugbar-fa-window-minimize:before{content:"\f2d1"}.phpdebugbar-fa-window-restore:before{content:"\f2d2"}.phpdebugbar-fa-times-rectangle:before,.phpdebugbar-fa-window-close:before{content:"\f2d3"}.phpdebugbar-fa-times-rectangle-o:before,.phpdebugbar-fa-window-close-o:before{content:"\f2d4"}.phpdebugbar-fa-bandcamp:before{content:"\f2d5"}.phpdebugbar-fa-grav:before{content:"\f2d6"}.phpdebugbar-fa-etsy:before{content:"\f2d7"}.phpdebugbar-fa-imdb:before{content:"\f2d8"}.phpdebugbar-fa-ravelry:before{content:"\f2d9"}.phpdebugbar-fa-eercast:before{content:"\f2da"}.phpdebugbar-fa-microchip:before{content:"\f2db"}.phpdebugbar-fa-snowflake-o:before{content:"\f2dc"}.phpdebugbar-fa-superpowers:before{content:"\f2dd"}.phpdebugbar-fa-wpexplorer:before{content:"\f2de"}.phpdebugbar-fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/assets/vendor/font-awesome/fonts/FontAwesome.otf b/assets/vendor/font-awesome/fonts/FontAwesome.otf
new file mode 100644
index 0000000..401ec0f
Binary files /dev/null and b/assets/vendor/font-awesome/fonts/FontAwesome.otf differ
diff --git a/assets/vendor/font-awesome/fonts/fontawesome-webfont.eot b/assets/vendor/font-awesome/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..e9f60ca
Binary files /dev/null and b/assets/vendor/font-awesome/fonts/fontawesome-webfont.eot differ
diff --git a/assets/vendor/font-awesome/fonts/fontawesome-webfont.svg b/assets/vendor/font-awesome/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..855c845
--- /dev/null
+++ b/assets/vendor/font-awesome/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+
+
+
diff --git a/assets/vendor/font-awesome/fonts/fontawesome-webfont.ttf b/assets/vendor/font-awesome/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..35acda2
Binary files /dev/null and b/assets/vendor/font-awesome/fonts/fontawesome-webfont.ttf differ
diff --git a/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff b/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..400014a
Binary files /dev/null and b/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff differ
diff --git a/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff2 b/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..4d13fc6
Binary files /dev/null and b/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff2 differ
diff --git a/assets/vendor/highlightjs/highlight.pack.js b/assets/vendor/highlightjs/highlight.pack.js
new file mode 100644
index 0000000..cf7215a
--- /dev/null
+++ b/assets/vendor/highlightjs/highlight.pack.js
@@ -0,0 +1 @@
+var hljs=new function(){function k(v){return v.replace(/&/gm,"&").replace(//gm,">")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\n/g,""):w.nodeValue}if(t(w)=="br"){return"\n"}return d(w)}).join("")}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^language-/,"")});return v.filter(function(x){return j(x)||x=="no-highlight"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)=="br"){z+=1}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset"}function E(G){F+=""+t(G)+">"}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b=D.bK.split(" ").join("|")}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?\\b("+F.b+")\\b\\.?":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T";U+=Z+'">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode=="continuous"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,"",true):"";if(V.rB){D+=T;C=""}else{if(V.eB){D+=k(U)+T;C=""}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=""}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C="";if(W.starts){P(W.starts,"")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme "'+X+'" for mode "'+(I.cN||"")+'"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: "'+S+'"')}m(M);var I=R||M;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=""}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"
")}return v}function p(z){var y=d(z);var A=r(z);if(A=="no-highlight"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS("http://www.w3.org/1999/xhtml","pre");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=" hljs "+(!A&&v.language||"");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("scilab",function(a){var b=[a.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[a.BE,{b:"''"}]}];return{k:{keyword:"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function endfunction",e:"$",k:"function endfunction|10",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"},],},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",r:0,c:b},{cN:"comment",b:"//",e:"$"}].concat(b)}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/,r:0,c:[d,{cN:"attribute",b:c,r:0},{b:"=",r:0,c:[{cN:"value",v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s\/>]+/}]}]}]};return{aliases:["html"],cI:true,c:[{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"",rE:true,sL:"css"}},{cN:"tag",b:"