From a3e24c8af187526cabb882c6d95df91cd4905d39 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Laurent=20L=C3=A9cluse?= <laurent.lecluse@unicaen.fr>
Date: Thu, 6 Feb 2025 16:03:44 +0100
Subject: [PATCH] =?UTF-8?q?jsTree=20charg=C3=A9=20par=20Composer?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 composer.json                                 |     2 +
 composer.lock                                 |    76 +-
 .../vakata-jstree-3.3.17/.github/FUNDING.yml  |     3 -
 .../.github/workflows/npm-publish.yml         |    22 -
 public/ext/vakata-jstree-3.3.17/.gitignore    |    14 -
 public/ext/vakata-jstree-3.3.17/LICENSE-MIT   |    22 -
 public/ext/vakata-jstree-3.3.17/README.md     |    31 -
 public/ext/vakata-jstree-3.3.17/bower.json    |    33 -
 .../ext/vakata-jstree-3.3.17/component.json   |    28 -
 public/ext/vakata-jstree-3.3.17/composer.json |    46 -
 .../ext/vakata-jstree-3.3.17/demo/README.md   |     2 -
 .../demo/basic/index.html                     |   146 -
 .../vakata-jstree-3.3.17/demo/basic/root.json |     1 -
 .../ext/vakata-jstree-3.3.17/dist/jstree.js   |  8745 ----------
 .../vakata-jstree-3.3.17/dist/jstree.min.js   |     3 -
 .../dist/themes/default-dark/32px.png         |   Bin 1525 -> 0 bytes
 .../dist/themes/default-dark/40px.png         |   Bin 6526 -> 0 bytes
 .../dist/themes/default-dark/style.css        |  1150 --
 .../dist/themes/default-dark/style.min.css    |     1 -
 .../dist/themes/default-dark/throbber.gif     |   Bin 1464 -> 0 bytes
 .../dist/themes/default/32px.png              |   Bin 5660 -> 0 bytes
 .../dist/themes/default/40px.png              |   Bin 2215 -> 0 bytes
 .../dist/themes/default/style.css             |  1106 --
 .../dist/themes/default/style.min.css         |     1 -
 .../dist/themes/default/throbber.gif          |   Bin 1464 -> 0 bytes
 public/ext/vakata-jstree-3.3.17/gruntfile.js  |   221 -
 .../vakata-jstree-3.3.17/jstree.jquery.json   |    28 -
 .../vakata-jstree-3.3.17/package-lock.json    | 13470 ----------------
 public/ext/vakata-jstree-3.3.17/package.json  |    56 -
 public/ext/vakata-jstree-3.3.17/src/intro.js  |    14 -
 .../src/jstree.changed.js                     |    69 -
 .../src/jstree.checkbox.js                    |   999 --
 .../src/jstree.conditionalselect.js           |    38 -
 .../src/jstree.contextmenu.js                 |   662 -
 .../vakata-jstree-3.3.17/src/jstree.dnd.js    |   681 -
 public/ext/vakata-jstree-3.3.17/src/jstree.js |  5028 ------
 .../src/jstree.massload.js                    |   136 -
 .../vakata-jstree-3.3.17/src/jstree.search.js |   421 -
 .../vakata-jstree-3.3.17/src/jstree.sort.js   |    74 -
 .../vakata-jstree-3.3.17/src/jstree.state.js  |   138 -
 .../vakata-jstree-3.3.17/src/jstree.types.js  |   372 -
 .../vakata-jstree-3.3.17/src/jstree.unique.js |   164 -
 .../src/jstree.wholerow.js                    |   122 -
 public/ext/vakata-jstree-3.3.17/src/misc.js   |   766 -
 public/ext/vakata-jstree-3.3.17/src/outro.js  |     1 -
 public/ext/vakata-jstree-3.3.17/src/sample.js |    93 -
 .../vakata-jstree-3.3.17/src/themes/base.less |    95 -
 .../src/themes/default-dark/32px.png          |   Bin 1525 -> 0 bytes
 .../src/themes/default-dark/40px.png          |   Bin 11488 -> 0 bytes
 .../src/themes/default-dark/style.css         |  1150 --
 .../src/themes/default-dark/style.less        |    50 -
 .../src/themes/default-dark/throbber.gif      |   Bin 1849 -> 0 bytes
 .../src/themes/default/32px.png               |   Bin 8740 -> 0 bytes
 .../src/themes/default/40px.png               |   Bin 6055 -> 0 bytes
 .../src/themes/default/style.css              |  1106 --
 .../src/themes/default/style.less             |    22 -
 .../src/themes/default/throbber.gif           |   Bin 1849 -> 0 bytes
 .../vakata-jstree-3.3.17/src/themes/main.less |    77 -
 .../src/themes/mixins.less                    |   104 -
 .../src/themes/responsive.less                |    67 -
 .../vakata-jstree-3.3.17/src/vakata-jstree.js |    38 -
 .../vakata-jstree-3.3.17/test/unit/index.html |    16 -
 .../test/unit/libs/qunit.css                  |   244 -
 .../test/unit/libs/qunit.js                   |  2212 ---
 .../vakata-jstree-3.3.17/test/unit/test.js    |    11 -
 .../test/visual/desktop/index.html            |    44 -
 .../test/visual/mobile/index.html             |    42 -
 .../test/visual/screenshots/desktop/.png      |   Bin 10643 -> 0 bytes
 .../visual/screenshots/desktop/desktop.png    |   Bin 19310 -> 0 bytes
 .../test/visual/screenshots/desktop/home.png  |   Bin 10643 -> 0 bytes
 .../test/visual/screenshots/mobile/.png       |   Bin 6373 -> 0 bytes
 .../test/visual/screenshots/mobile/home.png   |   Bin 6373 -> 0 bytes
 .../test/visual/screenshots/mobile/mobile.png |   Bin 16220 -> 0 bytes
 public/js/app.js                              |     4 +-
 74 files changed, 76 insertions(+), 40191 deletions(-)
 delete mode 100644 public/ext/vakata-jstree-3.3.17/.github/FUNDING.yml
 delete mode 100644 public/ext/vakata-jstree-3.3.17/.github/workflows/npm-publish.yml
 delete mode 100644 public/ext/vakata-jstree-3.3.17/.gitignore
 delete mode 100644 public/ext/vakata-jstree-3.3.17/LICENSE-MIT
 delete mode 100644 public/ext/vakata-jstree-3.3.17/README.md
 delete mode 100644 public/ext/vakata-jstree-3.3.17/bower.json
 delete mode 100644 public/ext/vakata-jstree-3.3.17/component.json
 delete mode 100644 public/ext/vakata-jstree-3.3.17/composer.json
 delete mode 100644 public/ext/vakata-jstree-3.3.17/demo/README.md
 delete mode 100644 public/ext/vakata-jstree-3.3.17/demo/basic/index.html
 delete mode 100644 public/ext/vakata-jstree-3.3.17/demo/basic/root.json
 delete mode 100644 public/ext/vakata-jstree-3.3.17/dist/jstree.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/dist/jstree.min.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/32px.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/40px.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/style.css
 delete mode 100644 public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/style.min.css
 delete mode 100644 public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/throbber.gif
 delete mode 100644 public/ext/vakata-jstree-3.3.17/dist/themes/default/32px.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/dist/themes/default/40px.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/dist/themes/default/style.css
 delete mode 100644 public/ext/vakata-jstree-3.3.17/dist/themes/default/style.min.css
 delete mode 100644 public/ext/vakata-jstree-3.3.17/dist/themes/default/throbber.gif
 delete mode 100644 public/ext/vakata-jstree-3.3.17/gruntfile.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/jstree.jquery.json
 delete mode 100644 public/ext/vakata-jstree-3.3.17/package-lock.json
 delete mode 100644 public/ext/vakata-jstree-3.3.17/package.json
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/intro.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.changed.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.checkbox.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.conditionalselect.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.contextmenu.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.dnd.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.massload.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.search.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.sort.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.state.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.types.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.unique.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/jstree.wholerow.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/misc.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/outro.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/sample.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/base.less
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/default-dark/32px.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/default-dark/40px.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/default-dark/style.css
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/default-dark/style.less
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/default-dark/throbber.gif
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/default/32px.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/default/40px.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/default/style.css
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/default/style.less
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/default/throbber.gif
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/main.less
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/mixins.less
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/themes/responsive.less
 delete mode 100644 public/ext/vakata-jstree-3.3.17/src/vakata-jstree.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/test/unit/index.html
 delete mode 100644 public/ext/vakata-jstree-3.3.17/test/unit/libs/qunit.css
 delete mode 100644 public/ext/vakata-jstree-3.3.17/test/unit/libs/qunit.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/test/unit/test.js
 delete mode 100644 public/ext/vakata-jstree-3.3.17/test/visual/desktop/index.html
 delete mode 100644 public/ext/vakata-jstree-3.3.17/test/visual/mobile/index.html
 delete mode 100644 public/ext/vakata-jstree-3.3.17/test/visual/screenshots/desktop/.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/test/visual/screenshots/desktop/desktop.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/test/visual/screenshots/desktop/home.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/test/visual/screenshots/mobile/.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/test/visual/screenshots/mobile/home.png
 delete mode 100644 public/ext/vakata-jstree-3.3.17/test/visual/screenshots/mobile/mobile.png

diff --git a/composer.json b/composer.json
index 3dae45dbc6..a598aa7ebb 100644
--- a/composer.json
+++ b/composer.json
@@ -19,6 +19,7 @@
         "tinymce/tinymce"                  : "7.6.0",
         "snapappointments/bootstrap-select": "1.14.0-beta3",
         "datatables.net/datatables.net-bs5": "2.1.8",
+        "vakata/jstree"                    : "3.3.17",
 
         "unicaen/app"                      : "7.1.0",
         "unicaen/authentification"         : "6.4.3",
@@ -90,6 +91,7 @@
             "cp -R vendor/snapappointments/bootstrap-select public/vendor/bootstrap-select",
             "cp -R vendor/datatables.net/datatables.net public/vendor/datatables",
             "cp -R vendor/datatables.net/datatables.net-bs5/* public/vendor/datatables/",
+            "cp -R vendor/vakata/jstree/dist public/vendor/jstree",
             "cp public/vendor/datatables/css/dataTables.bootstrap5.min.css public/vendor/datatables/css/dataTables.bootstrap5.min.scss"
         ],
         "post-install-cmd"    : [
diff --git a/composer.lock b/composer.lock
index 340f78634e..2a4bbc5501 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "810e0e21bf5cb4487f056ddae601215e",
+    "content-hash": "8fa952a0887945ebdeb9124cccdd35db",
     "packages": [
         {
             "name": "apereo/phpcas",
@@ -7672,11 +7672,11 @@
         },
         {
             "name": "unicaen/mail",
-            "version": "7.1.2",
+            "version": "7.1.0",
             "source": {
                 "type": "git",
                 "url": "https://git.unicaen.fr/lib/unicaen/mail.git",
-                "reference": "12c1c629d3d498e7aec8721f2b73ddc8cfda304a"
+                "reference": "fafdc3f20ed76d45ea3596f1986336a74227169a"
             },
             "require": {
                 "symfony/mailer": "^7",
@@ -7692,7 +7692,7 @@
                 ]
             },
             "description": "Module d'envoi de mail",
-            "time": "2025-02-06T09:50:32+00:00"
+            "time": "2025-01-16T12:50:52+00:00"
         },
         {
             "name": "unicaen/open-document",
@@ -7931,6 +7931,74 @@
             "description": "A generic user registration and authentication module for ZF2. Supports Laminas\\Db and Doctrine2.",
             "time": "2025-01-29T08:18:07+00:00"
         },
+        {
+            "name": "vakata/jstree",
+            "version": "3.3.17",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/vakata/jstree.git",
+                "reference": "6256df013ebd98aea138402d8ac96db3efe0c0da"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/vakata/jstree/zipball/6256df013ebd98aea138402d8ac96db3efe0c0da",
+                "reference": "6256df013ebd98aea138402d8ac96db3efe0c0da",
+                "shasum": ""
+            },
+            "require": {
+                "components/jquery": ">=1.9.1"
+            },
+            "suggest": {
+                "robloach/component-installer": "Allows installation of Components via Composer"
+            },
+            "type": "component",
+            "extra": {
+                "component": {
+                    "files": [
+                        "dist/jstree.min.js",
+                        "dist/themes/default/style.min.css",
+                        "dist/themes/default/32px.png",
+                        "dist/themes/default/40px.png",
+                        "dist/themes/default/throbber.gif"
+                    ],
+                    "images": [
+                        "dist/themes/default/32px.png",
+                        "dist/themes/default/40px.png",
+                        "dist/themes/default/throbber.gif"
+                    ],
+                    "styles": [
+                        "dist/themes/default/style.css"
+                    ],
+                    "scripts": [
+                        "dist/jstree.js"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ivan Bozhanov",
+                    "email": "jstree@jstree.com"
+                }
+            ],
+            "description": "jsTree is jquery plugin, that provides interactive trees.",
+            "homepage": "http://jstree.com",
+            "support": {
+                "forum": "https://groups.google.com/forum/#!forum/jstree",
+                "issues": "https://github.com/vakata/jstree/issues",
+                "source": "https://github.com/vakata/jstree"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/vakata",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-09-03T07:13:38+00:00"
+        },
         {
             "name": "webimpress/safe-writer",
             "version": "2.2.0",
diff --git a/public/ext/vakata-jstree-3.3.17/.github/FUNDING.yml b/public/ext/vakata-jstree-3.3.17/.github/FUNDING.yml
deleted file mode 100644
index d828b1d537..0000000000
--- a/public/ext/vakata-jstree-3.3.17/.github/FUNDING.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-# These are supported funding model platforms
-
-github: [vakata]
diff --git a/public/ext/vakata-jstree-3.3.17/.github/workflows/npm-publish.yml b/public/ext/vakata-jstree-3.3.17/.github/workflows/npm-publish.yml
deleted file mode 100644
index 15d8285061..0000000000
--- a/public/ext/vakata-jstree-3.3.17/.github/workflows/npm-publish.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
-# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
-
-name: Node.js Package
-
-on:
-  release:
-    types: [created]
-
-jobs:
-  publish-npm:
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v2
-      - uses: actions/setup-node@v1
-        with:
-          node-version: 12
-          registry-url: https://registry.npmjs.org/
-      - run: npm publish
-        env:
-          NODE_AUTH_TOKEN: ${{secrets.npm_token}}
-
diff --git a/public/ext/vakata-jstree-3.3.17/.gitignore b/public/ext/vakata-jstree-3.3.17/.gitignore
deleted file mode 100644
index d585eb42e9..0000000000
--- a/public/ext/vakata-jstree-3.3.17/.gitignore
+++ /dev/null
@@ -1,14 +0,0 @@
-/debug
-/jstree.sublime-project
-/jstree.sublime-workspace
-/bower_components
-/node_modules
-/site
-/nuget
-/demo/filebrowser/data/root
-/npm.txt
-/libs
-/docs
-/dist/libs
-/.vscode
-/.idea
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/LICENSE-MIT b/public/ext/vakata-jstree-3.3.17/LICENSE-MIT
deleted file mode 100644
index 9c90a3d398..0000000000
--- a/public/ext/vakata-jstree-3.3.17/LICENSE-MIT
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2014 Ivan Bozhanov
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/public/ext/vakata-jstree-3.3.17/README.md b/public/ext/vakata-jstree-3.3.17/README.md
deleted file mode 100644
index 0e494981d5..0000000000
--- a/public/ext/vakata-jstree-3.3.17/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# jstree
-
-[jsTree](http://www.jstree.com/) is jquery plugin, that provides interactive trees. It is absolutely free, [open source](https://github.com/vakata/jstree) and distributed under the MIT license.
-
-jsTree is easily extendable, themable and configurable, it supports HTML & JSON data sources, AJAX & async callback loading.
-
-jsTree functions properly in either box-model (content-box or border-box), can be loaded as an AMD module, and has a built in mobile theme for responsive design, that can easily be customized. It uses jQuery's event system, so binding callbacks on various events in the tree is familiar and easy.
-
-You also get:
- * drag & drop support
- * keyboard navigation
- * inline edit, create and delete
- * tri-state checkboxes
- * fuzzy searching
- * customizable node types
-
-_For more information, examples and API docs head on over to [the wiki page](https://github.com/vakata/jstree/wiki) and [jstree.com](http://www.jstree.com)_.
-_Feel free to ask any questions on the [discussions board](https://github.com/vakata/jstree/discussions)._
-_The PHP demos are now in a [separate repository](https://github.com/vakata/jstree-php-demos)._
-
-## License & Contributing
-
-_Please do NOT edit files in the "dist" subdirectory as they are generated via grunt. You'll find source code in the "src" subdirectory!_
-
-If you want to you can always [sponsor me](https://github.com/sponsors/vakata) or [donate a small amount][paypal] to help the development of jstree.
-
-[paypal]: https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=paypal@vakata.com&currency_code=USD&amount=&return=http://jstree.com/donation&item_name=Buy+me+a+coffee+for+jsTree
-
-Copyright (c) 2020 Ivan Bozhanov (http://vakata.com)
-
-Licensed under the [MIT license](http://www.opensource.org/licenses/mit-license.php).
diff --git a/public/ext/vakata-jstree-3.3.17/bower.json b/public/ext/vakata-jstree-3.3.17/bower.json
deleted file mode 100644
index 03b2690feb..0000000000
--- a/public/ext/vakata-jstree-3.3.17/bower.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-	"name": "jstree",
-	"license": "MIT",
-	"version": "3.3.17",
-	"main" : [
-		"./dist/jstree.js",
-		"./dist/themes/default/style.css"
-	],
-	"ignore": [
-		"**/.*",
-		"docs",
-		"demo",
-		"libs",
-		"node_modules",
-		"test",
-		"libs",
-		"jstree.jquery.json",
-		"gruntfile.js",
-		"package.json",
-		"bower.json",
-		"component.json",
-		"LICENCE-MIT",
-		"README.md"
-	],
-	"dependencies": {
-		"jquery": ">=1.9.1"
-	},
-	"keywords": [
-		"ui",
-		"tree",
-		"jstree"
-	]
-}
diff --git a/public/ext/vakata-jstree-3.3.17/component.json b/public/ext/vakata-jstree-3.3.17/component.json
deleted file mode 100644
index f409fd6413..0000000000
--- a/public/ext/vakata-jstree-3.3.17/component.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-	"name": "jstree",
-	"repo": "vakata/jstree",
-	"description": "jsTree is jquery plugin, that provides interactive trees.",
-	"version": "3.3.17",
-	"license": "MIT",
-	"keywords": [
-		"ui",
-		"tree",
-		"jstree"
-	],
-	"scripts": [
-		"dist/jstree.js",
-		"dist/jstree.min.js"
-	],
-	"images": [
-		"dist/themes/default/32px.png",
-		"dist/themes/default/40px.png",
-		"dist/themes/default/throbber.gif"
-	],
-	"styles": [
-		"dist/themes/default/style.css",
-		"dist/themes/default/style.min.css"
-	],
-	"dependencies": {
-		"components/jquery": ">=1.9.1"
-	}
-}
diff --git a/public/ext/vakata-jstree-3.3.17/composer.json b/public/ext/vakata-jstree-3.3.17/composer.json
deleted file mode 100644
index 282b768a68..0000000000
--- a/public/ext/vakata-jstree-3.3.17/composer.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-	"name": "vakata/jstree",
-	"description": "jsTree is jquery plugin, that provides interactive trees.",
-	"type": "component",
-	"homepage": "http://jstree.com",
-	"license": "MIT",
-	"support": {
-		"issues": "https://github.com/vakata/jstree/issues",
-		"forum": "https://groups.google.com/forum/#!forum/jstree",
-		"source": "https://github.com/vakata/jstree"
-	},
-	"authors": [
-		{
-			"name": "Ivan Bozhanov",
-			"email": "jstree@jstree.com"
-		}
-	],
-	"require": {
-		"components/jquery": ">=1.9.1"
-	},
-	"suggest": {
-		"robloach/component-installer": "Allows installation of Components via Composer"
-	},
-	"extra": {
-		"component": {
-			"scripts": [
-				"dist/jstree.js"
-			],
-			"styles": [
-				"dist/themes/default/style.css"
-			],
-			"images": [
-				"dist/themes/default/32px.png",
-				"dist/themes/default/40px.png",
-				"dist/themes/default/throbber.gif"
-			],
-			"files": [
-				"dist/jstree.min.js",
-				"dist/themes/default/style.min.css",
-				"dist/themes/default/32px.png",
-				"dist/themes/default/40px.png",
-				"dist/themes/default/throbber.gif"
-			]
-		}
-	}
-}
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/demo/README.md b/public/ext/vakata-jstree-3.3.17/demo/README.md
deleted file mode 100644
index b58cf99695..0000000000
--- a/public/ext/vakata-jstree-3.3.17/demo/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-## PHP demos moved to new repository
-https://github.com/vakata/jstree-php-demos
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/demo/basic/index.html b/public/ext/vakata-jstree-3.3.17/demo/basic/index.html
deleted file mode 100644
index 3f64c46005..0000000000
--- a/public/ext/vakata-jstree-3.3.17/demo/basic/index.html
+++ /dev/null
@@ -1,146 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-	<meta charset="UTF-8">
-	<title>jstree basic demos</title>
-	<style>
-	html { margin:0; padding:0; font-size:62.5%; }
-	body { max-width:800px; min-width:300px; margin:0 auto; padding:20px 10px; font-size:14px; font-size:1.4em; }
-	h1 { font-size:1.8em; }
-	.demo { overflow:auto; border:1px solid silver; min-height:100px; }
-	</style>
-	<link rel="stylesheet" href="./../../dist/themes/default/style.min.css" />
-</head>
-<body>
-	<h1>HTML demo</h1>
-	<div id="html" class="demo">
-		<ul>
-			<li data-jstree='{ "opened" : true }'>Root node
-				<ul>
-					<li data-jstree='{ "selected" : true }'>Child node 1</li>
-					<li>Child node 2</li>
-				</ul>
-			</li>
-		</ul>
-	</div>
-
-	<h1>Inline data demo</h1>
-	<div id="data" class="demo"></div>
-
-	<h1>Data format demo</h1>
-	<div id="frmt" class="demo"></div>
-
-	<h1>AJAX demo</h1>
-	<div id="ajax" class="demo"></div>
-
-	<h1>Lazy loading demo</h1>
-	<div id="lazy" class="demo"></div>
-
-	<h1>Callback function data demo</h1>
-	<div id="clbk" class="demo"></div>
-
-	<h1>Interaction and events demo</h1>
-	<button id="evts_button">select node with id 1</button> <em>either click the button or a node in the tree</em>
-	<div id="evts" class="demo"></div>
-
-	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
-	<script src="./../../dist/jstree.min.js"></script>
-	
-	<script>
-	// html demo
-	$('#html').jstree();
-
-	// inline data demo
-	$('#data').jstree({
-		'core' : {
-			'data' : [
-				{ "text" : "Root node", "children" : [
-						{ "text" : "Child node 1" },
-						{ "text" : "Child node 2" }
-				]}
-			]
-		}
-	});
-
-	// data format demo
-	$('#frmt').jstree({
-		'core' : {
-			'data' : [
-				{
-					"text" : "Root node",
-					"state" : { "opened" : true },
-					"children" : [
-						{
-							"text" : "Child node 1",
-							"state" : { "selected" : true },
-							"icon" : "jstree-file"
-						},
-						{ "text" : "Child node 2", "state" : { "disabled" : true } }
-					]
-				}
-			]
-		}
-	});
-
-	// ajax demo
-	$('#ajax').jstree({
-		'core' : {
-			'data' : {
-				"url" : "./root.json",
-				"dataType" : "json" // needed only if you do not supply JSON headers
-			}
-		}
-	});
-
-	// lazy demo
-	$('#lazy').jstree({
-		'core' : {
-			'data' : {
-				"url" : "//www.jstree.com/fiddle/?lazy",
-				"data" : function (node) {
-					return { "id" : node.id };
-				}
-			}
-		}
-	});
-
-	// data from callback
-	$('#clbk').jstree({
-		'core' : {
-			'data' : function (node, cb) {
-				if(node.id === "#") {
-					cb([{"text" : "Root", "id" : "1", "children" : true}]);
-				}
-				else {
-					cb(["Child"]);
-				}
-			}
-		}
-	});
-
-	// interaction and events
-	$('#evts_button').on("click", function () {
-		var instance = $('#evts').jstree(true);
-		instance.deselect_all();
-		instance.select_node('1');
-	});
-	$('#evts')
-		.on("changed.jstree", function (e, data) {
-			if(data.selected.length) {
-				alert('The selected node is: ' + data.instance.get_node(data.selected[0]).text);
-			}
-		})
-		.jstree({
-			'core' : {
-				'multiple' : false,
-				'data' : [
-					{ "text" : "Root node", "children" : [
-							{ "text" : "Child node 1", "id" : 1 },
-							{ "text" : "Child node 2" }
-					]}
-				]
-			}
-		});
-	</script>
-</body>
-</html>
diff --git a/public/ext/vakata-jstree-3.3.17/demo/basic/root.json b/public/ext/vakata-jstree-3.3.17/demo/basic/root.json
deleted file mode 100644
index 8560404e85..0000000000
--- a/public/ext/vakata-jstree-3.3.17/demo/basic/root.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"id":1,"text":"Root node","children":[{"id":2,"text":"Child node 1"},{"id":3,"text":"Child node 2"}]}]
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/dist/jstree.js b/public/ext/vakata-jstree-3.3.17/dist/jstree.js
deleted file mode 100644
index 588cccc8a8..0000000000
--- a/public/ext/vakata-jstree-3.3.17/dist/jstree.js
+++ /dev/null
@@ -1,8745 +0,0 @@
-/*globals jQuery, define, module, exports, require, window, document, postMessage */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define(['jquery'], factory);
-	}
-	else if(typeof module !== 'undefined' && module.exports) {
-		module.exports = factory(require('jquery'));
-	}
-	else {
-		factory(jQuery);
-	}
-}(function ($, undefined) {
-	"use strict";
-/*!
- * jsTree 3.3.17
- * http://jstree.com/
- *
- * Copyright (c) 2014 Ivan Bozhanov (http://vakata.com)
- *
- * Licensed same as jquery - under the terms of the MIT License
- *   http://www.opensource.org/licenses/mit-license.php
- */
-/*!
- * if using jslint please allow for the jQuery global and use following options:
- * jslint: loopfunc: true, browser: true, ass: true, bitwise: true, continue: true, nomen: true, plusplus: true, regexp: true, unparam: true, todo: true, white: true
- */
-/*jshint -W083 */
-
-	// prevent another load? maybe there is a better way?
-	if($.jstree) {
-		return;
-	}
-
-	/**
-	 * ### jsTree core functionality
-	 */
-
-	// internal variables
-	var instance_counter = 0,
-		ccp_node = false,
-		ccp_mode = false,
-		ccp_inst = false,
-		themes_loaded = [],
-		src = $('script:last').attr('src'),
-		document = window.document; // local variable is always faster to access then a global
-
-	var setImmediate = window.setImmediate;
-	var Promise = window.Promise;
-	if (!setImmediate && Promise) {
-		// Good enough approximation of setImmediate
-		setImmediate = function (cb, arg) {
-			Promise.resolve(arg).then(cb);
-		};
-	}
-
-	/**
-	 * holds all jstree related functions and variables, including the actual class and methods to create, access and manipulate instances.
-	 * @name $.jstree
-	 */
-	$.jstree = {
-		/**
-		 * specifies the jstree version in use
-		 * @name $.jstree.version
-		 */
-		version : '3.3.17',
-		/**
-		 * holds all the default options used when creating new instances
-		 * @name $.jstree.defaults
-		 */
-		defaults : {
-			/**
-			 * configure which plugins will be active on an instance. Should be an array of strings, where each element is a plugin name. The default is `[]`
-			 * @name $.jstree.defaults.plugins
-			 */
-			plugins : []
-		},
-		/**
-		 * stores all loaded jstree plugins (used internally)
-		 * @name $.jstree.plugins
-		 */
-		plugins : {},
-		path : src && src.indexOf('/') !== -1 ? src.replace(/\/[^\/]+$/,'') : '',
-		idregex : /[\\:&!^|()\[\]<>@*'+~#";.,=\- \/${}%?`]/g,
-		root : '#'
-	};
-	
-	/**
-	 * creates a jstree instance
-	 * @name $.jstree.create(el [, options])
-	 * @param {DOMElement|jQuery|String} el the element to create the instance on, can be jQuery extended or a selector
-	 * @param {Object} options options for this instance (extends `$.jstree.defaults`)
-	 * @return {jsTree} the new instance
-	 */
-	$.jstree.create = function (el, options) {
-		var tmp = new $.jstree.core(++instance_counter),
-			opt = options;
-		options = $.extend(true, {}, $.jstree.defaults, options);
-		if(opt && opt.plugins) {
-			options.plugins = opt.plugins;
-		}
-		$.each(options.plugins, function (i, k) {
-			if(i !== 'core') {
-				tmp = tmp.plugin(k, options[k]);
-			}
-		});
-		$(el).data('jstree', tmp);
-		tmp.init(el, options);
-		return tmp;
-	};
-	/**
-	 * remove all traces of jstree from the DOM and destroy all instances
-	 * @name $.jstree.destroy()
-	 */
-	$.jstree.destroy = function () {
-		$('.jstree:jstree').jstree('destroy');
-		$(document).off('.jstree');
-	};
-	/**
-	 * the jstree class constructor, used only internally
-	 * @private
-	 * @name $.jstree.core(id)
-	 * @param {Number} id this instance's index
-	 */
-	$.jstree.core = function (id) {
-		this._id = id;
-		this._cnt = 0;
-		this._wrk = null;
-		this._data = {
-			core : {
-				themes : {
-					name : false,
-					dots : false,
-					icons : false,
-					ellipsis : false
-				},
-				selected : [],
-				last_error : {},
-				working : false,
-				worker_queue : [],
-				focused : null
-			}
-		};
-	};
-	/**
-	 * get a reference to an existing instance
-	 *
-	 * __Examples__
-	 *
-	 *	// provided a container with an ID of "tree", and a nested node with an ID of "branch"
-	 *	// all of there will return the same instance
-	 *	$.jstree.reference('tree');
-	 *	$.jstree.reference('#tree');
-	 *	$.jstree.reference($('#tree'));
-	 *	$.jstree.reference(document.getElementByID('tree'));
-	 *	$.jstree.reference('branch');
-	 *	$.jstree.reference('#branch');
-	 *	$.jstree.reference($('#branch'));
-	 *	$.jstree.reference(document.getElementByID('branch'));
-	 *
-	 * @name $.jstree.reference(needle)
-	 * @param {DOMElement|jQuery|String} needle
-	 * @return {jsTree|null} the instance or `null` if not found
-	 */
-	$.jstree.reference = function (needle) {
-		var tmp = null,
-			obj = null;
-		if(needle && needle.id && (!needle.tagName || !needle.nodeType)) { needle = needle.id; }
-
-		if(!obj || !obj.length) {
-			try { obj = $(needle); } catch (ignore) { }
-		}
-		if(!obj || !obj.length) {
-			try { obj = $('#' + needle.replace($.jstree.idregex,'\\$&')); } catch (ignore) { }
-		}
-		if(obj && obj.length && (obj = obj.closest('.jstree')).length && (obj = obj.data('jstree'))) {
-			tmp = obj;
-		}
-		else {
-			$('.jstree').each(function () {
-				var inst = $(this).data('jstree');
-				if(inst && inst._model.data[needle]) {
-					tmp = inst;
-					return false;
-				}
-			});
-		}
-		return tmp;
-	};
-	/**
-	 * Create an instance, get an instance or invoke a command on a instance.
-	 *
-	 * If there is no instance associated with the current node a new one is created and `arg` is used to extend `$.jstree.defaults` for this new instance. There would be no return value (chaining is not broken).
-	 *
-	 * If there is an existing instance and `arg` is a string the command specified by `arg` is executed on the instance, with any additional arguments passed to the function. If the function returns a value it will be returned (chaining could break depending on function).
-	 *
-	 * If there is an existing instance and `arg` is not a string the instance itself is returned (similar to `$.jstree.reference`).
-	 *
-	 * In any other case - nothing is returned and chaining is not broken.
-	 *
-	 * __Examples__
-	 *
-	 *	$('#tree1').jstree(); // creates an instance
-	 *	$('#tree2').jstree({ plugins : [] }); // create an instance with some options
-	 *	$('#tree1').jstree('open_node', '#branch_1'); // call a method on an existing instance, passing additional arguments
-	 *	$('#tree2').jstree(); // get an existing instance (or create an instance)
-	 *	$('#tree2').jstree(true); // get an existing instance (will not create new instance)
-	 *	$('#branch_1').jstree().select_node('#branch_1'); // get an instance (using a nested element and call a method)
-	 *
-	 * @name $().jstree([arg])
-	 * @param {String|Object} arg
-	 * @return {Mixed}
-	 */
-	$.fn.jstree = function (arg) {
-		// check for string argument
-		var is_method	= (typeof arg === 'string'),
-			args		= Array.prototype.slice.call(arguments, 1),
-			result		= null;
-		if(arg === true && !this.length) { return false; }
-		this.each(function () {
-			// get the instance (if there is one) and method (if it exists)
-			var instance = $.jstree.reference(this),
-				method = is_method && instance ? instance[arg] : null;
-			// if calling a method, and method is available - execute on the instance
-			result = is_method && method ?
-				method.apply(instance, args) :
-				null;
-			// if there is no instance and no method is being called - create one
-			if(!instance && !is_method && (arg === undefined || $.isPlainObject(arg))) {
-				$.jstree.create(this, arg);
-			}
-			// if there is an instance and no method is called - return the instance
-			if( (instance && !is_method) || arg === true ) {
-				result = instance || false;
-			}
-			// if there was a method call which returned a result - break and return the value
-			if(result !== null && result !== undefined) {
-				return false;
-			}
-		});
-		// if there was a method call with a valid return value - return that, otherwise continue the chain
-		return result !== null && result !== undefined ?
-			result : this;
-	};
-	/**
-	 * used to find elements containing an instance
-	 *
-	 * __Examples__
-	 *
-	 *	$('div:jstree').each(function () {
-	 *		$(this).jstree('destroy');
-	 *	});
-	 *
-	 * @name $(':jstree')
-	 * @return {jQuery}
-	 */
-	$.expr.pseudos.jstree = $.expr.createPseudo(function(search) {
-		return function(a) {
-			return $(a).hasClass('jstree') &&
-				$(a).data('jstree') !== undefined;
-		};
-	});
-
-	/**
-	 * stores all defaults for the core
-	 * @name $.jstree.defaults.core
-	 */
-	$.jstree.defaults.core = {
-		/**
-		 * data configuration
-		 *
-		 * If left as `false` the HTML inside the jstree container element is used to populate the tree (that should be an unordered list with list items).
-		 *
-		 * You can also pass in a HTML string or a JSON array here.
-		 *
-		 * It is possible to pass in a standard jQuery-like AJAX config and jstree will automatically determine if the response is JSON or HTML and use that to populate the tree.
-		 * In addition to the standard jQuery ajax options here you can supply functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node is being loaded, the return value of those functions will be used.
-		 *
-		 * The last option is to specify a function, that function will receive the node being loaded as argument and a second param which is a function which should be called with the result.
-		 *
-		 * __Examples__
-		 *
-		 *	// AJAX
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'data' : {
-		 *				'url' : '/get/children/',
-		 *				'data' : function (node) {
-		 *					return { 'id' : node.id };
-		 *				}
-		 *			}
-		 *		});
-		 *
-		 *	// direct data
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'data' : [
-		 *				'Simple root node',
-		 *				{
-		 *					'id' : 'node_2',
-		 *					'text' : 'Root node with options',
-		 *					'state' : { 'opened' : true, 'selected' : true },
-		 *					'children' : [ { 'text' : 'Child 1' }, 'Child 2']
-		 *				}
-		 *			]
-		 *		}
-		 *	});
-		 *
-		 *	// function
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'data' : function (obj, callback) {
-		 *				callback.call(this, ['Root 1', 'Root 2']);
-		 *			}
-		 *		});
-		 *
-		 * @name $.jstree.defaults.core.data
-		 */
-		data			: false,
-		/**
-		 * configure the various strings used throughout the tree
-		 *
-		 * You can use an object where the key is the string you need to replace and the value is your replacement.
-		 * Another option is to specify a function which will be called with an argument of the needed string and should return the replacement.
-		 * If left as `false` no replacement is made.
-		 *
-		 * __Examples__
-		 *
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'strings' : {
-		 *				'Loading ...' : 'Please wait ...'
-		 *			}
-		 *		}
-		 *	});
-		 *
-		 * @name $.jstree.defaults.core.strings
-		 */
-		strings			: false,
-		/**
-		 * determines what happens when a user tries to modify the structure of the tree
-		 * If left as `false` all operations like create, rename, delete, move or copy are prevented.
-		 * You can set this to `true` to allow all interactions or use a function to have better control.
-		 *
-		 * __Examples__
-		 *
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'check_callback' : function (operation, node, node_parent, node_position, more) {
-		 *				// operation can be 'create_node', 'rename_node', 'delete_node', 'move_node', 'copy_node' or 'edit'
-		 *				// in case of 'rename_node' node_position is filled with the new node name
-		 *				return operation === 'rename_node' ? true : false;
-		 *			}
-		 *		}
-		 *	});
-		 *
-		 * @name $.jstree.defaults.core.check_callback
-		 */
-		check_callback	: false,
-		/**
-		 * a callback called with a single object parameter in the instance's scope when something goes wrong (operation prevented, ajax failed, etc)
-		 * @name $.jstree.defaults.core.error
-		 */
-		error			: $.noop,
-		/**
-		 * the open / close animation duration in milliseconds - set this to `false` to disable the animation (default is `200`)
-		 * @name $.jstree.defaults.core.animation
-		 */
-		animation		: 200,
-		/**
-		 * a boolean indicating if multiple nodes can be selected
-		 * @name $.jstree.defaults.core.multiple
-		 */
-		multiple		: true,
-		/**
-		 * theme configuration object
-		 * @name $.jstree.defaults.core.themes
-		 */
-		themes			: {
-			/**
-			 * the name of the theme to use (if left as `false` the default theme is used)
-			 * @name $.jstree.defaults.core.themes.name
-			 */
-			name			: false,
-			/**
-			 * the URL of the theme's CSS file, leave this as `false` if you have manually included the theme CSS (recommended). You can set this to `true` too which will try to autoload the theme.
-			 * @name $.jstree.defaults.core.themes.url
-			 */
-			url				: false,
-			/**
-			 * the location of all jstree themes - only used if `url` is set to `true`
-			 * @name $.jstree.defaults.core.themes.dir
-			 */
-			dir				: false,
-			/**
-			 * a boolean indicating if connecting dots are shown
-			 * @name $.jstree.defaults.core.themes.dots
-			 */
-			dots			: true,
-			/**
-			 * a boolean indicating if node icons are shown
-			 * @name $.jstree.defaults.core.themes.icons
-			 */
-			icons			: true,
-			/**
-			 * a boolean indicating if node ellipsis should be shown - this only works with a fixed with on the container
-			 * @name $.jstree.defaults.core.themes.ellipsis
-			 */
-			ellipsis		: false,
-			/**
-			 * a boolean indicating if the tree background is striped
-			 * @name $.jstree.defaults.core.themes.stripes
-			 */
-			stripes			: false,
-			/**
-			 * a string (or boolean `false`) specifying the theme variant to use (if the theme supports variants)
-			 * @name $.jstree.defaults.core.themes.variant
-			 */
-			variant			: false,
-			/**
-			 * a boolean specifying if a reponsive version of the theme should kick in on smaller screens (if the theme supports it). Defaults to `false`.
-			 * @name $.jstree.defaults.core.themes.responsive
-			 */
-			responsive		: false
-		},
-		/**
-		 * if left as `true` all parents of all selected nodes will be opened once the tree loads (so that all selected nodes are visible to the user)
-		 * @name $.jstree.defaults.core.expand_selected_onload
-		 */
-		expand_selected_onload : true,
-		/**
-		 * if left as `true` web workers will be used to parse incoming JSON data where possible, so that the UI will not be blocked by large requests. Workers are however about 30% slower. Defaults to `true`
-		 * @name $.jstree.defaults.core.worker
-		 */
-		worker : true,
-		/**
-		 * Force node text to plain text (and escape HTML). Defaults to `false`
-		 * @name $.jstree.defaults.core.force_text
-		 */
-		force_text : false,
-		/**
-		 * Should the node be toggled if the text is double clicked. Defaults to `true`
-		 * @name $.jstree.defaults.core.dblclick_toggle
-		 */
-		dblclick_toggle : true,
-		/**
-		 * Should the loaded nodes be part of the state. Defaults to `false`
-		 * @name $.jstree.defaults.core.loaded_state
-		 */
-		loaded_state : false,
-		/**
-		 * Should the last active node be focused when the tree container is blurred and the focused again. This helps working with screen readers. Defaults to `true`
-		 * @name $.jstree.defaults.core.restore_focus
-		 */
-		restore_focus : true,
-		/**
-		 * Force to compute and set "aria-setsize" and "aria-posinset" explicitly for each treeitem. 
-		 * Some browsers may compute incorrect elements position and produce wrong announcements for screen readers. Defaults to `false`
-		 * @name $.jstree.defaults.core.compute_elements_positions
-		 */
-		compute_elements_positions : false,
-		/**
-		 * Default keyboard shortcuts (an object where each key is the button name or combo - like 'enter', 'ctrl-space', 'p', etc and the value is the function to execute in the instance's scope)
-		 * @name $.jstree.defaults.core.keyboard
-		 */
-		keyboard : {
-			'ctrl-space': function (e) {
-				// aria defines space only with Ctrl
-				e.type = "click";
-				$(e.currentTarget).trigger(e);
-			},
-			'enter': function (e) {
-				// enter
-				e.type = "click";
-				$(e.currentTarget).trigger(e);
-			},
-			'left': function (e) {
-				// left
-				e.preventDefault();
-				if(this.is_open(e.currentTarget)) {
-					this.close_node(e.currentTarget);
-				}
-				else {
-					var o = this.get_parent(e.currentTarget);
-					if(o && o.id !== $.jstree.root) { this.get_node(o, true).children('.jstree-anchor').trigger('focus'); }
-				}
-			},
-			'up': function (e) {
-				// up
-				e.preventDefault();
-				var o = this.get_prev_dom(e.currentTarget);
-				if(o && o.length) { o.children('.jstree-anchor').trigger('focus'); }
-			},
-			'right': function (e) {
-				// right
-				e.preventDefault();
-				if(this.is_closed(e.currentTarget)) {
-					this.open_node(e.currentTarget, function (o) { this.get_node(o, true).children('.jstree-anchor').trigger('focus'); });
-				}
-				else if (this.is_open(e.currentTarget)) {
-					var o = this.get_node(e.currentTarget, true).children('.jstree-children')[0];
-					if(o) { $(this._firstChild(o)).children('.jstree-anchor').trigger('focus'); }
-				}
-			},
-			'down': function (e) {
-				// down
-				e.preventDefault();
-				var o = this.get_next_dom(e.currentTarget);
-				if(o && o.length) { o.children('.jstree-anchor').trigger('focus'); }
-			},
-			'*': function (e) {
-				// aria defines * on numpad as open_all - not very common
-				this.open_all();
-			},
-			'home': function (e) {
-				// home
-				e.preventDefault();
-				var o = this._firstChild(this.get_container_ul()[0]);
-				if(o) { $(o).children('.jstree-anchor').filter(':visible').trigger('focus'); }
-			},
-			'end': function (e) {
-				// end
-				e.preventDefault();
-				this.element.find('.jstree-anchor').filter(':visible').last().trigger('focus');
-			},
-			'f2': function (e) {
-				// f2 - safe to include - if check_callback is false it will fail
-				e.preventDefault();
-				this.edit(e.currentTarget);
-			}
-		},
-        /**
-		 * Should reselecting an already selected node trigger the select and changed callbacks
-		 * @name $.jstree.defaults.core.allow_reselect
-		 */
-        allow_reselect : false
-	};
-	$.jstree.core.prototype = {
-		/**
-		 * used to decorate an instance with a plugin. Used internally.
-		 * @private
-		 * @name plugin(deco [, opts])
-		 * @param  {String} deco the plugin to decorate with
-		 * @param  {Object} opts options for the plugin
-		 * @return {jsTree}
-		 */
-		plugin : function (deco, opts) {
-			var Child = $.jstree.plugins[deco];
-			if(Child) {
-				this._data[deco] = {};
-				Child.prototype = this;
-				return new Child(opts, this);
-			}
-			return this;
-		},
-		/**
-		 * initialize the instance. Used internally.
-		 * @private
-		 * @name init(el, optons)
-		 * @param {DOMElement|jQuery|String} el the element we are transforming
-		 * @param {Object} options options for this instance
-		 * @trigger init.jstree, loading.jstree, loaded.jstree, ready.jstree, changed.jstree
-		 */
-		init : function (el, options) {
-			this._model = {
-				data : {},
-				changed : [],
-				force_full_redraw : false,
-				redraw_timeout : false,
-				default_state : {
-					loaded : true,
-					opened : false,
-					selected : false,
-					disabled : false
-				}
-			};
-			this._model.data[$.jstree.root] = {
-				id : $.jstree.root,
-				parent : null,
-				parents : [],
-				children : [],
-				children_d : [],
-				state : { loaded : false }
-			};
-
-			this.element = $(el).addClass('jstree jstree-' + this._id);
-			this.settings = options;
-
-			this._data.core.ready = false;
-			this._data.core.loaded = false;
-			this._data.core.rtl = (this.element.css("direction") === "rtl");
-			this.element[this._data.core.rtl ? 'addClass' : 'removeClass']("jstree-rtl");
-			this.element.attr('role','tree');
-			if(this.settings.core.multiple) {
-				this.element.attr('aria-multiselectable', true);
-			}
-			if(!this.element.attr('tabindex')) {
-				this.element.attr('tabindex','0');
-			}
-
-			this.bind();
-			/**
-			 * triggered after all events are bound
-			 * @event
-			 * @name init.jstree
-			 */
-			this.trigger("init");
-
-			this._data.core.original_container_html = this.element.find(" > ul > li").clone(true);
-			this._data.core.original_container_html
-				.find("li").addBack()
-				.contents().filter(function() {
-					return this.nodeType === 3 && (!this.nodeValue || /^\s+$/.test(this.nodeValue));
-				})
-				.remove();
-			this.element.html("<"+"ul class='jstree-container-ul jstree-children' role='group'><"+"li id='j"+this._id+"_loading' class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='none'><i class='jstree-icon jstree-ocl'></i><"+"a class='jstree-anchor' role='treeitem' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>" + this.get_string("Loading ...") + "</a></li></ul>");
-			this.element.attr('aria-activedescendant','j' + this._id + '_loading');
-			this._data.core.li_height = this.get_container_ul().children("li").first().outerHeight() || 24;
-			this._data.core.node = this._create_prototype_node();
-			/**
-			 * triggered after the loading text is shown and before loading starts
-			 * @event
-			 * @name loading.jstree
-			 */
-			this.trigger("loading");
-			this.load_node($.jstree.root);
-		},
-		/**
-		 * destroy an instance
-		 * @name destroy()
-		 * @param  {Boolean} keep_html if not set to `true` the container will be emptied, otherwise the current DOM elements will be kept intact
-		 */
-		destroy : function (keep_html) {
-			/**
-			 * triggered before the tree is destroyed
-			 * @event
-			 * @name destroy.jstree
-			 */
-			this.trigger("destroy");
-			if(this._wrk) {
-				try {
-					window.URL.revokeObjectURL(this._wrk);
-					this._wrk = null;
-				}
-				catch (ignore) { }
-			}
-			if(!keep_html) { this.element.empty(); }
-			this.teardown();
-		},
-		/**
-		 * Create a prototype node
-		 * @name _create_prototype_node()
-		 * @return {DOMElement}
-		 */
-		_create_prototype_node : function () {
-			var _node = document.createElement('LI'), _temp1, _temp2;
-			_node.setAttribute('role', 'none');
-			_temp1 = document.createElement('I');
-			_temp1.className = 'jstree-icon jstree-ocl';
-			_temp1.setAttribute('role', 'presentation');
-			_node.appendChild(_temp1);
-			_temp1 = document.createElement('A');
-			_temp1.className = 'jstree-anchor';
-			_temp1.setAttribute('href','#');
-			_temp1.setAttribute('tabindex','-1');
-			_temp1.setAttribute('role', 'treeitem');
-			_temp2 = document.createElement('I');
-			_temp2.className = 'jstree-icon jstree-themeicon';
-			_temp2.setAttribute('role', 'presentation');
-			_temp1.appendChild(_temp2);
-			_node.appendChild(_temp1);
-			_temp1 = _temp2 = null;
-
-			return _node;
-		},
-		_kbevent_to_func : function (e) {
-			var keys = {
-				8: "Backspace", 9: "Tab", 13: "Enter", 19: "Pause", 27: "Esc",
-				32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home",
-				37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "Print", 45: "Insert",
-				46: "Delete", 96: "Numpad0", 97: "Numpad1", 98: "Numpad2", 99 : "Numpad3",
-				100: "Numpad4", 101: "Numpad5", 102: "Numpad6", 103: "Numpad7",
-				104: "Numpad8", 105: "Numpad9", '-13': "NumpadEnter", 112: "F1",
-				113: "F2", 114: "F3", 115: "F4", 116: "F5", 117: "F6", 118: "F7",
-				119: "F8", 120: "F9", 121: "F10", 122: "F11", 123: "F12", 144: "Numlock",
-				145: "Scrolllock", 16: 'Shift', 17: 'Ctrl', 18: 'Alt',
-				48: '0',  49: '1',  50: '2',  51: '3',  52: '4', 53:  '5',
-				54: '6',  55: '7',  56: '8',  57: '9',  59: ';',  61: '=', 65:  'a',
-				66: 'b',  67: 'c',  68: 'd',  69: 'e',  70: 'f',  71: 'g', 72:  'h',
-				73: 'i',  74: 'j',  75: 'k',  76: 'l',  77: 'm',  78: 'n', 79:  'o',
-				80: 'p',  81: 'q',  82: 'r',  83: 's',  84: 't',  85: 'u', 86:  'v',
-				87: 'w',  88: 'x',  89: 'y',  90: 'z', 107: '+', 109: '-', 110: '.',
-				186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',
-				219: '[', 220: '\\',221: ']', 222: "'", 111: '/', 106: '*', 173: '-'
-			};
-			var parts = [];
-			if (e.ctrlKey) { parts.push('ctrl'); }
-			if (e.altKey) { parts.push('alt'); }
-            if (e.shiftKey) { parts.push('shift'); }
-			parts.push(keys[e.which] ? keys[e.which].toLowerCase() : e.which);
-            parts = parts.sort().join('-').toLowerCase();
-            if (parts === 'shift-shift' || parts === 'ctrl-ctrl' || parts === 'alt-alt') {
-                return null;
-            }
-
-			var kb = this.settings.core.keyboard, i, tmp;
-			for (i in kb) {
-				if (kb.hasOwnProperty(i)) {
-					tmp = i;
-					if (tmp !== '-' && tmp !== '+') {
-						tmp = tmp.replace('--', '-MINUS').replace('+-', '-MINUS').replace('++', '-PLUS').replace('-+', '-PLUS');
-						tmp = tmp.split(/-|\+/).sort().join('-').replace('MINUS', '-').replace('PLUS', '+').toLowerCase();
-					}
-					if (tmp === parts) {
-						return kb[i];
-					}
-				}
-			}
-			return null;
-		},
-		/**
-		 * part of the destroying of an instance. Used internally.
-		 * @private
-		 * @name teardown()
-		 */
-		teardown : function () {
-			this.unbind();
-			this.element
-				.removeClass('jstree')
-				.removeData('jstree')
-				.find("[class^='jstree']")
-					.addBack()
-					.attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); });
-			this.element = null;
-		},
-		/**
-		 * bind all events. Used internally.
-		 * @private
-		 * @name bind()
-		 */
-		bind : function () {
-			var word = '',
-				tout = null,
-				was_click = 0;
-			this.element
-				.on("dblclick.jstree", function (e) {
-						if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; }
-						if(document.selection && document.selection.empty) {
-							document.selection.empty();
-						}
-						else {
-							if(window.getSelection) {
-								var sel = window.getSelection();
-								try {
-									sel.removeAllRanges();
-									sel.collapse();
-								} catch (ignore) { }
-							}
-						}
-					})
-				.on("mousedown.jstree", function (e) {
-						if(e.target === this.element[0]) {
-							e.preventDefault(); // prevent losing focus when clicking scroll arrows (FF, Chrome)
-							was_click = +(new Date()); // ie does not allow to prevent losing focus
-						}
-					}.bind(this))
-				.on("mousedown.jstree", ".jstree-ocl", function (e) {
-						e.preventDefault(); // prevent any node inside from losing focus when clicking the open/close icon
-					})
-				.on("click.jstree", ".jstree-ocl", function (e) {
-						this.toggle_node(e.target);
-					}.bind(this))
-				.on("dblclick.jstree", ".jstree-anchor", function (e) {
-						if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; }
-						if(this.settings.core.dblclick_toggle) {
-							this.toggle_node(e.target);
-						}
-					}.bind(this))
-				.on("click.jstree", ".jstree-anchor", function (e) {
-						e.preventDefault();
-						if(e.currentTarget !== document.activeElement) { $(e.currentTarget).trigger('focus'); }
-						this.activate_node(e.currentTarget, e);
-					}.bind(this))
-				.on('keydown.jstree', '.jstree-anchor', function (e) {
-						if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; }
-						if(this._data.core.rtl) {
-							if(e.which === 37) { e.which = 39; }
-							else if(e.which === 39) { e.which = 37; }
-						}
-						var f = this._kbevent_to_func(e);
-						if (f) {
-							var r = f.call(this, e);
-							if (r === false || r === true) {
-								return r;
-							}
-						}
-					}.bind(this))
-				.on("load_node.jstree", function (e, data) {
-						if(data.status) {
-							if(data.node.id === $.jstree.root && !this._data.core.loaded) {
-								this._data.core.loaded = true;
-								if(this._firstChild(this.get_container_ul()[0])) {
-									this.element.attr('aria-activedescendant',this._firstChild(this.get_container_ul()[0]).id);
-								}
-								/**
-								 * triggered after the root node is loaded for the first time
-								 * @event
-								 * @name loaded.jstree
-								 */
-								this.trigger("loaded");
-							}
-							if(!this._data.core.ready) {
-								setTimeout(function() {
-									if(this.element && !this.get_container_ul().find('.jstree-loading').length) {
-										this._data.core.ready = true;
-										if(this._data.core.selected.length) {
-											if(this.settings.core.expand_selected_onload) {
-												var tmp = [], i, j;
-												for(i = 0, j = this._data.core.selected.length; i < j; i++) {
-													tmp = tmp.concat(this._model.data[this._data.core.selected[i]].parents);
-												}
-												tmp = $.vakata.array_unique(tmp);
-												for(i = 0, j = tmp.length; i < j; i++) {
-													this.open_node(tmp[i], false, 0);
-												}
-											}
-											this.trigger('changed', { 'action' : 'ready', 'selected' : this._data.core.selected });
-										}
-										/**
-										 * triggered after all nodes are finished loading
-										 * @event
-										 * @name ready.jstree
-										 */
-										this.trigger("ready");
-									}
-								}.bind(this), 0);
-							}
-						}
-					}.bind(this))
-				// quick searching when the tree is focused
-				.on('keypress.jstree', function (e) {
-						if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; }
-						if(tout) { clearTimeout(tout); }
-						tout = setTimeout(function () {
-							word = '';
-						}, 500);
-
-						var chr = String.fromCharCode(e.which).toLowerCase(),
-							col = this.element.find('.jstree-anchor').filter(':visible'),
-							ind = col.index(document.activeElement) || 0,
-							end = false;
-						word += chr;
-
-						// match for whole word from current node down (including the current node)
-						if(word.length > 1) {
-							col.slice(ind).each(function (i, v) {
-								if($(v).text().toLowerCase().indexOf(word) === 0) {
-									$(v).trigger('focus');
-									end = true;
-									return false;
-								}
-							}.bind(this));
-							if(end) { return; }
-
-							// match for whole word from the beginning of the tree
-							col.slice(0, ind).each(function (i, v) {
-								if($(v).text().toLowerCase().indexOf(word) === 0) {
-									$(v).trigger('focus');
-									end = true;
-									return false;
-								}
-							}.bind(this));
-							if(end) { return; }
-						}
-						// list nodes that start with that letter (only if word consists of a single char)
-						if(new RegExp('^' + chr.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '+$').test(word)) {
-							// search for the next node starting with that letter
-							col.slice(ind + 1).each(function (i, v) {
-								if($(v).text().toLowerCase().charAt(0) === chr) {
-									$(v).trigger('focus');
-									end = true;
-									return false;
-								}
-							}.bind(this));
-							if(end) { return; }
-
-							// search from the beginning
-							col.slice(0, ind + 1).each(function (i, v) {
-								if($(v).text().toLowerCase().charAt(0) === chr) {
-									$(v).trigger('focus');
-									end = true;
-									return false;
-								}
-							}.bind(this));
-							if(end) { return; }
-						}
-					}.bind(this))
-				// THEME RELATED
-				.on("init.jstree", function () {
-						var s = this.settings.core.themes;
-						this._data.core.themes.dots			= s.dots;
-						this._data.core.themes.stripes		= s.stripes;
-						this._data.core.themes.icons		= s.icons;
-						this._data.core.themes.ellipsis		= s.ellipsis;
-						this.set_theme(s.name || "default", s.url);
-						this.set_theme_variant(s.variant);
-					}.bind(this))
-				.on("loading.jstree", function () {
-						this[ this._data.core.themes.dots ? "show_dots" : "hide_dots" ]();
-						this[ this._data.core.themes.icons ? "show_icons" : "hide_icons" ]();
-						this[ this._data.core.themes.stripes ? "show_stripes" : "hide_stripes" ]();
-						this[ this._data.core.themes.ellipsis ? "show_ellipsis" : "hide_ellipsis" ]();
-					}.bind(this))
-				.on('blur.jstree', '.jstree-anchor', function (e) {
-						this._data.core.focused = null;
-						$(e.currentTarget).filter('.jstree-hovered').trigger('mouseleave');
-						this.element.attr('tabindex', '0');
-						$(e.currentTarget).attr('tabindex', '-1');
-					}.bind(this))
-				.on('focus.jstree', '.jstree-anchor', function (e) {
-						var tmp = this.get_node(e.currentTarget);
-						if(tmp && (tmp.id || tmp.id === 0)) {
-							this._data.core.focused = tmp.id;
-						}
-						this.element.find('.jstree-hovered').not(e.currentTarget).trigger('mouseleave');
-						$(e.currentTarget).trigger('mouseenter');
-						this.element.attr('tabindex', '-1');
-						$(e.currentTarget).attr('tabindex', '0');
-					}.bind(this))
-				.on('focus.jstree', function () {
-						if(+(new Date()) - was_click > 500 && !this._data.core.focused && this.settings.core.restore_focus) {
-							was_click = 0;
-							var act = this.get_node(this.element.attr('aria-activedescendant'), true);
-							if(act) {
-								act.find('> .jstree-anchor').trigger('focus');
-							}
-						}
-					}.bind(this))
-				.on('mouseenter.jstree', '.jstree-anchor', function (e) {
-						this.hover_node(e.currentTarget);
-					}.bind(this))
-				.on('mouseleave.jstree', '.jstree-anchor', function (e) {
-						this.dehover_node(e.currentTarget);
-					}.bind(this));
-		},
-		/**
-		 * part of the destroying of an instance. Used internally.
-		 * @private
-		 * @name unbind()
-		 */
-		unbind : function () {
-			this.element.off('.jstree');
-			$(document).off('.jstree-' + this._id);
-		},
-		/**
-		 * trigger an event. Used internally.
-		 * @private
-		 * @name trigger(ev [, data])
-		 * @param  {String} ev the name of the event to trigger
-		 * @param  {Object} data additional data to pass with the event
-		 */
-		trigger : function (ev, data) {
-			if(!data) {
-				data = {};
-			}
-			data.instance = this;
-			this.element.triggerHandler(ev.replace('.jstree','') + '.jstree', data);
-		},
-		/**
-		 * returns the jQuery extended instance container
-		 * @name get_container()
-		 * @return {jQuery}
-		 */
-		get_container : function () {
-			return this.element;
-		},
-		/**
-		 * returns the jQuery extended main UL node inside the instance container. Used internally.
-		 * @private
-		 * @name get_container_ul()
-		 * @return {jQuery}
-		 */
-		get_container_ul : function () {
-			return this.element.children(".jstree-children").first();
-		},
-		/**
-		 * gets string replacements (localization). Used internally.
-		 * @private
-		 * @name get_string(key)
-		 * @param  {String} key
-		 * @return {String}
-		 */
-		get_string : function (key) {
-			var a = this.settings.core.strings;
-			if($.vakata.is_function(a)) { return a.call(this, key); }
-			if(a && a[key]) { return a[key]; }
-			return key;
-		},
-		/**
-		 * gets the first child of a DOM node. Used internally.
-		 * @private
-		 * @name _firstChild(dom)
-		 * @param  {DOMElement} dom
-		 * @return {DOMElement}
-		 */
-		_firstChild : function (dom) {
-			dom = dom ? dom.firstChild : null;
-			while(dom !== null && dom.nodeType !== 1) {
-				dom = dom.nextSibling;
-			}
-			return dom;
-		},
-		/**
-		 * gets the next sibling of a DOM node. Used internally.
-		 * @private
-		 * @name _nextSibling(dom)
-		 * @param  {DOMElement} dom
-		 * @return {DOMElement}
-		 */
-		_nextSibling : function (dom) {
-			dom = dom ? dom.nextSibling : null;
-			while(dom !== null && dom.nodeType !== 1) {
-				dom = dom.nextSibling;
-			}
-			return dom;
-		},
-		/**
-		 * gets the previous sibling of a DOM node. Used internally.
-		 * @private
-		 * @name _previousSibling(dom)
-		 * @param  {DOMElement} dom
-		 * @return {DOMElement}
-		 */
-		_previousSibling : function (dom) {
-			dom = dom ? dom.previousSibling : null;
-			while(dom !== null && dom.nodeType !== 1) {
-				dom = dom.previousSibling;
-			}
-			return dom;
-		},
-		/**
-		 * get the JSON representation of a node (or the actual jQuery extended DOM node) by using any input (child DOM element, ID string, selector, etc)
-		 * @name get_node(obj [, as_dom])
-		 * @param  {mixed} obj
-		 * @param  {Boolean} as_dom
-		 * @return {Object|jQuery}
-		 */
-		get_node : function (obj, as_dom) {
-			if(obj && (obj.id || obj.id === 0)) {
-				obj = obj.id;
-			}
-			if (obj instanceof $ && obj.length && obj[0].id) {
-				obj = obj[0].id;
-			}
-			var dom;
-			try {
-				if(this._model.data[obj]) {
-					obj = this._model.data[obj];
-				}
-				else if(typeof obj === "string" && this._model.data[obj.replace(/^#/, '')]) {
-					obj = this._model.data[obj.replace(/^#/, '')];
-				}
-				else if(typeof obj === "string" && (dom = $('#' + obj.replace($.jstree.idregex,'\\$&'), this.element)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) {
-					obj = this._model.data[dom.closest('.jstree-node').attr('id')];
-				}
-				else if((dom = this.element.find(obj)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) {
-					obj = this._model.data[dom.closest('.jstree-node').attr('id')];
-				}
-				else if((dom = this.element.find(obj)).length && dom.hasClass('jstree')) {
-					obj = this._model.data[$.jstree.root];
-				}
-				else {
-					return false;
-				}
-
-				if(as_dom) {
-					obj = obj.id === $.jstree.root ? this.element : $('#' + obj.id.replace($.jstree.idregex,'\\$&'), this.element);
-				}
-				return obj;
-			} catch (ex) { return false; }
-		},
-		/**
-		 * get the path to a node, either consisting of node texts, or of node IDs, optionally glued together (otherwise an array)
-		 * @name get_path(obj [, glue, ids])
-		 * @param  {mixed} obj the node
-		 * @param  {String} glue if you want the path as a string - pass the glue here (for example '/'), if a falsy value is supplied here, an array is returned
-		 * @param  {Boolean} ids if set to true build the path using ID, otherwise node text is used
-		 * @return {mixed}
-		 */
-		get_path : function (obj, glue, ids) {
-			obj = obj.parents ? obj : this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root || !obj.parents) {
-				return false;
-			}
-			var i, j, p = [];
-			p.push(ids ? obj.id : obj.text);
-			for(i = 0, j = obj.parents.length; i < j; i++) {
-				p.push(ids ? obj.parents[i] : this.get_text(obj.parents[i]));
-			}
-			p = p.reverse().slice(1);
-			return glue ? p.join(glue) : p;
-		},
-		/**
-		 * get the next visible node that is below the `obj` node. If `strict` is set to `true` only sibling nodes are returned.
-		 * @name get_next_dom(obj [, strict])
-		 * @param  {mixed} obj
-		 * @param  {Boolean} strict
-		 * @return {jQuery}
-		 */
-		get_next_dom : function (obj, strict) {
-			var tmp;
-			obj = this.get_node(obj, true);
-			if(obj[0] === this.element[0]) {
-				tmp = this._firstChild(this.get_container_ul()[0]);
-				while (tmp && tmp.offsetHeight === 0) {
-					tmp = this._nextSibling(tmp);
-				}
-				return tmp ? $(tmp) : false;
-			}
-			if(!obj || !obj.length) {
-				return false;
-			}
-			if(strict) {
-				tmp = obj[0];
-				do {
-					tmp = this._nextSibling(tmp);
-				} while (tmp && tmp.offsetHeight === 0);
-				return tmp ? $(tmp) : false;
-			}
-			if(obj.hasClass("jstree-open")) {
-				tmp = this._firstChild(obj.children('.jstree-children')[0]);
-				while (tmp && tmp.offsetHeight === 0) {
-					tmp = this._nextSibling(tmp);
-				}
-				if(tmp !== null) {
-					return $(tmp);
-				}
-			}
-			tmp = obj[0];
-			do {
-				tmp = this._nextSibling(tmp);
-			} while (tmp && tmp.offsetHeight === 0);
-			if(tmp !== null) {
-				return $(tmp);
-			}
-			return obj.parentsUntil(".jstree",".jstree-node").nextAll(".jstree-node:visible").first();
-		},
-		/**
-		 * get the previous visible node that is above the `obj` node. If `strict` is set to `true` only sibling nodes are returned.
-		 * @name get_prev_dom(obj [, strict])
-		 * @param  {mixed} obj
-		 * @param  {Boolean} strict
-		 * @return {jQuery}
-		 */
-		get_prev_dom : function (obj, strict) {
-			var tmp;
-			obj = this.get_node(obj, true);
-			if(obj[0] === this.element[0]) {
-				tmp = this.get_container_ul()[0].lastChild;
-				while (tmp && tmp.offsetHeight === 0) {
-					tmp = this._previousSibling(tmp);
-				}
-				return tmp ? $(tmp) : false;
-			}
-			if(!obj || !obj.length) {
-				return false;
-			}
-			if(strict) {
-				tmp = obj[0];
-				do {
-					tmp = this._previousSibling(tmp);
-				} while (tmp && tmp.offsetHeight === 0);
-				return tmp ? $(tmp) : false;
-			}
-			tmp = obj[0];
-			do {
-				tmp = this._previousSibling(tmp);
-			} while (tmp && tmp.offsetHeight === 0);
-			if(tmp !== null) {
-				obj = $(tmp);
-				while(obj.hasClass("jstree-open")) {
-					obj = obj.children(".jstree-children").first().children(".jstree-node:visible:last");
-				}
-				return obj;
-			}
-			tmp = obj[0].parentNode.parentNode;
-			return tmp && tmp.className && tmp.className.indexOf('jstree-node') !== -1 ? $(tmp) : false;
-		},
-		/**
-		 * get the parent ID of a node
-		 * @name get_parent(obj)
-		 * @param  {mixed} obj
-		 * @return {String}
-		 */
-		get_parent : function (obj) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			return obj.parent;
-		},
-		/**
-		 * get a jQuery collection of all the children of a node (node must be rendered), returns false on error
-		 * @name get_children_dom(obj)
-		 * @param  {mixed} obj
-		 * @return {jQuery}
-		 */
-		get_children_dom : function (obj) {
-			obj = this.get_node(obj, true);
-			if(obj[0] === this.element[0]) {
-				return this.get_container_ul().children(".jstree-node");
-			}
-			if(!obj || !obj.length) {
-				return false;
-			}
-			return obj.children(".jstree-children").children(".jstree-node");
-		},
-		/**
-		 * checks if a node has children
-		 * @name is_parent(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_parent : function (obj) {
-			obj = this.get_node(obj);
-			return obj && (obj.state.loaded === false || obj.children.length > 0);
-		},
-		/**
-		 * checks if a node is loaded (its children are available)
-		 * @name is_loaded(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_loaded : function (obj) {
-			obj = this.get_node(obj);
-			return obj && obj.state.loaded;
-		},
-		/**
-		 * check if a node is currently loading (fetching children)
-		 * @name is_loading(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_loading : function (obj) {
-			obj = this.get_node(obj);
-			return obj && obj.state && obj.state.loading;
-		},
-		/**
-		 * check if a node is opened
-		 * @name is_open(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_open : function (obj) {
-			obj = this.get_node(obj);
-			return obj && obj.state.opened;
-		},
-		/**
-		 * check if a node is in a closed state
-		 * @name is_closed(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_closed : function (obj) {
-			obj = this.get_node(obj);
-			return obj && this.is_parent(obj) && !obj.state.opened;
-		},
-		/**
-		 * check if a node has no children
-		 * @name is_leaf(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_leaf : function (obj) {
-			return !this.is_parent(obj);
-		},
-		/**
-		 * loads a node (fetches its children using the `core.data` setting). Multiple nodes can be passed to by using an array.
-		 * @name load_node(obj [, callback])
-		 * @param  {mixed} obj
-		 * @param  {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives two arguments - the node and a boolean status
-		 * @return {Boolean}
-		 * @trigger load_node.jstree
-		 */
-		load_node : function (obj, callback) {
-			var dom = this.get_node(obj, true), k, l, i, j, c;
-			if($.vakata.is_array(obj)) {
-				this._load_nodes(obj.slice(), callback);
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj) {
-				if(callback) { callback.call(this, obj, false); }
-				return false;
-			}
-			// if(obj.state.loading) { } // the node is already loading - just wait for it to load and invoke callback? but if called implicitly it should be loaded again?
-			if(obj.state.loaded) {
-				obj.state.loaded = false;
-				for(i = 0, j = obj.parents.length; i < j; i++) {
-					this._model.data[obj.parents[i]].children_d = $.vakata.array_filter(this._model.data[obj.parents[i]].children_d, function (v) {
-						return $.inArray(v, obj.children_d) === -1;
-					});
-				}
-				for(k = 0, l = obj.children_d.length; k < l; k++) {
-					if(this._model.data[obj.children_d[k]].state.selected) {
-						c = true;
-					}
-					delete this._model.data[obj.children_d[k]];
-				}
-				if (c) {
-					this._data.core.selected = $.vakata.array_filter(this._data.core.selected, function (v) {
-						return $.inArray(v, obj.children_d) === -1;
-					});
-				}
-				obj.children = [];
-				obj.children_d = [];
-				if(c) {
-					this.trigger('changed', { 'action' : 'load_node', 'node' : obj, 'selected' : this._data.core.selected });
-				}
-			}
-			obj.state.failed = false;
-			obj.state.loading = true;
-			if (obj.id !== $.jstree.root) {
-				dom.children(".jstree-anchor").attr('aria-busy', true);
-			} else {
-				dom.attr('aria-busy', true);
-			}
-			dom.addClass("jstree-loading");
-			this._load_node(obj, function (status) {
-				obj = this._model.data[obj.id];
-				obj.state.loading = false;
-				obj.state.loaded = status;
-				obj.state.failed = !obj.state.loaded;
-				var dom = this.get_node(obj, true), i = 0, j = 0, m = this._model.data, has_children = false;
-				for(i = 0, j = obj.children.length; i < j; i++) {
-					if(m[obj.children[i]] && !m[obj.children[i]].state.hidden) {
-						has_children = true;
-						break;
-					}
-				}
-				if(obj.state.loaded && dom && dom.length) {
-					dom.removeClass('jstree-closed jstree-open jstree-leaf');
-					if (!has_children) {
-						dom.addClass('jstree-leaf');
-					}
-					else {
-						if (obj.id !== '#') {
-							dom.addClass(obj.state.opened ? 'jstree-open' : 'jstree-closed');
-						}
-					}
-				}
-				if (obj.id !== $.jstree.root) {
-					dom.children(".jstree-anchor").attr('aria-busy', false);
-				} else {
-					dom.attr('aria-busy', false);
-				}
-				dom.removeClass("jstree-loading");
-				/**
-				 * triggered after a node is loaded
-				 * @event
-				 * @name load_node.jstree
-				 * @param {Object} node the node that was loading
-				 * @param {Boolean} status was the node loaded successfully
-				 */
-				this.trigger('load_node', { "node" : obj, "status" : status });
-				if(callback) {
-					callback.call(this, obj, status);
-				}
-			}.bind(this));
-			return true;
-		},
-		/**
-		 * load an array of nodes (will also load unavailable nodes as soon as they appear in the structure). Used internally.
-		 * @private
-		 * @name _load_nodes(nodes [, callback])
-		 * @param  {array} nodes
-		 * @param  {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - the array passed to _load_nodes
-		 */
-		_load_nodes : function (nodes, callback, is_callback, force_reload) {
-			var r = true,
-				c = function () { this._load_nodes(nodes, callback, true); },
-				m = this._model.data, i, j, tmp = [];
-			for(i = 0, j = nodes.length; i < j; i++) {
-				if(m[nodes[i]] && ( (!m[nodes[i]].state.loaded && !m[nodes[i]].state.failed) || (!is_callback && force_reload) )) {
-					if(!this.is_loading(nodes[i])) {
-						this.load_node(nodes[i], c);
-					}
-					r = false;
-				}
-			}
-			if(r) {
-				for(i = 0, j = nodes.length; i < j; i++) {
-					if(m[nodes[i]] && m[nodes[i]].state.loaded) {
-						tmp.push(nodes[i]);
-					}
-				}
-				if(callback && !callback.done) {
-					callback.call(this, tmp);
-					callback.done = true;
-				}
-			}
-		},
-		/**
-		 * loads all unloaded nodes
-		 * @name load_all([obj, callback])
-		 * @param {mixed} obj the node to load recursively, omit to load all nodes in the tree
-		 * @param {function} callback a function to be executed once loading all the nodes is complete,
-		 * @trigger load_all.jstree
-		 */
-		load_all : function (obj, callback) {
-			if(!obj) { obj = $.jstree.root; }
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			var to_load = [],
-				m = this._model.data,
-				c = m[obj.id].children_d,
-				i, j;
-			if(obj.state && !obj.state.loaded) {
-				to_load.push(obj.id);
-			}
-			for(i = 0, j = c.length; i < j; i++) {
-				if(m[c[i]] && m[c[i]].state && !m[c[i]].state.loaded) {
-					to_load.push(c[i]);
-				}
-			}
-			if(to_load.length) {
-				this._load_nodes(to_load, function () {
-					this.load_all(obj, callback);
-				});
-			}
-			else {
-				/**
-				 * triggered after a load_all call completes
-				 * @event
-				 * @name load_all.jstree
-				 * @param {Object} node the recursively loaded node
-				 */
-				if(callback) { callback.call(this, obj); }
-				this.trigger('load_all', { "node" : obj });
-			}
-		},
-		/**
-		 * handles the actual loading of a node. Used only internally.
-		 * @private
-		 * @name _load_node(obj [, callback])
-		 * @param  {mixed} obj
-		 * @param  {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - a boolean status
-		 * @return {Boolean}
-		 */
-		_load_node : function (obj, callback) {
-			var s = this.settings.core.data, t;
-			var notTextOrCommentNode = function notTextOrCommentNode () {
-				return this.nodeType !== 3 && this.nodeType !== 8;
-			};
-			// use original HTML
-			if(!s) {
-				if(obj.id === $.jstree.root) {
-					return this._append_html_data(obj, this._data.core.original_container_html.clone(true), function (status) {
-						callback.call(this, status);
-					});
-				}
-				else {
-					return callback.call(this, false);
-				}
-				// return callback.call(this, obj.id === $.jstree.root ? this._append_html_data(obj, this._data.core.original_container_html.clone(true)) : false);
-			}
-			if($.vakata.is_function(s)) {
-				return s.call(this, obj, function (d) {
-					if(d === false) {
-						callback.call(this, false);
-					}
-					else {
-						this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $($.parseHTML(d)).filter(notTextOrCommentNode) : d, function (status) {
-							callback.call(this, status);
-						});
-					}
-					// return d === false ? callback.call(this, false) : callback.call(this, this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $(d) : d));
-				}.bind(this));
-			}
-			if(typeof s === 'object') {
-				if(s.url) {
-					s = $.extend(true, {}, s);
-					if($.vakata.is_function(s.url)) {
-						s.url = s.url.call(this, obj);
-					}
-					if($.vakata.is_function(s.data)) {
-						s.data = s.data.call(this, obj);
-					}
-					return $.ajax(s)
-						.done(function (d,t,x) {
-								var type = x.getResponseHeader('Content-Type');
-								if((type && type.indexOf('json') !== -1) || typeof d === "object") {
-									return this._append_json_data(obj, d, function (status) { callback.call(this, status); });
-									//return callback.call(this, this._append_json_data(obj, d));
-								}
-								if((type && type.indexOf('html') !== -1) || typeof d === "string") {
-									return this._append_html_data(obj, $($.parseHTML(d)).filter(notTextOrCommentNode), function (status) { callback.call(this, status); });
-									// return callback.call(this, this._append_html_data(obj, $(d)));
-								}
-								this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'core', 'id' : 'core_04', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id, 'xhr' : x }) };
-								this.settings.core.error.call(this, this._data.core.last_error);
-								return callback.call(this, false);
-							}.bind(this))
-						.fail(function (f) {
-								this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'core', 'id' : 'core_04', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id, 'xhr' : f }) };
-								callback.call(this, false);
-								this.settings.core.error.call(this, this._data.core.last_error);
-							}.bind(this));
-				}
-				if ($.vakata.is_array(s)) {
-					t = $.extend(true, [], s);
-				} else if ($.isPlainObject(s)) {
-					t = $.extend(true, {}, s);
-				} else {
-					t = s;
-				}
-				if(obj.id === $.jstree.root) {
-					return this._append_json_data(obj, t, function (status) {
-						callback.call(this, status);
-					});
-				}
-				else {
-					this._data.core.last_error = { 'error' : 'nodata', 'plugin' : 'core', 'id' : 'core_05', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id }) };
-					this.settings.core.error.call(this, this._data.core.last_error);
-					return callback.call(this, false);
-				}
-				//return callback.call(this, (obj.id === $.jstree.root ? this._append_json_data(obj, t) : false) );
-			}
-			if(typeof s === 'string') {
-				if(obj.id === $.jstree.root) {
-					return this._append_html_data(obj, $($.parseHTML(s)).filter(notTextOrCommentNode), function (status) {
-						callback.call(this, status);
-					});
-				}
-				else {
-					this._data.core.last_error = { 'error' : 'nodata', 'plugin' : 'core', 'id' : 'core_06', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id }) };
-					this.settings.core.error.call(this, this._data.core.last_error);
-					return callback.call(this, false);
-				}
-				//return callback.call(this, (obj.id === $.jstree.root ? this._append_html_data(obj, $(s)) : false) );
-			}
-			return callback.call(this, false);
-		},
-		/**
-		 * adds a node to the list of nodes to redraw. Used only internally.
-		 * @private
-		 * @name _node_changed(obj [, callback])
-		 * @param  {mixed} obj
-		 */
-		_node_changed : function (obj) {
-			obj = this.get_node(obj);
-      if (obj && $.inArray(obj.id, this._model.changed) === -1) {
-				this._model.changed.push(obj.id);
-			}
-		},
-		/**
-		 * appends HTML content to the tree. Used internally.
-		 * @private
-		 * @name _append_html_data(obj, data)
-		 * @param  {mixed} obj the node to append to
-		 * @param  {String} data the HTML string to parse and append
-		 * @trigger model.jstree, changed.jstree
-		 */
-		_append_html_data : function (dom, data, cb) {
-			dom = this.get_node(dom);
-			dom.children = [];
-			dom.children_d = [];
-			var dat = data.is('ul') ? data.children() : data,
-				par = dom.id,
-				chd = [],
-				dpc = [],
-				m = this._model.data,
-				p = m[par],
-				s = this._data.core.selected.length,
-				tmp, i, j;
-			dat.each(function (i, v) {
-				tmp = this._parse_model_from_html($(v), par, p.parents.concat());
-				if(tmp) {
-					chd.push(tmp);
-					dpc.push(tmp);
-					if(m[tmp].children_d.length) {
-						dpc = dpc.concat(m[tmp].children_d);
-					}
-				}
-			}.bind(this));
-			p.children = chd;
-			p.children_d = dpc;
-			for(i = 0, j = p.parents.length; i < j; i++) {
-				m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);
-			}
-			/**
-			 * triggered when new data is inserted to the tree model
-			 * @event
-			 * @name model.jstree
-			 * @param {Array} nodes an array of node IDs
-			 * @param {String} parent the parent ID of the nodes
-			 */
-			this.trigger('model', { "nodes" : dpc, 'parent' : par });
-			if(par !== $.jstree.root) {
-				this._node_changed(par);
-				this.redraw();
-			}
-			else {
-				this.get_container_ul().children('.jstree-initial-node').remove();
-				this.redraw(true);
-			}
-			if(this._data.core.selected.length !== s) {
-				this.trigger('changed', { 'action' : 'model', 'selected' : this._data.core.selected });
-			}
-			cb.call(this, true);
-		},
-		/**
-		 * appends JSON content to the tree. Used internally.
-		 * @private
-		 * @name _append_json_data(obj, data)
-		 * @param  {mixed} obj the node to append to
-		 * @param  {String} data the JSON object to parse and append
-		 * @param  {Boolean} force_processing internal param - do not set
-		 * @trigger model.jstree, changed.jstree
-		 */
-		_append_json_data : function (dom, data, cb, force_processing) {
-			if(this.element === null) { return; }
-			dom = this.get_node(dom);
-			dom.children = [];
-			dom.children_d = [];
-			// *%$@!!!
-			if(data.d) {
-				data = data.d;
-				if(typeof data === "string") {
-					data = JSON.parse(data);
-				}
-			}
-			if(!$.vakata.is_array(data)) { data = [data]; }
-			var w = null,
-				args = {
-					'df'	: this._model.default_state,
-					'dat'	: data,
-					'par'	: dom.id,
-					'm'		: this._model.data,
-					't_id'	: this._id,
-					't_cnt'	: this._cnt,
-					'sel'	: this._data.core.selected
-				},
-				inst = this,
-				func = function (data, undefined) {
-					if(data.data) { data = data.data; }
-					var dat = data.dat,
-						par = data.par,
-						chd = [],
-						dpc = [],
-						add = [],
-						df = data.df,
-						t_id = data.t_id,
-						t_cnt = data.t_cnt,
-						m = data.m,
-						p = m[par],
-						sel = data.sel,
-						tmp, i, j, rslt,
-						parse_flat = function (d, p, ps) {
-							if(!ps) { ps = []; }
-							else { ps = ps.concat(); }
-							if(p) { ps.unshift(p); }
-							var tid = d.id.toString(),
-								i, j, c, e,
-								tmp = {
-									id			: tid,
-									text		: d.text || '',
-									icon		: d.icon !== undefined ? d.icon : true,
-									parent		: p,
-									parents		: ps,
-									children	: d.children || [],
-									children_d	: d.children_d || [],
-									data		: d.data,
-									state		: { },
-									li_attr		: { id : false },
-									a_attr		: { href : '#' },
-									original	: false
-								};
-							for(i in df) {
-								if(df.hasOwnProperty(i)) {
-									tmp.state[i] = df[i];
-								}
-							}
-							if(d && d.data && d.data.jstree && d.data.jstree.icon) {
-								tmp.icon = d.data.jstree.icon;
-							}
-							if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") {
-								tmp.icon = true;
-							}
-							if(d && d.data) {
-								tmp.data = d.data;
-								if(d.data.jstree) {
-									for(i in d.data.jstree) {
-										if(d.data.jstree.hasOwnProperty(i)) {
-											tmp.state[i] = d.data.jstree[i];
-										}
-									}
-								}
-							}
-							if(d && typeof d.state === 'object') {
-								for (i in d.state) {
-									if(d.state.hasOwnProperty(i)) {
-										tmp.state[i] = d.state[i];
-									}
-								}
-							}
-							if(d && typeof d.li_attr === 'object') {
-								for (i in d.li_attr) {
-									if(d.li_attr.hasOwnProperty(i)) {
-										tmp.li_attr[i] = d.li_attr[i];
-									}
-								}
-							}
-							if(!tmp.li_attr.id) {
-								tmp.li_attr.id = tid;
-							}
-							if(d && typeof d.a_attr === 'object') {
-								for (i in d.a_attr) {
-									if(d.a_attr.hasOwnProperty(i)) {
-										tmp.a_attr[i] = d.a_attr[i];
-									}
-								}
-							}
-							if(d && d.children && d.children === true) {
-								tmp.state.loaded = false;
-								tmp.children = [];
-								tmp.children_d = [];
-							}
-							m[tmp.id] = tmp;
-							for(i = 0, j = tmp.children.length; i < j; i++) {
-								c = parse_flat(m[tmp.children[i]], tmp.id, ps);
-								e = m[c];
-								tmp.children_d.push(c);
-								if(e.children_d.length) {
-									tmp.children_d = tmp.children_d.concat(e.children_d);
-								}
-							}
-							delete d.data;
-							delete d.children;
-							m[tmp.id].original = d;
-							if(tmp.state.selected) {
-								add.push(tmp.id);
-							}
-							return tmp.id;
-						},
-						parse_nest = function (d, p, ps) {
-							if(!ps) { ps = []; }
-							else { ps = ps.concat(); }
-							if(p) { ps.unshift(p); }
-							var tid = false, i, j, c, e, tmp;
-							do {
-								tid = 'j' + t_id + '_' + (++t_cnt);
-							} while(m[tid]);
-
-							tmp = {
-								id			: false,
-								text		: typeof d === 'string' ? d : '',
-								icon		: typeof d === 'object' && d.icon !== undefined ? d.icon : true,
-								parent		: p,
-								parents		: ps,
-								children	: [],
-								children_d	: [],
-								data		: null,
-								state		: { },
-								li_attr		: { id : false },
-								a_attr		: { href : '#' },
-								original	: false
-							};
-							for(i in df) {
-								if(df.hasOwnProperty(i)) {
-									tmp.state[i] = df[i];
-								}
-							}
-							if(d && (d.id || d.id === 0)) { tmp.id = d.id.toString(); }
-							if(d && d.text) { tmp.text = d.text; }
-							if(d && d.data && d.data.jstree && d.data.jstree.icon) {
-								tmp.icon = d.data.jstree.icon;
-							}
-							if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") {
-								tmp.icon = true;
-							}
-							if(d && d.data) {
-								tmp.data = d.data;
-								if(d.data.jstree) {
-									for(i in d.data.jstree) {
-										if(d.data.jstree.hasOwnProperty(i)) {
-											tmp.state[i] = d.data.jstree[i];
-										}
-									}
-								}
-							}
-							if(d && typeof d.state === 'object') {
-								for (i in d.state) {
-									if(d.state.hasOwnProperty(i)) {
-										tmp.state[i] = d.state[i];
-									}
-								}
-							}
-							if(d && typeof d.li_attr === 'object') {
-								for (i in d.li_attr) {
-									if(d.li_attr.hasOwnProperty(i)) {
-										tmp.li_attr[i] = d.li_attr[i];
-									}
-								}
-							}
-							if(tmp.li_attr.id && !(tmp.id || tmp.id === 0)) {
-								tmp.id = tmp.li_attr.id.toString();
-							}
-							if(!(tmp.id || tmp.id === 0)) {
-								tmp.id = tid;
-							}
-							if(!tmp.li_attr.id) {
-								tmp.li_attr.id = tmp.id;
-							}
-							if(d && typeof d.a_attr === 'object') {
-								for (i in d.a_attr) {
-									if(d.a_attr.hasOwnProperty(i)) {
-										tmp.a_attr[i] = d.a_attr[i];
-									}
-								}
-							}
-							if(d && d.children && d.children.length) {
-								for(i = 0, j = d.children.length; i < j; i++) {
-									c = parse_nest(d.children[i], tmp.id, ps);
-									e = m[c];
-									tmp.children.push(c);
-									if(e.children_d.length) {
-										tmp.children_d = tmp.children_d.concat(e.children_d);
-									}
-								}
-								tmp.children_d = tmp.children_d.concat(tmp.children);
-							}
-							if(d && d.children && d.children === true) {
-								tmp.state.loaded = false;
-								tmp.children = [];
-								tmp.children_d = [];
-							}
-							delete d.data;
-							delete d.children;
-							tmp.original = d;
-							m[tmp.id] = tmp;
-							if(tmp.state.selected) {
-								add.push(tmp.id);
-							}
-							return tmp.id;
-						};
-
-					if(dat.length && dat[0].id !== undefined && dat[0].parent !== undefined) {
-						// Flat JSON support (for easy import from DB):
-						// 1) convert to object (foreach)
-						for(i = 0, j = dat.length; i < j; i++) {
-							if(!dat[i].children) {
-								dat[i].children = [];
-							}
-							if(!dat[i].state) {
-								dat[i].state = {};
-							}
-							m[dat[i].id.toString()] = dat[i];
-						}
-						// 2) populate children (foreach)
-						for(i = 0, j = dat.length; i < j; i++) {
-							if (!m[dat[i].parent.toString()]) {
-								if (typeof inst !== "undefined") {
-									inst._data.core.last_error = { 'error' : 'parse', 'plugin' : 'core', 'id' : 'core_07', 'reason' : 'Node with invalid parent', 'data' : JSON.stringify({ 'id' : dat[i].id.toString(), 'parent' : dat[i].parent.toString() }) };
-									inst.settings.core.error.call(inst, inst._data.core.last_error);
-								}
-								continue;
-							}
-
-							m[dat[i].parent.toString()].children.push(dat[i].id.toString());
-							// populate parent.children_d
-							p.children_d.push(dat[i].id.toString());
-						}
-						// 3) normalize && populate parents and children_d with recursion
-						for(i = 0, j = p.children.length; i < j; i++) {
-							tmp = parse_flat(m[p.children[i]], par, p.parents.concat());
-							dpc.push(tmp);
-							if(m[tmp].children_d.length) {
-								dpc = dpc.concat(m[tmp].children_d);
-							}
-						}
-						for(i = 0, j = p.parents.length; i < j; i++) {
-							m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);
-						}
-						// ?) three_state selection - p.state.selected && t - (if three_state foreach(dat => ch) -> foreach(parents) if(parent.selected) child.selected = true;
-						rslt = {
-							'cnt' : t_cnt,
-							'mod' : m,
-							'sel' : sel,
-							'par' : par,
-							'dpc' : dpc,
-							'add' : add
-						};
-					}
-					else {
-						for(i = 0, j = dat.length; i < j; i++) {
-							tmp = parse_nest(dat[i], par, p.parents.concat());
-							if(tmp) {
-								chd.push(tmp);
-								dpc.push(tmp);
-								if(m[tmp].children_d.length) {
-									dpc = dpc.concat(m[tmp].children_d);
-								}
-							}
-						}
-						p.children = chd;
-						p.children_d = dpc;
-						for(i = 0, j = p.parents.length; i < j; i++) {
-							m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);
-						}
-						rslt = {
-							'cnt' : t_cnt,
-							'mod' : m,
-							'sel' : sel,
-							'par' : par,
-							'dpc' : dpc,
-							'add' : add
-						};
-					}
-					if(typeof window === 'undefined' || typeof window.document === 'undefined') {
-						postMessage(rslt);
-					}
-					else {
-						return rslt;
-					}
-				},
-				rslt = function (rslt, worker) {
-					if(this.element === null) { return; }
-					this._cnt = rslt.cnt;
-					var i, m = this._model.data;
-					for (i in m) {
-						if (m.hasOwnProperty(i) && m[i].state && m[i].state.loading && rslt.mod[i]) {
-							rslt.mod[i].state.loading = true;
-						}
-					}
-					this._model.data = rslt.mod; // breaks the reference in load_node - careful
-
-					if(worker) {
-						var j, a = rslt.add, r = rslt.sel, s = this._data.core.selected.slice();
-						m = this._model.data;
-						// if selection was changed while calculating in worker
-						if(r.length !== s.length || $.vakata.array_unique(r.concat(s)).length !== r.length) {
-							// deselect nodes that are no longer selected
-							for(i = 0, j = r.length; i < j; i++) {
-								if($.inArray(r[i], a) === -1 && $.inArray(r[i], s) === -1) {
-									m[r[i]].state.selected = false;
-								}
-							}
-							// select nodes that were selected in the mean time
-							for(i = 0, j = s.length; i < j; i++) {
-								if($.inArray(s[i], r) === -1) {
-									m[s[i]].state.selected = true;
-								}
-							}
-						}
-					}
-					if(rslt.add.length) {
-						this._data.core.selected = this._data.core.selected.concat(rslt.add);
-					}
-
-					this.trigger('model', { "nodes" : rslt.dpc, 'parent' : rslt.par });
-
-					if(rslt.par !== $.jstree.root) {
-						this._node_changed(rslt.par);
-						this.redraw();
-					}
-					else {
-						// this.get_container_ul().children('.jstree-initial-node').remove();
-						this.redraw(true);
-					}
-					if(rslt.add.length) {
-						this.trigger('changed', { 'action' : 'model', 'selected' : this._data.core.selected });
-					}
-
-					// If no worker, try to mimic worker behavioour, by invoking cb asynchronously
-					if (!worker && setImmediate) {
-						setImmediate(function(){
-							cb.call(inst, true);
-						});
-					}
-					else {
-						cb.call(inst, true);
-					}
-				};
-			if(this.settings.core.worker && window.Blob && window.URL && window.Worker) {
-				try {
-					if(this._wrk === null) {
-						this._wrk = window.URL.createObjectURL(
-							new window.Blob(
-								['self.onmessage = ' + func.toString()],
-								{type:"text/javascript"}
-							)
-						);
-					}
-					if(!this._data.core.working || force_processing) {
-						this._data.core.working = true;
-						w = new window.Worker(this._wrk);
-						w.onmessage = function (e) {
-							rslt.call(this, e.data, true);
-							try { w.terminate(); w = null; } catch(ignore) { }
-							if(this._data.core.worker_queue.length) {
-								this._append_json_data.apply(this, this._data.core.worker_queue.shift());
-							}
-							else {
-								this._data.core.working = false;
-							}
-						}.bind(this);
-						w.onerror = function (e) {
-							rslt.call(this, func(args), false);
-							if(this._data.core.worker_queue.length) {
-								this._append_json_data.apply(this, this._data.core.worker_queue.shift());
-							}
-							else {
-								this._data.core.working = false;
-							}
-						}.bind(this);
-						if(!args.par) {
-							if(this._data.core.worker_queue.length) {
-								this._append_json_data.apply(this, this._data.core.worker_queue.shift());
-							}
-							else {
-								this._data.core.working = false;
-							}
-						}
-						else {
-							w.postMessage(args);
-						}
-					}
-					else {
-						this._data.core.worker_queue.push([dom, data, cb, true]);
-					}
-				}
-				catch(e) {
-					rslt.call(this, func(args), false);
-					if(this._data.core.worker_queue.length) {
-						this._append_json_data.apply(this, this._data.core.worker_queue.shift());
-					}
-					else {
-						this._data.core.working = false;
-					}
-				}
-			}
-			else {
-				rslt.call(this, func(args), false);
-			}
-		},
-		/**
-		 * parses a node from a jQuery object and appends them to the in memory tree model. Used internally.
-		 * @private
-		 * @name _parse_model_from_html(d [, p, ps])
-		 * @param  {jQuery} d the jQuery object to parse
-		 * @param  {String} p the parent ID
-		 * @param  {Array} ps list of all parents
-		 * @return {String} the ID of the object added to the model
-		 */
-		_parse_model_from_html : function (d, p, ps) {
-			if(!ps) { ps = []; }
-			else { ps = [].concat(ps); }
-			if(p) { ps.unshift(p); }
-			var c, e, m = this._model.data,
-				data = {
-					id			: false,
-					text		: false,
-					icon		: true,
-					parent		: p,
-					parents		: ps,
-					children	: [],
-					children_d	: [],
-					data		: null,
-					state		: { },
-					li_attr		: { id : false },
-					a_attr		: { href : '#' },
-					original	: false
-				}, i, tmp, tid;
-			for(i in this._model.default_state) {
-				if(this._model.default_state.hasOwnProperty(i)) {
-					data.state[i] = this._model.default_state[i];
-				}
-			}
-			tmp = $.vakata.attributes(d, true);
-			$.each(tmp, function (i, v) {
-				v = $.vakata.trim(v);
-				if(!v.length) { return true; }
-				data.li_attr[i] = v;
-				if(i === 'id') {
-					data.id = v.toString();
-				}
-			});
-			tmp = d.children('a').first();
-			if(tmp.length) {
-				tmp = $.vakata.attributes(tmp, true);
-				$.each(tmp, function (i, v) {
-					v = $.vakata.trim(v);
-					if(v.length) {
-						data.a_attr[i] = v;
-					}
-				});
-			}
-			tmp = d.children("a").first().length ? d.children("a").first().clone() : d.clone();
-			tmp.children("ins, i, ul").remove();
-			tmp = tmp.html();
-			tmp = $('<div></div>').html(tmp);
-			data.text = this.settings.core.force_text ? tmp.text() : tmp.html();
-			tmp = d.data();
-			data.data = tmp ? $.extend(true, {}, tmp) : null;
-			data.state.opened = d.hasClass('jstree-open');
-			data.state.selected = d.children('a').hasClass('jstree-clicked');
-			data.state.disabled = d.children('a').hasClass('jstree-disabled');
-			if(data.data && data.data.jstree) {
-				for(i in data.data.jstree) {
-					if(data.data.jstree.hasOwnProperty(i)) {
-						data.state[i] = data.data.jstree[i];
-					}
-				}
-			}
-			tmp = d.children("a").children(".jstree-themeicon");
-			if(tmp.length) {
-				data.icon = tmp.hasClass('jstree-themeicon-hidden') ? false : tmp.attr('rel');
-			}
-			if(data.state.icon !== undefined) {
-				data.icon = data.state.icon;
-			}
-			if(data.icon === undefined || data.icon === null || data.icon === "") {
-				data.icon = true;
-			}
-			tmp = d.children("ul").children("li");
-			do {
-				tid = 'j' + this._id + '_' + (++this._cnt);
-			} while(m[tid]);
-			data.id = data.li_attr.id ? data.li_attr.id.toString() : tid;
-			if(tmp.length) {
-				tmp.each(function (i, v) {
-					c = this._parse_model_from_html($(v), data.id, ps);
-					e = this._model.data[c];
-					data.children.push(c);
-					if(e.children_d.length) {
-						data.children_d = data.children_d.concat(e.children_d);
-					}
-				}.bind(this));
-				data.children_d = data.children_d.concat(data.children);
-			}
-			else {
-				if(d.hasClass('jstree-closed')) {
-					data.state.loaded = false;
-				}
-			}
-			if(data.li_attr['class']) {
-				data.li_attr['class'] = data.li_attr['class'].replace('jstree-closed','').replace('jstree-open','');
-			}
-			if(data.a_attr['class']) {
-				data.a_attr['class'] = data.a_attr['class'].replace('jstree-clicked','').replace('jstree-disabled','');
-			}
-			m[data.id] = data;
-			if(data.state.selected) {
-				this._data.core.selected.push(data.id);
-			}
-			return data.id;
-		},
-		/**
-		 * parses a node from a JSON object (used when dealing with flat data, which has no nesting of children, but has id and parent properties) and appends it to the in memory tree model. Used internally.
-		 * @private
-		 * @name _parse_model_from_flat_json(d [, p, ps])
-		 * @param  {Object} d the JSON object to parse
-		 * @param  {String} p the parent ID
-		 * @param  {Array} ps list of all parents
-		 * @return {String} the ID of the object added to the model
-		 */
-		_parse_model_from_flat_json : function (d, p, ps) {
-			if(!ps) { ps = []; }
-			else { ps = ps.concat(); }
-			if(p) { ps.unshift(p); }
-			var tid = d.id.toString(),
-				m = this._model.data,
-				df = this._model.default_state,
-				i, j, c, e,
-				tmp = {
-					id			: tid,
-					text		: d.text || '',
-					icon		: d.icon !== undefined ? d.icon : true,
-					parent		: p,
-					parents		: ps,
-					children	: d.children || [],
-					children_d	: d.children_d || [],
-					data		: d.data,
-					state		: { },
-					li_attr		: { id : false },
-					a_attr		: { href : '#' },
-					original	: false
-				};
-			for(i in df) {
-				if(df.hasOwnProperty(i)) {
-					tmp.state[i] = df[i];
-				}
-			}
-			if(d && d.data && d.data.jstree && d.data.jstree.icon) {
-				tmp.icon = d.data.jstree.icon;
-			}
-			if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") {
-				tmp.icon = true;
-			}
-			if(d && d.data) {
-				tmp.data = d.data;
-				if(d.data.jstree) {
-					for(i in d.data.jstree) {
-						if(d.data.jstree.hasOwnProperty(i)) {
-							tmp.state[i] = d.data.jstree[i];
-						}
-					}
-				}
-			}
-			if(d && typeof d.state === 'object') {
-				for (i in d.state) {
-					if(d.state.hasOwnProperty(i)) {
-						tmp.state[i] = d.state[i];
-					}
-				}
-			}
-			if(d && typeof d.li_attr === 'object') {
-				for (i in d.li_attr) {
-					if(d.li_attr.hasOwnProperty(i)) {
-						tmp.li_attr[i] = d.li_attr[i];
-					}
-				}
-			}
-			if(!tmp.li_attr.id) {
-				tmp.li_attr.id = tid;
-			}
-			if(d && typeof d.a_attr === 'object') {
-				for (i in d.a_attr) {
-					if(d.a_attr.hasOwnProperty(i)) {
-						tmp.a_attr[i] = d.a_attr[i];
-					}
-				}
-			}
-			if(d && d.children && d.children === true) {
-				tmp.state.loaded = false;
-				tmp.children = [];
-				tmp.children_d = [];
-			}
-			m[tmp.id] = tmp;
-			for(i = 0, j = tmp.children.length; i < j; i++) {
-				c = this._parse_model_from_flat_json(m[tmp.children[i]], tmp.id, ps);
-				e = m[c];
-				tmp.children_d.push(c);
-				if(e.children_d.length) {
-					tmp.children_d = tmp.children_d.concat(e.children_d);
-				}
-			}
-			delete d.data;
-			delete d.children;
-			m[tmp.id].original = d;
-			if(tmp.state.selected) {
-				this._data.core.selected.push(tmp.id);
-			}
-			return tmp.id;
-		},
-		/**
-		 * parses a node from a JSON object and appends it to the in memory tree model. Used internally.
-		 * @private
-		 * @name _parse_model_from_json(d [, p, ps])
-		 * @param  {Object} d the JSON object to parse
-		 * @param  {String} p the parent ID
-		 * @param  {Array} ps list of all parents
-		 * @return {String} the ID of the object added to the model
-		 */
-		_parse_model_from_json : function (d, p, ps) {
-			if(!ps) { ps = []; }
-			else { ps = ps.concat(); }
-			if(p) { ps.unshift(p); }
-			var tid = false, i, j, c, e, m = this._model.data, df = this._model.default_state, tmp;
-			do {
-				tid = 'j' + this._id + '_' + (++this._cnt);
-			} while(m[tid]);
-
-			tmp = {
-				id			: false,
-				text		: typeof d === 'string' ? d : '',
-				icon		: typeof d === 'object' && d.icon !== undefined ? d.icon : true,
-				parent		: p,
-				parents		: ps,
-				children	: [],
-				children_d	: [],
-				data		: null,
-				state		: { },
-				li_attr		: { id : false },
-				a_attr		: { href : '#' },
-				original	: false
-			};
-			for(i in df) {
-				if(df.hasOwnProperty(i)) {
-					tmp.state[i] = df[i];
-				}
-			}
-			if(d && (d.id || d.id === 0)) { tmp.id = d.id.toString(); }
-			if(d && d.text) { tmp.text = d.text; }
-			if(d && d.data && d.data.jstree && d.data.jstree.icon) {
-				tmp.icon = d.data.jstree.icon;
-			}
-			if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") {
-				tmp.icon = true;
-			}
-			if(d && d.data) {
-				tmp.data = d.data;
-				if(d.data.jstree) {
-					for(i in d.data.jstree) {
-						if(d.data.jstree.hasOwnProperty(i)) {
-							tmp.state[i] = d.data.jstree[i];
-						}
-					}
-				}
-			}
-			if(d && typeof d.state === 'object') {
-				for (i in d.state) {
-					if(d.state.hasOwnProperty(i)) {
-						tmp.state[i] = d.state[i];
-					}
-				}
-			}
-			if(d && typeof d.li_attr === 'object') {
-				for (i in d.li_attr) {
-					if(d.li_attr.hasOwnProperty(i)) {
-						tmp.li_attr[i] = d.li_attr[i];
-					}
-				}
-			}
-			if(tmp.li_attr.id && !(tmp.id || tmp.id === 0)) {
-				tmp.id = tmp.li_attr.id.toString();
-			}
-			if(!(tmp.id || tmp.id === 0)) {
-				tmp.id = tid;
-			}
-			if(!tmp.li_attr.id) {
-				tmp.li_attr.id = tmp.id;
-			}
-			if(d && typeof d.a_attr === 'object') {
-				for (i in d.a_attr) {
-					if(d.a_attr.hasOwnProperty(i)) {
-						tmp.a_attr[i] = d.a_attr[i];
-					}
-				}
-			}
-			if(d && d.children && d.children.length) {
-				for(i = 0, j = d.children.length; i < j; i++) {
-					c = this._parse_model_from_json(d.children[i], tmp.id, ps);
-					e = m[c];
-					tmp.children.push(c);
-					if(e.children_d.length) {
-						tmp.children_d = tmp.children_d.concat(e.children_d);
-					}
-				}
-				tmp.children_d = tmp.children.concat(tmp.children_d);
-			}
-			if(d && d.children && d.children === true) {
-				tmp.state.loaded = false;
-				tmp.children = [];
-				tmp.children_d = [];
-			}
-			delete d.data;
-			delete d.children;
-			tmp.original = d;
-			m[tmp.id] = tmp;
-			if(tmp.state.selected) {
-				this._data.core.selected.push(tmp.id);
-			}
-			return tmp.id;
-		},
-		/**
-		 * redraws all nodes that need to be redrawn. Used internally.
-		 * @private
-		 * @name _redraw()
-		 * @trigger redraw.jstree
-		 */
-		_redraw : function () {
-			var nodes = this._model.force_full_redraw ? this._model.data[$.jstree.root].children.concat([]) : this._model.changed.concat([]),
-				f = document.createElement('UL'), tmp, i, j, fe = this._data.core.focused;
-			for(i = 0, j = nodes.length; i < j; i++) {
-				tmp = this.redraw_node(nodes[i], true, this._model.force_full_redraw);
-				if(tmp && this._model.force_full_redraw) {
-					f.appendChild(tmp);
-				}
-			}
-			if(this._model.force_full_redraw) {
-				f.className = this.get_container_ul()[0].className;
-				f.setAttribute('role','presentation');
-				this.element.empty().append(f);
-				//this.get_container_ul()[0].appendChild(f);
-			}
-			if(fe !== null && this.settings.core.restore_focus) {
-				tmp = this.get_node(fe, true);
-				if(tmp && tmp.length && tmp.children('.jstree-anchor')[0] !== document.activeElement) {
-					tmp.children('.jstree-anchor').trigger('focus');
-				}
-				else {
-					this._data.core.focused = null;
-				}
-			}
-			this._model.force_full_redraw = false;
-			this._model.changed = [];
-			/**
-			 * triggered after nodes are redrawn
-			 * @event
-			 * @name redraw.jstree
-			 * @param {array} nodes the redrawn nodes
-			 */
-			this.trigger('redraw', { "nodes" : nodes });
-		},
-		/**
-		 * redraws all nodes that need to be redrawn or optionally - the whole tree
-		 * @name redraw([full])
-		 * @param {Boolean} full if set to `true` all nodes are redrawn.
-		 */
-		redraw : function (full) {
-			if(full) {
-				this._model.force_full_redraw = true;
-			}
-			//if(this._model.redraw_timeout) {
-			//	clearTimeout(this._model.redraw_timeout);
-			//}
-			//this._model.redraw_timeout = setTimeout($.proxy(this._redraw, this),0);
-			this._redraw();
-		},
-		/**
-		 * redraws a single node's children. Used internally.
-		 * @private
-		 * @name draw_children(node)
-		 * @param {mixed} node the node whose children will be redrawn
-		 */
-		draw_children : function (node) {
-			var obj = this.get_node(node),
-				i = false,
-				j = false,
-				k = false,
-				d = document;
-			if(!obj) { return false; }
-			if(obj.id === $.jstree.root) { return this.redraw(true); }
-			node = this.get_node(node, true);
-			if(!node || !node.length) { return false; } // TODO: quick toggle
-
-			node.children('.jstree-children').remove();
-			node = node[0];
-			if(obj.children.length && obj.state.loaded) {
-				k = d.createElement('UL');
-				k.setAttribute('role', 'group');
-				k.className = 'jstree-children';
-				for(i = 0, j = obj.children.length; i < j; i++) {
-					k.appendChild(this.redraw_node(obj.children[i], true, true));
-				}
-				node.appendChild(k);
-			}
-		},
-		/**
-		 * redraws a single node. Used internally.
-		 * @private
-		 * @name redraw_node(node, deep, is_callback, force_render)
-		 * @param {mixed} node the node to redraw
-		 * @param {Boolean} deep should child nodes be redrawn too
-		 * @param {Boolean} is_callback is this a recursion call
-		 * @param {Boolean} force_render should children of closed parents be drawn anyway
-		 */
-		redraw_node : function (node, deep, is_callback, force_render) {
-			var obj = this.get_node(node),
-				par = false,
-				ind = false,
-				old = false,
-				i = false,
-				j = false,
-				k = false,
-				c = '',
-				d = document,
-				m = this._model.data,
-				f = false,
-				s = false,
-				tmp = null,
-				t = 0,
-				l = 0,
-				has_children = false,
-				last_sibling = false;
-			if(!obj) { return false; }
-			if(obj.id === $.jstree.root) {  return this.redraw(true); }
-			deep = deep || obj.children.length === 0;
-			node = !document.querySelector ? document.getElementById(obj.id) : this.element[0].querySelector('#' + ("0123456789".indexOf(obj.id[0]) !== -1 ? '\\3' + obj.id[0] + ' ' + obj.id.substr(1).replace($.jstree.idregex,'\\$&') : obj.id.replace($.jstree.idregex,'\\$&')) ); //, this.element);
-			if(!node) {
-				deep = true;
-				//node = d.createElement('LI');
-				if(!is_callback) {
-					par = obj.parent !== $.jstree.root ? $('#' + obj.parent.replace($.jstree.idregex,'\\$&'), this.element)[0] : null;
-					if(par !== null && (!par || !m[obj.parent].state.opened)) {
-						return false;
-					}
-					ind = $.inArray(obj.id, par === null ? m[$.jstree.root].children : m[obj.parent].children);
-				}
-			}
-			else {
-				node = $(node);
-				if(!is_callback) {
-					par = node.parent().parent()[0];
-					if(par === this.element[0]) {
-						par = null;
-					}
-					ind = node.index();
-				}
-				// m[obj.id].data = node.data(); // use only node's data, no need to touch jquery storage
-				if(!deep && obj.children.length && !node.children('.jstree-children').length) {
-					deep = true;
-				}
-				if(!deep) {
-					old = node.children('.jstree-children')[0];
-				}
-				f = node.children('.jstree-anchor')[0] === document.activeElement;
-				node.remove();
-				//node = d.createElement('LI');
-				//node = node[0];
-			}
-			node = this._data.core.node.cloneNode(true);
-			// node is DOM, deep is boolean
-
-			c = 'jstree-node ';
-			for(i in obj.li_attr) {
-				if(obj.li_attr.hasOwnProperty(i)) {
-					if(i === 'id') { continue; }
-					if(i !== 'class') {
-						node.setAttribute(i, obj.li_attr[i]);
-					}
-					else {
-						c += obj.li_attr[i];
-					}
-				}
-			}
-			if(!obj.a_attr.id) {
-				obj.a_attr.id = obj.id + '_anchor';
-			}
-			node.childNodes[1].setAttribute('aria-selected', !!obj.state.selected);
-			node.childNodes[1].setAttribute('aria-level', obj.parents.length);
-			if(this.settings.core.compute_elements_positions) {
-				node.childNodes[1].setAttribute('aria-setsize', m[obj.parent].children.length);
-				node.childNodes[1].setAttribute('aria-posinset', m[obj.parent].children.indexOf(obj.id) + 1);
-			}
-			if(obj.state.disabled) {
-				node.childNodes[1].setAttribute('aria-disabled', true);
-			}
-
-			for(i = 0, j = obj.children.length; i < j; i++) {
-				if(!m[obj.children[i]].state.hidden) {
-					has_children = true;
-					break;
-				}
-			}
-			if(obj.parent !== null && m[obj.parent] && !obj.state.hidden) {
-				i = $.inArray(obj.id, m[obj.parent].children);
-				last_sibling = obj.id;
-				if(i !== -1) {
-					i++;
-					for(j = m[obj.parent].children.length; i < j; i++) {
-						if(!m[m[obj.parent].children[i]].state.hidden) {
-							last_sibling = m[obj.parent].children[i];
-						}
-						if(last_sibling !== obj.id) {
-							break;
-						}
-					}
-				}
-			}
-
-			if(obj.state.hidden) {
-				c += ' jstree-hidden';
-			}
-			if (obj.state.loading) {
-				c += ' jstree-loading';
-			}
-			if(obj.state.loaded && !has_children) {
-				c += ' jstree-leaf';
-			}
-			else {
-				c += obj.state.opened && obj.state.loaded ? ' jstree-open' : ' jstree-closed';
-				node.childNodes[1].setAttribute('aria-expanded', (obj.state.opened && obj.state.loaded) );
-			}
-			if(last_sibling === obj.id) {
-				c += ' jstree-last';
-			}
-			node.id = obj.id;
-			node.className = c;
-			c = ( obj.state.selected ? ' jstree-clicked' : '') + ( obj.state.disabled ? ' jstree-disabled' : '');
-			for(j in obj.a_attr) {
-				if(obj.a_attr.hasOwnProperty(j)) {
-					if(j === 'href' && obj.a_attr[j] === '#') { continue; }
-					if(j !== 'class') {
-						node.childNodes[1].setAttribute(j, obj.a_attr[j]);
-					}
-					else {
-						c += ' ' + obj.a_attr[j];
-					}
-				}
-			}
-			if(c.length) {
-				node.childNodes[1].className = 'jstree-anchor ' + c;
-			}
-			if((obj.icon && obj.icon !== true) || obj.icon === false) {
-				if(obj.icon === false) {
-					node.childNodes[1].childNodes[0].className += ' jstree-themeicon-hidden';
-				}
-				else if(obj.icon.indexOf('/') === -1 && obj.icon.indexOf('.') === -1) {
-					node.childNodes[1].childNodes[0].className += ' ' + obj.icon + ' jstree-themeicon-custom';
-				}
-				else {
-					node.childNodes[1].childNodes[0].style.backgroundImage = 'url("'+obj.icon+'")';
-					node.childNodes[1].childNodes[0].style.backgroundPosition = 'center center';
-					node.childNodes[1].childNodes[0].style.backgroundSize = 'auto';
-					node.childNodes[1].childNodes[0].className += ' jstree-themeicon-custom';
-				}
-			}
-
-			if(this.settings.core.force_text) {
-				node.childNodes[1].appendChild(d.createTextNode(obj.text));
-			}
-			else {
-				node.childNodes[1].innerHTML += obj.text;
-			}
-
-
-			if(deep && obj.children.length && (obj.state.opened || force_render) && obj.state.loaded) {
-				k = d.createElement('UL');
-				k.setAttribute('role', 'group');
-				k.className = 'jstree-children';
-				for(i = 0, j = obj.children.length; i < j; i++) {
-					k.appendChild(this.redraw_node(obj.children[i], deep, true));
-				}
-				node.appendChild(k);
-			}
-			if(old) {
-				node.appendChild(old);
-			}
-			if(!is_callback) {
-				// append back using par / ind
-				if(!par) {
-					par = this.element[0];
-				}
-				for(i = 0, j = par.childNodes.length; i < j; i++) {
-					if(par.childNodes[i] && par.childNodes[i].className && par.childNodes[i].className.indexOf('jstree-children') !== -1) {
-						tmp = par.childNodes[i];
-						break;
-					}
-				}
-				if(!tmp) {
-					tmp = d.createElement('UL');
-					tmp.setAttribute('role', 'group');
-					tmp.className = 'jstree-children';
-					par.appendChild(tmp);
-				}
-				par = tmp;
-
-				if(ind < par.childNodes.length) {
-					par.insertBefore(node, par.childNodes[ind]);
-				}
-				else {
-					par.appendChild(node);
-				}
-				if(f) {
-					t = this.element[0].scrollTop;
-					l = this.element[0].scrollLeft;
-					node.childNodes[1].focus();
-					this.element[0].scrollTop = t;
-					this.element[0].scrollLeft = l;
-				}
-			}
-			if(obj.state.opened && !obj.state.loaded) {
-				obj.state.opened = false;
-				setTimeout(function () {
-					this.open_node(obj.id, false, 0);
-				}.bind(this), 0);
-			}
-			return node;
-		},
-		/**
-		 * opens a node, revealing its children. If the node is not loaded it will be loaded and opened once ready.
-		 * @name open_node(obj [, callback, animation])
-		 * @param {mixed} obj the node to open
-		 * @param {Function} callback a function to execute once the node is opened
-		 * @param {Number} animation the animation duration in milliseconds when opening the node (overrides the `core.animation` setting). Use `false` for no animation.
-		 * @trigger open_node.jstree, after_open.jstree, before_open.jstree
-		 */
-		open_node : function (obj, callback, animation) {
-			var t1, t2, d, t;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.open_node(obj[t1], callback, animation);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			animation = animation === undefined ? this.settings.core.animation : animation;
-			if(!this.is_closed(obj)) {
-				if(callback) {
-					callback.call(this, obj, false);
-				}
-				return false;
-			}
-			if(!this.is_loaded(obj)) {
-				if(this.is_loading(obj)) {
-					return setTimeout(function () {
-						this.open_node(obj, callback, animation);
-					}.bind(this), 500);
-				}
-				this.load_node(obj, function (o, ok) {
-					return ok ? this.open_node(o, callback, animation) : (callback ? callback.call(this, o, false) : false);
-				});
-			}
-			else {
-				d = this.get_node(obj, true);
-				t = this;
-				if(d.length) {
-					if(animation && d.children(".jstree-children").length) {
-						d.children(".jstree-children").stop(true, true);
-					}
-					if(obj.children.length && !this._firstChild(d.children('.jstree-children')[0])) {
-						this.draw_children(obj);
-						//d = this.get_node(obj, true);
-					}
-					if(!animation) {
-						this.trigger('before_open', { "node" : obj });
-						d[0].className = d[0].className.replace('jstree-closed', 'jstree-open');
-						d[0].childNodes[1].setAttribute("aria-expanded", true);
-					}
-					else {
-						this.trigger('before_open', { "node" : obj });
-						d
-							.children(".jstree-children").css("display","none").end()
-							.removeClass("jstree-closed").addClass("jstree-open")
-								.children('.jstree-anchor').attr("aria-expanded", true).end()
-							.children(".jstree-children").stop(true, true)
-								.slideDown(animation, function () {
-									this.style.display = "";
-									if (t.element) {
-										t.trigger("after_open", { "node" : obj });
-									}
-								});
-					}
-				}
-				obj.state.opened = true;
-				if(callback) {
-					callback.call(this, obj, true);
-				}
-				if(!d.length) {
-					/**
-					 * triggered when a node is about to be opened (if the node is supposed to be in the DOM, it will be, but it won't be visible yet)
-					 * @event
-					 * @name before_open.jstree
-					 * @param {Object} node the opened node
-					 */
-					this.trigger('before_open', { "node" : obj });
-				}
-				/**
-				 * triggered when a node is opened (if there is an animation it will not be completed yet)
-				 * @event
-				 * @name open_node.jstree
-				 * @param {Object} node the opened node
-				 */
-				this.trigger('open_node', { "node" : obj });
-				if(!animation || !d.length) {
-					/**
-					 * triggered when a node is opened and the animation is complete
-					 * @event
-					 * @name after_open.jstree
-					 * @param {Object} node the opened node
-					 */
-					this.trigger("after_open", { "node" : obj });
-				}
-				return true;
-			}
-		},
-		/**
-		 * opens every parent of a node (node should be loaded)
-		 * @name _open_to(obj)
-		 * @param {mixed} obj the node to reveal
-		 * @private
-		 */
-		_open_to : function (obj) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			var i, j, p = obj.parents;
-			for(i = 0, j = p.length; i < j; i+=1) {
-				if(i !== $.jstree.root) {
-					this.open_node(p[i], false, 0);
-				}
-			}
-			return $('#' + obj.id.replace($.jstree.idregex,'\\$&'), this.element);
-		},
-		/**
-		 * closes a node, hiding its children
-		 * @name close_node(obj [, animation])
-		 * @param {mixed} obj the node to close
-		 * @param {Number} animation the animation duration in milliseconds when closing the node (overrides the `core.animation` setting). Use `false` for no animation.
-		 * @trigger close_node.jstree, after_close.jstree
-		 */
-		close_node : function (obj, animation) {
-			var t1, t2, t, d;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.close_node(obj[t1], animation);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			if(this.is_closed(obj)) {
-				return false;
-			}
-			animation = animation === undefined ? this.settings.core.animation : animation;
-			t = this;
-			d = this.get_node(obj, true);
-
-			obj.state.opened = false;
-			/**
-			 * triggered when a node is closed (if there is an animation it will not be complete yet)
-			 * @event
-			 * @name close_node.jstree
-			 * @param {Object} node the closed node
-			 */
-			this.trigger('close_node',{ "node" : obj });
-			if(!d.length) {
-				/**
-				 * triggered when a node is closed and the animation is complete
-				 * @event
-				 * @name after_close.jstree
-				 * @param {Object} node the closed node
-				 */
-				this.trigger("after_close", { "node" : obj });
-			}
-			else {
-				if(!animation) {
-					d[0].className = d[0].className.replace('jstree-open', 'jstree-closed');
-					d.children('.jstree-anchor').attr("aria-expanded", false);
-					d.children('.jstree-children').remove();
-					this.trigger("after_close", { "node" : obj });
-				}
-				else {
-					d
-						.children(".jstree-children").attr("style","display:block !important").end()
-						.removeClass("jstree-open").addClass("jstree-closed")
-							.children('.jstree-anchor').attr("aria-expanded", false).end()
-						.children(".jstree-children").stop(true, true).slideUp(animation, function () {
-							this.style.display = "";
-							d.children('.jstree-children').remove();
-							if (t.element) {
-								t.trigger("after_close", { "node" : obj });
-							}
-						});
-				}
-			}
-		},
-		/**
-		 * toggles a node - closing it if it is open, opening it if it is closed
-		 * @name toggle_node(obj)
-		 * @param {mixed} obj the node to toggle
-		 */
-		toggle_node : function (obj) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.toggle_node(obj[t1]);
-				}
-				return true;
-			}
-			if(this.is_closed(obj)) {
-				return this.open_node(obj);
-			}
-			if(this.is_open(obj)) {
-				return this.close_node(obj);
-			}
-		},
-		/**
-		 * opens all nodes within a node (or the tree), revealing their children. If the node is not loaded it will be loaded and opened once ready.
-		 * @name open_all([obj, animation, original_obj])
-		 * @param {mixed} obj the node to open recursively, omit to open all nodes in the tree
-		 * @param {Number} animation the animation duration in milliseconds when opening the nodes, the default is no animation
-		 * @param {jQuery} reference to the node that started the process (internal use)
-		 * @trigger open_all.jstree
-		 */
-		open_all : function (obj, animation, original_obj) {
-			if(!obj) { obj = $.jstree.root; }
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			var dom = obj.id === $.jstree.root ? this.get_container_ul() : this.get_node(obj, true), i, j, _this;
-			if(!dom.length) {
-				for(i = 0, j = obj.children_d.length; i < j; i++) {
-					if(this.is_closed(this._model.data[obj.children_d[i]])) {
-						this._model.data[obj.children_d[i]].state.opened = true;
-					}
-				}
-				return this.trigger('open_all', { "node" : obj });
-			}
-			original_obj = original_obj || dom;
-			_this = this;
-			dom = this.is_closed(obj) ? dom.find('.jstree-closed').addBack() : dom.find('.jstree-closed');
-			dom.each(function () {
-				_this.open_node(
-					this,
-					function(node, status) { if(status && this.is_parent(node)) { this.open_all(node, animation, original_obj); } },
-					animation || 0
-				);
-			});
-			if(original_obj.find('.jstree-closed').length === 0) {
-				/**
-				 * triggered when an `open_all` call completes
-				 * @event
-				 * @name open_all.jstree
-				 * @param {Object} node the opened node
-				 */
-				this.trigger('open_all', { "node" : this.get_node(original_obj) });
-			}
-		},
-		/**
-		 * closes all nodes within a node (or the tree), revealing their children
-		 * @name close_all([obj, animation])
-		 * @param {mixed} obj the node to close recursively, omit to close all nodes in the tree
-		 * @param {Number} animation the animation duration in milliseconds when closing the nodes, the default is no animation
-		 * @trigger close_all.jstree
-		 */
-		close_all : function (obj, animation) {
-			if(!obj) { obj = $.jstree.root; }
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			var dom = obj.id === $.jstree.root ? this.get_container_ul() : this.get_node(obj, true),
-				_this = this, i, j;
-			if(dom.length) {
-				dom = this.is_open(obj) ? dom.find('.jstree-open').addBack() : dom.find('.jstree-open');
-				$(dom.get().reverse()).each(function () { _this.close_node(this, animation || 0); });
-			}
-			for(i = 0, j = obj.children_d.length; i < j; i++) {
-				this._model.data[obj.children_d[i]].state.opened = false;
-			}
-			/**
-			 * triggered when an `close_all` call completes
-			 * @event
-			 * @name close_all.jstree
-			 * @param {Object} node the closed node
-			 */
-			this.trigger('close_all', { "node" : obj });
-		},
-		/**
-		 * checks if a node is disabled (not selectable)
-		 * @name is_disabled(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_disabled : function (obj) {
-			obj = this.get_node(obj);
-			return obj && obj.state && obj.state.disabled;
-		},
-		/**
-		 * enables a node - so that it can be selected
-		 * @name enable_node(obj)
-		 * @param {mixed} obj the node to enable
-		 * @trigger enable_node.jstree
-		 */
-		enable_node : function (obj) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.enable_node(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			obj.state.disabled = false;
-			this.get_node(obj,true).children('.jstree-anchor').removeClass('jstree-disabled').attr('aria-disabled', false);
-			/**
-			 * triggered when an node is enabled
-			 * @event
-			 * @name enable_node.jstree
-			 * @param {Object} node the enabled node
-			 */
-			this.trigger('enable_node', { 'node' : obj });
-		},
-		/**
-		 * disables a node - so that it can not be selected
-		 * @name disable_node(obj)
-		 * @param {mixed} obj the node to disable
-		 * @trigger disable_node.jstree
-		 */
-		disable_node : function (obj) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.disable_node(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			obj.state.disabled = true;
-			this.get_node(obj,true).children('.jstree-anchor').addClass('jstree-disabled').attr('aria-disabled', true);
-			/**
-			 * triggered when an node is disabled
-			 * @event
-			 * @name disable_node.jstree
-			 * @param {Object} node the disabled node
-			 */
-			this.trigger('disable_node', { 'node' : obj });
-		},
-		/**
-		 * determines if a node is hidden
-		 * @name is_hidden(obj)
-		 * @param {mixed} obj the node
-		 */
-		is_hidden : function (obj) {
-			obj = this.get_node(obj);
-			return obj.state.hidden === true;
-		},
-		/**
-		 * hides a node - it is still in the structure but will not be visible
-		 * @name hide_node(obj)
-		 * @param {mixed} obj the node to hide
-		 * @param {Boolean} skip_redraw internal parameter controlling if redraw is called
-		 * @trigger hide_node.jstree
-		 */
-		hide_node : function (obj, skip_redraw) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.hide_node(obj[t1], true);
-				}
-				if (!skip_redraw) {
-					this.redraw();
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			if(!obj.state.hidden) {
-				obj.state.hidden = true;
-				this._node_changed(obj.parent);
-				if(!skip_redraw) {
-					this.redraw();
-				}
-				/**
-				 * triggered when an node is hidden
-				 * @event
-				 * @name hide_node.jstree
-				 * @param {Object} node the hidden node
-				 */
-				this.trigger('hide_node', { 'node' : obj });
-			}
-		},
-		/**
-		 * shows a node
-		 * @name show_node(obj)
-		 * @param {mixed} obj the node to show
-		 * @param {Boolean} skip_redraw internal parameter controlling if redraw is called
-		 * @trigger show_node.jstree
-		 */
-		show_node : function (obj, skip_redraw) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.show_node(obj[t1], true);
-				}
-				if (!skip_redraw) {
-					this.redraw();
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			if(obj.state.hidden) {
-				obj.state.hidden = false;
-				this._node_changed(obj.parent);
-				if(!skip_redraw) {
-					this.redraw();
-				}
-				/**
-				 * triggered when an node is shown
-				 * @event
-				 * @name show_node.jstree
-				 * @param {Object} node the shown node
-				 */
-				this.trigger('show_node', { 'node' : obj });
-			}
-		},
-		/**
-		 * hides all nodes
-		 * @name hide_all()
-		 * @trigger hide_all.jstree
-		 */
-		hide_all : function (skip_redraw) {
-			var i, m = this._model.data, ids = [];
-			for(i in m) {
-				if(m.hasOwnProperty(i) && i !== $.jstree.root && !m[i].state.hidden) {
-					m[i].state.hidden = true;
-					ids.push(i);
-				}
-			}
-			this._model.force_full_redraw = true;
-			if(!skip_redraw) {
-				this.redraw();
-			}
-			/**
-			 * triggered when all nodes are hidden
-			 * @event
-			 * @name hide_all.jstree
-			 * @param {Array} nodes the IDs of all hidden nodes
-			 */
-			this.trigger('hide_all', { 'nodes' : ids });
-			return ids;
-		},
-		/**
-		 * shows all nodes
-		 * @name show_all()
-		 * @trigger show_all.jstree
-		 */
-		show_all : function (skip_redraw) {
-			var i, m = this._model.data, ids = [];
-			for(i in m) {
-				if(m.hasOwnProperty(i) && i !== $.jstree.root && m[i].state.hidden) {
-					m[i].state.hidden = false;
-					ids.push(i);
-				}
-			}
-			this._model.force_full_redraw = true;
-			if(!skip_redraw) {
-				this.redraw();
-			}
-			/**
-			 * triggered when all nodes are shown
-			 * @event
-			 * @name show_all.jstree
-			 * @param {Array} nodes the IDs of all shown nodes
-			 */
-			this.trigger('show_all', { 'nodes' : ids });
-			return ids;
-		},
-		/**
-		 * called when a node is selected by the user. Used internally.
-		 * @private
-		 * @name activate_node(obj, e)
-		 * @param {mixed} obj the node
-		 * @param {Object} e the related event
-		 * @trigger activate_node.jstree, changed.jstree
-		 */
-		activate_node : function (obj, e) {
-			if(this.is_disabled(obj)) {
-				return false;
-			}
-			if(!e || typeof e !== 'object') {
-				e = {};
-			}
-
-			// ensure last_clicked is still in the DOM, make it fresh (maybe it was moved?) and make sure it is still selected, if not - make last_clicked the last selected node
-			this._data.core.last_clicked = this._data.core.last_clicked && this._data.core.last_clicked.id !== undefined ? this.get_node(this._data.core.last_clicked.id) : null;
-			if(this._data.core.last_clicked && !this._data.core.last_clicked.state.selected) { this._data.core.last_clicked = null; }
-			if(!this._data.core.last_clicked && this._data.core.selected.length) { this._data.core.last_clicked = this.get_node(this._data.core.selected[this._data.core.selected.length - 1]); }
-
-			if(!this.settings.core.multiple || (!e.metaKey && !e.ctrlKey && !e.shiftKey) || (e.shiftKey && (!this._data.core.last_clicked || !this.get_parent(obj) || this.get_parent(obj) !== this._data.core.last_clicked.parent ) )) {
-				if(!this.settings.core.multiple && (e.metaKey || e.ctrlKey || e.shiftKey) && this.is_selected(obj)) {
-					this.deselect_node(obj, false, e);
-				}
-				else {
-					if (this.settings.core.allow_reselect || !this.is_selected(obj) || this._data.core.selected.length !== 1) {
-						this.deselect_all(true);
-						this.select_node(obj, false, false, e);
-					}
-					this._data.core.last_clicked = this.get_node(obj);
-				}
-			}
-			else {
-				if(e.shiftKey) {
-					var o = this.get_node(obj).id,
-						l = this._data.core.last_clicked.id,
-						p = this.get_node(this._data.core.last_clicked.parent).children,
-						c = false,
-						i, j;
-					for(i = 0, j = p.length; i < j; i += 1) {
-						// separate IFs work whem o and l are the same
-						if(p[i] === o) {
-							c = !c;
-						}
-						if(p[i] === l) {
-							c = !c;
-						}
-						if(!this.is_disabled(p[i]) && (c || p[i] === o || p[i] === l)) {
-							if (!this.is_hidden(p[i])) {
-								this.select_node(p[i], true, false, e);
-							}
-						}
-						else {
-							if (!e.ctrlKey) {
-								this.deselect_node(p[i], true, e);
-							}
-						}
-					}
-					this.trigger('changed', { 'action' : 'select_node', 'node' : this.get_node(obj), 'selected' : this._data.core.selected, 'event' : e });
-				}
-				else {
-					if(!this.is_selected(obj)) {
-						if (e.ctrlKey) {
-							this._data.core.last_clicked = this.get_node(obj);
-						}
-						this.select_node(obj, false, false, e);
-					}
-					else {
-						this.deselect_node(obj, false, e);
-					}
-				}
-			}
-			/**
-			 * triggered when an node is clicked or intercated with by the user
-			 * @event
-			 * @name activate_node.jstree
-			 * @param {Object} node
-			 * @param {Object} event the ooriginal event (if any) which triggered the call (may be an empty object)
-			 */
-			this.trigger('activate_node', { 'node' : this.get_node(obj), 'event' : e });
-		},
-		/**
-		 * applies the hover state on a node, called when a node is hovered by the user. Used internally.
-		 * @private
-		 * @name hover_node(obj)
-		 * @param {mixed} obj
-		 * @trigger hover_node.jstree
-		 */
-		hover_node : function (obj) {
-			obj = this.get_node(obj, true);
-			if(!obj || !obj.length || obj.children('.jstree-hovered').length) {
-				return false;
-			}
-			var o = this.element.find('.jstree-hovered'), t = this.element;
-			if(o && o.length) { this.dehover_node(o); }
-
-			obj.children('.jstree-anchor').addClass('jstree-hovered');
-			/**
-			 * triggered when an node is hovered
-			 * @event
-			 * @name hover_node.jstree
-			 * @param {Object} node
-			 */
-			this.trigger('hover_node', { 'node' : this.get_node(obj) });
-			setTimeout(function () { t.attr('aria-activedescendant', obj[0].id); }, 0);
-		},
-		/**
-		 * removes the hover state from a nodecalled when a node is no longer hovered by the user. Used internally.
-		 * @private
-		 * @name dehover_node(obj)
-		 * @param {mixed} obj
-		 * @trigger dehover_node.jstree
-		 */
-		dehover_node : function (obj) {
-			obj = this.get_node(obj, true);
-			if(!obj || !obj.length || !obj.children('.jstree-hovered').length) {
-				return false;
-			}
-			obj.children('.jstree-anchor').removeClass('jstree-hovered');
-			/**
-			 * triggered when an node is no longer hovered
-			 * @event
-			 * @name dehover_node.jstree
-			 * @param {Object} node
-			 */
-			this.trigger('dehover_node', { 'node' : this.get_node(obj) });
-		},
-		/**
-		 * select a node
-		 * @name select_node(obj [, supress_event, prevent_open])
-		 * @param {mixed} obj an array can be used to select multiple nodes
-		 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
-		 * @param {Boolean} prevent_open if set to `true` parents of the selected node won't be opened
-		 * @trigger select_node.jstree, changed.jstree
-		 */
-		select_node : function (obj, supress_event, prevent_open, e) {
-			var dom, t1, t2, th;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.select_node(obj[t1], supress_event, prevent_open, e);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(!obj.state.selected) {
-				obj.state.selected = true;
-				this._data.core.selected.push(obj.id);
-				if(!prevent_open) {
-					dom = this._open_to(obj);
-				}
-				if(dom && dom.length) {
-					dom.children('.jstree-anchor').addClass('jstree-clicked').attr('aria-selected', true);
-				}
-				/**
-				 * triggered when an node is selected
-				 * @event
-				 * @name select_node.jstree
-				 * @param {Object} node
-				 * @param {Array} selected the current selection
-				 * @param {Object} event the event (if any) that triggered this select_node
-				 */
-				this.trigger('select_node', { 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
-				if(!supress_event) {
-					/**
-					 * triggered when selection changes
-					 * @event
-					 * @name changed.jstree
-					 * @param {Object} node
-					 * @param {Object} action the action that caused the selection to change
-					 * @param {Array} selected the current selection
-					 * @param {Object} event the event (if any) that triggered this changed event
-					 */
-					this.trigger('changed', { 'action' : 'select_node', 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
-				}
-			}
-		},
-		/**
-		 * deselect a node
-		 * @name deselect_node(obj [, supress_event])
-		 * @param {mixed} obj an array can be used to deselect multiple nodes
-		 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
-		 * @trigger deselect_node.jstree, changed.jstree
-		 */
-		deselect_node : function (obj, supress_event, e) {
-			var t1, t2, dom;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.deselect_node(obj[t1], supress_event, e);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(obj.state.selected) {
-				obj.state.selected = false;
-				this._data.core.selected = $.vakata.array_remove_item(this._data.core.selected, obj.id);
-				if(dom.length) {
-					dom.children('.jstree-anchor').removeClass('jstree-clicked').attr('aria-selected', false);
-				}
-				/**
-				 * triggered when an node is deselected
-				 * @event
-				 * @name deselect_node.jstree
-				 * @param {Object} node
-				 * @param {Array} selected the current selection
-				 * @param {Object} event the event (if any) that triggered this deselect_node
-				 */
-				this.trigger('deselect_node', { 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
-				if(!supress_event) {
-					this.trigger('changed', { 'action' : 'deselect_node', 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
-				}
-			}
-		},
-		/**
-		 * select all nodes in the tree
-		 * @name select_all([supress_event])
-		 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
-		 * @trigger select_all.jstree, changed.jstree
-		 */
-		select_all : function (supress_event) {
-			var tmp = this._data.core.selected.concat([]), i, j;
-			this._data.core.selected = this._model.data[$.jstree.root].children_d.concat();
-			for(i = 0, j = this._data.core.selected.length; i < j; i++) {
-				if(this._model.data[this._data.core.selected[i]]) {
-					this._model.data[this._data.core.selected[i]].state.selected = true;
-				}
-			}
-			this.redraw(true);
-			/**
-			 * triggered when all nodes are selected
-			 * @event
-			 * @name select_all.jstree
-			 * @param {Array} selected the current selection
-			 */
-			this.trigger('select_all', { 'selected' : this._data.core.selected });
-			if(!supress_event) {
-				this.trigger('changed', { 'action' : 'select_all', 'selected' : this._data.core.selected, 'old_selection' : tmp });
-			}
-		},
-		/**
-		 * deselect all selected nodes
-		 * @name deselect_all([supress_event])
-		 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
-		 * @trigger deselect_all.jstree, changed.jstree
-		 */
-		deselect_all : function (supress_event) {
-			var tmp = this._data.core.selected.concat([]), i, j;
-			for(i = 0, j = this._data.core.selected.length; i < j; i++) {
-				if(this._model.data[this._data.core.selected[i]]) {
-					this._model.data[this._data.core.selected[i]].state.selected = false;
-				}
-			}
-			this._data.core.selected = [];
-			this.element.find('.jstree-clicked').removeClass('jstree-clicked').attr('aria-selected', false);
-			/**
-			 * triggered when all nodes are deselected
-			 * @event
-			 * @name deselect_all.jstree
-			 * @param {Object} node the previous selection
-			 * @param {Array} selected the current selection
-			 */
-			this.trigger('deselect_all', { 'selected' : this._data.core.selected, 'node' : tmp });
-			if(!supress_event) {
-				this.trigger('changed', { 'action' : 'deselect_all', 'selected' : this._data.core.selected, 'old_selection' : tmp });
-			}
-		},
-		/**
-		 * checks if a node is selected
-		 * @name is_selected(obj)
-		 * @param  {mixed}  obj
-		 * @return {Boolean}
-		 */
-		is_selected : function (obj) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			return obj.state.selected;
-		},
-		/**
-		 * get an array of all selected nodes
-		 * @name get_selected([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 */
-		get_selected : function (full) {
-			return full ? $.map(this._data.core.selected, function (i) { return this.get_node(i); }.bind(this)) : this._data.core.selected.slice();
-		},
-		/**
-		 * get an array of all top level selected nodes (ignoring children of selected nodes)
-		 * @name get_top_selected([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 */
-		get_top_selected : function (full) {
-			var tmp = this.get_selected(true),
-				obj = {}, i, j, k, l;
-			for(i = 0, j = tmp.length; i < j; i++) {
-				obj[tmp[i].id] = tmp[i];
-			}
-			for(i = 0, j = tmp.length; i < j; i++) {
-				for(k = 0, l = tmp[i].children_d.length; k < l; k++) {
-					if(obj[tmp[i].children_d[k]]) {
-						delete obj[tmp[i].children_d[k]];
-					}
-				}
-			}
-			tmp = [];
-			for(i in obj) {
-				if(obj.hasOwnProperty(i)) {
-					tmp.push(i);
-				}
-			}
-			return full ? $.map(tmp, function (i) { return this.get_node(i); }.bind(this)) : tmp;
-		},
-		/**
-		 * get an array of all bottom level selected nodes (ignoring selected parents)
-		 * @name get_bottom_selected([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 */
-		get_bottom_selected : function (full) {
-			var tmp = this.get_selected(true),
-				obj = [], i, j;
-			for(i = 0, j = tmp.length; i < j; i++) {
-				if(!tmp[i].children.length) {
-					obj.push(tmp[i].id);
-				}
-			}
-			return full ? $.map(obj, function (i) { return this.get_node(i); }.bind(this)) : obj;
-		},
-		/**
-		 * gets the current state of the tree so that it can be restored later with `set_state(state)`. Used internally.
-		 * @name get_state()
-		 * @private
-		 * @return {Object}
-		 */
-		get_state : function () {
-			var state	= {
-				'core' : {
-					'open' : [],
-					'loaded' : [],
-					'scroll' : {
-						'left' : this.element.scrollLeft(),
-						'top' : this.element.scrollTop()
-					},
-					/*!
-					'themes' : {
-						'name' : this.get_theme(),
-						'icons' : this._data.core.themes.icons,
-						'dots' : this._data.core.themes.dots
-					},
-					*/
-					'selected' : []
-				}
-			}, i;
-			for(i in this._model.data) {
-				if(this._model.data.hasOwnProperty(i)) {
-					if(i !== $.jstree.root) {
-						if(this._model.data[i].state.loaded && this.settings.core.loaded_state) {
-							state.core.loaded.push(i);
-						}
-						if(this._model.data[i].state.opened) {
-							state.core.open.push(i);
-						}
-						if(this._model.data[i].state.selected) {
-							state.core.selected.push(i);
-						}
-					}
-				}
-			}
-			return state;
-		},
-		/**
-		 * sets the state of the tree. Used internally.
-		 * @name set_state(state [, callback])
-		 * @private
-		 * @param {Object} state the state to restore. Keep in mind this object is passed by reference and jstree will modify it.
-		 * @param {Function} callback an optional function to execute once the state is restored.
-		 * @trigger set_state.jstree
-		 */
-		set_state : function (state, callback) {
-			if(state) {
-				if(state.core && state.core.selected && state.core.initial_selection === undefined) {
-					state.core.initial_selection = this._data.core.selected.concat([]).sort().join(',');
-				}
-				if(state.core) {
-					var res, n, t, _this, i;
-					if(state.core.loaded) {
-						if(!this.settings.core.loaded_state || !$.vakata.is_array(state.core.loaded) || !state.core.loaded.length) {
-							delete state.core.loaded;
-							this.set_state(state, callback);
-						}
-						else {
-							this._load_nodes(state.core.loaded, function (nodes) {
-								delete state.core.loaded;
-								this.set_state(state, callback);
-							});
-						}
-						return false;
-					}
-					if(state.core.open) {
-						if(!$.vakata.is_array(state.core.open) || !state.core.open.length) {
-							delete state.core.open;
-							this.set_state(state, callback);
-						}
-						else {
-							this._load_nodes(state.core.open, function (nodes) {
-								this.open_node(nodes, false, 0);
-								delete state.core.open;
-								this.set_state(state, callback);
-							});
-						}
-						return false;
-					}
-					if(state.core.scroll) {
-						if(state.core.scroll && state.core.scroll.left !== undefined) {
-							this.element.scrollLeft(state.core.scroll.left);
-						}
-						if(state.core.scroll && state.core.scroll.top !== undefined) {
-							this.element.scrollTop(state.core.scroll.top);
-						}
-						delete state.core.scroll;
-						this.set_state(state, callback);
-						return false;
-					}
-					if(state.core.selected) {
-						_this = this;
-						if (state.core.initial_selection === undefined ||
-							state.core.initial_selection === this._data.core.selected.concat([]).sort().join(',')
-						) {
-							this.deselect_all();
-							$.each(state.core.selected, function (i, v) {
-								_this.select_node(v, false, true);
-							});
-						}
-						delete state.core.initial_selection;
-						delete state.core.selected;
-						this.set_state(state, callback);
-						return false;
-					}
-					for(i in state) {
-						if(state.hasOwnProperty(i) && i !== "core" && $.inArray(i, this.settings.plugins) === -1) {
-							delete state[i];
-						}
-					}
-					if($.isEmptyObject(state.core)) {
-						delete state.core;
-						this.set_state(state, callback);
-						return false;
-					}
-				}
-				if($.isEmptyObject(state)) {
-					state = null;
-					if(callback) { callback.call(this); }
-					/**
-					 * triggered when a `set_state` call completes
-					 * @event
-					 * @name set_state.jstree
-					 */
-					this.trigger('set_state');
-					return false;
-				}
-				return true;
-			}
-			return false;
-		},
-		/**
-		 * refreshes the tree - all nodes are reloaded with calls to `load_node`.
-		 * @name refresh()
-		 * @param {Boolean} skip_loading an option to skip showing the loading indicator
-		 * @param {Mixed} forget_state if set to `true` state will not be reapplied, if set to a function (receiving the current state as argument) the result of that function will be used as state
-		 * @trigger refresh.jstree
-		 */
-		refresh : function (skip_loading, forget_state) {
-			this._data.core.state = forget_state === true ? {} : this.get_state();
-			if(forget_state && $.vakata.is_function(forget_state)) { this._data.core.state = forget_state.call(this, this._data.core.state); }
-			this._cnt = 0;
-			this._model.data = {};
-			this._model.data[$.jstree.root] = {
-				id : $.jstree.root,
-				parent : null,
-				parents : [],
-				children : [],
-				children_d : [],
-				state : { loaded : false }
-			};
-			this._data.core.selected = [];
-			this._data.core.last_clicked = null;
-			this._data.core.focused = null;
-
-			var c = this.get_container_ul()[0].className;
-			if(!skip_loading) {
-				this.element.html("<"+"ul class='"+c+"' role='group'><"+"li class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='none' id='j"+this._id+"_loading'><i class='jstree-icon jstree-ocl'></i><"+"a class='jstree-anchor' role='treeitem' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>" + this.get_string("Loading ...") + "</a></li></ul>");
-				this.element.attr('aria-activedescendant','j'+this._id+'_loading');
-			}
-			this.load_node($.jstree.root, function (o, s) {
-				if(s) {
-					this.get_container_ul()[0].className = c;
-					if(this._firstChild(this.get_container_ul()[0])) {
-						this.element.attr('aria-activedescendant',this._firstChild(this.get_container_ul()[0]).id);
-					}
-					this.set_state($.extend(true, {}, this._data.core.state), function () {
-						/**
-						 * triggered when a `refresh` call completes
-						 * @event
-						 * @name refresh.jstree
-						 */
-						this.trigger('refresh');
-					});
-				}
-				this._data.core.state = null;
-			});
-		},
-		/**
-		 * refreshes a node in the tree (reload its children) all opened nodes inside that node are reloaded with calls to `load_node`.
-		 * @name refresh_node(obj)
-		 * @param  {mixed} obj the node
-		 * @trigger refresh_node.jstree
-		 */
-		refresh_node : function (obj) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			var opened = [], to_load = [], s = this._data.core.selected.concat([]);
-			to_load.push(obj.id);
-			if(obj.state.opened === true) { opened.push(obj.id); }
-			this.get_node(obj, true).find('.jstree-open').each(function() { to_load.push(this.id); opened.push(this.id); });
-			this._load_nodes(to_load, function (nodes) {
-				this.open_node(opened, false, 0);
-				this.select_node(s);
-				/**
-				 * triggered when a node is refreshed
-				 * @event
-				 * @name refresh_node.jstree
-				 * @param {Object} node - the refreshed node
-				 * @param {Array} nodes - an array of the IDs of the nodes that were reloaded
-				 */
-				this.trigger('refresh_node', { 'node' : obj, 'nodes' : nodes });
-			}.bind(this), false, true);
-		},
-		/**
-		 * set (change) the ID of a node
-		 * @name set_id(obj, id)
-		 * @param  {mixed} obj the node
-		 * @param  {String} id the new ID
-		 * @return {Boolean}
-		 * @trigger set_id.jstree
-		 */
-		set_id : function (obj, id) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			var i, j, m = this._model.data, old = obj.id;
-			id = id.toString();
-			// update parents (replace current ID with new one in children and children_d)
-			m[obj.parent].children[$.inArray(obj.id, m[obj.parent].children)] = id;
-			for(i = 0, j = obj.parents.length; i < j; i++) {
-				m[obj.parents[i]].children_d[$.inArray(obj.id, m[obj.parents[i]].children_d)] = id;
-			}
-			// update children (replace current ID with new one in parent and parents)
-			for(i = 0, j = obj.children.length; i < j; i++) {
-				m[obj.children[i]].parent = id;
-			}
-			for(i = 0, j = obj.children_d.length; i < j; i++) {
-				m[obj.children_d[i]].parents[$.inArray(obj.id, m[obj.children_d[i]].parents)] = id;
-			}
-			i = $.inArray(obj.id, this._data.core.selected);
-			if(i !== -1) { this._data.core.selected[i] = id; }
-			// update model and obj itself (obj.id, this._model.data[KEY])
-			i = this.get_node(obj.id, true);
-			if(i) {
-				i.attr('id', id); //.children('.jstree-anchor').attr('id', id + '_anchor').end().attr('aria-labelledby', id + '_anchor');
-				if(this.element.attr('aria-activedescendant') === obj.id) {
-					this.element.attr('aria-activedescendant', id);
-				}
-			}
-			delete m[obj.id];
-			obj.id = id;
-			obj.li_attr.id = id;
-			m[id] = obj;
-			/**
-			 * triggered when a node id value is changed
-			 * @event
-			 * @name set_id.jstree
-			 * @param {Object} node
-			 * @param {String} old the old id
-			 */
-			this.trigger('set_id',{ "node" : obj, "new" : obj.id, "old" : old });
-			return true;
-		},
-		/**
-		 * get the text value of a node
-		 * @name get_text(obj)
-		 * @param  {mixed} obj the node
-		 * @return {String}
-		 */
-		get_text : function (obj) {
-			obj = this.get_node(obj);
-			return (!obj || obj.id === $.jstree.root) ? false : obj.text;
-		},
-		/**
-		 * set the text value of a node. Used internally, please use `rename_node(obj, val)`.
-		 * @private
-		 * @name set_text(obj, val)
-		 * @param  {mixed} obj the node, you can pass an array to set the text on multiple nodes
-		 * @param  {String} val the new text value
-		 * @return {Boolean}
-		 * @trigger set_text.jstree
-		 */
-		set_text : function (obj, val) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.set_text(obj[t1], val);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			obj.text = val;
-			if(this.get_node(obj, true).length) {
-				this.redraw_node(obj.id);
-			}
-			/**
-			 * triggered when a node text value is changed
-			 * @event
-			 * @name set_text.jstree
-			 * @param {Object} obj
-			 * @param {String} text the new value
-			 */
-			this.trigger('set_text',{ "obj" : obj, "text" : val });
-			return true;
-		},
-		/**
-		 * gets a JSON representation of a node (or the whole tree)
-		 * @name get_json([obj, options])
-		 * @param  {mixed} obj
-		 * @param  {Object} options
-		 * @param  {Boolean} options.no_state do not return state information
-		 * @param  {Boolean} options.no_id do not return ID
-		 * @param  {Boolean} options.no_children do not include children
-		 * @param  {Boolean} options.no_data do not include node data
-		 * @param  {Boolean} options.no_li_attr do not include LI attributes
-		 * @param  {Boolean} options.no_a_attr do not include A attributes
-		 * @param  {Boolean} options.flat return flat JSON instead of nested
-		 * @return {Object}
-		 */
-		get_json : function (obj, options, flat) {
-			obj = this.get_node(obj || $.jstree.root);
-			if(!obj) { return false; }
-			if(options && options.flat && !flat) { flat = []; }
-			var tmp = {
-				'id' : obj.id,
-				'text' : obj.text,
-				'icon' : this.get_icon(obj),
-				'li_attr' : $.extend(true, {}, obj.li_attr),
-				'a_attr' : $.extend(true, {}, obj.a_attr),
-				'state' : {},
-				'data' : options && options.no_data ? false : $.extend(true, $.vakata.is_array(obj.data)?[]:{}, obj.data)
-				//( this.get_node(obj, true).length ? this.get_node(obj, true).data() : obj.data ),
-			}, i, j;
-			if(options && options.flat) {
-				tmp.parent = obj.parent;
-			}
-			else {
-				tmp.children = [];
-			}
-			if(!options || !options.no_state) {
-				for(i in obj.state) {
-					if(obj.state.hasOwnProperty(i)) {
-						tmp.state[i] = obj.state[i];
-					}
-				}
-			} else {
-				delete tmp.state;
-			}
-			if(options && options.no_li_attr) {
-				delete tmp.li_attr;
-			}
-			if(options && options.no_a_attr) {
-				delete tmp.a_attr;
-			}
-			if(options && options.no_id) {
-				delete tmp.id;
-				if(tmp.li_attr && tmp.li_attr.id) {
-					delete tmp.li_attr.id;
-				}
-				if(tmp.a_attr && tmp.a_attr.id) {
-					delete tmp.a_attr.id;
-				}
-			}
-			if(options && options.flat && obj.id !== $.jstree.root) {
-				flat.push(tmp);
-			}
-			if(!options || !options.no_children) {
-				for(i = 0, j = obj.children.length; i < j; i++) {
-					if(options && options.flat) {
-						this.get_json(obj.children[i], options, flat);
-					}
-					else {
-						tmp.children.push(this.get_json(obj.children[i], options));
-					}
-				}
-			}
-			return options && options.flat ? flat : (obj.id === $.jstree.root ? tmp.children : tmp);
-		},
-		/**
-		 * create a new node (do not confuse with load_node)
-		 * @name create_node([par, node, pos, callback, is_loaded])
-		 * @param  {mixed}   par       the parent node (to create a root node use either "#" (string) or `null`)
-		 * @param  {mixed}   node      the data for the new node (a valid JSON object, or a simple string with the name)
-		 * @param  {mixed}   pos       the index at which to insert the node, "first" and "last" are also supported, default is "last"
-		 * @param  {Function} callback a function to be called once the node is created
-		 * @param  {Boolean} is_loaded internal argument indicating if the parent node was succesfully loaded
-		 * @return {String}            the ID of the newly create node
-		 * @trigger model.jstree, create_node.jstree
-		 */
-		create_node : function (par, node, pos, callback, is_loaded) {
-			if(par === null) { par = $.jstree.root; }
-			par = this.get_node(par);
-			if(!par) { return false; }
-			pos = pos === undefined ? "last" : pos;
-			if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
-				return this.load_node(par, function () { this.create_node(par, node, pos, callback, true); });
-			}
-			if(!node) { node = { "text" : this.get_string('New node') }; }
-			if(typeof node === "string") {
-				node = { "text" : node };
-			} else {
-				node = $.extend(true, {}, node);
-			}
-			if(node.text === undefined) { node.text = this.get_string('New node'); }
-			var tmp, dpc, i, j;
-
-			if(par.id === $.jstree.root) {
-				if(pos === "before") { pos = "first"; }
-				if(pos === "after") { pos = "last"; }
-			}
-			switch(pos) {
-				case "before":
-					tmp = this.get_node(par.parent);
-					pos = $.inArray(par.id, tmp.children);
-					par = tmp;
-					break;
-				case "after" :
-					tmp = this.get_node(par.parent);
-					pos = $.inArray(par.id, tmp.children) + 1;
-					par = tmp;
-					break;
-				case "inside":
-				case "first":
-					pos = 0;
-					break;
-				case "last":
-					pos = par.children.length;
-					break;
-				default:
-					if(!pos) { pos = 0; }
-					break;
-			}
-			if(pos > par.children.length) { pos = par.children.length; }
-			if(node.id === undefined) { node.id = true; }
-			if(!this.check("create_node", node, par, pos)) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			if(node.id === true) { delete node.id; }
-			node = this._parse_model_from_json(node, par.id, par.parents.concat());
-			if(!node) { return false; }
-			tmp = this.get_node(node);
-			dpc = [];
-			dpc.push(node);
-			dpc = dpc.concat(tmp.children_d);
-			this.trigger('model', { "nodes" : dpc, "parent" : par.id });
-
-			par.children_d = par.children_d.concat(dpc);
-			for(i = 0, j = par.parents.length; i < j; i++) {
-				this._model.data[par.parents[i]].children_d = this._model.data[par.parents[i]].children_d.concat(dpc);
-			}
-			node = tmp;
-			tmp = [];
-			for(i = 0, j = par.children.length; i < j; i++) {
-				tmp[i >= pos ? i+1 : i] = par.children[i];
-			}
-			tmp[pos] = node.id;
-			par.children = tmp;
-
-			this.redraw_node(par, true);
-			/**
-			 * triggered when a node is created
-			 * @event
-			 * @name create_node.jstree
-			 * @param {Object} node
-			 * @param {String} parent the parent's ID
-			 * @param {Number} position the position of the new node among the parent's children
-			 */
-			this.trigger('create_node', { "node" : this.get_node(node), "parent" : par.id, "position" : pos });
-			if(callback) { callback.call(this, this.get_node(node)); }
-			return node.id;
-		},
-		/**
-		 * set the text value of a node
-		 * @name rename_node(obj, val)
-		 * @param  {mixed} obj the node, you can pass an array to rename multiple nodes to the same name
-		 * @param  {String} val the new text value
-		 * @return {Boolean}
-		 * @trigger rename_node.jstree
-		 */
-		rename_node : function (obj, val) {
-			var t1, t2, old;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.rename_node(obj[t1], val);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			old = obj.text;
-			if(!this.check("rename_node", obj, this.get_parent(obj), val)) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			this.set_text(obj, val); // .apply(this, Array.prototype.slice.call(arguments))
-			/**
-			 * triggered when a node is renamed
-			 * @event
-			 * @name rename_node.jstree
-			 * @param {Object} node
-			 * @param {String} text the new value
-			 * @param {String} old the old value
-			 */
-			this.trigger('rename_node', { "node" : obj, "text" : val, "old" : old });
-			return true;
-		},
-		/**
-		 * remove a node
-		 * @name delete_node(obj)
-		 * @param  {mixed} obj the node, you can pass an array to delete multiple nodes
-		 * @return {Boolean}
-		 * @trigger delete_node.jstree, changed.jstree
-		 */
-		delete_node : function (obj) {
-			var t1, t2, par, pos, tmp, i, j, k, l, c, top, lft;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.delete_node(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			par = this.get_node(obj.parent);
-			pos = $.inArray(obj.id, par.children);
-			c = false;
-			if(!this.check("delete_node", obj, par, pos)) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			if(pos !== -1) {
-				par.children = $.vakata.array_remove(par.children, pos);
-			}
-			tmp = obj.children_d.concat([]);
-			tmp.push(obj.id);
-			for(i = 0, j = obj.parents.length; i < j; i++) {
-				this._model.data[obj.parents[i]].children_d = $.vakata.array_filter(this._model.data[obj.parents[i]].children_d, function (v) {
-					return $.inArray(v, tmp) === -1;
-				});
-			}
-			for(k = 0, l = tmp.length; k < l; k++) {
-				if(this._model.data[tmp[k]].state.selected) {
-					c = true;
-					break;
-				}
-			}
-			if (c) {
-				this._data.core.selected = $.vakata.array_filter(this._data.core.selected, function (v) {
-					return $.inArray(v, tmp) === -1;
-				});
-			}
-			/**
-			 * triggered when a node is deleted
-			 * @event
-			 * @name delete_node.jstree
-			 * @param {Object} node
-			 * @param {String} parent the parent's ID
-			 */
-			this.trigger('delete_node', { "node" : obj, "parent" : par.id });
-			if(c) {
-				this.trigger('changed', { 'action' : 'delete_node', 'node' : obj, 'selected' : this._data.core.selected, 'parent' : par.id });
-			}
-			for(k = 0, l = tmp.length; k < l; k++) {
-				delete this._model.data[tmp[k]];
-			}
-			if($.inArray(this._data.core.focused, tmp) !== -1) {
-				this._data.core.focused = null;
-				top = this.element[0].scrollTop;
-				lft = this.element[0].scrollLeft;
-				if(par.id === $.jstree.root) {
-					if (this._model.data[$.jstree.root].children[0]) {
-						this.get_node(this._model.data[$.jstree.root].children[0], true).children('.jstree-anchor').trigger('focus');
-					}
-				}
-				else {
-					this.get_node(par, true).children('.jstree-anchor').trigger('focus');
-				}
-				this.element[0].scrollTop  = top;
-				this.element[0].scrollLeft = lft;
-			}
-			this.redraw_node(par, true);
-			return true;
-		},
-		/**
-		 * check if an operation is premitted on the tree. Used internally.
-		 * @private
-		 * @name check(chk, obj, par, pos)
-		 * @param  {String} chk the operation to check, can be "create_node", "rename_node", "delete_node", "copy_node" or "move_node"
-		 * @param  {mixed} obj the node
-		 * @param  {mixed} par the parent
-		 * @param  {mixed} pos the position to insert at, or if "rename_node" - the new name
-		 * @param  {mixed} more some various additional information, for example if a "move_node" operations is triggered by DND this will be the hovered node
-		 * @return {Boolean}
-		 */
-		check : function (chk, obj, par, pos, more) {
-			obj = obj && obj.id ? obj : this.get_node(obj);
-			par = par && par.id ? par : this.get_node(par);
-			var tmp = chk.match(/^(move_node|copy_node|create_node)$/i) ? par : obj,
-				chc = this.settings.core.check_callback;
-			if(chk === "move_node" || chk === "copy_node") {
-				if((!more || !more.is_multi) && (chk === "move_node" && $.inArray(obj.id, par.children) === pos)) {
-					this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_08', 'reason' : 'Moving node to its current position', 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-					return false;
-				}
-				if((!more || !more.is_multi) && (obj.id === par.id || (chk === "move_node" && $.inArray(obj.id, par.children) === pos) || $.inArray(par.id, obj.children_d) !== -1)) {
-					this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_01', 'reason' : 'Moving parent inside child', 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-					return false;
-				}
-			}
-			if(tmp && tmp.data) { tmp = tmp.data; }
-			if(tmp && tmp.functions && (tmp.functions[chk] === false || tmp.functions[chk] === true)) {
-				if(tmp.functions[chk] === false) {
-					this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_02', 'reason' : 'Node data prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-				}
-				return tmp.functions[chk];
-			}
-			if(chc === false || ($.vakata.is_function(chc) && chc.call(this, chk, obj, par, pos, more) === false) || (chc && chc[chk] === false)) {
-				this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_03', 'reason' : 'User config for core.check_callback prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-				return false;
-			}
-			return true;
-		},
-		/**
-		 * get the last error
-		 * @name last_error()
-		 * @return {Object}
-		 */
-		last_error : function () {
-			return this._data.core.last_error;
-		},
-		/**
-		 * move a node to a new parent
-		 * @name move_node(obj, par [, pos, callback, is_loaded])
-		 * @param  {mixed} obj the node to move, pass an array to move multiple nodes
-		 * @param  {mixed} par the new parent
-		 * @param  {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0`
-		 * @param  {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position
-		 * @param  {Boolean} is_loaded internal parameter indicating if the parent node has been loaded
-		 * @param  {Boolean} skip_redraw internal parameter indicating if the tree should be redrawn
-		 * @param  {Boolean} instance internal parameter indicating if the node comes from another instance
-		 * @trigger move_node.jstree
-		 */
-		move_node : function (obj, par, pos, callback, is_loaded, skip_redraw, origin) {
-			var t1, t2, old_par, old_pos, new_par, old_ins, is_multi, dpc, tmp, i, j, k, l, p;
-
-			par = this.get_node(par);
-			pos = pos === undefined ? 0 : pos;
-			if(!par) { return false; }
-			if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
-				return this.load_node(par, function () { this.move_node(obj, par, pos, callback, true, false, origin); });
-			}
-
-			if($.vakata.is_array(obj)) {
-				if(obj.length === 1) {
-					obj = obj[0];
-				}
-				else {
-					//obj = obj.slice();
-					for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-						if((tmp = this.move_node(obj[t1], par, pos, callback, is_loaded, false, origin))) {
-							par = tmp;
-							pos = "after";
-						}
-					}
-					this.redraw();
-					return true;
-				}
-			}
-			obj = obj && (obj.id !== undefined) ? obj : this.get_node(obj);
-
-			if(!obj || obj.id === $.jstree.root) { return false; }
-
-			old_par = (obj.parent || $.jstree.root).toString();
-			new_par = (!pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root) ? par : this.get_node(par.parent);
-			old_ins = origin ? origin : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id));
-			is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id);
-			old_pos = old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1;
-			if(old_ins && old_ins._id) {
-				obj = old_ins._model.data[obj.id];
-			}
-
-			if(is_multi) {
-				if((tmp = this.copy_node(obj, par, pos, callback, is_loaded, false, origin))) {
-					if(old_ins) { old_ins.delete_node(obj); }
-					return tmp;
-				}
-				return false;
-			}
-			//var m = this._model.data;
-			if(par.id === $.jstree.root) {
-				if(pos === "before") { pos = "first"; }
-				if(pos === "after") { pos = "last"; }
-			}
-			switch(pos) {
-				case "before":
-					pos = $.inArray(par.id, new_par.children);
-					break;
-				case "after" :
-					pos = $.inArray(par.id, new_par.children) + 1;
-					break;
-				case "inside":
-				case "first":
-					pos = 0;
-					break;
-				case "last":
-					pos = new_par.children.length;
-					break;
-				default:
-					if(!pos) { pos = 0; }
-					break;
-			}
-			if(pos > new_par.children.length) { pos = new_par.children.length; }
-			if(!this.check("move_node", obj, new_par, pos, { 'core' : true, 'origin' : origin, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			if(obj.parent === new_par.id) {
-				dpc = new_par.children.concat();
-				tmp = $.inArray(obj.id, dpc);
-				if(tmp !== -1) {
-					dpc = $.vakata.array_remove(dpc, tmp);
-					if(pos > tmp) { pos--; }
-				}
-				tmp = [];
-				for(i = 0, j = dpc.length; i < j; i++) {
-					tmp[i >= pos ? i+1 : i] = dpc[i];
-				}
-				tmp[pos] = obj.id;
-				new_par.children = tmp;
-				this._node_changed(new_par.id);
-				this.redraw(new_par.id === $.jstree.root);
-			}
-			else {
-				// clean old parent and up
-				tmp = obj.children_d.concat();
-				tmp.push(obj.id);
-				for(i = 0, j = obj.parents.length; i < j; i++) {
-					dpc = [];
-					p = old_ins._model.data[obj.parents[i]].children_d;
-					for(k = 0, l = p.length; k < l; k++) {
-						if($.inArray(p[k], tmp) === -1) {
-							dpc.push(p[k]);
-						}
-					}
-					old_ins._model.data[obj.parents[i]].children_d = dpc;
-				}
-				old_ins._model.data[old_par].children = $.vakata.array_remove_item(old_ins._model.data[old_par].children, obj.id);
-
-				// insert into new parent and up
-				for(i = 0, j = new_par.parents.length; i < j; i++) {
-					this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(tmp);
-				}
-				dpc = [];
-				for(i = 0, j = new_par.children.length; i < j; i++) {
-					dpc[i >= pos ? i+1 : i] = new_par.children[i];
-				}
-				dpc[pos] = obj.id;
-				new_par.children = dpc;
-				new_par.children_d.push(obj.id);
-				new_par.children_d = new_par.children_d.concat(obj.children_d);
-
-				// update object
-				obj.parent = new_par.id;
-				tmp = new_par.parents.concat();
-				tmp.unshift(new_par.id);
-				p = obj.parents.length;
-				obj.parents = tmp;
-
-				// update object children
-				tmp = tmp.concat();
-				for(i = 0, j = obj.children_d.length; i < j; i++) {
-					this._model.data[obj.children_d[i]].parents = this._model.data[obj.children_d[i]].parents.slice(0,p*-1);
-					Array.prototype.push.apply(this._model.data[obj.children_d[i]].parents, tmp);
-				}
-
-				if(old_par === $.jstree.root || new_par.id === $.jstree.root) {
-					this._model.force_full_redraw = true;
-				}
-				if(!this._model.force_full_redraw) {
-					this._node_changed(old_par);
-					this._node_changed(new_par.id);
-				}
-				if(!skip_redraw) {
-					this.redraw();
-				}
-			}
-			if(callback) { callback.call(this, obj, new_par, pos); }
-			/**
-			 * triggered when a node is moved
-			 * @event
-			 * @name move_node.jstree
-			 * @param {Object} node
-			 * @param {String} parent the parent's ID
-			 * @param {Number} position the position of the node among the parent's children
-			 * @param {String} old_parent the old parent of the node
-			 * @param {Number} old_position the old position of the node
-			 * @param {Boolean} is_multi do the node and new parent belong to different instances
-			 * @param {jsTree} old_instance the instance the node came from
-			 * @param {jsTree} new_instance the instance of the new parent
-			 */
-			this.trigger('move_node', { "node" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_pos, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this });
-			return obj.id;
-		},
-		/**
-		 * copy a node to a new parent
-		 * @name copy_node(obj, par [, pos, callback, is_loaded])
-		 * @param  {mixed} obj the node to copy, pass an array to copy multiple nodes
-		 * @param  {mixed} par the new parent
-		 * @param  {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0`
-		 * @param  {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position
-		 * @param  {Boolean} is_loaded internal parameter indicating if the parent node has been loaded
-		 * @param  {Boolean} skip_redraw internal parameter indicating if the tree should be redrawn
-		 * @param  {Boolean} instance internal parameter indicating if the node comes from another instance
-		 * @trigger model.jstree copy_node.jstree
-		 */
-		copy_node : function (obj, par, pos, callback, is_loaded, skip_redraw, origin) {
-			var t1, t2, dpc, tmp, i, j, node, old_par, new_par, old_ins, is_multi;
-
-			par = this.get_node(par);
-			pos = pos === undefined ? 0 : pos;
-			if(!par) { return false; }
-			if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
-				return this.load_node(par, function () { this.copy_node(obj, par, pos, callback, true, false, origin); });
-			}
-
-			if($.vakata.is_array(obj)) {
-				if(obj.length === 1) {
-					obj = obj[0];
-				}
-				else {
-					//obj = obj.slice();
-					for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-						if((tmp = this.copy_node(obj[t1], par, pos, callback, is_loaded, true, origin))) {
-							par = tmp;
-							pos = "after";
-						}
-					}
-					this.redraw();
-					return true;
-				}
-			}
-			obj = obj && (obj.id !== undefined) ? obj : this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-
-			old_par = (obj.parent || $.jstree.root).toString();
-			new_par = (!pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root) ? par : this.get_node(par.parent);
-			old_ins = origin ? origin : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id));
-			is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id);
-
-			if(old_ins && old_ins._id) {
-				obj = old_ins._model.data[obj.id];
-			}
-
-			if(par.id === $.jstree.root) {
-				if(pos === "before") { pos = "first"; }
-				if(pos === "after") { pos = "last"; }
-			}
-			switch(pos) {
-				case "before":
-					pos = $.inArray(par.id, new_par.children);
-					break;
-				case "after" :
-					pos = $.inArray(par.id, new_par.children) + 1;
-					break;
-				case "inside":
-				case "first":
-					pos = 0;
-					break;
-				case "last":
-					pos = new_par.children.length;
-					break;
-				default:
-					if(!pos) { pos = 0; }
-					break;
-			}
-			if(pos > new_par.children.length) { pos = new_par.children.length; }
-			if(!this.check("copy_node", obj, new_par, pos, { 'core' : true, 'origin' : origin, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			node = old_ins ? old_ins.get_json(obj, { no_id : true, no_data : true, no_state : true }) : obj;
-			if(!node) { return false; }
-			if(node.id === true) { delete node.id; }
-			node = this._parse_model_from_json(node, new_par.id, new_par.parents.concat());
-			if(!node) { return false; }
-			tmp = this.get_node(node);
-			if(obj && obj.state && obj.state.loaded === false) { tmp.state.loaded = false; }
-			dpc = [];
-			dpc.push(node);
-			dpc = dpc.concat(tmp.children_d);
-			this.trigger('model', { "nodes" : dpc, "parent" : new_par.id });
-
-			// insert into new parent and up
-			for(i = 0, j = new_par.parents.length; i < j; i++) {
-				this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(dpc);
-			}
-			dpc = [];
-			for(i = 0, j = new_par.children.length; i < j; i++) {
-				dpc[i >= pos ? i+1 : i] = new_par.children[i];
-			}
-			dpc[pos] = tmp.id;
-			new_par.children = dpc;
-			new_par.children_d.push(tmp.id);
-			new_par.children_d = new_par.children_d.concat(tmp.children_d);
-
-			if(new_par.id === $.jstree.root) {
-				this._model.force_full_redraw = true;
-			}
-			if(!this._model.force_full_redraw) {
-				this._node_changed(new_par.id);
-			}
-			if(!skip_redraw) {
-				this.redraw(new_par.id === $.jstree.root);
-			}
-			if(callback) { callback.call(this, tmp, new_par, pos); }
-			/**
-			 * triggered when a node is copied
-			 * @event
-			 * @name copy_node.jstree
-			 * @param {Object} node the copied node
-			 * @param {Object} original the original node
-			 * @param {String} parent the parent's ID
-			 * @param {Number} position the position of the node among the parent's children
-			 * @param {String} old_parent the old parent of the node
-			 * @param {Number} old_position the position of the original node
-			 * @param {Boolean} is_multi do the node and new parent belong to different instances
-			 * @param {jsTree} old_instance the instance the node came from
-			 * @param {jsTree} new_instance the instance of the new parent
-			 */
-			this.trigger('copy_node', { "node" : tmp, "original" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1,'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this });
-			return tmp.id;
-		},
-		/**
-		 * cut a node (a later call to `paste(obj)` would move the node)
-		 * @name cut(obj)
-		 * @param  {mixed} obj multiple objects can be passed using an array
-		 * @trigger cut.jstree
-		 */
-		cut : function (obj) {
-			if(!obj) { obj = this._data.core.selected.concat(); }
-			if(!$.vakata.is_array(obj)) { obj = [obj]; }
-			if(!obj.length) { return false; }
-			var tmp = [], o, t1, t2;
-			for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-				o = this.get_node(obj[t1]);
-				if(o && (o.id || o.id === 0) && o.id !== $.jstree.root) { tmp.push(o); }
-			}
-			if(!tmp.length) { return false; }
-			ccp_node = tmp;
-			ccp_inst = this;
-			ccp_mode = 'move_node';
-			/**
-			 * triggered when nodes are added to the buffer for moving
-			 * @event
-			 * @name cut.jstree
-			 * @param {Array} node
-			 */
-			this.trigger('cut', { "node" : obj });
-		},
-		/**
-		 * copy a node (a later call to `paste(obj)` would copy the node)
-		 * @name copy(obj)
-		 * @param  {mixed} obj multiple objects can be passed using an array
-		 * @trigger copy.jstree
-		 */
-		copy : function (obj) {
-			if(!obj) { obj = this._data.core.selected.concat(); }
-			if(!$.vakata.is_array(obj)) { obj = [obj]; }
-			if(!obj.length) { return false; }
-			var tmp = [], o, t1, t2;
-			for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-				o = this.get_node(obj[t1]);
-				if(o && (o.id !== undefined) && o.id !== $.jstree.root) { tmp.push(o); }
-			}
-			if(!tmp.length) { return false; }
-			ccp_node = tmp;
-			ccp_inst = this;
-			ccp_mode = 'copy_node';
-			/**
-			 * triggered when nodes are added to the buffer for copying
-			 * @event
-			 * @name copy.jstree
-			 * @param {Array} node
-			 */
-			this.trigger('copy', { "node" : obj });
-		},
-		/**
-		 * get the current buffer (any nodes that are waiting for a paste operation)
-		 * @name get_buffer()
-		 * @return {Object} an object consisting of `mode` ("copy_node" or "move_node"), `node` (an array of objects) and `inst` (the instance)
-		 */
-		get_buffer : function () {
-			return { 'mode' : ccp_mode, 'node' : ccp_node, 'inst' : ccp_inst };
-		},
-		/**
-		 * check if there is something in the buffer to paste
-		 * @name can_paste()
-		 * @return {Boolean}
-		 */
-		can_paste : function () {
-			return ccp_mode !== false && ccp_node !== false; // && ccp_inst._model.data[ccp_node];
-		},
-		/**
-		 * copy or move the previously cut or copied nodes to a new parent
-		 * @name paste(obj [, pos])
-		 * @param  {mixed} obj the new parent
-		 * @param  {mixed} pos the position to insert at (besides integer, "first" and "last" are supported), defaults to integer `0`
-		 * @trigger paste.jstree
-		 */
-		paste : function (obj, pos) {
-			obj = this.get_node(obj);
-			if(!obj || !ccp_mode || !ccp_mode.match(/^(copy_node|move_node)$/) || !ccp_node) { return false; }
-			if(this[ccp_mode](ccp_node, obj, pos, false, false, false, ccp_inst)) {
-				/**
-				 * triggered when paste is invoked
-				 * @event
-				 * @name paste.jstree
-				 * @param {String} parent the ID of the receiving node
-				 * @param {Array} node the nodes in the buffer
-				 * @param {String} mode the performed operation - "copy_node" or "move_node"
-				 */
-				this.trigger('paste', { "parent" : obj.id, "node" : ccp_node, "mode" : ccp_mode });
-			}
-			ccp_node = false;
-			ccp_mode = false;
-			ccp_inst = false;
-		},
-		/**
-		 * clear the buffer of previously copied or cut nodes
-		 * @name clear_buffer()
-		 * @trigger clear_buffer.jstree
-		 */
-		clear_buffer : function () {
-			ccp_node = false;
-			ccp_mode = false;
-			ccp_inst = false;
-			/**
-			 * triggered when the copy / cut buffer is cleared
-			 * @event
-			 * @name clear_buffer.jstree
-			 */
-			this.trigger('clear_buffer');
-		},
-		/**
-		 * put a node in edit mode (input field to rename the node)
-		 * @name edit(obj [, default_text, callback])
-		 * @param  {mixed} obj
-		 * @param  {String} default_text the text to populate the input with (if omitted or set to a non-string value the node's text value is used)
-		 * @param  {Function} callback a function to be called once the text box is blurred, it is called in the instance's scope and receives the node, a status parameter (true if the rename is successful, false otherwise), a boolean indicating if the user cancelled the edit and the original unescaped value provided by the user. You can also access the node's title using .text
-		 */
-		edit : function (obj, default_text, callback) {
-			var rtl, w, a, s, t, h1, h2, fn, tmp, cancel = false;
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			if(!this.check("edit", obj, this.get_parent(obj))) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			tmp = obj;
-			default_text = typeof default_text === 'string' ? default_text : obj.text;
-			this.set_text(obj, "");
-			obj = this._open_to(obj);
-			tmp.text = default_text;
-
-			rtl = this._data.core.rtl;
-			w  = this.element.width();
-			this._data.core.focused = tmp.id;
-			a  = obj.children('.jstree-anchor').trigger('focus');
-			s  = $('<span></span>');
-			/*!
-			oi = obj.children("i:visible"),
-			ai = a.children("i:visible"),
-			w1 = oi.width() * oi.length,
-			w2 = ai.width() * ai.length,
-			*/
-			t  = default_text;
-			h1 = $("<"+"div></div>", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo(document.body);
-			h2 = $("<"+"input />", {
-						"value" : t,
-						"class" : "jstree-rename-input",
-						// "size" : t.length,
-						"css" : {
-							"padding" : "0",
-							"border" : "1px solid silver",
-							"box-sizing" : "border-box",
-							"display" : "inline-block",
-							"height" : (this._data.core.li_height) + "px",
-							"lineHeight" : (this._data.core.li_height) + "px",
-							"width" : "150px" // will be set a bit further down
-						},
-						"on" : {
-							"blur" : function (e) {
-								e.stopImmediatePropagation();
-								e.preventDefault();
-								var i = s.children(".jstree-rename-input"),
-									v = i.val(),
-									f = this.settings.core.force_text,
-									nv;
-								if(v === "") { v = t; }
-								h1.remove();
-								s.replaceWith(a);
-								s.remove();
-								t = f ? t : $('<div></div>').append($.parseHTML(t)).html();
-								obj = this.get_node(obj);
-								this.set_text(obj, t);
-								nv = !!this.rename_node(obj, f ? $('<div></div>').text(v).text() : $('<div></div>').append($.parseHTML(v)).html());
-								if(!nv) {
-									this.set_text(obj, t); // move this up? and fix #483
-								}
-								this._data.core.focused = tmp.id;
-								setTimeout(function () {
-									var node = this.get_node(tmp.id, true);
-									if(node.length) {
-										this._data.core.focused = tmp.id;
-										node.children('.jstree-anchor').trigger('focus');
-									}
-								}.bind(this), 0);
-								if(callback) {
-									callback.call(this, tmp, nv, cancel, v);
-								}
-								h2 = null;
-							}.bind(this),
-							"keydown" : function (e) {
-								var key = e.which;
-								if(key === 27) {
-									cancel = true;
-									this.value = t;
-								}
-								if(key === 27 || key === 13 || key === 37 || key === 38 || key === 39 || key === 40 || key === 32) {
-									e.stopImmediatePropagation();
-								}
-								if(key === 27 || key === 13) {
-									e.preventDefault();
-									this.blur();
-								}
-							},
-							"click" : function (e) { e.stopImmediatePropagation(); },
-							"mousedown" : function (e) { e.stopImmediatePropagation(); },
-							"keyup" : function (e) {
-								h2.width(Math.min(h1.text("pW" + this.value).width(),w));
-							},
-							"keypress" : function(e) {
-								if(e.which === 13) { return false; }
-							}
-						}
-					});
-				fn = {
-						fontFamily		: a.css('fontFamily')		|| '',
-						fontSize		: a.css('fontSize')			|| '',
-						fontWeight		: a.css('fontWeight')		|| '',
-						fontStyle		: a.css('fontStyle')		|| '',
-						fontStretch		: a.css('fontStretch')		|| '',
-						fontVariant		: a.css('fontVariant')		|| '',
-						letterSpacing	: a.css('letterSpacing')	|| '',
-						wordSpacing		: a.css('wordSpacing')		|| ''
-				};
-			s.attr('class', a.attr('class')).append(a.contents().clone()).append(h2);
-			a.replaceWith(s);
-			h1.css(fn);
-			h2.css(fn).width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select();
-			$(document).one('mousedown.jstree touchstart.jstree dnd_start.vakata', function (e) {
-				if (h2 && e.target !== h2) {
-					$(h2).trigger('blur');
-				}
-			});
-		},
-
-
-		/**
-		 * changes the theme
-		 * @name set_theme(theme_name [, theme_url])
-		 * @param {String} theme_name the name of the new theme to apply
-		 * @param {mixed} theme_url  the location of the CSS file for this theme. Omit or set to `false` if you manually included the file. Set to `true` to autoload from the `core.themes.dir` directory.
-		 * @trigger set_theme.jstree
-		 */
-		set_theme : function (theme_name, theme_url) {
-			if(!theme_name) { return false; }
-			if(theme_url === true) {
-				var dir = this.settings.core.themes.dir;
-				if(!dir) { dir = $.jstree.path + '/themes'; }
-				theme_url = dir + '/' + theme_name + '/style.css';
-			}
-			if(theme_url && $.inArray(theme_url, themes_loaded) === -1) {
-				$('head').append('<'+'link rel="stylesheet" href="' + theme_url + '" type="text/css" />');
-				themes_loaded.push(theme_url);
-			}
-			if(this._data.core.themes.name) {
-				this.element.removeClass('jstree-' + this._data.core.themes.name);
-			}
-			this._data.core.themes.name = theme_name;
-			this.element.addClass('jstree-' + theme_name);
-			this.element[this.settings.core.themes.responsive ? 'addClass' : 'removeClass' ]('jstree-' + theme_name + '-responsive');
-			/**
-			 * triggered when a theme is set
-			 * @event
-			 * @name set_theme.jstree
-			 * @param {String} theme the new theme
-			 */
-			this.trigger('set_theme', { 'theme' : theme_name });
-		},
-		/**
-		 * gets the name of the currently applied theme name
-		 * @name get_theme()
-		 * @return {String}
-		 */
-		get_theme : function () { return this._data.core.themes.name; },
-		/**
-		 * changes the theme variant (if the theme has variants)
-		 * @name set_theme_variant(variant_name)
-		 * @param {String|Boolean} variant_name the variant to apply (if `false` is used the current variant is removed)
-		 */
-		set_theme_variant : function (variant_name) {
-			if(this._data.core.themes.variant) {
-				this.element.removeClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant);
-			}
-			this._data.core.themes.variant = variant_name;
-			if(variant_name) {
-				this.element.addClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant);
-			}
-		},
-		/**
-		 * gets the name of the currently applied theme variant
-		 * @name get_theme()
-		 * @return {String}
-		 */
-		get_theme_variant : function () { return this._data.core.themes.variant; },
-		/**
-		 * shows a striped background on the container (if the theme supports it)
-		 * @name show_stripes()
-		 */
-		show_stripes : function () {
-			this._data.core.themes.stripes = true;
-			this.get_container_ul().addClass("jstree-striped");
-			/**
-			 * triggered when stripes are shown
-			 * @event
-			 * @name show_stripes.jstree
-			 */
-			this.trigger('show_stripes');
-		},
-		/**
-		 * hides the striped background on the container
-		 * @name hide_stripes()
-		 */
-		hide_stripes : function () {
-			this._data.core.themes.stripes = false;
-			this.get_container_ul().removeClass("jstree-striped");
-			/**
-			 * triggered when stripes are hidden
-			 * @event
-			 * @name hide_stripes.jstree
-			 */
-			this.trigger('hide_stripes');
-		},
-		/**
-		 * toggles the striped background on the container
-		 * @name toggle_stripes()
-		 */
-		toggle_stripes : function () { if(this._data.core.themes.stripes) { this.hide_stripes(); } else { this.show_stripes(); } },
-		/**
-		 * shows the connecting dots (if the theme supports it)
-		 * @name show_dots()
-		 */
-		show_dots : function () {
-			this._data.core.themes.dots = true;
-			this.get_container_ul().removeClass("jstree-no-dots");
-			/**
-			 * triggered when dots are shown
-			 * @event
-			 * @name show_dots.jstree
-			 */
-			this.trigger('show_dots');
-		},
-		/**
-		 * hides the connecting dots
-		 * @name hide_dots()
-		 */
-		hide_dots : function () {
-			this._data.core.themes.dots = false;
-			this.get_container_ul().addClass("jstree-no-dots");
-			/**
-			 * triggered when dots are hidden
-			 * @event
-			 * @name hide_dots.jstree
-			 */
-			this.trigger('hide_dots');
-		},
-		/**
-		 * toggles the connecting dots
-		 * @name toggle_dots()
-		 */
-		toggle_dots : function () { if(this._data.core.themes.dots) { this.hide_dots(); } else { this.show_dots(); } },
-		/**
-		 * show the node icons
-		 * @name show_icons()
-		 */
-		show_icons : function () {
-			this._data.core.themes.icons = true;
-			this.get_container_ul().removeClass("jstree-no-icons");
-			/**
-			 * triggered when icons are shown
-			 * @event
-			 * @name show_icons.jstree
-			 */
-			this.trigger('show_icons');
-		},
-		/**
-		 * hide the node icons
-		 * @name hide_icons()
-		 */
-		hide_icons : function () {
-			this._data.core.themes.icons = false;
-			this.get_container_ul().addClass("jstree-no-icons");
-			/**
-			 * triggered when icons are hidden
-			 * @event
-			 * @name hide_icons.jstree
-			 */
-			this.trigger('hide_icons');
-		},
-		/**
-		 * toggle the node icons
-		 * @name toggle_icons()
-		 */
-		toggle_icons : function () { if(this._data.core.themes.icons) { this.hide_icons(); } else { this.show_icons(); } },
-		/**
-		 * show the node ellipsis
-		 * @name show_icons()
-		 */
-		show_ellipsis : function () {
-			this._data.core.themes.ellipsis = true;
-			this.get_container_ul().addClass("jstree-ellipsis");
-			/**
-			 * triggered when ellisis is shown
-			 * @event
-			 * @name show_ellipsis.jstree
-			 */
-			this.trigger('show_ellipsis');
-		},
-		/**
-		 * hide the node ellipsis
-		 * @name hide_ellipsis()
-		 */
-		hide_ellipsis : function () {
-			this._data.core.themes.ellipsis = false;
-			this.get_container_ul().removeClass("jstree-ellipsis");
-			/**
-			 * triggered when ellisis is hidden
-			 * @event
-			 * @name hide_ellipsis.jstree
-			 */
-			this.trigger('hide_ellipsis');
-		},
-		/**
-		 * toggle the node ellipsis
-		 * @name toggle_icons()
-		 */
-		toggle_ellipsis : function () { if(this._data.core.themes.ellipsis) { this.hide_ellipsis(); } else { this.show_ellipsis(); } },
-		/**
-		 * set the node icon for a node
-		 * @name set_icon(obj, icon)
-		 * @param {mixed} obj
-		 * @param {String} icon the new icon - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class
-		 */
-		set_icon : function (obj, icon) {
-			var t1, t2, dom, old;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.set_icon(obj[t1], icon);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			old = obj.icon;
-			obj.icon = icon === true || icon === null || icon === undefined || icon === '' ? true : icon;
-			dom = this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon");
-			if(icon === false) {
-				dom.removeClass('jstree-themeicon-custom ' + old).css("background","").removeAttr("rel");
-				this.hide_icon(obj);
-			}
-			else if(icon === true || icon === null || icon === undefined || icon === '') {
-				dom.removeClass('jstree-themeicon-custom ' + old).css("background","").removeAttr("rel");
-				if(old === false) { this.show_icon(obj); }
-			}
-			else if(icon.indexOf("/") === -1 && icon.indexOf(".") === -1) {
-				dom.removeClass(old).css("background","");
-				dom.addClass(icon + ' jstree-themeicon-custom').attr("rel",icon);
-				if(old === false) { this.show_icon(obj); }
-			}
-			else {
-				dom.removeClass(old).css("background","");
-				dom.addClass('jstree-themeicon-custom').css("background", "url('" + icon + "') center center no-repeat").attr("rel",icon);
-				if(old === false) { this.show_icon(obj); }
-			}
-			return true;
-		},
-		/**
-		 * get the node icon for a node
-		 * @name get_icon(obj)
-		 * @param {mixed} obj
-		 * @return {String}
-		 */
-		get_icon : function (obj) {
-			obj = this.get_node(obj);
-			return (!obj || obj.id === $.jstree.root) ? false : obj.icon;
-		},
-		/**
-		 * hide the icon on an individual node
-		 * @name hide_icon(obj)
-		 * @param {mixed} obj
-		 */
-		hide_icon : function (obj) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.hide_icon(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj === $.jstree.root) { return false; }
-			obj.icon = false;
-			this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon").addClass('jstree-themeicon-hidden');
-			return true;
-		},
-		/**
-		 * show the icon on an individual node
-		 * @name show_icon(obj)
-		 * @param {mixed} obj
-		 */
-		show_icon : function (obj) {
-			var t1, t2, dom;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.show_icon(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj === $.jstree.root) { return false; }
-			dom = this.get_node(obj, true);
-			obj.icon = dom.length ? dom.children(".jstree-anchor").children(".jstree-themeicon").attr('rel') : true;
-			if(!obj.icon) { obj.icon = true; }
-			dom.children(".jstree-anchor").children(".jstree-themeicon").removeClass('jstree-themeicon-hidden');
-			return true;
-		}
-	};
-
-	// helpers
-	$.vakata = {};
-	// collect attributes
-	$.vakata.attributes = function(node, with_values) {
-		node = $(node)[0];
-		var attr = with_values ? {} : [];
-		if(node && node.attributes) {
-			$.each(node.attributes, function (i, v) {
-				if($.inArray(v.name.toLowerCase(),['style','contenteditable','hasfocus','tabindex']) !== -1) { return; }
-				if(v.value !== null && $.vakata.trim(v.value) !== '') {
-					if(with_values) { attr[v.name] = v.value; }
-					else { attr.push(v.name); }
-				}
-			});
-		}
-		return attr;
-	};
-	$.vakata.array_unique = function(array) {
-		var a = [], i, j, l, o = {};
-		for(i = 0, l = array.length; i < l; i++) {
-			if(o[array[i]] === undefined) {
-				a.push(array[i]);
-				o[array[i]] = true;
-			}
-		}
-		return a;
-	};
-	// remove item from array
-	$.vakata.array_remove = function(array, from) {
-		array.splice(from, 1);
-		return array;
-		//var rest = array.slice((to || from) + 1 || array.length);
-		//array.length = from < 0 ? array.length + from : from;
-		//array.push.apply(array, rest);
-		//return array;
-	};
-	// remove item from array
-	$.vakata.array_remove_item = function(array, item) {
-		var tmp = $.inArray(item, array);
-		return tmp !== -1 ? $.vakata.array_remove(array, tmp) : array;
-	};
-	$.vakata.array_filter = function(c,a,b,d,e) {
-		if (c.filter) {
-			return c.filter(a, b);
-		}
-		d=[];
-		for (e in c) {
-			if (~~e+''===e+'' && e>=0 && a.call(b,c[e],+e,c)) {
-				d.push(c[e]);
-			}
-		}
-		return d;
-	};
-	$.vakata.trim = function (text) {
-		return String.prototype.trim ? 
-			String.prototype.trim.call(text.toString()) :
-			text.toString().replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
-	};
-	$.vakata.is_function = function(obj) {
-		return typeof obj === "function" && typeof obj.nodeType !== "number";
-	};
-	$.vakata.is_array = Array.isArray || function (obj) {
-		return Object.prototype.toString.call(obj) === "[object Array]";
-	};
-
-	// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind#polyfill
-	if (!Function.prototype.bind) {
-		Function.prototype.bind = function () {
-			var thatFunc = this, thatArg = arguments[0];
-			var args = Array.prototype.slice.call(arguments, 1);
-			if (typeof thatFunc !== 'function') {
-				// closest thing possible to the ECMAScript 5
-				// internal IsCallable function
-				throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
-			}
-			return function(){
-				var funcArgs = args.concat(Array.prototype.slice.call(arguments));
-				return thatFunc.apply(thatArg, funcArgs);
-			};
-		};
-	}
-
-
-/**
- * ### Changed plugin
- *
- * This plugin adds more information to the `changed.jstree` event. The new data is contained in the `changed` event data property, and contains a lists of `selected` and `deselected` nodes.
- */
-
-	$.jstree.plugins.changed = function (options, parent) {
-		var last = [];
-		this.trigger = function (ev, data) {
-			var i, j;
-			if(!data) {
-				data = {};
-			}
-			if(ev.replace('.jstree','') === 'changed') {
-				data.changed = { selected : [], deselected : [] };
-				var tmp = {};
-				for(i = 0, j = last.length; i < j; i++) {
-					tmp[last[i]] = 1;
-				}
-				for(i = 0, j = data.selected.length; i < j; i++) {
-					if(!tmp[data.selected[i]]) {
-						data.changed.selected.push(data.selected[i]);
-					}
-					else {
-						tmp[data.selected[i]] = 2;
-					}
-				}
-				for(i = 0, j = last.length; i < j; i++) {
-					if(tmp[last[i]] === 1) {
-						data.changed.deselected.push(last[i]);
-					}
-				}
-				last = data.selected.slice();
-			}
-			/**
-			 * triggered when selection changes (the "changed" plugin enhances the original event with more data)
-			 * @event
-			 * @name changed.jstree
-			 * @param {Object} node
-			 * @param {Object} action the action that caused the selection to change
-			 * @param {Array} selected the current selection
-			 * @param {Object} changed an object containing two properties `selected` and `deselected` - both arrays of node IDs, which were selected or deselected since the last changed event
-			 * @param {Object} event the event (if any) that triggered this changed event
-			 * @plugin changed
-			 */
-			parent.trigger.call(this, ev, data);
-		};
-		this.refresh = function (skip_loading, forget_state) {
-			last = [];
-			return parent.refresh.apply(this, arguments);
-		};
-	};
-
-/**
- * ### Checkbox plugin
- *
- * This plugin renders checkbox icons in front of each node, making multiple selection much easier.
- * It also supports tri-state behavior, meaning that if a node has a few of its children checked it will be rendered as undetermined, and state will be propagated up.
- */
-
-	var _i = document.createElement('I');
-	_i.className = 'jstree-icon jstree-checkbox';
-	_i.setAttribute('role', 'presentation');
-	/**
-	 * stores all defaults for the checkbox plugin
-	 * @name $.jstree.defaults.checkbox
-	 * @plugin checkbox
-	 */
-	$.jstree.defaults.checkbox = {
-		/**
-		 * a boolean indicating if checkboxes should be visible (can be changed at a later time using `show_checkboxes()` and `hide_checkboxes`). Defaults to `true`.
-		 * @name $.jstree.defaults.checkbox.visible
-		 * @plugin checkbox
-		 */
-		visible				: true,
-		/**
-		 * a boolean indicating if checkboxes should cascade down and have an undetermined state. Defaults to `true`.
-		 * @name $.jstree.defaults.checkbox.three_state
-		 * @plugin checkbox
-		 */
-		three_state			: true,
-		/**
-		 * a boolean indicating if clicking anywhere on the node should act as clicking on the checkbox. Defaults to `true`.
-		 * @name $.jstree.defaults.checkbox.whole_node
-		 * @plugin checkbox
-		 */
-		whole_node			: true,
-		/**
-		 * a boolean indicating if the selected style of a node should be kept, or removed. Defaults to `true`.
-		 * @name $.jstree.defaults.checkbox.keep_selected_style
-		 * @plugin checkbox
-		 */
-		keep_selected_style	: true,
-		/**
-		 * This setting controls how cascading and undetermined nodes are applied.
-		 * If 'up' is in the string - cascading up is enabled, if 'down' is in the string - cascading down is enabled, if 'undetermined' is in the string - undetermined nodes will be used.
-		 * If `three_state` is set to `true` this setting is automatically set to 'up+down+undetermined'. Defaults to ''.
-		 * @name $.jstree.defaults.checkbox.cascade
-		 * @plugin checkbox
-		 */
-		cascade				: '',
-		/**
-		 * This setting controls if checkbox are bound to the general tree selection or to an internal array maintained by the checkbox plugin. Defaults to `true`, only set to `false` if you know exactly what you are doing.
-		 * @name $.jstree.defaults.checkbox.tie_selection
-		 * @plugin checkbox
-		 */
-		tie_selection		: true,
-
-		/**
-		 * This setting controls if cascading down affects disabled checkboxes
-		 * @name $.jstree.defaults.checkbox.cascade_to_disabled
-		 * @plugin checkbox
-		 */
-		cascade_to_disabled : true,
-
-		/**
-		 * This setting controls if cascading down affects hidden checkboxes
-		 * @name $.jstree.defaults.checkbox.cascade_to_hidden
-		 * @plugin checkbox
-		 */
-		cascade_to_hidden : true
-	};
-	$.jstree.plugins.checkbox = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-			this._data.checkbox.uto = false;
-			this._data.checkbox.selected = [];
-			if(this.settings.checkbox.three_state) {
-				this.settings.checkbox.cascade = 'up+down+undetermined';
-			}
-			this.element
-				.on("init.jstree", function () {
-						this._data.checkbox.visible = this.settings.checkbox.visible;
-						if(!this.settings.checkbox.keep_selected_style) {
-							this.element.addClass('jstree-checkbox-no-clicked');
-						}
-						if(this.settings.checkbox.tie_selection) {
-							this.element.addClass('jstree-checkbox-selection');
-						}
-					}.bind(this))
-				.on("loading.jstree", function () {
-						this[ this._data.checkbox.visible ? 'show_checkboxes' : 'hide_checkboxes' ]();
-					}.bind(this));
-			if(this.settings.checkbox.cascade.indexOf('undetermined') !== -1) {
-				this.element
-					.on('changed.jstree uncheck_node.jstree check_node.jstree uncheck_all.jstree check_all.jstree move_node.jstree copy_node.jstree redraw.jstree open_node.jstree', function () {
-							// only if undetermined is in setting
-							if(this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); }
-							this._data.checkbox.uto = setTimeout(this._undetermined.bind(this), 50);
-						}.bind(this));
-			}
-			if(!this.settings.checkbox.tie_selection) {
-				this.element
-					.on('model.jstree', function (e, data) {
-						var m = this._model.data,
-							p = m[data.parent],
-							dpc = data.nodes,
-							i, j;
-						for(i = 0, j = dpc.length; i < j; i++) {
-							m[dpc[i]].state.checked = m[dpc[i]].state.checked || (m[dpc[i]].original && m[dpc[i]].original.state && m[dpc[i]].original.state.checked);
-							if(m[dpc[i]].state.checked) {
-								this._data.checkbox.selected.push(dpc[i]);
-							}
-						}
-					}.bind(this));
-			}
-			if(this.settings.checkbox.cascade.indexOf('up') !== -1 || this.settings.checkbox.cascade.indexOf('down') !== -1) {
-				this.element
-					.on('model.jstree', function (e, data) {
-							var m = this._model.data,
-								p = m[data.parent],
-								dpc = data.nodes,
-								chd = [],
-								c, i, j, k, l, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection;
-
-							if(s.indexOf('down') !== -1) {
-								// apply down
-								if(p.state[ t ? 'selected' : 'checked' ]) {
-									for(i = 0, j = dpc.length; i < j; i++) {
-										m[dpc[i]].state[ t ? 'selected' : 'checked' ] = true;
-									}
-
-									this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(dpc);
-								}
-								else {
-									for(i = 0, j = dpc.length; i < j; i++) {
-										if(m[dpc[i]].state[ t ? 'selected' : 'checked' ]) {
-											for(k = 0, l = m[dpc[i]].children_d.length; k < l; k++) {
-												m[m[dpc[i]].children_d[k]].state[ t ? 'selected' : 'checked' ] = true;
-											}
-											this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(m[dpc[i]].children_d);
-										}
-									}
-								}
-							}
-
-							if(s.indexOf('up') !== -1) {
-								// apply up
-								for(i = 0, j = p.children_d.length; i < j; i++) {
-									if(!m[p.children_d[i]].children.length) {
-										chd.push(m[p.children_d[i]].parent);
-									}
-								}
-								chd = $.vakata.array_unique(chd);
-								for(k = 0, l = chd.length; k < l; k++) {
-									p = m[chd[k]];
-									while(p && p.id !== $.jstree.root) {
-										c = 0;
-										for(i = 0, j = p.children.length; i < j; i++) {
-											c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
-										}
-										if(c === j) {
-											p.state[ t ? 'selected' : 'checked' ] = true;
-											this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
-											tmp = this.get_node(p, true);
-											if(tmp && tmp.length) {
-												tmp.children('.jstree-anchor').attr('aria-selected', true).addClass( t ? 'jstree-clicked' : 'jstree-checked');
-											}
-										}
-										else {
-											break;
-										}
-										p = this.get_node(p.parent);
-									}
-								}
-							}
-
-							this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected);
-						}.bind(this))
-					.on(this.settings.checkbox.tie_selection ? 'select_node.jstree' : 'check_node.jstree', function (e, data) {
-							var self = this,
-								obj = data.node,
-								m = this._model.data,
-								par = this.get_node(obj.parent),
-								i, j, c, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection,
-								sel = {}, cur = this._data[ t ? 'core' : 'checkbox' ].selected;
-
-							for (i = 0, j = cur.length; i < j; i++) {
-								sel[cur[i]] = true;
-							}
-
-							// apply down
-							if(s.indexOf('down') !== -1) {
-								//this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected.concat(obj.children_d));
-								var selectedIds = this._cascade_new_checked_state(obj.id, true);
-								var temp = obj.children_d.concat(obj.id);
-								for (i = 0, j = temp.length; i < j; i++) {
-									if (selectedIds.indexOf(temp[i]) > -1) {
-										sel[temp[i]] = true;
-									}
-									else {
-										delete sel[temp[i]];
-									}
-								}
-							}
-
-							// apply up
-							if(s.indexOf('up') !== -1) {
-								while(par && par.id !== $.jstree.root) {
-									c = 0;
-									for(i = 0, j = par.children.length; i < j; i++) {
-										c += m[par.children[i]].state[ t ? 'selected' : 'checked' ];
-									}
-									if(c === j) {
-										par.state[ t ? 'selected' : 'checked' ] = true;
-										sel[par.id] = true;
-										//this._data[ t ? 'core' : 'checkbox' ].selected.push(par.id);
-										tmp = this.get_node(par, true);
-										if(tmp && tmp.length) {
-											tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked');
-										}
-									}
-									else {
-										break;
-									}
-									par = this.get_node(par.parent);
-								}
-							}
-
-							cur = [];
-							for (i in sel) {
-								if (sel.hasOwnProperty(i)) {
-									cur.push(i);
-								}
-							}
-							this._data[ t ? 'core' : 'checkbox' ].selected = cur;
-						}.bind(this))
-					.on(this.settings.checkbox.tie_selection ? 'deselect_all.jstree' : 'uncheck_all.jstree', function (e, data) {
-							var obj = this.get_node($.jstree.root),
-								m = this._model.data,
-								i, j, tmp;
-							for(i = 0, j = obj.children_d.length; i < j; i++) {
-								tmp = m[obj.children_d[i]];
-								if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
-									tmp.original.state.undetermined = false;
-								}
-							}
-						}.bind(this))
-					.on(this.settings.checkbox.tie_selection ? 'deselect_node.jstree' : 'uncheck_node.jstree', function (e, data) {
-							var self = this,
-								obj = data.node,
-								dom = this.get_node(obj, true),
-								i, j, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection,
-								cur = this._data[ t ? 'core' : 'checkbox' ].selected, sel = {},
-								stillSelectedIds = [],
-								allIds = obj.children_d.concat(obj.id);
-
-							// apply down
-							if(s.indexOf('down') !== -1) {
-								var selectedIds = this._cascade_new_checked_state(obj.id, false);
-
-								cur = $.vakata.array_filter(cur, function(id) {
-									return allIds.indexOf(id) === -1 || selectedIds.indexOf(id) > -1;
-								});
-							}
-
-							// only apply up if cascade up is enabled and if this node is not selected
-							// (if all child nodes are disabled and cascade_to_disabled === false then this node will till be selected).
-							if(s.indexOf('up') !== -1 && cur.indexOf(obj.id) === -1) {
-								for(i = 0, j = obj.parents.length; i < j; i++) {
-									tmp = this._model.data[obj.parents[i]];
-									tmp.state[ t ? 'selected' : 'checked' ] = false;
-									if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
-										tmp.original.state.undetermined = false;
-									}
-									tmp = this.get_node(obj.parents[i], true);
-									if(tmp && tmp.length) {
-										tmp.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked');
-									}
-								}
-
-								cur = $.vakata.array_filter(cur, function(id) {
-									return obj.parents.indexOf(id) === -1;
-								});
-							}
-
-							this._data[ t ? 'core' : 'checkbox' ].selected = cur;
-						}.bind(this));
-			}
-			if(this.settings.checkbox.cascade.indexOf('up') !== -1) {
-				this.element
-					.on('delete_node.jstree', function (e, data) {
-							// apply up (whole handler)
-							var p = this.get_node(data.parent),
-								m = this._model.data,
-								i, j, c, tmp, t = this.settings.checkbox.tie_selection;
-							while(p && p.id !== $.jstree.root && !p.state[ t ? 'selected' : 'checked' ]) {
-								c = 0;
-								for(i = 0, j = p.children.length; i < j; i++) {
-									c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
-								}
-								if(j > 0 && c === j) {
-									p.state[ t ? 'selected' : 'checked' ] = true;
-									this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
-									tmp = this.get_node(p, true);
-									if(tmp && tmp.length) {
-										tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked');
-									}
-								}
-								else {
-									break;
-								}
-								p = this.get_node(p.parent);
-							}
-						}.bind(this))
-					.on('move_node.jstree', function (e, data) {
-							// apply up (whole handler)
-							var is_multi = data.is_multi,
-								old_par = data.old_parent,
-								new_par = this.get_node(data.parent),
-								m = this._model.data,
-								p, c, i, j, tmp, t = this.settings.checkbox.tie_selection;
-							if(!is_multi) {
-								p = this.get_node(old_par);
-								while(p && p.id !== $.jstree.root && !p.state[ t ? 'selected' : 'checked' ]) {
-									c = 0;
-									for(i = 0, j = p.children.length; i < j; i++) {
-										c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
-									}
-									if(j > 0 && c === j) {
-										p.state[ t ? 'selected' : 'checked' ] = true;
-										this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
-										tmp = this.get_node(p, true);
-										if(tmp && tmp.length) {
-											tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked');
-										}
-									}
-									else {
-										break;
-									}
-									p = this.get_node(p.parent);
-								}
-							}
-							p = new_par;
-							while(p && p.id !== $.jstree.root) {
-								c = 0;
-								for(i = 0, j = p.children.length; i < j; i++) {
-									c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
-								}
-								if(c === j) {
-									if(!p.state[ t ? 'selected' : 'checked' ]) {
-										p.state[ t ? 'selected' : 'checked' ] = true;
-										this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
-										tmp = this.get_node(p, true);
-										if(tmp && tmp.length) {
-											tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked');
-										}
-									}
-								}
-								else {
-									if(p.state[ t ? 'selected' : 'checked' ]) {
-										p.state[ t ? 'selected' : 'checked' ] = false;
-										this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_remove_item(this._data[ t ? 'core' : 'checkbox' ].selected, p.id);
-										tmp = this.get_node(p, true);
-										if(tmp && tmp.length) {
-											tmp.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked');
-										}
-									}
-									else {
-										break;
-									}
-								}
-								p = this.get_node(p.parent);
-							}
-						}.bind(this));
-			}
-		};
-		/**
-		 * get an array of all nodes whose state is "undetermined"
-		 * @name get_undetermined([full])
-		 * @param  {boolean} full: if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 * @plugin checkbox
-		 */
-		this.get_undetermined = function (full) {
-			if (this.settings.checkbox.cascade.indexOf('undetermined') === -1) {
-				return [];
-			}
-			var i, j, k, l, o = {}, m = this._model.data, t = this.settings.checkbox.tie_selection, s = this._data[ t ? 'core' : 'checkbox' ].selected, p = [], tt = this, r = [];
-			for(i = 0, j = s.length; i < j; i++) {
-				if(m[s[i]] && m[s[i]].parents) {
-					for(k = 0, l = m[s[i]].parents.length; k < l; k++) {
-						if(o[m[s[i]].parents[k]] !== undefined) {
-							break;
-						}
-						if(m[s[i]].parents[k] !== $.jstree.root) {
-							o[m[s[i]].parents[k]] = true;
-							p.push(m[s[i]].parents[k]);
-						}
-					}
-				}
-			}
-			// attempt for server side undetermined state
-			this.element.find('.jstree-closed').not(':has(.jstree-children)')
-				.each(function () {
-					var tmp = tt.get_node(this), tmp2;
-					
-					if(!tmp) { return; }
-					
-					if(!tmp.state.loaded) {
-						if(tmp.original && tmp.original.state && tmp.original.state.undetermined && tmp.original.state.undetermined === true) {
-							if(o[tmp.id] === undefined && tmp.id !== $.jstree.root) {
-								o[tmp.id] = true;
-								p.push(tmp.id);
-							}
-							for(k = 0, l = tmp.parents.length; k < l; k++) {
-								if(o[tmp.parents[k]] === undefined && tmp.parents[k] !== $.jstree.root) {
-									o[tmp.parents[k]] = true;
-									p.push(tmp.parents[k]);
-								}
-							}
-						}
-					}
-					else {
-						for(i = 0, j = tmp.children_d.length; i < j; i++) {
-							tmp2 = m[tmp.children_d[i]];
-							if(!tmp2.state.loaded && tmp2.original && tmp2.original.state && tmp2.original.state.undetermined && tmp2.original.state.undetermined === true) {
-								if(o[tmp2.id] === undefined && tmp2.id !== $.jstree.root) {
-									o[tmp2.id] = true;
-									p.push(tmp2.id);
-								}
-								for(k = 0, l = tmp2.parents.length; k < l; k++) {
-									if(o[tmp2.parents[k]] === undefined && tmp2.parents[k] !== $.jstree.root) {
-										o[tmp2.parents[k]] = true;
-										p.push(tmp2.parents[k]);
-									}
-								}
-							}
-						}
-					}
-				});
-			for (i = 0, j = p.length; i < j; i++) {
-				if(!m[p[i]].state[ t ? 'selected' : 'checked' ]) {
-					r.push(full ? m[p[i]] : p[i]);
-				}
-			}
-			return r;
-		};
-		/**
-		 * set the undetermined state where and if necessary. Used internally.
-		 * @private
-		 * @name _undetermined()
-		 * @plugin checkbox
-		 */
-		this._undetermined = function () {
-			if(this.element === null) { return; }
-			var p = this.get_undetermined(false), i, j, s;
-
-			this.element.find('.jstree-undetermined').removeClass('jstree-undetermined');
-			for (i = 0, j = p.length; i < j; i++) {
-				s = this.get_node(p[i], true);
-				if(s && s.length) {
-					s.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-undetermined');
-				}
-			}
-		};
-		this.redraw_node = function(obj, deep, is_callback, force_render) {
-			obj = parent.redraw_node.apply(this, arguments);
-			if(obj) {
-				var i, j, tmp = null, icon = null;
-				for(i = 0, j = obj.childNodes.length; i < j; i++) {
-					if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
-						tmp = obj.childNodes[i];
-						break;
-					}
-				}
-				if(tmp) {
-					if(!this.settings.checkbox.tie_selection && this._model.data[obj.id].state.checked) { tmp.className += ' jstree-checked'; }
-					icon = _i.cloneNode(false);
-					if(this._model.data[obj.id].state.checkbox_disabled) { icon.className += ' jstree-checkbox-disabled'; }
-					tmp.insertBefore(icon, tmp.childNodes[0]);
-				}
-			}
-			if(!is_callback && this.settings.checkbox.cascade.indexOf('undetermined') !== -1) {
-				if(this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); }
-				this._data.checkbox.uto = setTimeout(this._undetermined.bind(this), 50);
-			}
-			return obj;
-		};
-		/**
-		 * show the node checkbox icons
-		 * @name show_checkboxes()
-		 * @plugin checkbox
-		 */
-		this.show_checkboxes = function () { this._data.core.themes.checkboxes = true; this.get_container_ul().removeClass("jstree-no-checkboxes"); };
-		/**
-		 * hide the node checkbox icons
-		 * @name hide_checkboxes()
-		 * @plugin checkbox
-		 */
-		this.hide_checkboxes = function () { this._data.core.themes.checkboxes = false; this.get_container_ul().addClass("jstree-no-checkboxes"); };
-		/**
-		 * toggle the node icons
-		 * @name toggle_checkboxes()
-		 * @plugin checkbox
-		 */
-		this.toggle_checkboxes = function () { if(this._data.core.themes.checkboxes) { this.hide_checkboxes(); } else { this.show_checkboxes(); } };
-		/**
-		 * checks if a node is in an undetermined state
-		 * @name is_undetermined(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		this.is_undetermined = function (obj) {
-			obj = this.get_node(obj);
-			var s = this.settings.checkbox.cascade, i, j, t = this.settings.checkbox.tie_selection, d = this._data[ t ? 'core' : 'checkbox' ].selected, m = this._model.data;
-			if(!obj || obj.state[ t ? 'selected' : 'checked' ] === true || s.indexOf('undetermined') === -1 || (s.indexOf('down') === -1 && s.indexOf('up') === -1)) {
-				return false;
-			}
-			if(!obj.state.loaded && obj.original.state.undetermined === true) {
-				return true;
-			}
-			for(i = 0, j = obj.children_d.length; i < j; i++) {
-				if($.inArray(obj.children_d[i], d) !== -1 || (!m[obj.children_d[i]].state.loaded && m[obj.children_d[i]].original.state.undetermined)) {
-					return true;
-				}
-			}
-			return false;
-		};
-		/**
-		 * disable a node's checkbox
-		 * @name disable_checkbox(obj)
-		 * @param {mixed} obj an array can be used too
-		 * @trigger disable_checkbox.jstree
-		 * @plugin checkbox
-		 */
-		this.disable_checkbox = function (obj) {
-			var t1, t2, dom;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.disable_checkbox(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(!obj.state.checkbox_disabled) {
-				obj.state.checkbox_disabled = true;
-				if(dom && dom.length) {
-					dom.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-checkbox-disabled');
-				}
-				/**
-				 * triggered when an node's checkbox is disabled
-				 * @event
-				 * @name disable_checkbox.jstree
-				 * @param {Object} node
-				 * @plugin checkbox
-				 */
-				this.trigger('disable_checkbox', { 'node' : obj });
-			}
-		};
-		/**
-		 * enable a node's checkbox
-		 * @name enable_checkbox(obj)
-		 * @param {mixed} obj an array can be used too
-		 * @trigger enable_checkbox.jstree
-		 * @plugin checkbox
-		 */
-		this.enable_checkbox = function (obj) {
-			var t1, t2, dom;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.enable_checkbox(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(obj.state.checkbox_disabled) {
-				obj.state.checkbox_disabled = false;
-				if(dom && dom.length) {
-					dom.children('.jstree-anchor').children('.jstree-checkbox').removeClass('jstree-checkbox-disabled');
-				}
-				/**
-				 * triggered when an node's checkbox is enabled
-				 * @event
-				 * @name enable_checkbox.jstree
-				 * @param {Object} node
-				 * @plugin checkbox
-				 */
-				this.trigger('enable_checkbox', { 'node' : obj });
-			}
-		};
-
-		this.activate_node = function (obj, e) {
-			if($(e.target).hasClass('jstree-checkbox-disabled')) {
-				return false;
-			}
-			if(this.settings.checkbox.tie_selection && (this.settings.checkbox.whole_node || $(e.target).hasClass('jstree-checkbox'))) {
-				e.ctrlKey = true;
-			}
-			if(this.settings.checkbox.tie_selection || (!this.settings.checkbox.whole_node && !$(e.target).hasClass('jstree-checkbox'))) {
-				return parent.activate_node.call(this, obj, e);
-			}
-			if(this.is_disabled(obj)) {
-				return false;
-			}
-			if(this.is_checked(obj)) {
-				this.uncheck_node(obj, e);
-			}
-			else {
-				this.check_node(obj, e);
-			}
-			this.trigger('activate_node', { 'node' : this.get_node(obj) });
-		};
-		this.delete_node = function (obj) {
-			if(this.settings.checkbox.tie_selection || $.vakata.is_array(obj)) {
-				return parent.delete_node.call(this, obj);
-			}
-			var tmp, k, l, c = false;
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			tmp = obj.children_d.concat([]);
-			tmp.push(obj.id);
-			for(k = 0, l = tmp.length; k < l; k++) {
-				if(this._model.data[tmp[k]].state.checked) {
-					c = true;
-					break;
-				}
-			}
-			if (c) {
-				this._data.checkbox.selected = $.vakata.array_filter(this._data.checkbox.selected, function (v) {
-					return $.inArray(v, tmp) === -1;
-				});
-			}
-			return parent.delete_node.call(this, obj);
-		};
-
-		/**
-		 * Cascades checked state to a node and all its descendants. This function does NOT affect hidden and disabled nodes (or their descendants).
-		 * However if these unaffected nodes are already selected their ids will be included in the returned array.
-		 * @private
-		 * @name _cascade_new_checked_state(id, checkedState)
-		 * @param {string} id the node ID
-		 * @param {bool} checkedState should the nodes be checked or not
-		 * @returns {Array} Array of all node id's (in this tree branch) that are checked.
-		 */
-		this._cascade_new_checked_state = function (id, checkedState) {
-			var self = this;
-			var t = this.settings.checkbox.tie_selection;
-			var node = this._model.data[id];
-			var selectedNodeIds = [];
-			var selectedChildrenIds = [], i, j, selectedChildIds;
-
-			if (
-				(this.settings.checkbox.cascade_to_disabled || !node.state.disabled) &&
-				(this.settings.checkbox.cascade_to_hidden || !node.state.hidden)
-			) {
-				//First try and check/uncheck the children
-				if (node.children) {
-					for (i = 0, j = node.children.length; i < j; i++) {
-						var childId = node.children[i];
-						selectedChildIds = self._cascade_new_checked_state(childId, checkedState);
-						selectedNodeIds = selectedNodeIds.concat(selectedChildIds);
-						if (selectedChildIds.indexOf(childId) > -1) {
-							selectedChildrenIds.push(childId);
-						}
-					}
-				}
-
-				var dom = self.get_node(node, true);
-
-				//A node's state is undetermined if some but not all of it's children are checked/selected .
-				var undetermined = selectedChildrenIds.length > 0 && selectedChildrenIds.length < node.children.length;
-
-				if(node.original && node.original.state && node.original.state.undetermined) {
-					node.original.state.undetermined = undetermined;
-				}
-
-				//If a node is undetermined then remove selected class
-				if (undetermined) {
-					node.state[ t ? 'selected' : 'checked' ] = false;
-					dom.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked');
-				}
-				//Otherwise, if the checkedState === true (i.e. the node is being checked now) and all of the node's children are checked (if it has any children),
-				//check the node and style it correctly.
-				else if (checkedState && selectedChildrenIds.length === node.children.length) {
-					node.state[ t ? 'selected' : 'checked' ] = checkedState;
-					selectedNodeIds.push(node.id);
-
-					dom.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked');
-				}
-				else {
-					node.state[ t ? 'selected' : 'checked' ] = false;
-					dom.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked');
-				}
-			}
-			else {
-				selectedChildIds = this.get_checked_descendants(id);
-
-				if (node.state[ t ? 'selected' : 'checked' ]) {
-					selectedChildIds.push(node.id);
-				}
-
-				selectedNodeIds = selectedNodeIds.concat(selectedChildIds);
-			}
-
-			return selectedNodeIds;
-		};
-
-		/**
-		 * Gets ids of nodes selected in branch (of tree) specified by id (does not include the node specified by id)
-		 * @name get_checked_descendants(obj)
-		 * @param {string} id the node ID
-		 * @return {Array} array of IDs
-		 * @plugin checkbox
-		 */
-		this.get_checked_descendants = function (id) {
-			var self = this;
-			var t = self.settings.checkbox.tie_selection;
-			var node = self._model.data[id];
-
-			return $.vakata.array_filter(node.children_d, function(_id) {
-				return self._model.data[_id].state[ t ? 'selected' : 'checked' ];
-			});
-		};
-
-		/**
-		 * check a node (only if tie_selection in checkbox settings is false, otherwise select_node will be called internally)
-		 * @name check_node(obj)
-		 * @param {mixed} obj an array can be used to check multiple nodes
-		 * @trigger check_node.jstree
-		 * @plugin checkbox
-		 */
-		this.check_node = function (obj, e) {
-			if(this.settings.checkbox.tie_selection) { return this.select_node(obj, false, true, e); }
-			var dom, t1, t2, th;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.check_node(obj[t1], e);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(!obj.state.checked) {
-				obj.state.checked = true;
-				this._data.checkbox.selected.push(obj.id);
-				if(dom && dom.length) {
-					dom.children('.jstree-anchor').addClass('jstree-checked');
-				}
-				/**
-				 * triggered when an node is checked (only if tie_selection in checkbox settings is false)
-				 * @event
-				 * @name check_node.jstree
-				 * @param {Object} node
-				 * @param {Array} selected the current selection
-				 * @param {Object} event the event (if any) that triggered this check_node
-				 * @plugin checkbox
-				 */
-				this.trigger('check_node', { 'node' : obj, 'selected' : this._data.checkbox.selected, 'event' : e });
-			}
-		};
-		/**
-		 * uncheck a node (only if tie_selection in checkbox settings is false, otherwise deselect_node will be called internally)
-		 * @name uncheck_node(obj)
-		 * @param {mixed} obj an array can be used to uncheck multiple nodes
-		 * @trigger uncheck_node.jstree
-		 * @plugin checkbox
-		 */
-		this.uncheck_node = function (obj, e) {
-			if(this.settings.checkbox.tie_selection) { return this.deselect_node(obj, false, e); }
-			var t1, t2, dom;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.uncheck_node(obj[t1], e);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(obj.state.checked) {
-				obj.state.checked = false;
-				this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, obj.id);
-				if(dom.length) {
-					dom.children('.jstree-anchor').removeClass('jstree-checked');
-				}
-				/**
-				 * triggered when an node is unchecked (only if tie_selection in checkbox settings is false)
-				 * @event
-				 * @name uncheck_node.jstree
-				 * @param {Object} node
-				 * @param {Array} selected the current selection
-				 * @param {Object} event the event (if any) that triggered this uncheck_node
-				 * @plugin checkbox
-				 */
-				this.trigger('uncheck_node', { 'node' : obj, 'selected' : this._data.checkbox.selected, 'event' : e });
-			}
-		};
-		
-		/**
-		 * checks all nodes in the tree (only if tie_selection in checkbox settings is false, otherwise select_all will be called internally)
-		 * @name check_all()
-		 * @trigger check_all.jstree, changed.jstree
-		 * @plugin checkbox
-		 */
-		this.check_all = function () {
-			if(this.settings.checkbox.tie_selection) { return this.select_all(); }
-			var tmp = this._data.checkbox.selected.concat([]), i, j;
-			this._data.checkbox.selected = this._model.data[$.jstree.root].children_d.concat();
-			for(i = 0, j = this._data.checkbox.selected.length; i < j; i++) {
-				if(this._model.data[this._data.checkbox.selected[i]]) {
-					this._model.data[this._data.checkbox.selected[i]].state.checked = true;
-				}
-			}
-			this.redraw(true);
-			/**
-			 * triggered when all nodes are checked (only if tie_selection in checkbox settings is false)
-			 * @event
-			 * @name check_all.jstree
-			 * @param {Array} selected the current selection
-			 * @plugin checkbox
-			 */
-			this.trigger('check_all', { 'selected' : this._data.checkbox.selected });
-		};
-		/**
-		 * uncheck all checked nodes (only if tie_selection in checkbox settings is false, otherwise deselect_all will be called internally)
-		 * @name uncheck_all()
-		 * @trigger uncheck_all.jstree
-		 * @plugin checkbox
-		 */
-		this.uncheck_all = function () {
-			if(this.settings.checkbox.tie_selection) { return this.deselect_all(); }
-			var tmp = this._data.checkbox.selected.concat([]), i, j;
-			for(i = 0, j = this._data.checkbox.selected.length; i < j; i++) {
-				if(this._model.data[this._data.checkbox.selected[i]]) {
-					this._model.data[this._data.checkbox.selected[i]].state.checked = false;
-				}
-			}
-			this._data.checkbox.selected = [];
-			this.element.find('.jstree-checked').removeClass('jstree-checked');
-			/**
-			 * triggered when all nodes are unchecked (only if tie_selection in checkbox settings is false)
-			 * @event
-			 * @name uncheck_all.jstree
-			 * @param {Object} node the previous selection
-			 * @param {Array} selected the current selection
-			 * @plugin checkbox
-			 */
-			this.trigger('uncheck_all', { 'selected' : this._data.checkbox.selected, 'node' : tmp });
-		};
-		/**
-		 * checks if a node is checked (if tie_selection is on in the settings this function will return the same as is_selected)
-		 * @name is_checked(obj)
-		 * @param  {mixed}  obj
-		 * @return {Boolean}
-		 * @plugin checkbox
-		 */
-		this.is_checked = function (obj) {
-			if(this.settings.checkbox.tie_selection) { return this.is_selected(obj); }
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			return obj.state.checked;
-		};
-		/**
-		 * get an array of all checked nodes (if tie_selection is on in the settings this function will return the same as get_selected)
-		 * @name get_checked([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 * @plugin checkbox
-		 */
-		this.get_checked = function (full) {
-			if(this.settings.checkbox.tie_selection) { return this.get_selected(full); }
-			return full ? $.map(this._data.checkbox.selected, function (i) { return this.get_node(i); }.bind(this)) : this._data.checkbox.selected.slice();
-		};
-		/**
-		 * get an array of all top level checked nodes (ignoring children of checked nodes) (if tie_selection is on in the settings this function will return the same as get_top_selected)
-		 * @name get_top_checked([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 * @plugin checkbox
-		 */
-		this.get_top_checked = function (full) {
-			if(this.settings.checkbox.tie_selection) { return this.get_top_selected(full); }
-			var tmp = this.get_checked(true),
-				obj = {}, i, j, k, l;
-			for(i = 0, j = tmp.length; i < j; i++) {
-				obj[tmp[i].id] = tmp[i];
-			}
-			for(i = 0, j = tmp.length; i < j; i++) {
-				for(k = 0, l = tmp[i].children_d.length; k < l; k++) {
-					if(obj[tmp[i].children_d[k]]) {
-						delete obj[tmp[i].children_d[k]];
-					}
-				}
-			}
-			tmp = [];
-			for(i in obj) {
-				if(obj.hasOwnProperty(i)) {
-					tmp.push(i);
-				}
-			}
-			return full ? $.map(tmp, function (i) { return this.get_node(i); }.bind(this)) : tmp;
-		};
-		/**
-		 * get an array of all bottom level checked nodes (ignoring selected parents) (if tie_selection is on in the settings this function will return the same as get_bottom_selected)
-		 * @name get_bottom_checked([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 * @plugin checkbox
-		 */
-		this.get_bottom_checked = function (full) {
-			if(this.settings.checkbox.tie_selection) { return this.get_bottom_selected(full); }
-			var tmp = this.get_checked(true),
-				obj = [], i, j;
-			for(i = 0, j = tmp.length; i < j; i++) {
-				if(!tmp[i].children.length) {
-					obj.push(tmp[i].id);
-				}
-			}
-			return full ? $.map(obj, function (i) { return this.get_node(i); }.bind(this)) : obj;
-		};
-		this.load_node = function (obj, callback) {
-			var k, l, i, j, c, tmp;
-			if(!$.vakata.is_array(obj) && !this.settings.checkbox.tie_selection) {
-				tmp = this.get_node(obj);
-				if(tmp && tmp.state.loaded) {
-					for(k = 0, l = tmp.children_d.length; k < l; k++) {
-						if(this._model.data[tmp.children_d[k]].state.checked) {
-							c = true;
-							this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, tmp.children_d[k]);
-						}
-					}
-				}
-			}
-			return parent.load_node.apply(this, arguments);
-		};
-		this.get_state = function () {
-			var state = parent.get_state.apply(this, arguments);
-			if(this.settings.checkbox.tie_selection) { return state; }
-			state.checkbox = this._data.checkbox.selected.slice();
-			return state;
-		};
-		this.set_state = function (state, callback) {
-			var res = parent.set_state.apply(this, arguments);
-			if(res && state.checkbox) {
-				if(!this.settings.checkbox.tie_selection) {
-					this.uncheck_all();
-					var _this = this;
-					$.each(state.checkbox, function (i, v) {
-						_this.check_node(v);
-					});
-				}
-				delete state.checkbox;
-				this.set_state(state, callback);
-				return false;
-			}
-			return res;
-		};
-		this.refresh = function (skip_loading, forget_state) {
-			if(this.settings.checkbox.tie_selection) {
-				this._data.checkbox.selected = [];
-			}
-			return parent.refresh.apply(this, arguments);
-		};
-	};
-
-	// include the checkbox plugin by default
-	// $.jstree.defaults.plugins.push("checkbox");
-
-
-/**
- * ### Conditionalselect plugin
- *
- * This plugin allows defining a callback to allow or deny node selection by user input (activate node method).
- */
-
-	/**
-	 * a callback (function) which is invoked in the instance's scope and receives two arguments - the node and the event that triggered the `activate_node` call. Returning false prevents working with the node, returning true allows invoking activate_node. Defaults to returning `true`.
-	 * @name $.jstree.defaults.checkbox.visible
-	 * @plugin checkbox
-	 */
-	$.jstree.defaults.conditionalselect = function () { return true; };
-	$.jstree.plugins.conditionalselect = function (options, parent) {
-		// own function
-		this.activate_node = function (obj, e) {
-			if(this.settings.conditionalselect.call(this, this.get_node(obj), e)) {
-				return parent.activate_node.call(this, obj, e);
-			}
-		};
-	};
-
-
-/**
- * ### Contextmenu plugin
- *
- * Shows a context menu when a node is right-clicked.
- */
-
-	/**
-	 * stores all defaults for the contextmenu plugin
-	 * @name $.jstree.defaults.contextmenu
-	 * @plugin contextmenu
-	 */
-	$.jstree.defaults.contextmenu = {
-		/**
-		 * a boolean indicating if the node should be selected when the context menu is invoked on it. Defaults to `true`.
-		 * @name $.jstree.defaults.contextmenu.select_node
-		 * @plugin contextmenu
-		 */
-		select_node : true,
-		/**
-		 * a boolean indicating if the menu should be shown aligned with the node. Defaults to `true`, otherwise the mouse coordinates are used.
-		 * @name $.jstree.defaults.contextmenu.show_at_node
-		 * @plugin contextmenu
-		 */
-		show_at_node : true,
-		/**
-		 * an object of actions, or a function that accepts a node and a callback function and calls the callback function with an object of actions available for that node (you can also return the items too).
-		 *
-		 * Each action consists of a key (a unique name) and a value which is an object with the following properties (only label and action are required). Once a menu item is activated the `action` function will be invoked with an object containing the following keys: item - the contextmenu item definition as seen below, reference - the DOM node that was used (the tree node), element - the contextmenu DOM element, position - an object with x/y properties indicating the position of the menu.
-		 *
-		 * * `separator_before` - a boolean indicating if there should be a separator before this item
-		 * * `separator_after` - a boolean indicating if there should be a separator after this item
-		 * * `_disabled` - a boolean indicating if this action should be disabled
-		 * * `label` - a string - the name of the action (could be a function returning a string)
-		 * * `title` - a string - an optional tooltip for the item
-		 * * `action` - a function to be executed if this item is chosen, the function will receive 
-		 * * `icon` - a string, can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class
-		 * * `shortcut` - keyCode which will trigger the action if the menu is open (for example `113` for rename, which equals F2)
-		 * * `shortcut_label` - shortcut label (like for example `F2` for rename)
-		 * * `submenu` - an object with the same structure as $.jstree.defaults.contextmenu.items which can be used to create a submenu - each key will be rendered as a separate option in a submenu that will appear once the current item is hovered
-		 *
-		 * @name $.jstree.defaults.contextmenu.items
-		 * @plugin contextmenu
-		 */
-		items : function (o, cb) { // Could be an object directly
-			return {
-				"create" : {
-					"separator_before"	: false,
-					"separator_after"	: true,
-					"_disabled"			: false, //(this.check("create_node", data.reference, {}, "last")),
-					"label"				: "Create",
-					"action"			: function (data) {
-						var inst = $.jstree.reference(data.reference),
-							obj = inst.get_node(data.reference);
-						inst.create_node(obj, {}, "last", function (new_node) {
-							try {
-								inst.edit(new_node);
-							} catch (ex) {
-								setTimeout(function () { inst.edit(new_node); },0);
-							}
-						});
-					}
-				},
-				"rename" : {
-					"separator_before"	: false,
-					"separator_after"	: false,
-					"_disabled"			: false, //(this.check("rename_node", data.reference, this.get_parent(data.reference), "")),
-					"label"				: "Rename",
-					/*!
-					"shortcut"			: 113,
-					"shortcut_label"	: 'F2',
-					"icon"				: "glyphicon glyphicon-leaf",
-					*/
-					"action"			: function (data) {
-						var inst = $.jstree.reference(data.reference),
-							obj = inst.get_node(data.reference);
-						inst.edit(obj);
-					}
-				},
-				"remove" : {
-					"separator_before"	: false,
-					"icon"				: false,
-					"separator_after"	: false,
-					"_disabled"			: false, //(this.check("delete_node", data.reference, this.get_parent(data.reference), "")),
-					"label"				: "Delete",
-					"action"			: function (data) {
-						var inst = $.jstree.reference(data.reference),
-							obj = inst.get_node(data.reference);
-						if(inst.is_selected(obj)) {
-							inst.delete_node(inst.get_selected());
-						}
-						else {
-							inst.delete_node(obj);
-						}
-					}
-				},
-				"ccp" : {
-					"separator_before"	: true,
-					"icon"				: false,
-					"separator_after"	: false,
-					"label"				: "Edit",
-					"action"			: false,
-					"submenu" : {
-						"cut" : {
-							"separator_before"	: false,
-							"separator_after"	: false,
-							"label"				: "Cut",
-							"action"			: function (data) {
-								var inst = $.jstree.reference(data.reference),
-									obj = inst.get_node(data.reference);
-								if(inst.is_selected(obj)) {
-									inst.cut(inst.get_top_selected());
-								}
-								else {
-									inst.cut(obj);
-								}
-							}
-						},
-						"copy" : {
-							"separator_before"	: false,
-							"icon"				: false,
-							"separator_after"	: false,
-							"label"				: "Copy",
-							"action"			: function (data) {
-								var inst = $.jstree.reference(data.reference),
-									obj = inst.get_node(data.reference);
-								if(inst.is_selected(obj)) {
-									inst.copy(inst.get_top_selected());
-								}
-								else {
-									inst.copy(obj);
-								}
-							}
-						},
-						"paste" : {
-							"separator_before"	: false,
-							"icon"				: false,
-							"_disabled"			: function (data) {
-								return !$.jstree.reference(data.reference).can_paste();
-							},
-							"separator_after"	: false,
-							"label"				: "Paste",
-							"action"			: function (data) {
-								var inst = $.jstree.reference(data.reference),
-									obj = inst.get_node(data.reference);
-								inst.paste(obj);
-							}
-						}
-					}
-				}
-			};
-		}
-	};
-
-	$.jstree.plugins.contextmenu = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-
-			var last_ts = 0, cto = null, ex, ey;
-			this.element
-				.on("init.jstree loading.jstree ready.jstree", function () {
-						this.get_container_ul().addClass('jstree-contextmenu');
-					}.bind(this))
-				.on("contextmenu.jstree", ".jstree-anchor", function (e, data) {
-						if (e.target.tagName.toLowerCase() === 'input') {
-							return;
-						}
-						e.preventDefault();
-						last_ts = e.ctrlKey ? +new Date() : 0;
-						if(data || cto) {
-							last_ts = (+new Date()) + 10000;
-						}
-						if(cto) {
-							clearTimeout(cto);
-						}
-						if(!this.is_loading(e.currentTarget)) {
-							this.show_contextmenu(e.currentTarget, e.pageX, e.pageY, e);
-						}
-					}.bind(this))
-				.on("click.jstree", ".jstree-anchor", function (e) {
-						if(this._data.contextmenu.visible && (!last_ts || (+new Date()) - last_ts > 250)) { // work around safari & macOS ctrl+click
-							$.vakata.context.hide();
-						}
-						last_ts = 0;
-					}.bind(this))
-				.on("touchstart.jstree", ".jstree-anchor", function (e) {
-						if(!e.originalEvent || !e.originalEvent.changedTouches || !e.originalEvent.changedTouches[0]) {
-							return;
-						}
-						ex = e.originalEvent.changedTouches[0].clientX;
-						ey = e.originalEvent.changedTouches[0].clientY;
-						cto = setTimeout(function () {
-							$(e.currentTarget).trigger('contextmenu', true);
-						}, 750);
-					})
-				.on('touchmove.vakata.jstree', function (e) {
-						if(cto && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0] && (Math.abs(ex - e.originalEvent.changedTouches[0].clientX) > 10 || Math.abs(ey - e.originalEvent.changedTouches[0].clientY) > 10)) {
-							clearTimeout(cto);
-							$.vakata.context.hide();
-						}
-					})
-				.on('touchend.vakata.jstree', function (e) {
-						if(cto) {
-							clearTimeout(cto);
-						}
-					});
-
-			/*!
-			if(!('oncontextmenu' in document.body) && ('ontouchstart' in document.body)) {
-				var el = null, tm = null;
-				this.element
-					.on("touchstart", ".jstree-anchor", function (e) {
-						el = e.currentTarget;
-						tm = +new Date();
-						$(document).one("touchend", function (e) {
-							e.target = document.elementFromPoint(e.originalEvent.targetTouches[0].pageX - window.pageXOffset, e.originalEvent.targetTouches[0].pageY - window.pageYOffset);
-							e.currentTarget = e.target;
-							tm = ((+(new Date())) - tm);
-							if(e.target === el && tm > 600 && tm < 1000) {
-								e.preventDefault();
-								$(el).trigger('contextmenu', e);
-							}
-							el = null;
-							tm = null;
-						});
-					});
-			}
-			*/
-			$(document).on("context_hide.vakata.jstree", function (e, data) {
-				this._data.contextmenu.visible = false;
-				$(data.reference).removeClass('jstree-context');
-			}.bind(this));
-		};
-		this.teardown = function () {
-			if(this._data.contextmenu.visible) {
-				$.vakata.context.hide();
-			}
-			$(document).off("context_hide.vakata.jstree");
-			parent.teardown.call(this);
-		};
-
-		/**
-		 * prepare and show the context menu for a node
-		 * @name show_contextmenu(obj [, x, y])
-		 * @param {mixed} obj the node
-		 * @param {Number} x the x-coordinate relative to the document to show the menu at
-		 * @param {Number} y the y-coordinate relative to the document to show the menu at
-		 * @param {Object} e the event if available that triggered the contextmenu
-		 * @plugin contextmenu
-		 * @trigger show_contextmenu.jstree
-		 */
-		this.show_contextmenu = function (obj, x, y, e) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			var s = this.settings.contextmenu,
-				d = this.get_node(obj, true),
-				a = d.children(".jstree-anchor"),
-				o = false,
-				i = false;
-			if(s.show_at_node || x === undefined || y === undefined) {
-				o = a.offset();
-				x = o.left;
-				y = o.top + this._data.core.li_height;
-			}
-			if(this.settings.contextmenu.select_node && !this.is_selected(obj)) {
-				this.activate_node(obj, e);
-			}
-
-			i = s.items;
-			if($.vakata.is_function(i)) {
-				i = i.call(this, obj, function (i) {
-					this._show_contextmenu(obj, x, y, i);
-				}.bind(this));
-			}
-			if($.isPlainObject(i)) {
-				this._show_contextmenu(obj, x, y, i);
-			}
-		};
-		/**
-		 * show the prepared context menu for a node
-		 * @name _show_contextmenu(obj, x, y, i)
-		 * @param {mixed} obj the node
-		 * @param {Number} x the x-coordinate relative to the document to show the menu at
-		 * @param {Number} y the y-coordinate relative to the document to show the menu at
-		 * @param {Number} i the object of items to show
-		 * @plugin contextmenu
-		 * @trigger show_contextmenu.jstree
-		 * @private
-		 */
-		this._show_contextmenu = function (obj, x, y, i) {
-			var d = this.get_node(obj, true),
-				a = d.children(".jstree-anchor");
-			$(document).one("context_show.vakata.jstree", function (e, data) {
-				var cls = 'jstree-contextmenu jstree-' + this.get_theme() + '-contextmenu';
-				$(data.element).addClass(cls);
-				a.addClass('jstree-context');
-			}.bind(this));
-			this._data.contextmenu.visible = true;
-			$.vakata.context.show(a, { 'x' : x, 'y' : y }, i);
-			/**
-			 * triggered when the contextmenu is shown for a node
-			 * @event
-			 * @name show_contextmenu.jstree
-			 * @param {Object} node the node
-			 * @param {Number} x the x-coordinate of the menu relative to the document
-			 * @param {Number} y the y-coordinate of the menu relative to the document
-			 * @plugin contextmenu
-			 */
-			this.trigger('show_contextmenu', { "node" : obj, "x" : x, "y" : y });
-		};
-	};
-
-	// contextmenu helper
-	(function ($) {
-		var right_to_left = false,
-			vakata_context = {
-				element		: false,
-				reference	: false,
-				position_x	: 0,
-				position_y	: 0,
-				items		: [],
-				html		: "",
-				is_visible	: false
-			};
-
-		$.vakata.context = {
-			settings : {
-				hide_onmouseleave	: 0,
-				icons				: true
-			},
-			_trigger : function (event_name) {
-				$(document).triggerHandler("context_" + event_name + ".vakata", {
-					"reference"	: vakata_context.reference,
-					"element"	: vakata_context.element,
-					"position"	: {
-						"x" : vakata_context.position_x,
-						"y" : vakata_context.position_y
-					}
-				});
-			},
-			_execute : function (i) {
-				i = vakata_context.items[i];
-				return i && (!i._disabled || ($.vakata.is_function(i._disabled) && !i._disabled({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }))) && i.action ? i.action.call(null, {
-							"item"		: i,
-							"reference"	: vakata_context.reference,
-							"element"	: vakata_context.element,
-							"position"	: {
-								"x" : vakata_context.position_x,
-								"y" : vakata_context.position_y
-							}
-						}) : false;
-			},
-			_parse : function (o, is_callback) {
-				if(!o) { return false; }
-				if(!is_callback) {
-					vakata_context.html		= "";
-					vakata_context.items	= [];
-				}
-				var str = "",
-					sep = false,
-					tmp;
-
-				if(is_callback) { str += "<"+"ul>"; }
-				$.each(o, function (i, val) {
-					if(!val) { return true; }
-					vakata_context.items.push(val);
-					if(!sep && val.separator_before) {
-						str += "<"+"li class='vakata-context-separator'><"+"a href='#' " + ($.vakata.context.settings.icons ? '' : 'class="vakata-context-no-icons"') + ">&#160;<"+"/a><"+"/li>";
-					}
-					sep = false;
-					str += "<"+"li class='" + (val._class || "") + (val._disabled === true || ($.vakata.is_function(val._disabled) && val._disabled({ "item" : val, "reference" : vakata_context.reference, "element" : vakata_context.element })) ? " vakata-contextmenu-disabled " : "") + "' "+(val.shortcut?" data-shortcut='"+val.shortcut+"' ":'')+">";
-					str += "<"+"a href='#' rel='" + (vakata_context.items.length - 1) + "' " + (val.title ? "title='" + val.title + "'" : "") + ">";
-					if($.vakata.context.settings.icons) {
-						str += "<"+"i ";
-						if(val.icon) {
-							if(val.icon.indexOf("/") !== -1 || val.icon.indexOf(".") !== -1) { str += " style='background:url(\"" + val.icon + "\") center center no-repeat' "; }
-							else { str += " class='" + val.icon + "' "; }
-						}
-						str += "><"+"/i><"+"span class='vakata-contextmenu-sep'>&#160;<"+"/span>";
-					}
-					str += ($.vakata.is_function(val.label) ? val.label({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }) : val.label) + (val.shortcut?' <span class="vakata-contextmenu-shortcut vakata-contextmenu-shortcut-'+val.shortcut+'">'+ (val.shortcut_label || '') +'</span>':'') + "<"+"/a>";
-					if(val.submenu) {
-						tmp = $.vakata.context._parse(val.submenu, true);
-						if(tmp) { str += tmp; }
-					}
-					str += "<"+"/li>";
-					if(val.separator_after) {
-						str += "<"+"li class='vakata-context-separator'><"+"a href='#' " + ($.vakata.context.settings.icons ? '' : 'class="vakata-context-no-icons"') + ">&#160;<"+"/a><"+"/li>";
-						sep = true;
-					}
-				});
-				str  = str.replace(/<li class\='vakata-context-separator'\><\/li\>$/,"");
-				if(is_callback) { str += "</ul>"; }
-				/**
-				 * triggered on the document when the contextmenu is parsed (HTML is built)
-				 * @event
-				 * @plugin contextmenu
-				 * @name context_parse.vakata
-				 * @param {jQuery} reference the element that was right clicked
-				 * @param {jQuery} element the DOM element of the menu itself
-				 * @param {Object} position the x & y coordinates of the menu
-				 */
-				if(!is_callback) { vakata_context.html = str; $.vakata.context._trigger("parse"); }
-				return str.length > 10 ? str : false;
-			},
-			_show_submenu : function (o) {
-				o = $(o);
-				if(!o.length || !o.children("ul").length) { return; }
-				var e = o.children("ul"),
-					xl = o.offset().left,
-					x = xl + o.outerWidth(),
-					y = o.offset().top,
-					w = e.width(),
-					h = e.height(),
-					dw = $(window).width() + $(window).scrollLeft(),
-					dh = $(window).height() + $(window).scrollTop();
-				// може да се спести е една проверка - дали няма някой от класовете вече нагоре
-				if(right_to_left) {
-					o[x - (w + 10 + o.outerWidth()) < 0 ? "addClass" : "removeClass"]("vakata-context-left");
-				}
-				else {
-					o[x + w > dw  && xl > dw - x ? "addClass" : "removeClass"]("vakata-context-right");
-				}
-				if(y + h + 10 > dh) {
-					e.css("bottom","-1px");
-				}
-
-				//if does not fit - stick it to the side
-				if (o.hasClass('vakata-context-right')) {
-					if (xl < w) {
-						e.css("margin-right", xl - w);
-					}
-				} else {
-					if (dw - x < w) {
-						e.css("margin-left", dw - x - w);
-					}
-				}
-
-				e.show();
-			},
-			show : function (reference, position, data) {
-				var o, e, x, y, w, h, dw, dh, cond = true;
-				if(vakata_context.element && vakata_context.element.length) {
-					vakata_context.element.width('');
-				}
-				switch(cond) {
-					case (!position && !reference):
-						return false;
-					case (!!position && !!reference):
-						vakata_context.reference	= reference;
-						vakata_context.position_x	= position.x;
-						vakata_context.position_y	= position.y;
-						break;
-					case (!position && !!reference):
-						vakata_context.reference	= reference;
-						o = reference.offset();
-						vakata_context.position_x	= o.left + reference.outerHeight();
-						vakata_context.position_y	= o.top;
-						break;
-					case (!!position && !reference):
-						vakata_context.position_x	= position.x;
-						vakata_context.position_y	= position.y;
-						break;
-				}
-				if(!!reference && !data && $(reference).data('vakata_contextmenu')) {
-					data = $(reference).data('vakata_contextmenu');
-				}
-				if($.vakata.context._parse(data)) {
-					vakata_context.element.html(vakata_context.html);
-				}
-				if(vakata_context.items.length) {
-					vakata_context.element.appendTo(document.body);
-					e = vakata_context.element;
-					x = vakata_context.position_x;
-					y = vakata_context.position_y;
-					w = e.width();
-					h = e.height();
-					dw = $(window).width() + $(window).scrollLeft();
-					dh = $(window).height() + $(window).scrollTop();
-					if(right_to_left) {
-						x -= (e.outerWidth() - $(reference).outerWidth());
-						if(x < $(window).scrollLeft() + 20) {
-							x = $(window).scrollLeft() + 20;
-						}
-					}
-					if(x + w + 20 > dw) {
-						x = dw - (w + 20);
-					}
-					if(y + h + 20 > dh) {
-						y = dh - (h + 20);
-					}
-
-					vakata_context.element
-						.css({ "left" : x, "top" : y })
-						.show()
-						.find('a').first().trigger('focus').parent().addClass("vakata-context-hover");
-					vakata_context.is_visible = true;
-					/**
-					 * triggered on the document when the contextmenu is shown
-					 * @event
-					 * @plugin contextmenu
-					 * @name context_show.vakata
-					 * @param {jQuery} reference the element that was right clicked
-					 * @param {jQuery} element the DOM element of the menu itself
-					 * @param {Object} position the x & y coordinates of the menu
-					 */
-					$.vakata.context._trigger("show");
-				}
-			},
-			hide : function () {
-				if(vakata_context.is_visible) {
-					vakata_context.element.hide().find("ul").hide().end().find(':focus').trigger('blur').end().detach();
-					vakata_context.is_visible = false;
-					/**
-					 * triggered on the document when the contextmenu is hidden
-					 * @event
-					 * @plugin contextmenu
-					 * @name context_hide.vakata
-					 * @param {jQuery} reference the element that was right clicked
-					 * @param {jQuery} element the DOM element of the menu itself
-					 * @param {Object} position the x & y coordinates of the menu
-					 */
-					$.vakata.context._trigger("hide");
-				}
-			}
-		};
-		$(function () {
-			right_to_left = $(document.body).css("direction") === "rtl";
-			var to = false;
-
-			vakata_context.element = $("<ul class='vakata-context'></ul>");
-			vakata_context.element
-				.on("mouseenter", "li", function (e) {
-					e.stopImmediatePropagation();
-
-					if($.contains(this, e.relatedTarget)) {
-						// премахнато заради delegate mouseleave по-долу
-						// $(this).find(".vakata-context-hover").removeClass("vakata-context-hover");
-						return;
-					}
-
-					if(to) { clearTimeout(to); }
-					vakata_context.element.find(".vakata-context-hover").removeClass("vakata-context-hover").end();
-
-					$(this)
-						.siblings().find("ul").hide().end().end()
-						.parentsUntil(".vakata-context", "li").addBack().addClass("vakata-context-hover");
-					$.vakata.context._show_submenu(this);
-				})
-				// тестово - дали не натоварва?
-				.on("mouseleave", "li", function (e) {
-					if($.contains(this, e.relatedTarget)) { return; }
-					$(this).find(".vakata-context-hover").addBack().removeClass("vakata-context-hover");
-				})
-				.on("mouseleave", function (e) {
-					$(this).find(".vakata-context-hover").removeClass("vakata-context-hover");
-					if($.vakata.context.settings.hide_onmouseleave) {
-						to = setTimeout(
-							(function (t) {
-								return function () { $.vakata.context.hide(); };
-							}(this)), $.vakata.context.settings.hide_onmouseleave);
-					}
-				})
-				.on("click", "a", function (e) {
-					e.preventDefault();
-				//})
-				//.on("mouseup", "a", function (e) {
-					if(!$(this).trigger('blur').parent().hasClass("vakata-context-disabled") && $.vakata.context._execute($(this).attr("rel")) !== false) {
-						$.vakata.context.hide();
-					}
-				})
-				.on('keydown', 'a', function (e) {
-						var o = null;
-						switch(e.which) {
-							case 13:
-							case 32:
-								e.type = "click";
-								e.preventDefault();
-								$(e.currentTarget).trigger(e);
-								break;
-							case 37:
-								if(vakata_context.is_visible) {
-									vakata_context.element.find(".vakata-context-hover").last().closest("li").first().find("ul").hide().find(".vakata-context-hover").removeClass("vakata-context-hover").end().end().children('a').trigger('focus');
-									e.stopImmediatePropagation();
-									e.preventDefault();
-								}
-								break;
-							case 38:
-								if(vakata_context.is_visible) {
-									o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").prevAll("li:not(.vakata-context-separator)").first();
-									if(!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").last(); }
-									o.addClass("vakata-context-hover").children('a').trigger('focus');
-									e.stopImmediatePropagation();
-									e.preventDefault();
-								}
-								break;
-							case 39:
-								if(vakata_context.is_visible) {
-									vakata_context.element.find(".vakata-context-hover").last().children("ul").show().children("li:not(.vakata-context-separator)").removeClass("vakata-context-hover").first().addClass("vakata-context-hover").children('a').trigger('focus');
-									e.stopImmediatePropagation();
-									e.preventDefault();
-								}
-								break;
-							case 40:
-								if(vakata_context.is_visible) {
-									o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").nextAll("li:not(.vakata-context-separator)").first();
-									if(!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").first(); }
-									o.addClass("vakata-context-hover").children('a').trigger('focus');
-									e.stopImmediatePropagation();
-									e.preventDefault();
-								}
-								break;
-							case 27:
-								$.vakata.context.hide();
-								e.preventDefault();
-								break;
-							default:
-								//console.log(e.which);
-								break;
-						}
-					})
-				.on('keydown', function (e) {
-					e.preventDefault();
-					var a = vakata_context.element.find('.vakata-contextmenu-shortcut-' + e.which).parent();
-					if(a.parent().not('.vakata-context-disabled')) {
-						a.trigger('click');
-					}
-				});
-
-			$(document)
-				.on("mousedown.vakata.jstree", function (e) {
-					if(vakata_context.is_visible && vakata_context.element[0] !== e.target  && !$.contains(vakata_context.element[0], e.target)) {
-						$.vakata.context.hide();
-					}
-				})
-				.on("context_show.vakata.jstree", function (e, data) {
-					vakata_context.element.find("li:has(ul)").children("a").addClass("vakata-context-parent");
-					if(right_to_left) {
-						vakata_context.element.addClass("vakata-context-rtl").css("direction", "rtl");
-					}
-					// also apply a RTL class?
-					vakata_context.element.find("ul").hide().end();
-				});
-		});
-	}($));
-	// $.jstree.defaults.plugins.push("contextmenu");
-
-
-/**
- * ### Drag'n'drop plugin
- *
- * Enables dragging and dropping of nodes in the tree, resulting in a move or copy operations.
- */
-
-	/**
-	 * stores all defaults for the drag'n'drop plugin
-	 * @name $.jstree.defaults.dnd
-	 * @plugin dnd
-	 */
-	$.jstree.defaults.dnd = {
-		/**
-		 * a boolean indicating if a copy should be possible while dragging (by pressint the meta key or Ctrl). Defaults to `true`.
-		 * @name $.jstree.defaults.dnd.copy
-		 * @plugin dnd
-		 */
-		copy : true,
-		/**
-		 * a number indicating how long a node should remain hovered while dragging to be opened. Defaults to `500`.
-		 * @name $.jstree.defaults.dnd.open_timeout
-		 * @plugin dnd
-		 */
-		open_timeout : 500,
-		/**
-		 * a function invoked each time a node is about to be dragged, invoked in the tree's scope and receives the nodes about to be dragged as an argument (array) and the event that started the drag - return `false` to prevent dragging
-		 * @name $.jstree.defaults.dnd.is_draggable
-		 * @plugin dnd
-		 */
-		is_draggable : true,
-		/**
-		 * a boolean indicating if checks should constantly be made while the user is dragging the node (as opposed to checking only on drop), default is `true`
-		 * @name $.jstree.defaults.dnd.check_while_dragging
-		 * @plugin dnd
-		 */
-		check_while_dragging : true,
-		/**
-		 * a boolean indicating if nodes from this tree should only be copied with dnd (as opposed to moved), default is `false`
-		 * @name $.jstree.defaults.dnd.always_copy
-		 * @plugin dnd
-		 */
-		always_copy : false,
-		/**
-		 * when dropping a node "inside", this setting indicates the position the node should go to - it can be an integer or a string: "first" (same as 0) or "last", default is `0`
-		 * @name $.jstree.defaults.dnd.inside_pos
-		 * @plugin dnd
-		 */
-		inside_pos : 0,
-		/**
-		 * when starting the drag on a node that is selected this setting controls if all selected nodes are dragged or only the single node, default is `true`, which means all selected nodes are dragged when the drag is started on a selected node
-		 * @name $.jstree.defaults.dnd.drag_selection
-		 * @plugin dnd
-		 */
-		drag_selection : true,
-		/**
-		 * controls whether dnd works on touch devices. If left as boolean true dnd will work the same as in desktop browsers, which in some cases may impair scrolling. If set to boolean false dnd will not work on touch devices. There is a special third option - string "selected" which means only selected nodes can be dragged on touch devices.
-		 * @name $.jstree.defaults.dnd.touch
-		 * @plugin dnd
-		 */
-		touch : true,
-		/**
-		 * controls whether items can be dropped anywhere on the node, not just on the anchor, by default only the node anchor is a valid drop target. Works best with the wholerow plugin. If enabled on mobile depending on the interface it might be hard for the user to cancel the drop, since the whole tree container will be a valid drop target.
-		 * @name $.jstree.defaults.dnd.large_drop_target
-		 * @plugin dnd
-		 */
-		large_drop_target : false,
-		/**
-		 * controls whether a drag can be initiated from any part of the node and not just the text/icon part, works best with the wholerow plugin. Keep in mind it can cause problems with tree scrolling on mobile depending on the interface - in that case set the touch option to "selected".
-		 * @name $.jstree.defaults.dnd.large_drag_target
-		 * @plugin dnd
-		 */
-		large_drag_target : false,
-		/**
-		 * controls whether use HTML5 dnd api instead of classical. That will allow better integration of dnd events with other HTML5 controls.
-		 * @reference http://caniuse.com/#feat=dragndrop
-		 * @name $.jstree.defaults.dnd.use_html5
-		 * @plugin dnd
-		 */
-		use_html5: false,
-		/**
-		 * controls whether items can be dropped anywhere on the tree.
-		 * @name $.jstree.defaults.dnd.blank_space_drop
-		 * @plugin dnd
-		 */
-		blank_space_drop: false
-	};
-	var drg, elm;
-	// TODO: now check works by checking for each node individually, how about max_children, unique, etc?
-	$.jstree.plugins.dnd = function (options, parent) {
-		this.init = function (el, options) {
-			parent.init.call(this, el, options);
-			this.settings.dnd.use_html5 = this.settings.dnd.use_html5 && ('draggable' in document.createElement('span'));
-		};
-		this.bind = function () {
-			parent.bind.call(this);
-
-			this.element
-				.on(this.settings.dnd.use_html5 ? 'dragstart.jstree' : 'mousedown.jstree touchstart.jstree', this.settings.dnd.large_drag_target ? '.jstree-node' : '.jstree-anchor', function (e) {
-						if(this.settings.dnd.large_drag_target && $(e.target).closest('.jstree-node')[0] !== e.currentTarget) {
-							return true;
-						}
-						if(e.type === "touchstart" && (!this.settings.dnd.touch || (this.settings.dnd.touch === 'selected' && !$(e.currentTarget).closest('.jstree-node').children('.jstree-anchor').hasClass('jstree-clicked')))) {
-							return true;
-						}
-						var obj = this.get_node(e.target),
-							mlt = this.is_selected(obj) && this.settings.dnd.drag_selection ? this.get_top_selected().length : 1,
-							txt = (mlt > 1 ? mlt + ' ' + this.get_string('nodes') : this.get_text(e.currentTarget));
-						if(this.settings.core.force_text) {
-							txt = $.vakata.html.escape(txt);
-						}
-						if(obj && (obj.id || obj.id === 0) && obj.id !== $.jstree.root && (e.which === 1 || e.type === "touchstart" || e.type === "dragstart") &&
-							(this.settings.dnd.is_draggable === true || ($.vakata.is_function(this.settings.dnd.is_draggable) && this.settings.dnd.is_draggable.call(this, (mlt > 1 ? this.get_top_selected(true) : [obj]), e)))
-						) {
-							drg = { 'jstree' : true, 'origin' : this, 'obj' : this.get_node(obj,true), 'nodes' : mlt > 1 ? this.get_top_selected() : [obj.id] };
-							elm = e.currentTarget;
-							if (this.settings.dnd.use_html5) {
-								$.vakata.dnd._trigger('start', e, { 'helper': $(), 'element': elm, 'data': drg });
-							} else {
-								this.element.trigger('mousedown.jstree');
-								return $.vakata.dnd.start(e, drg, '<div id="jstree-dnd" class="jstree-' + this.get_theme() + ' jstree-' + this.get_theme() + '-' + this.get_theme_variant() + ' ' + ( this.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ) + '"><i class="jstree-icon jstree-er"></i>' + txt + '<ins class="jstree-copy">+</ins></div>');
-							}
-						}
-					}.bind(this));
-			if (this.settings.dnd.use_html5) {
-				this.element
-					.on('dragover.jstree', function (e) {
-							e.preventDefault();
-							$.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg });
-							return false;
-						})
-					//.on('dragenter.jstree', this.settings.dnd.large_drop_target ? '.jstree-node' : '.jstree-anchor', $.proxy(function (e) {
-					//		e.preventDefault();
-					//		$.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg });
-					//		return false;
-					//	}, this))
-					.on('drop.jstree', function (e) {
-							e.preventDefault();
-							$.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg });
-							return false;
-						}.bind(this));
-			}
-		};
-		this.redraw_node = function(obj, deep, callback, force_render) {
-			obj = parent.redraw_node.apply(this, arguments);
-			if (obj && this.settings.dnd.use_html5) {
-				if (this.settings.dnd.large_drag_target) {
-					obj.setAttribute('draggable', true);
-				} else {
-					var i, j, tmp = null;
-					for(i = 0, j = obj.childNodes.length; i < j; i++) {
-						if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
-							tmp = obj.childNodes[i];
-							break;
-						}
-					}
-					if(tmp) {
-						tmp.setAttribute('draggable', true);
-					}
-				}
-			}
-			return obj;
-		};
-	};
-
-	$(function() {
-		// bind only once for all instances
-		var lastmv = false,
-			laster = false,
-			lastev = false,
-			opento = false,
-			marker = $('<div id="jstree-marker">&#160;</div>').hide(); //.appendTo('body');
-
-		$(document)
-			.on('dragover.vakata.jstree', function (e) {
-				if (elm) {
-					$.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg });
-				}
-			})
-			.on('drop.vakata.jstree', function (e) {
-				if (elm) {
-					$.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg });
-					elm = null;
-					drg = null;
-				}
-			})
-			.on('dnd_start.vakata.jstree', function (e, data) {
-				lastmv = false;
-				lastev = false;
-				if(!data || !data.data || !data.data.jstree) { return; }
-				marker.appendTo(document.body); //.show();
-			})
-			.on('dnd_move.vakata.jstree', function (e, data) {
-				var isDifferentNode = data.event.target !== lastev.target;
-				if(opento) {
-					if (!data.event || data.event.type !== 'dragover' || isDifferentNode) {
-						clearTimeout(opento);
-					}
-				}
-				if(!data || !data.data || !data.data.jstree) { return; }
-
-				// if we are hovering the marker image do nothing (can happen on "inside" drags)
-				if(data.event.target.id && data.event.target.id === 'jstree-marker') {
-					return;
-				}
-				lastev = data.event;
-
-				var ins = $.jstree.reference(data.event.target),
-					ref = false,
-					off = false,
-					rel = false,
-					tmp, l, t, h, p, i, o, ok, t1, t2, op, ps, pr, ip, tm, is_copy, pn, c;
-				// if we are over an instance
-				if(ins && ins._data && ins._data.dnd) {
-					marker.attr('class', 'jstree-' + ins.get_theme() + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ));
-					is_copy = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)));
-					data.helper
-						.children().attr('class', 'jstree-' + ins.get_theme() + ' jstree-' + ins.get_theme() + '-' + ins.get_theme_variant() + ' ' + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ))
-						.find('.jstree-copy').first()[ is_copy ? 'show' : 'hide' ]();
-
-					// if are hovering the container itself add a new root node
-					//console.log(data.event);
-					if( (data.event.target === ins.element[0] || data.event.target === ins.get_container_ul()[0]) && (ins.get_container_ul().children().length === 0 || ins.settings.dnd.blank_space_drop)) {
-						ok = true;
-						for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {
-							ok = ok && ins.check( (data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)) ) ? "copy_node" : "move_node"), (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), $.jstree.root, 'last', { 'dnd' : true, 'ref' : ins.get_node($.jstree.root), 'pos' : 'i', 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) });
-							if(!ok) { break; }
-						}
-						if(ok) {
-							lastmv = { 'ins' : ins, 'par' : $.jstree.root, 'pos' : 'last' };
-							marker.hide();
-							data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');
-							if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {
-								data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move';
-							}
-							return;
-						}
-					}
-					else {
-						// if we are hovering a tree node
-						ref = ins.settings.dnd.large_drop_target ? $(data.event.target).closest('.jstree-node').children('.jstree-anchor') : $(data.event.target).closest('.jstree-anchor');
-						
-						if(ref && ref.length && ref.parent().is('.jstree-closed, .jstree-open, .jstree-leaf')) {
-							off = ref.offset();
-							rel = (data.event.pageY !== undefined ? data.event.pageY : data.event.originalEvent.pageY) - off.top;
-							h = ref.outerHeight();
-							if(rel < h / 3) {
-								o = ['b', 'i', 'a'];
-							}
-							else if(rel > h - h / 3) {
-								o = ['a', 'i', 'b'];
-							}
-							else {
-								o = rel > h / 2 ? ['i', 'a', 'b'] : ['i', 'b', 'a'];
-							}
-							$.each(o, function (j, v) {
-								switch(v) {
-									case 'b':
-										l = off.left - 6;
-										t = off.top;
-										p = ins.get_parent(ref);
-										i = ref.parent().index();
-										c = 'jstree-below';
-										break;
-									case 'i':
-										ip = ins.settings.dnd.inside_pos;
-										tm = ins.get_node(ref.parent());
-										l = off.left - 2;
-										t = off.top + h / 2 + 1;
-										p = tm.id;
-										i = ip === 'first' ? 0 : (ip === 'last' ? tm.children.length : Math.min(ip, tm.children.length));
-										c = 'jstree-inside';
-										break;
-									case 'a':
-										l = off.left - 6;
-										t = off.top + h;
-										p = ins.get_parent(ref);
-										i = ref.parent().index() + 1;
-										c = 'jstree-above';
-										break;
-								}
-								ok = true;
-								for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {
-									op = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? "copy_node" : "move_node";
-									ps = i;
-									if(op === "move_node" && v === 'a' && (data.data.origin && data.data.origin === ins) && p === ins.get_parent(data.data.nodes[t1])) {
-										pr = ins.get_node(p);
-										if(ps > $.inArray(data.data.nodes[t1], pr.children)) {
-											ps -= 1;
-										}
-									}
-									ok = ok && ( (ins && ins.settings && ins.settings.dnd && ins.settings.dnd.check_while_dragging === false) || ins.check(op, (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), p, ps, { 'dnd' : true, 'ref' : ins.get_node(ref.parent()), 'pos' : v, 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) }) );
-									if(!ok) {
-										if(ins && ins.last_error) { laster = ins.last_error(); }
-										break;
-									}
-								}
-								if(v === 'i' && ref.parent().is('.jstree-closed') && ins.settings.dnd.open_timeout) {
-									if (!data.event || data.event.type !== 'dragover' || isDifferentNode) {
-										if (opento) { clearTimeout(opento); }
-										opento = setTimeout((function (x, z) { return function () { x.open_node(z); }; }(ins, ref)), ins.settings.dnd.open_timeout);
-									}
-								}
-								if(ok) {
-									pn = ins.get_node(p, true);
-									if (!pn.hasClass('.jstree-dnd-parent')) {
-										$('.jstree-dnd-parent').removeClass('jstree-dnd-parent');
-										pn.addClass('jstree-dnd-parent');
-									}
-									lastmv = { 'ins' : ins, 'par' : p, 'pos' : v === 'i' && ip === 'last' && i === 0 && !ins.is_loaded(tm) ? 'last' : i };
-									marker.css({ 'left' : l + 'px', 'top' : t + 'px' }).show();
-									marker.removeClass('jstree-above jstree-inside jstree-below').addClass(c);
-									data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');
-									if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {
-										data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move';
-									}
-									laster = {};
-									o = true;
-									return false;
-								}
-							});
-							if(o === true) { return; }
-						}
-					}
-				}
-				$('.jstree-dnd-parent').removeClass('jstree-dnd-parent');
-				lastmv = false;
-				data.helper.find('.jstree-icon').removeClass('jstree-ok').addClass('jstree-er');
-				if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {
-					//data.event.originalEvent.dataTransfer.dropEffect = 'none';
-				}
-				marker.hide();
-			})
-			.on('dnd_scroll.vakata.jstree', function (e, data) {
-				if(!data || !data.data || !data.data.jstree) { return; }
-				marker.hide();
-				lastmv = false;
-				lastev = false;
-				data.helper.find('.jstree-icon').first().removeClass('jstree-ok').addClass('jstree-er');
-			})
-			.on('dnd_stop.vakata.jstree', function (e, data) {
-				$('.jstree-dnd-parent').removeClass('jstree-dnd-parent');
-				if(opento) { clearTimeout(opento); }
-				if(!data || !data.data || !data.data.jstree) { return; }
-				marker.hide().detach();
-				var i, j, nodes = [];
-				if(lastmv) {
-					for(i = 0, j = data.data.nodes.length; i < j; i++) {
-						nodes[i] = data.data.origin ? data.data.origin.get_node(data.data.nodes[i]) : data.data.nodes[i];
-					}
-					lastmv.ins[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? 'copy_node' : 'move_node' ](nodes, lastmv.par, lastmv.pos, false, false, false, data.data.origin);
-				}
-				else {
-					i = $(data.event.target).closest('.jstree');
-					if(i.length && laster && laster.error && laster.error === 'check') {
-						i = i.jstree(true);
-						if(i) {
-							i.settings.core.error.call(this, laster);
-						}
-					}
-				}
-				lastev = false;
-				lastmv = false;
-			})
-			.on('keyup.jstree keydown.jstree', function (e, data) {
-				data = $.vakata.dnd._get();
-				if(data && data.data && data.data.jstree) {
-					if (e.type === "keyup" && e.which === 27) {
-						if (opento) { clearTimeout(opento); }
-						lastmv = false;
-						laster = false;
-						lastev = false;
-						opento = false;
-						marker.hide().detach();
-						$.vakata.dnd._clean();
-					} else {
-						data.helper.find('.jstree-copy').first()[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (e.metaKey || e.ctrlKey))) ? 'show' : 'hide' ]();
-						if(lastev) {
-							lastev.metaKey = e.metaKey;
-							lastev.ctrlKey = e.ctrlKey;
-							$.vakata.dnd._trigger('move', lastev);
-						}
-					}
-				}
-			});
-	});
-
-	// helpers
-	(function ($) {
-		$.vakata.html = {
-			div : $('<div></div>'),
-			escape : function (str) {
-				return $.vakata.html.div.text(str).html();
-			},
-			strip : function (str) {
-				return $.vakata.html.div.empty().append($.parseHTML(str)).text();
-			}
-		};
-		// private variable
-		var vakata_dnd = {
-			element	: false,
-			target	: false,
-			is_down	: false,
-			is_drag	: false,
-			helper	: false,
-			helper_w: 0,
-			data	: false,
-			init_x	: 0,
-			init_y	: 0,
-			scroll_l: 0,
-			scroll_t: 0,
-			scroll_e: false,
-			scroll_i: false,
-			is_touch: false
-		};
-		$.vakata.dnd = {
-			settings : {
-				scroll_speed		: 10,
-				scroll_proximity	: 20,
-				helper_left			: 5,
-				helper_top			: 10,
-				threshold			: 5,
-				threshold_touch		: 10
-			},
-			_trigger : function (event_name, e, data) {
-				if (data === undefined) {
-					data = $.vakata.dnd._get();
-				}
-				data.event = e;
-				$(document).triggerHandler("dnd_" + event_name + ".vakata", data);
-			},
-			_get : function () {
-				return {
-					"data"		: vakata_dnd.data,
-					"element"	: vakata_dnd.element,
-					"helper"	: vakata_dnd.helper
-				};
-			},
-			_clean : function () {
-				if(vakata_dnd.helper) { vakata_dnd.helper.remove(); }
-				if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; }
-				vakata_dnd = {
-					element	: false,
-					target	: false,
-					is_down	: false,
-					is_drag	: false,
-					helper	: false,
-					helper_w: 0,
-					data	: false,
-					init_x	: 0,
-					init_y	: 0,
-					scroll_l: 0,
-					scroll_t: 0,
-					scroll_e: false,
-					scroll_i: false,
-					is_touch: false
-				};
-				elm = null;
-				$(document).off("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag);
-				$(document).off("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop);
-			},
-			_scroll : function (init_only) {
-				if(!vakata_dnd.scroll_e || (!vakata_dnd.scroll_l && !vakata_dnd.scroll_t)) {
-					if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; }
-					return false;
-				}
-				if(!vakata_dnd.scroll_i) {
-					vakata_dnd.scroll_i = setInterval($.vakata.dnd._scroll, 100);
-					return false;
-				}
-				if(init_only === true) { return false; }
-
-				var i = vakata_dnd.scroll_e.scrollTop(),
-					j = vakata_dnd.scroll_e.scrollLeft();
-				vakata_dnd.scroll_e.scrollTop(i + vakata_dnd.scroll_t * $.vakata.dnd.settings.scroll_speed);
-				vakata_dnd.scroll_e.scrollLeft(j + vakata_dnd.scroll_l * $.vakata.dnd.settings.scroll_speed);
-				if(i !== vakata_dnd.scroll_e.scrollTop() || j !== vakata_dnd.scroll_e.scrollLeft()) {
-					/**
-					 * triggered on the document when a drag causes an element to scroll
-					 * @event
-					 * @plugin dnd
-					 * @name dnd_scroll.vakata
-					 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
-					 * @param {DOM} element the DOM element being dragged
-					 * @param {jQuery} helper the helper shown next to the mouse
-					 * @param {jQuery} event the element that is scrolling
-					 */
-					$.vakata.dnd._trigger("scroll", vakata_dnd.scroll_e);
-				}
-			},
-			start : function (e, data, html) {
-				if(e.type === "touchstart" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
-					e.pageX = e.originalEvent.changedTouches[0].pageX;
-					e.pageY = e.originalEvent.changedTouches[0].pageY;
-					e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
-				}
-				if(vakata_dnd.is_drag) { $.vakata.dnd.stop({}); }
-				try {
-					e.currentTarget.unselectable = "on";
-					e.currentTarget.onselectstart = function() { return false; };
-					if(e.currentTarget.style) {
-						e.currentTarget.style.touchAction = "none";
-						e.currentTarget.style.msTouchAction = "none";
-						e.currentTarget.style.MozUserSelect = "none";
-					}
-				} catch(ignore) { }
-				vakata_dnd.init_x	= e.pageX;
-				vakata_dnd.init_y	= e.pageY;
-				vakata_dnd.data		= data;
-				vakata_dnd.is_down	= true;
-				vakata_dnd.element	= e.currentTarget;
-				vakata_dnd.target	= e.target;
-				vakata_dnd.is_touch	= e.type === "touchstart";
-				if(html !== false) {
-					vakata_dnd.helper = $("<div id='vakata-dnd'></div>").html(html).css({
-						"display"		: "block",
-						"margin"		: "0",
-						"padding"		: "0",
-						"position"		: "absolute",
-						"top"			: "-2000px",
-						"lineHeight"	: "16px",
-						"zIndex"		: "10000"
-					});
-				}
-				$(document).on("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag);
-				$(document).on("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop);
-				return false;
-			},
-			drag : function (e) {
-				if(e.type === "touchmove" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
-					e.pageX = e.originalEvent.changedTouches[0].pageX;
-					e.pageY = e.originalEvent.changedTouches[0].pageY;
-					e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
-				}
-				if(!vakata_dnd.is_down) { return; }
-				if(!vakata_dnd.is_drag) {
-					if(
-						Math.abs(e.pageX - vakata_dnd.init_x) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) ||
-						Math.abs(e.pageY - vakata_dnd.init_y) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold)
-					) {
-						if(vakata_dnd.helper) {
-							vakata_dnd.helper.appendTo(document.body);
-							vakata_dnd.helper_w = vakata_dnd.helper.outerWidth();
-						}
-						vakata_dnd.is_drag = true;
-						$(vakata_dnd.target).one('click.vakata', false);
-						/**
-						 * triggered on the document when a drag starts
-						 * @event
-						 * @plugin dnd
-						 * @name dnd_start.vakata
-						 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
-						 * @param {DOM} element the DOM element being dragged
-						 * @param {jQuery} helper the helper shown next to the mouse
-						 * @param {Object} event the event that caused the start (probably mousemove)
-						 */
-						$.vakata.dnd._trigger("start", e);
-					}
-					else { return; }
-				}
-
-				var d  = false, w  = false,
-					dh = false, wh = false,
-					dw = false, ww = false,
-					dt = false, dl = false,
-					ht = false, hl = false;
-
-				vakata_dnd.scroll_t = 0;
-				vakata_dnd.scroll_l = 0;
-				vakata_dnd.scroll_e = false;
-				$($(e.target).parentsUntil("body").addBack().get().reverse())
-					.filter(function () {
-						return	this.ownerDocument && (/^auto|scroll$/).test($(this).css("overflow")) &&
-								(this.scrollHeight > this.offsetHeight || this.scrollWidth > this.offsetWidth);
-					})
-					.each(function () {
-						var t = $(this), o = t.offset();
-						if(this.scrollHeight > this.offsetHeight) {
-							if(o.top + t.height() - e.pageY < $.vakata.dnd.settings.scroll_proximity)	{ vakata_dnd.scroll_t = 1; }
-							if(e.pageY - o.top < $.vakata.dnd.settings.scroll_proximity)				{ vakata_dnd.scroll_t = -1; }
-						}
-						if(this.scrollWidth > this.offsetWidth) {
-							if(o.left + t.width() - e.pageX < $.vakata.dnd.settings.scroll_proximity)	{ vakata_dnd.scroll_l = 1; }
-							if(e.pageX - o.left < $.vakata.dnd.settings.scroll_proximity)				{ vakata_dnd.scroll_l = -1; }
-						}
-						if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) {
-							vakata_dnd.scroll_e = $(this);
-							return false;
-						}
-					});
-
-				if(!vakata_dnd.scroll_e) {
-					d  = $(document); w = $(window);
-					dh = d.height(); wh = w.height();
-					dw = d.width(); ww = w.width();
-					dt = d.scrollTop(); dl = d.scrollLeft();
-					if(dh > wh && e.pageY - dt < $.vakata.dnd.settings.scroll_proximity)		{ vakata_dnd.scroll_t = -1;  }
-					if(dh > wh && wh - (e.pageY - dt) < $.vakata.dnd.settings.scroll_proximity)	{ vakata_dnd.scroll_t = 1; }
-					if(dw > ww && e.pageX - dl < $.vakata.dnd.settings.scroll_proximity)		{ vakata_dnd.scroll_l = -1; }
-					if(dw > ww && ww - (e.pageX - dl) < $.vakata.dnd.settings.scroll_proximity)	{ vakata_dnd.scroll_l = 1; }
-					if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) {
-						vakata_dnd.scroll_e = d;
-					}
-				}
-				if(vakata_dnd.scroll_e) { $.vakata.dnd._scroll(true); }
-
-				if(vakata_dnd.helper) {
-					ht = parseInt(e.pageY + $.vakata.dnd.settings.helper_top, 10);
-					hl = parseInt(e.pageX + $.vakata.dnd.settings.helper_left, 10);
-					if(dh && ht + 25 > dh) { ht = dh - 50; }
-					if(dw && hl + vakata_dnd.helper_w > dw) { hl = dw - (vakata_dnd.helper_w + 2); }
-					vakata_dnd.helper.css({
-						left	: hl + "px",
-						top		: ht + "px"
-					});
-				}
-				/**
-				 * triggered on the document when a drag is in progress
-				 * @event
-				 * @plugin dnd
-				 * @name dnd_move.vakata
-				 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
-				 * @param {DOM} element the DOM element being dragged
-				 * @param {jQuery} helper the helper shown next to the mouse
-				 * @param {Object} event the event that caused this to trigger (most likely mousemove)
-				 */
-				$.vakata.dnd._trigger("move", e);
-				return false;
-			},
-			stop : function (e) {
-				if(e.type === "touchend" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
-					e.pageX = e.originalEvent.changedTouches[0].pageX;
-					e.pageY = e.originalEvent.changedTouches[0].pageY;
-					e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
-				}
-				if(vakata_dnd.is_drag) {
-					/**
-					 * triggered on the document when a drag stops (the dragged element is dropped)
-					 * @event
-					 * @plugin dnd
-					 * @name dnd_stop.vakata
-					 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
-					 * @param {DOM} element the DOM element being dragged
-					 * @param {jQuery} helper the helper shown next to the mouse
-					 * @param {Object} event the event that caused the stop
-					 */
-					if (e.target !== vakata_dnd.target) {
-						$(vakata_dnd.target).off('click.vakata');
-					}
-					$.vakata.dnd._trigger("stop", e);
-				}
-				else {
-					if(e.type === "touchend" && e.target === vakata_dnd.target) {
-						var to = setTimeout(function () { $(e.target).trigger('click'); }, 100);
-						$(e.target).one('click', function() { if(to) { clearTimeout(to); } });
-					}
-				}
-				$.vakata.dnd._clean();
-				return false;
-			}
-		};
-	}($));
-
-	// include the dnd plugin by default
-	// $.jstree.defaults.plugins.push("dnd");
-
-
-/**
- * ### Massload plugin
- *
- * Adds massload functionality to jsTree, so that multiple nodes can be loaded in a single request (only useful with lazy loading).
- */
-
-	/**
-	 * massload configuration
-	 *
-	 * It is possible to set this to a standard jQuery-like AJAX config.
-	 * In addition to the standard jQuery ajax options here you can supply functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node IDs need to be loaded, the return value of those functions will be used.
-	 *
-	 * You can also set this to a function, that function will receive the node IDs being loaded as argument and a second param which is a function (callback) which should be called with the result.
-	 *
-	 * Both the AJAX and the function approach rely on the same return value - an object where the keys are the node IDs, and the value is the children of that node as an array.
-	 *
-	 *	{
-	 *		"id1" : [{ "text" : "Child of ID1", "id" : "c1" }, { "text" : "Another child of ID1", "id" : "c2" }],
-	 *		"id2" : [{ "text" : "Child of ID2", "id" : "c3" }]
-	 *	}
-	 * 
-	 * @name $.jstree.defaults.massload
-	 * @plugin massload
-	 */
-	$.jstree.defaults.massload = null;
-	$.jstree.plugins.massload = function (options, parent) {
-		this.init = function (el, options) {
-			this._data.massload = {};
-			parent.init.call(this, el, options);
-		};
-		this._load_nodes = function (nodes, callback, is_callback, force_reload) {
-			var s = this.settings.massload,				
-				toLoad = [],
-				m = this._model.data,
-				i, j, dom;
-			if (!is_callback) {
-				for(i = 0, j = nodes.length; i < j; i++) {
-					if(!m[nodes[i]] || ( (!m[nodes[i]].state.loaded && !m[nodes[i]].state.failed) || force_reload) ) {
-						toLoad.push(nodes[i]);
-						dom = this.get_node(nodes[i], true);
-						if (dom && dom.length) {
-							dom.addClass("jstree-loading").attr('aria-busy',true);
-						}
-					}
-				}
-				this._data.massload = {};
-				if (toLoad.length) {
-					if($.vakata.is_function(s)) {
-						return s.call(this, toLoad, function (data) {
-							var i, j;
-							if(data) {
-								for(i in data) {
-									if(data.hasOwnProperty(i)) {
-										this._data.massload[i] = data[i];
-									}
-								}
-							}
-							for(i = 0, j = nodes.length; i < j; i++) {
-								dom = this.get_node(nodes[i], true);
-								if (dom && dom.length) {
-									dom.removeClass("jstree-loading").attr('aria-busy',false);
-								}
-							}
-							parent._load_nodes.call(this, nodes, callback, is_callback, force_reload);
-						}.bind(this));
-					}
-					if(typeof s === 'object' && s && s.url) {
-						s = $.extend(true, {}, s);
-						if($.vakata.is_function(s.url)) {
-							s.url = s.url.call(this, toLoad);
-						}
-						if($.vakata.is_function(s.data)) {
-							s.data = s.data.call(this, toLoad);
-						}
-						return $.ajax(s)
-							.done(function (data,t,x) {
-									var i, j;
-									if(data) {
-										for(i in data) {
-											if(data.hasOwnProperty(i)) {
-												this._data.massload[i] = data[i];
-											}
-										}
-									}
-									for(i = 0, j = nodes.length; i < j; i++) {
-										dom = this.get_node(nodes[i], true);
-										if (dom && dom.length) {
-											dom.removeClass("jstree-loading").attr('aria-busy',false);
-										}
-									}
-									parent._load_nodes.call(this, nodes, callback, is_callback, force_reload);
-								}.bind(this))
-							.fail(function (f) {
-									parent._load_nodes.call(this, nodes, callback, is_callback, force_reload);
-								}.bind(this));
-					}
-				}
-			}
-			return parent._load_nodes.call(this, nodes, callback, is_callback, force_reload);
-		};
-		this._load_node = function (obj, callback) {
-			var data = this._data.massload[obj.id],
-				rslt = null, dom;
-			if(data) {
-				rslt = this[typeof data === 'string' ? '_append_html_data' : '_append_json_data'](
-					obj,
-					typeof data === 'string' ? $($.parseHTML(data)).filter(function () { return this.nodeType !== 3; }) : data,
-					function (status) { callback.call(this, status); }
-				);
-				dom = this.get_node(obj.id, true);
-				if (dom && dom.length) {
-					dom.removeClass("jstree-loading").attr('aria-busy',false);
-				}
-				delete this._data.massload[obj.id];
-				return rslt;
-			}
-			return parent._load_node.call(this, obj, callback);
-		};
-	};
-
-
-/**
- * ### Search plugin
- *
- * Adds search functionality to jsTree.
- */
-
-	/**
-	 * stores all defaults for the search plugin
-	 * @name $.jstree.defaults.search
-	 * @plugin search
-	 */
-	$.jstree.defaults.search = {
-		/**
-		 * a jQuery-like AJAX config, which jstree uses if a server should be queried for results.
-		 *
-		 * A `str` (which is the search string) parameter will be added with the request, an optional `inside` parameter will be added if the search is limited to a node id. The expected result is a JSON array with nodes that need to be opened so that matching nodes will be revealed.
-		 * Leave this setting as `false` to not query the server. You can also set this to a function, which will be invoked in the instance's scope and receive 3 parameters - the search string, the callback to call with the array of nodes to load, and the optional node ID to limit the search to
-		 * @name $.jstree.defaults.search.ajax
-		 * @plugin search
-		 */
-		ajax : false,
-		/**
-		 * Indicates if the search should be fuzzy or not (should `chnd3` match `child node 3`). Default is `false`.
-		 * @name $.jstree.defaults.search.fuzzy
-		 * @plugin search
-		 */
-		fuzzy : false,
-		/**
-		 * Indicates if the search should be case sensitive. Default is `false`.
-		 * @name $.jstree.defaults.search.case_sensitive
-		 * @plugin search
-		 */
-		case_sensitive : false,
-		/**
-		 * Indicates if the tree should be filtered (by default) to show only matching nodes (keep in mind this can be a heavy on large trees in old browsers).
-		 * This setting can be changed at runtime when calling the search method. Default is `false`.
-		 * @name $.jstree.defaults.search.show_only_matches
-		 * @plugin search
-		 */
-		show_only_matches : false,
-		/**
-		 * Indicates if the children of matched element are shown (when show_only_matches is true)
-		 * This setting can be changed at runtime when calling the search method. Default is `false`.
-		 * @name $.jstree.defaults.search.show_only_matches_children
-		 * @plugin search
-		 */
-		show_only_matches_children : false,
-		/**
-		 * Indicates if all nodes opened to reveal the search result, should be closed when the search is cleared or a new search is performed. Default is `true`.
-		 * @name $.jstree.defaults.search.close_opened_onclear
-		 * @plugin search
-		 */
-		close_opened_onclear : true,
-		/**
-		 * Indicates if only leaf nodes should be included in search results. Default is `false`.
-		 * @name $.jstree.defaults.search.search_leaves_only
-		 * @plugin search
-		 */
-		search_leaves_only : false,
-		/**
-		 * If set to a function it wil be called in the instance's scope with two arguments - search string and node (where node will be every node in the structure, so use with caution).
-		 * If the function returns a truthy value the node will be considered a match (it might not be displayed if search_only_leaves is set to true and the node is not a leaf). Default is `false`.
-		 * @name $.jstree.defaults.search.search_callback
-		 * @plugin search
-		 */
-		search_callback : false
-	};
-
-	$.jstree.plugins.search = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-
-			this._data.search.str = "";
-			this._data.search.dom = $();
-			this._data.search.res = [];
-			this._data.search.opn = [];
-			this._data.search.som = false;
-			this._data.search.smc = false;
-			this._data.search.hdn = [];
-
-			this.element
-				.on("search.jstree", function (e, data) {
-						if(this._data.search.som && data.res.length) {
-							var m = this._model.data, i, j, p = [], k, l;
-							for(i = 0, j = data.res.length; i < j; i++) {
-								if(m[data.res[i]] && !m[data.res[i]].state.hidden) {
-									p.push(data.res[i]);
-									p = p.concat(m[data.res[i]].parents);
-									if(this._data.search.smc) {
-										for (k = 0, l = m[data.res[i]].children_d.length; k < l; k++) {
-											if (m[m[data.res[i]].children_d[k]] && !m[m[data.res[i]].children_d[k]].state.hidden) {
-												p.push(m[data.res[i]].children_d[k]);
-											}
-										}
-									}
-								}
-							}
-							p = $.vakata.array_remove_item($.vakata.array_unique(p), $.jstree.root);
-							this._data.search.hdn = this.hide_all(true);
-							this.show_node(p, true);
-							this.redraw(true);
-						}
-					}.bind(this))
-				.on("clear_search.jstree", function (e, data) {
-						if(this._data.search.som && data.res.length) {
-							this.show_node(this._data.search.hdn, true);
-							this.redraw(true);
-						}
-					}.bind(this));
-		};
-		/**
-		 * used to search the tree nodes for a given string
-		 * @name search(str [, skip_async])
-		 * @param {String} str the search string
-		 * @param {Boolean} skip_async if set to true server will not be queried even if configured
-		 * @param {Boolean} show_only_matches if set to true only matching nodes will be shown (keep in mind this can be very slow on large trees or old browsers)
-		 * @param {mixed} inside an optional node to whose children to limit the search
-		 * @param {Boolean} append if set to true the results of this search are appended to the previous search
-		 * @plugin search
-		 * @trigger search.jstree
-		 */
-		this.search = function (str, skip_async, show_only_matches, inside, append, show_only_matches_children) {
-			if(str === false || $.vakata.trim(str.toString()) === "") {
-				return this.clear_search();
-			}
-			inside = this.get_node(inside);
-			inside = inside && (inside.id || inside.id === 0) ? inside.id : null;
-			str = str.toString();
-			var s = this.settings.search,
-				a = s.ajax ? s.ajax : false,
-				m = this._model.data,
-				f = null,
-				r = [],
-				p = [], i, j;
-			if(this._data.search.res.length && !append) {
-				this.clear_search();
-			}
-			if(show_only_matches === undefined) {
-				show_only_matches = s.show_only_matches;
-			}
-			if(show_only_matches_children === undefined) {
-				show_only_matches_children = s.show_only_matches_children;
-			}
-			if(!skip_async && a !== false) {
-				if($.vakata.is_function(a)) {
-					return a.call(this, str, function (d) {
-							if(d && d.d) { d = d.d; }
-							this._load_nodes(!$.vakata.is_array(d) ? [] : $.vakata.array_unique(d), function () {
-								this.search(str, true, show_only_matches, inside, append, show_only_matches_children);
-							});
-						}.bind(this), inside);
-				}
-				else {
-					a = $.extend({}, a);
-					if(!a.data) { a.data = {}; }
-					a.data.str = str;
-					if(inside) {
-						a.data.inside = inside;
-					}
-					if (this._data.search.lastRequest) {
-						this._data.search.lastRequest.abort();
-					}
-					this._data.search.lastRequest = $.ajax(a)
-						.fail(function () {
-							this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'search', 'id' : 'search_01', 'reason' : 'Could not load search parents', 'data' : JSON.stringify(a) };
-							this.settings.core.error.call(this, this._data.core.last_error);
-						}.bind(this))
-						.done(function (d) {
-							if(d && d.d) { d = d.d; }
-							this._load_nodes(!$.vakata.is_array(d) ? [] : $.vakata.array_unique(d), function () {
-								this.search(str, true, show_only_matches, inside, append, show_only_matches_children);
-							});
-						}.bind(this));
-					return this._data.search.lastRequest;
-				}
-			}
-			if(!append) {
-				this._data.search.str = str;
-				this._data.search.dom = $();
-				this._data.search.res = [];
-				this._data.search.opn = [];
-				this._data.search.som = show_only_matches;
-				this._data.search.smc = show_only_matches_children;
-			}
-
-			f = new $.vakata.search(str, true, { caseSensitive : s.case_sensitive, fuzzy : s.fuzzy });
-			$.each(m[inside ? inside : $.jstree.root].children_d, function (ii, i) {
-				var v = m[i];
-				if(v.text && !v.state.hidden && (!s.search_leaves_only || (v.state.loaded && v.children.length === 0)) && ( (s.search_callback && s.search_callback.call(this, str, v)) || (!s.search_callback && f.search(v.text).isMatch) ) ) {
-					r.push(i);
-					p = p.concat(v.parents);
-				}
-			});
-			if(r.length) {
-				p = $.vakata.array_unique(p);
-				for(i = 0, j = p.length; i < j; i++) {
-					if(p[i] !== $.jstree.root && m[p[i]] && this.open_node(p[i], null, 0) === true) {
-						this._data.search.opn.push(p[i]);
-					}
-				}
-				if(!append) {
-					this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #')));
-					this._data.search.res = r;
-				}
-				else {
-					this._data.search.dom = this._data.search.dom.add($(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #'))));
-					this._data.search.res = $.vakata.array_unique(this._data.search.res.concat(r));
-				}
-				this._data.search.dom.children(".jstree-anchor").addClass('jstree-search');
-			}
-			/**
-			 * triggered after search is complete
-			 * @event
-			 * @name search.jstree
-			 * @param {jQuery} nodes a jQuery collection of matching nodes
-			 * @param {String} str the search string
-			 * @param {Array} res a collection of objects represeing the matching nodes
-			 * @plugin search
-			 */
-			this.trigger('search', { nodes : this._data.search.dom, str : str, res : this._data.search.res, show_only_matches : show_only_matches });
-		};
-		/**
-		 * used to clear the last search (removes classes and shows all nodes if filtering is on)
-		 * @name clear_search()
-		 * @plugin search
-		 * @trigger clear_search.jstree
-		 */
-		this.clear_search = function () {
-			if(this.settings.search.close_opened_onclear) {
-				this.close_node(this._data.search.opn, 0);
-			}
-			/**
-			 * triggered after search is complete
-			 * @event
-			 * @name clear_search.jstree
-			 * @param {jQuery} nodes a jQuery collection of matching nodes (the result from the last search)
-			 * @param {String} str the search string (the last search string)
-			 * @param {Array} res a collection of objects represeing the matching nodes (the result from the last search)
-			 * @plugin search
-			 */
-			this.trigger('clear_search', { 'nodes' : this._data.search.dom, str : this._data.search.str, res : this._data.search.res });
-			if(this._data.search.res.length) {
-				this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(this._data.search.res, function (v) {
-					return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&');
-				}).join(', #')));
-				this._data.search.dom.children(".jstree-anchor").removeClass("jstree-search");
-			}
-			this._data.search.str = "";
-			this._data.search.res = [];
-			this._data.search.opn = [];
-			this._data.search.dom = $();
-		};
-
-		this.redraw_node = function(obj, deep, callback, force_render) {
-			obj = parent.redraw_node.apply(this, arguments);
-			if(obj) {
-				if($.inArray(obj.id, this._data.search.res) !== -1) {
-					var i, j, tmp = null;
-					for(i = 0, j = obj.childNodes.length; i < j; i++) {
-						if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
-							tmp = obj.childNodes[i];
-							break;
-						}
-					}
-					if(tmp) {
-						tmp.className += ' jstree-search';
-					}
-				}
-			}
-			return obj;
-		};
-	};
-
-	// helpers
-	(function ($) {
-		// from http://kiro.me/projects/fuse.html
-		$.vakata.search = function(pattern, txt, options) {
-			options = options || {};
-			options = $.extend({}, $.vakata.search.defaults, options);
-			if(options.fuzzy !== false) {
-				options.fuzzy = true;
-			}
-			pattern = options.caseSensitive ? pattern : pattern.toLowerCase();
-			var MATCH_LOCATION	= options.location,
-				MATCH_DISTANCE	= options.distance,
-				MATCH_THRESHOLD	= options.threshold,
-				patternLen = pattern.length,
-				matchmask, pattern_alphabet, match_bitapScore, search;
-			if(patternLen > 32) {
-				options.fuzzy = false;
-			}
-			if(options.fuzzy) {
-				matchmask = 1 << (patternLen - 1);
-				pattern_alphabet = (function () {
-					var mask = {},
-						i = 0;
-					for (i = 0; i < patternLen; i++) {
-						mask[pattern.charAt(i)] = 0;
-					}
-					for (i = 0; i < patternLen; i++) {
-						mask[pattern.charAt(i)] |= 1 << (patternLen - i - 1);
-					}
-					return mask;
-				}());
-				match_bitapScore = function (e, x) {
-					var accuracy = e / patternLen,
-						proximity = Math.abs(MATCH_LOCATION - x);
-					if(!MATCH_DISTANCE) {
-						return proximity ? 1.0 : accuracy;
-					}
-					return accuracy + (proximity / MATCH_DISTANCE);
-				};
-			}
-			search = function (text) {
-				text = options.caseSensitive ? text.toString() : text.toString().toLowerCase();
-				if(pattern === text || text.indexOf(pattern) !== -1) {
-					return {
-						isMatch: true,
-						score: 0
-					};
-				}
-				if(!options.fuzzy) {
-					return {
-						isMatch: false,
-						score: 1
-					};
-				}
-				var i, j,
-					textLen = text.length,
-					scoreThreshold = MATCH_THRESHOLD,
-					bestLoc = text.indexOf(pattern, MATCH_LOCATION),
-					binMin, binMid,
-					binMax = patternLen + textLen,
-					lastRd, start, finish, rd, charMatch,
-					score = 1,
-					locations = [];
-				if (bestLoc !== -1) {
-					scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold);
-					bestLoc = text.lastIndexOf(pattern, MATCH_LOCATION + patternLen);
-					if (bestLoc !== -1) {
-						scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold);
-					}
-				}
-				bestLoc = -1;
-				for (i = 0; i < patternLen; i++) {
-					binMin = 0;
-					binMid = binMax;
-					while (binMin < binMid) {
-						if (match_bitapScore(i, MATCH_LOCATION + binMid) <= scoreThreshold) {
-							binMin = binMid;
-						} else {
-							binMax = binMid;
-						}
-						binMid = Math.floor((binMax - binMin) / 2 + binMin);
-					}
-					binMax = binMid;
-					start = Math.max(1, MATCH_LOCATION - binMid + 1);
-					finish = Math.min(MATCH_LOCATION + binMid, textLen) + patternLen;
-					rd = new Array(finish + 2);
-					rd[finish + 1] = (1 << i) - 1;
-					for (j = finish; j >= start; j--) {
-						charMatch = pattern_alphabet[text.charAt(j - 1)];
-						if (i === 0) {
-							rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;
-						} else {
-							rd[j] = ((rd[j + 1] << 1) | 1) & charMatch | (((lastRd[j + 1] | lastRd[j]) << 1) | 1) | lastRd[j + 1];
-						}
-						if (rd[j] & matchmask) {
-							score = match_bitapScore(i, j - 1);
-							if (score <= scoreThreshold) {
-								scoreThreshold = score;
-								bestLoc = j - 1;
-								locations.push(bestLoc);
-								if (bestLoc > MATCH_LOCATION) {
-									start = Math.max(1, 2 * MATCH_LOCATION - bestLoc);
-								} else {
-									break;
-								}
-							}
-						}
-					}
-					if (match_bitapScore(i + 1, MATCH_LOCATION) > scoreThreshold) {
-						break;
-					}
-					lastRd = rd;
-				}
-				return {
-					isMatch: bestLoc >= 0,
-					score: score
-				};
-			};
-			return txt === true ? { 'search' : search } : search(txt);
-		};
-		$.vakata.search.defaults = {
-			location : 0,
-			distance : 100,
-			threshold : 0.6,
-			fuzzy : false,
-			caseSensitive : false
-		};
-	}($));
-
-	// include the search plugin by default
-	// $.jstree.defaults.plugins.push("search");
-
-
-/**
- * ### Sort plugin
- *
- * Automatically sorts all siblings in the tree according to a sorting function.
- */
-
-	/**
-	 * the settings function used to sort the nodes.
-	 * It is executed in the tree's context, accepts two nodes as arguments and should return `1` or `-1`.
-	 * @name $.jstree.defaults.sort
-	 * @plugin sort
-	 */
-	$.jstree.defaults.sort = function (a, b) {
-		//return this.get_type(a) === this.get_type(b) ? (this.get_text(a) > this.get_text(b) ? 1 : -1) : this.get_type(a) >= this.get_type(b);
-		return this.get_text(a) > this.get_text(b) ? 1 : -1;
-	};
-	$.jstree.plugins.sort = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-			this.element
-				.on("model.jstree", function (e, data) {
-						this.sort(data.parent, true);
-					}.bind(this))
-				.on("rename_node.jstree create_node.jstree", function (e, data) {
-						this.sort(data.parent || data.node.parent, false);
-						this.redraw_node(data.parent || data.node.parent, true);
-					}.bind(this))
-				.on("move_node.jstree copy_node.jstree", function (e, data) {
-						this.sort(data.parent, false);
-						this.redraw_node(data.parent, true);
-					}.bind(this));
-		};
-		/**
-		 * used to sort a node's children
-		 * @private
-		 * @name sort(obj [, deep])
-		 * @param  {mixed} obj the node
-		 * @param {Boolean} deep if set to `true` nodes are sorted recursively.
-		 * @plugin sort
-		 * @trigger search.jstree
-		 */
-		this.sort = function (obj, deep) {
-			var i, j;
-			obj = this.get_node(obj);
-			if(obj && obj.children && obj.children.length) {
-				obj.children.sort(this.settings.sort.bind(this));
-				if(deep) {
-					for(i = 0, j = obj.children_d.length; i < j; i++) {
-						this.sort(obj.children_d[i], false);
-					}
-				}
-			}
-		};
-	};
-
-	// include the sort plugin by default
-	// $.jstree.defaults.plugins.push("sort");
-
-/**
- * ### State plugin
- *
- * Saves the state of the tree (selected nodes, opened nodes) on the user's computer using available options (localStorage, cookies, etc)
- */
-
-	var to = false;
-	/**
-	 * stores all defaults for the state plugin
-	 * @name $.jstree.defaults.state
-	 * @plugin state
-	 */
-	$.jstree.defaults.state = {
-		/**
-		 * A string for the key to use when saving the current tree (change if using multiple trees in your project). Defaults to `jstree`.
-		 * @name $.jstree.defaults.state.key
-		 * @plugin state
-		 */
-		key		: 'jstree',
-		/**
-		 * A space separated list of events that trigger a state save. Defaults to `changed.jstree open_node.jstree close_node.jstree`.
-		 * @name $.jstree.defaults.state.events
-		 * @plugin state
-		 */
-		events	: 'changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree',
-		/**
-		 * Time in milliseconds after which the state will expire. Defaults to 'false' meaning - no expire.
-		 * @name $.jstree.defaults.state.ttl
-		 * @plugin state
-		 */
-		ttl		: false,
-		/**
-		 * A function that will be executed prior to restoring state with one argument - the state object. Can be used to clear unwanted parts of the state.
-		 * @name $.jstree.defaults.state.filter
-		 * @plugin state
-		 */
-		filter	: false,
-		/**
-		 * Should loaded nodes be restored (setting this to true means that it is possible that the whole tree will be loaded for some users - use with caution). Defaults to `false`
-		 * @name $.jstree.defaults.state.preserve_loaded
-		 * @plugin state
-		 */
-		preserve_loaded : false
-	};
-	$.jstree.plugins.state = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-			var bind = function () {
-				this.element.on(this.settings.state.events, function () {
-					if(to) { clearTimeout(to); }
-					to = setTimeout(function () { this.save_state(); }.bind(this), 100);
-				}.bind(this));
-				/**
-				 * triggered when the state plugin is finished restoring the state (and immediately after ready if there is no state to restore).
-				 * @event
-				 * @name state_ready.jstree
-				 * @plugin state
-				 */
-				this.trigger('state_ready');
-			}.bind(this);
-			this.element
-				.on("ready.jstree", function (e, data) {
-						this.element.one("restore_state.jstree", bind);
-						if(!this.restore_state()) { bind(); }
-					}.bind(this));
-		};
-		/**
-		 * save the state
-		 * @name save_state()
-		 * @plugin state
-		 */
-		this.save_state = function () {
-			var tm = this.get_state();
-			if (!this.settings.state.preserve_loaded) {
-				delete tm.core.loaded;
-			}
-			var st = { 'state' : tm, 'ttl' : this.settings.state.ttl, 'sec' : +(new Date()) };
-			$.vakata.storage.set(this.settings.state.key, JSON.stringify(st));
-		};
-		/**
-		 * restore the state from the user's computer
-		 * @name restore_state()
-		 * @plugin state
-		 */
-		this.restore_state = function () {
-			var k = $.vakata.storage.get(this.settings.state.key);
-			if(!!k) { try { k = JSON.parse(k); } catch(ex) { return false; } }
-			if(!!k && k.ttl && k.sec && +(new Date()) - k.sec > k.ttl) { return false; }
-			if(!!k && k.state) { k = k.state; }
-			if(!!k && $.vakata.is_function(this.settings.state.filter)) { k = this.settings.state.filter.call(this, k); }
-			if(!!k) {
-				if (!this.settings.state.preserve_loaded) {
-					delete k.core.loaded;
-				}
-				this.element.one("set_state.jstree", function (e, data) { data.instance.trigger('restore_state', { 'state' : $.extend(true, {}, k) }); });
-				this.set_state(k);
-				return true;
-			}
-			return false;
-		};
-		/**
-		 * clear the state on the user's computer
-		 * @name clear_state()
-		 * @plugin state
-		 */
-		this.clear_state = function () {
-			return $.vakata.storage.del(this.settings.state.key);
-		};
-	};
-
-	(function ($, undefined) {
-		$.vakata.storage = {
-			// simply specifying the functions in FF throws an error
-			set : function (key, val) { return window.localStorage.setItem(key, val); },
-			get : function (key) { return window.localStorage.getItem(key); },
-			del : function (key) { return window.localStorage.removeItem(key); }
-		};
-	}($));
-
-	// include the state plugin by default
-	// $.jstree.defaults.plugins.push("state");
-
-/**
- * ### Types plugin
- *
- * Makes it possible to add predefined types for groups of nodes, which make it possible to easily control nesting rules and icon for each group.
- */
-
-	/**
-	 * An object storing all types as key value pairs, where the key is the type name and the value is an object that could contain following keys (all optional).
-	 *
-	 * * `max_children` the maximum number of immediate children this node type can have. Do not specify or set to `-1` for unlimited.
-	 * * `max_depth` the maximum number of nesting this node type can have. A value of `1` would mean that the node can have children, but no grandchildren. Do not specify or set to `-1` for unlimited.
-	 * * `valid_children` an array of node type strings, that nodes of this type can have as children. Do not specify or set to `-1` for no limits.
-	 * * `icon` a string - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class. Omit to use the default icon from your theme.
-	 * * `li_attr` an object of values which will be used to add HTML attributes on the resulting LI DOM node (merged with the node's own data)
-	 * * `a_attr` an object of values which will be used to add HTML attributes on the resulting A DOM node (merged with the node's own data)
-	 *
-	 * There are two predefined types:
-	 *
-	 * * `#` represents the root of the tree, for example `max_children` would control the maximum number of root nodes.
-	 * * `default` represents the default node - any settings here will be applied to all nodes that do not have a type specified.
-	 *
-	 * @name $.jstree.defaults.types
-	 * @plugin types
-	 */
-	$.jstree.defaults.types = {
-		'default' : {}
-	};
-	$.jstree.defaults.types[$.jstree.root] = {};
-
-	$.jstree.plugins.types = function (options, parent) {
-		this.init = function (el, options) {
-			var i, j;
-			if(options && options.types && options.types['default']) {
-				for(i in options.types) {
-					if(i !== "default" && i !== $.jstree.root && options.types.hasOwnProperty(i)) {
-						for(j in options.types['default']) {
-							if(options.types['default'].hasOwnProperty(j) && options.types[i][j] === undefined) {
-								options.types[i][j] = options.types['default'][j];
-							}
-						}
-					}
-				}
-			}
-			parent.init.call(this, el, options);
-			this._model.data[$.jstree.root].type = $.jstree.root;
-		};
-		this.refresh = function (skip_loading, forget_state) {
-			parent.refresh.call(this, skip_loading, forget_state);
-			this._model.data[$.jstree.root].type = $.jstree.root;
-		};
-		this.bind = function () {
-			this.element
-				.on('model.jstree', function (e, data) {
-						var m = this._model.data,
-							dpc = data.nodes,
-							t = this.settings.types,
-							i, j, c = 'default', k;
-						for(i = 0, j = dpc.length; i < j; i++) {
-							c = 'default';
-							if(m[dpc[i]].original && m[dpc[i]].original.type && t[m[dpc[i]].original.type]) {
-								c = m[dpc[i]].original.type;
-							}
-							if(m[dpc[i]].data && m[dpc[i]].data.jstree && m[dpc[i]].data.jstree.type && t[m[dpc[i]].data.jstree.type]) {
-								c = m[dpc[i]].data.jstree.type;
-							}
-							m[dpc[i]].type = c;
-							if(m[dpc[i]].icon === true && t[c].icon !== undefined) {
-								m[dpc[i]].icon = t[c].icon;
-							}
-							if(t[c].li_attr !== undefined && typeof t[c].li_attr === 'object') {
-								for (k in t[c].li_attr) {
-									if (t[c].li_attr.hasOwnProperty(k)) {
-										if (k === 'id') {
-											continue;
-										}
-										else if (m[dpc[i]].li_attr[k] === undefined) {
-											m[dpc[i]].li_attr[k] = t[c].li_attr[k];
-										}
-										else if (k === 'class') {
-											m[dpc[i]].li_attr['class'] = t[c].li_attr['class'] + ' ' + m[dpc[i]].li_attr['class'];
-										}
-									}
-								}
-							}
-							if(t[c].a_attr !== undefined && typeof t[c].a_attr === 'object') {
-								for (k in t[c].a_attr) {
-									if (t[c].a_attr.hasOwnProperty(k)) {
-										if (k === 'id') {
-											continue;
-										}
-										else if (m[dpc[i]].a_attr[k] === undefined) {
-											m[dpc[i]].a_attr[k] = t[c].a_attr[k];
-										}
-										else if (k === 'href' && m[dpc[i]].a_attr[k] === '#') {
-											m[dpc[i]].a_attr['href'] = t[c].a_attr['href'];
-										}
-										else if (k === 'class') {
-											m[dpc[i]].a_attr['class'] = t[c].a_attr['class'] + ' ' + m[dpc[i]].a_attr['class'];
-										}
-									}
-								}
-							}
-						}
-						m[$.jstree.root].type = $.jstree.root;
-					}.bind(this));
-			parent.bind.call(this);
-		};
-		this.get_json = function (obj, options, flat) {
-			var i, j,
-				m = this._model.data,
-				opt = options ? $.extend(true, {}, options, {no_id:false}) : {},
-				tmp = parent.get_json.call(this, obj, opt, flat);
-			if(tmp === false) { return false; }
-			if($.vakata.is_array(tmp)) {
-				for(i = 0, j = tmp.length; i < j; i++) {
-					tmp[i].type = (tmp[i].id || tmp[i].id === 0) && m[tmp[i].id] && m[tmp[i].id].type ? m[tmp[i].id].type : "default";
-					if(options && options.no_id) {
-						delete tmp[i].id;
-						if(tmp[i].li_attr && tmp[i].li_attr.id) {
-							delete tmp[i].li_attr.id;
-						}
-						if(tmp[i].a_attr && tmp[i].a_attr.id) {
-							delete tmp[i].a_attr.id;
-						}
-					}
-				}
-			}
-			else {
-				tmp.type = (tmp.id || tmp.id === 0) && m[tmp.id] && m[tmp.id].type ? m[tmp.id].type : "default";
-				if(options && options.no_id) {
-					tmp = this._delete_ids(tmp);
-				}
-			}
-			return tmp;
-		};
-		this._delete_ids = function (tmp) {
-			if($.vakata.is_array(tmp)) {
-				for(var i = 0, j = tmp.length; i < j; i++) {
-					tmp[i] = this._delete_ids(tmp[i]);
-				}
-				return tmp;
-			}
-			delete tmp.id;
-			if(tmp.li_attr && tmp.li_attr.id) {
-				delete tmp.li_attr.id;
-			}
-			if(tmp.a_attr && tmp.a_attr.id) {
-				delete tmp.a_attr.id;
-			}
-			if(tmp.children && $.vakata.is_array(tmp.children)) {
-				tmp.children = this._delete_ids(tmp.children);
-			}
-			return tmp;
-		};
-		this.check = function (chk, obj, par, pos, more) {
-			if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; }
-			obj = obj && (obj.id || obj.id === 0) ? obj : this.get_node(obj);
-			par = par && (par.id || par.id === 0) ? par : this.get_node(par);
-			var m = obj && (obj.id || obj.id === 0) ? (more && more.origin ? more.origin : $.jstree.reference(obj.id)) : null, tmp, d, i, j;
-			m = m && m._model && m._model.data ? m._model.data : null;
-			switch(chk) {
-				case "create_node":
-				case "move_node":
-				case "copy_node":
-					if(chk !== 'move_node' || $.inArray(obj.id, par.children) === -1) {
-						tmp = this.get_rules(par);
-						if(tmp.max_children !== undefined && tmp.max_children !== -1 && tmp.max_children === par.children.length) {
-							this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_01', 'reason' : 'max_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-							return false;
-						}
-						if(tmp.valid_children !== undefined && tmp.valid_children !== -1 && $.inArray((obj.type || 'default'), tmp.valid_children) === -1) {
-							this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_02', 'reason' : 'valid_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-							return false;
-						}
-						if(m && obj.children_d && obj.parents) {
-							d = 0;
-							for(i = 0, j = obj.children_d.length; i < j; i++) {
-								d = Math.max(d, m[obj.children_d[i]].parents.length);
-							}
-							d = d - obj.parents.length + 1;
-						}
-						if(d <= 0 || d === undefined) { d = 1; }
-						do {
-							if(tmp.max_depth !== undefined && tmp.max_depth !== -1 && tmp.max_depth < d) {
-								this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_03', 'reason' : 'max_depth prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-								return false;
-							}
-							par = this.get_node(par.parent);
-							tmp = this.get_rules(par);
-							d++;
-						} while(par);
-					}
-					break;
-			}
-			return true;
-		};
-		/**
-		 * used to retrieve the type settings object for a node
-		 * @name get_rules(obj)
-		 * @param {mixed} obj the node to find the rules for
-		 * @return {Object}
-		 * @plugin types
-		 */
-		this.get_rules = function (obj) {
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			var tmp = this.get_type(obj, true);
-			if(tmp.max_depth === undefined) { tmp.max_depth = -1; }
-			if(tmp.max_children === undefined) { tmp.max_children = -1; }
-			if(tmp.valid_children === undefined) { tmp.valid_children = -1; }
-			return tmp;
-		};
-		/**
-		 * used to retrieve the type string or settings object for a node
-		 * @name get_type(obj [, rules])
-		 * @param {mixed} obj the node to find the rules for
-		 * @param {Boolean} rules if set to `true` instead of a string the settings object will be returned
-		 * @return {String|Object}
-		 * @plugin types
-		 */
-		this.get_type = function (obj, rules) {
-			obj = this.get_node(obj);
-			return (!obj) ? false : ( rules ? $.extend({ 'type' : obj.type }, this.settings.types[obj.type]) : obj.type);
-		};
-		/**
-		 * used to change a node's type
-		 * @name set_type(obj, type)
-		 * @param {mixed} obj the node to change
-		 * @param {String} type the new type
-		 * @plugin types
-		 */
-		this.set_type = function (obj, type) {
-			var m = this._model.data, t, t1, t2, old_type, old_icon, k, d, a;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.set_type(obj[t1], type);
-				}
-				return true;
-			}
-			t = this.settings.types;
-			obj = this.get_node(obj);
-			if(!t[type] || !obj) { return false; }
-			d = this.get_node(obj, true);
-			if (d && d.length) {
-				a = d.children('.jstree-anchor');
-			}
-			old_type = obj.type;
-			old_icon = this.get_icon(obj);
-			obj.type = type;
-			if(old_icon === true || !t[old_type] || (t[old_type].icon !== undefined && old_icon === t[old_type].icon)) {
-				this.set_icon(obj, t[type].icon !== undefined ? t[type].icon : true);
-			}
-
-			// remove old type props
-			if(t[old_type] && t[old_type].li_attr !== undefined && typeof t[old_type].li_attr === 'object') {
-				for (k in t[old_type].li_attr) {
-					if (t[old_type].li_attr.hasOwnProperty(k)) {
-						if (k === 'id') {
-							continue;
-						}
-						else if (k === 'class') {
-							m[obj.id].li_attr['class'] = (m[obj.id].li_attr['class'] || '').replace(t[old_type].li_attr[k], '');
-							if (d) { d.removeClass(t[old_type].li_attr[k]); }
-						}
-						else if (m[obj.id].li_attr[k] === t[old_type].li_attr[k]) {
-							m[obj.id].li_attr[k] = null;
-							if (d) { d.removeAttr(k); }
-						}
-					}
-				}
-			}
-			if(t[old_type] && t[old_type].a_attr !== undefined && typeof t[old_type].a_attr === 'object') {
-				for (k in t[old_type].a_attr) {
-					if (t[old_type].a_attr.hasOwnProperty(k)) {
-						if (k === 'id') {
-							continue;
-						}
-						else if (k === 'class') {
-							m[obj.id].a_attr['class'] = (m[obj.id].a_attr['class'] || '').replace(t[old_type].a_attr[k], '');
-							if (a) { a.removeClass(t[old_type].a_attr[k]); }
-						}
-						else if (m[obj.id].a_attr[k] === t[old_type].a_attr[k]) {
-							if (k === 'href') {
-								m[obj.id].a_attr[k] = '#';
-								if (a) { a.attr('href', '#'); }
-							}
-							else {
-								delete m[obj.id].a_attr[k];
-								if (a) { a.removeAttr(k); }
-							}
-						}
-					}
-				}
-			}
-
-			// add new props
-			if(t[type].li_attr !== undefined && typeof t[type].li_attr === 'object') {
-				for (k in t[type].li_attr) {
-					if (t[type].li_attr.hasOwnProperty(k)) {
-						if (k === 'id') {
-							continue;
-						}
-						else if (m[obj.id].li_attr[k] === undefined) {
-							m[obj.id].li_attr[k] = t[type].li_attr[k];
-							if (d) {
-								if (k === 'class') {
-									d.addClass(t[type].li_attr[k]);
-								}
-								else {
-									d.attr(k, t[type].li_attr[k]);
-								}
-							}
-						}
-						else if (k === 'class') {
-							m[obj.id].li_attr['class'] = t[type].li_attr[k] + ' ' + m[obj.id].li_attr['class'];
-							if (d) { d.addClass(t[type].li_attr[k]); }
-						}
-					}
-				}
-			}
-			if(t[type].a_attr !== undefined && typeof t[type].a_attr === 'object') {
-				for (k in t[type].a_attr) {
-					if (t[type].a_attr.hasOwnProperty(k)) {
-						if (k === 'id') {
-							continue;
-						}
-						else if (m[obj.id].a_attr[k] === undefined) {
-							m[obj.id].a_attr[k] = t[type].a_attr[k];
-							if (a) {
-								if (k === 'class') {
-									a.addClass(t[type].a_attr[k]);
-								}
-								else {
-									a.attr(k, t[type].a_attr[k]);
-								}
-							}
-						}
-						else if (k === 'href' && m[obj.id].a_attr[k] === '#') {
-							m[obj.id].a_attr['href'] = t[type].a_attr['href'];
-							if (a) { a.attr('href', t[type].a_attr['href']); }
-						}
-						else if (k === 'class') {
-							m[obj.id].a_attr['class'] = t[type].a_attr['class'] + ' ' + m[obj.id].a_attr['class'];
-							if (a) { a.addClass(t[type].a_attr[k]); }
-						}
-					}
-				}
-			}
-
-			return true;
-		};
-	};
-	// include the types plugin by default
-	// $.jstree.defaults.plugins.push("types");
-
-
-/**
- * ### Unique plugin
- *
- * Enforces that no nodes with the same name can coexist as siblings.
- */
-
-	/**
-	 * stores all defaults for the unique plugin
-	 * @name $.jstree.defaults.unique
-	 * @plugin unique
-	 */
-	$.jstree.defaults.unique = {
-		/**
-		 * Indicates if the comparison should be case sensitive. Default is `false`.
-		 * @name $.jstree.defaults.unique.case_sensitive
-		 * @plugin unique
-		 */
-		case_sensitive : false,
-		/**
-		 * Indicates if white space should be trimmed before the comparison. Default is `false`.
-		 * @name $.jstree.defaults.unique.trim_whitespace
-		 * @plugin unique
-		 */
-		trim_whitespace : false,
-		/**
-		 * A callback executed in the instance's scope when a new node is created with no name and a node with the default name already exists, the two arguments are the conflicting name and the counter. The default will produce results like `New node (2)`.
-		 * @name $.jstree.defaults.unique.duplicate
-		 * @plugin unique
-		 */
-		duplicate : function (name, counter) {
-			return name + ' (' + counter + ')';
-		}
-	};
-
-	$.jstree.plugins.unique = function (options, parent) {
-		this.check = function (chk, obj, par, pos, more) {
-			if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; }
-			obj = obj && (obj.id || obj.id === 0) ? obj : this.get_node(obj);
-			par = par && (par.id || par.id === 0) ? par : this.get_node(par);
-			if(!par || !par.children) { return true; }
-			var n = chk === "rename_node" ? pos : obj.text,
-				c = [],
-				s = this.settings.unique.case_sensitive,
-				w = this.settings.unique.trim_whitespace,
-				m = this._model.data, i, j, t;
-			for(i = 0, j = par.children.length; i < j; i++) {
-				t = m[par.children[i]].text;
-				if (!s) {
-					t = t.toLowerCase();
-				}
-				if (w) {
-					t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
-				}
-				c.push(t);
-			}
-			if(!s) { n = n.toLowerCase(); }
-			if (w) { n = n.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); }
-			switch(chk) {
-				case "delete_node":
-					return true;
-				case "rename_node":
-					t = obj.text || '';
-					if (!s) {
-						t = t.toLowerCase();
-					}
-					if (w) {
-						t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
-					}
-					i = ($.inArray(n, c) === -1 || (obj.text && t === n));
-					if(!i) {
-						this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_01', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-					}
-					return i;
-				case "create_node":
-					i = ($.inArray(n, c) === -1);
-					if(!i) {
-						this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_04', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-					}
-					return i;
-				case "copy_node":
-					i = ($.inArray(n, c) === -1);
-					if(!i) {
-						this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_02', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-					}
-					return i;
-				case "move_node":
-					i = ( (obj.parent === par.id && (!more || !more.is_multi)) || $.inArray(n, c) === -1);
-					if(!i) {
-						this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_03', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-					}
-					return i;
-			}
-			return true;
-		};
-		this.create_node = function (par, node, pos, callback, is_loaded) {
-			if(!node || (typeof node === 'object' && node.text === undefined)) {
-				if(par === null) {
-					par = $.jstree.root;
-				}
-				par = this.get_node(par);
-				if(!par) {
-					return parent.create_node.call(this, par, node, pos, callback, is_loaded);
-				}
-				pos = pos === undefined ? "last" : pos;
-				if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
-					return parent.create_node.call(this, par, node, pos, callback, is_loaded);
-				}
-				if(!node) { node = {}; }
-				var tmp, n, dpc, i, j, m = this._model.data, s = this.settings.unique.case_sensitive, w = this.settings.unique.trim_whitespace, cb = this.settings.unique.duplicate, t;
-				n = tmp = this.get_string('New node');
-				dpc = [];
-				for(i = 0, j = par.children.length; i < j; i++) {
-					t = m[par.children[i]].text;
-					if (!s) {
-						t = t.toLowerCase();
-					}
-					if (w) {
-						t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
-					}
-					dpc.push(t);
-				}
-				i = 1;
-				t = n;
-				if (!s) {
-					t = t.toLowerCase();
-				}
-				if (w) {
-					t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
-				}
-				while($.inArray(t, dpc) !== -1) {
-					n = cb.call(this, tmp, (++i)).toString();
-					t = n;
-					if (!s) {
-						t = t.toLowerCase();
-					}
-					if (w) {
-						t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
-					}
-				}
-				node.text = n;
-			}
-			return parent.create_node.call(this, par, node, pos, callback, is_loaded);
-		};
-	};
-
-	// include the unique plugin by default
-	// $.jstree.defaults.plugins.push("unique");
-
-
-/**
- * ### Wholerow plugin
- *
- * Makes each node appear block level. Making selection easier. May cause slow down for large trees in old browsers.
- */
-
-	var div = document.createElement('DIV');
-	div.setAttribute('unselectable','on');
-	div.setAttribute('role','presentation');
-	div.className = 'jstree-wholerow';
-	div.innerHTML = '&#160;';
-	$.jstree.plugins.wholerow = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-
-			this.element
-				.on('ready.jstree set_state.jstree', function () {
-						this.hide_dots();
-					}.bind(this))
-				.on("init.jstree loading.jstree ready.jstree", function () {
-						//div.style.height = this._data.core.li_height + 'px';
-						this.get_container_ul().addClass('jstree-wholerow-ul');
-					}.bind(this))
-				.on("deselect_all.jstree", function (e, data) {
-						this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked');
-					}.bind(this))
-				.on("changed.jstree", function (e, data) {
-						this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked');
-						var tmp = false, i, j;
-						for(i = 0, j = data.selected.length; i < j; i++) {
-							tmp = this.get_node(data.selected[i], true);
-							if(tmp && tmp.length) {
-								tmp.children('.jstree-wholerow').addClass('jstree-wholerow-clicked');
-							}
-						}
-					}.bind(this))
-				.on("open_node.jstree", function (e, data) {
-						this.get_node(data.node, true).find('.jstree-clicked').parent().children('.jstree-wholerow').addClass('jstree-wholerow-clicked');
-					}.bind(this))
-				.on("hover_node.jstree dehover_node.jstree", function (e, data) {
-						if(e.type === "hover_node" && this.is_disabled(data.node)) { return; }
-						this.get_node(data.node, true).children('.jstree-wholerow')[e.type === "hover_node"?"addClass":"removeClass"]('jstree-wholerow-hovered');
-					}.bind(this))
-				.on("contextmenu.jstree", ".jstree-wholerow", function (e) {
-						if (this._data.contextmenu) {
-							e.preventDefault();
-							var tmp = $.Event('contextmenu', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey, pageX : e.pageX, pageY : e.pageY });
-							$(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp);
-						}
-					}.bind(this))
-				/*!
-				.on("mousedown.jstree touchstart.jstree", ".jstree-wholerow", function (e) {
-						if(e.target === e.currentTarget) {
-							var a = $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor");
-							e.target = a[0];
-							a.trigger(e);
-						}
-					})
-				*/
-				.on("click.jstree", ".jstree-wholerow", function (e) {
-						e.stopImmediatePropagation();
-						var tmp = $.Event('click', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey });
-						$(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).trigger('focus');
-					})
-				.on("dblclick.jstree", ".jstree-wholerow", function (e) {
-						e.stopImmediatePropagation();
-						var tmp = $.Event('dblclick', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey });
-						$(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).trigger('focus');
-					})
-				.on("click.jstree", ".jstree-leaf > .jstree-ocl", function (e) {
-						e.stopImmediatePropagation();
-						var tmp = $.Event('click', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey });
-						$(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).trigger('focus');
-					}.bind(this))
-				.on("mouseover.jstree", ".jstree-wholerow, .jstree-icon", function (e) {
-						e.stopImmediatePropagation();
-						if(!this.is_disabled(e.currentTarget)) {
-							this.hover_node(e.currentTarget);
-						}
-						return false;
-					}.bind(this))
-				.on("mouseleave.jstree", ".jstree-node", function (e) {
-						this.dehover_node(e.currentTarget);
-					}.bind(this));
-		};
-		this.teardown = function () {
-			if(this.settings.wholerow) {
-				this.element.find(".jstree-wholerow").remove();
-			}
-			parent.teardown.call(this);
-		};
-		this.redraw_node = function(obj, deep, callback, force_render) {
-			obj = parent.redraw_node.apply(this, arguments);
-			if(obj) {
-				var tmp = div.cloneNode(true);
-				//tmp.style.height = this._data.core.li_height + 'px';
-				if($.inArray(obj.id, this._data.core.selected) !== -1) { tmp.className += ' jstree-wholerow-clicked'; }
-				if(this._data.core.focused && this._data.core.focused === obj.id) { tmp.className += ' jstree-wholerow-hovered'; }
-				obj.insertBefore(tmp, obj.childNodes[0]);
-			}
-			return obj;
-		};
-	};
-	// include the wholerow plugin by default
-	// $.jstree.defaults.plugins.push("wholerow");
-	if(window.customElements && Object && Object.create) {
-		var proto = Object.create(HTMLElement.prototype);
-		proto.createdCallback = function () {
-			var c = { core : {}, plugins : [] }, i;
-			for(i in $.jstree.plugins) {
-				if($.jstree.plugins.hasOwnProperty(i) && this.attributes[i]) {
-					c.plugins.push(i);
-					if(this.getAttribute(i) && JSON.parse(this.getAttribute(i))) {
-						c[i] = JSON.parse(this.getAttribute(i));
-					}
-				}
-			}
-			for(i in $.jstree.defaults.core) {
-				if($.jstree.defaults.core.hasOwnProperty(i) && this.attributes[i]) {
-					c.core[i] = JSON.parse(this.getAttribute(i)) || this.getAttribute(i);
-				}
-			}
-			$(this).jstree(c);
-		};
-		// proto.attributeChangedCallback = function (name, previous, value) { };
-		try {
-			window.customElements.define("vakata-jstree", function() {}, { prototype: proto });
-		} catch (ignore) { }
-	}
-
-}));
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/dist/jstree.min.js b/public/ext/vakata-jstree-3.3.17/dist/jstree.min.js
deleted file mode 100644
index ac45ddcd9d..0000000000
--- a/public/ext/vakata-jstree-3.3.17/dist/jstree.min.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! jsTree - v3.3.17 - 2024-09-03 - (MIT) */
-
-!function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):"undefined"!=typeof module&&module.exports?module.exports=e(require("jquery")):e(jQuery)}(function(E,P){"use strict";if(!E.jstree){var s=0,a=!1,n=!1,o=!1,r=[],e=E("script:last").attr("src"),b=window.document,c=window.setImmediate,i=window.Promise;!c&&i&&(c=function(e,t){i.resolve(t).then(e)}),E.jstree={version:"3.3.17",defaults:{plugins:[]},plugins:{},path:e&&-1!==e.indexOf("/")?e.replace(/\/[^\/]+$/,""):"",idregex:/[\\:&!^|()\[\]<>@*'+~#";.,=\- \/${}%?`]/g,root:"#"},E.jstree.create=function(e,i){var r=new E.jstree.core(++s),t=i;return i=E.extend(!0,{},E.jstree.defaults,i),t&&t.plugins&&(i.plugins=t.plugins),E.each(i.plugins,function(e,t){"core"!==e&&(r=r.plugin(t,i[t]))}),E(e).data("jstree",r),r.init(e,i),r},E.jstree.destroy=function(){E(".jstree:jstree").jstree("destroy"),E(b).off(".jstree")},E.jstree.core=function(e){this._id=e,this._cnt=0,this._wrk=null,this._data={core:{themes:{name:!1,dots:!1,icons:!1,ellipsis:!1},selected:[],last_error:{},working:!1,worker_queue:[],focused:null}}},E.jstree.reference=function(t){var i=null,e=null;if(!t||!t.id||t.tagName&&t.nodeType||(t=t.id),!e||!e.length)try{e=E(t)}catch(e){}if(!e||!e.length)try{e=E("#"+t.replace(E.jstree.idregex,"\\$&"))}catch(e){}return e&&e.length&&(e=e.closest(".jstree")).length&&(e=e.data("jstree"))?i=e:E(".jstree").each(function(){var e=E(this).data("jstree");if(e&&e._model.data[t])return i=e,!1}),i},E.fn.jstree=function(i){var r="string"==typeof i,s=Array.prototype.slice.call(arguments,1),a=null;return!(!0===i&&!this.length)&&(this.each(function(){var e=E.jstree.reference(this),t=r&&e?e[i]:null;if(a=r&&t?t.apply(e,s):null,e||r||i!==P&&!E.isPlainObject(i)||E.jstree.create(this,i),null!==(a=e&&!r||!0===i?e||!1:a)&&a!==P)return!1}),null!==a&&a!==P?a:this)},E.expr.pseudos.jstree=E.expr.createPseudo(function(e){return function(e){return E(e).hasClass("jstree")&&E(e).data("jstree")!==P}}),E.jstree.defaults.core={data:!1,strings:!1,check_callback:!1,error:E.noop,animation:200,multiple:!0,themes:{name:!1,url:!1,dir:!1,dots:!0,icons:!0,ellipsis:!1,stripes:!1,variant:!1,responsive:!1},expand_selected_onload:!0,worker:!0,force_text:!1,dblclick_toggle:!0,loaded_state:!1,restore_focus:!0,compute_elements_positions:!1,keyboard:{"ctrl-space":function(e){e.type="click",E(e.currentTarget).trigger(e)},enter:function(e){e.type="click",E(e.currentTarget).trigger(e)},left:function(e){var e;e.preventDefault(),this.is_open(e.currentTarget)?this.close_node(e.currentTarget):(e=this.get_parent(e.currentTarget))&&e.id!==E.jstree.root&&this.get_node(e,!0).children(".jstree-anchor").trigger("focus")},up:function(e){e.preventDefault();var e=this.get_prev_dom(e.currentTarget);e&&e.length&&e.children(".jstree-anchor").trigger("focus")},right:function(e){var e;e.preventDefault(),this.is_closed(e.currentTarget)?this.open_node(e.currentTarget,function(e){this.get_node(e,!0).children(".jstree-anchor").trigger("focus")}):!this.is_open(e.currentTarget)||(e=this.get_node(e.currentTarget,!0).children(".jstree-children")[0])&&E(this._firstChild(e)).children(".jstree-anchor").trigger("focus")},down:function(e){e.preventDefault();var e=this.get_next_dom(e.currentTarget);e&&e.length&&e.children(".jstree-anchor").trigger("focus")},"*":function(e){this.open_all()},home:function(e){e.preventDefault();var e=this._firstChild(this.get_container_ul()[0]);e&&E(e).children(".jstree-anchor").filter(":visible").trigger("focus")},end:function(e){e.preventDefault(),this.element.find(".jstree-anchor").filter(":visible").last().trigger("focus")},f2:function(e){e.preventDefault(),this.edit(e.currentTarget)}},allow_reselect:!1},E.jstree.core.prototype={plugin:function(e,t){var i=E.jstree.plugins[e];return i?(this._data[e]={},i.prototype=this,new i(t,this)):this},init:function(e,t){this._model={data:{},changed:[],force_full_redraw:!1,redraw_timeout:!1,default_state:{loaded:!0,opened:!1,selected:!1,disabled:!1}},this._model.data[E.jstree.root]={id:E.jstree.root,parent:null,parents:[],children:[],children_d:[],state:{loaded:!1}},this.element=E(e).addClass("jstree jstree-"+this._id),this.settings=t,this._data.core.ready=!1,this._data.core.loaded=!1,this._data.core.rtl="rtl"===this.element.css("direction"),this.element[this._data.core.rtl?"addClass":"removeClass"]("jstree-rtl"),this.element.attr("role","tree"),this.settings.core.multiple&&this.element.attr("aria-multiselectable",!0),this.element.attr("tabindex")||this.element.attr("tabindex","0"),this.bind(),this.trigger("init"),this._data.core.original_container_html=this.element.find(" > ul > li").clone(!0),this._data.core.original_container_html.find("li").addBack().contents().filter(function(){return 3===this.nodeType&&(!this.nodeValue||/^\s+$/.test(this.nodeValue))}).remove(),this.element.html("<ul class='jstree-container-ul jstree-children' role='group'><li id='j"+this._id+"_loading' class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='none'><i class='jstree-icon jstree-ocl'></i><a class='jstree-anchor' role='treeitem' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>"+this.get_string("Loading ...")+"</a></li></ul>"),this.element.attr("aria-activedescendant","j"+this._id+"_loading"),this._data.core.li_height=this.get_container_ul().children("li").first().outerHeight()||24,this._data.core.node=this._create_prototype_node(),this.trigger("loading"),this.load_node(E.jstree.root)},destroy:function(e){if(this.trigger("destroy"),this._wrk)try{window.URL.revokeObjectURL(this._wrk),this._wrk=null}catch(e){}e||this.element.empty(),this.teardown()},_create_prototype_node:function(){var e=b.createElement("LI"),t,i;return e.setAttribute("role","none"),(t=b.createElement("I")).className="jstree-icon jstree-ocl",t.setAttribute("role","presentation"),e.appendChild(t),(t=b.createElement("A")).className="jstree-anchor",t.setAttribute("href","#"),t.setAttribute("tabindex","-1"),t.setAttribute("role","treeitem"),(i=b.createElement("I")).className="jstree-icon jstree-themeicon",i.setAttribute("role","presentation"),t.appendChild(i),e.appendChild(t),t=i=null,e},_kbevent_to_func:function(e){var t={8:"Backspace",9:"Tab",13:"Enter",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9","-13":"NumpadEnter",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock",16:"Shift",17:"Ctrl",18:"Alt",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",111:"/",106:"*",173:"-"},i=[];if(e.ctrlKey&&i.push("ctrl"),e.altKey&&i.push("alt"),e.shiftKey&&i.push("shift"),i.push(t[e.which]?t[e.which].toLowerCase():e.which),"shift-shift"===(i=i.sort().join("-").toLowerCase())||"ctrl-ctrl"===i||"alt-alt"===i)return null;var r=this.settings.core.keyboard,s,a;for(s in r)if(r.hasOwnProperty(s)&&(a="-"!==(a=s)&&"+"!==a?(a=a.replace("--","-MINUS").replace("+-","-MINUS").replace("++","-PLUS").replace("-+","-PLUS")).split(/-|\+/).sort().join("-").replace("MINUS","-").replace("PLUS","+").toLowerCase():a)===i)return r[s];return null},teardown:function(){this.unbind(),this.element.removeClass("jstree").removeData("jstree").find("[class^='jstree']").addBack().attr("class",function(){return this.className.replace(/jstree[^ ]*|$/gi,"")}),this.element=null},bind:function(){var s="",a=null,t=0;this.element.on("dblclick.jstree",function(e){if(e.target.tagName&&"input"===e.target.tagName.toLowerCase())return!0;if(b.selection&&b.selection.empty)b.selection.empty();else if(window.getSelection){var e=window.getSelection();try{e.removeAllRanges(),e.collapse()}catch(e){}}}).on("mousedown.jstree",function(e){e.target===this.element[0]&&(e.preventDefault(),t=+new Date)}.bind(this)).on("mousedown.jstree",".jstree-ocl",function(e){e.preventDefault()}).on("click.jstree",".jstree-ocl",function(e){this.toggle_node(e.target)}.bind(this)).on("dblclick.jstree",".jstree-anchor",function(e){if(e.target.tagName&&"input"===e.target.tagName.toLowerCase())return!0;this.settings.core.dblclick_toggle&&this.toggle_node(e.target)}.bind(this)).on("click.jstree",".jstree-anchor",function(e){e.preventDefault(),e.currentTarget!==b.activeElement&&E(e.currentTarget).trigger("focus"),this.activate_node(e.currentTarget,e)}.bind(this)).on("keydown.jstree",".jstree-anchor",function(e){if(e.target.tagName&&"input"===e.target.tagName.toLowerCase())return!0;this._data.core.rtl&&(37===e.which?e.which=39:39===e.which&&(e.which=37));var t=this._kbevent_to_func(e);if(t){var e=t.call(this,e);if(!1===e||!0===e)return e}}.bind(this)).on("load_node.jstree",function(e,t){t.status&&(t.node.id!==E.jstree.root||this._data.core.loaded||(this._data.core.loaded=!0,this._firstChild(this.get_container_ul()[0])&&this.element.attr("aria-activedescendant",this._firstChild(this.get_container_ul()[0]).id),this.trigger("loaded")),this._data.core.ready||setTimeout(function(){if(this.element&&!this.get_container_ul().find(".jstree-loading").length){if(this._data.core.ready=!0,this._data.core.selected.length){if(this.settings.core.expand_selected_onload){for(var e=[],t,i,t=0,i=this._data.core.selected.length;t<i;t++)e=e.concat(this._model.data[this._data.core.selected[t]].parents);for(t=0,i=(e=E.vakata.array_unique(e)).length;t<i;t++)this.open_node(e[t],!1,0)}this.trigger("changed",{action:"ready",selected:this._data.core.selected})}this.trigger("ready")}}.bind(this),0))}.bind(this)).on("keypress.jstree",function(e){if(e.target.tagName&&"input"===e.target.tagName.toLowerCase())return!0;a&&clearTimeout(a),a=setTimeout(function(){s=""},500);var i=String.fromCharCode(e.which).toLowerCase(),t=this.element.find(".jstree-anchor").filter(":visible"),e=t.index(b.activeElement)||0,r=!1;if(1<(s+=i).length){if(t.slice(e).each(function(e,t){if(0===E(t).text().toLowerCase().indexOf(s))return E(t).trigger("focus"),!(r=!0)}.bind(this)),r)return;if(t.slice(0,e).each(function(e,t){if(0===E(t).text().toLowerCase().indexOf(s))return E(t).trigger("focus"),!(r=!0)}.bind(this)),r)return}new RegExp("^"+i.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")+"+$").test(s)&&(t.slice(e+1).each(function(e,t){if(E(t).text().toLowerCase().charAt(0)===i)return E(t).trigger("focus"),!(r=!0)}.bind(this)),r||t.slice(0,e+1).each(function(e,t){if(E(t).text().toLowerCase().charAt(0)===i)return E(t).trigger("focus"),!(r=!0)}.bind(this)))}.bind(this)).on("init.jstree",function(){var e=this.settings.core.themes;this._data.core.themes.dots=e.dots,this._data.core.themes.stripes=e.stripes,this._data.core.themes.icons=e.icons,this._data.core.themes.ellipsis=e.ellipsis,this.set_theme(e.name||"default",e.url),this.set_theme_variant(e.variant)}.bind(this)).on("loading.jstree",function(){this[this._data.core.themes.dots?"show_dots":"hide_dots"](),this[this._data.core.themes.icons?"show_icons":"hide_icons"](),this[this._data.core.themes.stripes?"show_stripes":"hide_stripes"](),this[this._data.core.themes.ellipsis?"show_ellipsis":"hide_ellipsis"]()}.bind(this)).on("blur.jstree",".jstree-anchor",function(e){this._data.core.focused=null,E(e.currentTarget).filter(".jstree-hovered").trigger("mouseleave"),this.element.attr("tabindex","0"),E(e.currentTarget).attr("tabindex","-1")}.bind(this)).on("focus.jstree",".jstree-anchor",function(e){var t=this.get_node(e.currentTarget);t&&(t.id||0===t.id)&&(this._data.core.focused=t.id),this.element.find(".jstree-hovered").not(e.currentTarget).trigger("mouseleave"),E(e.currentTarget).trigger("mouseenter"),this.element.attr("tabindex","-1"),E(e.currentTarget).attr("tabindex","0")}.bind(this)).on("focus.jstree",function(){var e;500<+new Date-t&&!this._data.core.focused&&this.settings.core.restore_focus&&(t=0,(e=this.get_node(this.element.attr("aria-activedescendant"),!0))&&e.find("> .jstree-anchor").trigger("focus"))}.bind(this)).on("mouseenter.jstree",".jstree-anchor",function(e){this.hover_node(e.currentTarget)}.bind(this)).on("mouseleave.jstree",".jstree-anchor",function(e){this.dehover_node(e.currentTarget)}.bind(this))},unbind:function(){this.element.off(".jstree"),E(b).off(".jstree-"+this._id)},trigger:function(e,t){((t=t||{}).instance=this).element.triggerHandler(e.replace(".jstree","")+".jstree",t)},get_container:function(){return this.element},get_container_ul:function(){return this.element.children(".jstree-children").first()},get_string:function(e){var t=this.settings.core.strings;return E.vakata.is_function(t)?t.call(this,e):t&&t[e]?t[e]:e},_firstChild:function(e){e=e?e.firstChild:null;while(null!==e&&1!==e.nodeType)e=e.nextSibling;return e},_nextSibling:function(e){e=e?e.nextSibling:null;while(null!==e&&1!==e.nodeType)e=e.nextSibling;return e},_previousSibling:function(e){e=e?e.previousSibling:null;while(null!==e&&1!==e.nodeType)e=e.previousSibling;return e},get_node:function(e,t){var i;(e=e&&(e.id||0===e.id)?e.id:e)instanceof E&&e.length&&e[0].id&&(e=e[0].id);try{if(this._model.data[e])e=this._model.data[e];else if("string"==typeof e&&this._model.data[e.replace(/^#/,"")])e=this._model.data[e.replace(/^#/,"")];else if("string"==typeof e&&(i=E("#"+e.replace(E.jstree.idregex,"\\$&"),this.element)).length&&this._model.data[i.closest(".jstree-node").attr("id")])e=this._model.data[i.closest(".jstree-node").attr("id")];else if((i=this.element.find(e)).length&&this._model.data[i.closest(".jstree-node").attr("id")])e=this._model.data[i.closest(".jstree-node").attr("id")];else{if(!(i=this.element.find(e)).length||!i.hasClass("jstree"))return!1;e=this._model.data[E.jstree.root]}return e=t?e.id===E.jstree.root?this.element:E("#"+e.id.replace(E.jstree.idregex,"\\$&"),this.element):e}catch(e){return!1}},get_path:function(e,t,i){if(!(e=e.parents?e:this.get_node(e))||e.id===E.jstree.root||!e.parents)return!1;var r,s,a=[];for(a.push(i?e.id:e.text),r=0,s=e.parents.length;r<s;r++)a.push(i?e.parents[r]:this.get_text(e.parents[r]));return a=a.reverse().slice(1),t?a.join(t):a},get_next_dom:function(e,t){var i;if((e=this.get_node(e,!0))[0]===this.element[0]){i=this._firstChild(this.get_container_ul()[0]);while(i&&0===i.offsetHeight)i=this._nextSibling(i);return!!i&&E(i)}if(!e||!e.length)return!1;if(t){i=e[0];do{i=this._nextSibling(i)}while(i&&0===i.offsetHeight);return!!i&&E(i)}if(e.hasClass("jstree-open")){i=this._firstChild(e.children(".jstree-children")[0]);while(i&&0===i.offsetHeight)i=this._nextSibling(i);if(null!==i)return E(i)}i=e[0];do{i=this._nextSibling(i)}while(i&&0===i.offsetHeight);return null!==i?E(i):e.parentsUntil(".jstree",".jstree-node").nextAll(".jstree-node:visible").first()},get_prev_dom:function(e,t){var i;if((e=this.get_node(e,!0))[0]===this.element[0]){i=this.get_container_ul()[0].lastChild;while(i&&0===i.offsetHeight)i=this._previousSibling(i);return!!i&&E(i)}if(!e||!e.length)return!1;if(t){i=e[0];do{i=this._previousSibling(i)}while(i&&0===i.offsetHeight);return!!i&&E(i)}i=e[0];do{i=this._previousSibling(i)}while(i&&0===i.offsetHeight);if(null===i)return!(!(i=e[0].parentNode.parentNode)||!i.className||-1===i.className.indexOf("jstree-node"))&&E(i);e=E(i);while(e.hasClass("jstree-open"))e=e.children(".jstree-children").first().children(".jstree-node:visible:last");return e},get_parent:function(e){return!(!(e=this.get_node(e))||e.id===E.jstree.root)&&e.parent},get_children_dom:function(e){return(e=this.get_node(e,!0))[0]===this.element[0]?this.get_container_ul().children(".jstree-node"):!(!e||!e.length)&&e.children(".jstree-children").children(".jstree-node")},is_parent:function(e){return(e=this.get_node(e))&&(!1===e.state.loaded||0<e.children.length)},is_loaded:function(e){return(e=this.get_node(e))&&e.state.loaded},is_loading:function(e){return(e=this.get_node(e))&&e.state&&e.state.loading},is_open:function(e){return(e=this.get_node(e))&&e.state.opened},is_closed:function(e){return(e=this.get_node(e))&&this.is_parent(e)&&!e.state.opened},is_leaf:function(e){return!this.is_parent(e)},load_node:function(n,o){var e=this.get_node(n,!0),t,i,r,s,a;if(E.vakata.is_array(n))return this._load_nodes(n.slice(),o),!0;if(!(n=this.get_node(n)))return o&&o.call(this,n,!1),!1;if(n.state.loaded){for(n.state.loaded=!1,r=0,s=n.parents.length;r<s;r++)this._model.data[n.parents[r]].children_d=E.vakata.array_filter(this._model.data[n.parents[r]].children_d,function(e){return-1===E.inArray(e,n.children_d)});for(t=0,i=n.children_d.length;t<i;t++)this._model.data[n.children_d[t]].state.selected&&(a=!0),delete this._model.data[n.children_d[t]];a&&(this._data.core.selected=E.vakata.array_filter(this._data.core.selected,function(e){return-1===E.inArray(e,n.children_d)})),n.children=[],n.children_d=[],a&&this.trigger("changed",{action:"load_node",node:n,selected:this._data.core.selected})}return n.state.failed=!1,n.state.loading=!0,(n.id!==E.jstree.root?e.children(".jstree-anchor"):e).attr("aria-busy",!0),e.addClass("jstree-loading"),this._load_node(n,function(e){(n=this._model.data[n.id]).state.loading=!1,n.state.loaded=e,n.state.failed=!n.state.loaded;for(var t=this.get_node(n,!0),i=0,r=0,s=this._model.data,a=!1,i=0,r=n.children.length;i<r;i++)if(s[n.children[i]]&&!s[n.children[i]].state.hidden){a=!0;break}n.state.loaded&&t&&t.length&&(t.removeClass("jstree-closed jstree-open jstree-leaf"),a?"#"!==n.id&&t.addClass(n.state.opened?"jstree-open":"jstree-closed"):t.addClass("jstree-leaf")),(n.id!==E.jstree.root?t.children(".jstree-anchor"):t).attr("aria-busy",!1),t.removeClass("jstree-loading"),this.trigger("load_node",{node:n,status:e}),o&&o.call(this,n,e)}.bind(this)),!0},_load_nodes:function(e,t,i,r){for(var s=!0,a=function(){this._load_nodes(e,t,!0)},n=this._model.data,o,d,c=[],o=0,d=e.length;o<d;o++)n[e[o]]&&(!n[e[o]].state.loaded&&!n[e[o]].state.failed||!i&&r)&&(this.is_loading(e[o])||this.load_node(e[o],a),s=!1);if(s){for(o=0,d=e.length;o<d;o++)n[e[o]]&&n[e[o]].state.loaded&&c.push(e[o]);t&&!t.done&&(t.call(this,c),t.done=!0)}},load_all:function(e,t){if(e=e||E.jstree.root,!(e=this.get_node(e)))return!1;var i=[],r=this._model.data,s=r[e.id].children_d,a,n;for(e.state&&!e.state.loaded&&i.push(e.id),a=0,n=s.length;a<n;a++)r[s[a]]&&r[s[a]].state&&!r[s[a]].state.loaded&&i.push(s[a]);i.length?this._load_nodes(i,function(){this.load_all(e,t)}):(t&&t.call(this,e),this.trigger("load_all",{node:e}))},_load_node:function(s,a){var e=this.settings.core.data,t,n=function e(){return 3!==this.nodeType&&8!==this.nodeType};return e?E.vakata.is_function(e)?e.call(this,s,function(e){!1===e?a.call(this,!1):this["string"==typeof e?"_append_html_data":"_append_json_data"](s,"string"==typeof e?E(E.parseHTML(e)).filter(n):e,function(e){a.call(this,e)})}.bind(this)):"object"==typeof e?e.url?(e=E.extend(!0,{},e),E.vakata.is_function(e.url)&&(e.url=e.url.call(this,s)),E.vakata.is_function(e.data)&&(e.data=e.data.call(this,s)),E.ajax(e).done(function(e,t,i){var r=i.getResponseHeader("Content-Type");return r&&-1!==r.indexOf("json")||"object"==typeof e?this._append_json_data(s,e,function(e){a.call(this,e)}):r&&-1!==r.indexOf("html")||"string"==typeof e?this._append_html_data(s,E(E.parseHTML(e)).filter(n),function(e){a.call(this,e)}):(this._data.core.last_error={error:"ajax",plugin:"core",id:"core_04",reason:"Could not load node",data:JSON.stringify({id:s.id,xhr:i})},this.settings.core.error.call(this,this._data.core.last_error),a.call(this,!1))}.bind(this)).fail(function(e){this._data.core.last_error={error:"ajax",plugin:"core",id:"core_04",reason:"Could not load node",data:JSON.stringify({id:s.id,xhr:e})},a.call(this,!1),this.settings.core.error.call(this,this._data.core.last_error)}.bind(this))):(t=E.vakata.is_array(e)?E.extend(!0,[],e):E.isPlainObject(e)?E.extend(!0,{},e):e,s.id===E.jstree.root?this._append_json_data(s,t,function(e){a.call(this,e)}):(this._data.core.last_error={error:"nodata",plugin:"core",id:"core_05",reason:"Could not load node",data:JSON.stringify({id:s.id})},this.settings.core.error.call(this,this._data.core.last_error),a.call(this,!1))):"string"==typeof e?s.id===E.jstree.root?this._append_html_data(s,E(E.parseHTML(e)).filter(n),function(e){a.call(this,e)}):(this._data.core.last_error={error:"nodata",plugin:"core",id:"core_06",reason:"Could not load node",data:JSON.stringify({id:s.id})},this.settings.core.error.call(this,this._data.core.last_error),a.call(this,!1)):a.call(this,!1):s.id===E.jstree.root?this._append_html_data(s,this._data.core.original_container_html.clone(!0),function(e){a.call(this,e)}):a.call(this,!1)},_node_changed:function(e){(e=this.get_node(e))&&-1===E.inArray(e.id,this._model.changed)&&this._model.changed.push(e.id)},_append_html_data:function(e,t,i){(e=this.get_node(e)).children=[],e.children_d=[];var t=t.is("ul")?t.children():t,r=e.id,s=[],a=[],n=this._model.data,o=n[r],e=this._data.core.selected.length,d,c,l;for(t.each(function(e,t){(d=this._parse_model_from_html(E(t),r,o.parents.concat()))&&(s.push(d),a.push(d),n[d].children_d.length&&(a=a.concat(n[d].children_d)))}.bind(this)),o.children=s,o.children_d=a,c=0,l=o.parents.length;c<l;c++)n[o.parents[c]].children_d=n[o.parents[c]].children_d.concat(a);this.trigger("model",{nodes:a,parent:r}),r!==E.jstree.root?(this._node_changed(r),this.redraw()):(this.get_container_ul().children(".jstree-initial-node").remove(),this.redraw(!0)),this._data.core.selected.length!==e&&this.trigger("changed",{action:"model",selected:this._data.core.selected}),i.call(this,!0)},_append_json_data:function(e,t,d,i){if(null!==this.element){(e=this.get_node(e)).children=[],e.children_d=[],t.d&&"string"==typeof(t=t.d)&&(t=JSON.parse(t)),E.vakata.is_array(t)||(t=[t]);var r=null,s={df:this._model.default_state,dat:t,par:e.id,m:this._model.data,t_id:this._id,t_cnt:this._cnt,sel:this._data.core.selected},v=this,a=function(e,c){var t=(e=e.data?e.data:e).dat,i=e.par,r=[],s=[],l=[],h=e.df,_=e.t_id,g=e.t_cnt,u=e.m,a=u[i],e=e.sel,n,o,d,f,p=function(e,t,i){i=i?i.concat():[],t&&i.unshift(t);var r=e.id.toString(),s,a,n,o,d={id:r,text:e.text||"",icon:e.icon===c||e.icon,parent:t,parents:i,children:e.children||[],children_d:e.children_d||[],data:e.data,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1};for(s in h)h.hasOwnProperty(s)&&(d.state[s]=h[s]);if(e&&e.data&&e.data.jstree&&e.data.jstree.icon&&(d.icon=e.data.jstree.icon),d.icon!==c&&null!==d.icon&&""!==d.icon||(d.icon=!0),e&&e.data&&(d.data=e.data,e.data.jstree))for(s in e.data.jstree)e.data.jstree.hasOwnProperty(s)&&(d.state[s]=e.data.jstree[s]);if(e&&"object"==typeof e.state)for(s in e.state)e.state.hasOwnProperty(s)&&(d.state[s]=e.state[s]);if(e&&"object"==typeof e.li_attr)for(s in e.li_attr)e.li_attr.hasOwnProperty(s)&&(d.li_attr[s]=e.li_attr[s]);if(d.li_attr.id||(d.li_attr.id=r),e&&"object"==typeof e.a_attr)for(s in e.a_attr)e.a_attr.hasOwnProperty(s)&&(d.a_attr[s]=e.a_attr[s]);for(e&&e.children&&!0===e.children&&(d.state.loaded=!1,d.children=[],d.children_d=[]),s=0,a=(u[d.id]=d).children.length;s<a;s++)n=p(u[d.children[s]],d.id,i),o=u[n],d.children_d.push(n),o.children_d.length&&(d.children_d=d.children_d.concat(o.children_d));return delete e.data,delete e.children,u[d.id].original=e,d.state.selected&&l.push(d.id),d.id},m=function(e,t,i){i=i?i.concat():[],t&&i.unshift(t);var r=!1,s,a,n,o,d;do{r="j"+_+"_"+ ++g}while(u[r]);for(s in d={id:!1,text:"string"==typeof e?e:"",icon:"object"!=typeof e||e.icon===c||e.icon,parent:t,parents:i,children:[],children_d:[],data:null,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1},h)h.hasOwnProperty(s)&&(d.state[s]=h[s]);if(e&&(e.id||0===e.id)&&(d.id=e.id.toString()),e&&e.text&&(d.text=e.text),e&&e.data&&e.data.jstree&&e.data.jstree.icon&&(d.icon=e.data.jstree.icon),d.icon!==c&&null!==d.icon&&""!==d.icon||(d.icon=!0),e&&e.data&&(d.data=e.data,e.data.jstree))for(s in e.data.jstree)e.data.jstree.hasOwnProperty(s)&&(d.state[s]=e.data.jstree[s]);if(e&&"object"==typeof e.state)for(s in e.state)e.state.hasOwnProperty(s)&&(d.state[s]=e.state[s]);if(e&&"object"==typeof e.li_attr)for(s in e.li_attr)e.li_attr.hasOwnProperty(s)&&(d.li_attr[s]=e.li_attr[s]);if(d.li_attr.id&&!d.id&&0!==d.id&&(d.id=d.li_attr.id.toString()),d.id||0===d.id||(d.id=r),d.li_attr.id||(d.li_attr.id=d.id),e&&"object"==typeof e.a_attr)for(s in e.a_attr)e.a_attr.hasOwnProperty(s)&&(d.a_attr[s]=e.a_attr[s]);if(e&&e.children&&e.children.length){for(s=0,a=e.children.length;s<a;s++)n=m(e.children[s],d.id,i),o=u[n],d.children.push(n),o.children_d.length&&(d.children_d=d.children_d.concat(o.children_d));d.children_d=d.children_d.concat(d.children)}return e&&e.children&&!0===e.children&&(d.state.loaded=!1,d.children=[],d.children_d=[]),delete e.data,delete e.children,d.original=e,(u[d.id]=d).state.selected&&l.push(d.id),d.id};if(t.length&&t[0].id!==c&&t[0].parent!==c){for(o=0,d=t.length;o<d;o++)t[o].children||(t[o].children=[]),t[o].state||(t[o].state={}),u[t[o].id.toString()]=t[o];for(o=0,d=t.length;o<d;o++)u[t[o].parent.toString()]?(u[t[o].parent.toString()].children.push(t[o].id.toString()),a.children_d.push(t[o].id.toString())):void 0!==v&&(v._data.core.last_error={error:"parse",plugin:"core",id:"core_07",reason:"Node with invalid parent",data:JSON.stringify({id:t[o].id.toString(),parent:t[o].parent.toString()})},v.settings.core.error.call(v,v._data.core.last_error));for(o=0,d=a.children.length;o<d;o++)n=p(u[a.children[o]],i,a.parents.concat()),s.push(n),u[n].children_d.length&&(s=s.concat(u[n].children_d));for(o=0,d=a.parents.length;o<d;o++)u[a.parents[o]].children_d=u[a.parents[o]].children_d.concat(s);f={cnt:g,mod:u,sel:e,par:i,dpc:s,add:l}}else{for(o=0,d=t.length;o<d;o++)(n=m(t[o],i,a.parents.concat()))&&(r.push(n),s.push(n),u[n].children_d.length&&(s=s.concat(u[n].children_d)));for(a.children=r,a.children_d=s,o=0,d=a.parents.length;o<d;o++)u[a.parents[o]].children_d=u[a.parents[o]].children_d.concat(s);f={cnt:g,mod:u,sel:e,par:i,dpc:s,add:l}}if("undefined"!=typeof window&&void 0!==window.document)return f;postMessage(f)},n=function(e,t){if(null!==this.element){var i,r;for(i in this._cnt=e.cnt,r=this._model.data)r.hasOwnProperty(i)&&r[i].state&&r[i].state.loading&&e.mod[i]&&(e.mod[i].state.loading=!0);if(this._model.data=e.mod,t){var s,a=e.add,n=e.sel,o=this._data.core.selected.slice(),r=this._model.data;if(n.length!==o.length||E.vakata.array_unique(n.concat(o)).length!==n.length){for(i=0,s=n.length;i<s;i++)-1===E.inArray(n[i],a)&&-1===E.inArray(n[i],o)&&(r[n[i]].state.selected=!1);for(i=0,s=o.length;i<s;i++)-1===E.inArray(o[i],n)&&(r[o[i]].state.selected=!0)}}e.add.length&&(this._data.core.selected=this._data.core.selected.concat(e.add)),this.trigger("model",{nodes:e.dpc,parent:e.par}),e.par!==E.jstree.root?(this._node_changed(e.par),this.redraw()):this.redraw(!0),e.add.length&&this.trigger("changed",{action:"model",selected:this._data.core.selected}),!t&&c?c(function(){d.call(v,!0)}):d.call(v,!0)}};if(this.settings.core.worker&&window.Blob&&window.URL&&window.Worker)try{null===this._wrk&&(this._wrk=window.URL.createObjectURL(new window.Blob(["self.onmessage = "+a.toString()],{type:"text/javascript"}))),!this._data.core.working||i?(this._data.core.working=!0,(r=new window.Worker(this._wrk)).onmessage=function(e){n.call(this,e.data,!0);try{r.terminate(),r=null}catch(e){}this._data.core.worker_queue.length?this._append_json_data.apply(this,this._data.core.worker_queue.shift()):this._data.core.working=!1}.bind(this),r.onerror=function(e){n.call(this,a(s),!1),this._data.core.worker_queue.length?this._append_json_data.apply(this,this._data.core.worker_queue.shift()):this._data.core.working=!1}.bind(this),s.par?r.postMessage(s):this._data.core.worker_queue.length?this._append_json_data.apply(this,this._data.core.worker_queue.shift()):this._data.core.working=!1):this._data.core.worker_queue.push([e,t,d,!0])}catch(e){n.call(this,a(s),!1),this._data.core.worker_queue.length?this._append_json_data.apply(this,this._data.core.worker_queue.shift()):this._data.core.working=!1}else n.call(this,a(s),!1)}},_parse_model_from_html:function(e,t,i){i=i?[].concat(i):[],t&&i.unshift(t);var r,s,a=this._model.data,n={id:!1,text:!1,icon:!0,parent:t,parents:i,children:[],children_d:[],data:null,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1},o,t,d;for(o in this._model.default_state)this._model.default_state.hasOwnProperty(o)&&(n.state[o]=this._model.default_state[o]);if(t=E.vakata.attributes(e,!0),E.each(t,function(e,t){return!(t=E.vakata.trim(t)).length||(n.li_attr[e]=t,void("id"===e&&(n.id=t.toString())))}),(t=e.children("a").first()).length&&(t=E.vakata.attributes(t,!0),E.each(t,function(e,t){(t=E.vakata.trim(t)).length&&(n.a_attr[e]=t)})),(t=(e.children("a").first().length?e.children("a").first():e).clone()).children("ins, i, ul").remove(),t=t.html(),t=E("<div></div>").html(t),n.text=this.settings.core.force_text?t.text():t.html(),t=e.data(),n.data=t?E.extend(!0,{},t):null,n.state.opened=e.hasClass("jstree-open"),n.state.selected=e.children("a").hasClass("jstree-clicked"),n.state.disabled=e.children("a").hasClass("jstree-disabled"),n.data&&n.data.jstree)for(o in n.data.jstree)n.data.jstree.hasOwnProperty(o)&&(n.state[o]=n.data.jstree[o]);(t=e.children("a").children(".jstree-themeicon")).length&&(n.icon=!t.hasClass("jstree-themeicon-hidden")&&t.attr("rel")),n.state.icon!==P&&(n.icon=n.state.icon),n.icon!==P&&null!==n.icon&&""!==n.icon||(n.icon=!0),t=e.children("ul").children("li");do{d="j"+this._id+"_"+ ++this._cnt}while(a[d]);return n.id=n.li_attr.id?n.li_attr.id.toString():d,t.length?(t.each(function(e,t){r=this._parse_model_from_html(E(t),n.id,i),s=this._model.data[r],n.children.push(r),s.children_d.length&&(n.children_d=n.children_d.concat(s.children_d))}.bind(this)),n.children_d=n.children_d.concat(n.children)):e.hasClass("jstree-closed")&&(n.state.loaded=!1),n.li_attr.class&&(n.li_attr.class=n.li_attr.class.replace("jstree-closed","").replace("jstree-open","")),n.a_attr.class&&(n.a_attr.class=n.a_attr.class.replace("jstree-clicked","").replace("jstree-disabled","")),(a[n.id]=n).state.selected&&this._data.core.selected.push(n.id),n.id},_parse_model_from_flat_json:function(e,t,i){i=i?i.concat():[],t&&i.unshift(t);var r=e.id.toString(),s=this._model.data,a=this._model.default_state,n,o,d,c,l={id:r,text:e.text||"",icon:e.icon===P||e.icon,parent:t,parents:i,children:e.children||[],children_d:e.children_d||[],data:e.data,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1};for(n in a)a.hasOwnProperty(n)&&(l.state[n]=a[n]);if(e&&e.data&&e.data.jstree&&e.data.jstree.icon&&(l.icon=e.data.jstree.icon),l.icon!==P&&null!==l.icon&&""!==l.icon||(l.icon=!0),e&&e.data&&(l.data=e.data,e.data.jstree))for(n in e.data.jstree)e.data.jstree.hasOwnProperty(n)&&(l.state[n]=e.data.jstree[n]);if(e&&"object"==typeof e.state)for(n in e.state)e.state.hasOwnProperty(n)&&(l.state[n]=e.state[n]);if(e&&"object"==typeof e.li_attr)for(n in e.li_attr)e.li_attr.hasOwnProperty(n)&&(l.li_attr[n]=e.li_attr[n]);if(l.li_attr.id||(l.li_attr.id=r),e&&"object"==typeof e.a_attr)for(n in e.a_attr)e.a_attr.hasOwnProperty(n)&&(l.a_attr[n]=e.a_attr[n]);for(e&&e.children&&!0===e.children&&(l.state.loaded=!1,l.children=[],l.children_d=[]),n=0,o=(s[l.id]=l).children.length;n<o;n++)c=s[d=this._parse_model_from_flat_json(s[l.children[n]],l.id,i)],l.children_d.push(d),c.children_d.length&&(l.children_d=l.children_d.concat(c.children_d));return delete e.data,delete e.children,s[l.id].original=e,l.state.selected&&this._data.core.selected.push(l.id),l.id},_parse_model_from_json:function(e,t,i){i=i?i.concat():[],t&&i.unshift(t);var r=!1,s,a,n,o,d=this._model.data,c=this._model.default_state,l;do{r="j"+this._id+"_"+ ++this._cnt}while(d[r]);for(s in l={id:!1,text:"string"==typeof e?e:"",icon:"object"!=typeof e||e.icon===P||e.icon,parent:t,parents:i,children:[],children_d:[],data:null,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1},c)c.hasOwnProperty(s)&&(l.state[s]=c[s]);if(e&&(e.id||0===e.id)&&(l.id=e.id.toString()),e&&e.text&&(l.text=e.text),e&&e.data&&e.data.jstree&&e.data.jstree.icon&&(l.icon=e.data.jstree.icon),l.icon!==P&&null!==l.icon&&""!==l.icon||(l.icon=!0),e&&e.data&&(l.data=e.data,e.data.jstree))for(s in e.data.jstree)e.data.jstree.hasOwnProperty(s)&&(l.state[s]=e.data.jstree[s]);if(e&&"object"==typeof e.state)for(s in e.state)e.state.hasOwnProperty(s)&&(l.state[s]=e.state[s]);if(e&&"object"==typeof e.li_attr)for(s in e.li_attr)e.li_attr.hasOwnProperty(s)&&(l.li_attr[s]=e.li_attr[s]);if(l.li_attr.id&&!l.id&&0!==l.id&&(l.id=l.li_attr.id.toString()),l.id||0===l.id||(l.id=r),l.li_attr.id||(l.li_attr.id=l.id),e&&"object"==typeof e.a_attr)for(s in e.a_attr)e.a_attr.hasOwnProperty(s)&&(l.a_attr[s]=e.a_attr[s]);if(e&&e.children&&e.children.length){for(s=0,a=e.children.length;s<a;s++)o=d[n=this._parse_model_from_json(e.children[s],l.id,i)],l.children.push(n),o.children_d.length&&(l.children_d=l.children_d.concat(o.children_d));l.children_d=l.children.concat(l.children_d)}return e&&e.children&&!0===e.children&&(l.state.loaded=!1,l.children=[],l.children_d=[]),delete e.data,delete e.children,l.original=e,(d[l.id]=l).state.selected&&this._data.core.selected.push(l.id),l.id},_redraw:function(){for(var e=(this._model.force_full_redraw?this._model.data[E.jstree.root].children:this._model.changed).concat([]),t=b.createElement("UL"),i,r,s,a=this._data.core.focused,r=0,s=e.length;r<s;r++)(i=this.redraw_node(e[r],!0,this._model.force_full_redraw))&&this._model.force_full_redraw&&t.appendChild(i);this._model.force_full_redraw&&(t.className=this.get_container_ul()[0].className,t.setAttribute("role","presentation"),this.element.empty().append(t)),null!==a&&this.settings.core.restore_focus&&((i=this.get_node(a,!0))&&i.length&&i.children(".jstree-anchor")[0]!==b.activeElement?i.children(".jstree-anchor").trigger("focus"):this._data.core.focused=null),this._model.force_full_redraw=!1,this._model.changed=[],this.trigger("redraw",{nodes:e})},redraw:function(e){e&&(this._model.force_full_redraw=!0),this._redraw()},draw_children:function(e){var t=this.get_node(e),i=!1,r=!1,s=!1,a=b;if(!t)return!1;if(t.id===E.jstree.root)return this.redraw(!0);if(!(e=this.get_node(e,!0))||!e.length)return!1;if(e.children(".jstree-children").remove(),e=e[0],t.children.length&&t.state.loaded){for((s=a.createElement("UL")).setAttribute("role","group"),s.className="jstree-children",i=0,r=t.children.length;i<r;i++)s.appendChild(this.redraw_node(t.children[i],!0,!0));e.appendChild(s)}},redraw_node:function(e,t,i,r){var s=this.get_node(e),a=!1,n=!1,o=!1,d=!1,c=!1,l=!1,h="",_=b,g=this._model.data,u=!1,f=!1,p=null,m=0,v=0,j=!1,k=!1;if(!s)return!1;if(s.id===E.jstree.root)return this.redraw(!0);if(t=t||0===s.children.length,e=b.querySelector?this.element[0].querySelector("#"+(-1!=="0123456789".indexOf(s.id[0])?"\\3"+s.id[0]+" "+s.id.substr(1).replace(E.jstree.idregex,"\\$&"):s.id.replace(E.jstree.idregex,"\\$&"))):b.getElementById(s.id))e=E(e),i||((a=e.parent().parent()[0])===this.element[0]&&(a=null),n=e.index()),(t=!t&&s.children.length&&!e.children(".jstree-children").length?!0:t)||(o=e.children(".jstree-children")[0]),u=e.children(".jstree-anchor")[0]===b.activeElement,e.remove();else if(t=!0,!i){if(!(null===(a=s.parent!==E.jstree.root?E("#"+s.parent.replace(E.jstree.idregex,"\\$&"),this.element)[0]:null)||a&&g[s.parent].state.opened))return!1;n=E.inArray(s.id,(null===a?g[E.jstree.root]:g[s.parent]).children)}for(d in e=this._data.core.node.cloneNode(!0),h="jstree-node ",s.li_attr)s.li_attr.hasOwnProperty(d)&&"id"!==d&&("class"!==d?e.setAttribute(d,s.li_attr[d]):h+=s.li_attr[d]);for(s.a_attr.id||(s.a_attr.id=s.id+"_anchor"),e.childNodes[1].setAttribute("aria-selected",!!s.state.selected),e.childNodes[1].setAttribute("aria-level",s.parents.length),this.settings.core.compute_elements_positions&&(e.childNodes[1].setAttribute("aria-setsize",g[s.parent].children.length),e.childNodes[1].setAttribute("aria-posinset",g[s.parent].children.indexOf(s.id)+1)),s.state.disabled&&e.childNodes[1].setAttribute("aria-disabled",!0),d=0,c=s.children.length;d<c;d++)if(!g[s.children[d]].state.hidden){j=!0;break}if(null!==s.parent&&g[s.parent]&&!s.state.hidden&&(d=E.inArray(s.id,g[s.parent].children),k=s.id,-1!==d))for(d++,c=g[s.parent].children.length;d<c;d++)if((k=!g[g[s.parent].children[d]].state.hidden?g[s.parent].children[d]:k)!==s.id)break;for(c in s.state.hidden&&(h+=" jstree-hidden"),s.state.loading&&(h+=" jstree-loading"),s.state.loaded&&!j?h+=" jstree-leaf":(h+=s.state.opened&&s.state.loaded?" jstree-open":" jstree-closed",e.childNodes[1].setAttribute("aria-expanded",s.state.opened&&s.state.loaded)),k===s.id&&(h+=" jstree-last"),e.id=s.id,e.className=h,h=(s.state.selected?" jstree-clicked":"")+(s.state.disabled?" jstree-disabled":""),s.a_attr)s.a_attr.hasOwnProperty(c)&&("href"===c&&"#"===s.a_attr[c]||("class"!==c?e.childNodes[1].setAttribute(c,s.a_attr[c]):h+=" "+s.a_attr[c]));if(h.length&&(e.childNodes[1].className="jstree-anchor "+h),(s.icon&&!0!==s.icon||!1===s.icon)&&(!1===s.icon?e.childNodes[1].childNodes[0].className+=" jstree-themeicon-hidden":-1===s.icon.indexOf("/")&&-1===s.icon.indexOf(".")?e.childNodes[1].childNodes[0].className+=" "+s.icon+" jstree-themeicon-custom":(e.childNodes[1].childNodes[0].style.backgroundImage='url("'+s.icon+'")',e.childNodes[1].childNodes[0].style.backgroundPosition="center center",e.childNodes[1].childNodes[0].style.backgroundSize="auto",e.childNodes[1].childNodes[0].className+=" jstree-themeicon-custom")),this.settings.core.force_text?e.childNodes[1].appendChild(_.createTextNode(s.text)):e.childNodes[1].innerHTML+=s.text,t&&s.children.length&&(s.state.opened||r)&&s.state.loaded){for((l=_.createElement("UL")).setAttribute("role","group"),l.className="jstree-children",d=0,c=s.children.length;d<c;d++)l.appendChild(this.redraw_node(s.children[d],t,!0));e.appendChild(l)}if(o&&e.appendChild(o),!i){for(d=0,c=(a=a||this.element[0]).childNodes.length;d<c;d++)if(a.childNodes[d]&&a.childNodes[d].className&&-1!==a.childNodes[d].className.indexOf("jstree-children")){p=a.childNodes[d];break}p||((p=_.createElement("UL")).setAttribute("role","group"),p.className="jstree-children",a.appendChild(p)),n<(a=p).childNodes.length?a.insertBefore(e,a.childNodes[n]):a.appendChild(e),u&&(m=this.element[0].scrollTop,v=this.element[0].scrollLeft,e.childNodes[1].focus(),this.element[0].scrollTop=m,this.element[0].scrollLeft=v)}return s.state.opened&&!s.state.loaded&&(s.state.opened=!1,setTimeout(function(){this.open_node(s.id,!1,0)}.bind(this),0)),e},open_node:function(e,i,r){var t,s,a,n;if(E.vakata.is_array(e)){for(t=0,s=(e=e.slice()).length;t<s;t++)this.open_node(e[t],i,r);return!0}return!(!(e=this.get_node(e))||e.id===E.jstree.root)&&(r=r===P?this.settings.core.animation:r,this.is_closed(e)?this.is_loaded(e)?(a=this.get_node(e,!0),n=this,a.length&&(r&&a.children(".jstree-children").length&&a.children(".jstree-children").stop(!0,!0),e.children.length&&!this._firstChild(a.children(".jstree-children")[0])&&this.draw_children(e),r?(this.trigger("before_open",{node:e}),a.children(".jstree-children").css("display","none").end().removeClass("jstree-closed").addClass("jstree-open").children(".jstree-anchor").attr("aria-expanded",!0).end().children(".jstree-children").stop(!0,!0).slideDown(r,function(){this.style.display="",n.element&&n.trigger("after_open",{node:e})})):(this.trigger("before_open",{node:e}),a[0].className=a[0].className.replace("jstree-closed","jstree-open"),a[0].childNodes[1].setAttribute("aria-expanded",!0))),e.state.opened=!0,i&&i.call(this,e,!0),a.length||this.trigger("before_open",{node:e}),this.trigger("open_node",{node:e}),r&&a.length||this.trigger("after_open",{node:e}),!0):this.is_loading(e)?setTimeout(function(){this.open_node(e,i,r)}.bind(this),500):void this.load_node(e,function(e,t){return t?this.open_node(e,i,r):!!i&&i.call(this,e,!1)}):(i&&i.call(this,e,!1),!1))},_open_to:function(e){if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;for(var t,i,r=e.parents,t=0,i=r.length;t<i;t+=1)t!==E.jstree.root&&this.open_node(r[t],!1,0);return E("#"+e.id.replace(E.jstree.idregex,"\\$&"),this.element)},close_node:function(e,t){var i,r,s,a;if(E.vakata.is_array(e)){for(i=0,r=(e=e.slice()).length;i<r;i++)this.close_node(e[i],t);return!0}return!(!(e=this.get_node(e))||e.id===E.jstree.root)&&(!this.is_closed(e)&&(t=t===P?this.settings.core.animation:t,a=(s=this).get_node(e,!0),e.state.opened=!1,this.trigger("close_node",{node:e}),void(a.length?t?a.children(".jstree-children").attr("style","display:block !important").end().removeClass("jstree-open").addClass("jstree-closed").children(".jstree-anchor").attr("aria-expanded",!1).end().children(".jstree-children").stop(!0,!0).slideUp(t,function(){this.style.display="",a.children(".jstree-children").remove(),s.element&&s.trigger("after_close",{node:e})}):(a[0].className=a[0].className.replace("jstree-open","jstree-closed"),a.children(".jstree-anchor").attr("aria-expanded",!1),a.children(".jstree-children").remove(),this.trigger("after_close",{node:e})):this.trigger("after_close",{node:e}))))},toggle_node:function(e){var t,i;if(E.vakata.is_array(e)){for(t=0,i=(e=e.slice()).length;t<i;t++)this.toggle_node(e[t]);return!0}return this.is_closed(e)?this.open_node(e):this.is_open(e)?this.close_node(e):void 0},open_all:function(e,i,r){if(e=e||E.jstree.root,!(e=this.get_node(e)))return!1;var t=e.id===E.jstree.root?this.get_container_ul():this.get_node(e,!0),s,a,n;if(!t.length){for(s=0,a=e.children_d.length;s<a;s++)this.is_closed(this._model.data[e.children_d[s]])&&(this._model.data[e.children_d[s]].state.opened=!0);return this.trigger("open_all",{node:e})}r=r||t,(t=(n=this).is_closed(e)?t.find(".jstree-closed").addBack():t.find(".jstree-closed")).each(function(){n.open_node(this,function(e,t){t&&this.is_parent(e)&&this.open_all(e,i,r)},i||0)}),0===r.find(".jstree-closed").length&&this.trigger("open_all",{node:this.get_node(r)})},close_all:function(e,t){if(e=e||E.jstree.root,!(e=this.get_node(e)))return!1;var i=e.id===E.jstree.root?this.get_container_ul():this.get_node(e,!0),r=this,s,a;for(i.length&&(i=this.is_open(e)?i.find(".jstree-open").addBack():i.find(".jstree-open"),E(i.get().reverse()).each(function(){r.close_node(this,t||0)})),s=0,a=e.children_d.length;s<a;s++)this._model.data[e.children_d[s]].state.opened=!1;this.trigger("close_all",{node:e})},is_disabled:function(e){return(e=this.get_node(e))&&e.state&&e.state.disabled},enable_node:function(e){var t,i;if(E.vakata.is_array(e)){for(t=0,i=(e=e.slice()).length;t<i;t++)this.enable_node(e[t]);return!0}if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;e.state.disabled=!1,this.get_node(e,!0).children(".jstree-anchor").removeClass("jstree-disabled").attr("aria-disabled",!1),this.trigger("enable_node",{node:e})},disable_node:function(e){var t,i;if(E.vakata.is_array(e)){for(t=0,i=(e=e.slice()).length;t<i;t++)this.disable_node(e[t]);return!0}if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;e.state.disabled=!0,this.get_node(e,!0).children(".jstree-anchor").addClass("jstree-disabled").attr("aria-disabled",!0),this.trigger("disable_node",{node:e})},is_hidden:function(e){return!0===(e=this.get_node(e)).state.hidden},hide_node:function(e,t){var i,r;if(E.vakata.is_array(e)){for(i=0,r=(e=e.slice()).length;i<r;i++)this.hide_node(e[i],!0);return t||this.redraw(),!0}if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;e.state.hidden||(e.state.hidden=!0,this._node_changed(e.parent),t||this.redraw(),this.trigger("hide_node",{node:e}))},show_node:function(e,t){var i,r;if(E.vakata.is_array(e)){for(i=0,r=(e=e.slice()).length;i<r;i++)this.show_node(e[i],!0);return t||this.redraw(),!0}if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;e.state.hidden&&(e.state.hidden=!1,this._node_changed(e.parent),t||this.redraw(),this.trigger("show_node",{node:e}))},hide_all:function(e){var t,i=this._model.data,r=[];for(t in i)i.hasOwnProperty(t)&&t!==E.jstree.root&&!i[t].state.hidden&&(i[t].state.hidden=!0,r.push(t));return this._model.force_full_redraw=!0,e||this.redraw(),this.trigger("hide_all",{nodes:r}),r},show_all:function(e){var t,i=this._model.data,r=[];for(t in i)i.hasOwnProperty(t)&&t!==E.jstree.root&&i[t].state.hidden&&(i[t].state.hidden=!1,r.push(t));return this._model.force_full_redraw=!0,e||this.redraw(),this.trigger("show_all",{nodes:r}),r},activate_node:function(e,t){if(this.is_disabled(e))return!1;if(t&&"object"==typeof t||(t={}),this._data.core.last_clicked=this._data.core.last_clicked&&this._data.core.last_clicked.id!==P?this.get_node(this._data.core.last_clicked.id):null,this._data.core.last_clicked&&!this._data.core.last_clicked.state.selected&&(this._data.core.last_clicked=null),!this._data.core.last_clicked&&this._data.core.selected.length&&(this._data.core.last_clicked=this.get_node(this._data.core.selected[this._data.core.selected.length-1])),this.settings.core.multiple&&(t.metaKey||t.ctrlKey||t.shiftKey)&&(!t.shiftKey||this._data.core.last_clicked&&this.get_parent(e)&&this.get_parent(e)===this._data.core.last_clicked.parent))if(t.shiftKey){for(var i=this.get_node(e).id,r=this._data.core.last_clicked.id,s=this.get_node(this._data.core.last_clicked.parent).children,a=!1,n,o,n=0,o=s.length;n<o;n+=1)s[n]===i&&(a=!a),s[n]===r&&(a=!a),this.is_disabled(s[n])||!a&&s[n]!==i&&s[n]!==r?t.ctrlKey||this.deselect_node(s[n],!0,t):this.is_hidden(s[n])||this.select_node(s[n],!0,!1,t);this.trigger("changed",{action:"select_node",node:this.get_node(e),selected:this._data.core.selected,event:t})}else this.is_selected(e)?this.deselect_node(e,!1,t):(t.ctrlKey&&(this._data.core.last_clicked=this.get_node(e)),this.select_node(e,!1,!1,t));else!this.settings.core.multiple&&(t.metaKey||t.ctrlKey||t.shiftKey)&&this.is_selected(e)?this.deselect_node(e,!1,t):(!this.settings.core.allow_reselect&&this.is_selected(e)&&1===this._data.core.selected.length||(this.deselect_all(!0),this.select_node(e,!1,!1,t)),this._data.core.last_clicked=this.get_node(e));this.trigger("activate_node",{node:this.get_node(e),event:t})},hover_node:function(e){if(!(e=this.get_node(e,!0))||!e.length||e.children(".jstree-hovered").length)return!1;var t=this.element.find(".jstree-hovered"),i=this.element;t&&t.length&&this.dehover_node(t),e.children(".jstree-anchor").addClass("jstree-hovered"),this.trigger("hover_node",{node:this.get_node(e)}),setTimeout(function(){i.attr("aria-activedescendant",e[0].id)},0)},dehover_node:function(e){if(!(e=this.get_node(e,!0))||!e.length||!e.children(".jstree-hovered").length)return!1;e.children(".jstree-anchor").removeClass("jstree-hovered"),this.trigger("dehover_node",{node:this.get_node(e)})},select_node:function(e,t,i,r){var s,a,n,o;if(E.vakata.is_array(e)){for(a=0,n=(e=e.slice()).length;a<n;a++)this.select_node(e[a],t,i,r);return!0}if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;s=this.get_node(e,!0),e.state.selected||(e.state.selected=!0,this._data.core.selected.push(e.id),(s=!i?this._open_to(e):s)&&s.length&&s.children(".jstree-anchor").addClass("jstree-clicked").attr("aria-selected",!0),this.trigger("select_node",{node:e,selected:this._data.core.selected,event:r}),t||this.trigger("changed",{action:"select_node",node:e,selected:this._data.core.selected,event:r}))},deselect_node:function(e,t,i){var r,s,a;if(E.vakata.is_array(e)){for(r=0,s=(e=e.slice()).length;r<s;r++)this.deselect_node(e[r],t,i);return!0}if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;a=this.get_node(e,!0),e.state.selected&&(e.state.selected=!1,this._data.core.selected=E.vakata.array_remove_item(this._data.core.selected,e.id),a.length&&a.children(".jstree-anchor").removeClass("jstree-clicked").attr("aria-selected",!1),this.trigger("deselect_node",{node:e,selected:this._data.core.selected,event:i}),t||this.trigger("changed",{action:"deselect_node",node:e,selected:this._data.core.selected,event:i}))},select_all:function(e){var t=this._data.core.selected.concat([]),i,r;for(this._data.core.selected=this._model.data[E.jstree.root].children_d.concat(),i=0,r=this._data.core.selected.length;i<r;i++)this._model.data[this._data.core.selected[i]]&&(this._model.data[this._data.core.selected[i]].state.selected=!0);this.redraw(!0),this.trigger("select_all",{selected:this._data.core.selected}),e||this.trigger("changed",{action:"select_all",selected:this._data.core.selected,old_selection:t})},deselect_all:function(e){for(var t=this._data.core.selected.concat([]),i,r,i=0,r=this._data.core.selected.length;i<r;i++)this._model.data[this._data.core.selected[i]]&&(this._model.data[this._data.core.selected[i]].state.selected=!1);this._data.core.selected=[],this.element.find(".jstree-clicked").removeClass("jstree-clicked").attr("aria-selected",!1),this.trigger("deselect_all",{selected:this._data.core.selected,node:t}),e||this.trigger("changed",{action:"deselect_all",selected:this._data.core.selected,old_selection:t})},is_selected:function(e){return!(!(e=this.get_node(e))||e.id===E.jstree.root)&&e.state.selected},get_selected:function(e){return e?E.map(this._data.core.selected,function(e){return this.get_node(e)}.bind(this)):this._data.core.selected.slice()},get_top_selected:function(e){for(var t=this.get_selected(!0),i={},r,s,a,n,r=0,s=t.length;r<s;r++)i[t[r].id]=t[r];for(r=0,s=t.length;r<s;r++)for(a=0,n=t[r].children_d.length;a<n;a++)i[t[r].children_d[a]]&&delete i[t[r].children_d[a]];for(r in t=[],i)i.hasOwnProperty(r)&&t.push(r);return e?E.map(t,function(e){return this.get_node(e)}.bind(this)):t},get_bottom_selected:function(e){for(var t=this.get_selected(!0),i=[],r,s,r=0,s=t.length;r<s;r++)t[r].children.length||i.push(t[r].id);return e?E.map(i,function(e){return this.get_node(e)}.bind(this)):i},get_state:function(){var e={core:{open:[],loaded:[],scroll:{left:this.element.scrollLeft(),top:this.element.scrollTop()},selected:[]}},t;for(t in this._model.data)this._model.data.hasOwnProperty(t)&&t!==E.jstree.root&&(this._model.data[t].state.loaded&&this.settings.core.loaded_state&&e.core.loaded.push(t),this._model.data[t].state.opened&&e.core.open.push(t),this._model.data[t].state.selected&&e.core.selected.push(t));return e},set_state:function(t,i){if(t){if(t.core&&t.core.selected&&t.core.initial_selection===P&&(t.core.initial_selection=this._data.core.selected.concat([]).sort().join(",")),t.core){var e,r,s,a,n;if(t.core.loaded)return this.settings.core.loaded_state&&E.vakata.is_array(t.core.loaded)&&t.core.loaded.length?this._load_nodes(t.core.loaded,function(e){delete t.core.loaded,this.set_state(t,i)}):(delete t.core.loaded,this.set_state(t,i)),!1;if(t.core.open)return E.vakata.is_array(t.core.open)&&t.core.open.length?this._load_nodes(t.core.open,function(e){this.open_node(e,!1,0),delete t.core.open,this.set_state(t,i)}):(delete t.core.open,this.set_state(t,i)),!1;if(t.core.scroll)return t.core.scroll&&t.core.scroll.left!==P&&this.element.scrollLeft(t.core.scroll.left),t.core.scroll&&t.core.scroll.top!==P&&this.element.scrollTop(t.core.scroll.top),delete t.core.scroll,this.set_state(t,i),!1;if(t.core.selected)return a=this,t.core.initial_selection!==P&&t.core.initial_selection!==this._data.core.selected.concat([]).sort().join(",")||(this.deselect_all(),E.each(t.core.selected,function(e,t){a.select_node(t,!1,!0)})),delete t.core.initial_selection,delete t.core.selected,this.set_state(t,i),!1;for(n in t)t.hasOwnProperty(n)&&"core"!==n&&-1===E.inArray(n,this.settings.plugins)&&delete t[n];if(E.isEmptyObject(t.core))return delete t.core,this.set_state(t,i),!1}return E.isEmptyObject(t)?(t=null,i&&i.call(this),this.trigger("set_state"),!1):!0}return!1},refresh:function(e,t){this._data.core.state=!0===t?{}:this.get_state(),t&&E.vakata.is_function(t)&&(this._data.core.state=t.call(this,this._data.core.state)),this._cnt=0,this._model.data={},this._model.data[E.jstree.root]={id:E.jstree.root,parent:null,parents:[],children:[],children_d:[],state:{loaded:!1}},this._data.core.selected=[],this._data.core.last_clicked=null,this._data.core.focused=null;var i=this.get_container_ul()[0].className;e||(this.element.html("<ul class='"+i+"' role='group'><li class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='none' id='j"+this._id+"_loading'><i class='jstree-icon jstree-ocl'></i><a class='jstree-anchor' role='treeitem' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>"+this.get_string("Loading ...")+"</a></li></ul>"),this.element.attr("aria-activedescendant","j"+this._id+"_loading")),this.load_node(E.jstree.root,function(e,t){t&&(this.get_container_ul()[0].className=i,this._firstChild(this.get_container_ul()[0])&&this.element.attr("aria-activedescendant",this._firstChild(this.get_container_ul()[0]).id),this.set_state(E.extend(!0,{},this._data.core.state),function(){this.trigger("refresh")})),this._data.core.state=null})},refresh_node:function(t){if(!(t=this.get_node(t))||t.id===E.jstree.root)return!1;var i=[],e=[],r=this._data.core.selected.concat([]);e.push(t.id),!0===t.state.opened&&i.push(t.id),this.get_node(t,!0).find(".jstree-open").each(function(){e.push(this.id),i.push(this.id)}),this._load_nodes(e,function(e){this.open_node(i,!1,0),this.select_node(r),this.trigger("refresh_node",{node:t,nodes:e})}.bind(this),!1,!0)},set_id:function(e,t){if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;var i,r,s=this._model.data,a=e.id;for(t=t.toString(),s[e.parent].children[E.inArray(e.id,s[e.parent].children)]=t,i=0,r=e.parents.length;i<r;i++)s[e.parents[i]].children_d[E.inArray(e.id,s[e.parents[i]].children_d)]=t;for(i=0,r=e.children.length;i<r;i++)s[e.children[i]].parent=t;for(i=0,r=e.children_d.length;i<r;i++)s[e.children_d[i]].parents[E.inArray(e.id,s[e.children_d[i]].parents)]=t;return-1!==(i=E.inArray(e.id,this._data.core.selected))&&(this._data.core.selected[i]=t),(i=this.get_node(e.id,!0))&&(i.attr("id",t),this.element.attr("aria-activedescendant")===e.id&&this.element.attr("aria-activedescendant",t)),delete s[e.id],e.id=t,s[e.li_attr.id=t]=e,this.trigger("set_id",{node:e,new:e.id,old:a}),!0},get_text:function(e){return!(!(e=this.get_node(e))||e.id===E.jstree.root)&&e.text},set_text:function(e,t){var i,r;if(E.vakata.is_array(e)){for(i=0,r=(e=e.slice()).length;i<r;i++)this.set_text(e[i],t);return!0}return!(!(e=this.get_node(e))||e.id===E.jstree.root)&&(e.text=t,this.get_node(e,!0).length&&this.redraw_node(e.id),this.trigger("set_text",{obj:e,text:t}),!0)},get_json:function(e,t,i){if(!(e=this.get_node(e||E.jstree.root)))return!1;t&&t.flat&&!i&&(i=[]);var r={id:e.id,text:e.text,icon:this.get_icon(e),li_attr:E.extend(!0,{},e.li_attr),a_attr:E.extend(!0,{},e.a_attr),state:{},data:(!t||!t.no_data)&&E.extend(!0,E.vakata.is_array(e.data)?[]:{},e.data)},s,a;if(t&&t.flat?r.parent=e.parent:r.children=[],t&&t.no_state)delete r.state;else for(s in e.state)e.state.hasOwnProperty(s)&&(r.state[s]=e.state[s]);if(t&&t.no_li_attr&&delete r.li_attr,t&&t.no_a_attr&&delete r.a_attr,t&&t.no_id&&(delete r.id,r.li_attr&&r.li_attr.id&&delete r.li_attr.id,r.a_attr&&r.a_attr.id&&delete r.a_attr.id),t&&t.flat&&e.id!==E.jstree.root&&i.push(r),!t||!t.no_children)for(s=0,a=e.children.length;s<a;s++)t&&t.flat?this.get_json(e.children[s],t,i):r.children.push(this.get_json(e.children[s],t));return t&&t.flat?i:e.id===E.jstree.root?r.children:r},create_node:function(e,t,i,r,s){if(null===e&&(e=E.jstree.root),!(e=this.get_node(e)))return!1;if(!(i=i===P?"last":i).toString().match(/^(before|after)$/)&&!s&&!this.is_loaded(e))return this.load_node(e,function(){this.create_node(e,t,i,r,!0)});var a,n,o,d;switch((t="string"==typeof(t=t||{text:this.get_string("New node")})?{text:t}:E.extend(!0,{},t)).text===P&&(t.text=this.get_string("New node")),i=e.id===E.jstree.root&&"after"===(i="before"===i?"first":i)?"last":i){case"before":a=this.get_node(e.parent),i=E.inArray(e.id,a.children),e=a;break;case"after":a=this.get_node(e.parent),i=E.inArray(e.id,a.children)+1,e=a;break;case"inside":case"first":i=0;break;case"last":i=e.children.length;break;default:i=i||0}if(i>e.children.length&&(i=e.children.length),t.id===P&&(t.id=!0),!this.check("create_node",t,e,i))return this.settings.core.error.call(this,this._data.core.last_error),!1;if(!0===t.id&&delete t.id,!(t=this._parse_model_from_json(t,e.id,e.parents.concat())))return!1;for(a=this.get_node(t),(n=[]).push(t),n=n.concat(a.children_d),this.trigger("model",{nodes:n,parent:e.id}),e.children_d=e.children_d.concat(n),o=0,d=e.parents.length;o<d;o++)this._model.data[e.parents[o]].children_d=this._model.data[e.parents[o]].children_d.concat(n);for(t=a,a=[],o=0,d=e.children.length;o<d;o++)a[i<=o?o+1:o]=e.children[o];return a[i]=t.id,e.children=a,this.redraw_node(e,!0),this.trigger("create_node",{node:this.get_node(t),parent:e.id,position:i}),r&&r.call(this,this.get_node(t)),t.id},rename_node:function(e,t){var i,r,s;if(E.vakata.is_array(e)){for(i=0,r=(e=e.slice()).length;i<r;i++)this.rename_node(e[i],t);return!0}return!(!(e=this.get_node(e))||e.id===E.jstree.root)&&(s=e.text,this.check("rename_node",e,this.get_parent(e),t)?(this.set_text(e,t),this.trigger("rename_node",{node:e,text:t,old:s}),!0):(this.settings.core.error.call(this,this._data.core.last_error),!1))},delete_node:function(e){var t,i,r,s,a,n,o,d,c,l,h,s;if(E.vakata.is_array(e)){for(t=0,i=(e=e.slice()).length;t<i;t++)this.delete_node(e[t]);return!0}if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;if(r=this.get_node(e.parent),s=E.inArray(e.id,r.children),l=!1,!this.check("delete_node",e,r,s))return this.settings.core.error.call(this,this._data.core.last_error),!1;for(-1!==s&&(r.children=E.vakata.array_remove(r.children,s)),(a=e.children_d.concat([])).push(e.id),n=0,o=e.parents.length;n<o;n++)this._model.data[e.parents[n]].children_d=E.vakata.array_filter(this._model.data[e.parents[n]].children_d,function(e){return-1===E.inArray(e,a)});for(d=0,c=a.length;d<c;d++)if(this._model.data[a[d]].state.selected){l=!0;break}for(l&&(this._data.core.selected=E.vakata.array_filter(this._data.core.selected,function(e){return-1===E.inArray(e,a)})),this.trigger("delete_node",{node:e,parent:r.id}),l&&this.trigger("changed",{action:"delete_node",node:e,selected:this._data.core.selected,parent:r.id}),d=0,c=a.length;d<c;d++)delete this._model.data[a[d]];return-1!==E.inArray(this._data.core.focused,a)&&(this._data.core.focused=null,h=this.element[0].scrollTop,s=this.element[0].scrollLeft,r.id===E.jstree.root?this._model.data[E.jstree.root].children[0]&&this.get_node(this._model.data[E.jstree.root].children[0],!0).children(".jstree-anchor").trigger("focus"):this.get_node(r,!0).children(".jstree-anchor").trigger("focus"),this.element[0].scrollTop=h,this.element[0].scrollLeft=s),this.redraw_node(r,!0),!0},check:function(e,t,i,r,s){t=t&&t.id?t:this.get_node(t),i=i&&i.id?i:this.get_node(i);var a=e.match(/^(move_node|copy_node|create_node)$/i)?i:t,n=this.settings.core.check_callback;if("move_node"===e||"copy_node"===e){if(!(s&&s.is_multi||"move_node"!==e||E.inArray(t.id,i.children)!==r))return!(this._data.core.last_error={error:"check",plugin:"core",id:"core_08",reason:"Moving node to its current position",data:JSON.stringify({chk:e,pos:r,obj:!(!t||!t.id)&&t.id,par:!(!i||!i.id)&&i.id})});if(!(s&&s.is_multi||t.id!==i.id&&("move_node"!==e||E.inArray(t.id,i.children)!==r)&&-1===E.inArray(i.id,t.children_d)))return!(this._data.core.last_error={error:"check",plugin:"core",id:"core_01",reason:"Moving parent inside child",data:JSON.stringify({chk:e,pos:r,obj:!(!t||!t.id)&&t.id,par:!(!i||!i.id)&&i.id})})}return(a=a&&a.data?a.data:a)&&a.functions&&(!1===a.functions[e]||!0===a.functions[e])?(!1===a.functions[e]&&(this._data.core.last_error={error:"check",plugin:"core",id:"core_02",reason:"Node data prevents function: "+e,data:JSON.stringify({chk:e,pos:r,obj:!(!t||!t.id)&&t.id,par:!(!i||!i.id)&&i.id})}),a.functions[e]):!(!1===n||E.vakata.is_function(n)&&!1===n.call(this,e,t,i,r,s)||n&&!1===n[e])||!(this._data.core.last_error={error:"check",plugin:"core",id:"core_03",reason:"User config for core.check_callback prevents function: "+e,data:JSON.stringify({chk:e,pos:r,obj:!(!t||!t.id)&&t.id,par:!(!i||!i.id)&&i.id})})},last_error:function(){return this._data.core.last_error},move_node:function(e,t,i,r,s,a,n){var o,d,c,l,h,_,g,u,f,p,m,v,j,k;if(t=this.get_node(t),i=i===P?0:i,!t)return!1;if(!i.toString().match(/^(before|after)$/)&&!s&&!this.is_loaded(t))return this.load_node(t,function(){this.move_node(e,t,i,r,!0,!1,n)});if(E.vakata.is_array(e)){if(1!==e.length){for(o=0,d=e.length;o<d;o++)(f=this.move_node(e[o],t,i,r,s,!1,n))&&(t=f,i="after");return this.redraw(),!0}e=e[0]}if(!(e=e&&e.id!==P?e:this.get_node(e))||e.id===E.jstree.root)return!1;if(c=(e.parent||E.jstree.root).toString(),h=i.toString().match(/^(before|after)$/)&&t.id!==E.jstree.root?this.get_node(t.parent):t,g=!(_=n||(this._model.data[e.id]?this:E.jstree.reference(e.id)))||!_._id||this._id!==_._id,l=_&&_._id&&c&&_._model.data[c]&&_._model.data[c].children?E.inArray(e.id,_._model.data[c].children):-1,_&&_._id&&(e=_._model.data[e.id]),g)return!!(f=this.copy_node(e,t,i,r,s,!1,n))&&(_&&_.delete_node(e),f);switch(i=t.id===E.jstree.root&&"after"===(i="before"===i?"first":i)?"last":i){case"before":i=E.inArray(t.id,h.children);break;case"after":i=E.inArray(t.id,h.children)+1;break;case"inside":case"first":i=0;break;case"last":i=h.children.length;break;default:i=i||0}if(i>h.children.length&&(i=h.children.length),!this.check("move_node",e,h,i,{core:!0,origin:n,is_multi:_&&_._id&&_._id!==this._id,is_foreign:!_||!_._id}))return this.settings.core.error.call(this,this._data.core.last_error),!1;if(e.parent===h.id){for(u=h.children.concat(),-1!==(f=E.inArray(e.id,u))&&(u=E.vakata.array_remove(u,f),f<i&&i--),f=[],p=0,m=u.length;p<m;p++)f[i<=p?p+1:p]=u[p];f[i]=e.id,h.children=f,this._node_changed(h.id),this.redraw(h.id===E.jstree.root)}else{for((f=e.children_d.concat()).push(e.id),p=0,m=e.parents.length;p<m;p++){for(u=[],v=0,j=(k=_._model.data[e.parents[p]].children_d).length;v<j;v++)-1===E.inArray(k[v],f)&&u.push(k[v]);_._model.data[e.parents[p]].children_d=u}for(_._model.data[c].children=E.vakata.array_remove_item(_._model.data[c].children,e.id),p=0,m=h.parents.length;p<m;p++)this._model.data[h.parents[p]].children_d=this._model.data[h.parents[p]].children_d.concat(f);for(u=[],p=0,m=h.children.length;p<m;p++)u[i<=p?p+1:p]=h.children[p];for(u[i]=e.id,h.children=u,h.children_d.push(e.id),h.children_d=h.children_d.concat(e.children_d),e.parent=h.id,(f=h.parents.concat()).unshift(h.id),k=e.parents.length,f=(e.parents=f).concat(),p=0,m=e.children_d.length;p<m;p++)this._model.data[e.children_d[p]].parents=this._model.data[e.children_d[p]].parents.slice(0,-1*k),Array.prototype.push.apply(this._model.data[e.children_d[p]].parents,f);c!==E.jstree.root&&h.id!==E.jstree.root||(this._model.force_full_redraw=!0),this._model.force_full_redraw||(this._node_changed(c),this._node_changed(h.id)),a||this.redraw()}return r&&r.call(this,e,h,i),this.trigger("move_node",{node:e,parent:h.id,position:i,old_parent:c,old_position:l,is_multi:_&&_._id&&_._id!==this._id,is_foreign:!_||!_._id,old_instance:_,new_instance:this}),e.id},copy_node:function(e,t,i,r,s,a,n){var o,d,c,l,h,_,g,u,f,p,m;if(t=this.get_node(t),i=i===P?0:i,!t)return!1;if(!i.toString().match(/^(before|after)$/)&&!s&&!this.is_loaded(t))return this.load_node(t,function(){this.copy_node(e,t,i,r,!0,!1,n)});if(E.vakata.is_array(e)){if(1!==e.length){for(o=0,d=e.length;o<d;o++)(l=this.copy_node(e[o],t,i,r,s,!0,n))&&(t=l,i="after");return this.redraw(),!0}e=e[0]}if(!(e=e&&e.id!==P?e:this.get_node(e))||e.id===E.jstree.root)return!1;switch(u=(e.parent||E.jstree.root).toString(),f=i.toString().match(/^(before|after)$/)&&t.id!==E.jstree.root?this.get_node(t.parent):t,m=!(p=n||(this._model.data[e.id]?this:E.jstree.reference(e.id)))||!p._id||this._id!==p._id,p&&p._id&&(e=p._model.data[e.id]),i=t.id===E.jstree.root&&"after"===(i="before"===i?"first":i)?"last":i){case"before":i=E.inArray(t.id,f.children);break;case"after":i=E.inArray(t.id,f.children)+1;break;case"inside":case"first":i=0;break;case"last":i=f.children.length;break;default:i=i||0}if(i>f.children.length&&(i=f.children.length),!this.check("copy_node",e,f,i,{core:!0,origin:n,is_multi:p&&p._id&&p._id!==this._id,is_foreign:!p||!p._id}))return this.settings.core.error.call(this,this._data.core.last_error),!1;if(!(g=p?p.get_json(e,{no_id:!0,no_data:!0,no_state:!0}):e))return!1;if(!0===g.id&&delete g.id,!(g=this._parse_model_from_json(g,f.id,f.parents.concat())))return!1;for(l=this.get_node(g),e&&e.state&&!1===e.state.loaded&&(l.state.loaded=!1),(c=[]).push(g),c=c.concat(l.children_d),this.trigger("model",{nodes:c,parent:f.id}),h=0,_=f.parents.length;h<_;h++)this._model.data[f.parents[h]].children_d=this._model.data[f.parents[h]].children_d.concat(c);for(c=[],h=0,_=f.children.length;h<_;h++)c[i<=h?h+1:h]=f.children[h];return c[i]=l.id,f.children=c,f.children_d.push(l.id),f.children_d=f.children_d.concat(l.children_d),f.id===E.jstree.root&&(this._model.force_full_redraw=!0),this._model.force_full_redraw||this._node_changed(f.id),a||this.redraw(f.id===E.jstree.root),r&&r.call(this,l,f,i),this.trigger("copy_node",{node:l,original:e,parent:f.id,position:i,old_parent:u,old_position:p&&p._id&&u&&p._model.data[u]&&p._model.data[u].children?E.inArray(e.id,p._model.data[u].children):-1,is_multi:p&&p._id&&p._id!==this._id,is_foreign:!p||!p._id,old_instance:p,new_instance:this}),l.id},cut:function(e){if(e=e||this._data.core.selected.concat(),!(e=!E.vakata.is_array(e)?[e]:e).length)return!1;for(var t=[],i,r,s,r=0,s=e.length;r<s;r++)(i=this.get_node(e[r]))&&(i.id||0===i.id)&&i.id!==E.jstree.root&&t.push(i);if(!t.length)return!1;a=t,n="move_node",(o=this).trigger("cut",{node:e})},copy:function(e){if(e=e||this._data.core.selected.concat(),!(e=!E.vakata.is_array(e)?[e]:e).length)return!1;for(var t=[],i,r,s,r=0,s=e.length;r<s;r++)(i=this.get_node(e[r]))&&i.id!==P&&i.id!==E.jstree.root&&t.push(i);if(!t.length)return!1;a=t,n="copy_node",(o=this).trigger("copy",{node:e})},get_buffer:function(){return{mode:n,node:a,inst:o}},can_paste:function(){return!1!==n&&!1!==a},paste:function(e,t){if(!((e=this.get_node(e))&&n&&n.match(/^(copy_node|move_node)$/)&&a))return!1;this[n](a,e,t,!1,!1,!1,o)&&this.trigger("paste",{parent:e.id,node:a,mode:n}),o=n=a=!1},clear_buffer:function(){o=n=a=!1,this.trigger("clear_buffer")},edit:function(r,e,s){var t,i,a,n,o,d,c,t,l,h=!1;return!!(r=this.get_node(r))&&(this.check("edit",r,this.get_parent(r))?(l=r,e="string"==typeof e?e:r.text,this.set_text(r,""),r=this._open_to(r),l.text=e,t=this._data.core.rtl,i=this.element.width(),this._data.core.focused=l.id,a=r.children(".jstree-anchor").trigger("focus"),n=E("<span></span>"),o=e,d=E("<div></div>",{css:{position:"absolute",top:"-200px",left:t?"0px":"-1000px",visibility:"hidden"}}).appendTo(b.body),c=E("<input />",{value:o,class:"jstree-rename-input",css:{padding:"0",border:"1px solid silver","box-sizing":"border-box",display:"inline-block",height:this._data.core.li_height+"px",lineHeight:this._data.core.li_height+"px",width:"150px"},on:{blur:function(e){e.stopImmediatePropagation(),e.preventDefault();var t,i=n.children(".jstree-rename-input").val(),e=this.settings.core.force_text,e;""===i&&(i=o),d.remove(),n.replaceWith(a),n.remove(),o=e?o:E("<div></div>").append(E.parseHTML(o)).html(),r=this.get_node(r),this.set_text(r,o),(e=!!this.rename_node(r,e?E("<div></div>").text(i).text():E("<div></div>").append(E.parseHTML(i)).html()))||this.set_text(r,o),this._data.core.focused=l.id,setTimeout(function(){var e=this.get_node(l.id,!0);e.length&&(this._data.core.focused=l.id,e.children(".jstree-anchor").trigger("focus"))}.bind(this),0),s&&s.call(this,l,e,h,i),c=null}.bind(this),keydown:function(e){var t=e.which;27===t&&(h=!0,this.value=o),27!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&32!==t||e.stopImmediatePropagation(),27!==t&&13!==t||(e.preventDefault(),this.blur())},click:function(e){e.stopImmediatePropagation()},mousedown:function(e){e.stopImmediatePropagation()},keyup:function(e){c.width(Math.min(d.text("pW"+this.value).width(),i))},keypress:function(e){if(13===e.which)return!1}}}),t={fontFamily:a.css("fontFamily")||"",fontSize:a.css("fontSize")||"",fontWeight:a.css("fontWeight")||"",fontStyle:a.css("fontStyle")||"",fontStretch:a.css("fontStretch")||"",fontVariant:a.css("fontVariant")||"",letterSpacing:a.css("letterSpacing")||"",wordSpacing:a.css("wordSpacing")||""},n.attr("class",a.attr("class")).append(a.contents().clone()).append(c),a.replaceWith(n),d.css(t),c.css(t).width(Math.min(d.text("pW"+c[0].value).width(),i))[0].select(),void E(b).one("mousedown.jstree touchstart.jstree dnd_start.vakata",function(e){c&&e.target!==c&&E(c).trigger("blur")})):(this.settings.core.error.call(this,this._data.core.last_error),!1))},set_theme:function(e,t){if(!e)return!1;var i,i;(t=!0===t?(i=(i=this.settings.core.themes.dir)||E.jstree.path+"/themes")+"/"+e+"/style.css":t)&&-1===E.inArray(t,r)&&(E("head").append('<link rel="stylesheet" href="'+t+'" type="text/css" />'),r.push(t)),this._data.core.themes.name&&this.element.removeClass("jstree-"+this._data.core.themes.name),this._data.core.themes.name=e,this.element.addClass("jstree-"+e),this.element[this.settings.core.themes.responsive?"addClass":"removeClass"]("jstree-"+e+"-responsive"),this.trigger("set_theme",{theme:e})},get_theme:function(){return this._data.core.themes.name},set_theme_variant:function(e){this._data.core.themes.variant&&this.element.removeClass("jstree-"+this._data.core.themes.name+"-"+this._data.core.themes.variant),(this._data.core.themes.variant=e)&&this.element.addClass("jstree-"+this._data.core.themes.name+"-"+this._data.core.themes.variant)},get_theme_variant:function(){return this._data.core.themes.variant},show_stripes:function(){this._data.core.themes.stripes=!0,this.get_container_ul().addClass("jstree-striped"),this.trigger("show_stripes")},hide_stripes:function(){this._data.core.themes.stripes=!1,this.get_container_ul().removeClass("jstree-striped"),this.trigger("hide_stripes")},toggle_stripes:function(){this._data.core.themes.stripes?this.hide_stripes():this.show_stripes()},show_dots:function(){this._data.core.themes.dots=!0,this.get_container_ul().removeClass("jstree-no-dots"),this.trigger("show_dots")},hide_dots:function(){this._data.core.themes.dots=!1,this.get_container_ul().addClass("jstree-no-dots"),this.trigger("hide_dots")},toggle_dots:function(){this._data.core.themes.dots?this.hide_dots():this.show_dots()},show_icons:function(){this._data.core.themes.icons=!0,this.get_container_ul().removeClass("jstree-no-icons"),this.trigger("show_icons")},hide_icons:function(){this._data.core.themes.icons=!1,this.get_container_ul().addClass("jstree-no-icons"),this.trigger("hide_icons")},toggle_icons:function(){this._data.core.themes.icons?this.hide_icons():this.show_icons()},show_ellipsis:function(){this._data.core.themes.ellipsis=!0,this.get_container_ul().addClass("jstree-ellipsis"),this.trigger("show_ellipsis")},hide_ellipsis:function(){this._data.core.themes.ellipsis=!1,this.get_container_ul().removeClass("jstree-ellipsis"),this.trigger("hide_ellipsis")},toggle_ellipsis:function(){this._data.core.themes.ellipsis?this.hide_ellipsis():this.show_ellipsis()},set_icon:function(e,t){var i,r,s,a;if(E.vakata.is_array(e)){for(i=0,r=(e=e.slice()).length;i<r;i++)this.set_icon(e[i],t);return!0}return!(!(e=this.get_node(e))||e.id===E.jstree.root)&&(a=e.icon,e.icon=!0===t||null===t||t===P||""===t||t,s=this.get_node(e,!0).children(".jstree-anchor").children(".jstree-themeicon"),!1===t?(s.removeClass("jstree-themeicon-custom "+a).css("background","").removeAttr("rel"),this.hide_icon(e)):(!0===t||null===t||t===P||""===t?s.removeClass("jstree-themeicon-custom "+a).css("background","").removeAttr("rel"):-1===t.indexOf("/")&&-1===t.indexOf(".")?(s.removeClass(a).css("background",""),s.addClass(t+" jstree-themeicon-custom").attr("rel",t)):(s.removeClass(a).css("background",""),s.addClass("jstree-themeicon-custom").css("background","url('"+t+"') center center no-repeat").attr("rel",t)),!1===a&&this.show_icon(e)),!0)},get_icon:function(e){return!(!(e=this.get_node(e))||e.id===E.jstree.root)&&e.icon},hide_icon:function(e){var t,i;if(E.vakata.is_array(e)){for(t=0,i=(e=e.slice()).length;t<i;t++)this.hide_icon(e[t]);return!0}return!(!(e=this.get_node(e))||e===E.jstree.root)&&(e.icon=!1,this.get_node(e,!0).children(".jstree-anchor").children(".jstree-themeicon").addClass("jstree-themeicon-hidden"),!0)},show_icon:function(e){var t,i,r;if(E.vakata.is_array(e)){for(t=0,i=(e=e.slice()).length;t<i;t++)this.show_icon(e[t]);return!0}return!(!(e=this.get_node(e))||e===E.jstree.root)&&(r=this.get_node(e,!0),e.icon=!r.length||r.children(".jstree-anchor").children(".jstree-themeicon").attr("rel"),e.icon||(e.icon=!0),r.children(".jstree-anchor").children(".jstree-themeicon").removeClass("jstree-themeicon-hidden"),!0)}},E.vakata={},E.vakata.attributes=function(e,i){e=E(e)[0];var r=i?{}:[];return e&&e.attributes&&E.each(e.attributes,function(e,t){-1===E.inArray(t.name.toLowerCase(),["style","contenteditable","hasfocus","tabindex"])&&null!==t.value&&""!==E.vakata.trim(t.value)&&(i?r[t.name]=t.value:r.push(t.name))}),r},E.vakata.array_unique=function(e){for(var t=[],i,r,s,a={},i=0,s=e.length;i<s;i++)a[e[i]]===P&&(t.push(e[i]),a[e[i]]=!0);return t},E.vakata.array_remove=function(e,t){return e.splice(t,1),e},E.vakata.array_remove_item=function(e,t){var t=E.inArray(t,e);return-1!==t?E.vakata.array_remove(e,t):e},E.vakata.array_filter=function(e,t,i,r,s){if(e.filter)return e.filter(t,i);for(s in r=[],e)~~s+""==s+""&&0<=s&&t.call(i,e[s],+s,e)&&r.push(e[s]);return r},E.vakata.trim=function(e){return String.prototype.trim?String.prototype.trim.call(e.toString()):e.toString().replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},E.vakata.is_function=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},E.vakata.is_array=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},Function.prototype.bind||(Function.prototype.bind=function(){var t=this,i=arguments[0],r=Array.prototype.slice.call(arguments,1);if("function"!=typeof t)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");return function(){var e=r.concat(Array.prototype.slice.call(arguments));return t.apply(i,e)}}),E.jstree.plugins.changed=function(e,a){var n=[];this.trigger=function(e,t){var i,r;if(t=t||{},"changed"===e.replace(".jstree","")){t.changed={selected:[],deselected:[]};for(var s={},i=0,r=n.length;i<r;i++)s[n[i]]=1;for(i=0,r=t.selected.length;i<r;i++)s[t.selected[i]]?s[t.selected[i]]=2:t.changed.selected.push(t.selected[i]);for(i=0,r=n.length;i<r;i++)1===s[n[i]]&&t.changed.deselected.push(n[i]);n=t.selected.slice()}a.trigger.call(this,e,t)},this.refresh=function(e,t){return n=[],a.refresh.apply(this,arguments)}};var l=b.createElement("I"),h,_,g,d,u,f,p,w;l.className="jstree-icon jstree-checkbox",l.setAttribute("role","presentation"),E.jstree.defaults.checkbox={visible:!0,three_state:!0,whole_node:!0,keep_selected_style:!0,cascade:"",tie_selection:!0,cascade_to_disabled:!0,cascade_to_hidden:!0},E.jstree.plugins.checkbox=function(e,d){this.bind=function(){d.bind.call(this),this._data.checkbox.uto=!1,this._data.checkbox.selected=[],this.settings.checkbox.three_state&&(this.settings.checkbox.cascade="up+down+undetermined"),this.element.on("init.jstree",function(){this._data.checkbox.visible=this.settings.checkbox.visible,this.settings.checkbox.keep_selected_style||this.element.addClass("jstree-checkbox-no-clicked"),this.settings.checkbox.tie_selection&&this.element.addClass("jstree-checkbox-selection")}.bind(this)).on("loading.jstree",function(){this[this._data.checkbox.visible?"show_checkboxes":"hide_checkboxes"]()}.bind(this)),-1!==this.settings.checkbox.cascade.indexOf("undetermined")&&this.element.on("changed.jstree uncheck_node.jstree check_node.jstree uncheck_all.jstree check_all.jstree move_node.jstree copy_node.jstree redraw.jstree open_node.jstree",function(){this._data.checkbox.uto&&clearTimeout(this._data.checkbox.uto),this._data.checkbox.uto=setTimeout(this._undetermined.bind(this),50)}.bind(this)),this.settings.checkbox.tie_selection||this.element.on("model.jstree",function(e,t){for(var i=this._model.data,r=i[t.parent],s=t.nodes,a,n,a=0,n=s.length;a<n;a++)i[s[a]].state.checked=i[s[a]].state.checked||i[s[a]].original&&i[s[a]].original.state&&i[s[a]].original.state.checked,i[s[a]].state.checked&&this._data.checkbox.selected.push(s[a])}.bind(this)),-1===this.settings.checkbox.cascade.indexOf("up")&&-1===this.settings.checkbox.cascade.indexOf("down")||this.element.on("model.jstree",function(e,t){var i=this._model.data,r=i[t.parent],s=t.nodes,a=[],n,o,d,c,l,h,t=this.settings.checkbox.cascade,_=this.settings.checkbox.tie_selection;if(-1!==t.indexOf("down"))if(r.state[_?"selected":"checked"]){for(o=0,d=s.length;o<d;o++)i[s[o]].state[_?"selected":"checked"]=!0;this._data[_?"core":"checkbox"].selected=this._data[_?"core":"checkbox"].selected.concat(s)}else for(o=0,d=s.length;o<d;o++)if(i[s[o]].state[_?"selected":"checked"]){for(c=0,l=i[s[o]].children_d.length;c<l;c++)i[i[s[o]].children_d[c]].state[_?"selected":"checked"]=!0;this._data[_?"core":"checkbox"].selected=this._data[_?"core":"checkbox"].selected.concat(i[s[o]].children_d)}if(-1!==t.indexOf("up")){for(o=0,d=r.children_d.length;o<d;o++)i[r.children_d[o]].children.length||a.push(i[r.children_d[o]].parent);for(c=0,l=(a=E.vakata.array_unique(a)).length;c<l;c++){r=i[a[c]];while(r&&r.id!==E.jstree.root){for(o=n=0,d=r.children.length;o<d;o++)n+=i[r.children[o]].state[_?"selected":"checked"];if(n!==d)break;r.state[_?"selected":"checked"]=!0,this._data[_?"core":"checkbox"].selected.push(r.id),(h=this.get_node(r,!0))&&h.length&&h.children(".jstree-anchor").attr("aria-selected",!0).addClass(_?"jstree-clicked":"jstree-checked"),r=this.get_node(r.parent)}}}this._data[_?"core":"checkbox"].selected=E.vakata.array_unique(this._data[_?"core":"checkbox"].selected)}.bind(this)).on(this.settings.checkbox.tie_selection?"select_node.jstree":"check_node.jstree",function(e,t){var i=this,r=t.node,s=this._model.data,a=this.get_node(r.parent),n,o,d,c,t=this.settings.checkbox.cascade,l=this.settings.checkbox.tie_selection,h={},_=this._data[l?"core":"checkbox"].selected;for(n=0,o=_.length;n<o;n++)h[_[n]]=!0;if(-1!==t.indexOf("down"))for(var g=this._cascade_new_checked_state(r.id,!0),u=r.children_d.concat(r.id),n=0,o=u.length;n<o;n++)-1<g.indexOf(u[n])?h[u[n]]=!0:delete h[u[n]];if(-1!==t.indexOf("up"))while(a&&a.id!==E.jstree.root){for(n=d=0,o=a.children.length;n<o;n++)d+=s[a.children[n]].state[l?"selected":"checked"];if(d!==o)break;a.state[l?"selected":"checked"]=!0,h[a.id]=!0,(c=this.get_node(a,!0))&&c.length&&c.children(".jstree-anchor").attr("aria-selected",!0).addClass(l?"jstree-clicked":"jstree-checked"),a=this.get_node(a.parent)}for(n in _=[],h)h.hasOwnProperty(n)&&_.push(n);this._data[l?"core":"checkbox"].selected=_}.bind(this)).on(this.settings.checkbox.tie_selection?"deselect_all.jstree":"uncheck_all.jstree",function(e,t){for(var i=this.get_node(E.jstree.root),r=this._model.data,s,a,n,s=0,a=i.children_d.length;s<a;s++)(n=r[i.children_d[s]])&&n.original&&n.original.state&&n.original.state.undetermined&&(n.original.state.undetermined=!1)}.bind(this)).on(this.settings.checkbox.tie_selection?"deselect_node.jstree":"uncheck_node.jstree",function(e,t){var i=this,r=t.node,s=this.get_node(r,!0),a,n,o,d=this.settings.checkbox.cascade,c=this.settings.checkbox.tie_selection,t=this._data[c?"core":"checkbox"].selected,l={},h=[],_=r.children_d.concat(r.id),g,t;if(-1!==d.indexOf("down")&&(g=this._cascade_new_checked_state(r.id,!1),t=E.vakata.array_filter(t,function(e){return-1===_.indexOf(e)||-1<g.indexOf(e)})),-1!==d.indexOf("up")&&-1===t.indexOf(r.id)){for(a=0,n=r.parents.length;a<n;a++)(o=this._model.data[r.parents[a]]).state[c?"selected":"checked"]=!1,o&&o.original&&o.original.state&&o.original.state.undetermined&&(o.original.state.undetermined=!1),(o=this.get_node(r.parents[a],!0))&&o.length&&o.children(".jstree-anchor").attr("aria-selected",!1).removeClass(c?"jstree-clicked":"jstree-checked");t=E.vakata.array_filter(t,function(e){return-1===r.parents.indexOf(e)})}this._data[c?"core":"checkbox"].selected=t}.bind(this)),-1!==this.settings.checkbox.cascade.indexOf("up")&&this.element.on("delete_node.jstree",function(e,t){var i=this.get_node(t.parent),r=this._model.data,s,a,n,o,d=this.settings.checkbox.tie_selection;while(i&&i.id!==E.jstree.root&&!i.state[d?"selected":"checked"]){for(s=n=0,a=i.children.length;s<a;s++)n+=r[i.children[s]].state[d?"selected":"checked"];if(!(0<a&&n===a))break;i.state[d?"selected":"checked"]=!0,this._data[d?"core":"checkbox"].selected.push(i.id),(o=this.get_node(i,!0))&&o.length&&o.children(".jstree-anchor").attr("aria-selected",!0).addClass(d?"jstree-clicked":"jstree-checked"),i=this.get_node(i.parent)}}.bind(this)).on("move_node.jstree",function(e,t){var i=t.is_multi,r=t.old_parent,t=this.get_node(t.parent),s=this._model.data,a,n,o,d,c,l=this.settings.checkbox.tie_selection;if(!i){a=this.get_node(r);while(a&&a.id!==E.jstree.root&&!a.state[l?"selected":"checked"]){for(o=n=0,d=a.children.length;o<d;o++)n+=s[a.children[o]].state[l?"selected":"checked"];if(!(0<d&&n===d))break;a.state[l?"selected":"checked"]=!0,this._data[l?"core":"checkbox"].selected.push(a.id),(c=this.get_node(a,!0))&&c.length&&c.children(".jstree-anchor").attr("aria-selected",!0).addClass(l?"jstree-clicked":"jstree-checked"),a=this.get_node(a.parent)}}a=t;while(a&&a.id!==E.jstree.root){for(o=n=0,d=a.children.length;o<d;o++)n+=s[a.children[o]].state[l?"selected":"checked"];if(n===d)a.state[l?"selected":"checked"]||(a.state[l?"selected":"checked"]=!0,this._data[l?"core":"checkbox"].selected.push(a.id),(c=this.get_node(a,!0))&&c.length&&c.children(".jstree-anchor").attr("aria-selected",!0).addClass(l?"jstree-clicked":"jstree-checked"));else{if(!a.state[l?"selected":"checked"])break;a.state[l?"selected":"checked"]=!1,this._data[l?"core":"checkbox"].selected=E.vakata.array_remove_item(this._data[l?"core":"checkbox"].selected,a.id),(c=this.get_node(a,!0))&&c.length&&c.children(".jstree-anchor").attr("aria-selected",!1).removeClass(l?"jstree-clicked":"jstree-checked")}a=this.get_node(a.parent)}}.bind(this))},this.get_undetermined=function(e){if(-1===this.settings.checkbox.cascade.indexOf("undetermined"))return[];for(var i,r,s,a,n={},o=this._model.data,t=this.settings.checkbox.tie_selection,d=this._data[t?"core":"checkbox"].selected,c=[],l=this,h=[],i=0,r=d.length;i<r;i++)if(o[d[i]]&&o[d[i]].parents)for(s=0,a=o[d[i]].parents.length;s<a;s++){if(n[o[d[i]].parents[s]]!==P)break;o[d[i]].parents[s]!==E.jstree.root&&(n[o[d[i]].parents[s]]=!0,c.push(o[d[i]].parents[s]))}for(this.element.find(".jstree-closed").not(":has(.jstree-children)").each(function(){var e=l.get_node(this),t;if(e)if(e.state.loaded){for(i=0,r=e.children_d.length;i<r;i++)if(!(t=o[e.children_d[i]]).state.loaded&&t.original&&t.original.state&&t.original.state.undetermined&&!0===t.original.state.undetermined)for(n[t.id]===P&&t.id!==E.jstree.root&&(n[t.id]=!0,c.push(t.id)),s=0,a=t.parents.length;s<a;s++)n[t.parents[s]]===P&&t.parents[s]!==E.jstree.root&&(n[t.parents[s]]=!0,c.push(t.parents[s]))}else if(e.original&&e.original.state&&e.original.state.undetermined&&!0===e.original.state.undetermined)for(n[e.id]===P&&e.id!==E.jstree.root&&(n[e.id]=!0,c.push(e.id)),s=0,a=e.parents.length;s<a;s++)n[e.parents[s]]===P&&e.parents[s]!==E.jstree.root&&(n[e.parents[s]]=!0,c.push(e.parents[s]))}),i=0,r=c.length;i<r;i++)o[c[i]].state[t?"selected":"checked"]||h.push(e?o[c[i]]:c[i]);return h},this._undetermined=function(){if(null!==this.element){var e=this.get_undetermined(!1),t,i,r;for(this.element.find(".jstree-undetermined").removeClass("jstree-undetermined"),t=0,i=e.length;t<i;t++)(r=this.get_node(e[t],!0))&&r.length&&r.children(".jstree-anchor").children(".jstree-checkbox").addClass("jstree-undetermined")}},this.redraw_node=function(e,t,i,r){if(e=d.redraw_node.apply(this,arguments)){for(var s,a,n=null,o=null,s=0,a=e.childNodes.length;s<a;s++)if(e.childNodes[s]&&e.childNodes[s].className&&-1!==e.childNodes[s].className.indexOf("jstree-anchor")){n=e.childNodes[s];break}n&&(!this.settings.checkbox.tie_selection&&this._model.data[e.id].state.checked&&(n.className+=" jstree-checked"),o=l.cloneNode(!1),this._model.data[e.id].state.checkbox_disabled&&(o.className+=" jstree-checkbox-disabled"),n.insertBefore(o,n.childNodes[0]))}return i||-1===this.settings.checkbox.cascade.indexOf("undetermined")||(this._data.checkbox.uto&&clearTimeout(this._data.checkbox.uto),this._data.checkbox.uto=setTimeout(this._undetermined.bind(this),50)),e},this.show_checkboxes=function(){this._data.core.themes.checkboxes=!0,this.get_container_ul().removeClass("jstree-no-checkboxes")},this.hide_checkboxes=function(){this._data.core.themes.checkboxes=!1,this.get_container_ul().addClass("jstree-no-checkboxes")},this.toggle_checkboxes=function(){this._data.core.themes.checkboxes?this.hide_checkboxes():this.show_checkboxes()},this.is_undetermined=function(e){e=this.get_node(e);var t=this.settings.checkbox.cascade,i,r,s=this.settings.checkbox.tie_selection,a=this._data[s?"core":"checkbox"].selected,n=this._model.data;if(!e||!0===e.state[s?"selected":"checked"]||-1===t.indexOf("undetermined")||-1===t.indexOf("down")&&-1===t.indexOf("up"))return!1;if(!e.state.loaded&&!0===e.original.state.undetermined)return!0;for(i=0,r=e.children_d.length;i<r;i++)if(-1!==E.inArray(e.children_d[i],a)||!n[e.children_d[i]].state.loaded&&n[e.children_d[i]].original.state.undetermined)return!0;return!1},this.disable_checkbox=function(e){var t,i,r;if(E.vakata.is_array(e)){for(t=0,i=(e=e.slice()).length;t<i;t++)this.disable_checkbox(e[t]);return!0}if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;r=this.get_node(e,!0),e.state.checkbox_disabled||(e.state.checkbox_disabled=!0,r&&r.length&&r.children(".jstree-anchor").children(".jstree-checkbox").addClass("jstree-checkbox-disabled"),this.trigger("disable_checkbox",{node:e}))},this.enable_checkbox=function(e){var t,i,r;if(E.vakata.is_array(e)){for(t=0,i=(e=e.slice()).length;t<i;t++)this.enable_checkbox(e[t]);return!0}if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;r=this.get_node(e,!0),e.state.checkbox_disabled&&(e.state.checkbox_disabled=!1,r&&r.length&&r.children(".jstree-anchor").children(".jstree-checkbox").removeClass("jstree-checkbox-disabled"),this.trigger("enable_checkbox",{node:e}))},this.activate_node=function(e,t){return!E(t.target).hasClass("jstree-checkbox-disabled")&&(this.settings.checkbox.tie_selection&&(this.settings.checkbox.whole_node||E(t.target).hasClass("jstree-checkbox"))&&(t.ctrlKey=!0),this.settings.checkbox.tie_selection||!this.settings.checkbox.whole_node&&!E(t.target).hasClass("jstree-checkbox")?d.activate_node.call(this,e,t):!this.is_disabled(e)&&(this.is_checked(e)?this.uncheck_node(e,t):this.check_node(e,t),void this.trigger("activate_node",{node:this.get_node(e)})))},this.delete_node=function(e){if(this.settings.checkbox.tie_selection||E.vakata.is_array(e))return d.delete_node.call(this,e);var t,i,r,s=!1;if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;for((t=e.children_d.concat([])).push(e.id),i=0,r=t.length;i<r;i++)if(this._model.data[t[i]].state.checked){s=!0;break}return s&&(this._data.checkbox.selected=E.vakata.array_filter(this._data.checkbox.selected,function(e){return-1===E.inArray(e,t)})),d.delete_node.call(this,e)},this._cascade_new_checked_state=function(e,t){var i=this,r=this.settings.checkbox.tie_selection,s=this._model.data[e],a=[],n=[],o,d,c;if(!this.settings.checkbox.cascade_to_disabled&&s.state.disabled||!this.settings.checkbox.cascade_to_hidden&&s.state.hidden)c=this.get_checked_descendants(e),s.state[r?"selected":"checked"]&&c.push(s.id),a=a.concat(c);else{if(s.children)for(o=0,d=s.children.length;o<d;o++){var l=s.children[o],c=i._cascade_new_checked_state(l,t),a=a.concat(c);-1<c.indexOf(l)&&n.push(l)}var h=i.get_node(s,!0),e=0<n.length&&n.length<s.children.length;s.original&&s.original.state&&s.original.state.undetermined&&(s.original.state.undetermined=e),!e&&t&&n.length===s.children.length?(s.state[r?"selected":"checked"]=t,a.push(s.id),h.children(".jstree-anchor").attr("aria-selected",!0).addClass(r?"jstree-clicked":"jstree-checked")):(s.state[r?"selected":"checked"]=!1,h.children(".jstree-anchor").attr("aria-selected",!1).removeClass(r?"jstree-clicked":"jstree-checked"))}return a},this.get_checked_descendants=function(e){var t=this,i=t.settings.checkbox.tie_selection,e=t._model.data[e];return E.vakata.array_filter(e.children_d,function(e){return t._model.data[e].state[i?"selected":"checked"]})},this.check_node=function(e,t){if(this.settings.checkbox.tie_selection)return this.select_node(e,!1,!0,t);var i,r,s,a;if(E.vakata.is_array(e)){for(r=0,s=(e=e.slice()).length;r<s;r++)this.check_node(e[r],t);return!0}if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;i=this.get_node(e,!0),e.state.checked||(e.state.checked=!0,this._data.checkbox.selected.push(e.id),i&&i.length&&i.children(".jstree-anchor").addClass("jstree-checked"),this.trigger("check_node",{node:e,selected:this._data.checkbox.selected,event:t}))},this.uncheck_node=function(e,t){if(this.settings.checkbox.tie_selection)return this.deselect_node(e,!1,t);var i,r,s;if(E.vakata.is_array(e)){for(i=0,r=(e=e.slice()).length;i<r;i++)this.uncheck_node(e[i],t);return!0}if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;s=this.get_node(e,!0),e.state.checked&&(e.state.checked=!1,this._data.checkbox.selected=E.vakata.array_remove_item(this._data.checkbox.selected,e.id),s.length&&s.children(".jstree-anchor").removeClass("jstree-checked"),this.trigger("uncheck_node",{node:e,selected:this._data.checkbox.selected,event:t}))},this.check_all=function(){if(this.settings.checkbox.tie_selection)return this.select_all();var e=this._data.checkbox.selected.concat([]),t,i;for(this._data.checkbox.selected=this._model.data[E.jstree.root].children_d.concat(),t=0,i=this._data.checkbox.selected.length;t<i;t++)this._model.data[this._data.checkbox.selected[t]]&&(this._model.data[this._data.checkbox.selected[t]].state.checked=!0);this.redraw(!0),this.trigger("check_all",{selected:this._data.checkbox.selected})},this.uncheck_all=function(){if(this.settings.checkbox.tie_selection)return this.deselect_all();for(var e=this._data.checkbox.selected.concat([]),t,i,t=0,i=this._data.checkbox.selected.length;t<i;t++)this._model.data[this._data.checkbox.selected[t]]&&(this._model.data[this._data.checkbox.selected[t]].state.checked=!1);this._data.checkbox.selected=[],this.element.find(".jstree-checked").removeClass("jstree-checked"),this.trigger("uncheck_all",{selected:this._data.checkbox.selected,node:e})},this.is_checked=function(e){return this.settings.checkbox.tie_selection?this.is_selected(e):!(!(e=this.get_node(e))||e.id===E.jstree.root)&&e.state.checked},this.get_checked=function(e){return this.settings.checkbox.tie_selection?this.get_selected(e):e?E.map(this._data.checkbox.selected,function(e){return this.get_node(e)}.bind(this)):this._data.checkbox.selected.slice()},this.get_top_checked=function(e){if(this.settings.checkbox.tie_selection)return this.get_top_selected(e);for(var t=this.get_checked(!0),i={},r,s,a,n,r=0,s=t.length;r<s;r++)i[t[r].id]=t[r];for(r=0,s=t.length;r<s;r++)for(a=0,n=t[r].children_d.length;a<n;a++)i[t[r].children_d[a]]&&delete i[t[r].children_d[a]];for(r in t=[],i)i.hasOwnProperty(r)&&t.push(r);return e?E.map(t,function(e){return this.get_node(e)}.bind(this)):t},this.get_bottom_checked=function(e){if(this.settings.checkbox.tie_selection)return this.get_bottom_selected(e);for(var t=this.get_checked(!0),i=[],r,s,r=0,s=t.length;r<s;r++)t[r].children.length||i.push(t[r].id);return e?E.map(i,function(e){return this.get_node(e)}.bind(this)):i},this.load_node=function(e,t){var i,r,s,a,n,o;if(!E.vakata.is_array(e)&&!this.settings.checkbox.tie_selection&&(o=this.get_node(e))&&o.state.loaded)for(i=0,r=o.children_d.length;i<r;i++)this._model.data[o.children_d[i]].state.checked&&(this._data.checkbox.selected=E.vakata.array_remove_item(this._data.checkbox.selected,o.children_d[i]));return d.load_node.apply(this,arguments)},this.get_state=function(){var e=d.get_state.apply(this,arguments);return this.settings.checkbox.tie_selection||(e.checkbox=this._data.checkbox.selected.slice()),e},this.set_state=function(e,t){var i=d.set_state.apply(this,arguments),r;return i&&e.checkbox?(this.settings.checkbox.tie_selection||(this.uncheck_all(),r=this,E.each(e.checkbox,function(e,t){r.check_node(t)})),delete e.checkbox,this.set_state(e,t),!1):i},this.refresh=function(e,t){return this.settings.checkbox.tie_selection&&(this._data.checkbox.selected=[]),d.refresh.apply(this,arguments)}},E.jstree.defaults.conditionalselect=function(){return!0},E.jstree.plugins.conditionalselect=function(e,i){this.activate_node=function(e,t){if(this.settings.conditionalselect.call(this,this.get_node(e),t))return i.activate_node.call(this,e,t)}},E.jstree.defaults.contextmenu={select_node:!0,show_at_node:!0,items:function(e,t){return{create:{separator_before:!1,separator_after:!0,_disabled:!1,label:"Create",action:function(e){var i=E.jstree.reference(e.reference),e=i.get_node(e.reference);i.create_node(e,{},"last",function(t){try{i.edit(t)}catch(e){setTimeout(function(){i.edit(t)},0)}})}},rename:{separator_before:!1,separator_after:!1,_disabled:!1,label:"Rename",action:function(e){var t=E.jstree.reference(e.reference),e=t.get_node(e.reference);t.edit(e)}},remove:{separator_before:!1,icon:!1,separator_after:!1,_disabled:!1,label:"Delete",action:function(e){var t=E.jstree.reference(e.reference),e=t.get_node(e.reference);t.is_selected(e)?t.delete_node(t.get_selected()):t.delete_node(e)}},ccp:{separator_before:!0,icon:!1,separator_after:!1,label:"Edit",action:!1,submenu:{cut:{separator_before:!1,separator_after:!1,label:"Cut",action:function(e){var t=E.jstree.reference(e.reference),e=t.get_node(e.reference);t.is_selected(e)?t.cut(t.get_top_selected()):t.cut(e)}},copy:{separator_before:!1,icon:!1,separator_after:!1,label:"Copy",action:function(e){var t=E.jstree.reference(e.reference),e=t.get_node(e.reference);t.is_selected(e)?t.copy(t.get_top_selected()):t.copy(e)}},paste:{separator_before:!1,icon:!1,_disabled:function(e){return!E.jstree.reference(e.reference).can_paste()},separator_after:!1,label:"Paste",action:function(e){var t=E.jstree.reference(e.reference),e=t.get_node(e.reference);t.paste(e)}}}}}}},E.jstree.plugins.contextmenu=function(e,a){this.bind=function(){a.bind.call(this);var i=0,r=null,t,s;this.element.on("init.jstree loading.jstree ready.jstree",function(){this.get_container_ul().addClass("jstree-contextmenu")}.bind(this)).on("contextmenu.jstree",".jstree-anchor",function(e,t){"input"!==e.target.tagName.toLowerCase()&&(e.preventDefault(),i=e.ctrlKey?+new Date:0,(t||r)&&(i=+new Date+1e4),r&&clearTimeout(r),this.is_loading(e.currentTarget)||this.show_contextmenu(e.currentTarget,e.pageX,e.pageY,e))}.bind(this)).on("click.jstree",".jstree-anchor",function(e){this._data.contextmenu.visible&&(!i||250<+new Date-i)&&E.vakata.context.hide(),i=0}.bind(this)).on("touchstart.jstree",".jstree-anchor",function(e){e.originalEvent&&e.originalEvent.changedTouches&&e.originalEvent.changedTouches[0]&&(t=e.originalEvent.changedTouches[0].clientX,s=e.originalEvent.changedTouches[0].clientY,r=setTimeout(function(){E(e.currentTarget).trigger("contextmenu",!0)},750))}).on("touchmove.vakata.jstree",function(e){r&&e.originalEvent&&e.originalEvent.changedTouches&&e.originalEvent.changedTouches[0]&&(10<Math.abs(t-e.originalEvent.changedTouches[0].clientX)||10<Math.abs(s-e.originalEvent.changedTouches[0].clientY))&&(clearTimeout(r),E.vakata.context.hide())}).on("touchend.vakata.jstree",function(e){r&&clearTimeout(r)}),E(b).on("context_hide.vakata.jstree",function(e,t){this._data.contextmenu.visible=!1,E(t.reference).removeClass("jstree-context")}.bind(this))},this.teardown=function(){this._data.contextmenu.visible&&E.vakata.context.hide(),E(b).off("context_hide.vakata.jstree"),a.teardown.call(this)},this.show_contextmenu=function(t,i,r,e){if(!(t=this.get_node(t))||t.id===E.jstree.root)return!1;var s=this.settings.contextmenu,a,n=this.get_node(t,!0).children(".jstree-anchor"),o=!1,d=!1;!s.show_at_node&&i!==P&&r!==P||(o=n.offset(),i=o.left,r=o.top+this._data.core.li_height),this.settings.contextmenu.select_node&&!this.is_selected(t)&&this.activate_node(t,e),d=s.items,E.vakata.is_function(d)&&(d=d.call(this,t,function(e){this._show_contextmenu(t,i,r,e)}.bind(this))),E.isPlainObject(d)&&this._show_contextmenu(t,i,r,d)},this._show_contextmenu=function(e,t,i,r){var s,a=this.get_node(e,!0).children(".jstree-anchor");E(b).one("context_show.vakata.jstree",function(e,t){var i="jstree-contextmenu jstree-"+this.get_theme()+"-contextmenu";E(t.element).addClass(i),a.addClass("jstree-context")}.bind(this)),this._data.contextmenu.visible=!0,E.vakata.context.show(a,{x:t,y:i},r),this.trigger("show_contextmenu",{node:e,x:t,y:i})}},g={element:_=!1,reference:!1,position_x:0,position_y:0,items:[],html:"",is_visible:!1},(h=E).vakata.context={settings:{hide_onmouseleave:0,icons:!0},_trigger:function(e){h(b).triggerHandler("context_"+e+".vakata",{reference:g.reference,element:g.element,position:{x:g.position_x,y:g.position_y}})},_execute:function(e){return!(!(e=g.items[e])||e._disabled&&(!h.vakata.is_function(e._disabled)||e._disabled({item:e,reference:g.reference,element:g.element}))||!e.action)&&e.action.call(null,{item:e,reference:g.reference,element:g.element,position:{x:g.position_x,y:g.position_y}})},_parse:function(e,t){if(!e)return!1;t||(g.html="",g.items=[]);var i="",r=!1,s;return t&&(i+="<ul>"),h.each(e,function(e,t){return!t||(g.items.push(t),!r&&t.separator_before&&(i+="<li class='vakata-context-separator'><a href='#' "+(h.vakata.context.settings.icons?"":'class="vakata-context-no-icons"')+">&#160;</a></li>"),r=!1,i+="<li class='"+(t._class||"")+(!0===t._disabled||h.vakata.is_function(t._disabled)&&t._disabled({item:t,reference:g.reference,element:g.element})?" vakata-contextmenu-disabled ":"")+"' "+(t.shortcut?" data-shortcut='"+t.shortcut+"' ":"")+">",i+="<a href='#' rel='"+(g.items.length-1)+"' "+(t.title?"title='"+t.title+"'":"")+">",h.vakata.context.settings.icons&&(i+="<i ",t.icon&&(-1!==t.icon.indexOf("/")||-1!==t.icon.indexOf(".")?i+=" style='background:url(\""+t.icon+"\") center center no-repeat' ":i+=" class='"+t.icon+"' "),i+="></i><span class='vakata-contextmenu-sep'>&#160;</span>"),i+=(h.vakata.is_function(t.label)?t.label({item:e,reference:g.reference,element:g.element}):t.label)+(t.shortcut?' <span class="vakata-contextmenu-shortcut vakata-contextmenu-shortcut-'+t.shortcut+'">'+(t.shortcut_label||"")+"</span>":"")+"</a>",t.submenu&&(s=h.vakata.context._parse(t.submenu,!0))&&(i+=s),i+="</li>",void(t.separator_after&&(i+="<li class='vakata-context-separator'><a href='#' "+(h.vakata.context.settings.icons?"":'class="vakata-context-no-icons"')+">&#160;</a></li>",r=!0)))}),i=i.replace(/<li class\='vakata-context-separator'\><\/li\>$/,""),t&&(i+="</ul>"),t||(g.html=i,h.vakata.context._trigger("parse")),10<i.length&&i},_show_submenu:function(e){var t,i,r,s,a,n,o,d;(e=h(e)).length&&e.children("ul").length&&(t=e.children("ul"),r=(i=e.offset().left)+e.outerWidth(),s=e.offset().top,a=t.width(),n=t.height(),o=h(window).width()+h(window).scrollLeft(),d=h(window).height()+h(window).scrollTop(),_?e[r-(a+10+e.outerWidth())<0?"addClass":"removeClass"]("vakata-context-left"):e[o<r+a&&o-r<i?"addClass":"removeClass"]("vakata-context-right"),d<s+n+10&&t.css("bottom","-1px"),e.hasClass("vakata-context-right")?i<a&&t.css("margin-right",i-a):o-r<a&&t.css("margin-left",o-r-a),t.show())},show:function(e,t,i){var r,s,a,n,o,d,c,i,l=!0;switch(g.element&&g.element.length&&g.element.width(""),!0){case!t&&!e:return!1;case!!t&&!!e:g.reference=e,g.position_x=t.x,g.position_y=t.y;break;case!t&&!!e:r=(g.reference=e).offset(),g.position_x=r.left+e.outerHeight(),g.position_y=r.top;break;case!!t&&!e:g.position_x=t.x,g.position_y=t.y}e&&!i&&h(e).data("vakata_contextmenu")&&(i=h(e).data("vakata_contextmenu")),h.vakata.context._parse(i)&&g.element.html(g.html),g.items.length&&(g.element.appendTo(b.body),s=g.element,a=g.position_x,n=g.position_y,o=s.width(),d=s.height(),c=h(window).width()+h(window).scrollLeft(),i=h(window).height()+h(window).scrollTop(),_&&(a-=s.outerWidth()-h(e).outerWidth())<h(window).scrollLeft()+20&&(a=h(window).scrollLeft()+20),g.element.css({left:a=c<a+o+20?c-(o+20):a,top:n=i<n+d+20?i-(d+20):n}).show().find("a").first().trigger("focus").parent().addClass("vakata-context-hover"),g.is_visible=!0,h.vakata.context._trigger("show"))},hide:function(){g.is_visible&&(g.element.hide().find("ul").hide().end().find(":focus").trigger("blur").end().detach(),g.is_visible=!1,h.vakata.context._trigger("hide"))}},h(function(){_="rtl"===h(b.body).css("direction");var i=!1;g.element=h("<ul class='vakata-context'></ul>"),g.element.on("mouseenter","li",function(e){e.stopImmediatePropagation(),h.contains(this,e.relatedTarget)||(i&&clearTimeout(i),g.element.find(".vakata-context-hover").removeClass("vakata-context-hover").end(),h(this).siblings().find("ul").hide().end().end().parentsUntil(".vakata-context","li").addBack().addClass("vakata-context-hover"),h.vakata.context._show_submenu(this))}).on("mouseleave","li",function(e){h.contains(this,e.relatedTarget)||h(this).find(".vakata-context-hover").addBack().removeClass("vakata-context-hover")}).on("mouseleave",function(e){var t;h(this).find(".vakata-context-hover").removeClass("vakata-context-hover"),h.vakata.context.settings.hide_onmouseleave&&(i=setTimeout((t=this,function(){h.vakata.context.hide()}),h.vakata.context.settings.hide_onmouseleave))}).on("click","a",function(e){e.preventDefault(),h(this).trigger("blur").parent().hasClass("vakata-context-disabled")||!1===h.vakata.context._execute(h(this).attr("rel"))||h.vakata.context.hide()}).on("keydown","a",function(e){var t=null;switch(e.which){case 13:case 32:e.type="click",e.preventDefault(),h(e.currentTarget).trigger(e);break;case 37:g.is_visible&&(g.element.find(".vakata-context-hover").last().closest("li").first().find("ul").hide().find(".vakata-context-hover").removeClass("vakata-context-hover").end().end().children("a").trigger("focus"),e.stopImmediatePropagation(),e.preventDefault());break;case 38:g.is_visible&&((t=!(t=g.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").prevAll("li:not(.vakata-context-separator)").first()).length?g.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").last():t).addClass("vakata-context-hover").children("a").trigger("focus"),e.stopImmediatePropagation(),e.preventDefault());break;case 39:g.is_visible&&(g.element.find(".vakata-context-hover").last().children("ul").show().children("li:not(.vakata-context-separator)").removeClass("vakata-context-hover").first().addClass("vakata-context-hover").children("a").trigger("focus"),e.stopImmediatePropagation(),e.preventDefault());break;case 40:g.is_visible&&((t=!(t=g.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").nextAll("li:not(.vakata-context-separator)").first()).length?g.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").first():t).addClass("vakata-context-hover").children("a").trigger("focus"),e.stopImmediatePropagation(),e.preventDefault());break;case 27:h.vakata.context.hide(),e.preventDefault()}}).on("keydown",function(e){e.preventDefault();var e=g.element.find(".vakata-contextmenu-shortcut-"+e.which).parent();e.parent().not(".vakata-context-disabled")&&e.trigger("click")}),h(b).on("mousedown.vakata.jstree",function(e){g.is_visible&&g.element[0]!==e.target&&!h.contains(g.element[0],e.target)&&h.vakata.context.hide()}).on("context_show.vakata.jstree",function(e,t){g.element.find("li:has(ul)").children("a").addClass("vakata-context-parent"),_&&g.element.addClass("vakata-context-rtl").css("direction","rtl"),g.element.find("ul").hide().end()})}),E.jstree.defaults.dnd={copy:!0,open_timeout:500,is_draggable:!0,check_while_dragging:!0,always_copy:!1,inside_pos:0,drag_selection:!0,touch:!0,large_drop_target:!1,large_drag_target:!1,use_html5:!1,blank_space_drop:!1},E.jstree.plugins.dnd=function(e,o){this.init=function(e,t){o.init.call(this,e,t),this.settings.dnd.use_html5=this.settings.dnd.use_html5&&"draggable"in b.createElement("span")},this.bind=function(){o.bind.call(this),this.element.on(this.settings.dnd.use_html5?"dragstart.jstree":"mousedown.jstree touchstart.jstree",this.settings.dnd.large_drag_target?".jstree-node":".jstree-anchor",function(e){if(this.settings.dnd.large_drag_target&&E(e.target).closest(".jstree-node")[0]!==e.currentTarget)return!0;if("touchstart"===e.type&&(!this.settings.dnd.touch||"selected"===this.settings.dnd.touch&&!E(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").hasClass("jstree-clicked")))return!0;var t=this.get_node(e.target),i=this.is_selected(t)&&this.settings.dnd.drag_selection?this.get_top_selected().length:1,r=1<i?i+" "+this.get_string("nodes"):this.get_text(e.currentTarget);if(this.settings.core.force_text&&(r=E.vakata.html.escape(r)),t&&(t.id||0===t.id)&&t.id!==E.jstree.root&&(1===e.which||"touchstart"===e.type||"dragstart"===e.type)&&(!0===this.settings.dnd.is_draggable||E.vakata.is_function(this.settings.dnd.is_draggable)&&this.settings.dnd.is_draggable.call(this,1<i?this.get_top_selected(!0):[t],e))){if(d={jstree:!0,origin:this,obj:this.get_node(t,!0),nodes:1<i?this.get_top_selected():[t.id]},u=e.currentTarget,!this.settings.dnd.use_html5)return this.element.trigger("mousedown.jstree"),E.vakata.dnd.start(e,d,'<div id="jstree-dnd" class="jstree-'+this.get_theme()+" jstree-"+this.get_theme()+"-"+this.get_theme_variant()+" "+(this.settings.core.themes.responsive?" jstree-dnd-responsive":"")+'"><i class="jstree-icon jstree-er"></i>'+r+'<ins class="jstree-copy">+</ins></div>');E.vakata.dnd._trigger("start",e,{helper:E(),element:u,data:d})}}.bind(this)),this.settings.dnd.use_html5&&this.element.on("dragover.jstree",function(e){return e.preventDefault(),E.vakata.dnd._trigger("move",e,{helper:E(),element:u,data:d}),!1}).on("drop.jstree",function(e){return e.preventDefault(),E.vakata.dnd._trigger("stop",e,{helper:E(),element:u,data:d}),!1}.bind(this))},this.redraw_node=function(e,t,i,r){if((e=o.redraw_node.apply(this,arguments))&&this.settings.dnd.use_html5)if(this.settings.dnd.large_drag_target)e.setAttribute("draggable",!0);else{for(var s,a,n=null,s=0,a=e.childNodes.length;s<a;s++)if(e.childNodes[s]&&e.childNodes[s].className&&-1!==e.childNodes[s].className.indexOf("jstree-anchor")){n=e.childNodes[s];break}n&&n.setAttribute("draggable",!0)}return e}},E(function(){var N=!1,T=!1,O=!1,A=!1,S=E('<div id="jstree-marker">&#160;</div>').hide();E(b).on("dragover.vakata.jstree",function(e){u&&E.vakata.dnd._trigger("move",e,{helper:E(),element:u,data:d})}).on("drop.vakata.jstree",function(e){u&&(E.vakata.dnd._trigger("stop",e,{helper:E(),element:u,data:d}),d=u=null)}).on("dnd_start.vakata.jstree",function(e,t){O=N=!1,t&&t.data&&t.data.jstree&&S.appendTo(b.body)}).on("dnd_move.vakata.jstree",function(e,s){var a=s.event.target!==O.target;if(A&&(s.event&&"dragover"===s.event.type&&!a||clearTimeout(A)),s&&s.data&&s.data.jstree&&(!s.event.target.id||"jstree-marker"!==s.event.target.id)){O=s.event;var n=E.jstree.reference(s.event.target),o=!1,d=!1,t=!1,i,c,l,h,_,g,u,f,p,m,v,j,k,b,y,x,w,C;if(n&&n._data&&n._data.dnd)if(S.attr("class","jstree-"+n.get_theme()+(n.settings.core.themes.responsive?" jstree-dnd-responsive":"")),x=s.data.origin&&(s.data.origin.settings.dnd.always_copy||s.data.origin.settings.dnd.copy&&(s.event.metaKey||s.event.ctrlKey)),s.helper.children().attr("class","jstree-"+n.get_theme()+" jstree-"+n.get_theme()+"-"+n.get_theme_variant()+" "+(n.settings.core.themes.responsive?" jstree-dnd-responsive":"")).find(".jstree-copy").first()[x?"show":"hide"](),s.event.target!==n.element[0]&&s.event.target!==n.get_container_ul()[0]||0!==n.get_container_ul().children().length&&!n.settings.dnd.blank_space_drop){if((o=n.settings.dnd.large_drop_target?E(s.event.target).closest(".jstree-node").children(".jstree-anchor"):E(s.event.target).closest(".jstree-anchor"))&&o.length&&o.parent().is(".jstree-closed, .jstree-open, .jstree-leaf")&&(d=o.offset(),t=(s.event.pageY!==P?s.event:s.event.originalEvent).pageY-d.top,h=o.outerHeight(),u=t<h/3?["b","i","a"]:h-h/3<t?["a","i","b"]:h/2<t?["i","a","b"]:["i","b","a"],E.each(u,function(e,t){switch(t){case"b":c=d.left-6,l=d.top,_=n.get_parent(o),g=o.parent().index(),C="jstree-below";break;case"i":b=n.settings.dnd.inside_pos,y=n.get_node(o.parent()),c=d.left-2,l=d.top+h/2+1,_=y.id,g="first"===b?0:"last"===b?y.children.length:Math.min(b,y.children.length),C="jstree-inside";break;case"a":c=d.left-6,l=d.top+h,_=n.get_parent(o),g=o.parent().index()+1,C="jstree-above"}for(f=!0,p=0,m=s.data.nodes.length;p<m;p++)if(v=s.data.origin&&(s.data.origin.settings.dnd.always_copy||s.data.origin.settings.dnd.copy&&(s.event.metaKey||s.event.ctrlKey))?"copy_node":"move_node",j=g,"move_node"==v&&"a"===t&&s.data.origin&&s.data.origin===n&&_===n.get_parent(s.data.nodes[p])&&(k=n.get_node(_),j>E.inArray(s.data.nodes[p],k.children)&&--j),!(f=f&&(n&&n.settings&&n.settings.dnd&&!1===n.settings.dnd.check_while_dragging||n.check(v,s.data.origin&&s.data.origin!==n?s.data.origin.get_node(s.data.nodes[p]):s.data.nodes[p],_,j,{dnd:!0,ref:n.get_node(o.parent()),pos:t,origin:s.data.origin,is_multi:s.data.origin&&s.data.origin!==n,is_foreign:!s.data.origin})))){n&&n.last_error&&(T=n.last_error());break}var i,r;if("i"===t&&o.parent().is(".jstree-closed")&&n.settings.dnd.open_timeout&&(s.event&&"dragover"===s.event.type&&!a||(A&&clearTimeout(A),A=setTimeout((r=o,function(){i.open_node(r)}),(i=n).settings.dnd.open_timeout))),f)return(w=n.get_node(_,!0)).hasClass(".jstree-dnd-parent")||(E(".jstree-dnd-parent").removeClass("jstree-dnd-parent"),w.addClass("jstree-dnd-parent")),N={ins:n,par:_,pos:"i"!==t||"last"!==b||0!==g||n.is_loaded(y)?g:"last"},S.css({left:c+"px",top:l+"px"}).show(),S.removeClass("jstree-above jstree-inside jstree-below").addClass(C),s.helper.find(".jstree-icon").first().removeClass("jstree-er").addClass("jstree-ok"),s.event.originalEvent&&s.event.originalEvent.dataTransfer&&(s.event.originalEvent.dataTransfer.dropEffect=x?"copy":"move"),T={},!(u=!0)}),!0===u))return}else{for(f=!0,p=0,m=s.data.nodes.length;p<m;p++)if(!(f=f&&n.check(s.data.origin&&(s.data.origin.settings.dnd.always_copy||s.data.origin.settings.dnd.copy&&(s.event.metaKey||s.event.ctrlKey))?"copy_node":"move_node",s.data.origin&&s.data.origin!==n?s.data.origin.get_node(s.data.nodes[p]):s.data.nodes[p],E.jstree.root,"last",{dnd:!0,ref:n.get_node(E.jstree.root),pos:"i",origin:s.data.origin,is_multi:s.data.origin&&s.data.origin!==n,is_foreign:!s.data.origin})))break;if(f)return N={ins:n,par:E.jstree.root,pos:"last"},S.hide(),s.helper.find(".jstree-icon").first().removeClass("jstree-er").addClass("jstree-ok"),void(s.event.originalEvent&&s.event.originalEvent.dataTransfer&&(s.event.originalEvent.dataTransfer.dropEffect=x?"copy":"move"))}E(".jstree-dnd-parent").removeClass("jstree-dnd-parent"),N=!1,s.helper.find(".jstree-icon").removeClass("jstree-ok").addClass("jstree-er"),s.event.originalEvent&&s.event.originalEvent.dataTransfer,S.hide()}}).on("dnd_scroll.vakata.jstree",function(e,t){t&&t.data&&t.data.jstree&&(S.hide(),O=N=!1,t.helper.find(".jstree-icon").first().removeClass("jstree-ok").addClass("jstree-er"))}).on("dnd_stop.vakata.jstree",function(e,t){if(E(".jstree-dnd-parent").removeClass("jstree-dnd-parent"),A&&clearTimeout(A),t&&t.data&&t.data.jstree){S.hide().detach();var i,r,s=[];if(N){for(i=0,r=t.data.nodes.length;i<r;i++)s[i]=t.data.origin?t.data.origin.get_node(t.data.nodes[i]):t.data.nodes[i];N.ins[t.data.origin&&(t.data.origin.settings.dnd.always_copy||t.data.origin.settings.dnd.copy&&(t.event.metaKey||t.event.ctrlKey))?"copy_node":"move_node"](s,N.par,N.pos,!1,!1,!1,t.data.origin)}else(i=E(t.event.target).closest(".jstree")).length&&T&&T.error&&"check"===T.error&&(i=i.jstree(!0))&&i.settings.core.error.call(this,T);N=O=!1}}).on("keyup.jstree keydown.jstree",function(e,t){(t=E.vakata.dnd._get())&&t.data&&t.data.jstree&&("keyup"===e.type&&27===e.which?(A&&clearTimeout(A),A=O=T=N=!1,S.hide().detach(),E.vakata.dnd._clean()):(t.helper.find(".jstree-copy").first()[t.data.origin&&(t.data.origin.settings.dnd.always_copy||t.data.origin.settings.dnd.copy&&(e.metaKey||e.ctrlKey))?"show":"hide"](),O&&(O.metaKey=e.metaKey,O.ctrlKey=e.ctrlKey,E.vakata.dnd._trigger("move",O))))})}),p={element:!((f=E).vakata.html={div:f("<div></div>"),escape:function(e){return f.vakata.html.div.text(e).html()},strip:function(e){return f.vakata.html.div.empty().append(f.parseHTML(e)).text()}}),target:!1,is_down:!1,is_drag:!1,helper:!1,helper_w:0,data:!1,init_x:0,init_y:0,scroll_l:0,scroll_t:0,scroll_e:!1,scroll_i:!1,is_touch:!1},f.vakata.dnd={settings:{scroll_speed:10,scroll_proximity:20,helper_left:5,helper_top:10,threshold:5,threshold_touch:10},_trigger:function(e,t,i){(i=i===P?f.vakata.dnd._get():i).event=t,f(b).triggerHandler("dnd_"+e+".vakata",i)},_get:function(){return{data:p.data,element:p.element,helper:p.helper}},_clean:function(){p.helper&&p.helper.remove(),p.scroll_i&&(clearInterval(p.scroll_i),p.scroll_i=!1),p={element:!1,target:!1,is_down:!1,is_drag:!1,helper:!1,helper_w:0,data:!1,init_x:0,init_y:0,scroll_l:0,scroll_t:0,scroll_e:!1,scroll_i:!1,is_touch:!1},u=null,f(b).off("mousemove.vakata.jstree touchmove.vakata.jstree",f.vakata.dnd.drag),f(b).off("mouseup.vakata.jstree touchend.vakata.jstree",f.vakata.dnd.stop)},_scroll:function(e){if(!p.scroll_e||!p.scroll_l&&!p.scroll_t)return p.scroll_i&&(clearInterval(p.scroll_i),p.scroll_i=!1),!1;if(!p.scroll_i)return p.scroll_i=setInterval(f.vakata.dnd._scroll,100),!1;if(!0===e)return!1;var t=p.scroll_e.scrollTop(),e=p.scroll_e.scrollLeft();p.scroll_e.scrollTop(t+p.scroll_t*f.vakata.dnd.settings.scroll_speed),p.scroll_e.scrollLeft(e+p.scroll_l*f.vakata.dnd.settings.scroll_speed),t===p.scroll_e.scrollTop()&&e===p.scroll_e.scrollLeft()||f.vakata.dnd._trigger("scroll",p.scroll_e)},start:function(e,t,i){"touchstart"===e.type&&e.originalEvent&&e.originalEvent.changedTouches&&e.originalEvent.changedTouches[0]&&(e.pageX=e.originalEvent.changedTouches[0].pageX,e.pageY=e.originalEvent.changedTouches[0].pageY,e.target=b.elementFromPoint(e.originalEvent.changedTouches[0].pageX-window.pageXOffset,e.originalEvent.changedTouches[0].pageY-window.pageYOffset)),p.is_drag&&f.vakata.dnd.stop({});try{e.currentTarget.unselectable="on",e.currentTarget.onselectstart=function(){return!1},e.currentTarget.style&&(e.currentTarget.style.touchAction="none",e.currentTarget.style.msTouchAction="none",e.currentTarget.style.MozUserSelect="none")}catch(e){}return p.init_x=e.pageX,p.init_y=e.pageY,p.data=t,p.is_down=!0,p.element=e.currentTarget,p.target=e.target,p.is_touch="touchstart"===e.type,!1!==i&&(p.helper=f("<div id='vakata-dnd'></div>").html(i).css({display:"block",margin:"0",padding:"0",position:"absolute",top:"-2000px",lineHeight:"16px",zIndex:"10000"})),f(b).on("mousemove.vakata.jstree touchmove.vakata.jstree",f.vakata.dnd.drag),f(b).on("mouseup.vakata.jstree touchend.vakata.jstree",f.vakata.dnd.stop),!1},drag:function(i){if("touchmove"===i.type&&i.originalEvent&&i.originalEvent.changedTouches&&i.originalEvent.changedTouches[0]&&(i.pageX=i.originalEvent.changedTouches[0].pageX,i.pageY=i.originalEvent.changedTouches[0].pageY,i.target=b.elementFromPoint(i.originalEvent.changedTouches[0].pageX-window.pageXOffset,i.originalEvent.changedTouches[0].pageY-window.pageYOffset)),p.is_down){if(!p.is_drag){if(!(Math.abs(i.pageX-p.init_x)>(p.is_touch?f.vakata.dnd.settings.threshold_touch:f.vakata.dnd.settings.threshold)||Math.abs(i.pageY-p.init_y)>(p.is_touch?f.vakata.dnd.settings.threshold_touch:f.vakata.dnd.settings.threshold)))return;p.helper&&(p.helper.appendTo(b.body),p.helper_w=p.helper.outerWidth()),p.is_drag=!0,f(p.target).one("click.vakata",!1),f.vakata.dnd._trigger("start",i)}var e=!1,t=!1,r=!1,s=!1,a=!1,n=!1,o=!1,d=!1,c=!1,l=!1;return p.scroll_t=0,p.scroll_l=0,p.scroll_e=!1,f(f(i.target).parentsUntil("body").addBack().get().reverse()).filter(function(){return this.ownerDocument&&/^auto|scroll$/.test(f(this).css("overflow"))&&(this.scrollHeight>this.offsetHeight||this.scrollWidth>this.offsetWidth)}).each(function(){var e=f(this),t=e.offset();if(this.scrollHeight>this.offsetHeight&&(t.top+e.height()-i.pageY<f.vakata.dnd.settings.scroll_proximity&&(p.scroll_t=1),i.pageY-t.top<f.vakata.dnd.settings.scroll_proximity&&(p.scroll_t=-1)),this.scrollWidth>this.offsetWidth&&(t.left+e.width()-i.pageX<f.vakata.dnd.settings.scroll_proximity&&(p.scroll_l=1),i.pageX-t.left<f.vakata.dnd.settings.scroll_proximity&&(p.scroll_l=-1)),p.scroll_t||p.scroll_l)return p.scroll_e=f(this),!1}),p.scroll_e||(e=f(b),t=f(window),r=e.height(),s=t.height(),a=e.width(),n=t.width(),o=e.scrollTop(),d=e.scrollLeft(),s<r&&i.pageY-o<f.vakata.dnd.settings.scroll_proximity&&(p.scroll_t=-1),s<r&&s-(i.pageY-o)<f.vakata.dnd.settings.scroll_proximity&&(p.scroll_t=1),n<a&&i.pageX-d<f.vakata.dnd.settings.scroll_proximity&&(p.scroll_l=-1),n<a&&n-(i.pageX-d)<f.vakata.dnd.settings.scroll_proximity&&(p.scroll_l=1),(p.scroll_t||p.scroll_l)&&(p.scroll_e=e)),p.scroll_e&&f.vakata.dnd._scroll(!0),p.helper&&(c=parseInt(i.pageY+f.vakata.dnd.settings.helper_top,10),l=parseInt(i.pageX+f.vakata.dnd.settings.helper_left,10),a&&l+p.helper_w>a&&(l=a-(p.helper_w+2)),p.helper.css({left:l+"px",top:(c=r&&r<c+25?r-50:c)+"px"})),f.vakata.dnd._trigger("move",i),!1}},stop:function(e){var t;return"touchend"===e.type&&e.originalEvent&&e.originalEvent.changedTouches&&e.originalEvent.changedTouches[0]&&(e.pageX=e.originalEvent.changedTouches[0].pageX,e.pageY=e.originalEvent.changedTouches[0].pageY,e.target=b.elementFromPoint(e.originalEvent.changedTouches[0].pageX-window.pageXOffset,e.originalEvent.changedTouches[0].pageY-window.pageYOffset)),p.is_drag?(e.target!==p.target&&f(p.target).off("click.vakata"),f.vakata.dnd._trigger("stop",e)):"touchend"===e.type&&e.target===p.target&&(t=setTimeout(function(){f(e.target).trigger("click")},100),f(e.target).one("click",function(){t&&clearTimeout(t)})),f.vakata.dnd._clean(),!1}},E.jstree.defaults.massload=null,E.jstree.plugins.massload=function(e,l){this.init=function(e,t){this._data.massload={},l.init.call(this,e,t)},this._load_nodes=function(a,n,o,d){var e=this.settings.massload,t=[],i=this._model.data,r,s,c;if(!o){for(r=0,s=a.length;r<s;r++)i[a[r]]&&(i[a[r]].state.loaded||i[a[r]].state.failed)&&!d||(t.push(a[r]),(c=this.get_node(a[r],!0))&&c.length&&c.addClass("jstree-loading").attr("aria-busy",!0));if(this._data.massload={},t.length){if(E.vakata.is_function(e))return e.call(this,t,function(e){var t,i;if(e)for(t in e)e.hasOwnProperty(t)&&(this._data.massload[t]=e[t]);for(t=0,i=a.length;t<i;t++)(c=this.get_node(a[t],!0))&&c.length&&c.removeClass("jstree-loading").attr("aria-busy",!1);l._load_nodes.call(this,a,n,o,d)}.bind(this));if("object"==typeof e&&e&&e.url)return e=E.extend(!0,{},e),E.vakata.is_function(e.url)&&(e.url=e.url.call(this,t)),E.vakata.is_function(e.data)&&(e.data=e.data.call(this,t)),E.ajax(e).done(function(e,t,i){var r,s;if(e)for(r in e)e.hasOwnProperty(r)&&(this._data.massload[r]=e[r]);for(r=0,s=a.length;r<s;r++)(c=this.get_node(a[r],!0))&&c.length&&c.removeClass("jstree-loading").attr("aria-busy",!1);l._load_nodes.call(this,a,n,o,d)}.bind(this)).fail(function(e){l._load_nodes.call(this,a,n,o,d)}.bind(this))}}return l._load_nodes.call(this,a,n,o,d)},this._load_node=function(e,t){var i=this._data.massload[e.id],r=null,i;return i?(r=this["string"==typeof i?"_append_html_data":"_append_json_data"](e,"string"==typeof i?E(E.parseHTML(i)).filter(function(){return 3!==this.nodeType}):i,function(e){t.call(this,e)}),(i=this.get_node(e.id,!0))&&i.length&&i.removeClass("jstree-loading").attr("aria-busy",!1),delete this._data.massload[e.id],r):l._load_node.call(this,e,t)}},E.jstree.defaults.search={ajax:!1,fuzzy:!1,case_sensitive:!1,show_only_matches:!1,show_only_matches_children:!1,close_opened_onclear:!0,search_leaves_only:!1,search_callback:!1},E.jstree.plugins.search=function(e,o){this.bind=function(){o.bind.call(this),this._data.search.str="",this._data.search.dom=E(),this._data.search.res=[],this._data.search.opn=[],this._data.search.som=!1,this._data.search.smc=!1,this._data.search.hdn=[],this.element.on("search.jstree",function(e,t){if(this._data.search.som&&t.res.length){for(var i=this._model.data,r,s,a=[],n,o,r=0,s=t.res.length;r<s;r++)if(i[t.res[r]]&&!i[t.res[r]].state.hidden&&(a.push(t.res[r]),a=a.concat(i[t.res[r]].parents),this._data.search.smc))for(n=0,o=i[t.res[r]].children_d.length;n<o;n++)i[i[t.res[r]].children_d[n]]&&!i[i[t.res[r]].children_d[n]].state.hidden&&a.push(i[t.res[r]].children_d[n]);a=E.vakata.array_remove_item(E.vakata.array_unique(a),E.jstree.root),this._data.search.hdn=this.hide_all(!0),this.show_node(a,!0),this.redraw(!0)}}.bind(this)).on("clear_search.jstree",function(e,t){this._data.search.som&&t.res.length&&(this.show_node(this._data.search.hdn,!0),this.redraw(!0))}.bind(this))},this.search=function(r,e,t,i,s,a){if(!1===r||""===E.vakata.trim(r.toString()))return this.clear_search();i=(i=this.get_node(i))&&(i.id||0===i.id)?i.id:null,r=r.toString();var n=this.settings.search,o=n.ajax||!1,d=this._model.data,c=null,l=[],h=[],_,g;if(this._data.search.res.length&&!s&&this.clear_search(),t===P&&(t=n.show_only_matches),a===P&&(a=n.show_only_matches_children),!e&&!1!==o)return E.vakata.is_function(o)?o.call(this,r,function(e){e&&e.d&&(e=e.d),this._load_nodes(E.vakata.is_array(e)?E.vakata.array_unique(e):[],function(){this.search(r,!0,t,i,s,a)})}.bind(this),i):((o=E.extend({},o)).data||(o.data={}),o.data.str=r,i&&(o.data.inside=i),this._data.search.lastRequest&&this._data.search.lastRequest.abort(),this._data.search.lastRequest=E.ajax(o).fail(function(){this._data.core.last_error={error:"ajax",plugin:"search",id:"search_01",reason:"Could not load search parents",data:JSON.stringify(o)},this.settings.core.error.call(this,this._data.core.last_error)}.bind(this)).done(function(e){e&&e.d&&(e=e.d),this._load_nodes(E.vakata.is_array(e)?E.vakata.array_unique(e):[],function(){this.search(r,!0,t,i,s,a)})}.bind(this)),this._data.search.lastRequest);if(s||(this._data.search.str=r,this._data.search.dom=E(),this._data.search.res=[],this._data.search.opn=[],this._data.search.som=t,this._data.search.smc=a),c=new E.vakata.search(r,!0,{caseSensitive:n.case_sensitive,fuzzy:n.fuzzy}),E.each(d[i||E.jstree.root].children_d,function(e,t){var i=d[t];i.text&&!i.state.hidden&&(!n.search_leaves_only||i.state.loaded&&0===i.children.length)&&(n.search_callback&&n.search_callback.call(this,r,i)||!n.search_callback&&c.search(i.text).isMatch)&&(l.push(t),h=h.concat(i.parents))}),l.length){for(_=0,g=(h=E.vakata.array_unique(h)).length;_<g;_++)h[_]!==E.jstree.root&&d[h[_]]&&!0===this.open_node(h[_],null,0)&&this._data.search.opn.push(h[_]);s?(this._data.search.dom=this._data.search.dom.add(E(this.element[0].querySelectorAll("#"+E.map(l,function(e){return-1!=="0123456789".indexOf(e[0])?"\\3"+e[0]+" "+e.substr(1).replace(E.jstree.idregex,"\\$&"):e.replace(E.jstree.idregex,"\\$&")}).join(", #")))),this._data.search.res=E.vakata.array_unique(this._data.search.res.concat(l))):(this._data.search.dom=E(this.element[0].querySelectorAll("#"+E.map(l,function(e){return-1!=="0123456789".indexOf(e[0])?"\\3"+e[0]+" "+e.substr(1).replace(E.jstree.idregex,"\\$&"):e.replace(E.jstree.idregex,"\\$&")}).join(", #"))),this._data.search.res=l),this._data.search.dom.children(".jstree-anchor").addClass("jstree-search")}this.trigger("search",{nodes:this._data.search.dom,str:r,res:this._data.search.res,show_only_matches:t})},this.clear_search=function(){this.settings.search.close_opened_onclear&&this.close_node(this._data.search.opn,0),this.trigger("clear_search",{nodes:this._data.search.dom,str:this._data.search.str,res:this._data.search.res}),this._data.search.res.length&&(this._data.search.dom=E(this.element[0].querySelectorAll("#"+E.map(this._data.search.res,function(e){return-1!=="0123456789".indexOf(e[0])?"\\3"+e[0]+" "+e.substr(1).replace(E.jstree.idregex,"\\$&"):e.replace(E.jstree.idregex,"\\$&")}).join(", #"))),this._data.search.dom.children(".jstree-anchor").removeClass("jstree-search")),this._data.search.str="",this._data.search.res=[],this._data.search.opn=[],this._data.search.dom=E()},this.redraw_node=function(e,t,i,r){if((e=o.redraw_node.apply(this,arguments))&&-1!==E.inArray(e.id,this._data.search.res)){for(var s,a,n=null,s=0,a=e.childNodes.length;s<a;s++)if(e.childNodes[s]&&e.childNodes[s].className&&-1!==e.childNodes[s].className.indexOf("jstree-anchor")){n=e.childNodes[s];break}n&&(n.className+=" jstree-search")}return e}},(w=E).vakata.search=function(p,e,m){m=m||{},!1!==(m=w.extend({},w.vakata.search.defaults,m)).fuzzy&&(m.fuzzy=!0),p=m.caseSensitive?p:p.toLowerCase();var v=m.location,i=m.distance,j=m.threshold,k=p.length,b,y,x,t;return 32<k&&(m.fuzzy=!1),m.fuzzy&&(b=1<<k-1,y=function(){for(var e={},t=0,t=0;t<k;t++)e[p.charAt(t)]=0;for(t=0;t<k;t++)e[p.charAt(t)]|=1<<k-t-1;return e}(),x=function(e,t){var e=e/k,t=Math.abs(v-t);return i?e+t/i:t?1:e}),t=function(e){if(e=m.caseSensitive?e.toString():e.toString().toLowerCase(),p===e||-1!==e.indexOf(p))return{isMatch:!0,score:0};if(!m.fuzzy)return{isMatch:!1,score:1};var t,i,r=e.length,s=j,a=e.indexOf(p,v),n,o,d=k+r,c,l,h,_,g,u=1,f=[];for(-1!==a&&(s=Math.min(x(0,a),s),-1!==(a=e.lastIndexOf(p,v+k))&&(s=Math.min(x(0,a),s))),a=-1,t=0;t<k;t++){n=0,o=d;while(n<o)x(t,v+o)<=s?n=o:d=o,o=Math.floor((d-n)/2+n);for(d=o,l=Math.max(1,v-o+1),h=Math.min(v+o,r)+k,(_=new Array(h+2))[h+1]=(1<<t)-1,i=h;l<=i;i--)if(g=y[e.charAt(i-1)],_[i]=0===t?(_[i+1]<<1|1)&g:(_[i+1]<<1|1)&g|(c[i+1]|c[i])<<1|1|c[i+1],_[i]&b&&(u=x(t,i-1))<=s){if(s=u,f.push(a=i-1),!(v<a))break;l=Math.max(1,2*v-a)}if(x(t+1,v)>s)break;c=_}return{isMatch:0<=a,score:u}},!0===e?{search:t}:t(e)},w.vakata.search.defaults={location:0,distance:100,threshold:.6,fuzzy:!1,caseSensitive:!1},E.jstree.defaults.sort=function(e,t){return this.get_text(e)>this.get_text(t)?1:-1};var m=!(E.jstree.plugins.sort=function(e,t){this.bind=function(){t.bind.call(this),this.element.on("model.jstree",function(e,t){this.sort(t.parent,!0)}.bind(this)).on("rename_node.jstree create_node.jstree",function(e,t){this.sort(t.parent||t.node.parent,!1),this.redraw_node(t.parent||t.node.parent,!0)}.bind(this)).on("move_node.jstree copy_node.jstree",function(e,t){this.sort(t.parent,!1),this.redraw_node(t.parent,!0)}.bind(this))},this.sort=function(e,t){var i,r;if((e=this.get_node(e))&&e.children&&e.children.length&&(e.children.sort(this.settings.sort.bind(this)),t))for(i=0,r=e.children_d.length;i<r;i++)this.sort(e.children_d[i],!1)}}),t,v;E.jstree.defaults.state={key:"jstree",events:"changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree",ttl:!1,filter:!1,preserve_loaded:!1},E.jstree.plugins.state=function(e,t){this.bind=function(){t.bind.call(this);var i=function(){this.element.on(this.settings.state.events,function(){m&&clearTimeout(m),m=setTimeout(function(){this.save_state()}.bind(this),100)}.bind(this)),this.trigger("state_ready")}.bind(this);this.element.on("ready.jstree",function(e,t){this.element.one("restore_state.jstree",i),this.restore_state()||i()}.bind(this))},this.save_state=function(){var e=this.get_state();this.settings.state.preserve_loaded||delete e.core.loaded;var e={state:e,ttl:this.settings.state.ttl,sec:+new Date};E.vakata.storage.set(this.settings.state.key,JSON.stringify(e))},this.restore_state=function(){var i=E.vakata.storage.get(this.settings.state.key);if(i)try{i=JSON.parse(i)}catch(e){return!1}return!(i&&i.ttl&&i.sec&&+new Date-i.sec>i.ttl)&&(!!(i=(i=i&&i.state?i.state:i)&&E.vakata.is_function(this.settings.state.filter)?this.settings.state.filter.call(this,i):i)&&(this.settings.state.preserve_loaded||delete i.core.loaded,this.element.one("set_state.jstree",function(e,t){t.instance.trigger("restore_state",{state:E.extend(!0,{},i)})}),this.set_state(i),!0))},this.clear_state=function(){return E.vakata.storage.del(this.settings.state.key)}},E.vakata.storage={set:function(e,t){return window.localStorage.setItem(e,t)},get:function(e){return window.localStorage.getItem(e)},del:function(e){return window.localStorage.removeItem(e)}},E.jstree.defaults.types={default:{}},E.jstree.defaults.types[E.jstree.root]={},E.jstree.plugins.types=function(e,l){this.init=function(e,t){var i,r;if(t&&t.types&&t.types.default)for(i in t.types)if("default"!==i&&i!==E.jstree.root&&t.types.hasOwnProperty(i))for(r in t.types.default)t.types.default.hasOwnProperty(r)&&t.types[i][r]===P&&(t.types[i][r]=t.types.default[r]);l.init.call(this,e,t),this._model.data[E.jstree.root].type=E.jstree.root},this.refresh=function(e,t){l.refresh.call(this,e,t),this._model.data[E.jstree.root].type=E.jstree.root},this.bind=function(){this.element.on("model.jstree",function(e,t){for(var i=this._model.data,r=t.nodes,s=this.settings.types,a,n,o="default",d,a=0,n=r.length;a<n;a++){if(o="default",i[r[a]].original&&i[r[a]].original.type&&s[i[r[a]].original.type]&&(o=i[r[a]].original.type),i[r[a]].data&&i[r[a]].data.jstree&&i[r[a]].data.jstree.type&&s[i[r[a]].data.jstree.type]&&(o=i[r[a]].data.jstree.type),i[r[a]].type=o,!0===i[r[a]].icon&&s[o].icon!==P&&(i[r[a]].icon=s[o].icon),s[o].li_attr!==P&&"object"==typeof s[o].li_attr)for(d in s[o].li_attr)s[o].li_attr.hasOwnProperty(d)&&"id"!==d&&(i[r[a]].li_attr[d]===P?i[r[a]].li_attr[d]=s[o].li_attr[d]:"class"===d&&(i[r[a]].li_attr.class=s[o].li_attr.class+" "+i[r[a]].li_attr.class));if(s[o].a_attr!==P&&"object"==typeof s[o].a_attr)for(d in s[o].a_attr)s[o].a_attr.hasOwnProperty(d)&&"id"!==d&&(i[r[a]].a_attr[d]===P?i[r[a]].a_attr[d]=s[o].a_attr[d]:"href"===d&&"#"===i[r[a]].a_attr[d]?i[r[a]].a_attr.href=s[o].a_attr.href:"class"===d&&(i[r[a]].a_attr.class=s[o].a_attr.class+" "+i[r[a]].a_attr.class))}i[E.jstree.root].type=E.jstree.root}.bind(this)),l.bind.call(this)},this.get_json=function(e,t,i){var r,s,a=this._model.data,n=t?E.extend(!0,{},t,{no_id:!1}):{},o=l.get_json.call(this,e,n,i);if(!1===o)return!1;if(E.vakata.is_array(o))for(r=0,s=o.length;r<s;r++)o[r].type=(o[r].id||0===o[r].id)&&a[o[r].id]&&a[o[r].id].type?a[o[r].id].type:"default",t&&t.no_id&&(delete o[r].id,o[r].li_attr&&o[r].li_attr.id&&delete o[r].li_attr.id,o[r].a_attr&&o[r].a_attr.id&&delete o[r].a_attr.id);else o.type=(o.id||0===o.id)&&a[o.id]&&a[o.id].type?a[o.id].type:"default",t&&t.no_id&&(o=this._delete_ids(o));return o},this._delete_ids=function(e){if(E.vakata.is_array(e)){for(var t=0,i=e.length;t<i;t++)e[t]=this._delete_ids(e[t]);return e}return delete e.id,e.li_attr&&e.li_attr.id&&delete e.li_attr.id,e.a_attr&&e.a_attr.id&&delete e.a_attr.id,e.children&&E.vakata.is_array(e.children)&&(e.children=this._delete_ids(e.children)),e},this.check=function(e,t,i,r,s){if(!1===l.check.call(this,e,t,i,r,s))return!1;t=t&&(t.id||0===t.id)?t:this.get_node(t),i=i&&(i.id||0===i.id)?i:this.get_node(i);var a,n,o,d,c,a=(a=t&&(t.id||0===t.id)?s&&s.origin?s.origin:E.jstree.reference(t.id):null)&&a._model&&a._model.data?a._model.data:null;switch(e){case"create_node":case"move_node":case"copy_node":if("move_node"!==e||-1===E.inArray(t.id,i.children)){if((n=this.get_rules(i)).max_children!==P&&-1!==n.max_children&&n.max_children===i.children.length)return!(this._data.core.last_error={error:"check",plugin:"types",id:"types_01",reason:"max_children prevents function: "+e,data:JSON.stringify({chk:e,pos:r,obj:!(!t||!t.id&&0!==t.id)&&t.id,par:!(!i||!i.id&&0!==i.id)&&i.id})});if(n.valid_children!==P&&-1!==n.valid_children&&-1===E.inArray(t.type||"default",n.valid_children))return!(this._data.core.last_error={error:"check",plugin:"types",id:"types_02",reason:"valid_children prevents function: "+e,data:JSON.stringify({chk:e,pos:r,obj:!(!t||!t.id&&0!==t.id)&&t.id,par:!(!i||!i.id&&0!==i.id)&&i.id})});if(a&&t.children_d&&t.parents){for(d=o=0,c=t.children_d.length;d<c;d++)o=Math.max(o,a[t.children_d[d]].parents.length);o=o-t.parents.length+1}(o<=0||o===P)&&(o=1);do{if(n.max_depth!==P&&-1!==n.max_depth&&n.max_depth<o)return!(this._data.core.last_error={error:"check",plugin:"types",id:"types_03",reason:"max_depth prevents function: "+e,data:JSON.stringify({chk:e,pos:r,obj:!(!t||!t.id&&0!==t.id)&&t.id,par:!(!i||!i.id&&0!==i.id)&&i.id})});i=this.get_node(i.parent),n=this.get_rules(i),o++}while(i)}}return!0},this.get_rules=function(e){if(!(e=this.get_node(e)))return!1;var e=this.get_type(e,!0);return e.max_depth===P&&(e.max_depth=-1),e.max_children===P&&(e.max_children=-1),e.valid_children===P&&(e.valid_children=-1),e},this.get_type=function(e,t){return!!(e=this.get_node(e))&&(t?E.extend({type:e.type},this.settings.types[e.type]):e.type)},this.set_type=function(e,t){var i=this._model.data,r,s,a,n,o,d,c,l;if(E.vakata.is_array(e)){for(s=0,a=(e=e.slice()).length;s<a;s++)this.set_type(e[s],t);return!0}if(r=this.settings.types,e=this.get_node(e),!r[t]||!e)return!1;if((c=this.get_node(e,!0))&&c.length&&(l=c.children(".jstree-anchor")),n=e.type,o=this.get_icon(e),e.type=t,!0!==o&&r[n]&&(r[n].icon===P||o!==r[n].icon)||this.set_icon(e,r[t].icon===P||r[t].icon),r[n]&&r[n].li_attr!==P&&"object"==typeof r[n].li_attr)for(d in r[n].li_attr)r[n].li_attr.hasOwnProperty(d)&&"id"!==d&&("class"===d?(i[e.id].li_attr.class=(i[e.id].li_attr.class||"").replace(r[n].li_attr[d],""),c&&c.removeClass(r[n].li_attr[d])):i[e.id].li_attr[d]===r[n].li_attr[d]&&(i[e.id].li_attr[d]=null,c&&c.removeAttr(d)));if(r[n]&&r[n].a_attr!==P&&"object"==typeof r[n].a_attr)for(d in r[n].a_attr)r[n].a_attr.hasOwnProperty(d)&&"id"!==d&&("class"===d?(i[e.id].a_attr.class=(i[e.id].a_attr.class||"").replace(r[n].a_attr[d],""),l&&l.removeClass(r[n].a_attr[d])):i[e.id].a_attr[d]===r[n].a_attr[d]&&("href"===d?(i[e.id].a_attr[d]="#",l&&l.attr("href","#")):(delete i[e.id].a_attr[d],l&&l.removeAttr(d))));if(r[t].li_attr!==P&&"object"==typeof r[t].li_attr)for(d in r[t].li_attr)r[t].li_attr.hasOwnProperty(d)&&"id"!==d&&(i[e.id].li_attr[d]===P?(i[e.id].li_attr[d]=r[t].li_attr[d],c&&("class"===d?c.addClass(r[t].li_attr[d]):c.attr(d,r[t].li_attr[d]))):"class"===d&&(i[e.id].li_attr.class=r[t].li_attr[d]+" "+i[e.id].li_attr.class,c&&c.addClass(r[t].li_attr[d])));if(r[t].a_attr!==P&&"object"==typeof r[t].a_attr)for(d in r[t].a_attr)r[t].a_attr.hasOwnProperty(d)&&"id"!==d&&(i[e.id].a_attr[d]===P?(i[e.id].a_attr[d]=r[t].a_attr[d],l&&("class"===d?l.addClass(r[t].a_attr[d]):l.attr(d,r[t].a_attr[d]))):"href"===d&&"#"===i[e.id].a_attr[d]?(i[e.id].a_attr.href=r[t].a_attr.href,l&&l.attr("href",r[t].a_attr.href)):"class"===d&&(i[e.id].a_attr.class=r[t].a_attr.class+" "+i[e.id].a_attr.class,l&&l.addClass(r[t].a_attr[d])));return!0}},E.jstree.defaults.unique={case_sensitive:!1,trim_whitespace:!1,duplicate:function(e,t){return e+" ("+t+")"}},E.jstree.plugins.unique=function(e,f){this.check=function(e,t,i,r,s){if(!1===f.check.call(this,e,t,i,r,s))return!1;if(t=t&&(t.id||0===t.id)?t:this.get_node(t),!(i=i&&(i.id||0===i.id)?i:this.get_node(i))||!i.children)return!0;for(var a="rename_node"===e?r:t.text,n=[],o=this.settings.unique.case_sensitive,d=this.settings.unique.trim_whitespace,c=this._model.data,l,h,_,l=0,h=i.children.length;l<h;l++)_=c[i.children[l]].text,o||(_=_.toLowerCase()),d&&(_=_.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")),n.push(_);switch(o||(a=a.toLowerCase()),d&&(a=a.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")),e){case"delete_node":return!0;case"rename_node":return _=t.text||"",o||(_=_.toLowerCase()),d&&(_=_.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")),(l=-1===E.inArray(a,n)||t.text&&_===a)||(this._data.core.last_error={error:"check",plugin:"unique",id:"unique_01",reason:"Child with name "+a+" already exists. Preventing: "+e,data:JSON.stringify({chk:e,pos:r,obj:!(!t||!t.id&&0!==t.id)&&t.id,par:!(!i||!i.id&&0!==i.id)&&i.id})}),l;case"create_node":return(l=-1===E.inArray(a,n))||(this._data.core.last_error={error:"check",plugin:"unique",id:"unique_04",reason:"Child with name "+a+" already exists. Preventing: "+e,data:JSON.stringify({chk:e,pos:r,obj:!(!t||!t.id&&0!==t.id)&&t.id,par:!(!i||!i.id&&0!==i.id)&&i.id})}),l;case"copy_node":return(l=-1===E.inArray(a,n))||(this._data.core.last_error={error:"check",plugin:"unique",id:"unique_02",reason:"Child with name "+a+" already exists. Preventing: "+e,data:JSON.stringify({chk:e,pos:r,obj:!(!t||!t.id&&0!==t.id)&&t.id,par:!(!i||!i.id&&0!==i.id)&&i.id})}),l;case"move_node":return(l=t.parent===i.id&&(!s||!s.is_multi)||-1===E.inArray(a,n))||(this._data.core.last_error={error:"check",plugin:"unique",id:"unique_03",reason:"Child with name "+a+" already exists. Preventing: "+e,data:JSON.stringify({chk:e,pos:r,obj:!(!t||!t.id&&0!==t.id)&&t.id,par:!(!i||!i.id&&0!==i.id)&&i.id})}),l}return!0},this.create_node=function(e,t,i,r,s){if(!t||"object"==typeof t&&t.text===P){if(null===e&&(e=E.jstree.root),!(e=this.get_node(e)))return f.create_node.call(this,e,t,i,r,s);if(!(i=i===P?"last":i).toString().match(/^(before|after)$/)&&!s&&!this.is_loaded(e))return f.create_node.call(this,e,t,i,r,s);t=t||{};for(var a,n,o,d,c,l=this._model.data,h=this.settings.unique.case_sensitive,_=this.settings.unique.trim_whitespace,g=this.settings.unique.duplicate,u,n=a=this.get_string("New node"),o=[],d=0,c=e.children.length;d<c;d++)u=l[e.children[d]].text,h||(u=u.toLowerCase()),_&&(u=u.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")),o.push(u);d=1,u=n,h||(u=u.toLowerCase()),_&&(u=u.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""));while(-1!==E.inArray(u,o))u=n=g.call(this,a,++d).toString(),h||(u=u.toLowerCase()),_&&(u=u.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""));t.text=n}return f.create_node.call(this,e,t,i,r,s)}};var j=b.createElement("DIV");if(j.setAttribute("unselectable","on"),j.setAttribute("role","presentation"),j.className="jstree-wholerow",j.innerHTML="&#160;",E.jstree.plugins.wholerow=function(e,a){this.bind=function(){a.bind.call(this),this.element.on("ready.jstree set_state.jstree",function(){this.hide_dots()}.bind(this)).on("init.jstree loading.jstree ready.jstree",function(){this.get_container_ul().addClass("jstree-wholerow-ul")}.bind(this)).on("deselect_all.jstree",function(e,t){this.element.find(".jstree-wholerow-clicked").removeClass("jstree-wholerow-clicked")}.bind(this)).on("changed.jstree",function(e,t){this.element.find(".jstree-wholerow-clicked").removeClass("jstree-wholerow-clicked");for(var i=!1,r,s,r=0,s=t.selected.length;r<s;r++)(i=this.get_node(t.selected[r],!0))&&i.length&&i.children(".jstree-wholerow").addClass("jstree-wholerow-clicked")}.bind(this)).on("open_node.jstree",function(e,t){this.get_node(t.node,!0).find(".jstree-clicked").parent().children(".jstree-wholerow").addClass("jstree-wholerow-clicked")}.bind(this)).on("hover_node.jstree dehover_node.jstree",function(e,t){"hover_node"===e.type&&this.is_disabled(t.node)||this.get_node(t.node,!0).children(".jstree-wholerow")["hover_node"===e.type?"addClass":"removeClass"]("jstree-wholerow-hovered")}.bind(this)).on("contextmenu.jstree",".jstree-wholerow",function(e){var t;this._data.contextmenu&&(e.preventDefault(),t=E.Event("contextmenu",{metaKey:e.metaKey,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey,pageX:e.pageX,pageY:e.pageY}),E(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(t))}.bind(this)).on("click.jstree",".jstree-wholerow",function(e){e.stopImmediatePropagation();var t=E.Event("click",{metaKey:e.metaKey,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey});E(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(t).trigger("focus")}).on("dblclick.jstree",".jstree-wholerow",function(e){e.stopImmediatePropagation();var t=E.Event("dblclick",{metaKey:e.metaKey,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey});E(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(t).trigger("focus")}).on("click.jstree",".jstree-leaf > .jstree-ocl",function(e){e.stopImmediatePropagation();var t=E.Event("click",{metaKey:e.metaKey,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey});E(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(t).trigger("focus")}.bind(this)).on("mouseover.jstree",".jstree-wholerow, .jstree-icon",function(e){return e.stopImmediatePropagation(),this.is_disabled(e.currentTarget)||this.hover_node(e.currentTarget),!1}.bind(this)).on("mouseleave.jstree",".jstree-node",function(e){this.dehover_node(e.currentTarget)}.bind(this))},this.teardown=function(){this.settings.wholerow&&this.element.find(".jstree-wholerow").remove(),a.teardown.call(this)},this.redraw_node=function(e,t,i,r){var s;return(e=a.redraw_node.apply(this,arguments))&&(s=j.cloneNode(!0),-1!==E.inArray(e.id,this._data.core.selected)&&(s.className+=" jstree-wholerow-clicked"),this._data.core.focused&&this._data.core.focused===e.id&&(s.className+=" jstree-wholerow-hovered"),e.insertBefore(s,e.childNodes[0])),e}},window.customElements&&Object&&Object.create){var e=Object.create(HTMLElement.prototype);e.createdCallback=function(){var e={core:{},plugins:[]},t;for(t in E.jstree.plugins)E.jstree.plugins.hasOwnProperty(t)&&this.attributes[t]&&(e.plugins.push(t),this.getAttribute(t)&&JSON.parse(this.getAttribute(t))&&(e[t]=JSON.parse(this.getAttribute(t))));for(t in E.jstree.defaults.core)E.jstree.defaults.core.hasOwnProperty(t)&&this.attributes[t]&&(e.core[t]=JSON.parse(this.getAttribute(t))||this.getAttribute(t));E(this).jstree(e)};try{window.customElements.define("vakata-jstree",function(){},{prototype:e})}catch(e){}}}});
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/32px.png b/public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/32px.png
deleted file mode 100644
index 60395729ef6cfda914b211d5a45c9d2c083b3175..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1525
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
Ve7B44_jjPe*wfX|Wt~$(6957l+<gE5

diff --git a/public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/40px.png b/public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/40px.png
deleted file mode 100644
index aae89ad38a279325d734f3c608c6703a4b34e1ae..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6526
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

diff --git a/public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/style.css b/public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/style.css
deleted file mode 100644
index 68ec9e33bf..0000000000
--- a/public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/style.css
+++ /dev/null
@@ -1,1150 +0,0 @@
-/* jsTree default dark theme */
-.jstree-node,
-.jstree-children,
-.jstree-container-ul {
-  display: block;
-  margin: 0;
-  padding: 0;
-  list-style-type: none;
-  list-style-image: none;
-}
-.jstree-node {
-  white-space: nowrap;
-}
-.jstree-anchor {
-  display: inline-block;
-  color: black;
-  white-space: nowrap;
-  padding: 0 4px 0 1px;
-  margin: 0;
-  vertical-align: top;
-}
-.jstree-anchor:focus {
-  outline: 0;
-}
-.jstree-anchor,
-.jstree-anchor:link,
-.jstree-anchor:visited,
-.jstree-anchor:hover,
-.jstree-anchor:active {
-  text-decoration: none;
-  color: inherit;
-}
-.jstree-icon {
-  display: inline-block;
-  text-decoration: none;
-  margin: 0;
-  padding: 0;
-  vertical-align: top;
-  text-align: center;
-}
-.jstree-icon:empty {
-  display: inline-block;
-  text-decoration: none;
-  margin: 0;
-  padding: 0;
-  vertical-align: top;
-  text-align: center;
-}
-.jstree-ocl {
-  cursor: pointer;
-}
-.jstree-leaf > .jstree-ocl {
-  cursor: default;
-}
-.jstree .jstree-open > .jstree-children {
-  display: block;
-}
-.jstree .jstree-closed > .jstree-children,
-.jstree .jstree-leaf > .jstree-children {
-  display: none;
-}
-.jstree-anchor > .jstree-themeicon {
-  margin-right: 2px;
-}
-.jstree-no-icons .jstree-themeicon,
-.jstree-anchor > .jstree-themeicon-hidden {
-  display: none;
-}
-.jstree-hidden,
-.jstree-node.jstree-hidden {
-  display: none;
-}
-.jstree-rtl .jstree-anchor {
-  padding: 0 1px 0 4px;
-}
-.jstree-rtl .jstree-anchor > .jstree-themeicon {
-  margin-left: 2px;
-  margin-right: 0;
-}
-.jstree-rtl .jstree-node {
-  margin-left: 0;
-}
-.jstree-rtl .jstree-container-ul > .jstree-node {
-  margin-right: 0;
-}
-.jstree-wholerow-ul {
-  position: relative;
-  display: inline-block;
-  min-width: 100%;
-}
-.jstree-wholerow-ul .jstree-leaf > .jstree-ocl {
-  cursor: pointer;
-}
-.jstree-wholerow-ul .jstree-anchor,
-.jstree-wholerow-ul .jstree-icon {
-  position: relative;
-}
-.jstree-wholerow-ul .jstree-wholerow {
-  width: 100%;
-  cursor: pointer;
-  position: absolute;
-  left: 0;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.jstree-contextmenu .jstree-anchor {
-  -webkit-user-select: none;
-  /* disable selection/Copy of UIWebView */
-  -webkit-touch-callout: none;
-  /* disable the IOS popup when long-press on a link */
-  user-select: none;
-}
-.vakata-context {
-  display: none;
-}
-.vakata-context,
-.vakata-context ul {
-  margin: 0;
-  padding: 2px;
-  position: absolute;
-  background: #f5f5f5;
-  border: 1px solid #979797;
-  box-shadow: 2px 2px 2px #999999;
-}
-.vakata-context ul {
-  list-style: none;
-  left: 100%;
-  margin-top: -2.7em;
-  margin-left: -4px;
-}
-.vakata-context .vakata-context-right ul {
-  left: auto;
-  right: 100%;
-  margin-left: auto;
-  margin-right: -4px;
-}
-.vakata-context li {
-  list-style: none;
-}
-.vakata-context li > a {
-  display: block;
-  padding: 0 2em 0 2em;
-  text-decoration: none;
-  width: auto;
-  color: black;
-  white-space: nowrap;
-  line-height: 2.4em;
-  text-shadow: 1px 1px 0 white;
-  border-radius: 1px;
-}
-.vakata-context li > a:hover {
-  position: relative;
-  background-color: #e8eff7;
-  box-shadow: 0 0 2px #0a6aa1;
-}
-.vakata-context li > a.vakata-context-parent {
-  background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");
-  background-position: right center;
-  background-repeat: no-repeat;
-}
-.vakata-context li > a:focus {
-  outline: 0;
-}
-.vakata-context .vakata-context-no-icons {
-  margin-left: 0;
-}
-.vakata-context .vakata-context-hover > a {
-  position: relative;
-  background-color: #e8eff7;
-  box-shadow: 0 0 2px #0a6aa1;
-}
-.vakata-context .vakata-context-separator > a,
-.vakata-context .vakata-context-separator > a:hover {
-  background: white;
-  border: 0;
-  border-top: 1px solid #e2e3e3;
-  height: 1px;
-  min-height: 1px;
-  max-height: 1px;
-  padding: 0;
-  margin: 0 0 0 2.4em;
-  border-left: 1px solid #e0e0e0;
-  text-shadow: 0 0 0 transparent;
-  box-shadow: 0 0 0 transparent;
-  border-radius: 0;
-}
-.vakata-context .vakata-contextmenu-disabled a,
-.vakata-context .vakata-contextmenu-disabled a:hover {
-  color: silver;
-  background-color: transparent;
-  border: 0;
-  box-shadow: 0 0 0;
-}
-.vakata-context .vakata-contextmenu-disabled > a > i {
-  filter: grayscale(100%);
-}
-.vakata-context li > a > i {
-  text-decoration: none;
-  display: inline-block;
-  width: 2.4em;
-  height: 2.4em;
-  background: transparent;
-  margin: 0 0 0 -2em;
-  vertical-align: top;
-  text-align: center;
-  line-height: 2.4em;
-}
-.vakata-context li > a > i:empty {
-  width: 2.4em;
-  line-height: 2.4em;
-}
-.vakata-context li > a .vakata-contextmenu-sep {
-  display: inline-block;
-  width: 1px;
-  height: 2.4em;
-  background: white;
-  margin: 0 0.5em 0 0;
-  border-left: 1px solid #e2e3e3;
-}
-.vakata-context .vakata-contextmenu-shortcut {
-  font-size: 0.8em;
-  color: silver;
-  opacity: 0.5;
-  display: none;
-}
-.vakata-context-rtl ul {
-  left: auto;
-  right: 100%;
-  margin-left: auto;
-  margin-right: -4px;
-}
-.vakata-context-rtl li > a.vakata-context-parent {
-  background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-.vakata-context-rtl .vakata-context-separator > a {
-  margin: 0 2.4em 0 0;
-  border-left: 0;
-  border-right: 1px solid #e2e3e3;
-}
-.vakata-context-rtl .vakata-context-left ul {
-  right: auto;
-  left: 100%;
-  margin-left: -4px;
-  margin-right: auto;
-}
-.vakata-context-rtl li > a > i {
-  margin: 0 -2em 0 0;
-}
-.vakata-context-rtl li > a .vakata-contextmenu-sep {
-  margin: 0 0 0 0.5em;
-  border-left-color: white;
-  background: #e2e3e3;
-}
-#jstree-marker {
-  position: absolute;
-  top: 0;
-  left: 0;
-  margin: -5px 0 0 0;
-  padding: 0;
-  border-right: 0;
-  border-top: 5px solid transparent;
-  border-bottom: 5px solid transparent;
-  border-left: 5px solid;
-  width: 0;
-  height: 0;
-  font-size: 0;
-  line-height: 0;
-}
-#jstree-dnd {
-  line-height: 16px;
-  margin: 0;
-  padding: 4px;
-}
-#jstree-dnd .jstree-icon,
-#jstree-dnd .jstree-copy {
-  display: inline-block;
-  text-decoration: none;
-  margin: 0 2px 0 0;
-  padding: 0;
-  width: 16px;
-  height: 16px;
-}
-#jstree-dnd .jstree-ok {
-  background: green;
-}
-#jstree-dnd .jstree-er {
-  background: red;
-}
-#jstree-dnd .jstree-copy {
-  margin: 0 2px 0 2px;
-}
-.jstree-default-dark .jstree-node,
-.jstree-default-dark .jstree-icon {
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-.jstree-default-dark .jstree-anchor,
-.jstree-default-dark .jstree-animated,
-.jstree-default-dark .jstree-wholerow {
-  transition: background-color 0.15s, box-shadow 0.15s;
-}
-.jstree-default-dark .jstree-hovered {
-  background: #555;
-  border-radius: 2px;
-  box-shadow: inset 0 0 1px #555;
-}
-.jstree-default-dark .jstree-context {
-  background: #555;
-  border-radius: 2px;
-  box-shadow: inset 0 0 1px #555;
-}
-.jstree-default-dark .jstree-clicked {
-  background: #5fa2db;
-  border-radius: 2px;
-  box-shadow: inset 0 0 1px #666666;
-}
-.jstree-default-dark .jstree-no-icons .jstree-anchor > .jstree-themeicon {
-  display: none;
-}
-.jstree-default-dark .jstree-disabled {
-  background: transparent;
-  color: #666666;
-}
-.jstree-default-dark .jstree-disabled.jstree-hovered {
-  background: transparent;
-  box-shadow: none;
-}
-.jstree-default-dark .jstree-disabled.jstree-clicked {
-  background: #333333;
-}
-.jstree-default-dark .jstree-disabled > .jstree-icon {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default-dark .jstree-search {
-  font-style: italic;
-  color: #ffffff;
-  font-weight: bold;
-}
-.jstree-default-dark .jstree-no-checkboxes .jstree-checkbox {
-  display: none !important;
-}
-.jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked {
-  background: transparent;
-  box-shadow: none;
-}
-.jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered {
-  background: #555;
-}
-.jstree-default-dark.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked {
-  background: transparent;
-}
-.jstree-default-dark.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered {
-  background: #555;
-}
-.jstree-default-dark > .jstree-striped {
-  min-width: 100%;
-  display: inline-block;
-  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat;
-}
-.jstree-default-dark > .jstree-wholerow-ul .jstree-hovered,
-.jstree-default-dark > .jstree-wholerow-ul .jstree-clicked {
-  background: transparent;
-  box-shadow: none;
-  border-radius: 0;
-}
-.jstree-default-dark .jstree-wholerow {
-  -moz-box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.jstree-default-dark .jstree-wholerow-hovered {
-  background: #555;
-}
-.jstree-default-dark .jstree-wholerow-clicked {
-  background: #5fa2db;
-  background: -webkit-linear-gradient(top, #5fa2db 0%, #5fa2db 100%);
-  background: linear-gradient(to bottom, #5fa2db 0%, #5fa2db 100%);
-}
-.jstree-default-dark .jstree-node {
-  min-height: 24px;
-  line-height: 24px;
-  margin-left: 24px;
-  min-width: 24px;
-}
-.jstree-default-dark .jstree-anchor {
-  line-height: 24px;
-  height: 24px;
-}
-.jstree-default-dark .jstree-icon {
-  width: 24px;
-  height: 24px;
-  line-height: 24px;
-}
-.jstree-default-dark .jstree-icon:empty {
-  width: 24px;
-  height: 24px;
-  line-height: 24px;
-}
-.jstree-default-dark.jstree-rtl .jstree-node {
-  margin-right: 24px;
-}
-.jstree-default-dark .jstree-wholerow {
-  height: 24px;
-}
-.jstree-default-dark .jstree-node,
-.jstree-default-dark .jstree-icon {
-  background-image: url("32px.png");
-}
-.jstree-default-dark .jstree-node {
-  background-position: -292px -4px;
-  background-repeat: repeat-y;
-}
-.jstree-default-dark .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark .jstree-open > .jstree-ocl {
-  background-position: -132px -4px;
-}
-.jstree-default-dark .jstree-closed > .jstree-ocl {
-  background-position: -100px -4px;
-}
-.jstree-default-dark .jstree-leaf > .jstree-ocl {
-  background-position: -68px -4px;
-}
-.jstree-default-dark .jstree-themeicon {
-  background-position: -260px -4px;
-}
-.jstree-default-dark > .jstree-no-dots .jstree-node,
-.jstree-default-dark > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-dark > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -36px -4px;
-}
-.jstree-default-dark > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -4px -4px;
-}
-.jstree-default-dark .jstree-disabled {
-  background: transparent;
-}
-.jstree-default-dark .jstree-disabled.jstree-hovered {
-  background: transparent;
-}
-.jstree-default-dark .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default-dark .jstree-checkbox {
-  background-position: -164px -4px;
-}
-.jstree-default-dark .jstree-checkbox:hover {
-  background-position: -164px -36px;
-}
-.jstree-default-dark.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-.jstree-default-dark .jstree-checked > .jstree-checkbox {
-  background-position: -228px -4px;
-}
-.jstree-default-dark.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-.jstree-default-dark .jstree-checked > .jstree-checkbox:hover {
-  background-position: -228px -36px;
-}
-.jstree-default-dark .jstree-anchor > .jstree-undetermined {
-  background-position: -196px -4px;
-}
-.jstree-default-dark .jstree-anchor > .jstree-undetermined:hover {
-  background-position: -196px -36px;
-}
-.jstree-default-dark .jstree-checkbox-disabled {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default-dark > .jstree-striped {
-  background-size: auto 48px;
-}
-.jstree-default-dark.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-  background-position: 100% 1px;
-  background-repeat: repeat-y;
-}
-.jstree-default-dark.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark.jstree-rtl .jstree-open > .jstree-ocl {
-  background-position: -132px -36px;
-}
-.jstree-default-dark.jstree-rtl .jstree-closed > .jstree-ocl {
-  background-position: -100px -36px;
-}
-.jstree-default-dark.jstree-rtl .jstree-leaf > .jstree-ocl {
-  background-position: -68px -36px;
-}
-.jstree-default-dark.jstree-rtl > .jstree-no-dots .jstree-node,
-.jstree-default-dark.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-dark.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -36px -36px;
-}
-.jstree-default-dark.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -4px -36px;
-}
-.jstree-default-dark .jstree-themeicon-custom {
-  background-color: transparent;
-  background-image: none;
-  background-position: 0 0;
-}
-.jstree-default-dark > .jstree-container-ul .jstree-loading > .jstree-ocl {
-  background: url("throbber.gif") center center no-repeat;
-}
-.jstree-default-dark .jstree-file {
-  background: url("32px.png") -100px -68px no-repeat;
-}
-.jstree-default-dark .jstree-folder {
-  background: url("32px.png") -260px -4px no-repeat;
-}
-.jstree-default-dark > .jstree-container-ul > .jstree-node {
-  margin-left: 0;
-  margin-right: 0;
-}
-#jstree-dnd.jstree-default-dark {
-  line-height: 24px;
-  padding: 0 4px;
-}
-#jstree-dnd.jstree-default-dark .jstree-ok,
-#jstree-dnd.jstree-default-dark .jstree-er {
-  background-image: url("32px.png");
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-#jstree-dnd.jstree-default-dark i {
-  background: transparent;
-  width: 24px;
-  height: 24px;
-  line-height: 24px;
-}
-#jstree-dnd.jstree-default-dark .jstree-ok {
-  background-position: -4px -68px;
-}
-#jstree-dnd.jstree-default-dark .jstree-er {
-  background-position: -36px -68px;
-}
-.jstree-default-dark .jstree-ellipsis {
-  overflow: hidden;
-}
-.jstree-default-dark .jstree-ellipsis .jstree-anchor {
-  width: calc(100% - 24px + 5px);
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.jstree-default-dark.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-}
-.jstree-default-dark.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-small .jstree-node {
-  min-height: 18px;
-  line-height: 18px;
-  margin-left: 18px;
-  min-width: 18px;
-}
-.jstree-default-dark-small .jstree-anchor {
-  line-height: 18px;
-  height: 18px;
-}
-.jstree-default-dark-small .jstree-icon {
-  width: 18px;
-  height: 18px;
-  line-height: 18px;
-}
-.jstree-default-dark-small .jstree-icon:empty {
-  width: 18px;
-  height: 18px;
-  line-height: 18px;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-node {
-  margin-right: 18px;
-}
-.jstree-default-dark-small .jstree-wholerow {
-  height: 18px;
-}
-.jstree-default-dark-small .jstree-node,
-.jstree-default-dark-small .jstree-icon {
-  background-image: url("32px.png");
-}
-.jstree-default-dark-small .jstree-node {
-  background-position: -295px -7px;
-  background-repeat: repeat-y;
-}
-.jstree-default-dark-small .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-small .jstree-open > .jstree-ocl {
-  background-position: -135px -7px;
-}
-.jstree-default-dark-small .jstree-closed > .jstree-ocl {
-  background-position: -103px -7px;
-}
-.jstree-default-dark-small .jstree-leaf > .jstree-ocl {
-  background-position: -71px -7px;
-}
-.jstree-default-dark-small .jstree-themeicon {
-  background-position: -263px -7px;
-}
-.jstree-default-dark-small > .jstree-no-dots .jstree-node,
-.jstree-default-dark-small > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-dark-small > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -39px -7px;
-}
-.jstree-default-dark-small > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -7px -7px;
-}
-.jstree-default-dark-small .jstree-disabled {
-  background: transparent;
-}
-.jstree-default-dark-small .jstree-disabled.jstree-hovered {
-  background: transparent;
-}
-.jstree-default-dark-small .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default-dark-small .jstree-checkbox {
-  background-position: -167px -7px;
-}
-.jstree-default-dark-small .jstree-checkbox:hover {
-  background-position: -167px -39px;
-}
-.jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-.jstree-default-dark-small .jstree-checked > .jstree-checkbox {
-  background-position: -231px -7px;
-}
-.jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-.jstree-default-dark-small .jstree-checked > .jstree-checkbox:hover {
-  background-position: -231px -39px;
-}
-.jstree-default-dark-small .jstree-anchor > .jstree-undetermined {
-  background-position: -199px -7px;
-}
-.jstree-default-dark-small .jstree-anchor > .jstree-undetermined:hover {
-  background-position: -199px -39px;
-}
-.jstree-default-dark-small .jstree-checkbox-disabled {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default-dark-small > .jstree-striped {
-  background-size: auto 36px;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-  background-position: 100% 1px;
-  background-repeat: repeat-y;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-open > .jstree-ocl {
-  background-position: -135px -39px;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-closed > .jstree-ocl {
-  background-position: -103px -39px;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-leaf > .jstree-ocl {
-  background-position: -71px -39px;
-}
-.jstree-default-dark-small.jstree-rtl > .jstree-no-dots .jstree-node,
-.jstree-default-dark-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-dark-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -39px -39px;
-}
-.jstree-default-dark-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -7px -39px;
-}
-.jstree-default-dark-small .jstree-themeicon-custom {
-  background-color: transparent;
-  background-image: none;
-  background-position: 0 0;
-}
-.jstree-default-dark-small > .jstree-container-ul .jstree-loading > .jstree-ocl {
-  background: url("throbber.gif") center center no-repeat;
-}
-.jstree-default-dark-small .jstree-file {
-  background: url("32px.png") -103px -71px no-repeat;
-}
-.jstree-default-dark-small .jstree-folder {
-  background: url("32px.png") -263px -7px no-repeat;
-}
-.jstree-default-dark-small > .jstree-container-ul > .jstree-node {
-  margin-left: 0;
-  margin-right: 0;
-}
-#jstree-dnd.jstree-default-dark-small {
-  line-height: 18px;
-  padding: 0 4px;
-}
-#jstree-dnd.jstree-default-dark-small .jstree-ok,
-#jstree-dnd.jstree-default-dark-small .jstree-er {
-  background-image: url("32px.png");
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-#jstree-dnd.jstree-default-dark-small i {
-  background: transparent;
-  width: 18px;
-  height: 18px;
-  line-height: 18px;
-}
-#jstree-dnd.jstree-default-dark-small .jstree-ok {
-  background-position: -7px -71px;
-}
-#jstree-dnd.jstree-default-dark-small .jstree-er {
-  background-position: -39px -71px;
-}
-.jstree-default-dark-small .jstree-ellipsis {
-  overflow: hidden;
-}
-.jstree-default-dark-small .jstree-ellipsis .jstree-anchor {
-  width: calc(100% - 18px + 5px);
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==");
-}
-.jstree-default-dark-small.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-large .jstree-node {
-  min-height: 32px;
-  line-height: 32px;
-  margin-left: 32px;
-  min-width: 32px;
-}
-.jstree-default-dark-large .jstree-anchor {
-  line-height: 32px;
-  height: 32px;
-}
-.jstree-default-dark-large .jstree-icon {
-  width: 32px;
-  height: 32px;
-  line-height: 32px;
-}
-.jstree-default-dark-large .jstree-icon:empty {
-  width: 32px;
-  height: 32px;
-  line-height: 32px;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-node {
-  margin-right: 32px;
-}
-.jstree-default-dark-large .jstree-wholerow {
-  height: 32px;
-}
-.jstree-default-dark-large .jstree-node,
-.jstree-default-dark-large .jstree-icon {
-  background-image: url("32px.png");
-}
-.jstree-default-dark-large .jstree-node {
-  background-position: -288px 0px;
-  background-repeat: repeat-y;
-}
-.jstree-default-dark-large .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-large .jstree-open > .jstree-ocl {
-  background-position: -128px 0px;
-}
-.jstree-default-dark-large .jstree-closed > .jstree-ocl {
-  background-position: -96px 0px;
-}
-.jstree-default-dark-large .jstree-leaf > .jstree-ocl {
-  background-position: -64px 0px;
-}
-.jstree-default-dark-large .jstree-themeicon {
-  background-position: -256px 0px;
-}
-.jstree-default-dark-large > .jstree-no-dots .jstree-node,
-.jstree-default-dark-large > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-dark-large > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -32px 0px;
-}
-.jstree-default-dark-large > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: 0px 0px;
-}
-.jstree-default-dark-large .jstree-disabled {
-  background: transparent;
-}
-.jstree-default-dark-large .jstree-disabled.jstree-hovered {
-  background: transparent;
-}
-.jstree-default-dark-large .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default-dark-large .jstree-checkbox {
-  background-position: -160px 0px;
-}
-.jstree-default-dark-large .jstree-checkbox:hover {
-  background-position: -160px -32px;
-}
-.jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-.jstree-default-dark-large .jstree-checked > .jstree-checkbox {
-  background-position: -224px 0px;
-}
-.jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-.jstree-default-dark-large .jstree-checked > .jstree-checkbox:hover {
-  background-position: -224px -32px;
-}
-.jstree-default-dark-large .jstree-anchor > .jstree-undetermined {
-  background-position: -192px 0px;
-}
-.jstree-default-dark-large .jstree-anchor > .jstree-undetermined:hover {
-  background-position: -192px -32px;
-}
-.jstree-default-dark-large .jstree-checkbox-disabled {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default-dark-large > .jstree-striped {
-  background-size: auto 64px;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-  background-position: 100% 1px;
-  background-repeat: repeat-y;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-open > .jstree-ocl {
-  background-position: -128px -32px;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-closed > .jstree-ocl {
-  background-position: -96px -32px;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-leaf > .jstree-ocl {
-  background-position: -64px -32px;
-}
-.jstree-default-dark-large.jstree-rtl > .jstree-no-dots .jstree-node,
-.jstree-default-dark-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-dark-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -32px -32px;
-}
-.jstree-default-dark-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: 0px -32px;
-}
-.jstree-default-dark-large .jstree-themeicon-custom {
-  background-color: transparent;
-  background-image: none;
-  background-position: 0 0;
-}
-.jstree-default-dark-large > .jstree-container-ul .jstree-loading > .jstree-ocl {
-  background: url("throbber.gif") center center no-repeat;
-}
-.jstree-default-dark-large .jstree-file {
-  background: url("32px.png") -96px -64px no-repeat;
-}
-.jstree-default-dark-large .jstree-folder {
-  background: url("32px.png") -256px 0px no-repeat;
-}
-.jstree-default-dark-large > .jstree-container-ul > .jstree-node {
-  margin-left: 0;
-  margin-right: 0;
-}
-#jstree-dnd.jstree-default-dark-large {
-  line-height: 32px;
-  padding: 0 4px;
-}
-#jstree-dnd.jstree-default-dark-large .jstree-ok,
-#jstree-dnd.jstree-default-dark-large .jstree-er {
-  background-image: url("32px.png");
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-#jstree-dnd.jstree-default-dark-large i {
-  background: transparent;
-  width: 32px;
-  height: 32px;
-  line-height: 32px;
-}
-#jstree-dnd.jstree-default-dark-large .jstree-ok {
-  background-position: 0px -64px;
-}
-#jstree-dnd.jstree-default-dark-large .jstree-er {
-  background-position: -32px -64px;
-}
-.jstree-default-dark-large .jstree-ellipsis {
-  overflow: hidden;
-}
-.jstree-default-dark-large .jstree-ellipsis .jstree-anchor {
-  width: calc(100% - 32px + 5px);
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==");
-}
-.jstree-default-dark-large.jstree-rtl .jstree-last {
-  background-image: none;
-}
-@media (max-width: 768px) {
-  #jstree-dnd.jstree-dnd-responsive {
-    line-height: 40px;
-    font-weight: bold;
-    font-size: 1.1em;
-    text-shadow: 1px 1px white;
-  }
-  #jstree-dnd.jstree-dnd-responsive > i {
-    background: transparent;
-    width: 40px;
-    height: 40px;
-  }
-  #jstree-dnd.jstree-dnd-responsive > .jstree-ok {
-    background-image: url("40px.png");
-    background-position: 0 -200px;
-    background-size: 120px 240px;
-  }
-  #jstree-dnd.jstree-dnd-responsive > .jstree-er {
-    background-image: url("40px.png");
-    background-position: -40px -200px;
-    background-size: 120px 240px;
-  }
-  #jstree-marker.jstree-dnd-responsive {
-    border-left-width: 10px;
-    border-top-width: 10px;
-    border-bottom-width: 10px;
-    margin-top: -10px;
-  }
-}
-@media (max-width: 768px) {
-  .jstree-default-dark-responsive {
-    /*
-	.jstree-open > .jstree-ocl,
-	.jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; }
-	*/
-  }
-  .jstree-default-dark-responsive .jstree-icon {
-    background-image: url("40px.png");
-  }
-  .jstree-default-dark-responsive .jstree-node,
-  .jstree-default-dark-responsive .jstree-leaf > .jstree-ocl {
-    background: transparent;
-  }
-  .jstree-default-dark-responsive .jstree-node {
-    min-height: 40px;
-    line-height: 40px;
-    margin-left: 40px;
-    min-width: 40px;
-    white-space: nowrap;
-  }
-  .jstree-default-dark-responsive .jstree-anchor {
-    line-height: 40px;
-    height: 40px;
-  }
-  .jstree-default-dark-responsive .jstree-icon,
-  .jstree-default-dark-responsive .jstree-icon:empty {
-    width: 40px;
-    height: 40px;
-    line-height: 40px;
-  }
-  .jstree-default-dark-responsive > .jstree-container-ul > .jstree-node {
-    margin-left: 0;
-  }
-  .jstree-default-dark-responsive.jstree-rtl .jstree-node {
-    margin-left: 0;
-    margin-right: 40px;
-    background: transparent;
-  }
-  .jstree-default-dark-responsive.jstree-rtl .jstree-container-ul > .jstree-node {
-    margin-right: 0;
-  }
-  .jstree-default-dark-responsive .jstree-ocl,
-  .jstree-default-dark-responsive .jstree-themeicon,
-  .jstree-default-dark-responsive .jstree-checkbox {
-    background-size: 120px 240px;
-  }
-  .jstree-default-dark-responsive .jstree-leaf > .jstree-ocl,
-  .jstree-default-dark-responsive.jstree-rtl .jstree-leaf > .jstree-ocl {
-    background: transparent;
-  }
-  .jstree-default-dark-responsive .jstree-open > .jstree-ocl {
-    background-position: 0 0 !important;
-  }
-  .jstree-default-dark-responsive .jstree-closed > .jstree-ocl {
-    background-position: 0 -40px !important;
-  }
-  .jstree-default-dark-responsive.jstree-rtl .jstree-closed > .jstree-ocl {
-    background-position: -40px 0 !important;
-  }
-  .jstree-default-dark-responsive .jstree-themeicon {
-    background-position: -40px -40px;
-  }
-  .jstree-default-dark-responsive .jstree-checkbox,
-  .jstree-default-dark-responsive .jstree-checkbox:hover {
-    background-position: -40px -80px;
-  }
-  .jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-  .jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-  .jstree-default-dark-responsive .jstree-checked > .jstree-checkbox,
-  .jstree-default-dark-responsive .jstree-checked > .jstree-checkbox:hover {
-    background-position: 0 -80px;
-  }
-  .jstree-default-dark-responsive .jstree-anchor > .jstree-undetermined,
-  .jstree-default-dark-responsive .jstree-anchor > .jstree-undetermined:hover {
-    background-position: 0 -120px;
-  }
-  .jstree-default-dark-responsive .jstree-anchor {
-    font-weight: bold;
-    font-size: 1.1em;
-    text-shadow: 1px 1px white;
-  }
-  .jstree-default-dark-responsive > .jstree-striped {
-    background: transparent;
-  }
-  .jstree-default-dark-responsive .jstree-wholerow {
-    border-top: 1px solid #666;
-    border-bottom: 1px solid #000;
-    background: #333333;
-    height: 40px;
-  }
-  .jstree-default-dark-responsive .jstree-wholerow-hovered {
-    background: #555;
-  }
-  .jstree-default-dark-responsive .jstree-wholerow-clicked {
-    background: #5fa2db;
-  }
-  .jstree-default-dark-responsive .jstree-children .jstree-last > .jstree-wholerow {
-    box-shadow: inset 0 -6px 3px -5px #111111;
-  }
-  .jstree-default-dark-responsive .jstree-children .jstree-open > .jstree-wholerow {
-    box-shadow: inset 0 6px 3px -5px #111111;
-    border-top: 0;
-  }
-  .jstree-default-dark-responsive .jstree-children .jstree-open + .jstree-open {
-    box-shadow: none;
-  }
-  .jstree-default-dark-responsive .jstree-node,
-  .jstree-default-dark-responsive .jstree-icon,
-  .jstree-default-dark-responsive .jstree-node > .jstree-ocl,
-  .jstree-default-dark-responsive .jstree-themeicon,
-  .jstree-default-dark-responsive .jstree-checkbox {
-    background-image: url("40px.png");
-    background-size: 120px 240px;
-  }
-  .jstree-default-dark-responsive .jstree-node {
-    background-position: -80px 0;
-    background-repeat: repeat-y;
-  }
-  .jstree-default-dark-responsive .jstree-last {
-    background-image: none;
-  }
-  .jstree-default-dark-responsive .jstree-leaf > .jstree-ocl {
-    background-position: -40px -120px;
-  }
-  .jstree-default-dark-responsive .jstree-last > .jstree-ocl {
-    background-position: -40px -160px;
-  }
-  .jstree-default-dark-responsive .jstree-themeicon-custom {
-    background-color: transparent;
-    background-image: none;
-    background-position: 0 0;
-  }
-  .jstree-default-dark-responsive .jstree-file {
-    background: url("40px.png") 0 -160px no-repeat;
-    background-size: 120px 240px;
-  }
-  .jstree-default-dark-responsive .jstree-folder {
-    background: url("40px.png") -40px -40px no-repeat;
-    background-size: 120px 240px;
-  }
-  .jstree-default-dark-responsive > .jstree-container-ul > .jstree-node {
-    margin-left: 0;
-    margin-right: 0;
-  }
-}
-.jstree-default-dark {
-  background: #333;
-}
-.jstree-default-dark .jstree-anchor {
-  color: #999;
-  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.5);
-}
-.jstree-default-dark .jstree-clicked,
-.jstree-default-dark .jstree-checked {
-  color: white;
-}
-.jstree-default-dark .jstree-hovered {
-  color: white;
-}
-#jstree-marker.jstree-default-dark {
-  border-left-color: #999;
-  background: transparent;
-}
-.jstree-default-dark .jstree-anchor > .jstree-icon {
-  opacity: 0.75;
-}
-.jstree-default-dark .jstree-clicked > .jstree-icon,
-.jstree-default-dark .jstree-hovered > .jstree-icon,
-.jstree-default-dark .jstree-checked > .jstree-icon {
-  opacity: 1;
-}
-.jstree-default-dark.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-}
-.jstree-default-dark.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==");
-}
-.jstree-default-dark-small.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==");
-}
-.jstree-default-dark-large.jstree-rtl .jstree-last {
-  background-image: none;
-}
diff --git a/public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/style.min.css b/public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/style.min.css
deleted file mode 100644
index ddcf628ed5..0000000000
--- a/public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/style.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.jstree-node,.jstree-children,.jstree-container-ul{display:block;margin:0;padding:0;list-style-type:none;list-style-image:none}.jstree-node{white-space:nowrap}.jstree-anchor{display:inline-block;color:black;white-space:nowrap;padding:0 4px 0 1px;margin:0;vertical-align:top}.jstree-anchor:focus{outline:0}.jstree-anchor,.jstree-anchor:link,.jstree-anchor:visited,.jstree-anchor:hover,.jstree-anchor:active{text-decoration:none;color:inherit}.jstree-icon{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}.jstree-icon:empty{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}.jstree-ocl{cursor:pointer}.jstree-leaf>.jstree-ocl{cursor:default}.jstree .jstree-open>.jstree-children{display:block}.jstree .jstree-closed>.jstree-children,.jstree .jstree-leaf>.jstree-children{display:none}.jstree-anchor>.jstree-themeicon{margin-right:2px}.jstree-no-icons .jstree-themeicon,.jstree-anchor>.jstree-themeicon-hidden{display:none}.jstree-hidden,.jstree-node.jstree-hidden{display:none}.jstree-rtl .jstree-anchor{padding:0 1px 0 4px}.jstree-rtl .jstree-anchor>.jstree-themeicon{margin-left:2px;margin-right:0}.jstree-rtl .jstree-node{margin-left:0}.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-wholerow-ul{position:relative;display:inline-block;min-width:100%}.jstree-wholerow-ul .jstree-leaf>.jstree-ocl{cursor:pointer}.jstree-wholerow-ul .jstree-anchor,.jstree-wholerow-ul .jstree-icon{position:relative}.jstree-wholerow-ul .jstree-wholerow{width:100%;cursor:pointer;position:absolute;left:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.jstree-contextmenu .jstree-anchor{-webkit-user-select:none;-webkit-touch-callout:none;user-select:none}.vakata-context{display:none}.vakata-context,.vakata-context ul{margin:0;padding:2px;position:absolute;background:#f5f5f5;border:1px solid #979797;box-shadow:2px 2px 2px #999999}.vakata-context ul{list-style:none;left:100%;margin-top:-2.7em;margin-left:-4px}.vakata-context .vakata-context-right ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context li{list-style:none}.vakata-context li>a{display:block;padding:0 2em 0 2em;text-decoration:none;width:auto;color:black;white-space:nowrap;line-height:2.4em;text-shadow:1px 1px 0 white;border-radius:1px}.vakata-context li>a:hover{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");background-position:right center;background-repeat:no-repeat}.vakata-context li>a:focus{outline:0}.vakata-context .vakata-context-no-icons{margin-left:0}.vakata-context .vakata-context-hover>a{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context .vakata-context-separator>a,.vakata-context .vakata-context-separator>a:hover{background:white;border:0;border-top:1px solid #e2e3e3;height:1px;min-height:1px;max-height:1px;padding:0;margin:0 0 0 2.4em;border-left:1px solid #e0e0e0;text-shadow:0 0 0 transparent;box-shadow:0 0 0 transparent;border-radius:0}.vakata-context .vakata-contextmenu-disabled a,.vakata-context .vakata-contextmenu-disabled a:hover{color:silver;background-color:transparent;border:0;box-shadow:0 0 0}.vakata-context .vakata-contextmenu-disabled>a>i{filter:grayscale(100%)}.vakata-context li>a>i{text-decoration:none;display:inline-block;width:2.4em;height:2.4em;background:transparent;margin:0 0 0 -2em;vertical-align:top;text-align:center;line-height:2.4em}.vakata-context li>a>i:empty{width:2.4em;line-height:2.4em}.vakata-context li>a .vakata-contextmenu-sep{display:inline-block;width:1px;height:2.4em;background:white;margin:0 .5em 0 0;border-left:1px solid #e2e3e3}.vakata-context .vakata-contextmenu-shortcut{font-size:.8em;color:silver;opacity:.5;display:none}.vakata-context-rtl ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context-rtl li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");background-position:left center;background-repeat:no-repeat}.vakata-context-rtl .vakata-context-separator>a{margin:0 2.4em 0 0;border-left:0;border-right:1px solid #e2e3e3}.vakata-context-rtl .vakata-context-left ul{right:auto;left:100%;margin-left:-4px;margin-right:auto}.vakata-context-rtl li>a>i{margin:0 -2em 0 0}.vakata-context-rtl li>a .vakata-contextmenu-sep{margin:0 0 0 .5em;border-left-color:white;background:#e2e3e3}#jstree-marker{position:absolute;top:0;left:0;margin:-5px 0 0 0;padding:0;border-right:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid;width:0;height:0;font-size:0;line-height:0}#jstree-dnd{line-height:16px;margin:0;padding:4px}#jstree-dnd .jstree-icon,#jstree-dnd .jstree-copy{display:inline-block;text-decoration:none;margin:0 2px 0 0;padding:0;width:16px;height:16px}#jstree-dnd .jstree-ok{background:green}#jstree-dnd .jstree-er{background:red}#jstree-dnd .jstree-copy{margin:0 2px 0 2px}.jstree-default-dark .jstree-node,.jstree-default-dark .jstree-icon{background-repeat:no-repeat;background-color:transparent}.jstree-default-dark .jstree-anchor,.jstree-default-dark .jstree-animated,.jstree-default-dark .jstree-wholerow{transition:background-color .15s,box-shadow .15s}.jstree-default-dark .jstree-hovered{background:#555;border-radius:2px;box-shadow:inset 0 0 1px #555}.jstree-default-dark .jstree-context{background:#555;border-radius:2px;box-shadow:inset 0 0 1px #555}.jstree-default-dark .jstree-clicked{background:#5fa2db;border-radius:2px;box-shadow:inset 0 0 1px #666666}.jstree-default-dark .jstree-no-icons .jstree-anchor>.jstree-themeicon{display:none}.jstree-default-dark .jstree-disabled{background:transparent;color:#666666}.jstree-default-dark .jstree-disabled.jstree-hovered{background:transparent;box-shadow:none}.jstree-default-dark .jstree-disabled.jstree-clicked{background:#333333}.jstree-default-dark .jstree-disabled>.jstree-icon{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-dark .jstree-search{font-style:italic;color:#ffffff;font-weight:bold}.jstree-default-dark .jstree-no-checkboxes .jstree-checkbox{display:none !important}.jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked{background:transparent;box-shadow:none}.jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered{background:#555}.jstree-default-dark.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked{background:transparent}.jstree-default-dark.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered{background:#555}.jstree-default-dark>.jstree-striped{min-width:100%;display:inline-block;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat}.jstree-default-dark>.jstree-wholerow-ul .jstree-hovered,.jstree-default-dark>.jstree-wholerow-ul .jstree-clicked{background:transparent;box-shadow:none;border-radius:0}.jstree-default-dark .jstree-wholerow{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.jstree-default-dark .jstree-wholerow-hovered{background:#555}.jstree-default-dark .jstree-wholerow-clicked{background:#5fa2db;background:-webkit-linear-gradient(top, #5fa2db 0%, #5fa2db 100%);background:linear-gradient(to bottom, #5fa2db 0%, #5fa2db 100%)}.jstree-default-dark .jstree-node{min-height:24px;line-height:24px;margin-left:24px;min-width:24px}.jstree-default-dark .jstree-anchor{line-height:24px;height:24px}.jstree-default-dark .jstree-icon{width:24px;height:24px;line-height:24px}.jstree-default-dark .jstree-icon:empty{width:24px;height:24px;line-height:24px}.jstree-default-dark.jstree-rtl .jstree-node{margin-right:24px}.jstree-default-dark .jstree-wholerow{height:24px}.jstree-default-dark .jstree-node,.jstree-default-dark .jstree-icon{background-image:url("32px.png")}.jstree-default-dark .jstree-node{background-position:-292px -4px;background-repeat:repeat-y}.jstree-default-dark .jstree-last{background-image:none}.jstree-default-dark .jstree-open>.jstree-ocl{background-position:-132px -4px}.jstree-default-dark .jstree-closed>.jstree-ocl{background-position:-100px -4px}.jstree-default-dark .jstree-leaf>.jstree-ocl{background-position:-68px -4px}.jstree-default-dark .jstree-themeicon{background-position:-260px -4px}.jstree-default-dark>.jstree-no-dots .jstree-node,.jstree-default-dark>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -4px}.jstree-default-dark>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -4px}.jstree-default-dark .jstree-disabled{background:transparent}.jstree-default-dark .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-dark .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-dark .jstree-checkbox{background-position:-164px -4px}.jstree-default-dark .jstree-checkbox:hover{background-position:-164px -36px}.jstree-default-dark.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-dark .jstree-checked>.jstree-checkbox{background-position:-228px -4px}.jstree-default-dark.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-dark .jstree-checked>.jstree-checkbox:hover{background-position:-228px -36px}.jstree-default-dark .jstree-anchor>.jstree-undetermined{background-position:-196px -4px}.jstree-default-dark .jstree-anchor>.jstree-undetermined:hover{background-position:-196px -36px}.jstree-default-dark .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-dark>.jstree-striped{background-size:auto 48px}.jstree-default-dark.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-dark.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark.jstree-rtl .jstree-open>.jstree-ocl{background-position:-132px -36px}.jstree-default-dark.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-100px -36px}.jstree-default-dark.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-68px -36px}.jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -36px}.jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -36px}.jstree-default-dark .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-dark>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-dark .jstree-file{background:url("32px.png") -100px -68px no-repeat}.jstree-default-dark .jstree-folder{background:url("32px.png") -260px -4px no-repeat}.jstree-default-dark>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-dark{line-height:24px;padding:0 4px}#jstree-dnd.jstree-default-dark .jstree-ok,#jstree-dnd.jstree-default-dark .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-dark i{background:transparent;width:24px;height:24px;line-height:24px}#jstree-dnd.jstree-default-dark .jstree-ok{background-position:-4px -68px}#jstree-dnd.jstree-default-dark .jstree-er{background-position:-36px -68px}.jstree-default-dark .jstree-ellipsis{overflow:hidden}.jstree-default-dark .jstree-ellipsis .jstree-anchor{width:calc(100% - 24px + 5px);text-overflow:ellipsis;overflow:hidden}.jstree-default-dark.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==")}.jstree-default-dark.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark-small .jstree-node{min-height:18px;line-height:18px;margin-left:18px;min-width:18px}.jstree-default-dark-small .jstree-anchor{line-height:18px;height:18px}.jstree-default-dark-small .jstree-icon{width:18px;height:18px;line-height:18px}.jstree-default-dark-small .jstree-icon:empty{width:18px;height:18px;line-height:18px}.jstree-default-dark-small.jstree-rtl .jstree-node{margin-right:18px}.jstree-default-dark-small .jstree-wholerow{height:18px}.jstree-default-dark-small .jstree-node,.jstree-default-dark-small .jstree-icon{background-image:url("32px.png")}.jstree-default-dark-small .jstree-node{background-position:-295px -7px;background-repeat:repeat-y}.jstree-default-dark-small .jstree-last{background-image:none}.jstree-default-dark-small .jstree-open>.jstree-ocl{background-position:-135px -7px}.jstree-default-dark-small .jstree-closed>.jstree-ocl{background-position:-103px -7px}.jstree-default-dark-small .jstree-leaf>.jstree-ocl{background-position:-71px -7px}.jstree-default-dark-small .jstree-themeicon{background-position:-263px -7px}.jstree-default-dark-small>.jstree-no-dots .jstree-node,.jstree-default-dark-small>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-small>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -7px}.jstree-default-dark-small>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -7px}.jstree-default-dark-small .jstree-disabled{background:transparent}.jstree-default-dark-small .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-dark-small .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-dark-small .jstree-checkbox{background-position:-167px -7px}.jstree-default-dark-small .jstree-checkbox:hover{background-position:-167px -39px}.jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-dark-small .jstree-checked>.jstree-checkbox{background-position:-231px -7px}.jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-dark-small .jstree-checked>.jstree-checkbox:hover{background-position:-231px -39px}.jstree-default-dark-small .jstree-anchor>.jstree-undetermined{background-position:-199px -7px}.jstree-default-dark-small .jstree-anchor>.jstree-undetermined:hover{background-position:-199px -39px}.jstree-default-dark-small .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-dark-small>.jstree-striped{background-size:auto 36px}.jstree-default-dark-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-dark-small.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark-small.jstree-rtl .jstree-open>.jstree-ocl{background-position:-135px -39px}.jstree-default-dark-small.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-103px -39px}.jstree-default-dark-small.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-71px -39px}.jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -39px}.jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -39px}.jstree-default-dark-small .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-dark-small>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-dark-small .jstree-file{background:url("32px.png") -103px -71px no-repeat}.jstree-default-dark-small .jstree-folder{background:url("32px.png") -263px -7px no-repeat}.jstree-default-dark-small>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-dark-small{line-height:18px;padding:0 4px}#jstree-dnd.jstree-default-dark-small .jstree-ok,#jstree-dnd.jstree-default-dark-small .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-dark-small i{background:transparent;width:18px;height:18px;line-height:18px}#jstree-dnd.jstree-default-dark-small .jstree-ok{background-position:-7px -71px}#jstree-dnd.jstree-default-dark-small .jstree-er{background-position:-39px -71px}.jstree-default-dark-small .jstree-ellipsis{overflow:hidden}.jstree-default-dark-small .jstree-ellipsis .jstree-anchor{width:calc(100% - 18px + 5px);text-overflow:ellipsis;overflow:hidden}.jstree-default-dark-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==")}.jstree-default-dark-small.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark-large .jstree-node{min-height:32px;line-height:32px;margin-left:32px;min-width:32px}.jstree-default-dark-large .jstree-anchor{line-height:32px;height:32px}.jstree-default-dark-large .jstree-icon{width:32px;height:32px;line-height:32px}.jstree-default-dark-large .jstree-icon:empty{width:32px;height:32px;line-height:32px}.jstree-default-dark-large.jstree-rtl .jstree-node{margin-right:32px}.jstree-default-dark-large .jstree-wholerow{height:32px}.jstree-default-dark-large .jstree-node,.jstree-default-dark-large .jstree-icon{background-image:url("32px.png")}.jstree-default-dark-large .jstree-node{background-position:-288px 0;background-repeat:repeat-y}.jstree-default-dark-large .jstree-last{background-image:none}.jstree-default-dark-large .jstree-open>.jstree-ocl{background-position:-128px 0}.jstree-default-dark-large .jstree-closed>.jstree-ocl{background-position:-96px 0}.jstree-default-dark-large .jstree-leaf>.jstree-ocl{background-position:-64px 0}.jstree-default-dark-large .jstree-themeicon{background-position:-256px 0}.jstree-default-dark-large>.jstree-no-dots .jstree-node,.jstree-default-dark-large>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-large>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px 0}.jstree-default-dark-large>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 0}.jstree-default-dark-large .jstree-disabled{background:transparent}.jstree-default-dark-large .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-dark-large .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-dark-large .jstree-checkbox{background-position:-160px 0}.jstree-default-dark-large .jstree-checkbox:hover{background-position:-160px -32px}.jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-dark-large .jstree-checked>.jstree-checkbox{background-position:-224px 0}.jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-dark-large .jstree-checked>.jstree-checkbox:hover{background-position:-224px -32px}.jstree-default-dark-large .jstree-anchor>.jstree-undetermined{background-position:-192px 0}.jstree-default-dark-large .jstree-anchor>.jstree-undetermined:hover{background-position:-192px -32px}.jstree-default-dark-large .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-dark-large>.jstree-striped{background-size:auto 64px}.jstree-default-dark-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-dark-large.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark-large.jstree-rtl .jstree-open>.jstree-ocl{background-position:-128px -32px}.jstree-default-dark-large.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-96px -32px}.jstree-default-dark-large.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-64px -32px}.jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px -32px}.jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 -32px}.jstree-default-dark-large .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-dark-large>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-dark-large .jstree-file{background:url("32px.png") -96px -64px no-repeat}.jstree-default-dark-large .jstree-folder{background:url("32px.png") -256px 0 no-repeat}.jstree-default-dark-large>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-dark-large{line-height:32px;padding:0 4px}#jstree-dnd.jstree-default-dark-large .jstree-ok,#jstree-dnd.jstree-default-dark-large .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-dark-large i{background:transparent;width:32px;height:32px;line-height:32px}#jstree-dnd.jstree-default-dark-large .jstree-ok{background-position:0 -64px}#jstree-dnd.jstree-default-dark-large .jstree-er{background-position:-32px -64px}.jstree-default-dark-large .jstree-ellipsis{overflow:hidden}.jstree-default-dark-large .jstree-ellipsis .jstree-anchor{width:calc(100% - 32px + 5px);text-overflow:ellipsis;overflow:hidden}.jstree-default-dark-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==")}.jstree-default-dark-large.jstree-rtl .jstree-last{background-image:none}@media (max-width:768px){#jstree-dnd.jstree-dnd-responsive{line-height:40px;font-weight:bold;font-size:1.1em;text-shadow:1px 1px white}#jstree-dnd.jstree-dnd-responsive>i{background:transparent;width:40px;height:40px}#jstree-dnd.jstree-dnd-responsive>.jstree-ok{background-image:url("40px.png");background-position:0 -200px;background-size:120px 240px}#jstree-dnd.jstree-dnd-responsive>.jstree-er{background-image:url("40px.png");background-position:-40px -200px;background-size:120px 240px}#jstree-marker.jstree-dnd-responsive{border-left-width:10px;border-top-width:10px;border-bottom-width:10px;margin-top:-10px}}@media (max-width:768px){.jstree-default-dark-responsive .jstree-icon{background-image:url("40px.png")}.jstree-default-dark-responsive .jstree-node,.jstree-default-dark-responsive .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-responsive .jstree-node{min-height:40px;line-height:40px;margin-left:40px;min-width:40px;white-space:nowrap}.jstree-default-dark-responsive .jstree-anchor{line-height:40px;height:40px}.jstree-default-dark-responsive .jstree-icon,.jstree-default-dark-responsive .jstree-icon:empty{width:40px;height:40px;line-height:40px}.jstree-default-dark-responsive>.jstree-container-ul>.jstree-node{margin-left:0}.jstree-default-dark-responsive.jstree-rtl .jstree-node{margin-left:0;margin-right:40px;background:transparent}.jstree-default-dark-responsive.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-default-dark-responsive .jstree-ocl,.jstree-default-dark-responsive .jstree-themeicon,.jstree-default-dark-responsive .jstree-checkbox{background-size:120px 240px}.jstree-default-dark-responsive .jstree-leaf>.jstree-ocl,.jstree-default-dark-responsive.jstree-rtl .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-responsive .jstree-open>.jstree-ocl{background-position:0 0 !important}.jstree-default-dark-responsive .jstree-closed>.jstree-ocl{background-position:0 -40px !important}.jstree-default-dark-responsive.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-40px 0 !important}.jstree-default-dark-responsive .jstree-themeicon{background-position:-40px -40px}.jstree-default-dark-responsive .jstree-checkbox,.jstree-default-dark-responsive .jstree-checkbox:hover{background-position:-40px -80px}.jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-dark-responsive .jstree-checked>.jstree-checkbox,.jstree-default-dark-responsive .jstree-checked>.jstree-checkbox:hover{background-position:0 -80px}.jstree-default-dark-responsive .jstree-anchor>.jstree-undetermined,.jstree-default-dark-responsive .jstree-anchor>.jstree-undetermined:hover{background-position:0 -120px}.jstree-default-dark-responsive .jstree-anchor{font-weight:bold;font-size:1.1em;text-shadow:1px 1px white}.jstree-default-dark-responsive>.jstree-striped{background:transparent}.jstree-default-dark-responsive .jstree-wholerow{border-top:1px solid #666;border-bottom:1px solid #000;background:#333333;height:40px}.jstree-default-dark-responsive .jstree-wholerow-hovered{background:#555}.jstree-default-dark-responsive .jstree-wholerow-clicked{background:#5fa2db}.jstree-default-dark-responsive .jstree-children .jstree-last>.jstree-wholerow{box-shadow:inset 0 -6px 3px -5px #111111}.jstree-default-dark-responsive .jstree-children .jstree-open>.jstree-wholerow{box-shadow:inset 0 6px 3px -5px #111111;border-top:0}.jstree-default-dark-responsive .jstree-children .jstree-open+.jstree-open{box-shadow:none}.jstree-default-dark-responsive .jstree-node,.jstree-default-dark-responsive .jstree-icon,.jstree-default-dark-responsive .jstree-node>.jstree-ocl,.jstree-default-dark-responsive .jstree-themeicon,.jstree-default-dark-responsive .jstree-checkbox{background-image:url("40px.png");background-size:120px 240px}.jstree-default-dark-responsive .jstree-node{background-position:-80px 0;background-repeat:repeat-y}.jstree-default-dark-responsive .jstree-last{background-image:none}.jstree-default-dark-responsive .jstree-leaf>.jstree-ocl{background-position:-40px -120px}.jstree-default-dark-responsive .jstree-last>.jstree-ocl{background-position:-40px -160px}.jstree-default-dark-responsive .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-dark-responsive .jstree-file{background:url("40px.png") 0 -160px no-repeat;background-size:120px 240px}.jstree-default-dark-responsive .jstree-folder{background:url("40px.png") -40px -40px no-repeat;background-size:120px 240px}.jstree-default-dark-responsive>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}}.jstree-default-dark{background:#333}.jstree-default-dark .jstree-anchor{color:#999;text-shadow:1px 1px 0 rgba(0,0,0,0.5)}.jstree-default-dark .jstree-clicked,.jstree-default-dark .jstree-checked{color:white}.jstree-default-dark .jstree-hovered{color:white}#jstree-marker.jstree-default-dark{border-left-color:#999;background:transparent}.jstree-default-dark .jstree-anchor>.jstree-icon{opacity:.75}.jstree-default-dark .jstree-clicked>.jstree-icon,.jstree-default-dark .jstree-hovered>.jstree-icon,.jstree-default-dark .jstree-checked>.jstree-icon{opacity:1}.jstree-default-dark.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==")}.jstree-default-dark.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==")}.jstree-default-dark-small.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==")}.jstree-default-dark-large.jstree-rtl .jstree-last{background-image:none}
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/throbber.gif b/public/ext/vakata-jstree-3.3.17/dist/themes/default-dark/throbber.gif
deleted file mode 100644
index 169062cda53296196d81c1e47816e40358d2523d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1464
zcmZ?wbhEHb6krfw_{`7X;NVbDP_Sy%s)mM!fPjDn3l=0KB=q<9TUuIXWMp)9cFveF
zBO)TAqM~B?^5w?H#)|*B{aizWogD*Qjr0td85tND6#q#%7o{eaq^2m8XO?6rBxWU6
z<m4x&=w;@m<ufS$WMSoE;AhZbU|?VXS?a)2@Zn^8hIHwvCA%&PD|K~EP-rsdak%Ei
z@PUE-poD``u#|!hNBe@U+=>$Ii&TWYL`1w;8Wzl9O=&ydd|(cPnC`&|*C(s`9EvCp
zD+(~Z#FM_1wO32YDdF!d7BMysPAfwmk$gpFM*c|SMg;{HmI?fVsE*)g5MW?niT!Z$
zr_<yPKh^0htcyL_H(4A|5?Gv~)2di-SwQ({BB#?dPv(P+28sgFTdp-<<Y0+7)t-1E
z!(p-f;TPtK8f?)A^cN;5@bEPJ(zs^A!16g%_`)&O;vU7~dYP$N%4jwUFz_=luta@0
z`O{}ngxN|lCwDbV=1Ypr9U)AY4TT*%4jydqnk2(Cfy35UQPh}$bu;I}jX_*`LQUrw
zPSmXHX$U(~dtlcTw?#KiSvWYDeyy6M!cf4{&|`S!0l($<?(@M)s2&7`G6PG@hm)GT
zdyN*DPmy8yCd2sL^oE+Ki})fA1=Zd)ENu@J!xpkFX@BJy(IKbWwWjTcgal9E;(&sN
zBDR}L6<^3{EaXn$31AeO_PAw2ZO>IF&ZY}8a-5sg?&xkm{8a+xKMq*5@-Z;5xC)%?
zbXpL>r^#~u&NW3=4c55y2{!@+Itn7<ME#pLB!2aJJL51*gTap`S;vz_C#Tps^Eghk
z^jjvY<dp4|wnKy|fQikO0qPY#n8~2H%D!;&CC9=WifX|V7$+z)PFL~U)FF9+K|NrB
z$ia@zL{|5$8bU0Jjt)Ko4ULZvOk%JQX*rZ|g<)N2SE50H%DNjpi5oRc7D*g9*x+a;
z>(6PxVW6~%)$vl`i8Ki&FTQ{bVQwaI<xHj=$-X+6&yW%<155OWlRp_2L<nW_oWFCl
zqK(Om)5wmiIr79|foT^#PU$k1ToYmDdDN7-L#;!l<6;KO<WoG(g%&J+lNpt}?%GHh
z1}xZEp^(=e>^Pw!rc&X^ERP;*7V+bTb`~v~F#GrzbQl>J8Ti2|CG3Ky0_Q}ZS5f+z
zx1YtHeX6jWEr3th;=lwCj)t~_AM?IXo3T(q(cuh>>HNkw9@?zgYi=Fdc$<Tzvn9zY
z_y<el(L)brv@(QyF&0`Fu}nX7Ya_!dljdX=Xwaf~4U`Q87De1+Z%~nDi;+!l5qVVV
z@hEY2s$kC)3CSFjiatqwdDaOUT<Q%Co4!Q~7_3|9r0~L5q_yRkqD6%mo161T105-$
z!<Wk}u2da7$#k)fN5<~>cLl}gW?q&^o?~EOWPoOa3nyO+Olru=RJ|GXJ$EMClw%xz
zK29+qo-6%=@9>^@b42kE*Mx%)oaXSb&OEZAXpdUQu}00vD+1iChbKx{urqQxr%7mV
zwCeg47tD}t{MMFGs?lWnRBa*yJneuz2(vEY!%0v1RTWABjK>eSaykWda(onA^1-(u
zik0bd=cPsI{12I#-4_a+_#q+B;@r3~lx@;<m5T*-eEo}(9vGXbFgCX+2pTi-GE56k
zSR~J;=5en<scX+B31LR$(1b-?)CbR?hCM%oHg1~Ue4r-iJ44e0#uJ%Rk6Sm)cqkC5
zt=hgwWu7F1K!il&&V@@|B`OLw9a#JzQDuQ&g0ex1gx`kCOB_5rq^Gs})n?e7;de`@
RE!@AfUtd%1unPl&H2^)f?PCA{

diff --git a/public/ext/vakata-jstree-3.3.17/dist/themes/default/32px.png b/public/ext/vakata-jstree-3.3.17/dist/themes/default/32px.png
deleted file mode 100644
index ca6af206777a87fb9d27dccf2184934065ceeae8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5660
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
a{X0$1AM<-ARx&U!FnGH9xvX<aXaWG}7m=m_

diff --git a/public/ext/vakata-jstree-3.3.17/dist/themes/default/40px.png b/public/ext/vakata-jstree-3.3.17/dist/themes/default/40px.png
deleted file mode 100644
index 2a3fcb9dfacf4e82a4c3ac3a6cd1650af966fc29..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2215
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
JtaD0e0sxC4A|L<&

diff --git a/public/ext/vakata-jstree-3.3.17/dist/themes/default/style.css b/public/ext/vakata-jstree-3.3.17/dist/themes/default/style.css
deleted file mode 100644
index d851cd5f24..0000000000
--- a/public/ext/vakata-jstree-3.3.17/dist/themes/default/style.css
+++ /dev/null
@@ -1,1106 +0,0 @@
-/* jsTree default theme */
-.jstree-node,
-.jstree-children,
-.jstree-container-ul {
-  display: block;
-  margin: 0;
-  padding: 0;
-  list-style-type: none;
-  list-style-image: none;
-}
-.jstree-node {
-  white-space: nowrap;
-}
-.jstree-anchor {
-  display: inline-block;
-  color: black;
-  white-space: nowrap;
-  padding: 0 4px 0 1px;
-  margin: 0;
-  vertical-align: top;
-}
-.jstree-anchor:focus {
-  outline: 0;
-}
-.jstree-anchor,
-.jstree-anchor:link,
-.jstree-anchor:visited,
-.jstree-anchor:hover,
-.jstree-anchor:active {
-  text-decoration: none;
-  color: inherit;
-}
-.jstree-icon {
-  display: inline-block;
-  text-decoration: none;
-  margin: 0;
-  padding: 0;
-  vertical-align: top;
-  text-align: center;
-}
-.jstree-icon:empty {
-  display: inline-block;
-  text-decoration: none;
-  margin: 0;
-  padding: 0;
-  vertical-align: top;
-  text-align: center;
-}
-.jstree-ocl {
-  cursor: pointer;
-}
-.jstree-leaf > .jstree-ocl {
-  cursor: default;
-}
-.jstree .jstree-open > .jstree-children {
-  display: block;
-}
-.jstree .jstree-closed > .jstree-children,
-.jstree .jstree-leaf > .jstree-children {
-  display: none;
-}
-.jstree-anchor > .jstree-themeicon {
-  margin-right: 2px;
-}
-.jstree-no-icons .jstree-themeicon,
-.jstree-anchor > .jstree-themeicon-hidden {
-  display: none;
-}
-.jstree-hidden,
-.jstree-node.jstree-hidden {
-  display: none;
-}
-.jstree-rtl .jstree-anchor {
-  padding: 0 1px 0 4px;
-}
-.jstree-rtl .jstree-anchor > .jstree-themeicon {
-  margin-left: 2px;
-  margin-right: 0;
-}
-.jstree-rtl .jstree-node {
-  margin-left: 0;
-}
-.jstree-rtl .jstree-container-ul > .jstree-node {
-  margin-right: 0;
-}
-.jstree-wholerow-ul {
-  position: relative;
-  display: inline-block;
-  min-width: 100%;
-}
-.jstree-wholerow-ul .jstree-leaf > .jstree-ocl {
-  cursor: pointer;
-}
-.jstree-wholerow-ul .jstree-anchor,
-.jstree-wholerow-ul .jstree-icon {
-  position: relative;
-}
-.jstree-wholerow-ul .jstree-wholerow {
-  width: 100%;
-  cursor: pointer;
-  position: absolute;
-  left: 0;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.jstree-contextmenu .jstree-anchor {
-  -webkit-user-select: none;
-  /* disable selection/Copy of UIWebView */
-  -webkit-touch-callout: none;
-  /* disable the IOS popup when long-press on a link */
-  user-select: none;
-}
-.vakata-context {
-  display: none;
-}
-.vakata-context,
-.vakata-context ul {
-  margin: 0;
-  padding: 2px;
-  position: absolute;
-  background: #f5f5f5;
-  border: 1px solid #979797;
-  box-shadow: 2px 2px 2px #999999;
-}
-.vakata-context ul {
-  list-style: none;
-  left: 100%;
-  margin-top: -2.7em;
-  margin-left: -4px;
-}
-.vakata-context .vakata-context-right ul {
-  left: auto;
-  right: 100%;
-  margin-left: auto;
-  margin-right: -4px;
-}
-.vakata-context li {
-  list-style: none;
-}
-.vakata-context li > a {
-  display: block;
-  padding: 0 2em 0 2em;
-  text-decoration: none;
-  width: auto;
-  color: black;
-  white-space: nowrap;
-  line-height: 2.4em;
-  text-shadow: 1px 1px 0 white;
-  border-radius: 1px;
-}
-.vakata-context li > a:hover {
-  position: relative;
-  background-color: #e8eff7;
-  box-shadow: 0 0 2px #0a6aa1;
-}
-.vakata-context li > a.vakata-context-parent {
-  background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");
-  background-position: right center;
-  background-repeat: no-repeat;
-}
-.vakata-context li > a:focus {
-  outline: 0;
-}
-.vakata-context .vakata-context-no-icons {
-  margin-left: 0;
-}
-.vakata-context .vakata-context-hover > a {
-  position: relative;
-  background-color: #e8eff7;
-  box-shadow: 0 0 2px #0a6aa1;
-}
-.vakata-context .vakata-context-separator > a,
-.vakata-context .vakata-context-separator > a:hover {
-  background: white;
-  border: 0;
-  border-top: 1px solid #e2e3e3;
-  height: 1px;
-  min-height: 1px;
-  max-height: 1px;
-  padding: 0;
-  margin: 0 0 0 2.4em;
-  border-left: 1px solid #e0e0e0;
-  text-shadow: 0 0 0 transparent;
-  box-shadow: 0 0 0 transparent;
-  border-radius: 0;
-}
-.vakata-context .vakata-contextmenu-disabled a,
-.vakata-context .vakata-contextmenu-disabled a:hover {
-  color: silver;
-  background-color: transparent;
-  border: 0;
-  box-shadow: 0 0 0;
-}
-.vakata-context .vakata-contextmenu-disabled > a > i {
-  filter: grayscale(100%);
-}
-.vakata-context li > a > i {
-  text-decoration: none;
-  display: inline-block;
-  width: 2.4em;
-  height: 2.4em;
-  background: transparent;
-  margin: 0 0 0 -2em;
-  vertical-align: top;
-  text-align: center;
-  line-height: 2.4em;
-}
-.vakata-context li > a > i:empty {
-  width: 2.4em;
-  line-height: 2.4em;
-}
-.vakata-context li > a .vakata-contextmenu-sep {
-  display: inline-block;
-  width: 1px;
-  height: 2.4em;
-  background: white;
-  margin: 0 0.5em 0 0;
-  border-left: 1px solid #e2e3e3;
-}
-.vakata-context .vakata-contextmenu-shortcut {
-  font-size: 0.8em;
-  color: silver;
-  opacity: 0.5;
-  display: none;
-}
-.vakata-context-rtl ul {
-  left: auto;
-  right: 100%;
-  margin-left: auto;
-  margin-right: -4px;
-}
-.vakata-context-rtl li > a.vakata-context-parent {
-  background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-.vakata-context-rtl .vakata-context-separator > a {
-  margin: 0 2.4em 0 0;
-  border-left: 0;
-  border-right: 1px solid #e2e3e3;
-}
-.vakata-context-rtl .vakata-context-left ul {
-  right: auto;
-  left: 100%;
-  margin-left: -4px;
-  margin-right: auto;
-}
-.vakata-context-rtl li > a > i {
-  margin: 0 -2em 0 0;
-}
-.vakata-context-rtl li > a .vakata-contextmenu-sep {
-  margin: 0 0 0 0.5em;
-  border-left-color: white;
-  background: #e2e3e3;
-}
-#jstree-marker {
-  position: absolute;
-  top: 0;
-  left: 0;
-  margin: -5px 0 0 0;
-  padding: 0;
-  border-right: 0;
-  border-top: 5px solid transparent;
-  border-bottom: 5px solid transparent;
-  border-left: 5px solid;
-  width: 0;
-  height: 0;
-  font-size: 0;
-  line-height: 0;
-}
-#jstree-dnd {
-  line-height: 16px;
-  margin: 0;
-  padding: 4px;
-}
-#jstree-dnd .jstree-icon,
-#jstree-dnd .jstree-copy {
-  display: inline-block;
-  text-decoration: none;
-  margin: 0 2px 0 0;
-  padding: 0;
-  width: 16px;
-  height: 16px;
-}
-#jstree-dnd .jstree-ok {
-  background: green;
-}
-#jstree-dnd .jstree-er {
-  background: red;
-}
-#jstree-dnd .jstree-copy {
-  margin: 0 2px 0 2px;
-}
-.jstree-default .jstree-node,
-.jstree-default .jstree-icon {
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-.jstree-default .jstree-anchor,
-.jstree-default .jstree-animated,
-.jstree-default .jstree-wholerow {
-  transition: background-color 0.15s, box-shadow 0.15s;
-}
-.jstree-default .jstree-hovered {
-  background: #e7f4f9;
-  border-radius: 2px;
-  box-shadow: inset 0 0 1px #cccccc;
-}
-.jstree-default .jstree-context {
-  background: #e7f4f9;
-  border-radius: 2px;
-  box-shadow: inset 0 0 1px #cccccc;
-}
-.jstree-default .jstree-clicked {
-  background: #beebff;
-  border-radius: 2px;
-  box-shadow: inset 0 0 1px #999999;
-}
-.jstree-default .jstree-no-icons .jstree-anchor > .jstree-themeicon {
-  display: none;
-}
-.jstree-default .jstree-disabled {
-  background: transparent;
-  color: #666666;
-}
-.jstree-default .jstree-disabled.jstree-hovered {
-  background: transparent;
-  box-shadow: none;
-}
-.jstree-default .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default .jstree-disabled > .jstree-icon {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default .jstree-search {
-  font-style: italic;
-  color: #8b0000;
-  font-weight: bold;
-}
-.jstree-default .jstree-no-checkboxes .jstree-checkbox {
-  display: none !important;
-}
-.jstree-default.jstree-checkbox-no-clicked .jstree-clicked {
-  background: transparent;
-  box-shadow: none;
-}
-.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered {
-  background: #e7f4f9;
-}
-.jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked {
-  background: transparent;
-}
-.jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered {
-  background: #e7f4f9;
-}
-.jstree-default > .jstree-striped {
-  min-width: 100%;
-  display: inline-block;
-  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat;
-}
-.jstree-default > .jstree-wholerow-ul .jstree-hovered,
-.jstree-default > .jstree-wholerow-ul .jstree-clicked {
-  background: transparent;
-  box-shadow: none;
-  border-radius: 0;
-}
-.jstree-default .jstree-wholerow {
-  -moz-box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.jstree-default .jstree-wholerow-hovered {
-  background: #e7f4f9;
-}
-.jstree-default .jstree-wholerow-clicked {
-  background: #beebff;
-  background: -webkit-linear-gradient(top, #beebff 0%, #a8e4ff 100%);
-  background: linear-gradient(to bottom, #beebff 0%, #a8e4ff 100%);
-}
-.jstree-default .jstree-node {
-  min-height: 24px;
-  line-height: 24px;
-  margin-left: 24px;
-  min-width: 24px;
-}
-.jstree-default .jstree-anchor {
-  line-height: 24px;
-  height: 24px;
-}
-.jstree-default .jstree-icon {
-  width: 24px;
-  height: 24px;
-  line-height: 24px;
-}
-.jstree-default .jstree-icon:empty {
-  width: 24px;
-  height: 24px;
-  line-height: 24px;
-}
-.jstree-default.jstree-rtl .jstree-node {
-  margin-right: 24px;
-}
-.jstree-default .jstree-wholerow {
-  height: 24px;
-}
-.jstree-default .jstree-node,
-.jstree-default .jstree-icon {
-  background-image: url("32px.png");
-}
-.jstree-default .jstree-node {
-  background-position: -292px -4px;
-  background-repeat: repeat-y;
-}
-.jstree-default .jstree-last {
-  background-image: none;
-}
-.jstree-default .jstree-open > .jstree-ocl {
-  background-position: -132px -4px;
-}
-.jstree-default .jstree-closed > .jstree-ocl {
-  background-position: -100px -4px;
-}
-.jstree-default .jstree-leaf > .jstree-ocl {
-  background-position: -68px -4px;
-}
-.jstree-default .jstree-themeicon {
-  background-position: -260px -4px;
-}
-.jstree-default > .jstree-no-dots .jstree-node,
-.jstree-default > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -36px -4px;
-}
-.jstree-default > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -4px -4px;
-}
-.jstree-default .jstree-disabled {
-  background: transparent;
-}
-.jstree-default .jstree-disabled.jstree-hovered {
-  background: transparent;
-}
-.jstree-default .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default .jstree-checkbox {
-  background-position: -164px -4px;
-}
-.jstree-default .jstree-checkbox:hover {
-  background-position: -164px -36px;
-}
-.jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-.jstree-default .jstree-checked > .jstree-checkbox {
-  background-position: -228px -4px;
-}
-.jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-.jstree-default .jstree-checked > .jstree-checkbox:hover {
-  background-position: -228px -36px;
-}
-.jstree-default .jstree-anchor > .jstree-undetermined {
-  background-position: -196px -4px;
-}
-.jstree-default .jstree-anchor > .jstree-undetermined:hover {
-  background-position: -196px -36px;
-}
-.jstree-default .jstree-checkbox-disabled {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default > .jstree-striped {
-  background-size: auto 48px;
-}
-.jstree-default.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-  background-position: 100% 1px;
-  background-repeat: repeat-y;
-}
-.jstree-default.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default.jstree-rtl .jstree-open > .jstree-ocl {
-  background-position: -132px -36px;
-}
-.jstree-default.jstree-rtl .jstree-closed > .jstree-ocl {
-  background-position: -100px -36px;
-}
-.jstree-default.jstree-rtl .jstree-leaf > .jstree-ocl {
-  background-position: -68px -36px;
-}
-.jstree-default.jstree-rtl > .jstree-no-dots .jstree-node,
-.jstree-default.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -36px -36px;
-}
-.jstree-default.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -4px -36px;
-}
-.jstree-default .jstree-themeicon-custom {
-  background-color: transparent;
-  background-image: none;
-  background-position: 0 0;
-}
-.jstree-default > .jstree-container-ul .jstree-loading > .jstree-ocl {
-  background: url("throbber.gif") center center no-repeat;
-}
-.jstree-default .jstree-file {
-  background: url("32px.png") -100px -68px no-repeat;
-}
-.jstree-default .jstree-folder {
-  background: url("32px.png") -260px -4px no-repeat;
-}
-.jstree-default > .jstree-container-ul > .jstree-node {
-  margin-left: 0;
-  margin-right: 0;
-}
-#jstree-dnd.jstree-default {
-  line-height: 24px;
-  padding: 0 4px;
-}
-#jstree-dnd.jstree-default .jstree-ok,
-#jstree-dnd.jstree-default .jstree-er {
-  background-image: url("32px.png");
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-#jstree-dnd.jstree-default i {
-  background: transparent;
-  width: 24px;
-  height: 24px;
-  line-height: 24px;
-}
-#jstree-dnd.jstree-default .jstree-ok {
-  background-position: -4px -68px;
-}
-#jstree-dnd.jstree-default .jstree-er {
-  background-position: -36px -68px;
-}
-.jstree-default .jstree-ellipsis {
-  overflow: hidden;
-}
-.jstree-default .jstree-ellipsis .jstree-anchor {
-  width: calc(100% - 24px + 5px);
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.jstree-default.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-}
-.jstree-default.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-small .jstree-node {
-  min-height: 18px;
-  line-height: 18px;
-  margin-left: 18px;
-  min-width: 18px;
-}
-.jstree-default-small .jstree-anchor {
-  line-height: 18px;
-  height: 18px;
-}
-.jstree-default-small .jstree-icon {
-  width: 18px;
-  height: 18px;
-  line-height: 18px;
-}
-.jstree-default-small .jstree-icon:empty {
-  width: 18px;
-  height: 18px;
-  line-height: 18px;
-}
-.jstree-default-small.jstree-rtl .jstree-node {
-  margin-right: 18px;
-}
-.jstree-default-small .jstree-wholerow {
-  height: 18px;
-}
-.jstree-default-small .jstree-node,
-.jstree-default-small .jstree-icon {
-  background-image: url("32px.png");
-}
-.jstree-default-small .jstree-node {
-  background-position: -295px -7px;
-  background-repeat: repeat-y;
-}
-.jstree-default-small .jstree-last {
-  background-image: none;
-}
-.jstree-default-small .jstree-open > .jstree-ocl {
-  background-position: -135px -7px;
-}
-.jstree-default-small .jstree-closed > .jstree-ocl {
-  background-position: -103px -7px;
-}
-.jstree-default-small .jstree-leaf > .jstree-ocl {
-  background-position: -71px -7px;
-}
-.jstree-default-small .jstree-themeicon {
-  background-position: -263px -7px;
-}
-.jstree-default-small > .jstree-no-dots .jstree-node,
-.jstree-default-small > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-small > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -39px -7px;
-}
-.jstree-default-small > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -7px -7px;
-}
-.jstree-default-small .jstree-disabled {
-  background: transparent;
-}
-.jstree-default-small .jstree-disabled.jstree-hovered {
-  background: transparent;
-}
-.jstree-default-small .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default-small .jstree-checkbox {
-  background-position: -167px -7px;
-}
-.jstree-default-small .jstree-checkbox:hover {
-  background-position: -167px -39px;
-}
-.jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-.jstree-default-small .jstree-checked > .jstree-checkbox {
-  background-position: -231px -7px;
-}
-.jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-.jstree-default-small .jstree-checked > .jstree-checkbox:hover {
-  background-position: -231px -39px;
-}
-.jstree-default-small .jstree-anchor > .jstree-undetermined {
-  background-position: -199px -7px;
-}
-.jstree-default-small .jstree-anchor > .jstree-undetermined:hover {
-  background-position: -199px -39px;
-}
-.jstree-default-small .jstree-checkbox-disabled {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default-small > .jstree-striped {
-  background-size: auto 36px;
-}
-.jstree-default-small.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-  background-position: 100% 1px;
-  background-repeat: repeat-y;
-}
-.jstree-default-small.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-small.jstree-rtl .jstree-open > .jstree-ocl {
-  background-position: -135px -39px;
-}
-.jstree-default-small.jstree-rtl .jstree-closed > .jstree-ocl {
-  background-position: -103px -39px;
-}
-.jstree-default-small.jstree-rtl .jstree-leaf > .jstree-ocl {
-  background-position: -71px -39px;
-}
-.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-node,
-.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -39px -39px;
-}
-.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -7px -39px;
-}
-.jstree-default-small .jstree-themeicon-custom {
-  background-color: transparent;
-  background-image: none;
-  background-position: 0 0;
-}
-.jstree-default-small > .jstree-container-ul .jstree-loading > .jstree-ocl {
-  background: url("throbber.gif") center center no-repeat;
-}
-.jstree-default-small .jstree-file {
-  background: url("32px.png") -103px -71px no-repeat;
-}
-.jstree-default-small .jstree-folder {
-  background: url("32px.png") -263px -7px no-repeat;
-}
-.jstree-default-small > .jstree-container-ul > .jstree-node {
-  margin-left: 0;
-  margin-right: 0;
-}
-#jstree-dnd.jstree-default-small {
-  line-height: 18px;
-  padding: 0 4px;
-}
-#jstree-dnd.jstree-default-small .jstree-ok,
-#jstree-dnd.jstree-default-small .jstree-er {
-  background-image: url("32px.png");
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-#jstree-dnd.jstree-default-small i {
-  background: transparent;
-  width: 18px;
-  height: 18px;
-  line-height: 18px;
-}
-#jstree-dnd.jstree-default-small .jstree-ok {
-  background-position: -7px -71px;
-}
-#jstree-dnd.jstree-default-small .jstree-er {
-  background-position: -39px -71px;
-}
-.jstree-default-small .jstree-ellipsis {
-  overflow: hidden;
-}
-.jstree-default-small .jstree-ellipsis .jstree-anchor {
-  width: calc(100% - 18px + 5px);
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.jstree-default-small.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==");
-}
-.jstree-default-small.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-large .jstree-node {
-  min-height: 32px;
-  line-height: 32px;
-  margin-left: 32px;
-  min-width: 32px;
-}
-.jstree-default-large .jstree-anchor {
-  line-height: 32px;
-  height: 32px;
-}
-.jstree-default-large .jstree-icon {
-  width: 32px;
-  height: 32px;
-  line-height: 32px;
-}
-.jstree-default-large .jstree-icon:empty {
-  width: 32px;
-  height: 32px;
-  line-height: 32px;
-}
-.jstree-default-large.jstree-rtl .jstree-node {
-  margin-right: 32px;
-}
-.jstree-default-large .jstree-wholerow {
-  height: 32px;
-}
-.jstree-default-large .jstree-node,
-.jstree-default-large .jstree-icon {
-  background-image: url("32px.png");
-}
-.jstree-default-large .jstree-node {
-  background-position: -288px 0px;
-  background-repeat: repeat-y;
-}
-.jstree-default-large .jstree-last {
-  background-image: none;
-}
-.jstree-default-large .jstree-open > .jstree-ocl {
-  background-position: -128px 0px;
-}
-.jstree-default-large .jstree-closed > .jstree-ocl {
-  background-position: -96px 0px;
-}
-.jstree-default-large .jstree-leaf > .jstree-ocl {
-  background-position: -64px 0px;
-}
-.jstree-default-large .jstree-themeicon {
-  background-position: -256px 0px;
-}
-.jstree-default-large > .jstree-no-dots .jstree-node,
-.jstree-default-large > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-large > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -32px 0px;
-}
-.jstree-default-large > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: 0px 0px;
-}
-.jstree-default-large .jstree-disabled {
-  background: transparent;
-}
-.jstree-default-large .jstree-disabled.jstree-hovered {
-  background: transparent;
-}
-.jstree-default-large .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default-large .jstree-checkbox {
-  background-position: -160px 0px;
-}
-.jstree-default-large .jstree-checkbox:hover {
-  background-position: -160px -32px;
-}
-.jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-.jstree-default-large .jstree-checked > .jstree-checkbox {
-  background-position: -224px 0px;
-}
-.jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-.jstree-default-large .jstree-checked > .jstree-checkbox:hover {
-  background-position: -224px -32px;
-}
-.jstree-default-large .jstree-anchor > .jstree-undetermined {
-  background-position: -192px 0px;
-}
-.jstree-default-large .jstree-anchor > .jstree-undetermined:hover {
-  background-position: -192px -32px;
-}
-.jstree-default-large .jstree-checkbox-disabled {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default-large > .jstree-striped {
-  background-size: auto 64px;
-}
-.jstree-default-large.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-  background-position: 100% 1px;
-  background-repeat: repeat-y;
-}
-.jstree-default-large.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-large.jstree-rtl .jstree-open > .jstree-ocl {
-  background-position: -128px -32px;
-}
-.jstree-default-large.jstree-rtl .jstree-closed > .jstree-ocl {
-  background-position: -96px -32px;
-}
-.jstree-default-large.jstree-rtl .jstree-leaf > .jstree-ocl {
-  background-position: -64px -32px;
-}
-.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-node,
-.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -32px -32px;
-}
-.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: 0px -32px;
-}
-.jstree-default-large .jstree-themeicon-custom {
-  background-color: transparent;
-  background-image: none;
-  background-position: 0 0;
-}
-.jstree-default-large > .jstree-container-ul .jstree-loading > .jstree-ocl {
-  background: url("throbber.gif") center center no-repeat;
-}
-.jstree-default-large .jstree-file {
-  background: url("32px.png") -96px -64px no-repeat;
-}
-.jstree-default-large .jstree-folder {
-  background: url("32px.png") -256px 0px no-repeat;
-}
-.jstree-default-large > .jstree-container-ul > .jstree-node {
-  margin-left: 0;
-  margin-right: 0;
-}
-#jstree-dnd.jstree-default-large {
-  line-height: 32px;
-  padding: 0 4px;
-}
-#jstree-dnd.jstree-default-large .jstree-ok,
-#jstree-dnd.jstree-default-large .jstree-er {
-  background-image: url("32px.png");
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-#jstree-dnd.jstree-default-large i {
-  background: transparent;
-  width: 32px;
-  height: 32px;
-  line-height: 32px;
-}
-#jstree-dnd.jstree-default-large .jstree-ok {
-  background-position: 0px -64px;
-}
-#jstree-dnd.jstree-default-large .jstree-er {
-  background-position: -32px -64px;
-}
-.jstree-default-large .jstree-ellipsis {
-  overflow: hidden;
-}
-.jstree-default-large .jstree-ellipsis .jstree-anchor {
-  width: calc(100% - 32px + 5px);
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.jstree-default-large.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==");
-}
-.jstree-default-large.jstree-rtl .jstree-last {
-  background-image: none;
-}
-@media (max-width: 768px) {
-  #jstree-dnd.jstree-dnd-responsive {
-    line-height: 40px;
-    font-weight: bold;
-    font-size: 1.1em;
-    text-shadow: 1px 1px white;
-  }
-  #jstree-dnd.jstree-dnd-responsive > i {
-    background: transparent;
-    width: 40px;
-    height: 40px;
-  }
-  #jstree-dnd.jstree-dnd-responsive > .jstree-ok {
-    background-image: url("40px.png");
-    background-position: 0 -200px;
-    background-size: 120px 240px;
-  }
-  #jstree-dnd.jstree-dnd-responsive > .jstree-er {
-    background-image: url("40px.png");
-    background-position: -40px -200px;
-    background-size: 120px 240px;
-  }
-  #jstree-marker.jstree-dnd-responsive {
-    border-left-width: 10px;
-    border-top-width: 10px;
-    border-bottom-width: 10px;
-    margin-top: -10px;
-  }
-}
-@media (max-width: 768px) {
-  .jstree-default-responsive {
-    /*
-	.jstree-open > .jstree-ocl,
-	.jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; }
-	*/
-  }
-  .jstree-default-responsive .jstree-icon {
-    background-image: url("40px.png");
-  }
-  .jstree-default-responsive .jstree-node,
-  .jstree-default-responsive .jstree-leaf > .jstree-ocl {
-    background: transparent;
-  }
-  .jstree-default-responsive .jstree-node {
-    min-height: 40px;
-    line-height: 40px;
-    margin-left: 40px;
-    min-width: 40px;
-    white-space: nowrap;
-  }
-  .jstree-default-responsive .jstree-anchor {
-    line-height: 40px;
-    height: 40px;
-  }
-  .jstree-default-responsive .jstree-icon,
-  .jstree-default-responsive .jstree-icon:empty {
-    width: 40px;
-    height: 40px;
-    line-height: 40px;
-  }
-  .jstree-default-responsive > .jstree-container-ul > .jstree-node {
-    margin-left: 0;
-  }
-  .jstree-default-responsive.jstree-rtl .jstree-node {
-    margin-left: 0;
-    margin-right: 40px;
-    background: transparent;
-  }
-  .jstree-default-responsive.jstree-rtl .jstree-container-ul > .jstree-node {
-    margin-right: 0;
-  }
-  .jstree-default-responsive .jstree-ocl,
-  .jstree-default-responsive .jstree-themeicon,
-  .jstree-default-responsive .jstree-checkbox {
-    background-size: 120px 240px;
-  }
-  .jstree-default-responsive .jstree-leaf > .jstree-ocl,
-  .jstree-default-responsive.jstree-rtl .jstree-leaf > .jstree-ocl {
-    background: transparent;
-  }
-  .jstree-default-responsive .jstree-open > .jstree-ocl {
-    background-position: 0 0 !important;
-  }
-  .jstree-default-responsive .jstree-closed > .jstree-ocl {
-    background-position: 0 -40px !important;
-  }
-  .jstree-default-responsive.jstree-rtl .jstree-closed > .jstree-ocl {
-    background-position: -40px 0 !important;
-  }
-  .jstree-default-responsive .jstree-themeicon {
-    background-position: -40px -40px;
-  }
-  .jstree-default-responsive .jstree-checkbox,
-  .jstree-default-responsive .jstree-checkbox:hover {
-    background-position: -40px -80px;
-  }
-  .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-  .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-  .jstree-default-responsive .jstree-checked > .jstree-checkbox,
-  .jstree-default-responsive .jstree-checked > .jstree-checkbox:hover {
-    background-position: 0 -80px;
-  }
-  .jstree-default-responsive .jstree-anchor > .jstree-undetermined,
-  .jstree-default-responsive .jstree-anchor > .jstree-undetermined:hover {
-    background-position: 0 -120px;
-  }
-  .jstree-default-responsive .jstree-anchor {
-    font-weight: bold;
-    font-size: 1.1em;
-    text-shadow: 1px 1px white;
-  }
-  .jstree-default-responsive > .jstree-striped {
-    background: transparent;
-  }
-  .jstree-default-responsive .jstree-wholerow {
-    border-top: 1px solid rgba(255, 255, 255, 0.7);
-    border-bottom: 1px solid rgba(64, 64, 64, 0.2);
-    background: #ebebeb;
-    height: 40px;
-  }
-  .jstree-default-responsive .jstree-wholerow-hovered {
-    background: #e7f4f9;
-  }
-  .jstree-default-responsive .jstree-wholerow-clicked {
-    background: #beebff;
-  }
-  .jstree-default-responsive .jstree-children .jstree-last > .jstree-wholerow {
-    box-shadow: inset 0 -6px 3px -5px #666666;
-  }
-  .jstree-default-responsive .jstree-children .jstree-open > .jstree-wholerow {
-    box-shadow: inset 0 6px 3px -5px #666666;
-    border-top: 0;
-  }
-  .jstree-default-responsive .jstree-children .jstree-open + .jstree-open {
-    box-shadow: none;
-  }
-  .jstree-default-responsive .jstree-node,
-  .jstree-default-responsive .jstree-icon,
-  .jstree-default-responsive .jstree-node > .jstree-ocl,
-  .jstree-default-responsive .jstree-themeicon,
-  .jstree-default-responsive .jstree-checkbox {
-    background-image: url("40px.png");
-    background-size: 120px 240px;
-  }
-  .jstree-default-responsive .jstree-node {
-    background-position: -80px 0;
-    background-repeat: repeat-y;
-  }
-  .jstree-default-responsive .jstree-last {
-    background-image: none;
-  }
-  .jstree-default-responsive .jstree-leaf > .jstree-ocl {
-    background-position: -40px -120px;
-  }
-  .jstree-default-responsive .jstree-last > .jstree-ocl {
-    background-position: -40px -160px;
-  }
-  .jstree-default-responsive .jstree-themeicon-custom {
-    background-color: transparent;
-    background-image: none;
-    background-position: 0 0;
-  }
-  .jstree-default-responsive .jstree-file {
-    background: url("40px.png") 0 -160px no-repeat;
-    background-size: 120px 240px;
-  }
-  .jstree-default-responsive .jstree-folder {
-    background: url("40px.png") -40px -40px no-repeat;
-    background-size: 120px 240px;
-  }
-  .jstree-default-responsive > .jstree-container-ul > .jstree-node {
-    margin-left: 0;
-    margin-right: 0;
-  }
-}
diff --git a/public/ext/vakata-jstree-3.3.17/dist/themes/default/style.min.css b/public/ext/vakata-jstree-3.3.17/dist/themes/default/style.min.css
deleted file mode 100644
index 0f9a93358e..0000000000
--- a/public/ext/vakata-jstree-3.3.17/dist/themes/default/style.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.jstree-node,.jstree-children,.jstree-container-ul{display:block;margin:0;padding:0;list-style-type:none;list-style-image:none}.jstree-node{white-space:nowrap}.jstree-anchor{display:inline-block;color:black;white-space:nowrap;padding:0 4px 0 1px;margin:0;vertical-align:top}.jstree-anchor:focus{outline:0}.jstree-anchor,.jstree-anchor:link,.jstree-anchor:visited,.jstree-anchor:hover,.jstree-anchor:active{text-decoration:none;color:inherit}.jstree-icon{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}.jstree-icon:empty{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}.jstree-ocl{cursor:pointer}.jstree-leaf>.jstree-ocl{cursor:default}.jstree .jstree-open>.jstree-children{display:block}.jstree .jstree-closed>.jstree-children,.jstree .jstree-leaf>.jstree-children{display:none}.jstree-anchor>.jstree-themeicon{margin-right:2px}.jstree-no-icons .jstree-themeicon,.jstree-anchor>.jstree-themeicon-hidden{display:none}.jstree-hidden,.jstree-node.jstree-hidden{display:none}.jstree-rtl .jstree-anchor{padding:0 1px 0 4px}.jstree-rtl .jstree-anchor>.jstree-themeicon{margin-left:2px;margin-right:0}.jstree-rtl .jstree-node{margin-left:0}.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-wholerow-ul{position:relative;display:inline-block;min-width:100%}.jstree-wholerow-ul .jstree-leaf>.jstree-ocl{cursor:pointer}.jstree-wholerow-ul .jstree-anchor,.jstree-wholerow-ul .jstree-icon{position:relative}.jstree-wholerow-ul .jstree-wholerow{width:100%;cursor:pointer;position:absolute;left:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.jstree-contextmenu .jstree-anchor{-webkit-user-select:none;-webkit-touch-callout:none;user-select:none}.vakata-context{display:none}.vakata-context,.vakata-context ul{margin:0;padding:2px;position:absolute;background:#f5f5f5;border:1px solid #979797;box-shadow:2px 2px 2px #999999}.vakata-context ul{list-style:none;left:100%;margin-top:-2.7em;margin-left:-4px}.vakata-context .vakata-context-right ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context li{list-style:none}.vakata-context li>a{display:block;padding:0 2em 0 2em;text-decoration:none;width:auto;color:black;white-space:nowrap;line-height:2.4em;text-shadow:1px 1px 0 white;border-radius:1px}.vakata-context li>a:hover{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");background-position:right center;background-repeat:no-repeat}.vakata-context li>a:focus{outline:0}.vakata-context .vakata-context-no-icons{margin-left:0}.vakata-context .vakata-context-hover>a{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context .vakata-context-separator>a,.vakata-context .vakata-context-separator>a:hover{background:white;border:0;border-top:1px solid #e2e3e3;height:1px;min-height:1px;max-height:1px;padding:0;margin:0 0 0 2.4em;border-left:1px solid #e0e0e0;text-shadow:0 0 0 transparent;box-shadow:0 0 0 transparent;border-radius:0}.vakata-context .vakata-contextmenu-disabled a,.vakata-context .vakata-contextmenu-disabled a:hover{color:silver;background-color:transparent;border:0;box-shadow:0 0 0}.vakata-context .vakata-contextmenu-disabled>a>i{filter:grayscale(100%)}.vakata-context li>a>i{text-decoration:none;display:inline-block;width:2.4em;height:2.4em;background:transparent;margin:0 0 0 -2em;vertical-align:top;text-align:center;line-height:2.4em}.vakata-context li>a>i:empty{width:2.4em;line-height:2.4em}.vakata-context li>a .vakata-contextmenu-sep{display:inline-block;width:1px;height:2.4em;background:white;margin:0 .5em 0 0;border-left:1px solid #e2e3e3}.vakata-context .vakata-contextmenu-shortcut{font-size:.8em;color:silver;opacity:.5;display:none}.vakata-context-rtl ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context-rtl li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");background-position:left center;background-repeat:no-repeat}.vakata-context-rtl .vakata-context-separator>a{margin:0 2.4em 0 0;border-left:0;border-right:1px solid #e2e3e3}.vakata-context-rtl .vakata-context-left ul{right:auto;left:100%;margin-left:-4px;margin-right:auto}.vakata-context-rtl li>a>i{margin:0 -2em 0 0}.vakata-context-rtl li>a .vakata-contextmenu-sep{margin:0 0 0 .5em;border-left-color:white;background:#e2e3e3}#jstree-marker{position:absolute;top:0;left:0;margin:-5px 0 0 0;padding:0;border-right:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid;width:0;height:0;font-size:0;line-height:0}#jstree-dnd{line-height:16px;margin:0;padding:4px}#jstree-dnd .jstree-icon,#jstree-dnd .jstree-copy{display:inline-block;text-decoration:none;margin:0 2px 0 0;padding:0;width:16px;height:16px}#jstree-dnd .jstree-ok{background:green}#jstree-dnd .jstree-er{background:red}#jstree-dnd .jstree-copy{margin:0 2px 0 2px}.jstree-default .jstree-node,.jstree-default .jstree-icon{background-repeat:no-repeat;background-color:transparent}.jstree-default .jstree-anchor,.jstree-default .jstree-animated,.jstree-default .jstree-wholerow{transition:background-color .15s,box-shadow .15s}.jstree-default .jstree-hovered{background:#e7f4f9;border-radius:2px;box-shadow:inset 0 0 1px #cccccc}.jstree-default .jstree-context{background:#e7f4f9;border-radius:2px;box-shadow:inset 0 0 1px #cccccc}.jstree-default .jstree-clicked{background:#beebff;border-radius:2px;box-shadow:inset 0 0 1px #999999}.jstree-default .jstree-no-icons .jstree-anchor>.jstree-themeicon{display:none}.jstree-default .jstree-disabled{background:transparent;color:#666666}.jstree-default .jstree-disabled.jstree-hovered{background:transparent;box-shadow:none}.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default .jstree-disabled>.jstree-icon{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default .jstree-search{font-style:italic;color:#8b0000;font-weight:bold}.jstree-default .jstree-no-checkboxes .jstree-checkbox{display:none !important}.jstree-default.jstree-checkbox-no-clicked .jstree-clicked{background:transparent;box-shadow:none}.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered{background:#e7f4f9}.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked{background:transparent}.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered{background:#e7f4f9}.jstree-default>.jstree-striped{min-width:100%;display:inline-block;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat}.jstree-default>.jstree-wholerow-ul .jstree-hovered,.jstree-default>.jstree-wholerow-ul .jstree-clicked{background:transparent;box-shadow:none;border-radius:0}.jstree-default .jstree-wholerow{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.jstree-default .jstree-wholerow-hovered{background:#e7f4f9}.jstree-default .jstree-wholerow-clicked{background:#beebff;background:-webkit-linear-gradient(top, #beebff 0%, #a8e4ff 100%);background:linear-gradient(to bottom, #beebff 0%, #a8e4ff 100%)}.jstree-default .jstree-node{min-height:24px;line-height:24px;margin-left:24px;min-width:24px}.jstree-default .jstree-anchor{line-height:24px;height:24px}.jstree-default .jstree-icon{width:24px;height:24px;line-height:24px}.jstree-default .jstree-icon:empty{width:24px;height:24px;line-height:24px}.jstree-default.jstree-rtl .jstree-node{margin-right:24px}.jstree-default .jstree-wholerow{height:24px}.jstree-default .jstree-node,.jstree-default .jstree-icon{background-image:url("32px.png")}.jstree-default .jstree-node{background-position:-292px -4px;background-repeat:repeat-y}.jstree-default .jstree-last{background-image:none}.jstree-default .jstree-open>.jstree-ocl{background-position:-132px -4px}.jstree-default .jstree-closed>.jstree-ocl{background-position:-100px -4px}.jstree-default .jstree-leaf>.jstree-ocl{background-position:-68px -4px}.jstree-default .jstree-themeicon{background-position:-260px -4px}.jstree-default>.jstree-no-dots .jstree-node,.jstree-default>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -4px}.jstree-default>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -4px}.jstree-default .jstree-disabled{background:transparent}.jstree-default .jstree-disabled.jstree-hovered{background:transparent}.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default .jstree-checkbox{background-position:-164px -4px}.jstree-default .jstree-checkbox:hover{background-position:-164px -36px}.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default .jstree-checked>.jstree-checkbox{background-position:-228px -4px}.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default .jstree-checked>.jstree-checkbox:hover{background-position:-228px -36px}.jstree-default .jstree-anchor>.jstree-undetermined{background-position:-196px -4px}.jstree-default .jstree-anchor>.jstree-undetermined:hover{background-position:-196px -36px}.jstree-default .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default>.jstree-striped{background-size:auto 48px}.jstree-default.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default.jstree-rtl .jstree-last{background-image:none}.jstree-default.jstree-rtl .jstree-open>.jstree-ocl{background-position:-132px -36px}.jstree-default.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-100px -36px}.jstree-default.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-68px -36px}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -36px}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -36px}.jstree-default .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default .jstree-file{background:url("32px.png") -100px -68px no-repeat}.jstree-default .jstree-folder{background:url("32px.png") -260px -4px no-repeat}.jstree-default>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default{line-height:24px;padding:0 4px}#jstree-dnd.jstree-default .jstree-ok,#jstree-dnd.jstree-default .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default i{background:transparent;width:24px;height:24px;line-height:24px}#jstree-dnd.jstree-default .jstree-ok{background-position:-4px -68px}#jstree-dnd.jstree-default .jstree-er{background-position:-36px -68px}.jstree-default .jstree-ellipsis{overflow:hidden}.jstree-default .jstree-ellipsis .jstree-anchor{width:calc(100% - 24px + 5px);text-overflow:ellipsis;overflow:hidden}.jstree-default.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==")}.jstree-default.jstree-rtl .jstree-last{background-image:none}.jstree-default-small .jstree-node{min-height:18px;line-height:18px;margin-left:18px;min-width:18px}.jstree-default-small .jstree-anchor{line-height:18px;height:18px}.jstree-default-small .jstree-icon{width:18px;height:18px;line-height:18px}.jstree-default-small .jstree-icon:empty{width:18px;height:18px;line-height:18px}.jstree-default-small.jstree-rtl .jstree-node{margin-right:18px}.jstree-default-small .jstree-wholerow{height:18px}.jstree-default-small .jstree-node,.jstree-default-small .jstree-icon{background-image:url("32px.png")}.jstree-default-small .jstree-node{background-position:-295px -7px;background-repeat:repeat-y}.jstree-default-small .jstree-last{background-image:none}.jstree-default-small .jstree-open>.jstree-ocl{background-position:-135px -7px}.jstree-default-small .jstree-closed>.jstree-ocl{background-position:-103px -7px}.jstree-default-small .jstree-leaf>.jstree-ocl{background-position:-71px -7px}.jstree-default-small .jstree-themeicon{background-position:-263px -7px}.jstree-default-small>.jstree-no-dots .jstree-node,.jstree-default-small>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-small>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -7px}.jstree-default-small>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -7px}.jstree-default-small .jstree-disabled{background:transparent}.jstree-default-small .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-small .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-small .jstree-checkbox{background-position:-167px -7px}.jstree-default-small .jstree-checkbox:hover{background-position:-167px -39px}.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-small .jstree-checked>.jstree-checkbox{background-position:-231px -7px}.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-small .jstree-checked>.jstree-checkbox:hover{background-position:-231px -39px}.jstree-default-small .jstree-anchor>.jstree-undetermined{background-position:-199px -7px}.jstree-default-small .jstree-anchor>.jstree-undetermined:hover{background-position:-199px -39px}.jstree-default-small .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-small>.jstree-striped{background-size:auto 36px}.jstree-default-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-small.jstree-rtl .jstree-last{background-image:none}.jstree-default-small.jstree-rtl .jstree-open>.jstree-ocl{background-position:-135px -39px}.jstree-default-small.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-103px -39px}.jstree-default-small.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-71px -39px}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -39px}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -39px}.jstree-default-small .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-small>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-small .jstree-file{background:url("32px.png") -103px -71px no-repeat}.jstree-default-small .jstree-folder{background:url("32px.png") -263px -7px no-repeat}.jstree-default-small>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-small{line-height:18px;padding:0 4px}#jstree-dnd.jstree-default-small .jstree-ok,#jstree-dnd.jstree-default-small .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-small i{background:transparent;width:18px;height:18px;line-height:18px}#jstree-dnd.jstree-default-small .jstree-ok{background-position:-7px -71px}#jstree-dnd.jstree-default-small .jstree-er{background-position:-39px -71px}.jstree-default-small .jstree-ellipsis{overflow:hidden}.jstree-default-small .jstree-ellipsis .jstree-anchor{width:calc(100% - 18px + 5px);text-overflow:ellipsis;overflow:hidden}.jstree-default-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==")}.jstree-default-small.jstree-rtl .jstree-last{background-image:none}.jstree-default-large .jstree-node{min-height:32px;line-height:32px;margin-left:32px;min-width:32px}.jstree-default-large .jstree-anchor{line-height:32px;height:32px}.jstree-default-large .jstree-icon{width:32px;height:32px;line-height:32px}.jstree-default-large .jstree-icon:empty{width:32px;height:32px;line-height:32px}.jstree-default-large.jstree-rtl .jstree-node{margin-right:32px}.jstree-default-large .jstree-wholerow{height:32px}.jstree-default-large .jstree-node,.jstree-default-large .jstree-icon{background-image:url("32px.png")}.jstree-default-large .jstree-node{background-position:-288px 0;background-repeat:repeat-y}.jstree-default-large .jstree-last{background-image:none}.jstree-default-large .jstree-open>.jstree-ocl{background-position:-128px 0}.jstree-default-large .jstree-closed>.jstree-ocl{background-position:-96px 0}.jstree-default-large .jstree-leaf>.jstree-ocl{background-position:-64px 0}.jstree-default-large .jstree-themeicon{background-position:-256px 0}.jstree-default-large>.jstree-no-dots .jstree-node,.jstree-default-large>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-large>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px 0}.jstree-default-large>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 0}.jstree-default-large .jstree-disabled{background:transparent}.jstree-default-large .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-large .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-large .jstree-checkbox{background-position:-160px 0}.jstree-default-large .jstree-checkbox:hover{background-position:-160px -32px}.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-large .jstree-checked>.jstree-checkbox{background-position:-224px 0}.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-large .jstree-checked>.jstree-checkbox:hover{background-position:-224px -32px}.jstree-default-large .jstree-anchor>.jstree-undetermined{background-position:-192px 0}.jstree-default-large .jstree-anchor>.jstree-undetermined:hover{background-position:-192px -32px}.jstree-default-large .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-large>.jstree-striped{background-size:auto 64px}.jstree-default-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-large.jstree-rtl .jstree-last{background-image:none}.jstree-default-large.jstree-rtl .jstree-open>.jstree-ocl{background-position:-128px -32px}.jstree-default-large.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-96px -32px}.jstree-default-large.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-64px -32px}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px -32px}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 -32px}.jstree-default-large .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-large>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-large .jstree-file{background:url("32px.png") -96px -64px no-repeat}.jstree-default-large .jstree-folder{background:url("32px.png") -256px 0 no-repeat}.jstree-default-large>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-large{line-height:32px;padding:0 4px}#jstree-dnd.jstree-default-large .jstree-ok,#jstree-dnd.jstree-default-large .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-large i{background:transparent;width:32px;height:32px;line-height:32px}#jstree-dnd.jstree-default-large .jstree-ok{background-position:0 -64px}#jstree-dnd.jstree-default-large .jstree-er{background-position:-32px -64px}.jstree-default-large .jstree-ellipsis{overflow:hidden}.jstree-default-large .jstree-ellipsis .jstree-anchor{width:calc(100% - 32px + 5px);text-overflow:ellipsis;overflow:hidden}.jstree-default-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==")}.jstree-default-large.jstree-rtl .jstree-last{background-image:none}@media (max-width:768px){#jstree-dnd.jstree-dnd-responsive{line-height:40px;font-weight:bold;font-size:1.1em;text-shadow:1px 1px white}#jstree-dnd.jstree-dnd-responsive>i{background:transparent;width:40px;height:40px}#jstree-dnd.jstree-dnd-responsive>.jstree-ok{background-image:url("40px.png");background-position:0 -200px;background-size:120px 240px}#jstree-dnd.jstree-dnd-responsive>.jstree-er{background-image:url("40px.png");background-position:-40px -200px;background-size:120px 240px}#jstree-marker.jstree-dnd-responsive{border-left-width:10px;border-top-width:10px;border-bottom-width:10px;margin-top:-10px}}@media (max-width:768px){.jstree-default-responsive .jstree-icon{background-image:url("40px.png")}.jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-responsive .jstree-node{min-height:40px;line-height:40px;margin-left:40px;min-width:40px;white-space:nowrap}.jstree-default-responsive .jstree-anchor{line-height:40px;height:40px}.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-icon:empty{width:40px;height:40px;line-height:40px}.jstree-default-responsive>.jstree-container-ul>.jstree-node{margin-left:0}.jstree-default-responsive.jstree-rtl .jstree-node{margin-left:0;margin-right:40px;background:transparent}.jstree-default-responsive.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-default-responsive .jstree-ocl,.jstree-default-responsive .jstree-themeicon,.jstree-default-responsive .jstree-checkbox{background-size:120px 240px}.jstree-default-responsive .jstree-leaf>.jstree-ocl,.jstree-default-responsive.jstree-rtl .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-responsive .jstree-open>.jstree-ocl{background-position:0 0 !important}.jstree-default-responsive .jstree-closed>.jstree-ocl{background-position:0 -40px !important}.jstree-default-responsive.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-40px 0 !important}.jstree-default-responsive .jstree-themeicon{background-position:-40px -40px}.jstree-default-responsive .jstree-checkbox,.jstree-default-responsive .jstree-checkbox:hover{background-position:-40px -80px}.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-responsive .jstree-checked>.jstree-checkbox,.jstree-default-responsive .jstree-checked>.jstree-checkbox:hover{background-position:0 -80px}.jstree-default-responsive .jstree-anchor>.jstree-undetermined,.jstree-default-responsive .jstree-anchor>.jstree-undetermined:hover{background-position:0 -120px}.jstree-default-responsive .jstree-anchor{font-weight:bold;font-size:1.1em;text-shadow:1px 1px white}.jstree-default-responsive>.jstree-striped{background:transparent}.jstree-default-responsive .jstree-wholerow{border-top:1px solid rgba(255,255,255,0.7);border-bottom:1px solid rgba(64,64,64,0.2);background:#ebebeb;height:40px}.jstree-default-responsive .jstree-wholerow-hovered{background:#e7f4f9}.jstree-default-responsive .jstree-wholerow-clicked{background:#beebff}.jstree-default-responsive .jstree-children .jstree-last>.jstree-wholerow{box-shadow:inset 0 -6px 3px -5px #666666}.jstree-default-responsive .jstree-children .jstree-open>.jstree-wholerow{box-shadow:inset 0 6px 3px -5px #666666;border-top:0}.jstree-default-responsive .jstree-children .jstree-open+.jstree-open{box-shadow:none}.jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-node>.jstree-ocl,.jstree-default-responsive .jstree-themeicon,.jstree-default-responsive .jstree-checkbox{background-image:url("40px.png");background-size:120px 240px}.jstree-default-responsive .jstree-node{background-position:-80px 0;background-repeat:repeat-y}.jstree-default-responsive .jstree-last{background-image:none}.jstree-default-responsive .jstree-leaf>.jstree-ocl{background-position:-40px -120px}.jstree-default-responsive .jstree-last>.jstree-ocl{background-position:-40px -160px}.jstree-default-responsive .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-responsive .jstree-file{background:url("40px.png") 0 -160px no-repeat;background-size:120px 240px}.jstree-default-responsive .jstree-folder{background:url("40px.png") -40px -40px no-repeat;background-size:120px 240px}.jstree-default-responsive>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}}
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/dist/themes/default/throbber.gif b/public/ext/vakata-jstree-3.3.17/dist/themes/default/throbber.gif
deleted file mode 100644
index cf06c1ad0f00be54b10f73e03c11d182d411fad1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1464
zcmZ?wbhEHb6krfw_{`7n;K75cswxHshKPuWef#!_h=|OYGsn!#?8Ao-U0q#nZf+_n
zDr?rP$;ilHVPX0I|G(mYZa>$MU}whwS0g<GW<~}E2E~6;&PAz-C8;S2<(VZJ3W-^X
z6*>8dDSDZCY55F_KUrA082A}<7#J8BK$beN6nr?@o*`X&YRRsP!b)9T6BL?^c^s~J
zF??WPKPcg#6fC8n!_mHAE4QLV`yv%#FA)(hmWBm$SX0{0Hy@b8Af|h8!u83jK8GU8
z!-@h-FY%-=W$o2ca!U9+i$#o$gVV~8M<id7nUO!zxKTlYg=GT2AgUwy83Y&@SYkh%
z{OL5g!%uZO3+rM}_DvQClmr&1=(H*pTozD1n#k!i&6D{cqk*D8^p<PQ7dcoWPPHdq
z$Z%LJfB1!Yq6S;^0sVyu3Oqawzcj9yFtB_M6~1sxwYW#IxL#&zmNJ@+0u1~N3@lL}
zPX6>+6k)bf%*kENlKGNib4Li%WkX>HkAnvrye7#oP2jNgRTMR5VBO5QaAOdco>0>{
zh7&dGdK$ux)E?M1#ck0|Qx*;mreCWjsW23<H1rsrdBAV^z59Hy5~>G5q0GP%^Wmf>
z?_Q$?=2K)?zR55?H@%@I>LR{~LqWB74NKcY#ju5JOWI#KMs&!jcCBf<AtAvNxHzDo
zp@{9~QpFc?8Vk7-cmf!Oraf+%P}_6WiL>c~j2!1CwL7}o4}X<_`Huq@t$Yj&EUp44
zJDnCp@M*G~zjIBIRf9DyeZq|ZfsTTRI8p!R4T)d9-p)A8(qQnTN!IaX(a9-x&ODCO
zEd7?rDmi6)rR@-53SeS$Wq^8x4`wnbuCgzje95u!hN4>V1jY%9jMG*8Hg!l|U{DWO
zAabyyGm+JOtA-GZqN9V4Ktto>1CtmmL|P6dTwz!j+LdS!pt9~pPvS-mlSL8-4mLQN
z$@+5|a2P19Vs*R}cp^=L$%`)_LztUMTse~|N3yRD<};)O%fJ%-;p9(-1rb7-Jm>Em
zt!QKN;xw}3YK}Z{SYX;kk5jsgCD%llc^)-o?ojJc>A0A|GWisbbD;%`-(*JRuDdo;
zh5-vURw(4P2Rlxvh^bUKGRvdKnnnD$p`AsGCd@uQ1|3EQMh1RxN(sB*slYkW=T($`
z=Iv*(XP+u8XA9sHwm2}sgQKDC;K#i0(`GDGP;@xMVmiO^jfXaC_L^IVHs0o7>1;`|
z3jV>;c=XVN8LbTAUW|nnMl910-P*{o%A`4&1sb#{UIS$VfkhGb*c()&*<xhVTSOj}
zdOS*;ohsNfMM5&iq@qt!U!HY>2A6t6!=`VM0tV|AIw`#H6=`ibrf5+i#^&by(LhH^
z=<ww-iz`(JPcmJs<B_pD{#`-wxtW(GlIIv07#X11;KIq50+SlDGF5Lzeb1fAHsu(H
zpN~^ai04Yb;5)o0-W*Z<!!_aH1E)DWtTT^nDB7deaja1@@`?aA>*0wK7VM0i&S?@F
z9Id)O#RW5D8^5(Blxj4YK2@8@08cw$55laA_;AuwepQ810ORokuAELmog5zpmwfPT
zh+<{B+<9qHI{!mvX7_~xCw@rCvp6?y3}u@%UFBkd9bf;VqzA?(DvZr73WCN=ybROA
z6Bfy{sd?OMQ0m&VNkW(rIW%Dr7xlq2sA10!p^clSHy@}8`p(ewfbm48)Z^9-Gad>=
zYOA&{Qkf^oAP^zZxO3rBSBZ*(O$Qb~NK{$im!NErBH_2;@)8FR59w*`ezh4kXZYO`
SY76%-?bp|oJM6;1U=08ocJ1c?

diff --git a/public/ext/vakata-jstree-3.3.17/gruntfile.js b/public/ext/vakata-jstree-3.3.17/gruntfile.js
deleted file mode 100644
index 1471bd28e0..0000000000
--- a/public/ext/vakata-jstree-3.3.17/gruntfile.js
+++ /dev/null
@@ -1,221 +0,0 @@
-/*global module:false, require:false, __dirname:false*/
-var _ = require('lodash');
-
-module.exports = function(grunt) {
-  grunt.util.linefeed = "\n";
-
-  // Project configuration.
-  grunt.initConfig({
-    pkg: grunt.file.readJSON('package.json'),
-    concat: {
-      options : {
-        separator : "\n"
-      },
-      dist: {
-        src: ['src/<%= pkg.name %>.js', 'src/<%= pkg.name %>.*.js', 'src/vakata-jstree.js'],
-        dest: 'dist/<%= pkg.name %>.js'
-      }
-    },
-    copy: {
-      libs : {
-        files : [
-          { expand: true, cwd : 'libs/', src: ['*'], dest: 'dist/libs/' }
-        ]
-      },
-      docs : {
-        files : [
-          { expand: true, cwd : 'dist/', src: ['**/*'], dest: 'docs/assets/dist/' }
-        ]
-      }
-    },
-    uglify: {
-      options: {
-        banner: '/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %> - (<%= _.map(pkg.licenses, "type").join(", ") %>) */\n',
-        preserveComments: false,
-        //sourceMap: "dist/jstree.min.map",
-        //sourceMappingURL: "jstree.min.map",
-        report: "min",
-        output: {
-                ascii_only: true
-        },
-        compress: {
-                hoist_funs: false,
-                loops: false,
-                unused: false
-        }
-      },
-      dist: {
-        src: ['<%= concat.dist.dest %>'],
-        dest: 'dist/<%= pkg.name %>.min.js'
-      }
-    },
-    jshint: {
-      options: {
-        'curly' : true,
-        'eqeqeq' : true,
-        'latedef' : true,
-        'newcap' : true,
-        'noarg' : true,
-        'sub' : true,
-        'undef' : true,
-        'boss' : true,
-        'eqnull' : true,
-        'browser' : true,
-        'trailing' : true,
-        'globals' : {
-          'console' : true,
-          'jQuery' : true,
-          'browser' : true,
-          'XSLTProcessor' : true,
-          'ActiveXObject' : true
-        }
-      },
-      beforeconcat: ['src/<%= pkg.name %>.js', 'src/<%= pkg.name %>.*.js'],
-      afterconcat: ['dist/<%= pkg.name %>.js']
-    },
-    dox: {
-      files: {
-        src: ['src/*.js'],
-        dest: 'docs'
-      }
-    },
-    amd : {
-      files: {
-        src: ['dist/jstree.js'],
-        dest: 'dist/jstree.js'
-      }
-    },
-    less: {
-      production: {
-        options : {
-          cleancss : true,
-          compress : true,
-          math : 'always'
-        },
-        files: {
-          "dist/themes/default/style.min.css" : "src/themes/default/style.less",
-          "dist/themes/default-dark/style.min.css" : "src/themes/default-dark/style.less"
-        }
-      },
-      development: {
-        options : {
-          math : 'always'
-        },
-        files: {
-          "src/themes/default/style.css" : "src/themes/default/style.less",
-          "dist/themes/default/style.css" : "src/themes/default/style.less",
-          "src/themes/default-dark/style.css" : "src/themes/default-dark/style.less",
-          "dist/themes/default-dark/style.css" : "src/themes/default-dark/style.less"
-        }
-      }
-    },
-    watch: {
-      js : {
-        files: ['src/**/*.js'],
-        tasks: ['js'],
-        options : {
-          atBegin : true
-        }
-      },
-      css : {
-        files: ['src/**/*.less','src/**/*.png','src/**/*.gif'],
-        tasks: ['css'],
-        options : {
-          atBegin : true
-        }
-      },
-    },
-    imagemin: {
-      dynamic: {
-        options: {                       // Target options
-          optimizationLevel: 7,
-          pngquant : true
-        },
-        files: [{
-          expand: true,                  // Enable dynamic expansion
-          cwd:  'src/themes/default/',    // Src matches are relative to this path
-          src: ['**/*.{png,jpg,gif}'],   // Actual patterns to match
-          dest: 'dist/themes/default/'   // Destination path prefix
-        },{
-          expand: true,                  // Enable dynamic expansion
-          cwd:  'src/themes/default-dark/',    // Src matches are relative to this path
-          src: ['**/*.{png,jpg,gif}'],   // Actual patterns to match
-          dest: 'dist/themes/default-dark/'   // Destination path prefix
-        }]
-      }
-    },
-    replace: {
-      files: {
-        src: ['dist/*.js', 'bower.json', 'component.json', 'jstree.jquery.json'],
-        overwrite: true,
-        replacements: [
-          {
-            from: '{{VERSION}}',
-            to: "<%= pkg.version %>"
-          },
-          {
-            from: /"version": "[^"]+"/g,
-            to: "\"version\": \"<%= pkg.version %>\""
-          },
-        ]
-      }
-    }
-  });
-
-  grunt.loadNpmTasks('grunt-contrib-jshint');
-  grunt.loadNpmTasks('grunt-contrib-concat');
-  grunt.loadNpmTasks('grunt-contrib-copy');
-  grunt.loadNpmTasks('grunt-contrib-uglify');
-  grunt.loadNpmTasks('grunt-contrib-less');
-  grunt.loadNpmTasks('grunt-contrib-watch');
-  grunt.loadNpmTasks('grunt-contrib-imagemin');
-  grunt.loadNpmTasks('grunt-text-replace');
-
-  grunt.registerMultiTask('amd', 'Clean up AMD', function () {
-    var s, d;
-    this.files.forEach(function (f) {
-      s = f.src[0];
-      d = f.dest;
-    });
-    grunt.file.copy(s, d, {
-      process: function (contents) {
-        contents = contents.replace(/\s*if\(\$\.jstree\.plugins\.[a-z]+\)\s*\{\s*return;\s*\}/ig, '');
-        contents = contents.replace(/\/\*globals[^\/]+\//ig, '');
-        //contents = contents.replace(/\(function \(factory[\s\S]*?undefined/mig, '(function ($, undefined');
-        //contents = contents.replace(/\}\)\);/g, '}(jQuery));');
-        contents = contents.replace(/\(function \(factory[\s\S]*?undefined\s*\)[^\n]+/mig, '');
-        contents = contents.replace(/\}\)\);/g, '');
-        contents = contents.replace(/\s*("|')use strict("|');/g, '');
-        contents = contents.replace(/\s*return \$\.fn\.jstree;/g, '');
-        return grunt.file.read('src/intro.js') + contents + grunt.file.read('src/outro.js');
-      }
-    });
-  });
-
-  grunt.registerMultiTask('dox', 'Generate dox output ', function() {
-    var exec = require('child_process').exec,
-        path = require('path'),
-        done = this.async(),
-        doxPath = path.resolve(__dirname),
-        formatter = [doxPath, 'node_modules', '.bin', 'dox'].join(path.sep);
-    exec(formatter + ' < "dist/jstree.js" > "docs/jstree.json"', {maxBuffer: 5000*1024}, function(error, stout, sterr){
-      if (error) {
-        grunt.log.error(formatter);
-        grunt.log.error("WARN: "+ error);
-      }
-      if (!error) {
-        grunt.log.writeln('dist/jstree.js doxxed.');
-        done();
-      }
-    });
-  });
-
-  grunt.util.linefeed = "\n";
-
-  // Default task.
-  //grunt.registerTask('default', ['jshint:beforeconcat','concat','amd','jshint:afterconcat','copy:libs','uglify','less','imagemin','replace','copy:docs','qunit','resemble','dox']);
-  grunt.registerTask('default', ['jshint:beforeconcat','concat','amd','jshint:afterconcat','copy:libs','uglify','less','replace','copy:docs','dox']);
-  grunt.registerTask('js', ['concat','amd','uglify']);
-  grunt.registerTask('css', ['copy','less']);
-
-};
diff --git a/public/ext/vakata-jstree-3.3.17/jstree.jquery.json b/public/ext/vakata-jstree-3.3.17/jstree.jquery.json
deleted file mode 100644
index 693fa6294c..0000000000
--- a/public/ext/vakata-jstree-3.3.17/jstree.jquery.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-	"name": "jstree",
-	"title": "jsTree",
-	"description": "Tree view for jQuery",
-	"version": "3.3.17",
-	"homepage": "http://jstree.com",
-	"keywords": [
-		"ui",
-		"tree",
-		"jstree"
-	],
-	"author": {
-		"name": "Ivan Bozhanov",
-		"email": "jstree@jstree.com",
-		"url": "http://vakata.com"
-	},
-	"licenses": [
-		{
-			"type": "MIT",
-			"url": "https://github.com/vakata/jstree/blob/master/LICENSE-MIT"
-		}
-	],
-	"bugs": "https://github.com/vakata/jstree/issues",
-	"demo": "http://jstree.com/demo",
-	"dependencies": {
-		"jquery": ">=1.9.1"
-	}
-}
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/package-lock.json b/public/ext/vakata-jstree-3.3.17/package-lock.json
deleted file mode 100644
index 31fc546768..0000000000
--- a/public/ext/vakata-jstree-3.3.17/package-lock.json
+++ /dev/null
@@ -1,13470 +0,0 @@
-{
-  "name": "jstree",
-  "version": "3.3.16",
-  "lockfileVersion": 2,
-  "requires": true,
-  "packages": {
-    "": {
-      "name": "jstree",
-      "version": "3.3.16",
-      "license": "MIT",
-      "dependencies": {
-        "jquery": "^3.5.0"
-      },
-      "devDependencies": {
-        "dox": "^1.0.0",
-        "grunt": "~1.6.1",
-        "grunt-contrib-concat": "*",
-        "grunt-contrib-copy": "*",
-        "grunt-contrib-imagemin": "^4.0.0",
-        "grunt-contrib-jshint": "*",
-        "grunt-contrib-less": "^3.0.0",
-        "grunt-contrib-uglify": "^5.0.1",
-        "grunt-contrib-watch": "~1.1.0",
-        "grunt-text-replace": "~0.4.0",
-        "lodash": "^4.17.21"
-      }
-    },
-    "node_modules/@mrmlnc/readdir-enhanced": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
-      "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
-      "dev": true,
-      "dependencies": {
-        "call-me-maybe": "^1.0.1",
-        "glob-to-regexp": "^0.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@nodelib/fs.stat": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
-      "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/@sindresorhus/is": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
-      "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@types/q": {
-      "version": "1.5.5",
-      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
-      "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/abbrev": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-      "dev": true
-    },
-    "node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/arch": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
-      "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "optional": true
-    },
-    "node_modules/archive-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz",
-      "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "file-type": "^4.2.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/archive-type/node_modules/file-type": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz",
-      "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "dependencies": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "node_modules/arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-each": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
-      "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-find-index": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-slice": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
-      "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "dev": true,
-      "dependencies": {
-        "array-uniq": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-unique": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/arrify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/async": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
-      "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==",
-      "dev": true
-    },
-    "node_modules/atob": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "dev": true,
-      "bin": {
-        "atob": "bin/atob.js"
-      },
-      "engines": {
-        "node": ">= 4.5.0"
-      }
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
-    },
-    "node_modules/base": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "dev": true,
-      "dependencies": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/base/node_modules/define-property": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/base64-js": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "optional": true
-    },
-    "node_modules/bin-build": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz",
-      "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "decompress": "^4.0.0",
-        "download": "^6.2.2",
-        "execa": "^0.7.0",
-        "p-map-series": "^1.0.0",
-        "tempfile": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/bin-check": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz",
-      "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "execa": "^0.7.0",
-        "executable": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/bin-version": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz",
-      "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "execa": "^1.0.0",
-        "find-versions": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/bin-version-check": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz",
-      "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "bin-version": "^3.0.0",
-        "semver": "^5.6.0",
-        "semver-truncate": "^1.1.2"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/bin-version/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      },
-      "engines": {
-        "node": ">=4.8"
-      }
-    },
-    "node_modules/bin-version/node_modules/execa": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "cross-spawn": "^6.0.0",
-        "get-stream": "^4.0.0",
-        "is-stream": "^1.1.0",
-        "npm-run-path": "^2.0.0",
-        "p-finally": "^1.0.0",
-        "signal-exit": "^3.0.0",
-        "strip-eof": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/bin-version/node_modules/get-stream": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "pump": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/bin-version/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/bin-wrapper": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz",
-      "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "bin-check": "^4.1.0",
-        "bin-version-check": "^4.0.0",
-        "download": "^7.1.0",
-        "import-lazy": "^3.1.0",
-        "os-filter-obj": "^2.0.0",
-        "pify": "^4.0.1"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/bin-wrapper/node_modules/download": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz",
-      "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "archive-type": "^4.0.0",
-        "caw": "^2.0.1",
-        "content-disposition": "^0.5.2",
-        "decompress": "^4.2.0",
-        "ext-name": "^5.0.0",
-        "file-type": "^8.1.0",
-        "filenamify": "^2.0.0",
-        "get-stream": "^3.0.0",
-        "got": "^8.3.1",
-        "make-dir": "^1.2.0",
-        "p-event": "^2.1.0",
-        "pify": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/bin-wrapper/node_modules/download/node_modules/pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/bin-wrapper/node_modules/file-type": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz",
-      "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/bin-wrapper/node_modules/got": {
-      "version": "8.3.2",
-      "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
-      "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "@sindresorhus/is": "^0.7.0",
-        "cacheable-request": "^2.1.1",
-        "decompress-response": "^3.3.0",
-        "duplexer3": "^0.1.4",
-        "get-stream": "^3.0.0",
-        "into-stream": "^3.1.0",
-        "is-retry-allowed": "^1.1.0",
-        "isurl": "^1.0.0-alpha5",
-        "lowercase-keys": "^1.0.0",
-        "mimic-response": "^1.0.0",
-        "p-cancelable": "^0.4.0",
-        "p-timeout": "^2.0.1",
-        "pify": "^3.0.0",
-        "safe-buffer": "^5.1.1",
-        "timed-out": "^4.0.1",
-        "url-parse-lax": "^3.0.0",
-        "url-to-options": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/bin-wrapper/node_modules/got/node_modules/pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/bin-wrapper/node_modules/p-cancelable": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
-      "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/bin-wrapper/node_modules/p-event": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz",
-      "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "p-timeout": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/bin-wrapper/node_modules/p-timeout": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
-      "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "p-finally": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/bin-wrapper/node_modules/prepend-http": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/bin-wrapper/node_modules/url-parse-lax": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
-      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "prepend-http": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/bl": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
-      "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "readable-stream": "^2.3.5",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "node_modules/bl/node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/bl/node_modules/readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/bl/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/body": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz",
-      "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=",
-      "dev": true,
-      "dependencies": {
-        "continuable-cache": "^0.3.1",
-        "error": "^7.0.0",
-        "raw-body": "~1.1.0",
-        "safe-json-parse": "~1.0.1"
-      }
-    },
-    "node_modules/boolbase": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-      "dev": true,
-      "dependencies": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/braces/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/braces/node_modules/is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/buffer": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
-      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "optional": true,
-      "dependencies": {
-        "base64-js": "^1.3.1",
-        "ieee754": "^1.1.13"
-      }
-    },
-    "node_modules/buffer-alloc": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
-      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "buffer-alloc-unsafe": "^1.1.0",
-        "buffer-fill": "^1.0.0"
-      }
-    },
-    "node_modules/buffer-alloc-unsafe": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
-      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/buffer-crc32": {
-      "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
-      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/buffer-fill": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
-      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/bytes": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
-      "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
-      "dev": true
-    },
-    "node_modules/cache-base": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "dev": true,
-      "dependencies": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/cacheable-request": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
-      "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "clone-response": "1.0.2",
-        "get-stream": "3.0.0",
-        "http-cache-semantics": "3.8.1",
-        "keyv": "3.0.0",
-        "lowercase-keys": "1.0.0",
-        "normalize-url": "2.0.1",
-        "responselike": "1.0.2"
-      }
-    },
-    "node_modules/cacheable-request/node_modules/lowercase-keys": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
-      "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/call-bind": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-      "dev": true,
-      "dependencies": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/call-me-maybe": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
-      "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
-      "dev": true
-    },
-    "node_modules/camelcase": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/camelcase-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
-      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "camelcase": "^2.0.0",
-        "map-obj": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/caw": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz",
-      "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "get-proxy": "^2.0.0",
-        "isurl": "^1.0.0-alpha5",
-        "tunnel-agent": "^0.6.0",
-        "url-to-options": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/class-utils": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "dev": true,
-      "dependencies": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/define-property": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/kind-of": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/cli": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
-      "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
-      "dev": true,
-      "dependencies": {
-        "exit": "0.1.2",
-        "glob": "^7.1.1"
-      },
-      "engines": {
-        "node": ">=0.2.5"
-      }
-    },
-    "node_modules/clone-response": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
-      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "mimic-response": "^1.0.0"
-      }
-    },
-    "node_modules/coa": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
-      "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "@types/q": "^1.5.1",
-        "chalk": "^2.4.1",
-        "q": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 4.0"
-      }
-    },
-    "node_modules/coa/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/coa/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/coa/node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/coa/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/coa/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/coa/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/collection-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
-      "dependencies": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/colors": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
-      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.1.90"
-      }
-    },
-    "node_modules/commander": {
-      "version": "2.9.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
-      "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "graceful-readlink": ">= 1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.6.x"
-      }
-    },
-    "node_modules/component-emitter": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
-      "dev": true
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "node_modules/config-chain": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
-      "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "ini": "^1.3.4",
-        "proto-list": "~1.2.1"
-      }
-    },
-    "node_modules/console-browserify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
-      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
-      "dev": true,
-      "dependencies": {
-        "date-now": "^0.1.4"
-      }
-    },
-    "node_modules/console-stream": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz",
-      "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/content-disposition": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
-      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "safe-buffer": "5.1.2"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/continuable-cache": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz",
-      "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
-      "dev": true
-    },
-    "node_modules/copy-anything": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz",
-      "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==",
-      "dev": true,
-      "dependencies": {
-        "is-what": "^3.12.0"
-      }
-    },
-    "node_modules/copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/core-util-is": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
-      "dev": true
-    },
-    "node_modules/cross-spawn": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
-      "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "lru-cache": "^4.0.1",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      }
-    },
-    "node_modules/cross-spawn/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/css-select": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
-      "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "boolbase": "^1.0.0",
-        "css-what": "^3.2.1",
-        "domutils": "^1.7.0",
-        "nth-check": "^1.0.2"
-      }
-    },
-    "node_modules/css-select-base-adapter": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
-      "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/css-select/node_modules/domutils": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
-      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "dom-serializer": "0",
-        "domelementtype": "1"
-      }
-    },
-    "node_modules/css-tree": {
-      "version": "1.0.0-alpha.37",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
-      "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "mdn-data": "2.0.4",
-        "source-map": "^0.6.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/css-tree/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/css-what": {
-      "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
-      "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">= 6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/fb55"
-      }
-    },
-    "node_modules/csso": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
-      "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "css-tree": "^1.1.2"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/csso/node_modules/css-tree": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
-      "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "mdn-data": "2.0.14",
-        "source-map": "^0.6.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/csso/node_modules/mdn-data": {
-      "version": "2.0.14",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
-      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/csso/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/currently-unhandled": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "array-find-index": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/date-now": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
-      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
-      "dev": true
-    },
-    "node_modules/dateformat": {
-      "version": "4.6.3",
-      "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz",
-      "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/decompress": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz",
-      "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "decompress-tar": "^4.0.0",
-        "decompress-tarbz2": "^4.0.0",
-        "decompress-targz": "^4.0.0",
-        "decompress-unzip": "^4.0.1",
-        "graceful-fs": "^4.1.10",
-        "make-dir": "^1.0.0",
-        "pify": "^2.3.0",
-        "strip-dirs": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/decompress-response": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
-      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "mimic-response": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/decompress-tar": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
-      "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "file-type": "^5.2.0",
-        "is-stream": "^1.1.0",
-        "tar-stream": "^1.5.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/decompress-tar/node_modules/file-type": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
-      "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/decompress-tarbz2": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
-      "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "decompress-tar": "^4.1.0",
-        "file-type": "^6.1.0",
-        "is-stream": "^1.1.0",
-        "seek-bzip": "^1.0.5",
-        "unbzip2-stream": "^1.0.9"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/decompress-tarbz2/node_modules/file-type": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz",
-      "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/decompress-targz": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz",
-      "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "decompress-tar": "^4.1.1",
-        "file-type": "^5.2.0",
-        "is-stream": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/decompress-targz/node_modules/file-type": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
-      "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/decompress-unzip": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
-      "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "file-type": "^3.8.0",
-        "get-stream": "^2.2.0",
-        "pify": "^2.3.0",
-        "yauzl": "^2.4.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/decompress-unzip/node_modules/file-type": {
-      "version": "3.9.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
-      "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/decompress-unzip/node_modules/get-stream": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
-      "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "object-assign": "^4.0.1",
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/decompress-unzip/node_modules/pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/decompress/node_modules/pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/define-properties": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
-      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "object-keys": "^1.0.12"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/define-property": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/detect-file": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
-      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/dir-glob": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
-      "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
-      "dev": true,
-      "dependencies": {
-        "arrify": "^1.0.1",
-        "path-type": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/dom-serializer": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
-      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
-      "dev": true,
-      "dependencies": {
-        "domelementtype": "^2.0.1",
-        "entities": "^2.0.0"
-      }
-    },
-    "node_modules/dom-serializer/node_modules/domelementtype": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
-      "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/fb55"
-        }
-      ]
-    },
-    "node_modules/dom-serializer/node_modules/entities": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
-      "dev": true,
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
-    "node_modules/domelementtype": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
-      "dev": true
-    },
-    "node_modules/domhandler": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
-      "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
-      "dev": true,
-      "dependencies": {
-        "domelementtype": "1"
-      }
-    },
-    "node_modules/domutils": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
-      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
-      "dev": true,
-      "dependencies": {
-        "dom-serializer": "0",
-        "domelementtype": "1"
-      }
-    },
-    "node_modules/download": {
-      "version": "6.2.5",
-      "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz",
-      "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "caw": "^2.0.0",
-        "content-disposition": "^0.5.2",
-        "decompress": "^4.0.0",
-        "ext-name": "^5.0.0",
-        "file-type": "5.2.0",
-        "filenamify": "^2.0.0",
-        "get-stream": "^3.0.0",
-        "got": "^7.0.0",
-        "make-dir": "^1.0.0",
-        "p-event": "^1.0.0",
-        "pify": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/download/node_modules/file-type": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
-      "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/download/node_modules/pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/dox": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/dox/-/dox-1.0.0.tgz",
-      "integrity": "sha512-y0borLgGiqcXigOItzeBvWEPtZ5tkKMZ7MTa/9xhVCUz6sU1quXTTvbJGOLFZAu/4/nlj2Ui02A/tLqQFBXo+w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "commander": "9.4.0",
-        "jsdoctypeparser": "^9.0.0",
-        "markdown-it": "13.0.1"
-      },
-      "bin": {
-        "dox": "bin/dox"
-      }
-    },
-    "node_modules/dox/node_modules/commander": {
-      "version": "9.4.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz",
-      "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^12.20.0 || >=14"
-      }
-    },
-    "node_modules/duplexer": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
-      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
-      "dev": true
-    },
-    "node_modules/duplexer3": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
-      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/end-of-stream": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "once": "^1.4.0"
-      }
-    },
-    "node_modules/entities": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
-      "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
-      "dev": true
-    },
-    "node_modules/errno": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
-      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "prr": "~1.0.1"
-      },
-      "bin": {
-        "errno": "cli.js"
-      }
-    },
-    "node_modules/error": {
-      "version": "7.2.1",
-      "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz",
-      "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==",
-      "dev": true,
-      "dependencies": {
-        "string-template": "~0.2.1"
-      }
-    },
-    "node_modules/error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "node_modules/es-abstract": {
-      "version": "1.19.1",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
-      "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "es-to-primitive": "^1.2.1",
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.1.1",
-        "get-symbol-description": "^1.0.0",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.2",
-        "internal-slot": "^1.0.3",
-        "is-callable": "^1.2.4",
-        "is-negative-zero": "^2.0.1",
-        "is-regex": "^1.1.4",
-        "is-shared-array-buffer": "^1.0.1",
-        "is-string": "^1.0.7",
-        "is-weakref": "^1.0.1",
-        "object-inspect": "^1.11.0",
-        "object-keys": "^1.1.1",
-        "object.assign": "^4.1.2",
-        "string.prototype.trimend": "^1.0.4",
-        "string.prototype.trimstart": "^1.0.4",
-        "unbox-primitive": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/es-to-primitive": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "is-callable": "^1.1.4",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true,
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eventemitter2": {
-      "version": "0.4.14",
-      "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
-      "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
-      "dev": true
-    },
-    "node_modules/exec-buffer": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz",
-      "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "execa": "^0.7.0",
-        "p-finally": "^1.0.0",
-        "pify": "^3.0.0",
-        "rimraf": "^2.5.4",
-        "tempfile": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/exec-buffer/node_modules/pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/exec-buffer/node_modules/rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/execa": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
-      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "cross-spawn": "^5.0.1",
-        "get-stream": "^3.0.0",
-        "is-stream": "^1.1.0",
-        "npm-run-path": "^2.0.0",
-        "p-finally": "^1.0.0",
-        "signal-exit": "^3.0.0",
-        "strip-eof": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/executable": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
-      "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "pify": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/executable/node_modules/pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/exit": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/expand-brackets": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
-      "dependencies": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/define-property": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/kind-of": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-tilde": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
-      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
-      "dev": true,
-      "dependencies": {
-        "homedir-polyfill": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ext-list": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
-      "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "mime-db": "^1.28.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ext-name": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz",
-      "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "ext-list": "^2.0.0",
-        "sort-keys-length": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
-    },
-    "node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extglob": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
-      "dependencies": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extglob/node_modules/define-property": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extglob/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extglob/node_modules/is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fast-glob": {
-      "version": "2.2.7",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
-      "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
-      "dev": true,
-      "dependencies": {
-        "@mrmlnc/readdir-enhanced": "^2.2.1",
-        "@nodelib/fs.stat": "^1.1.2",
-        "glob-parent": "^3.1.0",
-        "is-glob": "^4.0.0",
-        "merge2": "^1.2.3",
-        "micromatch": "^3.1.10"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/fast-xml-parser": {
-      "version": "3.21.1",
-      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz",
-      "integrity": "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "strnum": "^1.0.4"
-      },
-      "bin": {
-        "xml2js": "cli.js"
-      },
-      "funding": {
-        "type": "paypal",
-        "url": "https://paypal.me/naturalintelligence"
-      }
-    },
-    "node_modules/faye-websocket": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
-      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
-      "dev": true,
-      "dependencies": {
-        "websocket-driver": ">=0.5.1"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/fd-slicer": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
-      "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "pend": "~1.2.0"
-      }
-    },
-    "node_modules/figures": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
-      "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
-      "dev": true,
-      "dependencies": {
-        "escape-string-regexp": "^1.0.5",
-        "object-assign": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/file-sync-cmp": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz",
-      "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=",
-      "dev": true
-    },
-    "node_modules/file-type": {
-      "version": "10.11.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz",
-      "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/filename-reserved-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
-      "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/filenamify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz",
-      "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "filename-reserved-regex": "^2.0.0",
-        "strip-outer": "^1.0.0",
-        "trim-repeated": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "dev": true,
-      "dependencies": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fill-range/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fill-range/node_modules/is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/find-versions": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
-      "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "semver-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/findup-sync": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz",
-      "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "detect-file": "^1.0.0",
-        "is-glob": "^4.0.3",
-        "micromatch": "^4.0.4",
-        "resolve-dir": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/findup-sync/node_modules/braces": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
-      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fill-range": "^7.1.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/findup-sync/node_modules/fill-range": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
-      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/findup-sync/node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/findup-sync/node_modules/micromatch": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
-      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "braces": "^3.0.3",
-        "picomatch": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/findup-sync/node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/fined": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
-      "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
-      "dev": true,
-      "dependencies": {
-        "expand-tilde": "^2.0.2",
-        "is-plain-object": "^2.0.3",
-        "object.defaults": "^1.1.0",
-        "object.pick": "^1.2.0",
-        "parse-filepath": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/flagged-respawn": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
-      "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/for-in": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/for-own": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
-      "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
-      "dev": true,
-      "dependencies": {
-        "for-in": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fragment-cache": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
-      "dependencies": {
-        "map-cache": "^0.2.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/from2": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
-      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0"
-      }
-    },
-    "node_modules/from2/node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/from2/node_modules/readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/from2/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/fs-constants": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
-      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "node_modules/gaze": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
-      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
-      "dev": true,
-      "dependencies": {
-        "globule": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/get-intrinsic": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
-      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
-      "dev": true,
-      "dependencies": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/get-proxy": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz",
-      "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "npm-conf": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/get-stdin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/get-stream": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
-      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/get-symbol-description": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
-      "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/getobject": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz",
-      "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/gifsicle": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-4.0.1.tgz",
-      "integrity": "sha512-A/kiCLfDdV+ERV/UB+2O41mifd+RxH8jlRG8DMxZO84Bma/Fw0htqZ+hY2iaalLRNyUu7tYZQslqUBJxBggxbg==",
-      "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "dependencies": {
-        "bin-build": "^3.0.0",
-        "bin-wrapper": "^4.0.0",
-        "execa": "^1.0.0",
-        "logalot": "^2.0.0"
-      },
-      "bin": {
-        "gifsicle": "cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/gifsicle/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      },
-      "engines": {
-        "node": ">=4.8"
-      }
-    },
-    "node_modules/gifsicle/node_modules/execa": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "cross-spawn": "^6.0.0",
-        "get-stream": "^4.0.0",
-        "is-stream": "^1.1.0",
-        "npm-run-path": "^2.0.0",
-        "p-finally": "^1.0.0",
-        "signal-exit": "^3.0.0",
-        "strip-eof": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/gifsicle/node_modules/get-stream": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "pump": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/gifsicle/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/glob": {
-      "version": "7.1.7",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
-      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
-      "dev": true,
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/glob-parent": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-      "dev": true,
-      "dependencies": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      }
-    },
-    "node_modules/glob-parent/node_modules/is-glob": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-      "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-      "dev": true,
-      "dependencies": {
-        "is-extglob": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/glob-to-regexp": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
-      "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
-      "dev": true
-    },
-    "node_modules/global-modules": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
-      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
-      "dev": true,
-      "dependencies": {
-        "global-prefix": "^1.0.1",
-        "is-windows": "^1.0.1",
-        "resolve-dir": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/global-prefix": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
-      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
-      "dev": true,
-      "dependencies": {
-        "expand-tilde": "^2.0.2",
-        "homedir-polyfill": "^1.0.1",
-        "ini": "^1.3.4",
-        "is-windows": "^1.0.1",
-        "which": "^1.2.14"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/global-prefix/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/globby": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz",
-      "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==",
-      "dev": true,
-      "dependencies": {
-        "array-union": "^1.0.1",
-        "dir-glob": "2.0.0",
-        "fast-glob": "^2.0.2",
-        "glob": "^7.1.2",
-        "ignore": "^3.3.5",
-        "pify": "^3.0.0",
-        "slash": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/globby/node_modules/pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/globule": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz",
-      "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==",
-      "dev": true,
-      "dependencies": {
-        "glob": "~7.1.1",
-        "lodash": "~4.17.10",
-        "minimatch": "~3.0.2"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/got": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz",
-      "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "decompress-response": "^3.2.0",
-        "duplexer3": "^0.1.4",
-        "get-stream": "^3.0.0",
-        "is-plain-obj": "^1.1.0",
-        "is-retry-allowed": "^1.0.0",
-        "is-stream": "^1.0.0",
-        "isurl": "^1.0.0-alpha5",
-        "lowercase-keys": "^1.0.0",
-        "p-cancelable": "^0.3.0",
-        "p-timeout": "^1.1.1",
-        "safe-buffer": "^5.0.1",
-        "timed-out": "^4.0.0",
-        "url-parse-lax": "^1.0.0",
-        "url-to-options": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/graceful-fs": {
-      "version": "4.2.8",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
-      "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/graceful-readlink": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
-      "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/grunt": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz",
-      "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "dateformat": "~4.6.2",
-        "eventemitter2": "~0.4.13",
-        "exit": "~0.1.2",
-        "findup-sync": "~5.0.0",
-        "glob": "~7.1.6",
-        "grunt-cli": "~1.4.3",
-        "grunt-known-options": "~2.0.0",
-        "grunt-legacy-log": "~3.0.0",
-        "grunt-legacy-util": "~2.0.1",
-        "iconv-lite": "~0.6.3",
-        "js-yaml": "~3.14.0",
-        "minimatch": "~3.0.4",
-        "nopt": "~3.0.6"
-      },
-      "bin": {
-        "grunt": "bin/grunt"
-      },
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/grunt-cli": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz",
-      "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==",
-      "dev": true,
-      "dependencies": {
-        "grunt-known-options": "~2.0.0",
-        "interpret": "~1.1.0",
-        "liftup": "~3.0.1",
-        "nopt": "~4.0.1",
-        "v8flags": "~3.2.0"
-      },
-      "bin": {
-        "grunt": "bin/grunt"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/grunt-cli/node_modules/nopt": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
-      "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
-      "dev": true,
-      "dependencies": {
-        "abbrev": "1",
-        "osenv": "^0.1.4"
-      },
-      "bin": {
-        "nopt": "bin/nopt.js"
-      }
-    },
-    "node_modules/grunt-contrib-concat": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-2.0.0.tgz",
-      "integrity": "sha512-/cfWwsGiprVTOl7c2bZwMdQ8hIf3e1f4szm1i7qhY9hOnR/X2KL+Xe7dynNweTYHa6aWPZx2B5GPsUpxAXNCaA==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.1.2",
-        "source-map": "^0.5.3"
-      },
-      "engines": {
-        "node": ">=0.12.0"
-      },
-      "peerDependencies": {
-        "grunt": ">=1.4.1"
-      }
-    },
-    "node_modules/grunt-contrib-copy": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz",
-      "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^1.1.1",
-        "file-sync-cmp": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/grunt-contrib-copy/node_modules/ansi-styles": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/grunt-contrib-copy/node_modules/chalk": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^2.2.1",
-        "escape-string-regexp": "^1.0.2",
-        "has-ansi": "^2.0.0",
-        "strip-ansi": "^3.0.0",
-        "supports-color": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/grunt-contrib-copy/node_modules/supports-color": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/grunt-contrib-imagemin": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-imagemin/-/grunt-contrib-imagemin-4.0.0.tgz",
-      "integrity": "sha512-2GYQBQFfJLjeTThJ8E7+vLgvgfOh78u0bgieIK85c2Rv9V6ssd2AvBvuF7T26mK261EN/SlNefpW5+zGWzfrVw==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.1",
-        "imagemin": "^6.0.0",
-        "p-map": "^1.2.0",
-        "plur": "^3.0.1",
-        "pretty-bytes": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "optionalDependencies": {
-        "imagemin-gifsicle": "^6.0.1",
-        "imagemin-jpegtran": "^6.0.0",
-        "imagemin-optipng": "^6.0.0",
-        "imagemin-svgo": "^7.0.0"
-      }
-    },
-    "node_modules/grunt-contrib-imagemin/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/grunt-contrib-imagemin/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/grunt-contrib-imagemin/node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/grunt-contrib-imagemin/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
-    },
-    "node_modules/grunt-contrib-imagemin/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/grunt-contrib-imagemin/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/grunt-contrib-jshint": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-3.1.1.tgz",
-      "integrity": "sha512-EwMY6L91FqTcMlZTVoDeeq/EZL+7MoFyo1rxIea9sxyv73geVggeE37jcUhNbu5hLbxHE82CGIUqitHuR2/q+g==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.1.0",
-        "hooker": "^0.2.3",
-        "jshint": "~2.13.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/grunt-contrib-less": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-3.0.0.tgz",
-      "integrity": "sha512-fBB8MUDCo5EgT7WdOVQnZq4GF+XCeFdnkhaxI7uepp8P973sH1jdodjF87c6d9WSHKgArJAGP5JEtthhdKVovg==",
-      "dev": true,
-      "dependencies": {
-        "async": "^3.2.0",
-        "chalk": "^4.1.0",
-        "less": "^4.1.1",
-        "lodash": "^4.17.21"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/grunt-contrib-uglify": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.0.1.tgz",
-      "integrity": "sha512-T/aXZ4WIpAtoswZqb6HROKg7uq9QbKwl+lUuOwK4eoFj3tFv9/a/oMyd3/qvetV29Pbf8P1YYda1gDwZppr60A==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.1",
-        "maxmin": "^2.1.0",
-        "uglify-js": "^3.13.3",
-        "uri-path": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/grunt-contrib-uglify/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/grunt-contrib-uglify/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/grunt-contrib-uglify/node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/grunt-contrib-uglify/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
-    },
-    "node_modules/grunt-contrib-uglify/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/grunt-contrib-uglify/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/grunt-contrib-watch": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz",
-      "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==",
-      "dev": true,
-      "dependencies": {
-        "async": "^2.6.0",
-        "gaze": "^1.1.0",
-        "lodash": "^4.17.10",
-        "tiny-lr": "^1.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/grunt-contrib-watch/node_modules/async": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
-      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
-      "dev": true,
-      "dependencies": {
-        "lodash": "^4.17.14"
-      }
-    },
-    "node_modules/grunt-known-options": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz",
-      "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/grunt-legacy-log": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz",
-      "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==",
-      "dev": true,
-      "dependencies": {
-        "colors": "~1.1.2",
-        "grunt-legacy-log-utils": "~2.1.0",
-        "hooker": "~0.2.3",
-        "lodash": "~4.17.19"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
-      }
-    },
-    "node_modules/grunt-legacy-log-utils": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz",
-      "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "~4.1.0",
-        "lodash": "~4.17.19"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/grunt-legacy-util": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz",
-      "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==",
-      "dev": true,
-      "dependencies": {
-        "async": "~3.2.0",
-        "exit": "~0.1.2",
-        "getobject": "~1.0.0",
-        "hooker": "~0.2.3",
-        "lodash": "~4.17.21",
-        "underscore.string": "~3.3.5",
-        "which": "~2.0.2"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/grunt-text-replace": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/grunt-text-replace/-/grunt-text-replace-0.4.0.tgz",
-      "integrity": "sha1-252c5Z4v5J2id+nbwZXD4Rz7FsI=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/grunt/node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gzip-size": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz",
-      "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
-      "dev": true,
-      "dependencies": {
-        "duplexer": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
-      "dependencies": {
-        "function-bind": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/has-bigints": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
-      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
-      "dev": true,
-      "optional": true,
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/has-symbol-support-x": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
-      "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/has-symbols": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
-      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-to-string-tag-x": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
-      "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "has-symbol-support-x": "^1.4.1"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/has-tostringtag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
-      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "has-symbols": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "dev": true,
-      "dependencies": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/has-values": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "dev": true,
-      "dependencies": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/has-values/node_modules/kind-of": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-      "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/homedir-polyfill": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
-      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
-      "dev": true,
-      "dependencies": {
-        "parse-passwd": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/hooker": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
-      "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
-      "dev": true,
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/hosted-git-info": {
-      "version": "2.8.9",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
-      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/htmlparser2": {
-      "version": "3.8.3",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
-      "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
-      "dev": true,
-      "dependencies": {
-        "domelementtype": "1",
-        "domhandler": "2.3",
-        "domutils": "1.5",
-        "entities": "1.0",
-        "readable-stream": "1.1"
-      }
-    },
-    "node_modules/http-cache-semantics": {
-      "version": "3.8.1",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
-      "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/http-parser-js": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz",
-      "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==",
-      "dev": true
-    },
-    "node_modules/iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ieee754": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "optional": true
-    },
-    "node_modules/ignore": {
-      "version": "3.3.10",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
-      "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
-      "dev": true
-    },
-    "node_modules/image-size": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
-      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
-      "dev": true,
-      "optional": true,
-      "bin": {
-        "image-size": "bin/image-size.js"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/imagemin": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.1.0.tgz",
-      "integrity": "sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A==",
-      "dev": true,
-      "dependencies": {
-        "file-type": "^10.7.0",
-        "globby": "^8.0.1",
-        "make-dir": "^1.0.0",
-        "p-pipe": "^1.1.0",
-        "pify": "^4.0.1",
-        "replace-ext": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/imagemin-gifsicle": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-6.0.1.tgz",
-      "integrity": "sha512-kuu47c6iKDQ6R9J10xCwL0lgs0+sMz3LRHqRcJ2CRBWdcNmo3T5hUaM8hSZfksptZXJLGKk8heSAvwtSdB1Fng==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "exec-buffer": "^3.0.0",
-        "gifsicle": "^4.0.0",
-        "is-gif": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/imagemin-jpegtran": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-6.0.0.tgz",
-      "integrity": "sha512-Ih+NgThzqYfEWv9t58EItncaaXIHR0u9RuhKa8CtVBlMBvY0dCIxgQJQCfwImA4AV1PMfmUKlkyIHJjb7V4z1g==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "exec-buffer": "^3.0.0",
-        "is-jpg": "^2.0.0",
-        "jpegtran-bin": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/imagemin-optipng": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-6.0.0.tgz",
-      "integrity": "sha512-FoD2sMXvmoNm/zKPOWdhKpWdFdF9qiJmKC17MxZJPH42VMAp17/QENI/lIuP7LCUnLVAloO3AUoTSNzfhpyd8A==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "exec-buffer": "^3.0.0",
-        "is-png": "^1.0.0",
-        "optipng-bin": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/imagemin-svgo": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-7.1.0.tgz",
-      "integrity": "sha512-0JlIZNWP0Luasn1HT82uB9nU9aa+vUj6kpT+MjPW11LbprXC+iC4HDwn1r4Q2/91qj4iy9tRZNsFySMlEpLdpg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "is-svg": "^4.2.1",
-        "svgo": "^1.3.2"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/imagemin-svgo?sponsor=1"
-      }
-    },
-    "node_modules/import-lazy": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz",
-      "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/indent-string": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
-      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "repeating": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
-      "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
-    },
-    "node_modules/ini": {
-      "version": "1.3.8",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
-      "dev": true
-    },
-    "node_modules/internal-slot": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
-      "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "get-intrinsic": "^1.1.0",
-        "has": "^1.0.3",
-        "side-channel": "^1.0.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/interpret": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
-      "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
-      "dev": true
-    },
-    "node_modules/into-stream": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
-      "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "from2": "^2.1.1",
-        "p-is-promise": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/irregular-plurals": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz",
-      "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/is-absolute": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
-      "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
-      "dev": true,
-      "dependencies": {
-        "is-relative": "^1.0.0",
-        "is-windows": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-accessor-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/is-bigint": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
-      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "has-bigints": "^1.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-boolean-object": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
-      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-      "dev": true
-    },
-    "node_modules/is-callable": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
-      "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-core-module": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
-      "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
-      "dev": true,
-      "dependencies": {
-        "has": "^1.0.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-data-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-date-object": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
-      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-descriptor": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-      "dev": true,
-      "dependencies": {
-        "is-accessor-descriptor": "^1.0.0",
-        "is-data-descriptor": "^1.0.0",
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-extendable": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-      "dev": true,
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-finite": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
-      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-gif": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-3.0.0.tgz",
-      "integrity": "sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "file-type": "^10.4.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dev": true,
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-jpg": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-2.0.0.tgz",
-      "integrity": "sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/is-natural-number": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
-      "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/is-negative-zero": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
-      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-number-object": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
-      "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-number/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-object": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
-      "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==",
-      "dev": true,
-      "optional": true,
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-plain-obj": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-png": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz",
-      "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-regex": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
-      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-relative": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
-      "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
-      "dev": true,
-      "dependencies": {
-        "is-unc-path": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-retry-allowed": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
-      "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-shared-array-buffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
-      "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
-      "dev": true,
-      "optional": true,
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-string": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
-      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-svg": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.3.1.tgz",
-      "integrity": "sha512-h2CGs+yPUyvkgTJQS9cJzo9lYK06WgRiXUqBBHtglSzVKAuH4/oWsqk7LGfbSa1hGk9QcZ0SyQtVggvBA8LZXA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "fast-xml-parser": "^3.19.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-symbol": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
-      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "has-symbols": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-unc-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
-      "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
-      "dev": true,
-      "dependencies": {
-        "unc-path-regex": "^0.1.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-utf8": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
-      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/is-weakref": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
-      "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "call-bind": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-what": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
-      "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
-      "dev": true
-    },
-    "node_modules/is-windows": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/isarray": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-      "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-      "dev": true
-    },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "node_modules/isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/isurl": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
-      "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "has-to-string-tag-x": "^1.2.0",
-        "is-object": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/jpegtran-bin": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz",
-      "integrity": "sha512-2cRl1ism+wJUoYAYFt6O/rLBfpXNWG2dUWbgcEkTt5WGMnqI46eEro8T4C5zGROxKRqyKpCBSdHPvt5UYCtxaQ==",
-      "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "dependencies": {
-        "bin-build": "^3.0.0",
-        "bin-wrapper": "^4.0.0",
-        "logalot": "^2.0.0"
-      },
-      "bin": {
-        "jpegtran": "cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/jquery": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
-      "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
-    },
-    "node_modules/js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-      "dev": true,
-      "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
-    "node_modules/jsdoctypeparser": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
-      "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "jsdoctypeparser": "bin/jsdoctypeparser"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jshint": {
-      "version": "2.13.1",
-      "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.1.tgz",
-      "integrity": "sha512-vymzfR3OysF5P774x6zYv0bD4EpH6NWRxpq54wO9mA9RuY49yb1teKSICkLx2Ryx+mfzlVVNNbTBtsRtg78t7g==",
-      "dev": true,
-      "dependencies": {
-        "cli": "~1.0.0",
-        "console-browserify": "1.1.x",
-        "exit": "0.1.x",
-        "htmlparser2": "3.8.x",
-        "lodash": "~4.17.21",
-        "minimatch": "~3.0.2",
-        "shelljs": "0.3.x",
-        "strip-json-comments": "1.0.x"
-      },
-      "bin": {
-        "jshint": "bin/jshint"
-      }
-    },
-    "node_modules/json-buffer": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
-      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/keyv": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz",
-      "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "json-buffer": "3.0.0"
-      }
-    },
-    "node_modules/kind-of": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/less": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz",
-      "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==",
-      "dev": true,
-      "dependencies": {
-        "copy-anything": "^2.0.1",
-        "parse-node-version": "^1.0.1",
-        "tslib": "^2.3.0"
-      },
-      "bin": {
-        "lessc": "bin/lessc"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "optionalDependencies": {
-        "errno": "^0.1.1",
-        "graceful-fs": "^4.1.2",
-        "image-size": "~0.5.0",
-        "make-dir": "^2.1.0",
-        "mime": "^1.4.1",
-        "needle": "^2.5.2",
-        "source-map": "~0.6.0"
-      }
-    },
-    "node_modules/less/node_modules/make-dir": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
-      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "pify": "^4.0.1",
-        "semver": "^5.6.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/less/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/liftup": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz",
-      "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==",
-      "dev": true,
-      "dependencies": {
-        "extend": "^3.0.2",
-        "findup-sync": "^4.0.0",
-        "fined": "^1.2.0",
-        "flagged-respawn": "^1.0.1",
-        "is-plain-object": "^2.0.4",
-        "object.map": "^1.0.1",
-        "rechoir": "^0.7.0",
-        "resolve": "^1.19.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/liftup/node_modules/braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "dev": true,
-      "dependencies": {
-        "fill-range": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/liftup/node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-      "dev": true,
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/liftup/node_modules/findup-sync": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz",
-      "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==",
-      "dev": true,
-      "dependencies": {
-        "detect-file": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "micromatch": "^4.0.2",
-        "resolve-dir": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/liftup/node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/liftup/node_modules/micromatch": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
-      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
-      "dev": true,
-      "dependencies": {
-        "braces": "^3.0.1",
-        "picomatch": "^2.2.3"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/liftup/node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/linkify-it": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz",
-      "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "uc.micro": "^1.0.1"
-      }
-    },
-    "node_modules/livereload-js": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz",
-      "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==",
-      "dev": true
-    },
-    "node_modules/load-json-file": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
-      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/load-json-file/node_modules/pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
-    },
-    "node_modules/logalot": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz",
-      "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "figures": "^1.3.5",
-        "squeak": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/longest": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
-      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/loud-rejection": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
-      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "currently-unhandled": "^0.4.1",
-        "signal-exit": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/lowercase-keys": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/lpad-align": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz",
-      "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "get-stdin": "^4.0.1",
-        "indent-string": "^2.1.0",
-        "longest": "^1.0.0",
-        "meow": "^3.3.0"
-      },
-      "bin": {
-        "lpad-align": "cli.js"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/lru-cache": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-      "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "pseudomap": "^1.0.2",
-        "yallist": "^2.1.2"
-      }
-    },
-    "node_modules/make-dir": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
-      "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
-      "dev": true,
-      "dependencies": {
-        "pify": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/make-dir/node_modules/pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/make-iterator": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
-      "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/map-cache": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/map-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/map-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "dev": true,
-      "dependencies": {
-        "object-visit": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/markdown-it": {
-      "version": "13.0.1",
-      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz",
-      "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "argparse": "^2.0.1",
-        "entities": "~3.0.1",
-        "linkify-it": "^4.0.1",
-        "mdurl": "^1.0.1",
-        "uc.micro": "^1.0.5"
-      },
-      "bin": {
-        "markdown-it": "bin/markdown-it.js"
-      }
-    },
-    "node_modules/markdown-it/node_modules/argparse": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-      "dev": true,
-      "license": "Python-2.0"
-    },
-    "node_modules/markdown-it/node_modules/entities": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
-      "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
-    "node_modules/maxmin": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz",
-      "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^1.0.0",
-        "figures": "^1.0.1",
-        "gzip-size": "^3.0.0",
-        "pretty-bytes": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/maxmin/node_modules/ansi-styles": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/maxmin/node_modules/chalk": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^2.2.1",
-        "escape-string-regexp": "^1.0.2",
-        "has-ansi": "^2.0.0",
-        "strip-ansi": "^3.0.0",
-        "supports-color": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/maxmin/node_modules/pretty-bytes": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz",
-      "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=",
-      "dev": true,
-      "dependencies": {
-        "number-is-nan": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/maxmin/node_modules/supports-color": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/mdn-data": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
-      "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/mdurl": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
-      "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/meow": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
-      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "camelcase-keys": "^2.0.0",
-        "decamelize": "^1.1.2",
-        "loud-rejection": "^1.0.0",
-        "map-obj": "^1.0.1",
-        "minimist": "^1.1.3",
-        "normalize-package-data": "^2.3.4",
-        "object-assign": "^4.0.1",
-        "read-pkg-up": "^1.0.1",
-        "redent": "^1.0.0",
-        "trim-newlines": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/micromatch": {
-      "version": "3.1.10",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-      "dev": true,
-      "dependencies": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-      "dev": true,
-      "optional": true,
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/mime-db": {
-      "version": "1.50.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz",
-      "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mimic-response": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
-      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/mixin-deep": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
-      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-      "dev": true,
-      "dependencies": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/nanomatch": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "dev": true,
-      "dependencies": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/needle": {
-      "version": "2.9.1",
-      "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
-      "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "debug": "^3.2.6",
-        "iconv-lite": "^0.4.4",
-        "sax": "^1.2.4"
-      },
-      "bin": {
-        "needle": "bin/needle"
-      },
-      "engines": {
-        "node": ">= 4.4.x"
-      }
-    },
-    "node_modules/needle/node_modules/debug": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "ms": "^2.1.1"
-      }
-    },
-    "node_modules/needle/node_modules/ms": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/nice-try": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/nopt": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
-      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
-      "dev": true,
-      "dependencies": {
-        "abbrev": "1"
-      },
-      "bin": {
-        "nopt": "bin/nopt.js"
-      }
-    },
-    "node_modules/normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "node_modules/normalize-url": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
-      "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "prepend-http": "^2.0.0",
-        "query-string": "^5.0.1",
-        "sort-keys": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/normalize-url/node_modules/prepend-http": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/normalize-url/node_modules/sort-keys": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
-      "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "is-plain-obj": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/npm-conf": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
-      "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "config-chain": "^1.1.11",
-        "pify": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/npm-conf/node_modules/pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/npm-run-path": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "path-key": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/nth-check": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
-      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "boolbase": "~1.0.0"
-      }
-    },
-    "node_modules/number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "dev": true,
-      "dependencies": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/define-property": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-inspect": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-      "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
-      "dev": true,
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
-      "dependencies": {
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object.assign": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
-      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "has-symbols": "^1.0.1",
-        "object-keys": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object.defaults": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
-      "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
-      "dev": true,
-      "dependencies": {
-        "array-each": "^1.0.1",
-        "array-slice": "^1.0.0",
-        "for-own": "^1.0.0",
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object.getownpropertydescriptors": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz",
-      "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object.map": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
-      "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
-      "dev": true,
-      "dependencies": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object.values": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
-      "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/optipng-bin": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-5.1.0.tgz",
-      "integrity": "sha512-9baoqZTNNmXQjq/PQTWEXbVV3AMO2sI/GaaqZJZ8SExfAzjijeAP7FEeT+TtyumSw7gr0PZtSUYB/Ke7iHQVKA==",
-      "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "dependencies": {
-        "bin-build": "^3.0.0",
-        "bin-wrapper": "^4.0.0",
-        "logalot": "^2.0.0"
-      },
-      "bin": {
-        "optipng": "cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/os-filter-obj": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz",
-      "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "arch": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/os-homedir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/osenv": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
-      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
-      "dev": true,
-      "dependencies": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.0"
-      }
-    },
-    "node_modules/p-cancelable": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz",
-      "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/p-event": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz",
-      "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "p-timeout": "^1.1.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/p-finally": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/p-is-promise": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
-      "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/p-map": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
-      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/p-map-series": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz",
-      "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "p-reduce": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/p-pipe": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz",
-      "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/p-reduce": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
-      "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/p-timeout": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
-      "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "p-finally": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/parse-filepath": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
-      "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
-      "dev": true,
-      "dependencies": {
-        "is-absolute": "^1.0.0",
-        "map-cache": "^0.2.0",
-        "path-root": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "error-ex": "^1.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/parse-node-version": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
-      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/parse-passwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
-      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-dirname": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
-      "dev": true
-    },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "dev": true
-    },
-    "node_modules/path-root": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
-      "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
-      "dev": true,
-      "dependencies": {
-        "path-root-regex": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-root-regex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
-      "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-type": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
-      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
-      "dev": true,
-      "dependencies": {
-        "pify": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/path-type/node_modules/pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pend": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/pify": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "pinkie": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/plur": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz",
-      "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==",
-      "dev": true,
-      "dependencies": {
-        "irregular-plurals": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/posix-character-classes": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/prepend-http": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
-      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pretty-bytes": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
-      "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/proto-list": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
-      "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/prr": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/pseudomap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "node_modules/q": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
-      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.6.0",
-        "teleport": ">=0.2.0"
-      }
-    },
-    "node_modules/qs": {
-      "version": "6.10.1",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz",
-      "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==",
-      "dev": true,
-      "dependencies": {
-        "side-channel": "^1.0.4"
-      },
-      "engines": {
-        "node": ">=0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/query-string": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
-      "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "decode-uri-component": "^0.2.0",
-        "object-assign": "^4.1.0",
-        "strict-uri-encode": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/raw-body": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
-      "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
-      "dev": true,
-      "dependencies": {
-        "bytes": "1",
-        "string_decoder": "0.10"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/read-pkg": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
-      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "load-json-file": "^1.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/read-pkg-up": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
-      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "find-up": "^1.0.0",
-        "read-pkg": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/find-up": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
-      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "path-exists": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/path-exists": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
-      "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/read-pkg/node_modules/path-type": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
-      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/read-pkg/node_modules/pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/readable-stream": {
-      "version": "1.1.14",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-      "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
-      "dev": true,
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.1",
-        "isarray": "0.0.1",
-        "string_decoder": "~0.10.x"
-      }
-    },
-    "node_modules/rechoir": {
-      "version": "0.7.1",
-      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
-      "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
-      "dev": true,
-      "dependencies": {
-        "resolve": "^1.9.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/redent": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
-      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "indent-string": "^2.1.0",
-        "strip-indent": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-      "dev": true,
-      "dependencies": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/repeat-element": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
-      "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/repeating": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "is-finite": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/replace-ext": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
-      "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/resolve": {
-      "version": "1.20.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
-      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
-      "dev": true,
-      "dependencies": {
-        "is-core-module": "^2.2.0",
-        "path-parse": "^1.0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/resolve-dir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
-      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
-      "dev": true,
-      "dependencies": {
-        "expand-tilde": "^2.0.0",
-        "global-modules": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-      "deprecated": "https://github.com/lydell/resolve-url#deprecated",
-      "dev": true
-    },
-    "node_modules/responselike": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
-      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "lowercase-keys": "^1.0.0"
-      }
-    },
-    "node_modules/ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
-    },
-    "node_modules/safe-json-parse": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz",
-      "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=",
-      "dev": true
-    },
-    "node_modules/safe-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "dev": true,
-      "dependencies": {
-        "ret": "~0.1.10"
-      }
-    },
-    "node_modules/safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
-    },
-    "node_modules/sax": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/seek-bzip": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz",
-      "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "commander": "^2.8.1"
-      },
-      "bin": {
-        "seek-bunzip": "bin/seek-bunzip",
-        "seek-table": "bin/seek-bzip-table"
-      }
-    },
-    "node_modules/semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true,
-      "optional": true,
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "node_modules/semver-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
-      "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/semver-truncate": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz",
-      "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "semver": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/set-value": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
-      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
-      "dev": true,
-      "dependencies": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/set-value/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/set-value/node_modules/is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "shebang-regex": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/shelljs": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
-      "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=",
-      "dev": true,
-      "bin": {
-        "shjs": "bin/shjs"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/side-channel": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
-      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "get-intrinsic": "^1.0.2",
-        "object-inspect": "^1.9.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/signal-exit": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz",
-      "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/slash": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
-      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "dev": true,
-      "dependencies": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-      "dev": true,
-      "dependencies": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-node/node_modules/define-property": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-util/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/define-property": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-      "dev": true,
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/kind-of": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sort-keys": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
-      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "is-plain-obj": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sort-keys-length": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
-      "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "sort-keys": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-resolve": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
-      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
-      "dev": true,
-      "dependencies": {
-        "atob": "^2.1.2",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
-    "node_modules/source-map-url": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
-      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
-      "dev": true
-    },
-    "node_modules/spdx-correct": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
-      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "node_modules/spdx-exceptions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/spdx-expression-parse": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "node_modules/spdx-license-ids": {
-      "version": "3.0.10",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz",
-      "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
-      "dependencies": {
-        "extend-shallow": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "node_modules/squeak": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz",
-      "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "chalk": "^1.0.0",
-        "console-stream": "^0.1.1",
-        "lpad-align": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/squeak/node_modules/ansi-styles": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/squeak/node_modules/chalk": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "ansi-styles": "^2.2.1",
-        "escape-string-regexp": "^1.0.2",
-        "has-ansi": "^2.0.0",
-        "strip-ansi": "^3.0.0",
-        "supports-color": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/squeak/node_modules/supports-color": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/stable": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
-      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "dev": true,
-      "dependencies": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/define-property": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-      "dev": true,
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/kind-of": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strict-uri-encode": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
-      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/string_decoder": {
-      "version": "0.10.31",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-      "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
-      "dev": true
-    },
-    "node_modules/string-template": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
-      "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=",
-      "dev": true
-    },
-    "node_modules/string.prototype.trimend": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
-      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/string.prototype.trimstart": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
-      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strip-bom": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
-      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "is-utf8": "^0.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strip-dirs": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz",
-      "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "is-natural-number": "^4.0.1"
-      }
-    },
-    "node_modules/strip-eof": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strip-indent": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
-      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "get-stdin": "^4.0.1"
-      },
-      "bin": {
-        "strip-indent": "cli.js"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strip-json-comments": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
-      "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
-      "dev": true,
-      "bin": {
-        "strip-json-comments": "cli.js"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/strip-outer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
-      "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "escape-string-regexp": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strnum": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.4.tgz",
-      "integrity": "sha512-lMzNMfDpaQOLt4B2mEbfzYS0+T7dvCXeojnlGf6f1AygvWDMcWyXYaLbyICfjVu29sErR8fnRagQfBW/N/hGgw==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/svgo": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
-      "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
-      "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "chalk": "^2.4.1",
-        "coa": "^2.0.2",
-        "css-select": "^2.0.0",
-        "css-select-base-adapter": "^0.1.1",
-        "css-tree": "1.0.0-alpha.37",
-        "csso": "^4.0.2",
-        "js-yaml": "^3.13.1",
-        "mkdirp": "~0.5.1",
-        "object.values": "^1.1.0",
-        "sax": "~1.2.4",
-        "stable": "^0.1.8",
-        "unquote": "~1.1.1",
-        "util.promisify": "~1.0.0"
-      },
-      "bin": {
-        "svgo": "bin/svgo"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/svgo/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/svgo/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/svgo/node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/svgo/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/svgo/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/svgo/node_modules/mkdirp": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "minimist": "^1.2.5"
-      },
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      }
-    },
-    "node_modules/svgo/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/tar-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
-      "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "bl": "^1.0.0",
-        "buffer-alloc": "^1.2.0",
-        "end-of-stream": "^1.0.0",
-        "fs-constants": "^1.0.0",
-        "readable-stream": "^2.3.0",
-        "to-buffer": "^1.1.1",
-        "xtend": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/tar-stream/node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/tar-stream/node_modules/readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/tar-stream/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/temp-dir": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz",
-      "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/tempfile": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz",
-      "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "temp-dir": "^1.0.0",
-        "uuid": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/timed-out": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
-      "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/tiny-lr": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz",
-      "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==",
-      "dev": true,
-      "dependencies": {
-        "body": "^5.1.0",
-        "debug": "^3.1.0",
-        "faye-websocket": "~0.10.0",
-        "livereload-js": "^2.3.0",
-        "object-assign": "^4.1.0",
-        "qs": "^6.4.0"
-      }
-    },
-    "node_modules/tiny-lr/node_modules/debug": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "^2.1.1"
-      }
-    },
-    "node_modules/tiny-lr/node_modules/ms": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "dev": true
-    },
-    "node_modules/to-buffer": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
-      "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/to-object-path": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-object-path/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-regex": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "dev": true,
-      "dependencies": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-      "dev": true,
-      "dependencies": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/trim-newlines": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
-      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/trim-repeated": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
-      "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "escape-string-regexp": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/tslib": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-      "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
-      "dev": true
-    },
-    "node_modules/tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "safe-buffer": "^5.0.1"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/uc.micro": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
-      "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/uglify-js": {
-      "version": "3.14.3",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz",
-      "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==",
-      "dev": true,
-      "bin": {
-        "uglifyjs": "bin/uglifyjs"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/unbox-primitive": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
-      "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "function-bind": "^1.1.1",
-        "has-bigints": "^1.0.1",
-        "has-symbols": "^1.0.2",
-        "which-boxed-primitive": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/unbzip2-stream": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
-      "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "buffer": "^5.2.1",
-        "through": "^2.3.8"
-      }
-    },
-    "node_modules/unc-path-regex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
-      "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/underscore.string": {
-      "version": "3.3.5",
-      "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
-      "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
-      "dev": true,
-      "dependencies": {
-        "sprintf-js": "^1.0.3",
-        "util-deprecate": "^1.0.2"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/union-value": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
-      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
-      "dev": true,
-      "dependencies": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/union-value/node_modules/is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/unquote": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
-      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/unset-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "dev": true,
-      "dependencies": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/unset-value/node_modules/has-value": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-      "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-      "dev": true,
-      "dependencies": {
-        "get-value": "^2.0.3",
-        "has-values": "^0.1.4",
-        "isobject": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-      "dev": true,
-      "dependencies": {
-        "isarray": "1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/unset-value/node_modules/has-values": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-      "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/unset-value/node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
-    },
-    "node_modules/uri-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz",
-      "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-      "deprecated": "Please see https://github.com/lydell/urix#deprecated",
-      "dev": true
-    },
-    "node_modules/url-parse-lax": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
-      "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "prepend-http": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/url-to-options": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
-      "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/use": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
-    },
-    "node_modules/util.promisify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
-      "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.2",
-        "has-symbols": "^1.0.1",
-        "object.getownpropertydescriptors": "^2.1.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/uuid": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
-      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
-      "dev": true,
-      "optional": true,
-      "bin": {
-        "uuid": "bin/uuid"
-      }
-    },
-    "node_modules/v8flags": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
-      "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
-      "dev": true,
-      "dependencies": {
-        "homedir-polyfill": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "node_modules/websocket-driver": {
-      "version": "0.7.4",
-      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
-      "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
-      "dev": true,
-      "dependencies": {
-        "http-parser-js": ">=0.5.1",
-        "safe-buffer": ">=5.1.0",
-        "websocket-extensions": ">=0.1.1"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/websocket-extensions": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
-      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/which-boxed-primitive": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
-      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "is-bigint": "^1.0.1",
-        "is-boolean-object": "^1.1.0",
-        "is-number-object": "^1.0.4",
-        "is-string": "^1.0.5",
-        "is-symbol": "^1.0.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "node_modules/xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.4"
-      }
-    },
-    "node_modules/yallist": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/yauzl": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
-      "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "buffer-crc32": "~0.2.3",
-        "fd-slicer": "~1.1.0"
-      }
-    }
-  },
-  "dependencies": {
-    "@mrmlnc/readdir-enhanced": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
-      "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
-      "dev": true,
-      "requires": {
-        "call-me-maybe": "^1.0.1",
-        "glob-to-regexp": "^0.3.0"
-      }
-    },
-    "@nodelib/fs.stat": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
-      "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
-      "dev": true
-    },
-    "@sindresorhus/is": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
-      "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==",
-      "dev": true,
-      "optional": true
-    },
-    "@types/q": {
-      "version": "1.5.5",
-      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
-      "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==",
-      "dev": true,
-      "optional": true
-    },
-    "abbrev": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-      "dev": true
-    },
-    "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true
-    },
-    "ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "requires": {
-        "color-convert": "^2.0.1"
-      }
-    },
-    "arch": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
-      "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
-      "dev": true,
-      "optional": true
-    },
-    "archive-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz",
-      "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "file-type": "^4.2.0"
-      },
-      "dependencies": {
-        "file-type": {
-          "version": "4.4.0",
-          "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz",
-          "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true
-    },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true
-    },
-    "arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "dev": true
-    },
-    "array-each": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
-      "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
-      "dev": true
-    },
-    "array-find-index": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
-      "dev": true,
-      "optional": true
-    },
-    "array-slice": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
-      "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
-      "dev": true
-    },
-    "array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "dev": true,
-      "requires": {
-        "array-uniq": "^1.0.1"
-      }
-    },
-    "array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
-      "dev": true
-    },
-    "array-unique": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true
-    },
-    "arrify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
-      "dev": true
-    },
-    "assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true
-    },
-    "async": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
-      "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==",
-      "dev": true
-    },
-    "atob": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "dev": true
-    },
-    "balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
-    },
-    "base": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "dev": true,
-      "requires": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        }
-      }
-    },
-    "base64-js": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
-      "dev": true,
-      "optional": true
-    },
-    "bin-build": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz",
-      "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "decompress": "^4.0.0",
-        "download": "^6.2.2",
-        "execa": "^0.7.0",
-        "p-map-series": "^1.0.0",
-        "tempfile": "^2.0.0"
-      }
-    },
-    "bin-check": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz",
-      "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "execa": "^0.7.0",
-        "executable": "^4.1.0"
-      }
-    },
-    "bin-version": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz",
-      "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "execa": "^1.0.0",
-        "find-versions": "^3.0.0"
-      },
-      "dependencies": {
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          }
-        },
-        "execa": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "cross-spawn": "^6.0.0",
-            "get-stream": "^4.0.0",
-            "is-stream": "^1.1.0",
-            "npm-run-path": "^2.0.0",
-            "p-finally": "^1.0.0",
-            "signal-exit": "^3.0.0",
-            "strip-eof": "^1.0.0"
-          }
-        },
-        "get-stream": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "bin-version-check": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz",
-      "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "bin-version": "^3.0.0",
-        "semver": "^5.6.0",
-        "semver-truncate": "^1.1.2"
-      }
-    },
-    "bin-wrapper": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz",
-      "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "bin-check": "^4.1.0",
-        "bin-version-check": "^4.0.0",
-        "download": "^7.1.0",
-        "import-lazy": "^3.1.0",
-        "os-filter-obj": "^2.0.0",
-        "pify": "^4.0.1"
-      },
-      "dependencies": {
-        "download": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz",
-          "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "archive-type": "^4.0.0",
-            "caw": "^2.0.1",
-            "content-disposition": "^0.5.2",
-            "decompress": "^4.2.0",
-            "ext-name": "^5.0.0",
-            "file-type": "^8.1.0",
-            "filenamify": "^2.0.0",
-            "get-stream": "^3.0.0",
-            "got": "^8.3.1",
-            "make-dir": "^1.2.0",
-            "p-event": "^2.1.0",
-            "pify": "^3.0.0"
-          },
-          "dependencies": {
-            "pify": {
-              "version": "3.0.0",
-              "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-              "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-              "dev": true,
-              "optional": true
-            }
-          }
-        },
-        "file-type": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz",
-          "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==",
-          "dev": true,
-          "optional": true
-        },
-        "got": {
-          "version": "8.3.2",
-          "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
-          "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "@sindresorhus/is": "^0.7.0",
-            "cacheable-request": "^2.1.1",
-            "decompress-response": "^3.3.0",
-            "duplexer3": "^0.1.4",
-            "get-stream": "^3.0.0",
-            "into-stream": "^3.1.0",
-            "is-retry-allowed": "^1.1.0",
-            "isurl": "^1.0.0-alpha5",
-            "lowercase-keys": "^1.0.0",
-            "mimic-response": "^1.0.0",
-            "p-cancelable": "^0.4.0",
-            "p-timeout": "^2.0.1",
-            "pify": "^3.0.0",
-            "safe-buffer": "^5.1.1",
-            "timed-out": "^4.0.1",
-            "url-parse-lax": "^3.0.0",
-            "url-to-options": "^1.0.1"
-          },
-          "dependencies": {
-            "pify": {
-              "version": "3.0.0",
-              "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-              "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-              "dev": true,
-              "optional": true
-            }
-          }
-        },
-        "p-cancelable": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
-          "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==",
-          "dev": true,
-          "optional": true
-        },
-        "p-event": {
-          "version": "2.3.1",
-          "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz",
-          "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "p-timeout": "^2.0.1"
-          }
-        },
-        "p-timeout": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
-          "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "p-finally": "^1.0.0"
-          }
-        },
-        "prepend-http": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-          "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
-          "dev": true,
-          "optional": true
-        },
-        "url-parse-lax": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
-          "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "prepend-http": "^2.0.0"
-          }
-        }
-      }
-    },
-    "bl": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
-      "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "readable-stream": "^2.3.5",
-        "safe-buffer": "^5.1.1"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-          "dev": true,
-          "optional": true
-        },
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "body": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz",
-      "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=",
-      "dev": true,
-      "requires": {
-        "continuable-cache": "^0.3.1",
-        "error": "^7.0.0",
-        "raw-body": "~1.1.0",
-        "safe-json-parse": "~1.0.1"
-      }
-    },
-    "boolbase": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
-      "dev": true,
-      "optional": true
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-      "dev": true,
-      "requires": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-extendable": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-          "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-          "dev": true
-        }
-      }
-    },
-    "buffer": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
-      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "base64-js": "^1.3.1",
-        "ieee754": "^1.1.13"
-      }
-    },
-    "buffer-alloc": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
-      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "buffer-alloc-unsafe": "^1.1.0",
-        "buffer-fill": "^1.0.0"
-      }
-    },
-    "buffer-alloc-unsafe": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
-      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
-      "dev": true,
-      "optional": true
-    },
-    "buffer-crc32": {
-      "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
-      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
-      "dev": true,
-      "optional": true
-    },
-    "buffer-fill": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
-      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
-      "dev": true,
-      "optional": true
-    },
-    "bytes": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
-      "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
-      "dev": true
-    },
-    "cache-base": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "dev": true,
-      "requires": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      }
-    },
-    "cacheable-request": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
-      "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "clone-response": "1.0.2",
-        "get-stream": "3.0.0",
-        "http-cache-semantics": "3.8.1",
-        "keyv": "3.0.0",
-        "lowercase-keys": "1.0.0",
-        "normalize-url": "2.0.1",
-        "responselike": "1.0.2"
-      },
-      "dependencies": {
-        "lowercase-keys": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
-          "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "call-bind": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
-      }
-    },
-    "call-me-maybe": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
-      "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
-      "dev": true
-    },
-    "camelcase": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
-      "dev": true,
-      "optional": true
-    },
-    "camelcase-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
-      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "camelcase": "^2.0.0",
-        "map-obj": "^1.0.0"
-      }
-    },
-    "caw": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz",
-      "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "get-proxy": "^2.0.0",
-        "isurl": "^1.0.0-alpha5",
-        "tunnel-agent": "^0.6.0",
-        "url-to-options": "^1.0.1"
-      }
-    },
-    "chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      }
-    },
-    "class-utils": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "cli": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
-      "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
-      "dev": true,
-      "requires": {
-        "exit": "0.1.2",
-        "glob": "^7.1.1"
-      }
-    },
-    "clone-response": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
-      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "mimic-response": "^1.0.0"
-      }
-    },
-    "coa": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
-      "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "@types/q": "^1.5.1",
-        "chalk": "^2.4.1",
-        "q": "^1.1.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true,
-          "optional": true
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "collection-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
-      "requires": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      }
-    },
-    "color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "requires": {
-        "color-name": "~1.1.4"
-      }
-    },
-    "color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "colors": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
-      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
-      "dev": true
-    },
-    "commander": {
-      "version": "2.9.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
-      "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "graceful-readlink": ">= 1.0.0"
-      }
-    },
-    "component-emitter": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
-      "dev": true
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "config-chain": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
-      "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "ini": "^1.3.4",
-        "proto-list": "~1.2.1"
-      }
-    },
-    "console-browserify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
-      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
-      "dev": true,
-      "requires": {
-        "date-now": "^0.1.4"
-      }
-    },
-    "console-stream": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz",
-      "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=",
-      "dev": true,
-      "optional": true
-    },
-    "content-disposition": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
-      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "safe-buffer": "5.1.2"
-      }
-    },
-    "continuable-cache": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz",
-      "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
-      "dev": true
-    },
-    "copy-anything": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz",
-      "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==",
-      "dev": true,
-      "requires": {
-        "is-what": "^3.12.0"
-      }
-    },
-    "copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true
-    },
-    "core-util-is": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
-      "dev": true
-    },
-    "cross-spawn": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
-      "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "lru-cache": "^4.0.1",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      },
-      "dependencies": {
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "css-select": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
-      "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "boolbase": "^1.0.0",
-        "css-what": "^3.2.1",
-        "domutils": "^1.7.0",
-        "nth-check": "^1.0.2"
-      },
-      "dependencies": {
-        "domutils": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
-          "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "dom-serializer": "0",
-            "domelementtype": "1"
-          }
-        }
-      }
-    },
-    "css-select-base-adapter": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
-      "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
-      "dev": true,
-      "optional": true
-    },
-    "css-tree": {
-      "version": "1.0.0-alpha.37",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
-      "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "mdn-data": "2.0.4",
-        "source-map": "^0.6.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "css-what": {
-      "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
-      "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
-      "dev": true,
-      "optional": true
-    },
-    "csso": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
-      "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "css-tree": "^1.1.2"
-      },
-      "dependencies": {
-        "css-tree": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
-          "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "mdn-data": "2.0.14",
-            "source-map": "^0.6.1"
-          }
-        },
-        "mdn-data": {
-          "version": "2.0.14",
-          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
-          "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
-          "dev": true,
-          "optional": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "currently-unhandled": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "array-find-index": "^1.0.1"
-      }
-    },
-    "date-now": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
-      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
-      "dev": true
-    },
-    "dateformat": {
-      "version": "4.6.3",
-      "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz",
-      "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==",
-      "dev": true
-    },
-    "debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "requires": {
-        "ms": "2.0.0"
-      }
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true,
-      "optional": true
-    },
-    "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true
-    },
-    "decompress": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz",
-      "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "decompress-tar": "^4.0.0",
-        "decompress-tarbz2": "^4.0.0",
-        "decompress-targz": "^4.0.0",
-        "decompress-unzip": "^4.0.1",
-        "graceful-fs": "^4.1.10",
-        "make-dir": "^1.0.0",
-        "pify": "^2.3.0",
-        "strip-dirs": "^2.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "decompress-response": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
-      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "mimic-response": "^1.0.0"
-      }
-    },
-    "decompress-tar": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
-      "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "file-type": "^5.2.0",
-        "is-stream": "^1.1.0",
-        "tar-stream": "^1.5.2"
-      },
-      "dependencies": {
-        "file-type": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
-          "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "decompress-tarbz2": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
-      "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "decompress-tar": "^4.1.0",
-        "file-type": "^6.1.0",
-        "is-stream": "^1.1.0",
-        "seek-bzip": "^1.0.5",
-        "unbzip2-stream": "^1.0.9"
-      },
-      "dependencies": {
-        "file-type": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz",
-          "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "decompress-targz": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz",
-      "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "decompress-tar": "^4.1.1",
-        "file-type": "^5.2.0",
-        "is-stream": "^1.1.0"
-      },
-      "dependencies": {
-        "file-type": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
-          "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "decompress-unzip": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
-      "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "file-type": "^3.8.0",
-        "get-stream": "^2.2.0",
-        "pify": "^2.3.0",
-        "yauzl": "^2.4.2"
-      },
-      "dependencies": {
-        "file-type": {
-          "version": "3.9.0",
-          "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
-          "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
-          "dev": true,
-          "optional": true
-        },
-        "get-stream": {
-          "version": "2.3.1",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
-          "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "object-assign": "^4.0.1",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "define-properties": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
-      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "object-keys": "^1.0.12"
-      }
-    },
-    "define-property": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
-      "requires": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      }
-    },
-    "detect-file": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
-      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
-      "dev": true
-    },
-    "dir-glob": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
-      "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
-      "dev": true,
-      "requires": {
-        "arrify": "^1.0.1",
-        "path-type": "^3.0.0"
-      }
-    },
-    "dom-serializer": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
-      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
-      "dev": true,
-      "requires": {
-        "domelementtype": "^2.0.1",
-        "entities": "^2.0.0"
-      },
-      "dependencies": {
-        "domelementtype": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
-          "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
-          "dev": true
-        },
-        "entities": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-          "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
-          "dev": true
-        }
-      }
-    },
-    "domelementtype": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
-      "dev": true
-    },
-    "domhandler": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
-      "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
-      "dev": true,
-      "requires": {
-        "domelementtype": "1"
-      }
-    },
-    "domutils": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
-      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
-      "dev": true,
-      "requires": {
-        "dom-serializer": "0",
-        "domelementtype": "1"
-      }
-    },
-    "download": {
-      "version": "6.2.5",
-      "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz",
-      "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "caw": "^2.0.0",
-        "content-disposition": "^0.5.2",
-        "decompress": "^4.0.0",
-        "ext-name": "^5.0.0",
-        "file-type": "5.2.0",
-        "filenamify": "^2.0.0",
-        "get-stream": "^3.0.0",
-        "got": "^7.0.0",
-        "make-dir": "^1.0.0",
-        "p-event": "^1.0.0",
-        "pify": "^3.0.0"
-      },
-      "dependencies": {
-        "file-type": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
-          "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
-          "dev": true,
-          "optional": true
-        },
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "dox": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/dox/-/dox-1.0.0.tgz",
-      "integrity": "sha512-y0borLgGiqcXigOItzeBvWEPtZ5tkKMZ7MTa/9xhVCUz6sU1quXTTvbJGOLFZAu/4/nlj2Ui02A/tLqQFBXo+w==",
-      "dev": true,
-      "requires": {
-        "commander": "9.4.0",
-        "jsdoctypeparser": "^9.0.0",
-        "markdown-it": "13.0.1"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "9.4.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz",
-          "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==",
-          "dev": true
-        }
-      }
-    },
-    "duplexer": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
-      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
-      "dev": true
-    },
-    "duplexer3": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
-      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
-      "dev": true,
-      "optional": true
-    },
-    "end-of-stream": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "entities": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
-      "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
-      "dev": true
-    },
-    "errno": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
-      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "prr": "~1.0.1"
-      }
-    },
-    "error": {
-      "version": "7.2.1",
-      "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz",
-      "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==",
-      "dev": true,
-      "requires": {
-        "string-template": "~0.2.1"
-      }
-    },
-    "error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "es-abstract": {
-      "version": "1.19.1",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
-      "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "es-to-primitive": "^1.2.1",
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.1.1",
-        "get-symbol-description": "^1.0.0",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.2",
-        "internal-slot": "^1.0.3",
-        "is-callable": "^1.2.4",
-        "is-negative-zero": "^2.0.1",
-        "is-regex": "^1.1.4",
-        "is-shared-array-buffer": "^1.0.1",
-        "is-string": "^1.0.7",
-        "is-weakref": "^1.0.1",
-        "object-inspect": "^1.11.0",
-        "object-keys": "^1.1.1",
-        "object.assign": "^4.1.2",
-        "string.prototype.trimend": "^1.0.4",
-        "string.prototype.trimstart": "^1.0.4",
-        "unbox-primitive": "^1.0.1"
-      }
-    },
-    "es-to-primitive": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "is-callable": "^1.1.4",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.2"
-      }
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
-    },
-    "esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true
-    },
-    "eventemitter2": {
-      "version": "0.4.14",
-      "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
-      "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
-      "dev": true
-    },
-    "exec-buffer": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz",
-      "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "execa": "^0.7.0",
-        "p-finally": "^1.0.0",
-        "pify": "^3.0.0",
-        "rimraf": "^2.5.4",
-        "tempfile": "^2.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-          "dev": true,
-          "optional": true
-        },
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
-      }
-    },
-    "execa": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
-      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "cross-spawn": "^5.0.1",
-        "get-stream": "^3.0.0",
-        "is-stream": "^1.1.0",
-        "npm-run-path": "^2.0.0",
-        "p-finally": "^1.0.0",
-        "signal-exit": "^3.0.0",
-        "strip-eof": "^1.0.0"
-      }
-    },
-    "executable": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
-      "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "pify": "^2.2.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "exit": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
-      "dev": true
-    },
-    "expand-brackets": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
-      "requires": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          }
-        },
-        "is-extendable": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-          "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-          "dev": true
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "expand-tilde": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
-      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1"
-      }
-    },
-    "ext-list": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
-      "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "mime-db": "^1.28.0"
-      }
-    },
-    "ext-name": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz",
-      "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "ext-list": "^2.0.0",
-        "sort-keys-length": "^1.0.0"
-      }
-    },
-    "extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
-    },
-    "extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
-      "requires": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      }
-    },
-    "extglob": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
-      "requires": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-extendable": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-          "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-          "dev": true
-        }
-      }
-    },
-    "fast-glob": {
-      "version": "2.2.7",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
-      "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
-      "dev": true,
-      "requires": {
-        "@mrmlnc/readdir-enhanced": "^2.2.1",
-        "@nodelib/fs.stat": "^1.1.2",
-        "glob-parent": "^3.1.0",
-        "is-glob": "^4.0.0",
-        "merge2": "^1.2.3",
-        "micromatch": "^3.1.10"
-      }
-    },
-    "fast-xml-parser": {
-      "version": "3.21.1",
-      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz",
-      "integrity": "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "strnum": "^1.0.4"
-      }
-    },
-    "faye-websocket": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
-      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
-      "dev": true,
-      "requires": {
-        "websocket-driver": ">=0.5.1"
-      }
-    },
-    "fd-slicer": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
-      "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "pend": "~1.2.0"
-      }
-    },
-    "figures": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
-      "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
-      "dev": true,
-      "requires": {
-        "escape-string-regexp": "^1.0.5",
-        "object-assign": "^4.1.0"
-      }
-    },
-    "file-sync-cmp": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz",
-      "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=",
-      "dev": true
-    },
-    "file-type": {
-      "version": "10.11.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz",
-      "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==",
-      "dev": true
-    },
-    "filename-reserved-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
-      "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=",
-      "dev": true,
-      "optional": true
-    },
-    "filenamify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz",
-      "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "filename-reserved-regex": "^2.0.0",
-        "strip-outer": "^1.0.0",
-        "trim-repeated": "^1.0.0"
-      }
-    },
-    "fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-extendable": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-          "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-          "dev": true
-        }
-      }
-    },
-    "find-versions": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
-      "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "semver-regex": "^2.0.0"
-      }
-    },
-    "findup-sync": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz",
-      "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==",
-      "dev": true,
-      "requires": {
-        "detect-file": "^1.0.0",
-        "is-glob": "^4.0.3",
-        "micromatch": "^4.0.4",
-        "resolve-dir": "^1.0.1"
-      },
-      "dependencies": {
-        "braces": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
-          "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
-          "dev": true,
-          "requires": {
-            "fill-range": "^7.1.1"
-          }
-        },
-        "fill-range": {
-          "version": "7.1.1",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
-          "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
-          "dev": true,
-          "requires": {
-            "to-regex-range": "^5.0.1"
-          }
-        },
-        "is-number": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-          "dev": true
-        },
-        "micromatch": {
-          "version": "4.0.8",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
-          "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
-          "dev": true,
-          "requires": {
-            "braces": "^3.0.3",
-            "picomatch": "^2.3.1"
-          }
-        },
-        "to-regex-range": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-          "dev": true,
-          "requires": {
-            "is-number": "^7.0.0"
-          }
-        }
-      }
-    },
-    "fined": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
-      "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "is-plain-object": "^2.0.3",
-        "object.defaults": "^1.1.0",
-        "object.pick": "^1.2.0",
-        "parse-filepath": "^1.0.1"
-      }
-    },
-    "flagged-respawn": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
-      "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
-      "dev": true
-    },
-    "for-in": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true
-    },
-    "for-own": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
-      "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.1"
-      }
-    },
-    "fragment-cache": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
-      "requires": {
-        "map-cache": "^0.2.2"
-      }
-    },
-    "from2": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
-      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-          "dev": true,
-          "optional": true
-        },
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "fs-constants": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
-      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
-      "dev": true,
-      "optional": true
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "gaze": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
-      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
-      "dev": true,
-      "requires": {
-        "globule": "^1.0.0"
-      }
-    },
-    "get-intrinsic": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
-      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
-      }
-    },
-    "get-proxy": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz",
-      "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "npm-conf": "^1.1.0"
-      }
-    },
-    "get-stdin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
-      "dev": true,
-      "optional": true
-    },
-    "get-stream": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
-      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
-      "dev": true,
-      "optional": true
-    },
-    "get-symbol-description": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
-      "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.1.1"
-      }
-    },
-    "get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true
-    },
-    "getobject": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz",
-      "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==",
-      "dev": true
-    },
-    "gifsicle": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-4.0.1.tgz",
-      "integrity": "sha512-A/kiCLfDdV+ERV/UB+2O41mifd+RxH8jlRG8DMxZO84Bma/Fw0htqZ+hY2iaalLRNyUu7tYZQslqUBJxBggxbg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "bin-build": "^3.0.0",
-        "bin-wrapper": "^4.0.0",
-        "execa": "^1.0.0",
-        "logalot": "^2.0.0"
-      },
-      "dependencies": {
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          }
-        },
-        "execa": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "cross-spawn": "^6.0.0",
-            "get-stream": "^4.0.0",
-            "is-stream": "^1.1.0",
-            "npm-run-path": "^2.0.0",
-            "p-finally": "^1.0.0",
-            "signal-exit": "^3.0.0",
-            "strip-eof": "^1.0.0"
-          }
-        },
-        "get-stream": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "glob": {
-      "version": "7.1.7",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
-      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
-      "dev": true,
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "glob-parent": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-      "dev": true,
-      "requires": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      },
-      "dependencies": {
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
-      }
-    },
-    "glob-to-regexp": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
-      "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
-      "dev": true
-    },
-    "global-modules": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
-      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
-      "dev": true,
-      "requires": {
-        "global-prefix": "^1.0.1",
-        "is-windows": "^1.0.1",
-        "resolve-dir": "^1.0.0"
-      }
-    },
-    "global-prefix": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
-      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "homedir-polyfill": "^1.0.1",
-        "ini": "^1.3.4",
-        "is-windows": "^1.0.1",
-        "which": "^1.2.14"
-      },
-      "dependencies": {
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "globby": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz",
-      "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==",
-      "dev": true,
-      "requires": {
-        "array-union": "^1.0.1",
-        "dir-glob": "2.0.0",
-        "fast-glob": "^2.0.2",
-        "glob": "^7.1.2",
-        "ignore": "^3.3.5",
-        "pify": "^3.0.0",
-        "slash": "^1.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-          "dev": true
-        }
-      }
-    },
-    "globule": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz",
-      "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==",
-      "dev": true,
-      "requires": {
-        "glob": "~7.1.1",
-        "lodash": "~4.17.10",
-        "minimatch": "~3.0.2"
-      }
-    },
-    "got": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz",
-      "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "decompress-response": "^3.2.0",
-        "duplexer3": "^0.1.4",
-        "get-stream": "^3.0.0",
-        "is-plain-obj": "^1.1.0",
-        "is-retry-allowed": "^1.0.0",
-        "is-stream": "^1.0.0",
-        "isurl": "^1.0.0-alpha5",
-        "lowercase-keys": "^1.0.0",
-        "p-cancelable": "^0.3.0",
-        "p-timeout": "^1.1.1",
-        "safe-buffer": "^5.0.1",
-        "timed-out": "^4.0.0",
-        "url-parse-lax": "^1.0.0",
-        "url-to-options": "^1.0.1"
-      }
-    },
-    "graceful-fs": {
-      "version": "4.2.8",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
-      "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
-      "dev": true,
-      "optional": true
-    },
-    "graceful-readlink": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
-      "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
-      "dev": true,
-      "optional": true
-    },
-    "grunt": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz",
-      "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==",
-      "dev": true,
-      "requires": {
-        "dateformat": "~4.6.2",
-        "eventemitter2": "~0.4.13",
-        "exit": "~0.1.2",
-        "findup-sync": "~5.0.0",
-        "glob": "~7.1.6",
-        "grunt-cli": "~1.4.3",
-        "grunt-known-options": "~2.0.0",
-        "grunt-legacy-log": "~3.0.0",
-        "grunt-legacy-util": "~2.0.1",
-        "iconv-lite": "~0.6.3",
-        "js-yaml": "~3.14.0",
-        "minimatch": "~3.0.4",
-        "nopt": "~3.0.6"
-      },
-      "dependencies": {
-        "iconv-lite": {
-          "version": "0.6.3",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-          "dev": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3.0.0"
-          }
-        }
-      }
-    },
-    "grunt-cli": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz",
-      "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==",
-      "dev": true,
-      "requires": {
-        "grunt-known-options": "~2.0.0",
-        "interpret": "~1.1.0",
-        "liftup": "~3.0.1",
-        "nopt": "~4.0.1",
-        "v8flags": "~3.2.0"
-      },
-      "dependencies": {
-        "nopt": {
-          "version": "4.0.3",
-          "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
-          "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
-          "dev": true,
-          "requires": {
-            "abbrev": "1",
-            "osenv": "^0.1.4"
-          }
-        }
-      }
-    },
-    "grunt-contrib-concat": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-2.0.0.tgz",
-      "integrity": "sha512-/cfWwsGiprVTOl7c2bZwMdQ8hIf3e1f4szm1i7qhY9hOnR/X2KL+Xe7dynNweTYHa6aWPZx2B5GPsUpxAXNCaA==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.1.2",
-        "source-map": "^0.5.3"
-      }
-    },
-    "grunt-contrib-copy": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz",
-      "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=",
-      "dev": true,
-      "requires": {
-        "chalk": "^1.1.1",
-        "file-sync-cmp": "^0.1.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true
-        }
-      }
-    },
-    "grunt-contrib-imagemin": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-imagemin/-/grunt-contrib-imagemin-4.0.0.tgz",
-      "integrity": "sha512-2GYQBQFfJLjeTThJ8E7+vLgvgfOh78u0bgieIK85c2Rv9V6ssd2AvBvuF7T26mK261EN/SlNefpW5+zGWzfrVw==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.4.1",
-        "imagemin": "^6.0.0",
-        "imagemin-gifsicle": "^6.0.1",
-        "imagemin-jpegtran": "^6.0.0",
-        "imagemin-optipng": "^6.0.0",
-        "imagemin-svgo": "^7.0.0",
-        "p-map": "^1.2.0",
-        "plur": "^3.0.1",
-        "pretty-bytes": "^5.1.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "dev": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "grunt-contrib-jshint": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-3.1.1.tgz",
-      "integrity": "sha512-EwMY6L91FqTcMlZTVoDeeq/EZL+7MoFyo1rxIea9sxyv73geVggeE37jcUhNbu5hLbxHE82CGIUqitHuR2/q+g==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hooker": "^0.2.3",
-        "jshint": "~2.13.0"
-      }
-    },
-    "grunt-contrib-less": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-3.0.0.tgz",
-      "integrity": "sha512-fBB8MUDCo5EgT7WdOVQnZq4GF+XCeFdnkhaxI7uepp8P973sH1jdodjF87c6d9WSHKgArJAGP5JEtthhdKVovg==",
-      "dev": true,
-      "requires": {
-        "async": "^3.2.0",
-        "chalk": "^4.1.0",
-        "less": "^4.1.1",
-        "lodash": "^4.17.21"
-      }
-    },
-    "grunt-contrib-uglify": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.0.1.tgz",
-      "integrity": "sha512-T/aXZ4WIpAtoswZqb6HROKg7uq9QbKwl+lUuOwK4eoFj3tFv9/a/oMyd3/qvetV29Pbf8P1YYda1gDwZppr60A==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.4.1",
-        "maxmin": "^2.1.0",
-        "uglify-js": "^3.13.3",
-        "uri-path": "^1.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "dev": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "grunt-contrib-watch": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz",
-      "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==",
-      "dev": true,
-      "requires": {
-        "async": "^2.6.0",
-        "gaze": "^1.1.0",
-        "lodash": "^4.17.10",
-        "tiny-lr": "^1.1.1"
-      },
-      "dependencies": {
-        "async": {
-          "version": "2.6.3",
-          "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
-          "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
-          "dev": true,
-          "requires": {
-            "lodash": "^4.17.14"
-          }
-        }
-      }
-    },
-    "grunt-known-options": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz",
-      "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==",
-      "dev": true
-    },
-    "grunt-legacy-log": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz",
-      "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==",
-      "dev": true,
-      "requires": {
-        "colors": "~1.1.2",
-        "grunt-legacy-log-utils": "~2.1.0",
-        "hooker": "~0.2.3",
-        "lodash": "~4.17.19"
-      }
-    },
-    "grunt-legacy-log-utils": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz",
-      "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==",
-      "dev": true,
-      "requires": {
-        "chalk": "~4.1.0",
-        "lodash": "~4.17.19"
-      }
-    },
-    "grunt-legacy-util": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz",
-      "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==",
-      "dev": true,
-      "requires": {
-        "async": "~3.2.0",
-        "exit": "~0.1.2",
-        "getobject": "~1.0.0",
-        "hooker": "~0.2.3",
-        "lodash": "~4.17.21",
-        "underscore.string": "~3.3.5",
-        "which": "~2.0.2"
-      }
-    },
-    "grunt-text-replace": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/grunt-text-replace/-/grunt-text-replace-0.4.0.tgz",
-      "integrity": "sha1-252c5Z4v5J2id+nbwZXD4Rz7FsI=",
-      "dev": true
-    },
-    "gzip-size": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz",
-      "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
-      "dev": true,
-      "requires": {
-        "duplexer": "^0.1.1"
-      }
-    },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "has-bigints": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
-      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
-      "dev": true,
-      "optional": true
-    },
-    "has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true
-    },
-    "has-symbol-support-x": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
-      "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==",
-      "dev": true,
-      "optional": true
-    },
-    "has-symbols": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
-      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
-      "dev": true
-    },
-    "has-to-string-tag-x": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
-      "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "has-symbol-support-x": "^1.4.1"
-      }
-    },
-    "has-tostringtag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
-      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "has-symbols": "^1.0.2"
-      }
-    },
-    "has-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "dev": true,
-      "requires": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "has-values": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "dev": true,
-      "requires": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "homedir-polyfill": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
-      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
-      "dev": true,
-      "requires": {
-        "parse-passwd": "^1.0.0"
-      }
-    },
-    "hooker": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
-      "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
-      "dev": true
-    },
-    "hosted-git-info": {
-      "version": "2.8.9",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
-      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
-      "dev": true,
-      "optional": true
-    },
-    "htmlparser2": {
-      "version": "3.8.3",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
-      "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
-      "dev": true,
-      "requires": {
-        "domelementtype": "1",
-        "domhandler": "2.3",
-        "domutils": "1.5",
-        "entities": "1.0",
-        "readable-stream": "1.1"
-      }
-    },
-    "http-cache-semantics": {
-      "version": "3.8.1",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
-      "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
-      "dev": true,
-      "optional": true
-    },
-    "http-parser-js": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz",
-      "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==",
-      "dev": true
-    },
-    "iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      }
-    },
-    "ieee754": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-      "dev": true,
-      "optional": true
-    },
-    "ignore": {
-      "version": "3.3.10",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
-      "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
-      "dev": true
-    },
-    "image-size": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
-      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
-      "dev": true,
-      "optional": true
-    },
-    "imagemin": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.1.0.tgz",
-      "integrity": "sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A==",
-      "dev": true,
-      "requires": {
-        "file-type": "^10.7.0",
-        "globby": "^8.0.1",
-        "make-dir": "^1.0.0",
-        "p-pipe": "^1.1.0",
-        "pify": "^4.0.1",
-        "replace-ext": "^1.0.0"
-      }
-    },
-    "imagemin-gifsicle": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-6.0.1.tgz",
-      "integrity": "sha512-kuu47c6iKDQ6R9J10xCwL0lgs0+sMz3LRHqRcJ2CRBWdcNmo3T5hUaM8hSZfksptZXJLGKk8heSAvwtSdB1Fng==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "exec-buffer": "^3.0.0",
-        "gifsicle": "^4.0.0",
-        "is-gif": "^3.0.0"
-      }
-    },
-    "imagemin-jpegtran": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-6.0.0.tgz",
-      "integrity": "sha512-Ih+NgThzqYfEWv9t58EItncaaXIHR0u9RuhKa8CtVBlMBvY0dCIxgQJQCfwImA4AV1PMfmUKlkyIHJjb7V4z1g==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "exec-buffer": "^3.0.0",
-        "is-jpg": "^2.0.0",
-        "jpegtran-bin": "^4.0.0"
-      }
-    },
-    "imagemin-optipng": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-6.0.0.tgz",
-      "integrity": "sha512-FoD2sMXvmoNm/zKPOWdhKpWdFdF9qiJmKC17MxZJPH42VMAp17/QENI/lIuP7LCUnLVAloO3AUoTSNzfhpyd8A==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "exec-buffer": "^3.0.0",
-        "is-png": "^1.0.0",
-        "optipng-bin": "^5.0.0"
-      }
-    },
-    "imagemin-svgo": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-7.1.0.tgz",
-      "integrity": "sha512-0JlIZNWP0Luasn1HT82uB9nU9aa+vUj6kpT+MjPW11LbprXC+iC4HDwn1r4Q2/91qj4iy9tRZNsFySMlEpLdpg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "is-svg": "^4.2.1",
-        "svgo": "^1.3.2"
-      }
-    },
-    "import-lazy": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz",
-      "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==",
-      "dev": true,
-      "optional": true
-    },
-    "indent-string": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
-      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "repeating": "^2.0.0"
-      }
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
-    },
-    "ini": {
-      "version": "1.3.8",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
-      "dev": true
-    },
-    "internal-slot": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
-      "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "get-intrinsic": "^1.1.0",
-        "has": "^1.0.3",
-        "side-channel": "^1.0.4"
-      }
-    },
-    "interpret": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
-      "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
-      "dev": true
-    },
-    "into-stream": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
-      "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "from2": "^2.1.1",
-        "p-is-promise": "^1.1.0"
-      }
-    },
-    "irregular-plurals": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz",
-      "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==",
-      "dev": true
-    },
-    "is-absolute": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
-      "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
-      "dev": true,
-      "requires": {
-        "is-relative": "^1.0.0",
-        "is-windows": "^1.0.1"
-      }
-    },
-    "is-accessor-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.0"
-      }
-    },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true,
-      "optional": true
-    },
-    "is-bigint": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
-      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "has-bigints": "^1.0.1"
-      }
-    },
-    "is-boolean-object": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
-      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-      "dev": true
-    },
-    "is-callable": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
-      "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
-      "dev": true,
-      "optional": true
-    },
-    "is-core-module": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
-      "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.3"
-      }
-    },
-    "is-data-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.0"
-      }
-    },
-    "is-date-object": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
-      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-descriptor": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-      "dev": true,
-      "requires": {
-        "is-accessor-descriptor": "^1.0.0",
-        "is-data-descriptor": "^1.0.0",
-        "kind-of": "^6.0.2"
-      }
-    },
-    "is-extendable": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-      "dev": true,
-      "requires": {
-        "is-plain-object": "^2.0.4"
-      }
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
-    },
-    "is-finite": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
-      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
-      "dev": true,
-      "optional": true
-    },
-    "is-gif": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-3.0.0.tgz",
-      "integrity": "sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "file-type": "^10.4.0"
-      }
-    },
-    "is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
-    "is-jpg": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-2.0.0.tgz",
-      "integrity": "sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=",
-      "dev": true,
-      "optional": true
-    },
-    "is-natural-number": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
-      "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=",
-      "dev": true,
-      "optional": true
-    },
-    "is-negative-zero": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
-      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
-      "dev": true,
-      "optional": true
-    },
-    "is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-number-object": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
-      "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-object": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
-      "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==",
-      "dev": true,
-      "optional": true
-    },
-    "is-plain-obj": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
-      "dev": true,
-      "optional": true
-    },
-    "is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "is-png": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz",
-      "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84=",
-      "dev": true,
-      "optional": true
-    },
-    "is-regex": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
-      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-relative": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
-      "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
-      "dev": true,
-      "requires": {
-        "is-unc-path": "^1.0.0"
-      }
-    },
-    "is-retry-allowed": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
-      "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==",
-      "dev": true,
-      "optional": true
-    },
-    "is-shared-array-buffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
-      "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
-      "dev": true,
-      "optional": true
-    },
-    "is-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
-      "dev": true,
-      "optional": true
-    },
-    "is-string": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
-      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-svg": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.3.1.tgz",
-      "integrity": "sha512-h2CGs+yPUyvkgTJQS9cJzo9lYK06WgRiXUqBBHtglSzVKAuH4/oWsqk7LGfbSa1hGk9QcZ0SyQtVggvBA8LZXA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "fast-xml-parser": "^3.19.0"
-      }
-    },
-    "is-symbol": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
-      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "has-symbols": "^1.0.2"
-      }
-    },
-    "is-unc-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
-      "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
-      "dev": true,
-      "requires": {
-        "unc-path-regex": "^0.1.2"
-      }
-    },
-    "is-utf8": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
-      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
-      "dev": true,
-      "optional": true
-    },
-    "is-weakref": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
-      "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "call-bind": "^1.0.0"
-      }
-    },
-    "is-what": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
-      "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
-      "dev": true
-    },
-    "is-windows": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true
-    },
-    "isarray": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-      "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-      "dev": true
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true
-    },
-    "isurl": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
-      "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "has-to-string-tag-x": "^1.2.0",
-        "is-object": "^1.0.1"
-      }
-    },
-    "jpegtran-bin": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz",
-      "integrity": "sha512-2cRl1ism+wJUoYAYFt6O/rLBfpXNWG2dUWbgcEkTt5WGMnqI46eEro8T4C5zGROxKRqyKpCBSdHPvt5UYCtxaQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "bin-build": "^3.0.0",
-        "bin-wrapper": "^4.0.0",
-        "logalot": "^2.0.0"
-      }
-    },
-    "jquery": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
-      "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
-    },
-    "js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-      "dev": true,
-      "requires": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      }
-    },
-    "jsdoctypeparser": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
-      "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==",
-      "dev": true
-    },
-    "jshint": {
-      "version": "2.13.1",
-      "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.1.tgz",
-      "integrity": "sha512-vymzfR3OysF5P774x6zYv0bD4EpH6NWRxpq54wO9mA9RuY49yb1teKSICkLx2Ryx+mfzlVVNNbTBtsRtg78t7g==",
-      "dev": true,
-      "requires": {
-        "cli": "~1.0.0",
-        "console-browserify": "1.1.x",
-        "exit": "0.1.x",
-        "htmlparser2": "3.8.x",
-        "lodash": "~4.17.21",
-        "minimatch": "~3.0.2",
-        "shelljs": "0.3.x",
-        "strip-json-comments": "1.0.x"
-      }
-    },
-    "json-buffer": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
-      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
-      "dev": true,
-      "optional": true
-    },
-    "keyv": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz",
-      "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "json-buffer": "3.0.0"
-      }
-    },
-    "kind-of": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true
-    },
-    "less": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz",
-      "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==",
-      "dev": true,
-      "requires": {
-        "copy-anything": "^2.0.1",
-        "errno": "^0.1.1",
-        "graceful-fs": "^4.1.2",
-        "image-size": "~0.5.0",
-        "make-dir": "^2.1.0",
-        "mime": "^1.4.1",
-        "needle": "^2.5.2",
-        "parse-node-version": "^1.0.1",
-        "source-map": "~0.6.0",
-        "tslib": "^2.3.0"
-      },
-      "dependencies": {
-        "make-dir": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
-          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "pify": "^4.0.1",
-            "semver": "^5.6.0"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "liftup": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz",
-      "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==",
-      "dev": true,
-      "requires": {
-        "extend": "^3.0.2",
-        "findup-sync": "^4.0.0",
-        "fined": "^1.2.0",
-        "flagged-respawn": "^1.0.1",
-        "is-plain-object": "^2.0.4",
-        "object.map": "^1.0.1",
-        "rechoir": "^0.7.0",
-        "resolve": "^1.19.0"
-      },
-      "dependencies": {
-        "braces": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-          "dev": true,
-          "requires": {
-            "fill-range": "^7.0.1"
-          }
-        },
-        "fill-range": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-          "dev": true,
-          "requires": {
-            "to-regex-range": "^5.0.1"
-          }
-        },
-        "findup-sync": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz",
-          "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==",
-          "dev": true,
-          "requires": {
-            "detect-file": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "micromatch": "^4.0.2",
-            "resolve-dir": "^1.0.1"
-          }
-        },
-        "is-number": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-          "dev": true
-        },
-        "micromatch": {
-          "version": "4.0.4",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
-          "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
-          "dev": true,
-          "requires": {
-            "braces": "^3.0.1",
-            "picomatch": "^2.2.3"
-          }
-        },
-        "to-regex-range": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-          "dev": true,
-          "requires": {
-            "is-number": "^7.0.0"
-          }
-        }
-      }
-    },
-    "linkify-it": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz",
-      "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==",
-      "dev": true,
-      "requires": {
-        "uc.micro": "^1.0.1"
-      }
-    },
-    "livereload-js": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz",
-      "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==",
-      "dev": true
-    },
-    "load-json-file": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
-      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
-    },
-    "logalot": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz",
-      "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "figures": "^1.3.5",
-        "squeak": "^1.0.0"
-      }
-    },
-    "longest": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
-      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
-      "dev": true,
-      "optional": true
-    },
-    "loud-rejection": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
-      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "currently-unhandled": "^0.4.1",
-        "signal-exit": "^3.0.0"
-      }
-    },
-    "lowercase-keys": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
-      "dev": true,
-      "optional": true
-    },
-    "lpad-align": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz",
-      "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "get-stdin": "^4.0.1",
-        "indent-string": "^2.1.0",
-        "longest": "^1.0.0",
-        "meow": "^3.3.0"
-      }
-    },
-    "lru-cache": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-      "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "pseudomap": "^1.0.2",
-        "yallist": "^2.1.2"
-      }
-    },
-    "make-dir": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
-      "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
-      "dev": true,
-      "requires": {
-        "pify": "^3.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-          "dev": true
-        }
-      }
-    },
-    "make-iterator": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
-      "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.2"
-      }
-    },
-    "map-cache": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true
-    },
-    "map-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
-      "dev": true,
-      "optional": true
-    },
-    "map-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "dev": true,
-      "requires": {
-        "object-visit": "^1.0.0"
-      }
-    },
-    "markdown-it": {
-      "version": "13.0.1",
-      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz",
-      "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==",
-      "dev": true,
-      "requires": {
-        "argparse": "^2.0.1",
-        "entities": "~3.0.1",
-        "linkify-it": "^4.0.1",
-        "mdurl": "^1.0.1",
-        "uc.micro": "^1.0.5"
-      },
-      "dependencies": {
-        "argparse": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-          "dev": true
-        },
-        "entities": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
-          "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
-          "dev": true
-        }
-      }
-    },
-    "maxmin": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz",
-      "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=",
-      "dev": true,
-      "requires": {
-        "chalk": "^1.0.0",
-        "figures": "^1.0.1",
-        "gzip-size": "^3.0.0",
-        "pretty-bytes": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "pretty-bytes": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz",
-          "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=",
-          "dev": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true
-        }
-      }
-    },
-    "mdn-data": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
-      "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
-      "dev": true,
-      "optional": true
-    },
-    "mdurl": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
-      "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
-      "dev": true
-    },
-    "meow": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
-      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "camelcase-keys": "^2.0.0",
-        "decamelize": "^1.1.2",
-        "loud-rejection": "^1.0.0",
-        "map-obj": "^1.0.1",
-        "minimist": "^1.1.3",
-        "normalize-package-data": "^2.3.4",
-        "object-assign": "^4.0.1",
-        "read-pkg-up": "^1.0.1",
-        "redent": "^1.0.0",
-        "trim-newlines": "^1.0.0"
-      }
-    },
-    "merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true
-    },
-    "micromatch": {
-      "version": "3.1.10",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      }
-    },
-    "mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-      "dev": true,
-      "optional": true
-    },
-    "mime-db": {
-      "version": "1.50.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz",
-      "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==",
-      "dev": true,
-      "optional": true
-    },
-    "mimic-response": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
-      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
-      "dev": true,
-      "optional": true
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true,
-      "optional": true
-    },
-    "mixin-deep": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
-      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      }
-    },
-    "ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "nanomatch": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      }
-    },
-    "needle": {
-      "version": "2.9.1",
-      "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
-      "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "debug": "^3.2.6",
-        "iconv-lite": "^0.4.4",
-        "sax": "^1.2.4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.3",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "nice-try": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
-      "dev": true,
-      "optional": true
-    },
-    "nopt": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
-      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
-      "dev": true,
-      "requires": {
-        "abbrev": "1"
-      }
-    },
-    "normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "normalize-url": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
-      "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "prepend-http": "^2.0.0",
-        "query-string": "^5.0.1",
-        "sort-keys": "^2.0.0"
-      },
-      "dependencies": {
-        "prepend-http": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-          "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
-          "dev": true,
-          "optional": true
-        },
-        "sort-keys": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
-          "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "is-plain-obj": "^1.0.0"
-          }
-        }
-      }
-    },
-    "npm-conf": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
-      "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "config-chain": "^1.1.11",
-        "pify": "^3.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "npm-run-path": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "path-key": "^2.0.0"
-      }
-    },
-    "nth-check": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
-      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "boolbase": "~1.0.0"
-      }
-    },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-      "dev": true
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true
-    },
-    "object-copy": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "dev": true,
-      "requires": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "5.1.0",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-              "dev": true
-            }
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "object-inspect": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-      "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
-      "dev": true
-    },
-    "object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true,
-      "optional": true
-    },
-    "object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.assign": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
-      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "has-symbols": "^1.0.1",
-        "object-keys": "^1.1.1"
-      }
-    },
-    "object.defaults": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
-      "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
-      "dev": true,
-      "requires": {
-        "array-each": "^1.0.1",
-        "array-slice": "^1.0.0",
-        "for-own": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.getownpropertydescriptors": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz",
-      "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      }
-    },
-    "object.map": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
-      "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
-      "dev": true,
-      "requires": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "object.values": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
-      "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      }
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "optipng-bin": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-5.1.0.tgz",
-      "integrity": "sha512-9baoqZTNNmXQjq/PQTWEXbVV3AMO2sI/GaaqZJZ8SExfAzjijeAP7FEeT+TtyumSw7gr0PZtSUYB/Ke7iHQVKA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "bin-build": "^3.0.0",
-        "bin-wrapper": "^4.0.0",
-        "logalot": "^2.0.0"
-      }
-    },
-    "os-filter-obj": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz",
-      "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "arch": "^2.1.0"
-      }
-    },
-    "os-homedir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
-      "dev": true
-    },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true
-    },
-    "osenv": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
-      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
-      "dev": true,
-      "requires": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.0"
-      }
-    },
-    "p-cancelable": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz",
-      "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==",
-      "dev": true,
-      "optional": true
-    },
-    "p-event": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz",
-      "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "p-timeout": "^1.1.1"
-      }
-    },
-    "p-finally": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
-      "dev": true,
-      "optional": true
-    },
-    "p-is-promise": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
-      "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
-      "dev": true,
-      "optional": true
-    },
-    "p-map": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
-      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
-      "dev": true
-    },
-    "p-map-series": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz",
-      "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "p-reduce": "^1.0.0"
-      }
-    },
-    "p-pipe": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz",
-      "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=",
-      "dev": true
-    },
-    "p-reduce": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
-      "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=",
-      "dev": true,
-      "optional": true
-    },
-    "p-timeout": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
-      "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "p-finally": "^1.0.0"
-      }
-    },
-    "parse-filepath": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
-      "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
-      "dev": true,
-      "requires": {
-        "is-absolute": "^1.0.0",
-        "map-cache": "^0.2.0",
-        "path-root": "^0.1.1"
-      }
-    },
-    "parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "error-ex": "^1.2.0"
-      }
-    },
-    "parse-node-version": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
-      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
-      "dev": true
-    },
-    "parse-passwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
-      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
-      "dev": true
-    },
-    "pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-      "dev": true
-    },
-    "path-dirname": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
-      "dev": true
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
-    },
-    "path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-      "dev": true,
-      "optional": true
-    },
-    "path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "dev": true
-    },
-    "path-root": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
-      "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
-      "dev": true,
-      "requires": {
-        "path-root-regex": "^0.1.0"
-      }
-    },
-    "path-root-regex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
-      "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
-      "dev": true
-    },
-    "path-type": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
-      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
-      "dev": true,
-      "requires": {
-        "pify": "^3.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-          "dev": true
-        }
-      }
-    },
-    "pend": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
-      "dev": true,
-      "optional": true
-    },
-    "picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true
-    },
-    "pify": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
-      "dev": true
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "dev": true,
-      "optional": true
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
-    },
-    "plur": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz",
-      "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==",
-      "dev": true,
-      "requires": {
-        "irregular-plurals": "^2.0.0"
-      }
-    },
-    "posix-character-classes": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
-      "dev": true
-    },
-    "prepend-http": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
-      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
-      "dev": true,
-      "optional": true
-    },
-    "pretty-bytes": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
-      "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
-      "dev": true
-    },
-    "process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true,
-      "optional": true
-    },
-    "proto-list": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
-      "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
-      "dev": true,
-      "optional": true
-    },
-    "prr": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
-      "dev": true,
-      "optional": true
-    },
-    "pseudomap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
-      "dev": true,
-      "optional": true
-    },
-    "pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "q": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
-      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
-      "dev": true,
-      "optional": true
-    },
-    "qs": {
-      "version": "6.10.1",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz",
-      "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==",
-      "dev": true,
-      "requires": {
-        "side-channel": "^1.0.4"
-      }
-    },
-    "query-string": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
-      "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "decode-uri-component": "^0.2.0",
-        "object-assign": "^4.1.0",
-        "strict-uri-encode": "^1.0.0"
-      }
-    },
-    "raw-body": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
-      "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
-      "dev": true,
-      "requires": {
-        "bytes": "1",
-        "string_decoder": "0.10"
-      }
-    },
-    "read-pkg": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
-      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "load-json-file": "^1.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^1.0.0"
-      },
-      "dependencies": {
-        "path-type": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
-          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "read-pkg-up": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
-      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "find-up": "^1.0.0",
-        "read-pkg": "^1.0.0"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
-          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "path-exists": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "path-exists": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
-          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "pinkie-promise": "^2.0.0"
-          }
-        }
-      }
-    },
-    "readable-stream": {
-      "version": "1.1.14",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-      "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
-      "dev": true,
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.1",
-        "isarray": "0.0.1",
-        "string_decoder": "~0.10.x"
-      }
-    },
-    "rechoir": {
-      "version": "0.7.1",
-      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
-      "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
-      "dev": true,
-      "requires": {
-        "resolve": "^1.9.0"
-      }
-    },
-    "redent": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
-      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "indent-string": "^2.1.0",
-        "strip-indent": "^1.0.1"
-      }
-    },
-    "regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "repeat-element": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
-      "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
-      "dev": true
-    },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
-      "dev": true
-    },
-    "repeating": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "is-finite": "^1.0.0"
-      }
-    },
-    "replace-ext": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
-      "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
-      "dev": true
-    },
-    "resolve": {
-      "version": "1.20.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
-      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
-      "dev": true,
-      "requires": {
-        "is-core-module": "^2.2.0",
-        "path-parse": "^1.0.6"
-      }
-    },
-    "resolve-dir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
-      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.0",
-        "global-modules": "^1.0.0"
-      }
-    },
-    "resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-      "dev": true
-    },
-    "responselike": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
-      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "lowercase-keys": "^1.0.0"
-      }
-    },
-    "ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true
-    },
-    "safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
-    },
-    "safe-json-parse": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz",
-      "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=",
-      "dev": true
-    },
-    "safe-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "dev": true,
-      "requires": {
-        "ret": "~0.1.10"
-      }
-    },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
-    },
-    "sax": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
-      "dev": true,
-      "optional": true
-    },
-    "seek-bzip": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz",
-      "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "commander": "^2.8.1"
-      }
-    },
-    "semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true,
-      "optional": true
-    },
-    "semver-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
-      "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==",
-      "dev": true,
-      "optional": true
-    },
-    "semver-truncate": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz",
-      "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "semver": "^5.3.0"
-      }
-    },
-    "set-value": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
-      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-extendable": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-          "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-          "dev": true
-        }
-      }
-    },
-    "shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "shebang-regex": "^1.0.0"
-      }
-    },
-    "shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-      "dev": true,
-      "optional": true
-    },
-    "shelljs": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
-      "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=",
-      "dev": true
-    },
-    "side-channel": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
-      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.0",
-        "get-intrinsic": "^1.0.2",
-        "object-inspect": "^1.9.0"
-      }
-    },
-    "signal-exit": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz",
-      "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==",
-      "dev": true,
-      "optional": true
-    },
-    "slash": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
-      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
-      "dev": true
-    },
-    "snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "dev": true,
-      "requires": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          }
-        },
-        "is-extendable": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-          "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-          "dev": true
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        }
-      }
-    },
-    "snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.2.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "sort-keys": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
-      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "is-plain-obj": "^1.0.0"
-      }
-    },
-    "sort-keys-length": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
-      "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "sort-keys": "^1.0.0"
-      }
-    },
-    "source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "dev": true
-    },
-    "source-map-resolve": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
-      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
-      "dev": true,
-      "requires": {
-        "atob": "^2.1.2",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
-    "source-map-url": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
-      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
-      "dev": true
-    },
-    "spdx-correct": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
-      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-exceptions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
-      "dev": true,
-      "optional": true
-    },
-    "spdx-expression-parse": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-license-ids": {
-      "version": "3.0.10",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz",
-      "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==",
-      "dev": true,
-      "optional": true
-    },
-    "split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.0"
-      }
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "squeak": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz",
-      "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^1.0.0",
-        "console-stream": "^0.1.1",
-        "lpad-align": "^1.0.1"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true,
-          "optional": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "stable": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
-      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
-      "dev": true,
-      "optional": true
-    },
-    "static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "dev": true,
-      "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "strict-uri-encode": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
-      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
-      "dev": true,
-      "optional": true
-    },
-    "string_decoder": {
-      "version": "0.10.31",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-      "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
-      "dev": true
-    },
-    "string-template": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
-      "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=",
-      "dev": true
-    },
-    "string.prototype.trimend": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
-      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "string.prototype.trimstart": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
-      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "strip-bom": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
-      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "is-utf8": "^0.2.0"
-      }
-    },
-    "strip-dirs": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz",
-      "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "is-natural-number": "^4.0.1"
-      }
-    },
-    "strip-eof": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
-      "dev": true,
-      "optional": true
-    },
-    "strip-indent": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
-      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "get-stdin": "^4.0.1"
-      }
-    },
-    "strip-json-comments": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
-      "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
-      "dev": true
-    },
-    "strip-outer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
-      "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "escape-string-regexp": "^1.0.2"
-      }
-    },
-    "strnum": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.4.tgz",
-      "integrity": "sha512-lMzNMfDpaQOLt4B2mEbfzYS0+T7dvCXeojnlGf6f1AygvWDMcWyXYaLbyICfjVu29sErR8fnRagQfBW/N/hGgw==",
-      "dev": true,
-      "optional": true
-    },
-    "supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "requires": {
-        "has-flag": "^4.0.0"
-      }
-    },
-    "svgo": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
-      "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^2.4.1",
-        "coa": "^2.0.2",
-        "css-select": "^2.0.0",
-        "css-select-base-adapter": "^0.1.1",
-        "css-tree": "1.0.0-alpha.37",
-        "csso": "^4.0.2",
-        "js-yaml": "^3.13.1",
-        "mkdirp": "~0.5.1",
-        "object.values": "^1.1.0",
-        "sax": "~1.2.4",
-        "stable": "^0.1.8",
-        "unquote": "~1.1.1",
-        "util.promisify": "~1.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true,
-          "optional": true
-        },
-        "mkdirp": {
-          "version": "0.5.5",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minimist": "^1.2.5"
-          }
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "tar-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
-      "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "bl": "^1.0.0",
-        "buffer-alloc": "^1.2.0",
-        "end-of-stream": "^1.0.0",
-        "fs-constants": "^1.0.0",
-        "readable-stream": "^2.3.0",
-        "to-buffer": "^1.1.1",
-        "xtend": "^4.0.0"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-          "dev": true,
-          "optional": true
-        },
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "temp-dir": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz",
-      "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=",
-      "dev": true,
-      "optional": true
-    },
-    "tempfile": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz",
-      "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "temp-dir": "^1.0.0",
-        "uuid": "^3.0.1"
-      }
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
-      "dev": true,
-      "optional": true
-    },
-    "timed-out": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
-      "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
-      "dev": true,
-      "optional": true
-    },
-    "tiny-lr": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz",
-      "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==",
-      "dev": true,
-      "requires": {
-        "body": "^5.1.0",
-        "debug": "^3.1.0",
-        "faye-websocket": "~0.10.0",
-        "livereload-js": "^2.3.0",
-        "object-assign": "^4.1.0",
-        "qs": "^6.4.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.3",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-          "dev": true
-        }
-      }
-    },
-    "to-buffer": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
-      "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
-      "dev": true,
-      "optional": true
-    },
-    "to-object-path": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "to-regex": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-      "dev": true,
-      "requires": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      }
-    },
-    "trim-newlines": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
-      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
-      "dev": true,
-      "optional": true
-    },
-    "trim-repeated": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
-      "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "escape-string-regexp": "^1.0.2"
-      }
-    },
-    "tslib": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-      "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
-      "dev": true
-    },
-    "tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "uc.micro": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
-      "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
-      "dev": true
-    },
-    "uglify-js": {
-      "version": "3.14.3",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz",
-      "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==",
-      "dev": true
-    },
-    "unbox-primitive": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
-      "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "has-bigints": "^1.0.1",
-        "has-symbols": "^1.0.2",
-        "which-boxed-primitive": "^1.0.2"
-      }
-    },
-    "unbzip2-stream": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
-      "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "buffer": "^5.2.1",
-        "through": "^2.3.8"
-      }
-    },
-    "unc-path-regex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
-      "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
-      "dev": true
-    },
-    "underscore.string": {
-      "version": "3.3.5",
-      "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
-      "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
-      "dev": true,
-      "requires": {
-        "sprintf-js": "^1.0.3",
-        "util-deprecate": "^1.0.2"
-      }
-    },
-    "union-value": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
-      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^2.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-          "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-          "dev": true
-        }
-      }
-    },
-    "unquote": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
-      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
-      "dev": true,
-      "optional": true
-    },
-    "unset-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "dev": true,
-      "requires": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
-      },
-      "dependencies": {
-        "has-value": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-          "dev": true,
-          "requires": {
-            "get-value": "^2.0.3",
-            "has-values": "^0.1.4",
-            "isobject": "^2.0.0"
-          },
-          "dependencies": {
-            "isobject": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-              "dev": true,
-              "requires": {
-                "isarray": "1.0.0"
-              }
-            }
-          }
-        },
-        "has-values": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-          "dev": true
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-          "dev": true
-        }
-      }
-    },
-    "uri-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz",
-      "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=",
-      "dev": true
-    },
-    "urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-      "dev": true
-    },
-    "url-parse-lax": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
-      "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "prepend-http": "^1.0.1"
-      }
-    },
-    "url-to-options": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
-      "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=",
-      "dev": true,
-      "optional": true
-    },
-    "use": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-      "dev": true
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
-    },
-    "util.promisify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
-      "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.2",
-        "has-symbols": "^1.0.1",
-        "object.getownpropertydescriptors": "^2.1.0"
-      }
-    },
-    "uuid": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
-      "dev": true,
-      "optional": true
-    },
-    "v8flags": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
-      "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1"
-      }
-    },
-    "validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "websocket-driver": {
-      "version": "0.7.4",
-      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
-      "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
-      "dev": true,
-      "requires": {
-        "http-parser-js": ">=0.5.1",
-        "safe-buffer": ">=5.1.0",
-        "websocket-extensions": ">=0.1.1"
-      }
-    },
-    "websocket-extensions": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
-      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
-      "dev": true
-    },
-    "which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "which-boxed-primitive": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
-      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "is-bigint": "^1.0.1",
-        "is-boolean-object": "^1.1.0",
-        "is-number-object": "^1.0.4",
-        "is-string": "^1.0.5",
-        "is-symbol": "^1.0.3"
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "dev": true,
-      "optional": true
-    },
-    "yallist": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
-      "dev": true,
-      "optional": true
-    },
-    "yauzl": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
-      "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "buffer-crc32": "~0.2.3",
-        "fd-slicer": "~1.1.0"
-      }
-    }
-  }
-}
diff --git a/public/ext/vakata-jstree-3.3.17/package.json b/public/ext/vakata-jstree-3.3.17/package.json
deleted file mode 100644
index f7507be016..0000000000
--- a/public/ext/vakata-jstree-3.3.17/package.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
-  "name": "jstree",
-  "title": "jsTree",
-  "description": "jQuery tree plugin",
-  "version": "3.3.17",
-  "homepage": "http://jstree.com",
-  "main": "./dist/jstree.js",
-  "author": {
-    "name": "Ivan Bozhanov",
-    "email": "jstree@jstree.com",
-    "url": "http://vakata.com"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/vakata/jstree.git"
-  },
-  "bugs": {
-    "url": "https://github.com/vakata/jstree/issues"
-  },
-  "license": "MIT",
-  "licenses": [
-    {
-      "type": "MIT",
-      "url": "https://github.com/vakata/jstree/blob/master/LICENSE-MIT"
-    }
-  ],
-  "keywords": [],
-  "devDependencies": {
-    "dox": "^1.0.0",
-    "grunt": "~1.6.1",
-    "grunt-contrib-concat": "*",
-    "grunt-contrib-copy": "*",
-    "grunt-contrib-imagemin": "^4.0.0",
-    "grunt-contrib-jshint": "*",
-    "grunt-contrib-less": "^3.0.0",
-    "grunt-contrib-uglify": "^5.0.1",
-    "grunt-contrib-watch": "~1.1.0",
-    "grunt-text-replace": "~0.4.0",
-    "lodash": "^4.17.21"
-  },
-  "dependencies": {
-    "jquery": "^3.5.0"
-  },
-  "npmName": "jstree",
-  "npmFileMap": [
-    {
-      "basePath": "/dist/",
-      "files": [
-        "jstree.min.js",
-        "themes/**/*.png",
-        "themes/**/*.gif",
-        "themes/**/*.min.css"
-      ]
-    }
-  ]
-}
diff --git a/public/ext/vakata-jstree-3.3.17/src/intro.js b/public/ext/vakata-jstree-3.3.17/src/intro.js
deleted file mode 100644
index 5c95a5cdfb..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/intro.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/*globals jQuery, define, module, exports, require, window, document, postMessage */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define(['jquery'], factory);
-	}
-	else if(typeof module !== 'undefined' && module.exports) {
-		module.exports = factory(require('jquery'));
-	}
-	else {
-		factory(jQuery);
-	}
-}(function ($, undefined) {
-	"use strict";
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.changed.js b/public/ext/vakata-jstree-3.3.17/src/jstree.changed.js
deleted file mode 100644
index 949529ab94..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.changed.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * ### Changed plugin
- *
- * This plugin adds more information to the `changed.jstree` event. The new data is contained in the `changed` event data property, and contains a lists of `selected` and `deselected` nodes.
- */
-/*globals jQuery, define, exports, require, document */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.changed', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.changed) { return; }
-
-	$.jstree.plugins.changed = function (options, parent) {
-		var last = [];
-		this.trigger = function (ev, data) {
-			var i, j;
-			if(!data) {
-				data = {};
-			}
-			if(ev.replace('.jstree','') === 'changed') {
-				data.changed = { selected : [], deselected : [] };
-				var tmp = {};
-				for(i = 0, j = last.length; i < j; i++) {
-					tmp[last[i]] = 1;
-				}
-				for(i = 0, j = data.selected.length; i < j; i++) {
-					if(!tmp[data.selected[i]]) {
-						data.changed.selected.push(data.selected[i]);
-					}
-					else {
-						tmp[data.selected[i]] = 2;
-					}
-				}
-				for(i = 0, j = last.length; i < j; i++) {
-					if(tmp[last[i]] === 1) {
-						data.changed.deselected.push(last[i]);
-					}
-				}
-				last = data.selected.slice();
-			}
-			/**
-			 * triggered when selection changes (the "changed" plugin enhances the original event with more data)
-			 * @event
-			 * @name changed.jstree
-			 * @param {Object} node
-			 * @param {Object} action the action that caused the selection to change
-			 * @param {Array} selected the current selection
-			 * @param {Object} changed an object containing two properties `selected` and `deselected` - both arrays of node IDs, which were selected or deselected since the last changed event
-			 * @param {Object} event the event (if any) that triggered this changed event
-			 * @plugin changed
-			 */
-			parent.trigger.call(this, ev, data);
-		};
-		this.refresh = function (skip_loading, forget_state) {
-			last = [];
-			return parent.refresh.apply(this, arguments);
-		};
-	};
-}));
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.checkbox.js b/public/ext/vakata-jstree-3.3.17/src/jstree.checkbox.js
deleted file mode 100644
index d637dc9792..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.checkbox.js
+++ /dev/null
@@ -1,999 +0,0 @@
-/**
- * ### Checkbox plugin
- *
- * This plugin renders checkbox icons in front of each node, making multiple selection much easier.
- * It also supports tri-state behavior, meaning that if a node has a few of its children checked it will be rendered as undetermined, and state will be propagated up.
- */
-/*globals jQuery, define, exports, require, document */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.checkbox', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.checkbox) { return; }
-
-	var _i = document.createElement('I');
-	_i.className = 'jstree-icon jstree-checkbox';
-	_i.setAttribute('role', 'presentation');
-	/**
-	 * stores all defaults for the checkbox plugin
-	 * @name $.jstree.defaults.checkbox
-	 * @plugin checkbox
-	 */
-	$.jstree.defaults.checkbox = {
-		/**
-		 * a boolean indicating if checkboxes should be visible (can be changed at a later time using `show_checkboxes()` and `hide_checkboxes`). Defaults to `true`.
-		 * @name $.jstree.defaults.checkbox.visible
-		 * @plugin checkbox
-		 */
-		visible				: true,
-		/**
-		 * a boolean indicating if checkboxes should cascade down and have an undetermined state. Defaults to `true`.
-		 * @name $.jstree.defaults.checkbox.three_state
-		 * @plugin checkbox
-		 */
-		three_state			: true,
-		/**
-		 * a boolean indicating if clicking anywhere on the node should act as clicking on the checkbox. Defaults to `true`.
-		 * @name $.jstree.defaults.checkbox.whole_node
-		 * @plugin checkbox
-		 */
-		whole_node			: true,
-		/**
-		 * a boolean indicating if the selected style of a node should be kept, or removed. Defaults to `true`.
-		 * @name $.jstree.defaults.checkbox.keep_selected_style
-		 * @plugin checkbox
-		 */
-		keep_selected_style	: true,
-		/**
-		 * This setting controls how cascading and undetermined nodes are applied.
-		 * If 'up' is in the string - cascading up is enabled, if 'down' is in the string - cascading down is enabled, if 'undetermined' is in the string - undetermined nodes will be used.
-		 * If `three_state` is set to `true` this setting is automatically set to 'up+down+undetermined'. Defaults to ''.
-		 * @name $.jstree.defaults.checkbox.cascade
-		 * @plugin checkbox
-		 */
-		cascade				: '',
-		/**
-		 * This setting controls if checkbox are bound to the general tree selection or to an internal array maintained by the checkbox plugin. Defaults to `true`, only set to `false` if you know exactly what you are doing.
-		 * @name $.jstree.defaults.checkbox.tie_selection
-		 * @plugin checkbox
-		 */
-		tie_selection		: true,
-
-		/**
-		 * This setting controls if cascading down affects disabled checkboxes
-		 * @name $.jstree.defaults.checkbox.cascade_to_disabled
-		 * @plugin checkbox
-		 */
-		cascade_to_disabled : true,
-
-		/**
-		 * This setting controls if cascading down affects hidden checkboxes
-		 * @name $.jstree.defaults.checkbox.cascade_to_hidden
-		 * @plugin checkbox
-		 */
-		cascade_to_hidden : true
-	};
-	$.jstree.plugins.checkbox = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-			this._data.checkbox.uto = false;
-			this._data.checkbox.selected = [];
-			if(this.settings.checkbox.three_state) {
-				this.settings.checkbox.cascade = 'up+down+undetermined';
-			}
-			this.element
-				.on("init.jstree", function () {
-						this._data.checkbox.visible = this.settings.checkbox.visible;
-						if(!this.settings.checkbox.keep_selected_style) {
-							this.element.addClass('jstree-checkbox-no-clicked');
-						}
-						if(this.settings.checkbox.tie_selection) {
-							this.element.addClass('jstree-checkbox-selection');
-						}
-					}.bind(this))
-				.on("loading.jstree", function () {
-						this[ this._data.checkbox.visible ? 'show_checkboxes' : 'hide_checkboxes' ]();
-					}.bind(this));
-			if(this.settings.checkbox.cascade.indexOf('undetermined') !== -1) {
-				this.element
-					.on('changed.jstree uncheck_node.jstree check_node.jstree uncheck_all.jstree check_all.jstree move_node.jstree copy_node.jstree redraw.jstree open_node.jstree', function () {
-							// only if undetermined is in setting
-							if(this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); }
-							this._data.checkbox.uto = setTimeout(this._undetermined.bind(this), 50);
-						}.bind(this));
-			}
-			if(!this.settings.checkbox.tie_selection) {
-				this.element
-					.on('model.jstree', function (e, data) {
-						var m = this._model.data,
-							p = m[data.parent],
-							dpc = data.nodes,
-							i, j;
-						for(i = 0, j = dpc.length; i < j; i++) {
-							m[dpc[i]].state.checked = m[dpc[i]].state.checked || (m[dpc[i]].original && m[dpc[i]].original.state && m[dpc[i]].original.state.checked);
-							if(m[dpc[i]].state.checked) {
-								this._data.checkbox.selected.push(dpc[i]);
-							}
-						}
-					}.bind(this));
-			}
-			if(this.settings.checkbox.cascade.indexOf('up') !== -1 || this.settings.checkbox.cascade.indexOf('down') !== -1) {
-				this.element
-					.on('model.jstree', function (e, data) {
-							var m = this._model.data,
-								p = m[data.parent],
-								dpc = data.nodes,
-								chd = [],
-								c, i, j, k, l, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection;
-
-							if(s.indexOf('down') !== -1) {
-								// apply down
-								if(p.state[ t ? 'selected' : 'checked' ]) {
-									for(i = 0, j = dpc.length; i < j; i++) {
-										m[dpc[i]].state[ t ? 'selected' : 'checked' ] = true;
-									}
-
-									this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(dpc);
-								}
-								else {
-									for(i = 0, j = dpc.length; i < j; i++) {
-										if(m[dpc[i]].state[ t ? 'selected' : 'checked' ]) {
-											for(k = 0, l = m[dpc[i]].children_d.length; k < l; k++) {
-												m[m[dpc[i]].children_d[k]].state[ t ? 'selected' : 'checked' ] = true;
-											}
-											this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(m[dpc[i]].children_d);
-										}
-									}
-								}
-							}
-
-							if(s.indexOf('up') !== -1) {
-								// apply up
-								for(i = 0, j = p.children_d.length; i < j; i++) {
-									if(!m[p.children_d[i]].children.length) {
-										chd.push(m[p.children_d[i]].parent);
-									}
-								}
-								chd = $.vakata.array_unique(chd);
-								for(k = 0, l = chd.length; k < l; k++) {
-									p = m[chd[k]];
-									while(p && p.id !== $.jstree.root) {
-										c = 0;
-										for(i = 0, j = p.children.length; i < j; i++) {
-											c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
-										}
-										if(c === j) {
-											p.state[ t ? 'selected' : 'checked' ] = true;
-											this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
-											tmp = this.get_node(p, true);
-											if(tmp && tmp.length) {
-												tmp.children('.jstree-anchor').attr('aria-selected', true).addClass( t ? 'jstree-clicked' : 'jstree-checked');
-											}
-										}
-										else {
-											break;
-										}
-										p = this.get_node(p.parent);
-									}
-								}
-							}
-
-							this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected);
-						}.bind(this))
-					.on(this.settings.checkbox.tie_selection ? 'select_node.jstree' : 'check_node.jstree', function (e, data) {
-							var self = this,
-								obj = data.node,
-								m = this._model.data,
-								par = this.get_node(obj.parent),
-								i, j, c, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection,
-								sel = {}, cur = this._data[ t ? 'core' : 'checkbox' ].selected;
-
-							for (i = 0, j = cur.length; i < j; i++) {
-								sel[cur[i]] = true;
-							}
-
-							// apply down
-							if(s.indexOf('down') !== -1) {
-								//this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected.concat(obj.children_d));
-								var selectedIds = this._cascade_new_checked_state(obj.id, true);
-								var temp = obj.children_d.concat(obj.id);
-								for (i = 0, j = temp.length; i < j; i++) {
-									if (selectedIds.indexOf(temp[i]) > -1) {
-										sel[temp[i]] = true;
-									}
-									else {
-										delete sel[temp[i]];
-									}
-								}
-							}
-
-							// apply up
-							if(s.indexOf('up') !== -1) {
-								while(par && par.id !== $.jstree.root) {
-									c = 0;
-									for(i = 0, j = par.children.length; i < j; i++) {
-										c += m[par.children[i]].state[ t ? 'selected' : 'checked' ];
-									}
-									if(c === j) {
-										par.state[ t ? 'selected' : 'checked' ] = true;
-										sel[par.id] = true;
-										//this._data[ t ? 'core' : 'checkbox' ].selected.push(par.id);
-										tmp = this.get_node(par, true);
-										if(tmp && tmp.length) {
-											tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked');
-										}
-									}
-									else {
-										break;
-									}
-									par = this.get_node(par.parent);
-								}
-							}
-
-							cur = [];
-							for (i in sel) {
-								if (sel.hasOwnProperty(i)) {
-									cur.push(i);
-								}
-							}
-							this._data[ t ? 'core' : 'checkbox' ].selected = cur;
-						}.bind(this))
-					.on(this.settings.checkbox.tie_selection ? 'deselect_all.jstree' : 'uncheck_all.jstree', function (e, data) {
-							var obj = this.get_node($.jstree.root),
-								m = this._model.data,
-								i, j, tmp;
-							for(i = 0, j = obj.children_d.length; i < j; i++) {
-								tmp = m[obj.children_d[i]];
-								if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
-									tmp.original.state.undetermined = false;
-								}
-							}
-						}.bind(this))
-					.on(this.settings.checkbox.tie_selection ? 'deselect_node.jstree' : 'uncheck_node.jstree', function (e, data) {
-							var self = this,
-								obj = data.node,
-								dom = this.get_node(obj, true),
-								i, j, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection,
-								cur = this._data[ t ? 'core' : 'checkbox' ].selected, sel = {},
-								stillSelectedIds = [],
-								allIds = obj.children_d.concat(obj.id);
-
-							// apply down
-							if(s.indexOf('down') !== -1) {
-								var selectedIds = this._cascade_new_checked_state(obj.id, false);
-
-								cur = $.vakata.array_filter(cur, function(id) {
-									return allIds.indexOf(id) === -1 || selectedIds.indexOf(id) > -1;
-								});
-							}
-
-							// only apply up if cascade up is enabled and if this node is not selected
-							// (if all child nodes are disabled and cascade_to_disabled === false then this node will till be selected).
-							if(s.indexOf('up') !== -1 && cur.indexOf(obj.id) === -1) {
-								for(i = 0, j = obj.parents.length; i < j; i++) {
-									tmp = this._model.data[obj.parents[i]];
-									tmp.state[ t ? 'selected' : 'checked' ] = false;
-									if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
-										tmp.original.state.undetermined = false;
-									}
-									tmp = this.get_node(obj.parents[i], true);
-									if(tmp && tmp.length) {
-										tmp.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked');
-									}
-								}
-
-								cur = $.vakata.array_filter(cur, function(id) {
-									return obj.parents.indexOf(id) === -1;
-								});
-							}
-
-							this._data[ t ? 'core' : 'checkbox' ].selected = cur;
-						}.bind(this));
-			}
-			if(this.settings.checkbox.cascade.indexOf('up') !== -1) {
-				this.element
-					.on('delete_node.jstree', function (e, data) {
-							// apply up (whole handler)
-							var p = this.get_node(data.parent),
-								m = this._model.data,
-								i, j, c, tmp, t = this.settings.checkbox.tie_selection;
-							while(p && p.id !== $.jstree.root && !p.state[ t ? 'selected' : 'checked' ]) {
-								c = 0;
-								for(i = 0, j = p.children.length; i < j; i++) {
-									c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
-								}
-								if(j > 0 && c === j) {
-									p.state[ t ? 'selected' : 'checked' ] = true;
-									this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
-									tmp = this.get_node(p, true);
-									if(tmp && tmp.length) {
-										tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked');
-									}
-								}
-								else {
-									break;
-								}
-								p = this.get_node(p.parent);
-							}
-						}.bind(this))
-					.on('move_node.jstree', function (e, data) {
-							// apply up (whole handler)
-							var is_multi = data.is_multi,
-								old_par = data.old_parent,
-								new_par = this.get_node(data.parent),
-								m = this._model.data,
-								p, c, i, j, tmp, t = this.settings.checkbox.tie_selection;
-							if(!is_multi) {
-								p = this.get_node(old_par);
-								while(p && p.id !== $.jstree.root && !p.state[ t ? 'selected' : 'checked' ]) {
-									c = 0;
-									for(i = 0, j = p.children.length; i < j; i++) {
-										c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
-									}
-									if(j > 0 && c === j) {
-										p.state[ t ? 'selected' : 'checked' ] = true;
-										this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
-										tmp = this.get_node(p, true);
-										if(tmp && tmp.length) {
-											tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked');
-										}
-									}
-									else {
-										break;
-									}
-									p = this.get_node(p.parent);
-								}
-							}
-							p = new_par;
-							while(p && p.id !== $.jstree.root) {
-								c = 0;
-								for(i = 0, j = p.children.length; i < j; i++) {
-									c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
-								}
-								if(c === j) {
-									if(!p.state[ t ? 'selected' : 'checked' ]) {
-										p.state[ t ? 'selected' : 'checked' ] = true;
-										this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
-										tmp = this.get_node(p, true);
-										if(tmp && tmp.length) {
-											tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked');
-										}
-									}
-								}
-								else {
-									if(p.state[ t ? 'selected' : 'checked' ]) {
-										p.state[ t ? 'selected' : 'checked' ] = false;
-										this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_remove_item(this._data[ t ? 'core' : 'checkbox' ].selected, p.id);
-										tmp = this.get_node(p, true);
-										if(tmp && tmp.length) {
-											tmp.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked');
-										}
-									}
-									else {
-										break;
-									}
-								}
-								p = this.get_node(p.parent);
-							}
-						}.bind(this));
-			}
-		};
-		/**
-		 * get an array of all nodes whose state is "undetermined"
-		 * @name get_undetermined([full])
-		 * @param  {boolean} full: if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 * @plugin checkbox
-		 */
-		this.get_undetermined = function (full) {
-			if (this.settings.checkbox.cascade.indexOf('undetermined') === -1) {
-				return [];
-			}
-			var i, j, k, l, o = {}, m = this._model.data, t = this.settings.checkbox.tie_selection, s = this._data[ t ? 'core' : 'checkbox' ].selected, p = [], tt = this, r = [];
-			for(i = 0, j = s.length; i < j; i++) {
-				if(m[s[i]] && m[s[i]].parents) {
-					for(k = 0, l = m[s[i]].parents.length; k < l; k++) {
-						if(o[m[s[i]].parents[k]] !== undefined) {
-							break;
-						}
-						if(m[s[i]].parents[k] !== $.jstree.root) {
-							o[m[s[i]].parents[k]] = true;
-							p.push(m[s[i]].parents[k]);
-						}
-					}
-				}
-			}
-			// attempt for server side undetermined state
-			this.element.find('.jstree-closed').not(':has(.jstree-children)')
-				.each(function () {
-					var tmp = tt.get_node(this), tmp2;
-					
-					if(!tmp) { return; }
-					
-					if(!tmp.state.loaded) {
-						if(tmp.original && tmp.original.state && tmp.original.state.undetermined && tmp.original.state.undetermined === true) {
-							if(o[tmp.id] === undefined && tmp.id !== $.jstree.root) {
-								o[tmp.id] = true;
-								p.push(tmp.id);
-							}
-							for(k = 0, l = tmp.parents.length; k < l; k++) {
-								if(o[tmp.parents[k]] === undefined && tmp.parents[k] !== $.jstree.root) {
-									o[tmp.parents[k]] = true;
-									p.push(tmp.parents[k]);
-								}
-							}
-						}
-					}
-					else {
-						for(i = 0, j = tmp.children_d.length; i < j; i++) {
-							tmp2 = m[tmp.children_d[i]];
-							if(!tmp2.state.loaded && tmp2.original && tmp2.original.state && tmp2.original.state.undetermined && tmp2.original.state.undetermined === true) {
-								if(o[tmp2.id] === undefined && tmp2.id !== $.jstree.root) {
-									o[tmp2.id] = true;
-									p.push(tmp2.id);
-								}
-								for(k = 0, l = tmp2.parents.length; k < l; k++) {
-									if(o[tmp2.parents[k]] === undefined && tmp2.parents[k] !== $.jstree.root) {
-										o[tmp2.parents[k]] = true;
-										p.push(tmp2.parents[k]);
-									}
-								}
-							}
-						}
-					}
-				});
-			for (i = 0, j = p.length; i < j; i++) {
-				if(!m[p[i]].state[ t ? 'selected' : 'checked' ]) {
-					r.push(full ? m[p[i]] : p[i]);
-				}
-			}
-			return r;
-		};
-		/**
-		 * set the undetermined state where and if necessary. Used internally.
-		 * @private
-		 * @name _undetermined()
-		 * @plugin checkbox
-		 */
-		this._undetermined = function () {
-			if(this.element === null) { return; }
-			var p = this.get_undetermined(false), i, j, s;
-
-			this.element.find('.jstree-undetermined').removeClass('jstree-undetermined');
-			for (i = 0, j = p.length; i < j; i++) {
-				s = this.get_node(p[i], true);
-				if(s && s.length) {
-					s.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-undetermined');
-				}
-			}
-		};
-		this.redraw_node = function(obj, deep, is_callback, force_render) {
-			obj = parent.redraw_node.apply(this, arguments);
-			if(obj) {
-				var i, j, tmp = null, icon = null;
-				for(i = 0, j = obj.childNodes.length; i < j; i++) {
-					if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
-						tmp = obj.childNodes[i];
-						break;
-					}
-				}
-				if(tmp) {
-					if(!this.settings.checkbox.tie_selection && this._model.data[obj.id].state.checked) { tmp.className += ' jstree-checked'; }
-					icon = _i.cloneNode(false);
-					if(this._model.data[obj.id].state.checkbox_disabled) { icon.className += ' jstree-checkbox-disabled'; }
-					tmp.insertBefore(icon, tmp.childNodes[0]);
-				}
-			}
-			if(!is_callback && this.settings.checkbox.cascade.indexOf('undetermined') !== -1) {
-				if(this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); }
-				this._data.checkbox.uto = setTimeout(this._undetermined.bind(this), 50);
-			}
-			return obj;
-		};
-		/**
-		 * show the node checkbox icons
-		 * @name show_checkboxes()
-		 * @plugin checkbox
-		 */
-		this.show_checkboxes = function () { this._data.core.themes.checkboxes = true; this.get_container_ul().removeClass("jstree-no-checkboxes"); };
-		/**
-		 * hide the node checkbox icons
-		 * @name hide_checkboxes()
-		 * @plugin checkbox
-		 */
-		this.hide_checkboxes = function () { this._data.core.themes.checkboxes = false; this.get_container_ul().addClass("jstree-no-checkboxes"); };
-		/**
-		 * toggle the node icons
-		 * @name toggle_checkboxes()
-		 * @plugin checkbox
-		 */
-		this.toggle_checkboxes = function () { if(this._data.core.themes.checkboxes) { this.hide_checkboxes(); } else { this.show_checkboxes(); } };
-		/**
-		 * checks if a node is in an undetermined state
-		 * @name is_undetermined(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		this.is_undetermined = function (obj) {
-			obj = this.get_node(obj);
-			var s = this.settings.checkbox.cascade, i, j, t = this.settings.checkbox.tie_selection, d = this._data[ t ? 'core' : 'checkbox' ].selected, m = this._model.data;
-			if(!obj || obj.state[ t ? 'selected' : 'checked' ] === true || s.indexOf('undetermined') === -1 || (s.indexOf('down') === -1 && s.indexOf('up') === -1)) {
-				return false;
-			}
-			if(!obj.state.loaded && obj.original.state.undetermined === true) {
-				return true;
-			}
-			for(i = 0, j = obj.children_d.length; i < j; i++) {
-				if($.inArray(obj.children_d[i], d) !== -1 || (!m[obj.children_d[i]].state.loaded && m[obj.children_d[i]].original.state.undetermined)) {
-					return true;
-				}
-			}
-			return false;
-		};
-		/**
-		 * disable a node's checkbox
-		 * @name disable_checkbox(obj)
-		 * @param {mixed} obj an array can be used too
-		 * @trigger disable_checkbox.jstree
-		 * @plugin checkbox
-		 */
-		this.disable_checkbox = function (obj) {
-			var t1, t2, dom;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.disable_checkbox(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(!obj.state.checkbox_disabled) {
-				obj.state.checkbox_disabled = true;
-				if(dom && dom.length) {
-					dom.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-checkbox-disabled');
-				}
-				/**
-				 * triggered when an node's checkbox is disabled
-				 * @event
-				 * @name disable_checkbox.jstree
-				 * @param {Object} node
-				 * @plugin checkbox
-				 */
-				this.trigger('disable_checkbox', { 'node' : obj });
-			}
-		};
-		/**
-		 * enable a node's checkbox
-		 * @name enable_checkbox(obj)
-		 * @param {mixed} obj an array can be used too
-		 * @trigger enable_checkbox.jstree
-		 * @plugin checkbox
-		 */
-		this.enable_checkbox = function (obj) {
-			var t1, t2, dom;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.enable_checkbox(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(obj.state.checkbox_disabled) {
-				obj.state.checkbox_disabled = false;
-				if(dom && dom.length) {
-					dom.children('.jstree-anchor').children('.jstree-checkbox').removeClass('jstree-checkbox-disabled');
-				}
-				/**
-				 * triggered when an node's checkbox is enabled
-				 * @event
-				 * @name enable_checkbox.jstree
-				 * @param {Object} node
-				 * @plugin checkbox
-				 */
-				this.trigger('enable_checkbox', { 'node' : obj });
-			}
-		};
-
-		this.activate_node = function (obj, e) {
-			if($(e.target).hasClass('jstree-checkbox-disabled')) {
-				return false;
-			}
-			if(this.settings.checkbox.tie_selection && (this.settings.checkbox.whole_node || $(e.target).hasClass('jstree-checkbox'))) {
-				e.ctrlKey = true;
-			}
-			if(this.settings.checkbox.tie_selection || (!this.settings.checkbox.whole_node && !$(e.target).hasClass('jstree-checkbox'))) {
-				return parent.activate_node.call(this, obj, e);
-			}
-			if(this.is_disabled(obj)) {
-				return false;
-			}
-			if(this.is_checked(obj)) {
-				this.uncheck_node(obj, e);
-			}
-			else {
-				this.check_node(obj, e);
-			}
-			this.trigger('activate_node', { 'node' : this.get_node(obj) });
-		};
-		this.delete_node = function (obj) {
-			if(this.settings.checkbox.tie_selection || $.vakata.is_array(obj)) {
-				return parent.delete_node.call(this, obj);
-			}
-			var tmp, k, l, c = false;
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			tmp = obj.children_d.concat([]);
-			tmp.push(obj.id);
-			for(k = 0, l = tmp.length; k < l; k++) {
-				if(this._model.data[tmp[k]].state.checked) {
-					c = true;
-					break;
-				}
-			}
-			if (c) {
-				this._data.checkbox.selected = $.vakata.array_filter(this._data.checkbox.selected, function (v) {
-					return $.inArray(v, tmp) === -1;
-				});
-			}
-			return parent.delete_node.call(this, obj);
-		};
-
-		/**
-		 * Cascades checked state to a node and all its descendants. This function does NOT affect hidden and disabled nodes (or their descendants).
-		 * However if these unaffected nodes are already selected their ids will be included in the returned array.
-		 * @private
-		 * @name _cascade_new_checked_state(id, checkedState)
-		 * @param {string} id the node ID
-		 * @param {bool} checkedState should the nodes be checked or not
-		 * @returns {Array} Array of all node id's (in this tree branch) that are checked.
-		 */
-		this._cascade_new_checked_state = function (id, checkedState) {
-			var self = this;
-			var t = this.settings.checkbox.tie_selection;
-			var node = this._model.data[id];
-			var selectedNodeIds = [];
-			var selectedChildrenIds = [], i, j, selectedChildIds;
-
-			if (
-				(this.settings.checkbox.cascade_to_disabled || !node.state.disabled) &&
-				(this.settings.checkbox.cascade_to_hidden || !node.state.hidden)
-			) {
-				//First try and check/uncheck the children
-				if (node.children) {
-					for (i = 0, j = node.children.length; i < j; i++) {
-						var childId = node.children[i];
-						selectedChildIds = self._cascade_new_checked_state(childId, checkedState);
-						selectedNodeIds = selectedNodeIds.concat(selectedChildIds);
-						if (selectedChildIds.indexOf(childId) > -1) {
-							selectedChildrenIds.push(childId);
-						}
-					}
-				}
-
-				var dom = self.get_node(node, true);
-
-				//A node's state is undetermined if some but not all of it's children are checked/selected .
-				var undetermined = selectedChildrenIds.length > 0 && selectedChildrenIds.length < node.children.length;
-
-				if(node.original && node.original.state && node.original.state.undetermined) {
-					node.original.state.undetermined = undetermined;
-				}
-
-				//If a node is undetermined then remove selected class
-				if (undetermined) {
-					node.state[ t ? 'selected' : 'checked' ] = false;
-					dom.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked');
-				}
-				//Otherwise, if the checkedState === true (i.e. the node is being checked now) and all of the node's children are checked (if it has any children),
-				//check the node and style it correctly.
-				else if (checkedState && selectedChildrenIds.length === node.children.length) {
-					node.state[ t ? 'selected' : 'checked' ] = checkedState;
-					selectedNodeIds.push(node.id);
-
-					dom.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked');
-				}
-				else {
-					node.state[ t ? 'selected' : 'checked' ] = false;
-					dom.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked');
-				}
-			}
-			else {
-				selectedChildIds = this.get_checked_descendants(id);
-
-				if (node.state[ t ? 'selected' : 'checked' ]) {
-					selectedChildIds.push(node.id);
-				}
-
-				selectedNodeIds = selectedNodeIds.concat(selectedChildIds);
-			}
-
-			return selectedNodeIds;
-		};
-
-		/**
-		 * Gets ids of nodes selected in branch (of tree) specified by id (does not include the node specified by id)
-		 * @name get_checked_descendants(obj)
-		 * @param {string} id the node ID
-		 * @return {Array} array of IDs
-		 * @plugin checkbox
-		 */
-		this.get_checked_descendants = function (id) {
-			var self = this;
-			var t = self.settings.checkbox.tie_selection;
-			var node = self._model.data[id];
-
-			return $.vakata.array_filter(node.children_d, function(_id) {
-				return self._model.data[_id].state[ t ? 'selected' : 'checked' ];
-			});
-		};
-
-		/**
-		 * check a node (only if tie_selection in checkbox settings is false, otherwise select_node will be called internally)
-		 * @name check_node(obj)
-		 * @param {mixed} obj an array can be used to check multiple nodes
-		 * @trigger check_node.jstree
-		 * @plugin checkbox
-		 */
-		this.check_node = function (obj, e) {
-			if(this.settings.checkbox.tie_selection) { return this.select_node(obj, false, true, e); }
-			var dom, t1, t2, th;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.check_node(obj[t1], e);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(!obj.state.checked) {
-				obj.state.checked = true;
-				this._data.checkbox.selected.push(obj.id);
-				if(dom && dom.length) {
-					dom.children('.jstree-anchor').addClass('jstree-checked');
-				}
-				/**
-				 * triggered when an node is checked (only if tie_selection in checkbox settings is false)
-				 * @event
-				 * @name check_node.jstree
-				 * @param {Object} node
-				 * @param {Array} selected the current selection
-				 * @param {Object} event the event (if any) that triggered this check_node
-				 * @plugin checkbox
-				 */
-				this.trigger('check_node', { 'node' : obj, 'selected' : this._data.checkbox.selected, 'event' : e });
-			}
-		};
-		/**
-		 * uncheck a node (only if tie_selection in checkbox settings is false, otherwise deselect_node will be called internally)
-		 * @name uncheck_node(obj)
-		 * @param {mixed} obj an array can be used to uncheck multiple nodes
-		 * @trigger uncheck_node.jstree
-		 * @plugin checkbox
-		 */
-		this.uncheck_node = function (obj, e) {
-			if(this.settings.checkbox.tie_selection) { return this.deselect_node(obj, false, e); }
-			var t1, t2, dom;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.uncheck_node(obj[t1], e);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(obj.state.checked) {
-				obj.state.checked = false;
-				this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, obj.id);
-				if(dom.length) {
-					dom.children('.jstree-anchor').removeClass('jstree-checked');
-				}
-				/**
-				 * triggered when an node is unchecked (only if tie_selection in checkbox settings is false)
-				 * @event
-				 * @name uncheck_node.jstree
-				 * @param {Object} node
-				 * @param {Array} selected the current selection
-				 * @param {Object} event the event (if any) that triggered this uncheck_node
-				 * @plugin checkbox
-				 */
-				this.trigger('uncheck_node', { 'node' : obj, 'selected' : this._data.checkbox.selected, 'event' : e });
-			}
-		};
-		
-		/**
-		 * checks all nodes in the tree (only if tie_selection in checkbox settings is false, otherwise select_all will be called internally)
-		 * @name check_all()
-		 * @trigger check_all.jstree, changed.jstree
-		 * @plugin checkbox
-		 */
-		this.check_all = function () {
-			if(this.settings.checkbox.tie_selection) { return this.select_all(); }
-			var tmp = this._data.checkbox.selected.concat([]), i, j;
-			this._data.checkbox.selected = this._model.data[$.jstree.root].children_d.concat();
-			for(i = 0, j = this._data.checkbox.selected.length; i < j; i++) {
-				if(this._model.data[this._data.checkbox.selected[i]]) {
-					this._model.data[this._data.checkbox.selected[i]].state.checked = true;
-				}
-			}
-			this.redraw(true);
-			/**
-			 * triggered when all nodes are checked (only if tie_selection in checkbox settings is false)
-			 * @event
-			 * @name check_all.jstree
-			 * @param {Array} selected the current selection
-			 * @plugin checkbox
-			 */
-			this.trigger('check_all', { 'selected' : this._data.checkbox.selected });
-		};
-		/**
-		 * uncheck all checked nodes (only if tie_selection in checkbox settings is false, otherwise deselect_all will be called internally)
-		 * @name uncheck_all()
-		 * @trigger uncheck_all.jstree
-		 * @plugin checkbox
-		 */
-		this.uncheck_all = function () {
-			if(this.settings.checkbox.tie_selection) { return this.deselect_all(); }
-			var tmp = this._data.checkbox.selected.concat([]), i, j;
-			for(i = 0, j = this._data.checkbox.selected.length; i < j; i++) {
-				if(this._model.data[this._data.checkbox.selected[i]]) {
-					this._model.data[this._data.checkbox.selected[i]].state.checked = false;
-				}
-			}
-			this._data.checkbox.selected = [];
-			this.element.find('.jstree-checked').removeClass('jstree-checked');
-			/**
-			 * triggered when all nodes are unchecked (only if tie_selection in checkbox settings is false)
-			 * @event
-			 * @name uncheck_all.jstree
-			 * @param {Object} node the previous selection
-			 * @param {Array} selected the current selection
-			 * @plugin checkbox
-			 */
-			this.trigger('uncheck_all', { 'selected' : this._data.checkbox.selected, 'node' : tmp });
-		};
-		/**
-		 * checks if a node is checked (if tie_selection is on in the settings this function will return the same as is_selected)
-		 * @name is_checked(obj)
-		 * @param  {mixed}  obj
-		 * @return {Boolean}
-		 * @plugin checkbox
-		 */
-		this.is_checked = function (obj) {
-			if(this.settings.checkbox.tie_selection) { return this.is_selected(obj); }
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			return obj.state.checked;
-		};
-		/**
-		 * get an array of all checked nodes (if tie_selection is on in the settings this function will return the same as get_selected)
-		 * @name get_checked([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 * @plugin checkbox
-		 */
-		this.get_checked = function (full) {
-			if(this.settings.checkbox.tie_selection) { return this.get_selected(full); }
-			return full ? $.map(this._data.checkbox.selected, function (i) { return this.get_node(i); }.bind(this)) : this._data.checkbox.selected.slice();
-		};
-		/**
-		 * get an array of all top level checked nodes (ignoring children of checked nodes) (if tie_selection is on in the settings this function will return the same as get_top_selected)
-		 * @name get_top_checked([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 * @plugin checkbox
-		 */
-		this.get_top_checked = function (full) {
-			if(this.settings.checkbox.tie_selection) { return this.get_top_selected(full); }
-			var tmp = this.get_checked(true),
-				obj = {}, i, j, k, l;
-			for(i = 0, j = tmp.length; i < j; i++) {
-				obj[tmp[i].id] = tmp[i];
-			}
-			for(i = 0, j = tmp.length; i < j; i++) {
-				for(k = 0, l = tmp[i].children_d.length; k < l; k++) {
-					if(obj[tmp[i].children_d[k]]) {
-						delete obj[tmp[i].children_d[k]];
-					}
-				}
-			}
-			tmp = [];
-			for(i in obj) {
-				if(obj.hasOwnProperty(i)) {
-					tmp.push(i);
-				}
-			}
-			return full ? $.map(tmp, function (i) { return this.get_node(i); }.bind(this)) : tmp;
-		};
-		/**
-		 * get an array of all bottom level checked nodes (ignoring selected parents) (if tie_selection is on in the settings this function will return the same as get_bottom_selected)
-		 * @name get_bottom_checked([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 * @plugin checkbox
-		 */
-		this.get_bottom_checked = function (full) {
-			if(this.settings.checkbox.tie_selection) { return this.get_bottom_selected(full); }
-			var tmp = this.get_checked(true),
-				obj = [], i, j;
-			for(i = 0, j = tmp.length; i < j; i++) {
-				if(!tmp[i].children.length) {
-					obj.push(tmp[i].id);
-				}
-			}
-			return full ? $.map(obj, function (i) { return this.get_node(i); }.bind(this)) : obj;
-		};
-		this.load_node = function (obj, callback) {
-			var k, l, i, j, c, tmp;
-			if(!$.vakata.is_array(obj) && !this.settings.checkbox.tie_selection) {
-				tmp = this.get_node(obj);
-				if(tmp && tmp.state.loaded) {
-					for(k = 0, l = tmp.children_d.length; k < l; k++) {
-						if(this._model.data[tmp.children_d[k]].state.checked) {
-							c = true;
-							this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, tmp.children_d[k]);
-						}
-					}
-				}
-			}
-			return parent.load_node.apply(this, arguments);
-		};
-		this.get_state = function () {
-			var state = parent.get_state.apply(this, arguments);
-			if(this.settings.checkbox.tie_selection) { return state; }
-			state.checkbox = this._data.checkbox.selected.slice();
-			return state;
-		};
-		this.set_state = function (state, callback) {
-			var res = parent.set_state.apply(this, arguments);
-			if(res && state.checkbox) {
-				if(!this.settings.checkbox.tie_selection) {
-					this.uncheck_all();
-					var _this = this;
-					$.each(state.checkbox, function (i, v) {
-						_this.check_node(v);
-					});
-				}
-				delete state.checkbox;
-				this.set_state(state, callback);
-				return false;
-			}
-			return res;
-		};
-		this.refresh = function (skip_loading, forget_state) {
-			if(this.settings.checkbox.tie_selection) {
-				this._data.checkbox.selected = [];
-			}
-			return parent.refresh.apply(this, arguments);
-		};
-	};
-
-	// include the checkbox plugin by default
-	// $.jstree.defaults.plugins.push("checkbox");
-}));
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.conditionalselect.js b/public/ext/vakata-jstree-3.3.17/src/jstree.conditionalselect.js
deleted file mode 100644
index bad396b9b0..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.conditionalselect.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * ### Conditionalselect plugin
- *
- * This plugin allows defining a callback to allow or deny node selection by user input (activate node method).
- */
-/*globals jQuery, define, exports, require, document */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.conditionalselect', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.conditionalselect) { return; }
-
-	/**
-	 * a callback (function) which is invoked in the instance's scope and receives two arguments - the node and the event that triggered the `activate_node` call. Returning false prevents working with the node, returning true allows invoking activate_node. Defaults to returning `true`.
-	 * @name $.jstree.defaults.checkbox.visible
-	 * @plugin checkbox
-	 */
-	$.jstree.defaults.conditionalselect = function () { return true; };
-	$.jstree.plugins.conditionalselect = function (options, parent) {
-		// own function
-		this.activate_node = function (obj, e) {
-			if(this.settings.conditionalselect.call(this, this.get_node(obj), e)) {
-				return parent.activate_node.call(this, obj, e);
-			}
-		};
-	};
-
-}));
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.contextmenu.js b/public/ext/vakata-jstree-3.3.17/src/jstree.contextmenu.js
deleted file mode 100644
index 696bd134f8..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.contextmenu.js
+++ /dev/null
@@ -1,662 +0,0 @@
-/**
- * ### Contextmenu plugin
- *
- * Shows a context menu when a node is right-clicked.
- */
-/*globals jQuery, define, exports, require, document */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.contextmenu', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.contextmenu) { return; }
-
-	/**
-	 * stores all defaults for the contextmenu plugin
-	 * @name $.jstree.defaults.contextmenu
-	 * @plugin contextmenu
-	 */
-	$.jstree.defaults.contextmenu = {
-		/**
-		 * a boolean indicating if the node should be selected when the context menu is invoked on it. Defaults to `true`.
-		 * @name $.jstree.defaults.contextmenu.select_node
-		 * @plugin contextmenu
-		 */
-		select_node : true,
-		/**
-		 * a boolean indicating if the menu should be shown aligned with the node. Defaults to `true`, otherwise the mouse coordinates are used.
-		 * @name $.jstree.defaults.contextmenu.show_at_node
-		 * @plugin contextmenu
-		 */
-		show_at_node : true,
-		/**
-		 * an object of actions, or a function that accepts a node and a callback function and calls the callback function with an object of actions available for that node (you can also return the items too).
-		 *
-		 * Each action consists of a key (a unique name) and a value which is an object with the following properties (only label and action are required). Once a menu item is activated the `action` function will be invoked with an object containing the following keys: item - the contextmenu item definition as seen below, reference - the DOM node that was used (the tree node), element - the contextmenu DOM element, position - an object with x/y properties indicating the position of the menu.
-		 *
-		 * * `separator_before` - a boolean indicating if there should be a separator before this item
-		 * * `separator_after` - a boolean indicating if there should be a separator after this item
-		 * * `_disabled` - a boolean indicating if this action should be disabled
-		 * * `label` - a string - the name of the action (could be a function returning a string)
-		 * * `title` - a string - an optional tooltip for the item
-		 * * `action` - a function to be executed if this item is chosen, the function will receive 
-		 * * `icon` - a string, can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class
-		 * * `shortcut` - keyCode which will trigger the action if the menu is open (for example `113` for rename, which equals F2)
-		 * * `shortcut_label` - shortcut label (like for example `F2` for rename)
-		 * * `submenu` - an object with the same structure as $.jstree.defaults.contextmenu.items which can be used to create a submenu - each key will be rendered as a separate option in a submenu that will appear once the current item is hovered
-		 *
-		 * @name $.jstree.defaults.contextmenu.items
-		 * @plugin contextmenu
-		 */
-		items : function (o, cb) { // Could be an object directly
-			return {
-				"create" : {
-					"separator_before"	: false,
-					"separator_after"	: true,
-					"_disabled"			: false, //(this.check("create_node", data.reference, {}, "last")),
-					"label"				: "Create",
-					"action"			: function (data) {
-						var inst = $.jstree.reference(data.reference),
-							obj = inst.get_node(data.reference);
-						inst.create_node(obj, {}, "last", function (new_node) {
-							try {
-								inst.edit(new_node);
-							} catch (ex) {
-								setTimeout(function () { inst.edit(new_node); },0);
-							}
-						});
-					}
-				},
-				"rename" : {
-					"separator_before"	: false,
-					"separator_after"	: false,
-					"_disabled"			: false, //(this.check("rename_node", data.reference, this.get_parent(data.reference), "")),
-					"label"				: "Rename",
-					/*!
-					"shortcut"			: 113,
-					"shortcut_label"	: 'F2',
-					"icon"				: "glyphicon glyphicon-leaf",
-					*/
-					"action"			: function (data) {
-						var inst = $.jstree.reference(data.reference),
-							obj = inst.get_node(data.reference);
-						inst.edit(obj);
-					}
-				},
-				"remove" : {
-					"separator_before"	: false,
-					"icon"				: false,
-					"separator_after"	: false,
-					"_disabled"			: false, //(this.check("delete_node", data.reference, this.get_parent(data.reference), "")),
-					"label"				: "Delete",
-					"action"			: function (data) {
-						var inst = $.jstree.reference(data.reference),
-							obj = inst.get_node(data.reference);
-						if(inst.is_selected(obj)) {
-							inst.delete_node(inst.get_selected());
-						}
-						else {
-							inst.delete_node(obj);
-						}
-					}
-				},
-				"ccp" : {
-					"separator_before"	: true,
-					"icon"				: false,
-					"separator_after"	: false,
-					"label"				: "Edit",
-					"action"			: false,
-					"submenu" : {
-						"cut" : {
-							"separator_before"	: false,
-							"separator_after"	: false,
-							"label"				: "Cut",
-							"action"			: function (data) {
-								var inst = $.jstree.reference(data.reference),
-									obj = inst.get_node(data.reference);
-								if(inst.is_selected(obj)) {
-									inst.cut(inst.get_top_selected());
-								}
-								else {
-									inst.cut(obj);
-								}
-							}
-						},
-						"copy" : {
-							"separator_before"	: false,
-							"icon"				: false,
-							"separator_after"	: false,
-							"label"				: "Copy",
-							"action"			: function (data) {
-								var inst = $.jstree.reference(data.reference),
-									obj = inst.get_node(data.reference);
-								if(inst.is_selected(obj)) {
-									inst.copy(inst.get_top_selected());
-								}
-								else {
-									inst.copy(obj);
-								}
-							}
-						},
-						"paste" : {
-							"separator_before"	: false,
-							"icon"				: false,
-							"_disabled"			: function (data) {
-								return !$.jstree.reference(data.reference).can_paste();
-							},
-							"separator_after"	: false,
-							"label"				: "Paste",
-							"action"			: function (data) {
-								var inst = $.jstree.reference(data.reference),
-									obj = inst.get_node(data.reference);
-								inst.paste(obj);
-							}
-						}
-					}
-				}
-			};
-		}
-	};
-
-	$.jstree.plugins.contextmenu = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-
-			var last_ts = 0, cto = null, ex, ey;
-			this.element
-				.on("init.jstree loading.jstree ready.jstree", function () {
-						this.get_container_ul().addClass('jstree-contextmenu');
-					}.bind(this))
-				.on("contextmenu.jstree", ".jstree-anchor", function (e, data) {
-						if (e.target.tagName.toLowerCase() === 'input') {
-							return;
-						}
-						e.preventDefault();
-						last_ts = e.ctrlKey ? +new Date() : 0;
-						if(data || cto) {
-							last_ts = (+new Date()) + 10000;
-						}
-						if(cto) {
-							clearTimeout(cto);
-						}
-						if(!this.is_loading(e.currentTarget)) {
-							this.show_contextmenu(e.currentTarget, e.pageX, e.pageY, e);
-						}
-					}.bind(this))
-				.on("click.jstree", ".jstree-anchor", function (e) {
-						if(this._data.contextmenu.visible && (!last_ts || (+new Date()) - last_ts > 250)) { // work around safari & macOS ctrl+click
-							$.vakata.context.hide();
-						}
-						last_ts = 0;
-					}.bind(this))
-				.on("touchstart.jstree", ".jstree-anchor", function (e) {
-						if(!e.originalEvent || !e.originalEvent.changedTouches || !e.originalEvent.changedTouches[0]) {
-							return;
-						}
-						ex = e.originalEvent.changedTouches[0].clientX;
-						ey = e.originalEvent.changedTouches[0].clientY;
-						cto = setTimeout(function () {
-							$(e.currentTarget).trigger('contextmenu', true);
-						}, 750);
-					})
-				.on('touchmove.vakata.jstree', function (e) {
-						if(cto && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0] && (Math.abs(ex - e.originalEvent.changedTouches[0].clientX) > 10 || Math.abs(ey - e.originalEvent.changedTouches[0].clientY) > 10)) {
-							clearTimeout(cto);
-							$.vakata.context.hide();
-						}
-					})
-				.on('touchend.vakata.jstree', function (e) {
-						if(cto) {
-							clearTimeout(cto);
-						}
-					});
-
-			/*!
-			if(!('oncontextmenu' in document.body) && ('ontouchstart' in document.body)) {
-				var el = null, tm = null;
-				this.element
-					.on("touchstart", ".jstree-anchor", function (e) {
-						el = e.currentTarget;
-						tm = +new Date();
-						$(document).one("touchend", function (e) {
-							e.target = document.elementFromPoint(e.originalEvent.targetTouches[0].pageX - window.pageXOffset, e.originalEvent.targetTouches[0].pageY - window.pageYOffset);
-							e.currentTarget = e.target;
-							tm = ((+(new Date())) - tm);
-							if(e.target === el && tm > 600 && tm < 1000) {
-								e.preventDefault();
-								$(el).trigger('contextmenu', e);
-							}
-							el = null;
-							tm = null;
-						});
-					});
-			}
-			*/
-			$(document).on("context_hide.vakata.jstree", function (e, data) {
-				this._data.contextmenu.visible = false;
-				$(data.reference).removeClass('jstree-context');
-			}.bind(this));
-		};
-		this.teardown = function () {
-			if(this._data.contextmenu.visible) {
-				$.vakata.context.hide();
-			}
-			$(document).off("context_hide.vakata.jstree");
-			parent.teardown.call(this);
-		};
-
-		/**
-		 * prepare and show the context menu for a node
-		 * @name show_contextmenu(obj [, x, y])
-		 * @param {mixed} obj the node
-		 * @param {Number} x the x-coordinate relative to the document to show the menu at
-		 * @param {Number} y the y-coordinate relative to the document to show the menu at
-		 * @param {Object} e the event if available that triggered the contextmenu
-		 * @plugin contextmenu
-		 * @trigger show_contextmenu.jstree
-		 */
-		this.show_contextmenu = function (obj, x, y, e) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			var s = this.settings.contextmenu,
-				d = this.get_node(obj, true),
-				a = d.children(".jstree-anchor"),
-				o = false,
-				i = false;
-			if(s.show_at_node || x === undefined || y === undefined) {
-				o = a.offset();
-				x = o.left;
-				y = o.top + this._data.core.li_height;
-			}
-			if(this.settings.contextmenu.select_node && !this.is_selected(obj)) {
-				this.activate_node(obj, e);
-			}
-
-			i = s.items;
-			if($.vakata.is_function(i)) {
-				i = i.call(this, obj, function (i) {
-					this._show_contextmenu(obj, x, y, i);
-				}.bind(this));
-			}
-			if($.isPlainObject(i)) {
-				this._show_contextmenu(obj, x, y, i);
-			}
-		};
-		/**
-		 * show the prepared context menu for a node
-		 * @name _show_contextmenu(obj, x, y, i)
-		 * @param {mixed} obj the node
-		 * @param {Number} x the x-coordinate relative to the document to show the menu at
-		 * @param {Number} y the y-coordinate relative to the document to show the menu at
-		 * @param {Number} i the object of items to show
-		 * @plugin contextmenu
-		 * @trigger show_contextmenu.jstree
-		 * @private
-		 */
-		this._show_contextmenu = function (obj, x, y, i) {
-			var d = this.get_node(obj, true),
-				a = d.children(".jstree-anchor");
-			$(document).one("context_show.vakata.jstree", function (e, data) {
-				var cls = 'jstree-contextmenu jstree-' + this.get_theme() + '-contextmenu';
-				$(data.element).addClass(cls);
-				a.addClass('jstree-context');
-			}.bind(this));
-			this._data.contextmenu.visible = true;
-			$.vakata.context.show(a, { 'x' : x, 'y' : y }, i);
-			/**
-			 * triggered when the contextmenu is shown for a node
-			 * @event
-			 * @name show_contextmenu.jstree
-			 * @param {Object} node the node
-			 * @param {Number} x the x-coordinate of the menu relative to the document
-			 * @param {Number} y the y-coordinate of the menu relative to the document
-			 * @plugin contextmenu
-			 */
-			this.trigger('show_contextmenu', { "node" : obj, "x" : x, "y" : y });
-		};
-	};
-
-	// contextmenu helper
-	(function ($) {
-		var right_to_left = false,
-			vakata_context = {
-				element		: false,
-				reference	: false,
-				position_x	: 0,
-				position_y	: 0,
-				items		: [],
-				html		: "",
-				is_visible	: false
-			};
-
-		$.vakata.context = {
-			settings : {
-				hide_onmouseleave	: 0,
-				icons				: true
-			},
-			_trigger : function (event_name) {
-				$(document).triggerHandler("context_" + event_name + ".vakata", {
-					"reference"	: vakata_context.reference,
-					"element"	: vakata_context.element,
-					"position"	: {
-						"x" : vakata_context.position_x,
-						"y" : vakata_context.position_y
-					}
-				});
-			},
-			_execute : function (i) {
-				i = vakata_context.items[i];
-				return i && (!i._disabled || ($.vakata.is_function(i._disabled) && !i._disabled({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }))) && i.action ? i.action.call(null, {
-							"item"		: i,
-							"reference"	: vakata_context.reference,
-							"element"	: vakata_context.element,
-							"position"	: {
-								"x" : vakata_context.position_x,
-								"y" : vakata_context.position_y
-							}
-						}) : false;
-			},
-			_parse : function (o, is_callback) {
-				if(!o) { return false; }
-				if(!is_callback) {
-					vakata_context.html		= "";
-					vakata_context.items	= [];
-				}
-				var str = "",
-					sep = false,
-					tmp;
-
-				if(is_callback) { str += "<"+"ul>"; }
-				$.each(o, function (i, val) {
-					if(!val) { return true; }
-					vakata_context.items.push(val);
-					if(!sep && val.separator_before) {
-						str += "<"+"li class='vakata-context-separator'><"+"a href='#' " + ($.vakata.context.settings.icons ? '' : 'class="vakata-context-no-icons"') + ">&#160;<"+"/a><"+"/li>";
-					}
-					sep = false;
-					str += "<"+"li class='" + (val._class || "") + (val._disabled === true || ($.vakata.is_function(val._disabled) && val._disabled({ "item" : val, "reference" : vakata_context.reference, "element" : vakata_context.element })) ? " vakata-contextmenu-disabled " : "") + "' "+(val.shortcut?" data-shortcut='"+val.shortcut+"' ":'')+">";
-					str += "<"+"a href='#' rel='" + (vakata_context.items.length - 1) + "' " + (val.title ? "title='" + val.title + "'" : "") + ">";
-					if($.vakata.context.settings.icons) {
-						str += "<"+"i ";
-						if(val.icon) {
-							if(val.icon.indexOf("/") !== -1 || val.icon.indexOf(".") !== -1) { str += " style='background:url(\"" + val.icon + "\") center center no-repeat' "; }
-							else { str += " class='" + val.icon + "' "; }
-						}
-						str += "><"+"/i><"+"span class='vakata-contextmenu-sep'>&#160;<"+"/span>";
-					}
-					str += ($.vakata.is_function(val.label) ? val.label({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }) : val.label) + (val.shortcut?' <span class="vakata-contextmenu-shortcut vakata-contextmenu-shortcut-'+val.shortcut+'">'+ (val.shortcut_label || '') +'</span>':'') + "<"+"/a>";
-					if(val.submenu) {
-						tmp = $.vakata.context._parse(val.submenu, true);
-						if(tmp) { str += tmp; }
-					}
-					str += "<"+"/li>";
-					if(val.separator_after) {
-						str += "<"+"li class='vakata-context-separator'><"+"a href='#' " + ($.vakata.context.settings.icons ? '' : 'class="vakata-context-no-icons"') + ">&#160;<"+"/a><"+"/li>";
-						sep = true;
-					}
-				});
-				str  = str.replace(/<li class\='vakata-context-separator'\><\/li\>$/,"");
-				if(is_callback) { str += "</ul>"; }
-				/**
-				 * triggered on the document when the contextmenu is parsed (HTML is built)
-				 * @event
-				 * @plugin contextmenu
-				 * @name context_parse.vakata
-				 * @param {jQuery} reference the element that was right clicked
-				 * @param {jQuery} element the DOM element of the menu itself
-				 * @param {Object} position the x & y coordinates of the menu
-				 */
-				if(!is_callback) { vakata_context.html = str; $.vakata.context._trigger("parse"); }
-				return str.length > 10 ? str : false;
-			},
-			_show_submenu : function (o) {
-				o = $(o);
-				if(!o.length || !o.children("ul").length) { return; }
-				var e = o.children("ul"),
-					xl = o.offset().left,
-					x = xl + o.outerWidth(),
-					y = o.offset().top,
-					w = e.width(),
-					h = e.height(),
-					dw = $(window).width() + $(window).scrollLeft(),
-					dh = $(window).height() + $(window).scrollTop();
-				// може да се спести е една проверка - дали няма някой от класовете вече нагоре
-				if(right_to_left) {
-					o[x - (w + 10 + o.outerWidth()) < 0 ? "addClass" : "removeClass"]("vakata-context-left");
-				}
-				else {
-					o[x + w > dw  && xl > dw - x ? "addClass" : "removeClass"]("vakata-context-right");
-				}
-				if(y + h + 10 > dh) {
-					e.css("bottom","-1px");
-				}
-
-				//if does not fit - stick it to the side
-				if (o.hasClass('vakata-context-right')) {
-					if (xl < w) {
-						e.css("margin-right", xl - w);
-					}
-				} else {
-					if (dw - x < w) {
-						e.css("margin-left", dw - x - w);
-					}
-				}
-
-				e.show();
-			},
-			show : function (reference, position, data) {
-				var o, e, x, y, w, h, dw, dh, cond = true;
-				if(vakata_context.element && vakata_context.element.length) {
-					vakata_context.element.width('');
-				}
-				switch(cond) {
-					case (!position && !reference):
-						return false;
-					case (!!position && !!reference):
-						vakata_context.reference	= reference;
-						vakata_context.position_x	= position.x;
-						vakata_context.position_y	= position.y;
-						break;
-					case (!position && !!reference):
-						vakata_context.reference	= reference;
-						o = reference.offset();
-						vakata_context.position_x	= o.left + reference.outerHeight();
-						vakata_context.position_y	= o.top;
-						break;
-					case (!!position && !reference):
-						vakata_context.position_x	= position.x;
-						vakata_context.position_y	= position.y;
-						break;
-				}
-				if(!!reference && !data && $(reference).data('vakata_contextmenu')) {
-					data = $(reference).data('vakata_contextmenu');
-				}
-				if($.vakata.context._parse(data)) {
-					vakata_context.element.html(vakata_context.html);
-				}
-				if(vakata_context.items.length) {
-					vakata_context.element.appendTo(document.body);
-					e = vakata_context.element;
-					x = vakata_context.position_x;
-					y = vakata_context.position_y;
-					w = e.width();
-					h = e.height();
-					dw = $(window).width() + $(window).scrollLeft();
-					dh = $(window).height() + $(window).scrollTop();
-					if(right_to_left) {
-						x -= (e.outerWidth() - $(reference).outerWidth());
-						if(x < $(window).scrollLeft() + 20) {
-							x = $(window).scrollLeft() + 20;
-						}
-					}
-					if(x + w + 20 > dw) {
-						x = dw - (w + 20);
-					}
-					if(y + h + 20 > dh) {
-						y = dh - (h + 20);
-					}
-
-					vakata_context.element
-						.css({ "left" : x, "top" : y })
-						.show()
-						.find('a').first().trigger('focus').parent().addClass("vakata-context-hover");
-					vakata_context.is_visible = true;
-					/**
-					 * triggered on the document when the contextmenu is shown
-					 * @event
-					 * @plugin contextmenu
-					 * @name context_show.vakata
-					 * @param {jQuery} reference the element that was right clicked
-					 * @param {jQuery} element the DOM element of the menu itself
-					 * @param {Object} position the x & y coordinates of the menu
-					 */
-					$.vakata.context._trigger("show");
-				}
-			},
-			hide : function () {
-				if(vakata_context.is_visible) {
-					vakata_context.element.hide().find("ul").hide().end().find(':focus').trigger('blur').end().detach();
-					vakata_context.is_visible = false;
-					/**
-					 * triggered on the document when the contextmenu is hidden
-					 * @event
-					 * @plugin contextmenu
-					 * @name context_hide.vakata
-					 * @param {jQuery} reference the element that was right clicked
-					 * @param {jQuery} element the DOM element of the menu itself
-					 * @param {Object} position the x & y coordinates of the menu
-					 */
-					$.vakata.context._trigger("hide");
-				}
-			}
-		};
-		$(function () {
-			right_to_left = $(document.body).css("direction") === "rtl";
-			var to = false;
-
-			vakata_context.element = $("<ul class='vakata-context'></ul>");
-			vakata_context.element
-				.on("mouseenter", "li", function (e) {
-					e.stopImmediatePropagation();
-
-					if($.contains(this, e.relatedTarget)) {
-						// премахнато заради delegate mouseleave по-долу
-						// $(this).find(".vakata-context-hover").removeClass("vakata-context-hover");
-						return;
-					}
-
-					if(to) { clearTimeout(to); }
-					vakata_context.element.find(".vakata-context-hover").removeClass("vakata-context-hover").end();
-
-					$(this)
-						.siblings().find("ul").hide().end().end()
-						.parentsUntil(".vakata-context", "li").addBack().addClass("vakata-context-hover");
-					$.vakata.context._show_submenu(this);
-				})
-				// тестово - дали не натоварва?
-				.on("mouseleave", "li", function (e) {
-					if($.contains(this, e.relatedTarget)) { return; }
-					$(this).find(".vakata-context-hover").addBack().removeClass("vakata-context-hover");
-				})
-				.on("mouseleave", function (e) {
-					$(this).find(".vakata-context-hover").removeClass("vakata-context-hover");
-					if($.vakata.context.settings.hide_onmouseleave) {
-						to = setTimeout(
-							(function (t) {
-								return function () { $.vakata.context.hide(); };
-							}(this)), $.vakata.context.settings.hide_onmouseleave);
-					}
-				})
-				.on("click", "a", function (e) {
-					e.preventDefault();
-				//})
-				//.on("mouseup", "a", function (e) {
-					if(!$(this).trigger('blur').parent().hasClass("vakata-context-disabled") && $.vakata.context._execute($(this).attr("rel")) !== false) {
-						$.vakata.context.hide();
-					}
-				})
-				.on('keydown', 'a', function (e) {
-						var o = null;
-						switch(e.which) {
-							case 13:
-							case 32:
-								e.type = "click";
-								e.preventDefault();
-								$(e.currentTarget).trigger(e);
-								break;
-							case 37:
-								if(vakata_context.is_visible) {
-									vakata_context.element.find(".vakata-context-hover").last().closest("li").first().find("ul").hide().find(".vakata-context-hover").removeClass("vakata-context-hover").end().end().children('a').trigger('focus');
-									e.stopImmediatePropagation();
-									e.preventDefault();
-								}
-								break;
-							case 38:
-								if(vakata_context.is_visible) {
-									o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").prevAll("li:not(.vakata-context-separator)").first();
-									if(!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").last(); }
-									o.addClass("vakata-context-hover").children('a').trigger('focus');
-									e.stopImmediatePropagation();
-									e.preventDefault();
-								}
-								break;
-							case 39:
-								if(vakata_context.is_visible) {
-									vakata_context.element.find(".vakata-context-hover").last().children("ul").show().children("li:not(.vakata-context-separator)").removeClass("vakata-context-hover").first().addClass("vakata-context-hover").children('a').trigger('focus');
-									e.stopImmediatePropagation();
-									e.preventDefault();
-								}
-								break;
-							case 40:
-								if(vakata_context.is_visible) {
-									o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").nextAll("li:not(.vakata-context-separator)").first();
-									if(!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").first(); }
-									o.addClass("vakata-context-hover").children('a').trigger('focus');
-									e.stopImmediatePropagation();
-									e.preventDefault();
-								}
-								break;
-							case 27:
-								$.vakata.context.hide();
-								e.preventDefault();
-								break;
-							default:
-								//console.log(e.which);
-								break;
-						}
-					})
-				.on('keydown', function (e) {
-					e.preventDefault();
-					var a = vakata_context.element.find('.vakata-contextmenu-shortcut-' + e.which).parent();
-					if(a.parent().not('.vakata-context-disabled')) {
-						a.trigger('click');
-					}
-				});
-
-			$(document)
-				.on("mousedown.vakata.jstree", function (e) {
-					if(vakata_context.is_visible && vakata_context.element[0] !== e.target  && !$.contains(vakata_context.element[0], e.target)) {
-						$.vakata.context.hide();
-					}
-				})
-				.on("context_show.vakata.jstree", function (e, data) {
-					vakata_context.element.find("li:has(ul)").children("a").addClass("vakata-context-parent");
-					if(right_to_left) {
-						vakata_context.element.addClass("vakata-context-rtl").css("direction", "rtl");
-					}
-					// also apply a RTL class?
-					vakata_context.element.find("ul").hide().end();
-				});
-		});
-	}($));
-	// $.jstree.defaults.plugins.push("contextmenu");
-}));
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.dnd.js b/public/ext/vakata-jstree-3.3.17/src/jstree.dnd.js
deleted file mode 100644
index bd5a0eac3c..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.dnd.js
+++ /dev/null
@@ -1,681 +0,0 @@
-/**
- * ### Drag'n'drop plugin
- *
- * Enables dragging and dropping of nodes in the tree, resulting in a move or copy operations.
- */
-/*globals jQuery, define, exports, require, document */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.dnd', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.dnd) { return; }
-
-	/**
-	 * stores all defaults for the drag'n'drop plugin
-	 * @name $.jstree.defaults.dnd
-	 * @plugin dnd
-	 */
-	$.jstree.defaults.dnd = {
-		/**
-		 * a boolean indicating if a copy should be possible while dragging (by pressint the meta key or Ctrl). Defaults to `true`.
-		 * @name $.jstree.defaults.dnd.copy
-		 * @plugin dnd
-		 */
-		copy : true,
-		/**
-		 * a number indicating how long a node should remain hovered while dragging to be opened. Defaults to `500`.
-		 * @name $.jstree.defaults.dnd.open_timeout
-		 * @plugin dnd
-		 */
-		open_timeout : 500,
-		/**
-		 * a function invoked each time a node is about to be dragged, invoked in the tree's scope and receives the nodes about to be dragged as an argument (array) and the event that started the drag - return `false` to prevent dragging
-		 * @name $.jstree.defaults.dnd.is_draggable
-		 * @plugin dnd
-		 */
-		is_draggable : true,
-		/**
-		 * a boolean indicating if checks should constantly be made while the user is dragging the node (as opposed to checking only on drop), default is `true`
-		 * @name $.jstree.defaults.dnd.check_while_dragging
-		 * @plugin dnd
-		 */
-		check_while_dragging : true,
-		/**
-		 * a boolean indicating if nodes from this tree should only be copied with dnd (as opposed to moved), default is `false`
-		 * @name $.jstree.defaults.dnd.always_copy
-		 * @plugin dnd
-		 */
-		always_copy : false,
-		/**
-		 * when dropping a node "inside", this setting indicates the position the node should go to - it can be an integer or a string: "first" (same as 0) or "last", default is `0`
-		 * @name $.jstree.defaults.dnd.inside_pos
-		 * @plugin dnd
-		 */
-		inside_pos : 0,
-		/**
-		 * when starting the drag on a node that is selected this setting controls if all selected nodes are dragged or only the single node, default is `true`, which means all selected nodes are dragged when the drag is started on a selected node
-		 * @name $.jstree.defaults.dnd.drag_selection
-		 * @plugin dnd
-		 */
-		drag_selection : true,
-		/**
-		 * controls whether dnd works on touch devices. If left as boolean true dnd will work the same as in desktop browsers, which in some cases may impair scrolling. If set to boolean false dnd will not work on touch devices. There is a special third option - string "selected" which means only selected nodes can be dragged on touch devices.
-		 * @name $.jstree.defaults.dnd.touch
-		 * @plugin dnd
-		 */
-		touch : true,
-		/**
-		 * controls whether items can be dropped anywhere on the node, not just on the anchor, by default only the node anchor is a valid drop target. Works best with the wholerow plugin. If enabled on mobile depending on the interface it might be hard for the user to cancel the drop, since the whole tree container will be a valid drop target.
-		 * @name $.jstree.defaults.dnd.large_drop_target
-		 * @plugin dnd
-		 */
-		large_drop_target : false,
-		/**
-		 * controls whether a drag can be initiated from any part of the node and not just the text/icon part, works best with the wholerow plugin. Keep in mind it can cause problems with tree scrolling on mobile depending on the interface - in that case set the touch option to "selected".
-		 * @name $.jstree.defaults.dnd.large_drag_target
-		 * @plugin dnd
-		 */
-		large_drag_target : false,
-		/**
-		 * controls whether use HTML5 dnd api instead of classical. That will allow better integration of dnd events with other HTML5 controls.
-		 * @reference http://caniuse.com/#feat=dragndrop
-		 * @name $.jstree.defaults.dnd.use_html5
-		 * @plugin dnd
-		 */
-		use_html5: false,
-		/**
-		 * controls whether items can be dropped anywhere on the tree.
-		 * @name $.jstree.defaults.dnd.blank_space_drop
-		 * @plugin dnd
-		 */
-		blank_space_drop: false
-	};
-	var drg, elm;
-	// TODO: now check works by checking for each node individually, how about max_children, unique, etc?
-	$.jstree.plugins.dnd = function (options, parent) {
-		this.init = function (el, options) {
-			parent.init.call(this, el, options);
-			this.settings.dnd.use_html5 = this.settings.dnd.use_html5 && ('draggable' in document.createElement('span'));
-		};
-		this.bind = function () {
-			parent.bind.call(this);
-
-			this.element
-				.on(this.settings.dnd.use_html5 ? 'dragstart.jstree' : 'mousedown.jstree touchstart.jstree', this.settings.dnd.large_drag_target ? '.jstree-node' : '.jstree-anchor', function (e) {
-						if(this.settings.dnd.large_drag_target && $(e.target).closest('.jstree-node')[0] !== e.currentTarget) {
-							return true;
-						}
-						if(e.type === "touchstart" && (!this.settings.dnd.touch || (this.settings.dnd.touch === 'selected' && !$(e.currentTarget).closest('.jstree-node').children('.jstree-anchor').hasClass('jstree-clicked')))) {
-							return true;
-						}
-						var obj = this.get_node(e.target),
-							mlt = this.is_selected(obj) && this.settings.dnd.drag_selection ? this.get_top_selected().length : 1,
-							txt = (mlt > 1 ? mlt + ' ' + this.get_string('nodes') : this.get_text(e.currentTarget));
-						if(this.settings.core.force_text) {
-							txt = $.vakata.html.escape(txt);
-						}
-						if(obj && (obj.id || obj.id === 0) && obj.id !== $.jstree.root && (e.which === 1 || e.type === "touchstart" || e.type === "dragstart") &&
-							(this.settings.dnd.is_draggable === true || ($.vakata.is_function(this.settings.dnd.is_draggable) && this.settings.dnd.is_draggable.call(this, (mlt > 1 ? this.get_top_selected(true) : [obj]), e)))
-						) {
-							drg = { 'jstree' : true, 'origin' : this, 'obj' : this.get_node(obj,true), 'nodes' : mlt > 1 ? this.get_top_selected() : [obj.id] };
-							elm = e.currentTarget;
-							if (this.settings.dnd.use_html5) {
-								$.vakata.dnd._trigger('start', e, { 'helper': $(), 'element': elm, 'data': drg });
-							} else {
-								this.element.trigger('mousedown.jstree');
-								return $.vakata.dnd.start(e, drg, '<div id="jstree-dnd" class="jstree-' + this.get_theme() + ' jstree-' + this.get_theme() + '-' + this.get_theme_variant() + ' ' + ( this.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ) + '"><i class="jstree-icon jstree-er"></i>' + txt + '<ins class="jstree-copy">+</ins></div>');
-							}
-						}
-					}.bind(this));
-			if (this.settings.dnd.use_html5) {
-				this.element
-					.on('dragover.jstree', function (e) {
-							e.preventDefault();
-							$.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg });
-							return false;
-						})
-					//.on('dragenter.jstree', this.settings.dnd.large_drop_target ? '.jstree-node' : '.jstree-anchor', $.proxy(function (e) {
-					//		e.preventDefault();
-					//		$.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg });
-					//		return false;
-					//	}, this))
-					.on('drop.jstree', function (e) {
-							e.preventDefault();
-							$.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg });
-							return false;
-						}.bind(this));
-			}
-		};
-		this.redraw_node = function(obj, deep, callback, force_render) {
-			obj = parent.redraw_node.apply(this, arguments);
-			if (obj && this.settings.dnd.use_html5) {
-				if (this.settings.dnd.large_drag_target) {
-					obj.setAttribute('draggable', true);
-				} else {
-					var i, j, tmp = null;
-					for(i = 0, j = obj.childNodes.length; i < j; i++) {
-						if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
-							tmp = obj.childNodes[i];
-							break;
-						}
-					}
-					if(tmp) {
-						tmp.setAttribute('draggable', true);
-					}
-				}
-			}
-			return obj;
-		};
-	};
-
-	$(function() {
-		// bind only once for all instances
-		var lastmv = false,
-			laster = false,
-			lastev = false,
-			opento = false,
-			marker = $('<div id="jstree-marker">&#160;</div>').hide(); //.appendTo('body');
-
-		$(document)
-			.on('dragover.vakata.jstree', function (e) {
-				if (elm) {
-					$.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg });
-				}
-			})
-			.on('drop.vakata.jstree', function (e) {
-				if (elm) {
-					$.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg });
-					elm = null;
-					drg = null;
-				}
-			})
-			.on('dnd_start.vakata.jstree', function (e, data) {
-				lastmv = false;
-				lastev = false;
-				if(!data || !data.data || !data.data.jstree) { return; }
-				marker.appendTo(document.body); //.show();
-			})
-			.on('dnd_move.vakata.jstree', function (e, data) {
-				var isDifferentNode = data.event.target !== lastev.target;
-				if(opento) {
-					if (!data.event || data.event.type !== 'dragover' || isDifferentNode) {
-						clearTimeout(opento);
-					}
-				}
-				if(!data || !data.data || !data.data.jstree) { return; }
-
-				// if we are hovering the marker image do nothing (can happen on "inside" drags)
-				if(data.event.target.id && data.event.target.id === 'jstree-marker') {
-					return;
-				}
-				lastev = data.event;
-
-				var ins = $.jstree.reference(data.event.target),
-					ref = false,
-					off = false,
-					rel = false,
-					tmp, l, t, h, p, i, o, ok, t1, t2, op, ps, pr, ip, tm, is_copy, pn, c;
-				// if we are over an instance
-				if(ins && ins._data && ins._data.dnd) {
-					marker.attr('class', 'jstree-' + ins.get_theme() + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ));
-					is_copy = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)));
-					data.helper
-						.children().attr('class', 'jstree-' + ins.get_theme() + ' jstree-' + ins.get_theme() + '-' + ins.get_theme_variant() + ' ' + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ))
-						.find('.jstree-copy').first()[ is_copy ? 'show' : 'hide' ]();
-
-					// if are hovering the container itself add a new root node
-					//console.log(data.event);
-					if( (data.event.target === ins.element[0] || data.event.target === ins.get_container_ul()[0]) && (ins.get_container_ul().children().length === 0 || ins.settings.dnd.blank_space_drop)) {
-						ok = true;
-						for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {
-							ok = ok && ins.check( (data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)) ) ? "copy_node" : "move_node"), (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), $.jstree.root, 'last', { 'dnd' : true, 'ref' : ins.get_node($.jstree.root), 'pos' : 'i', 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) });
-							if(!ok) { break; }
-						}
-						if(ok) {
-							lastmv = { 'ins' : ins, 'par' : $.jstree.root, 'pos' : 'last' };
-							marker.hide();
-							data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');
-							if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {
-								data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move';
-							}
-							return;
-						}
-					}
-					else {
-						// if we are hovering a tree node
-						ref = ins.settings.dnd.large_drop_target ? $(data.event.target).closest('.jstree-node').children('.jstree-anchor') : $(data.event.target).closest('.jstree-anchor');
-						
-						if(ref && ref.length && ref.parent().is('.jstree-closed, .jstree-open, .jstree-leaf')) {
-							off = ref.offset();
-							rel = (data.event.pageY !== undefined ? data.event.pageY : data.event.originalEvent.pageY) - off.top;
-							h = ref.outerHeight();
-							if(rel < h / 3) {
-								o = ['b', 'i', 'a'];
-							}
-							else if(rel > h - h / 3) {
-								o = ['a', 'i', 'b'];
-							}
-							else {
-								o = rel > h / 2 ? ['i', 'a', 'b'] : ['i', 'b', 'a'];
-							}
-							$.each(o, function (j, v) {
-								switch(v) {
-									case 'b':
-										l = off.left - 6;
-										t = off.top;
-										p = ins.get_parent(ref);
-										i = ref.parent().index();
-										c = 'jstree-below';
-										break;
-									case 'i':
-										ip = ins.settings.dnd.inside_pos;
-										tm = ins.get_node(ref.parent());
-										l = off.left - 2;
-										t = off.top + h / 2 + 1;
-										p = tm.id;
-										i = ip === 'first' ? 0 : (ip === 'last' ? tm.children.length : Math.min(ip, tm.children.length));
-										c = 'jstree-inside';
-										break;
-									case 'a':
-										l = off.left - 6;
-										t = off.top + h;
-										p = ins.get_parent(ref);
-										i = ref.parent().index() + 1;
-										c = 'jstree-above';
-										break;
-								}
-								ok = true;
-								for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {
-									op = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? "copy_node" : "move_node";
-									ps = i;
-									if(op === "move_node" && v === 'a' && (data.data.origin && data.data.origin === ins) && p === ins.get_parent(data.data.nodes[t1])) {
-										pr = ins.get_node(p);
-										if(ps > $.inArray(data.data.nodes[t1], pr.children)) {
-											ps -= 1;
-										}
-									}
-									ok = ok && ( (ins && ins.settings && ins.settings.dnd && ins.settings.dnd.check_while_dragging === false) || ins.check(op, (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), p, ps, { 'dnd' : true, 'ref' : ins.get_node(ref.parent()), 'pos' : v, 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) }) );
-									if(!ok) {
-										if(ins && ins.last_error) { laster = ins.last_error(); }
-										break;
-									}
-								}
-								if(v === 'i' && ref.parent().is('.jstree-closed') && ins.settings.dnd.open_timeout) {
-									if (!data.event || data.event.type !== 'dragover' || isDifferentNode) {
-										if (opento) { clearTimeout(opento); }
-										opento = setTimeout((function (x, z) { return function () { x.open_node(z); }; }(ins, ref)), ins.settings.dnd.open_timeout);
-									}
-								}
-								if(ok) {
-									pn = ins.get_node(p, true);
-									if (!pn.hasClass('.jstree-dnd-parent')) {
-										$('.jstree-dnd-parent').removeClass('jstree-dnd-parent');
-										pn.addClass('jstree-dnd-parent');
-									}
-									lastmv = { 'ins' : ins, 'par' : p, 'pos' : v === 'i' && ip === 'last' && i === 0 && !ins.is_loaded(tm) ? 'last' : i };
-									marker.css({ 'left' : l + 'px', 'top' : t + 'px' }).show();
-									marker.removeClass('jstree-above jstree-inside jstree-below').addClass(c);
-									data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');
-									if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {
-										data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move';
-									}
-									laster = {};
-									o = true;
-									return false;
-								}
-							});
-							if(o === true) { return; }
-						}
-					}
-				}
-				$('.jstree-dnd-parent').removeClass('jstree-dnd-parent');
-				lastmv = false;
-				data.helper.find('.jstree-icon').removeClass('jstree-ok').addClass('jstree-er');
-				if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {
-					//data.event.originalEvent.dataTransfer.dropEffect = 'none';
-				}
-				marker.hide();
-			})
-			.on('dnd_scroll.vakata.jstree', function (e, data) {
-				if(!data || !data.data || !data.data.jstree) { return; }
-				marker.hide();
-				lastmv = false;
-				lastev = false;
-				data.helper.find('.jstree-icon').first().removeClass('jstree-ok').addClass('jstree-er');
-			})
-			.on('dnd_stop.vakata.jstree', function (e, data) {
-				$('.jstree-dnd-parent').removeClass('jstree-dnd-parent');
-				if(opento) { clearTimeout(opento); }
-				if(!data || !data.data || !data.data.jstree) { return; }
-				marker.hide().detach();
-				var i, j, nodes = [];
-				if(lastmv) {
-					for(i = 0, j = data.data.nodes.length; i < j; i++) {
-						nodes[i] = data.data.origin ? data.data.origin.get_node(data.data.nodes[i]) : data.data.nodes[i];
-					}
-					lastmv.ins[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? 'copy_node' : 'move_node' ](nodes, lastmv.par, lastmv.pos, false, false, false, data.data.origin);
-				}
-				else {
-					i = $(data.event.target).closest('.jstree');
-					if(i.length && laster && laster.error && laster.error === 'check') {
-						i = i.jstree(true);
-						if(i) {
-							i.settings.core.error.call(this, laster);
-						}
-					}
-				}
-				lastev = false;
-				lastmv = false;
-			})
-			.on('keyup.jstree keydown.jstree', function (e, data) {
-				data = $.vakata.dnd._get();
-				if(data && data.data && data.data.jstree) {
-					if (e.type === "keyup" && e.which === 27) {
-						if (opento) { clearTimeout(opento); }
-						lastmv = false;
-						laster = false;
-						lastev = false;
-						opento = false;
-						marker.hide().detach();
-						$.vakata.dnd._clean();
-					} else {
-						data.helper.find('.jstree-copy').first()[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (e.metaKey || e.ctrlKey))) ? 'show' : 'hide' ]();
-						if(lastev) {
-							lastev.metaKey = e.metaKey;
-							lastev.ctrlKey = e.ctrlKey;
-							$.vakata.dnd._trigger('move', lastev);
-						}
-					}
-				}
-			});
-	});
-
-	// helpers
-	(function ($) {
-		$.vakata.html = {
-			div : $('<div></div>'),
-			escape : function (str) {
-				return $.vakata.html.div.text(str).html();
-			},
-			strip : function (str) {
-				return $.vakata.html.div.empty().append($.parseHTML(str)).text();
-			}
-		};
-		// private variable
-		var vakata_dnd = {
-			element	: false,
-			target	: false,
-			is_down	: false,
-			is_drag	: false,
-			helper	: false,
-			helper_w: 0,
-			data	: false,
-			init_x	: 0,
-			init_y	: 0,
-			scroll_l: 0,
-			scroll_t: 0,
-			scroll_e: false,
-			scroll_i: false,
-			is_touch: false
-		};
-		$.vakata.dnd = {
-			settings : {
-				scroll_speed		: 10,
-				scroll_proximity	: 20,
-				helper_left			: 5,
-				helper_top			: 10,
-				threshold			: 5,
-				threshold_touch		: 10
-			},
-			_trigger : function (event_name, e, data) {
-				if (data === undefined) {
-					data = $.vakata.dnd._get();
-				}
-				data.event = e;
-				$(document).triggerHandler("dnd_" + event_name + ".vakata", data);
-			},
-			_get : function () {
-				return {
-					"data"		: vakata_dnd.data,
-					"element"	: vakata_dnd.element,
-					"helper"	: vakata_dnd.helper
-				};
-			},
-			_clean : function () {
-				if(vakata_dnd.helper) { vakata_dnd.helper.remove(); }
-				if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; }
-				vakata_dnd = {
-					element	: false,
-					target	: false,
-					is_down	: false,
-					is_drag	: false,
-					helper	: false,
-					helper_w: 0,
-					data	: false,
-					init_x	: 0,
-					init_y	: 0,
-					scroll_l: 0,
-					scroll_t: 0,
-					scroll_e: false,
-					scroll_i: false,
-					is_touch: false
-				};
-				elm = null;
-				$(document).off("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag);
-				$(document).off("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop);
-			},
-			_scroll : function (init_only) {
-				if(!vakata_dnd.scroll_e || (!vakata_dnd.scroll_l && !vakata_dnd.scroll_t)) {
-					if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; }
-					return false;
-				}
-				if(!vakata_dnd.scroll_i) {
-					vakata_dnd.scroll_i = setInterval($.vakata.dnd._scroll, 100);
-					return false;
-				}
-				if(init_only === true) { return false; }
-
-				var i = vakata_dnd.scroll_e.scrollTop(),
-					j = vakata_dnd.scroll_e.scrollLeft();
-				vakata_dnd.scroll_e.scrollTop(i + vakata_dnd.scroll_t * $.vakata.dnd.settings.scroll_speed);
-				vakata_dnd.scroll_e.scrollLeft(j + vakata_dnd.scroll_l * $.vakata.dnd.settings.scroll_speed);
-				if(i !== vakata_dnd.scroll_e.scrollTop() || j !== vakata_dnd.scroll_e.scrollLeft()) {
-					/**
-					 * triggered on the document when a drag causes an element to scroll
-					 * @event
-					 * @plugin dnd
-					 * @name dnd_scroll.vakata
-					 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
-					 * @param {DOM} element the DOM element being dragged
-					 * @param {jQuery} helper the helper shown next to the mouse
-					 * @param {jQuery} event the element that is scrolling
-					 */
-					$.vakata.dnd._trigger("scroll", vakata_dnd.scroll_e);
-				}
-			},
-			start : function (e, data, html) {
-				if(e.type === "touchstart" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
-					e.pageX = e.originalEvent.changedTouches[0].pageX;
-					e.pageY = e.originalEvent.changedTouches[0].pageY;
-					e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
-				}
-				if(vakata_dnd.is_drag) { $.vakata.dnd.stop({}); }
-				try {
-					e.currentTarget.unselectable = "on";
-					e.currentTarget.onselectstart = function() { return false; };
-					if(e.currentTarget.style) {
-						e.currentTarget.style.touchAction = "none";
-						e.currentTarget.style.msTouchAction = "none";
-						e.currentTarget.style.MozUserSelect = "none";
-					}
-				} catch(ignore) { }
-				vakata_dnd.init_x	= e.pageX;
-				vakata_dnd.init_y	= e.pageY;
-				vakata_dnd.data		= data;
-				vakata_dnd.is_down	= true;
-				vakata_dnd.element	= e.currentTarget;
-				vakata_dnd.target	= e.target;
-				vakata_dnd.is_touch	= e.type === "touchstart";
-				if(html !== false) {
-					vakata_dnd.helper = $("<div id='vakata-dnd'></div>").html(html).css({
-						"display"		: "block",
-						"margin"		: "0",
-						"padding"		: "0",
-						"position"		: "absolute",
-						"top"			: "-2000px",
-						"lineHeight"	: "16px",
-						"zIndex"		: "10000"
-					});
-				}
-				$(document).on("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag);
-				$(document).on("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop);
-				return false;
-			},
-			drag : function (e) {
-				if(e.type === "touchmove" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
-					e.pageX = e.originalEvent.changedTouches[0].pageX;
-					e.pageY = e.originalEvent.changedTouches[0].pageY;
-					e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
-				}
-				if(!vakata_dnd.is_down) { return; }
-				if(!vakata_dnd.is_drag) {
-					if(
-						Math.abs(e.pageX - vakata_dnd.init_x) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) ||
-						Math.abs(e.pageY - vakata_dnd.init_y) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold)
-					) {
-						if(vakata_dnd.helper) {
-							vakata_dnd.helper.appendTo(document.body);
-							vakata_dnd.helper_w = vakata_dnd.helper.outerWidth();
-						}
-						vakata_dnd.is_drag = true;
-						$(vakata_dnd.target).one('click.vakata', false);
-						/**
-						 * triggered on the document when a drag starts
-						 * @event
-						 * @plugin dnd
-						 * @name dnd_start.vakata
-						 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
-						 * @param {DOM} element the DOM element being dragged
-						 * @param {jQuery} helper the helper shown next to the mouse
-						 * @param {Object} event the event that caused the start (probably mousemove)
-						 */
-						$.vakata.dnd._trigger("start", e);
-					}
-					else { return; }
-				}
-
-				var d  = false, w  = false,
-					dh = false, wh = false,
-					dw = false, ww = false,
-					dt = false, dl = false,
-					ht = false, hl = false;
-
-				vakata_dnd.scroll_t = 0;
-				vakata_dnd.scroll_l = 0;
-				vakata_dnd.scroll_e = false;
-				$($(e.target).parentsUntil("body").addBack().get().reverse())
-					.filter(function () {
-						return	this.ownerDocument && (/^auto|scroll$/).test($(this).css("overflow")) &&
-								(this.scrollHeight > this.offsetHeight || this.scrollWidth > this.offsetWidth);
-					})
-					.each(function () {
-						var t = $(this), o = t.offset();
-						if(this.scrollHeight > this.offsetHeight) {
-							if(o.top + t.height() - e.pageY < $.vakata.dnd.settings.scroll_proximity)	{ vakata_dnd.scroll_t = 1; }
-							if(e.pageY - o.top < $.vakata.dnd.settings.scroll_proximity)				{ vakata_dnd.scroll_t = -1; }
-						}
-						if(this.scrollWidth > this.offsetWidth) {
-							if(o.left + t.width() - e.pageX < $.vakata.dnd.settings.scroll_proximity)	{ vakata_dnd.scroll_l = 1; }
-							if(e.pageX - o.left < $.vakata.dnd.settings.scroll_proximity)				{ vakata_dnd.scroll_l = -1; }
-						}
-						if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) {
-							vakata_dnd.scroll_e = $(this);
-							return false;
-						}
-					});
-
-				if(!vakata_dnd.scroll_e) {
-					d  = $(document); w = $(window);
-					dh = d.height(); wh = w.height();
-					dw = d.width(); ww = w.width();
-					dt = d.scrollTop(); dl = d.scrollLeft();
-					if(dh > wh && e.pageY - dt < $.vakata.dnd.settings.scroll_proximity)		{ vakata_dnd.scroll_t = -1;  }
-					if(dh > wh && wh - (e.pageY - dt) < $.vakata.dnd.settings.scroll_proximity)	{ vakata_dnd.scroll_t = 1; }
-					if(dw > ww && e.pageX - dl < $.vakata.dnd.settings.scroll_proximity)		{ vakata_dnd.scroll_l = -1; }
-					if(dw > ww && ww - (e.pageX - dl) < $.vakata.dnd.settings.scroll_proximity)	{ vakata_dnd.scroll_l = 1; }
-					if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) {
-						vakata_dnd.scroll_e = d;
-					}
-				}
-				if(vakata_dnd.scroll_e) { $.vakata.dnd._scroll(true); }
-
-				if(vakata_dnd.helper) {
-					ht = parseInt(e.pageY + $.vakata.dnd.settings.helper_top, 10);
-					hl = parseInt(e.pageX + $.vakata.dnd.settings.helper_left, 10);
-					if(dh && ht + 25 > dh) { ht = dh - 50; }
-					if(dw && hl + vakata_dnd.helper_w > dw) { hl = dw - (vakata_dnd.helper_w + 2); }
-					vakata_dnd.helper.css({
-						left	: hl + "px",
-						top		: ht + "px"
-					});
-				}
-				/**
-				 * triggered on the document when a drag is in progress
-				 * @event
-				 * @plugin dnd
-				 * @name dnd_move.vakata
-				 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
-				 * @param {DOM} element the DOM element being dragged
-				 * @param {jQuery} helper the helper shown next to the mouse
-				 * @param {Object} event the event that caused this to trigger (most likely mousemove)
-				 */
-				$.vakata.dnd._trigger("move", e);
-				return false;
-			},
-			stop : function (e) {
-				if(e.type === "touchend" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
-					e.pageX = e.originalEvent.changedTouches[0].pageX;
-					e.pageY = e.originalEvent.changedTouches[0].pageY;
-					e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
-				}
-				if(vakata_dnd.is_drag) {
-					/**
-					 * triggered on the document when a drag stops (the dragged element is dropped)
-					 * @event
-					 * @plugin dnd
-					 * @name dnd_stop.vakata
-					 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
-					 * @param {DOM} element the DOM element being dragged
-					 * @param {jQuery} helper the helper shown next to the mouse
-					 * @param {Object} event the event that caused the stop
-					 */
-					if (e.target !== vakata_dnd.target) {
-						$(vakata_dnd.target).off('click.vakata');
-					}
-					$.vakata.dnd._trigger("stop", e);
-				}
-				else {
-					if(e.type === "touchend" && e.target === vakata_dnd.target) {
-						var to = setTimeout(function () { $(e.target).trigger('click'); }, 100);
-						$(e.target).one('click', function() { if(to) { clearTimeout(to); } });
-					}
-				}
-				$.vakata.dnd._clean();
-				return false;
-			}
-		};
-	}($));
-
-	// include the dnd plugin by default
-	// $.jstree.defaults.plugins.push("dnd");
-}));
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.js b/public/ext/vakata-jstree-3.3.17/src/jstree.js
deleted file mode 100644
index d1175caeaa..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.js
+++ /dev/null
@@ -1,5028 +0,0 @@
-/*!
- * jsTree {{VERSION}}
- * http://jstree.com/
- *
- * Copyright (c) 2014 Ivan Bozhanov (http://vakata.com)
- *
- * Licensed same as jquery - under the terms of the MIT License
- *   http://www.opensource.org/licenses/mit-license.php
- */
-/*!
- * if using jslint please allow for the jQuery global and use following options:
- * jslint: loopfunc: true, browser: true, ass: true, bitwise: true, continue: true, nomen: true, plusplus: true, regexp: true, unparam: true, todo: true, white: true
- */
-/*jshint -W083 */
-/*globals jQuery, define, module, exports, require, window, document, postMessage */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define(['jquery'], factory);
-	}
-	else if(typeof module !== 'undefined' && module.exports) {
-		module.exports = factory(require('jquery'));
-	}
-	else {
-		factory(jQuery);
-	}
-}(function ($, undefined) {
-	"use strict";
-
-	// prevent another load? maybe there is a better way?
-	if($.jstree) {
-		return;
-	}
-
-	/**
-	 * ### jsTree core functionality
-	 */
-
-	// internal variables
-	var instance_counter = 0,
-		ccp_node = false,
-		ccp_mode = false,
-		ccp_inst = false,
-		themes_loaded = [],
-		src = $('script:last').attr('src'),
-		document = window.document; // local variable is always faster to access then a global
-
-	var setImmediate = window.setImmediate;
-	var Promise = window.Promise;
-	if (!setImmediate && Promise) {
-		// Good enough approximation of setImmediate
-		setImmediate = function (cb, arg) {
-			Promise.resolve(arg).then(cb);
-		};
-	}
-
-	/**
-	 * holds all jstree related functions and variables, including the actual class and methods to create, access and manipulate instances.
-	 * @name $.jstree
-	 */
-	$.jstree = {
-		/**
-		 * specifies the jstree version in use
-		 * @name $.jstree.version
-		 */
-		version : '{{VERSION}}',
-		/**
-		 * holds all the default options used when creating new instances
-		 * @name $.jstree.defaults
-		 */
-		defaults : {
-			/**
-			 * configure which plugins will be active on an instance. Should be an array of strings, where each element is a plugin name. The default is `[]`
-			 * @name $.jstree.defaults.plugins
-			 */
-			plugins : []
-		},
-		/**
-		 * stores all loaded jstree plugins (used internally)
-		 * @name $.jstree.plugins
-		 */
-		plugins : {},
-		path : src && src.indexOf('/') !== -1 ? src.replace(/\/[^\/]+$/,'') : '',
-		idregex : /[\\:&!^|()\[\]<>@*'+~#";.,=\- \/${}%?`]/g,
-		root : '#'
-	};
-	
-	/**
-	 * creates a jstree instance
-	 * @name $.jstree.create(el [, options])
-	 * @param {DOMElement|jQuery|String} el the element to create the instance on, can be jQuery extended or a selector
-	 * @param {Object} options options for this instance (extends `$.jstree.defaults`)
-	 * @return {jsTree} the new instance
-	 */
-	$.jstree.create = function (el, options) {
-		var tmp = new $.jstree.core(++instance_counter),
-			opt = options;
-		options = $.extend(true, {}, $.jstree.defaults, options);
-		if(opt && opt.plugins) {
-			options.plugins = opt.plugins;
-		}
-		$.each(options.plugins, function (i, k) {
-			if(i !== 'core') {
-				tmp = tmp.plugin(k, options[k]);
-			}
-		});
-		$(el).data('jstree', tmp);
-		tmp.init(el, options);
-		return tmp;
-	};
-	/**
-	 * remove all traces of jstree from the DOM and destroy all instances
-	 * @name $.jstree.destroy()
-	 */
-	$.jstree.destroy = function () {
-		$('.jstree:jstree').jstree('destroy');
-		$(document).off('.jstree');
-	};
-	/**
-	 * the jstree class constructor, used only internally
-	 * @private
-	 * @name $.jstree.core(id)
-	 * @param {Number} id this instance's index
-	 */
-	$.jstree.core = function (id) {
-		this._id = id;
-		this._cnt = 0;
-		this._wrk = null;
-		this._data = {
-			core : {
-				themes : {
-					name : false,
-					dots : false,
-					icons : false,
-					ellipsis : false
-				},
-				selected : [],
-				last_error : {},
-				working : false,
-				worker_queue : [],
-				focused : null
-			}
-		};
-	};
-	/**
-	 * get a reference to an existing instance
-	 *
-	 * __Examples__
-	 *
-	 *	// provided a container with an ID of "tree", and a nested node with an ID of "branch"
-	 *	// all of there will return the same instance
-	 *	$.jstree.reference('tree');
-	 *	$.jstree.reference('#tree');
-	 *	$.jstree.reference($('#tree'));
-	 *	$.jstree.reference(document.getElementByID('tree'));
-	 *	$.jstree.reference('branch');
-	 *	$.jstree.reference('#branch');
-	 *	$.jstree.reference($('#branch'));
-	 *	$.jstree.reference(document.getElementByID('branch'));
-	 *
-	 * @name $.jstree.reference(needle)
-	 * @param {DOMElement|jQuery|String} needle
-	 * @return {jsTree|null} the instance or `null` if not found
-	 */
-	$.jstree.reference = function (needle) {
-		var tmp = null,
-			obj = null;
-		if(needle && needle.id && (!needle.tagName || !needle.nodeType)) { needle = needle.id; }
-
-		if(!obj || !obj.length) {
-			try { obj = $(needle); } catch (ignore) { }
-		}
-		if(!obj || !obj.length) {
-			try { obj = $('#' + needle.replace($.jstree.idregex,'\\$&')); } catch (ignore) { }
-		}
-		if(obj && obj.length && (obj = obj.closest('.jstree')).length && (obj = obj.data('jstree'))) {
-			tmp = obj;
-		}
-		else {
-			$('.jstree').each(function () {
-				var inst = $(this).data('jstree');
-				if(inst && inst._model.data[needle]) {
-					tmp = inst;
-					return false;
-				}
-			});
-		}
-		return tmp;
-	};
-	/**
-	 * Create an instance, get an instance or invoke a command on a instance.
-	 *
-	 * If there is no instance associated with the current node a new one is created and `arg` is used to extend `$.jstree.defaults` for this new instance. There would be no return value (chaining is not broken).
-	 *
-	 * If there is an existing instance and `arg` is a string the command specified by `arg` is executed on the instance, with any additional arguments passed to the function. If the function returns a value it will be returned (chaining could break depending on function).
-	 *
-	 * If there is an existing instance and `arg` is not a string the instance itself is returned (similar to `$.jstree.reference`).
-	 *
-	 * In any other case - nothing is returned and chaining is not broken.
-	 *
-	 * __Examples__
-	 *
-	 *	$('#tree1').jstree(); // creates an instance
-	 *	$('#tree2').jstree({ plugins : [] }); // create an instance with some options
-	 *	$('#tree1').jstree('open_node', '#branch_1'); // call a method on an existing instance, passing additional arguments
-	 *	$('#tree2').jstree(); // get an existing instance (or create an instance)
-	 *	$('#tree2').jstree(true); // get an existing instance (will not create new instance)
-	 *	$('#branch_1').jstree().select_node('#branch_1'); // get an instance (using a nested element and call a method)
-	 *
-	 * @name $().jstree([arg])
-	 * @param {String|Object} arg
-	 * @return {Mixed}
-	 */
-	$.fn.jstree = function (arg) {
-		// check for string argument
-		var is_method	= (typeof arg === 'string'),
-			args		= Array.prototype.slice.call(arguments, 1),
-			result		= null;
-		if(arg === true && !this.length) { return false; }
-		this.each(function () {
-			// get the instance (if there is one) and method (if it exists)
-			var instance = $.jstree.reference(this),
-				method = is_method && instance ? instance[arg] : null;
-			// if calling a method, and method is available - execute on the instance
-			result = is_method && method ?
-				method.apply(instance, args) :
-				null;
-			// if there is no instance and no method is being called - create one
-			if(!instance && !is_method && (arg === undefined || $.isPlainObject(arg))) {
-				$.jstree.create(this, arg);
-			}
-			// if there is an instance and no method is called - return the instance
-			if( (instance && !is_method) || arg === true ) {
-				result = instance || false;
-			}
-			// if there was a method call which returned a result - break and return the value
-			if(result !== null && result !== undefined) {
-				return false;
-			}
-		});
-		// if there was a method call with a valid return value - return that, otherwise continue the chain
-		return result !== null && result !== undefined ?
-			result : this;
-	};
-	/**
-	 * used to find elements containing an instance
-	 *
-	 * __Examples__
-	 *
-	 *	$('div:jstree').each(function () {
-	 *		$(this).jstree('destroy');
-	 *	});
-	 *
-	 * @name $(':jstree')
-	 * @return {jQuery}
-	 */
-	$.expr.pseudos.jstree = $.expr.createPseudo(function(search) {
-		return function(a) {
-			return $(a).hasClass('jstree') &&
-				$(a).data('jstree') !== undefined;
-		};
-	});
-
-	/**
-	 * stores all defaults for the core
-	 * @name $.jstree.defaults.core
-	 */
-	$.jstree.defaults.core = {
-		/**
-		 * data configuration
-		 *
-		 * If left as `false` the HTML inside the jstree container element is used to populate the tree (that should be an unordered list with list items).
-		 *
-		 * You can also pass in a HTML string or a JSON array here.
-		 *
-		 * It is possible to pass in a standard jQuery-like AJAX config and jstree will automatically determine if the response is JSON or HTML and use that to populate the tree.
-		 * In addition to the standard jQuery ajax options here you can supply functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node is being loaded, the return value of those functions will be used.
-		 *
-		 * The last option is to specify a function, that function will receive the node being loaded as argument and a second param which is a function which should be called with the result.
-		 *
-		 * __Examples__
-		 *
-		 *	// AJAX
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'data' : {
-		 *				'url' : '/get/children/',
-		 *				'data' : function (node) {
-		 *					return { 'id' : node.id };
-		 *				}
-		 *			}
-		 *		});
-		 *
-		 *	// direct data
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'data' : [
-		 *				'Simple root node',
-		 *				{
-		 *					'id' : 'node_2',
-		 *					'text' : 'Root node with options',
-		 *					'state' : { 'opened' : true, 'selected' : true },
-		 *					'children' : [ { 'text' : 'Child 1' }, 'Child 2']
-		 *				}
-		 *			]
-		 *		}
-		 *	});
-		 *
-		 *	// function
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'data' : function (obj, callback) {
-		 *				callback.call(this, ['Root 1', 'Root 2']);
-		 *			}
-		 *		});
-		 *
-		 * @name $.jstree.defaults.core.data
-		 */
-		data			: false,
-		/**
-		 * configure the various strings used throughout the tree
-		 *
-		 * You can use an object where the key is the string you need to replace and the value is your replacement.
-		 * Another option is to specify a function which will be called with an argument of the needed string and should return the replacement.
-		 * If left as `false` no replacement is made.
-		 *
-		 * __Examples__
-		 *
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'strings' : {
-		 *				'Loading ...' : 'Please wait ...'
-		 *			}
-		 *		}
-		 *	});
-		 *
-		 * @name $.jstree.defaults.core.strings
-		 */
-		strings			: false,
-		/**
-		 * determines what happens when a user tries to modify the structure of the tree
-		 * If left as `false` all operations like create, rename, delete, move or copy are prevented.
-		 * You can set this to `true` to allow all interactions or use a function to have better control.
-		 *
-		 * __Examples__
-		 *
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'check_callback' : function (operation, node, node_parent, node_position, more) {
-		 *				// operation can be 'create_node', 'rename_node', 'delete_node', 'move_node', 'copy_node' or 'edit'
-		 *				// in case of 'rename_node' node_position is filled with the new node name
-		 *				return operation === 'rename_node' ? true : false;
-		 *			}
-		 *		}
-		 *	});
-		 *
-		 * @name $.jstree.defaults.core.check_callback
-		 */
-		check_callback	: false,
-		/**
-		 * a callback called with a single object parameter in the instance's scope when something goes wrong (operation prevented, ajax failed, etc)
-		 * @name $.jstree.defaults.core.error
-		 */
-		error			: $.noop,
-		/**
-		 * the open / close animation duration in milliseconds - set this to `false` to disable the animation (default is `200`)
-		 * @name $.jstree.defaults.core.animation
-		 */
-		animation		: 200,
-		/**
-		 * a boolean indicating if multiple nodes can be selected
-		 * @name $.jstree.defaults.core.multiple
-		 */
-		multiple		: true,
-		/**
-		 * theme configuration object
-		 * @name $.jstree.defaults.core.themes
-		 */
-		themes			: {
-			/**
-			 * the name of the theme to use (if left as `false` the default theme is used)
-			 * @name $.jstree.defaults.core.themes.name
-			 */
-			name			: false,
-			/**
-			 * the URL of the theme's CSS file, leave this as `false` if you have manually included the theme CSS (recommended). You can set this to `true` too which will try to autoload the theme.
-			 * @name $.jstree.defaults.core.themes.url
-			 */
-			url				: false,
-			/**
-			 * the location of all jstree themes - only used if `url` is set to `true`
-			 * @name $.jstree.defaults.core.themes.dir
-			 */
-			dir				: false,
-			/**
-			 * a boolean indicating if connecting dots are shown
-			 * @name $.jstree.defaults.core.themes.dots
-			 */
-			dots			: true,
-			/**
-			 * a boolean indicating if node icons are shown
-			 * @name $.jstree.defaults.core.themes.icons
-			 */
-			icons			: true,
-			/**
-			 * a boolean indicating if node ellipsis should be shown - this only works with a fixed with on the container
-			 * @name $.jstree.defaults.core.themes.ellipsis
-			 */
-			ellipsis		: false,
-			/**
-			 * a boolean indicating if the tree background is striped
-			 * @name $.jstree.defaults.core.themes.stripes
-			 */
-			stripes			: false,
-			/**
-			 * a string (or boolean `false`) specifying the theme variant to use (if the theme supports variants)
-			 * @name $.jstree.defaults.core.themes.variant
-			 */
-			variant			: false,
-			/**
-			 * a boolean specifying if a reponsive version of the theme should kick in on smaller screens (if the theme supports it). Defaults to `false`.
-			 * @name $.jstree.defaults.core.themes.responsive
-			 */
-			responsive		: false
-		},
-		/**
-		 * if left as `true` all parents of all selected nodes will be opened once the tree loads (so that all selected nodes are visible to the user)
-		 * @name $.jstree.defaults.core.expand_selected_onload
-		 */
-		expand_selected_onload : true,
-		/**
-		 * if left as `true` web workers will be used to parse incoming JSON data where possible, so that the UI will not be blocked by large requests. Workers are however about 30% slower. Defaults to `true`
-		 * @name $.jstree.defaults.core.worker
-		 */
-		worker : true,
-		/**
-		 * Force node text to plain text (and escape HTML). Defaults to `false`
-		 * @name $.jstree.defaults.core.force_text
-		 */
-		force_text : false,
-		/**
-		 * Should the node be toggled if the text is double clicked. Defaults to `true`
-		 * @name $.jstree.defaults.core.dblclick_toggle
-		 */
-		dblclick_toggle : true,
-		/**
-		 * Should the loaded nodes be part of the state. Defaults to `false`
-		 * @name $.jstree.defaults.core.loaded_state
-		 */
-		loaded_state : false,
-		/**
-		 * Should the last active node be focused when the tree container is blurred and the focused again. This helps working with screen readers. Defaults to `true`
-		 * @name $.jstree.defaults.core.restore_focus
-		 */
-		restore_focus : true,
-		/**
-		 * Force to compute and set "aria-setsize" and "aria-posinset" explicitly for each treeitem. 
-		 * Some browsers may compute incorrect elements position and produce wrong announcements for screen readers. Defaults to `false`
-		 * @name $.jstree.defaults.core.compute_elements_positions
-		 */
-		compute_elements_positions : false,
-		/**
-		 * Default keyboard shortcuts (an object where each key is the button name or combo - like 'enter', 'ctrl-space', 'p', etc and the value is the function to execute in the instance's scope)
-		 * @name $.jstree.defaults.core.keyboard
-		 */
-		keyboard : {
-			'ctrl-space': function (e) {
-				// aria defines space only with Ctrl
-				e.type = "click";
-				$(e.currentTarget).trigger(e);
-			},
-			'enter': function (e) {
-				// enter
-				e.type = "click";
-				$(e.currentTarget).trigger(e);
-			},
-			'left': function (e) {
-				// left
-				e.preventDefault();
-				if(this.is_open(e.currentTarget)) {
-					this.close_node(e.currentTarget);
-				}
-				else {
-					var o = this.get_parent(e.currentTarget);
-					if(o && o.id !== $.jstree.root) { this.get_node(o, true).children('.jstree-anchor').trigger('focus'); }
-				}
-			},
-			'up': function (e) {
-				// up
-				e.preventDefault();
-				var o = this.get_prev_dom(e.currentTarget);
-				if(o && o.length) { o.children('.jstree-anchor').trigger('focus'); }
-			},
-			'right': function (e) {
-				// right
-				e.preventDefault();
-				if(this.is_closed(e.currentTarget)) {
-					this.open_node(e.currentTarget, function (o) { this.get_node(o, true).children('.jstree-anchor').trigger('focus'); });
-				}
-				else if (this.is_open(e.currentTarget)) {
-					var o = this.get_node(e.currentTarget, true).children('.jstree-children')[0];
-					if(o) { $(this._firstChild(o)).children('.jstree-anchor').trigger('focus'); }
-				}
-			},
-			'down': function (e) {
-				// down
-				e.preventDefault();
-				var o = this.get_next_dom(e.currentTarget);
-				if(o && o.length) { o.children('.jstree-anchor').trigger('focus'); }
-			},
-			'*': function (e) {
-				// aria defines * on numpad as open_all - not very common
-				this.open_all();
-			},
-			'home': function (e) {
-				// home
-				e.preventDefault();
-				var o = this._firstChild(this.get_container_ul()[0]);
-				if(o) { $(o).children('.jstree-anchor').filter(':visible').trigger('focus'); }
-			},
-			'end': function (e) {
-				// end
-				e.preventDefault();
-				this.element.find('.jstree-anchor').filter(':visible').last().trigger('focus');
-			},
-			'f2': function (e) {
-				// f2 - safe to include - if check_callback is false it will fail
-				e.preventDefault();
-				this.edit(e.currentTarget);
-			}
-		},
-        /**
-		 * Should reselecting an already selected node trigger the select and changed callbacks
-		 * @name $.jstree.defaults.core.allow_reselect
-		 */
-        allow_reselect : false
-	};
-	$.jstree.core.prototype = {
-		/**
-		 * used to decorate an instance with a plugin. Used internally.
-		 * @private
-		 * @name plugin(deco [, opts])
-		 * @param  {String} deco the plugin to decorate with
-		 * @param  {Object} opts options for the plugin
-		 * @return {jsTree}
-		 */
-		plugin : function (deco, opts) {
-			var Child = $.jstree.plugins[deco];
-			if(Child) {
-				this._data[deco] = {};
-				Child.prototype = this;
-				return new Child(opts, this);
-			}
-			return this;
-		},
-		/**
-		 * initialize the instance. Used internally.
-		 * @private
-		 * @name init(el, optons)
-		 * @param {DOMElement|jQuery|String} el the element we are transforming
-		 * @param {Object} options options for this instance
-		 * @trigger init.jstree, loading.jstree, loaded.jstree, ready.jstree, changed.jstree
-		 */
-		init : function (el, options) {
-			this._model = {
-				data : {},
-				changed : [],
-				force_full_redraw : false,
-				redraw_timeout : false,
-				default_state : {
-					loaded : true,
-					opened : false,
-					selected : false,
-					disabled : false
-				}
-			};
-			this._model.data[$.jstree.root] = {
-				id : $.jstree.root,
-				parent : null,
-				parents : [],
-				children : [],
-				children_d : [],
-				state : { loaded : false }
-			};
-
-			this.element = $(el).addClass('jstree jstree-' + this._id);
-			this.settings = options;
-
-			this._data.core.ready = false;
-			this._data.core.loaded = false;
-			this._data.core.rtl = (this.element.css("direction") === "rtl");
-			this.element[this._data.core.rtl ? 'addClass' : 'removeClass']("jstree-rtl");
-			this.element.attr('role','tree');
-			if(this.settings.core.multiple) {
-				this.element.attr('aria-multiselectable', true);
-			}
-			if(!this.element.attr('tabindex')) {
-				this.element.attr('tabindex','0');
-			}
-
-			this.bind();
-			/**
-			 * triggered after all events are bound
-			 * @event
-			 * @name init.jstree
-			 */
-			this.trigger("init");
-
-			this._data.core.original_container_html = this.element.find(" > ul > li").clone(true);
-			this._data.core.original_container_html
-				.find("li").addBack()
-				.contents().filter(function() {
-					return this.nodeType === 3 && (!this.nodeValue || /^\s+$/.test(this.nodeValue));
-				})
-				.remove();
-			this.element.html("<"+"ul class='jstree-container-ul jstree-children' role='group'><"+"li id='j"+this._id+"_loading' class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='none'><i class='jstree-icon jstree-ocl'></i><"+"a class='jstree-anchor' role='treeitem' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>" + this.get_string("Loading ...") + "</a></li></ul>");
-			this.element.attr('aria-activedescendant','j' + this._id + '_loading');
-			this._data.core.li_height = this.get_container_ul().children("li").first().outerHeight() || 24;
-			this._data.core.node = this._create_prototype_node();
-			/**
-			 * triggered after the loading text is shown and before loading starts
-			 * @event
-			 * @name loading.jstree
-			 */
-			this.trigger("loading");
-			this.load_node($.jstree.root);
-		},
-		/**
-		 * destroy an instance
-		 * @name destroy()
-		 * @param  {Boolean} keep_html if not set to `true` the container will be emptied, otherwise the current DOM elements will be kept intact
-		 */
-		destroy : function (keep_html) {
-			/**
-			 * triggered before the tree is destroyed
-			 * @event
-			 * @name destroy.jstree
-			 */
-			this.trigger("destroy");
-			if(this._wrk) {
-				try {
-					window.URL.revokeObjectURL(this._wrk);
-					this._wrk = null;
-				}
-				catch (ignore) { }
-			}
-			if(!keep_html) { this.element.empty(); }
-			this.teardown();
-		},
-		/**
-		 * Create a prototype node
-		 * @name _create_prototype_node()
-		 * @return {DOMElement}
-		 */
-		_create_prototype_node : function () {
-			var _node = document.createElement('LI'), _temp1, _temp2;
-			_node.setAttribute('role', 'none');
-			_temp1 = document.createElement('I');
-			_temp1.className = 'jstree-icon jstree-ocl';
-			_temp1.setAttribute('role', 'presentation');
-			_node.appendChild(_temp1);
-			_temp1 = document.createElement('A');
-			_temp1.className = 'jstree-anchor';
-			_temp1.setAttribute('href','#');
-			_temp1.setAttribute('tabindex','-1');
-			_temp1.setAttribute('role', 'treeitem');
-			_temp2 = document.createElement('I');
-			_temp2.className = 'jstree-icon jstree-themeicon';
-			_temp2.setAttribute('role', 'presentation');
-			_temp1.appendChild(_temp2);
-			_node.appendChild(_temp1);
-			_temp1 = _temp2 = null;
-
-			return _node;
-		},
-		_kbevent_to_func : function (e) {
-			var keys = {
-				8: "Backspace", 9: "Tab", 13: "Enter", 19: "Pause", 27: "Esc",
-				32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home",
-				37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "Print", 45: "Insert",
-				46: "Delete", 96: "Numpad0", 97: "Numpad1", 98: "Numpad2", 99 : "Numpad3",
-				100: "Numpad4", 101: "Numpad5", 102: "Numpad6", 103: "Numpad7",
-				104: "Numpad8", 105: "Numpad9", '-13': "NumpadEnter", 112: "F1",
-				113: "F2", 114: "F3", 115: "F4", 116: "F5", 117: "F6", 118: "F7",
-				119: "F8", 120: "F9", 121: "F10", 122: "F11", 123: "F12", 144: "Numlock",
-				145: "Scrolllock", 16: 'Shift', 17: 'Ctrl', 18: 'Alt',
-				48: '0',  49: '1',  50: '2',  51: '3',  52: '4', 53:  '5',
-				54: '6',  55: '7',  56: '8',  57: '9',  59: ';',  61: '=', 65:  'a',
-				66: 'b',  67: 'c',  68: 'd',  69: 'e',  70: 'f',  71: 'g', 72:  'h',
-				73: 'i',  74: 'j',  75: 'k',  76: 'l',  77: 'm',  78: 'n', 79:  'o',
-				80: 'p',  81: 'q',  82: 'r',  83: 's',  84: 't',  85: 'u', 86:  'v',
-				87: 'w',  88: 'x',  89: 'y',  90: 'z', 107: '+', 109: '-', 110: '.',
-				186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',
-				219: '[', 220: '\\',221: ']', 222: "'", 111: '/', 106: '*', 173: '-'
-			};
-			var parts = [];
-			if (e.ctrlKey) { parts.push('ctrl'); }
-			if (e.altKey) { parts.push('alt'); }
-            if (e.shiftKey) { parts.push('shift'); }
-			parts.push(keys[e.which] ? keys[e.which].toLowerCase() : e.which);
-            parts = parts.sort().join('-').toLowerCase();
-            if (parts === 'shift-shift' || parts === 'ctrl-ctrl' || parts === 'alt-alt') {
-                return null;
-            }
-
-			var kb = this.settings.core.keyboard, i, tmp;
-			for (i in kb) {
-				if (kb.hasOwnProperty(i)) {
-					tmp = i;
-					if (tmp !== '-' && tmp !== '+') {
-						tmp = tmp.replace('--', '-MINUS').replace('+-', '-MINUS').replace('++', '-PLUS').replace('-+', '-PLUS');
-						tmp = tmp.split(/-|\+/).sort().join('-').replace('MINUS', '-').replace('PLUS', '+').toLowerCase();
-					}
-					if (tmp === parts) {
-						return kb[i];
-					}
-				}
-			}
-			return null;
-		},
-		/**
-		 * part of the destroying of an instance. Used internally.
-		 * @private
-		 * @name teardown()
-		 */
-		teardown : function () {
-			this.unbind();
-			this.element
-				.removeClass('jstree')
-				.removeData('jstree')
-				.find("[class^='jstree']")
-					.addBack()
-					.attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); });
-			this.element = null;
-		},
-		/**
-		 * bind all events. Used internally.
-		 * @private
-		 * @name bind()
-		 */
-		bind : function () {
-			var word = '',
-				tout = null,
-				was_click = 0;
-			this.element
-				.on("dblclick.jstree", function (e) {
-						if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; }
-						if(document.selection && document.selection.empty) {
-							document.selection.empty();
-						}
-						else {
-							if(window.getSelection) {
-								var sel = window.getSelection();
-								try {
-									sel.removeAllRanges();
-									sel.collapse();
-								} catch (ignore) { }
-							}
-						}
-					})
-				.on("mousedown.jstree", function (e) {
-						if(e.target === this.element[0]) {
-							e.preventDefault(); // prevent losing focus when clicking scroll arrows (FF, Chrome)
-							was_click = +(new Date()); // ie does not allow to prevent losing focus
-						}
-					}.bind(this))
-				.on("mousedown.jstree", ".jstree-ocl", function (e) {
-						e.preventDefault(); // prevent any node inside from losing focus when clicking the open/close icon
-					})
-				.on("click.jstree", ".jstree-ocl", function (e) {
-						this.toggle_node(e.target);
-					}.bind(this))
-				.on("dblclick.jstree", ".jstree-anchor", function (e) {
-						if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; }
-						if(this.settings.core.dblclick_toggle) {
-							this.toggle_node(e.target);
-						}
-					}.bind(this))
-				.on("click.jstree", ".jstree-anchor", function (e) {
-						e.preventDefault();
-						if(e.currentTarget !== document.activeElement) { $(e.currentTarget).trigger('focus'); }
-						this.activate_node(e.currentTarget, e);
-					}.bind(this))
-				.on('keydown.jstree', '.jstree-anchor', function (e) {
-						if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; }
-						if(this._data.core.rtl) {
-							if(e.which === 37) { e.which = 39; }
-							else if(e.which === 39) { e.which = 37; }
-						}
-						var f = this._kbevent_to_func(e);
-						if (f) {
-							var r = f.call(this, e);
-							if (r === false || r === true) {
-								return r;
-							}
-						}
-					}.bind(this))
-				.on("load_node.jstree", function (e, data) {
-						if(data.status) {
-							if(data.node.id === $.jstree.root && !this._data.core.loaded) {
-								this._data.core.loaded = true;
-								if(this._firstChild(this.get_container_ul()[0])) {
-									this.element.attr('aria-activedescendant',this._firstChild(this.get_container_ul()[0]).id);
-								}
-								/**
-								 * triggered after the root node is loaded for the first time
-								 * @event
-								 * @name loaded.jstree
-								 */
-								this.trigger("loaded");
-							}
-							if(!this._data.core.ready) {
-								setTimeout(function() {
-									if(this.element && !this.get_container_ul().find('.jstree-loading').length) {
-										this._data.core.ready = true;
-										if(this._data.core.selected.length) {
-											if(this.settings.core.expand_selected_onload) {
-												var tmp = [], i, j;
-												for(i = 0, j = this._data.core.selected.length; i < j; i++) {
-													tmp = tmp.concat(this._model.data[this._data.core.selected[i]].parents);
-												}
-												tmp = $.vakata.array_unique(tmp);
-												for(i = 0, j = tmp.length; i < j; i++) {
-													this.open_node(tmp[i], false, 0);
-												}
-											}
-											this.trigger('changed', { 'action' : 'ready', 'selected' : this._data.core.selected });
-										}
-										/**
-										 * triggered after all nodes are finished loading
-										 * @event
-										 * @name ready.jstree
-										 */
-										this.trigger("ready");
-									}
-								}.bind(this), 0);
-							}
-						}
-					}.bind(this))
-				// quick searching when the tree is focused
-				.on('keypress.jstree', function (e) {
-						if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; }
-						if(tout) { clearTimeout(tout); }
-						tout = setTimeout(function () {
-							word = '';
-						}, 500);
-
-						var chr = String.fromCharCode(e.which).toLowerCase(),
-							col = this.element.find('.jstree-anchor').filter(':visible'),
-							ind = col.index(document.activeElement) || 0,
-							end = false;
-						word += chr;
-
-						// match for whole word from current node down (including the current node)
-						if(word.length > 1) {
-							col.slice(ind).each(function (i, v) {
-								if($(v).text().toLowerCase().indexOf(word) === 0) {
-									$(v).trigger('focus');
-									end = true;
-									return false;
-								}
-							}.bind(this));
-							if(end) { return; }
-
-							// match for whole word from the beginning of the tree
-							col.slice(0, ind).each(function (i, v) {
-								if($(v).text().toLowerCase().indexOf(word) === 0) {
-									$(v).trigger('focus');
-									end = true;
-									return false;
-								}
-							}.bind(this));
-							if(end) { return; }
-						}
-						// list nodes that start with that letter (only if word consists of a single char)
-						if(new RegExp('^' + chr.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '+$').test(word)) {
-							// search for the next node starting with that letter
-							col.slice(ind + 1).each(function (i, v) {
-								if($(v).text().toLowerCase().charAt(0) === chr) {
-									$(v).trigger('focus');
-									end = true;
-									return false;
-								}
-							}.bind(this));
-							if(end) { return; }
-
-							// search from the beginning
-							col.slice(0, ind + 1).each(function (i, v) {
-								if($(v).text().toLowerCase().charAt(0) === chr) {
-									$(v).trigger('focus');
-									end = true;
-									return false;
-								}
-							}.bind(this));
-							if(end) { return; }
-						}
-					}.bind(this))
-				// THEME RELATED
-				.on("init.jstree", function () {
-						var s = this.settings.core.themes;
-						this._data.core.themes.dots			= s.dots;
-						this._data.core.themes.stripes		= s.stripes;
-						this._data.core.themes.icons		= s.icons;
-						this._data.core.themes.ellipsis		= s.ellipsis;
-						this.set_theme(s.name || "default", s.url);
-						this.set_theme_variant(s.variant);
-					}.bind(this))
-				.on("loading.jstree", function () {
-						this[ this._data.core.themes.dots ? "show_dots" : "hide_dots" ]();
-						this[ this._data.core.themes.icons ? "show_icons" : "hide_icons" ]();
-						this[ this._data.core.themes.stripes ? "show_stripes" : "hide_stripes" ]();
-						this[ this._data.core.themes.ellipsis ? "show_ellipsis" : "hide_ellipsis" ]();
-					}.bind(this))
-				.on('blur.jstree', '.jstree-anchor', function (e) {
-						this._data.core.focused = null;
-						$(e.currentTarget).filter('.jstree-hovered').trigger('mouseleave');
-						this.element.attr('tabindex', '0');
-						$(e.currentTarget).attr('tabindex', '-1');
-					}.bind(this))
-				.on('focus.jstree', '.jstree-anchor', function (e) {
-						var tmp = this.get_node(e.currentTarget);
-						if(tmp && (tmp.id || tmp.id === 0)) {
-							this._data.core.focused = tmp.id;
-						}
-						this.element.find('.jstree-hovered').not(e.currentTarget).trigger('mouseleave');
-						$(e.currentTarget).trigger('mouseenter');
-						this.element.attr('tabindex', '-1');
-						$(e.currentTarget).attr('tabindex', '0');
-					}.bind(this))
-				.on('focus.jstree', function () {
-						if(+(new Date()) - was_click > 500 && !this._data.core.focused && this.settings.core.restore_focus) {
-							was_click = 0;
-							var act = this.get_node(this.element.attr('aria-activedescendant'), true);
-							if(act) {
-								act.find('> .jstree-anchor').trigger('focus');
-							}
-						}
-					}.bind(this))
-				.on('mouseenter.jstree', '.jstree-anchor', function (e) {
-						this.hover_node(e.currentTarget);
-					}.bind(this))
-				.on('mouseleave.jstree', '.jstree-anchor', function (e) {
-						this.dehover_node(e.currentTarget);
-					}.bind(this));
-		},
-		/**
-		 * part of the destroying of an instance. Used internally.
-		 * @private
-		 * @name unbind()
-		 */
-		unbind : function () {
-			this.element.off('.jstree');
-			$(document).off('.jstree-' + this._id);
-		},
-		/**
-		 * trigger an event. Used internally.
-		 * @private
-		 * @name trigger(ev [, data])
-		 * @param  {String} ev the name of the event to trigger
-		 * @param  {Object} data additional data to pass with the event
-		 */
-		trigger : function (ev, data) {
-			if(!data) {
-				data = {};
-			}
-			data.instance = this;
-			this.element.triggerHandler(ev.replace('.jstree','') + '.jstree', data);
-		},
-		/**
-		 * returns the jQuery extended instance container
-		 * @name get_container()
-		 * @return {jQuery}
-		 */
-		get_container : function () {
-			return this.element;
-		},
-		/**
-		 * returns the jQuery extended main UL node inside the instance container. Used internally.
-		 * @private
-		 * @name get_container_ul()
-		 * @return {jQuery}
-		 */
-		get_container_ul : function () {
-			return this.element.children(".jstree-children").first();
-		},
-		/**
-		 * gets string replacements (localization). Used internally.
-		 * @private
-		 * @name get_string(key)
-		 * @param  {String} key
-		 * @return {String}
-		 */
-		get_string : function (key) {
-			var a = this.settings.core.strings;
-			if($.vakata.is_function(a)) { return a.call(this, key); }
-			if(a && a[key]) { return a[key]; }
-			return key;
-		},
-		/**
-		 * gets the first child of a DOM node. Used internally.
-		 * @private
-		 * @name _firstChild(dom)
-		 * @param  {DOMElement} dom
-		 * @return {DOMElement}
-		 */
-		_firstChild : function (dom) {
-			dom = dom ? dom.firstChild : null;
-			while(dom !== null && dom.nodeType !== 1) {
-				dom = dom.nextSibling;
-			}
-			return dom;
-		},
-		/**
-		 * gets the next sibling of a DOM node. Used internally.
-		 * @private
-		 * @name _nextSibling(dom)
-		 * @param  {DOMElement} dom
-		 * @return {DOMElement}
-		 */
-		_nextSibling : function (dom) {
-			dom = dom ? dom.nextSibling : null;
-			while(dom !== null && dom.nodeType !== 1) {
-				dom = dom.nextSibling;
-			}
-			return dom;
-		},
-		/**
-		 * gets the previous sibling of a DOM node. Used internally.
-		 * @private
-		 * @name _previousSibling(dom)
-		 * @param  {DOMElement} dom
-		 * @return {DOMElement}
-		 */
-		_previousSibling : function (dom) {
-			dom = dom ? dom.previousSibling : null;
-			while(dom !== null && dom.nodeType !== 1) {
-				dom = dom.previousSibling;
-			}
-			return dom;
-		},
-		/**
-		 * get the JSON representation of a node (or the actual jQuery extended DOM node) by using any input (child DOM element, ID string, selector, etc)
-		 * @name get_node(obj [, as_dom])
-		 * @param  {mixed} obj
-		 * @param  {Boolean} as_dom
-		 * @return {Object|jQuery}
-		 */
-		get_node : function (obj, as_dom) {
-			if(obj && (obj.id || obj.id === 0)) {
-				obj = obj.id;
-			}
-			if (obj instanceof $ && obj.length && obj[0].id) {
-				obj = obj[0].id;
-			}
-			var dom;
-			try {
-				if(this._model.data[obj]) {
-					obj = this._model.data[obj];
-				}
-				else if(typeof obj === "string" && this._model.data[obj.replace(/^#/, '')]) {
-					obj = this._model.data[obj.replace(/^#/, '')];
-				}
-				else if(typeof obj === "string" && (dom = $('#' + obj.replace($.jstree.idregex,'\\$&'), this.element)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) {
-					obj = this._model.data[dom.closest('.jstree-node').attr('id')];
-				}
-				else if((dom = this.element.find(obj)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) {
-					obj = this._model.data[dom.closest('.jstree-node').attr('id')];
-				}
-				else if((dom = this.element.find(obj)).length && dom.hasClass('jstree')) {
-					obj = this._model.data[$.jstree.root];
-				}
-				else {
-					return false;
-				}
-
-				if(as_dom) {
-					obj = obj.id === $.jstree.root ? this.element : $('#' + obj.id.replace($.jstree.idregex,'\\$&'), this.element);
-				}
-				return obj;
-			} catch (ex) { return false; }
-		},
-		/**
-		 * get the path to a node, either consisting of node texts, or of node IDs, optionally glued together (otherwise an array)
-		 * @name get_path(obj [, glue, ids])
-		 * @param  {mixed} obj the node
-		 * @param  {String} glue if you want the path as a string - pass the glue here (for example '/'), if a falsy value is supplied here, an array is returned
-		 * @param  {Boolean} ids if set to true build the path using ID, otherwise node text is used
-		 * @return {mixed}
-		 */
-		get_path : function (obj, glue, ids) {
-			obj = obj.parents ? obj : this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root || !obj.parents) {
-				return false;
-			}
-			var i, j, p = [];
-			p.push(ids ? obj.id : obj.text);
-			for(i = 0, j = obj.parents.length; i < j; i++) {
-				p.push(ids ? obj.parents[i] : this.get_text(obj.parents[i]));
-			}
-			p = p.reverse().slice(1);
-			return glue ? p.join(glue) : p;
-		},
-		/**
-		 * get the next visible node that is below the `obj` node. If `strict` is set to `true` only sibling nodes are returned.
-		 * @name get_next_dom(obj [, strict])
-		 * @param  {mixed} obj
-		 * @param  {Boolean} strict
-		 * @return {jQuery}
-		 */
-		get_next_dom : function (obj, strict) {
-			var tmp;
-			obj = this.get_node(obj, true);
-			if(obj[0] === this.element[0]) {
-				tmp = this._firstChild(this.get_container_ul()[0]);
-				while (tmp && tmp.offsetHeight === 0) {
-					tmp = this._nextSibling(tmp);
-				}
-				return tmp ? $(tmp) : false;
-			}
-			if(!obj || !obj.length) {
-				return false;
-			}
-			if(strict) {
-				tmp = obj[0];
-				do {
-					tmp = this._nextSibling(tmp);
-				} while (tmp && tmp.offsetHeight === 0);
-				return tmp ? $(tmp) : false;
-			}
-			if(obj.hasClass("jstree-open")) {
-				tmp = this._firstChild(obj.children('.jstree-children')[0]);
-				while (tmp && tmp.offsetHeight === 0) {
-					tmp = this._nextSibling(tmp);
-				}
-				if(tmp !== null) {
-					return $(tmp);
-				}
-			}
-			tmp = obj[0];
-			do {
-				tmp = this._nextSibling(tmp);
-			} while (tmp && tmp.offsetHeight === 0);
-			if(tmp !== null) {
-				return $(tmp);
-			}
-			return obj.parentsUntil(".jstree",".jstree-node").nextAll(".jstree-node:visible").first();
-		},
-		/**
-		 * get the previous visible node that is above the `obj` node. If `strict` is set to `true` only sibling nodes are returned.
-		 * @name get_prev_dom(obj [, strict])
-		 * @param  {mixed} obj
-		 * @param  {Boolean} strict
-		 * @return {jQuery}
-		 */
-		get_prev_dom : function (obj, strict) {
-			var tmp;
-			obj = this.get_node(obj, true);
-			if(obj[0] === this.element[0]) {
-				tmp = this.get_container_ul()[0].lastChild;
-				while (tmp && tmp.offsetHeight === 0) {
-					tmp = this._previousSibling(tmp);
-				}
-				return tmp ? $(tmp) : false;
-			}
-			if(!obj || !obj.length) {
-				return false;
-			}
-			if(strict) {
-				tmp = obj[0];
-				do {
-					tmp = this._previousSibling(tmp);
-				} while (tmp && tmp.offsetHeight === 0);
-				return tmp ? $(tmp) : false;
-			}
-			tmp = obj[0];
-			do {
-				tmp = this._previousSibling(tmp);
-			} while (tmp && tmp.offsetHeight === 0);
-			if(tmp !== null) {
-				obj = $(tmp);
-				while(obj.hasClass("jstree-open")) {
-					obj = obj.children(".jstree-children").first().children(".jstree-node:visible:last");
-				}
-				return obj;
-			}
-			tmp = obj[0].parentNode.parentNode;
-			return tmp && tmp.className && tmp.className.indexOf('jstree-node') !== -1 ? $(tmp) : false;
-		},
-		/**
-		 * get the parent ID of a node
-		 * @name get_parent(obj)
-		 * @param  {mixed} obj
-		 * @return {String}
-		 */
-		get_parent : function (obj) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			return obj.parent;
-		},
-		/**
-		 * get a jQuery collection of all the children of a node (node must be rendered), returns false on error
-		 * @name get_children_dom(obj)
-		 * @param  {mixed} obj
-		 * @return {jQuery}
-		 */
-		get_children_dom : function (obj) {
-			obj = this.get_node(obj, true);
-			if(obj[0] === this.element[0]) {
-				return this.get_container_ul().children(".jstree-node");
-			}
-			if(!obj || !obj.length) {
-				return false;
-			}
-			return obj.children(".jstree-children").children(".jstree-node");
-		},
-		/**
-		 * checks if a node has children
-		 * @name is_parent(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_parent : function (obj) {
-			obj = this.get_node(obj);
-			return obj && (obj.state.loaded === false || obj.children.length > 0);
-		},
-		/**
-		 * checks if a node is loaded (its children are available)
-		 * @name is_loaded(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_loaded : function (obj) {
-			obj = this.get_node(obj);
-			return obj && obj.state.loaded;
-		},
-		/**
-		 * check if a node is currently loading (fetching children)
-		 * @name is_loading(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_loading : function (obj) {
-			obj = this.get_node(obj);
-			return obj && obj.state && obj.state.loading;
-		},
-		/**
-		 * check if a node is opened
-		 * @name is_open(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_open : function (obj) {
-			obj = this.get_node(obj);
-			return obj && obj.state.opened;
-		},
-		/**
-		 * check if a node is in a closed state
-		 * @name is_closed(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_closed : function (obj) {
-			obj = this.get_node(obj);
-			return obj && this.is_parent(obj) && !obj.state.opened;
-		},
-		/**
-		 * check if a node has no children
-		 * @name is_leaf(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_leaf : function (obj) {
-			return !this.is_parent(obj);
-		},
-		/**
-		 * loads a node (fetches its children using the `core.data` setting). Multiple nodes can be passed to by using an array.
-		 * @name load_node(obj [, callback])
-		 * @param  {mixed} obj
-		 * @param  {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives two arguments - the node and a boolean status
-		 * @return {Boolean}
-		 * @trigger load_node.jstree
-		 */
-		load_node : function (obj, callback) {
-			var dom = this.get_node(obj, true), k, l, i, j, c;
-			if($.vakata.is_array(obj)) {
-				this._load_nodes(obj.slice(), callback);
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj) {
-				if(callback) { callback.call(this, obj, false); }
-				return false;
-			}
-			// if(obj.state.loading) { } // the node is already loading - just wait for it to load and invoke callback? but if called implicitly it should be loaded again?
-			if(obj.state.loaded) {
-				obj.state.loaded = false;
-				for(i = 0, j = obj.parents.length; i < j; i++) {
-					this._model.data[obj.parents[i]].children_d = $.vakata.array_filter(this._model.data[obj.parents[i]].children_d, function (v) {
-						return $.inArray(v, obj.children_d) === -1;
-					});
-				}
-				for(k = 0, l = obj.children_d.length; k < l; k++) {
-					if(this._model.data[obj.children_d[k]].state.selected) {
-						c = true;
-					}
-					delete this._model.data[obj.children_d[k]];
-				}
-				if (c) {
-					this._data.core.selected = $.vakata.array_filter(this._data.core.selected, function (v) {
-						return $.inArray(v, obj.children_d) === -1;
-					});
-				}
-				obj.children = [];
-				obj.children_d = [];
-				if(c) {
-					this.trigger('changed', { 'action' : 'load_node', 'node' : obj, 'selected' : this._data.core.selected });
-				}
-			}
-			obj.state.failed = false;
-			obj.state.loading = true;
-			if (obj.id !== $.jstree.root) {
-				dom.children(".jstree-anchor").attr('aria-busy', true);
-			} else {
-				dom.attr('aria-busy', true);
-			}
-			dom.addClass("jstree-loading");
-			this._load_node(obj, function (status) {
-				obj = this._model.data[obj.id];
-				obj.state.loading = false;
-				obj.state.loaded = status;
-				obj.state.failed = !obj.state.loaded;
-				var dom = this.get_node(obj, true), i = 0, j = 0, m = this._model.data, has_children = false;
-				for(i = 0, j = obj.children.length; i < j; i++) {
-					if(m[obj.children[i]] && !m[obj.children[i]].state.hidden) {
-						has_children = true;
-						break;
-					}
-				}
-				if(obj.state.loaded && dom && dom.length) {
-					dom.removeClass('jstree-closed jstree-open jstree-leaf');
-					if (!has_children) {
-						dom.addClass('jstree-leaf');
-					}
-					else {
-						if (obj.id !== '#') {
-							dom.addClass(obj.state.opened ? 'jstree-open' : 'jstree-closed');
-						}
-					}
-				}
-				if (obj.id !== $.jstree.root) {
-					dom.children(".jstree-anchor").attr('aria-busy', false);
-				} else {
-					dom.attr('aria-busy', false);
-				}
-				dom.removeClass("jstree-loading");
-				/**
-				 * triggered after a node is loaded
-				 * @event
-				 * @name load_node.jstree
-				 * @param {Object} node the node that was loading
-				 * @param {Boolean} status was the node loaded successfully
-				 */
-				this.trigger('load_node', { "node" : obj, "status" : status });
-				if(callback) {
-					callback.call(this, obj, status);
-				}
-			}.bind(this));
-			return true;
-		},
-		/**
-		 * load an array of nodes (will also load unavailable nodes as soon as they appear in the structure). Used internally.
-		 * @private
-		 * @name _load_nodes(nodes [, callback])
-		 * @param  {array} nodes
-		 * @param  {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - the array passed to _load_nodes
-		 */
-		_load_nodes : function (nodes, callback, is_callback, force_reload) {
-			var r = true,
-				c = function () { this._load_nodes(nodes, callback, true); },
-				m = this._model.data, i, j, tmp = [];
-			for(i = 0, j = nodes.length; i < j; i++) {
-				if(m[nodes[i]] && ( (!m[nodes[i]].state.loaded && !m[nodes[i]].state.failed) || (!is_callback && force_reload) )) {
-					if(!this.is_loading(nodes[i])) {
-						this.load_node(nodes[i], c);
-					}
-					r = false;
-				}
-			}
-			if(r) {
-				for(i = 0, j = nodes.length; i < j; i++) {
-					if(m[nodes[i]] && m[nodes[i]].state.loaded) {
-						tmp.push(nodes[i]);
-					}
-				}
-				if(callback && !callback.done) {
-					callback.call(this, tmp);
-					callback.done = true;
-				}
-			}
-		},
-		/**
-		 * loads all unloaded nodes
-		 * @name load_all([obj, callback])
-		 * @param {mixed} obj the node to load recursively, omit to load all nodes in the tree
-		 * @param {function} callback a function to be executed once loading all the nodes is complete,
-		 * @trigger load_all.jstree
-		 */
-		load_all : function (obj, callback) {
-			if(!obj) { obj = $.jstree.root; }
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			var to_load = [],
-				m = this._model.data,
-				c = m[obj.id].children_d,
-				i, j;
-			if(obj.state && !obj.state.loaded) {
-				to_load.push(obj.id);
-			}
-			for(i = 0, j = c.length; i < j; i++) {
-				if(m[c[i]] && m[c[i]].state && !m[c[i]].state.loaded) {
-					to_load.push(c[i]);
-				}
-			}
-			if(to_load.length) {
-				this._load_nodes(to_load, function () {
-					this.load_all(obj, callback);
-				});
-			}
-			else {
-				/**
-				 * triggered after a load_all call completes
-				 * @event
-				 * @name load_all.jstree
-				 * @param {Object} node the recursively loaded node
-				 */
-				if(callback) { callback.call(this, obj); }
-				this.trigger('load_all', { "node" : obj });
-			}
-		},
-		/**
-		 * handles the actual loading of a node. Used only internally.
-		 * @private
-		 * @name _load_node(obj [, callback])
-		 * @param  {mixed} obj
-		 * @param  {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - a boolean status
-		 * @return {Boolean}
-		 */
-		_load_node : function (obj, callback) {
-			var s = this.settings.core.data, t;
-			var notTextOrCommentNode = function notTextOrCommentNode () {
-				return this.nodeType !== 3 && this.nodeType !== 8;
-			};
-			// use original HTML
-			if(!s) {
-				if(obj.id === $.jstree.root) {
-					return this._append_html_data(obj, this._data.core.original_container_html.clone(true), function (status) {
-						callback.call(this, status);
-					});
-				}
-				else {
-					return callback.call(this, false);
-				}
-				// return callback.call(this, obj.id === $.jstree.root ? this._append_html_data(obj, this._data.core.original_container_html.clone(true)) : false);
-			}
-			if($.vakata.is_function(s)) {
-				return s.call(this, obj, function (d) {
-					if(d === false) {
-						callback.call(this, false);
-					}
-					else {
-						this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $($.parseHTML(d)).filter(notTextOrCommentNode) : d, function (status) {
-							callback.call(this, status);
-						});
-					}
-					// return d === false ? callback.call(this, false) : callback.call(this, this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $(d) : d));
-				}.bind(this));
-			}
-			if(typeof s === 'object') {
-				if(s.url) {
-					s = $.extend(true, {}, s);
-					if($.vakata.is_function(s.url)) {
-						s.url = s.url.call(this, obj);
-					}
-					if($.vakata.is_function(s.data)) {
-						s.data = s.data.call(this, obj);
-					}
-					return $.ajax(s)
-						.done(function (d,t,x) {
-								var type = x.getResponseHeader('Content-Type');
-								if((type && type.indexOf('json') !== -1) || typeof d === "object") {
-									return this._append_json_data(obj, d, function (status) { callback.call(this, status); });
-									//return callback.call(this, this._append_json_data(obj, d));
-								}
-								if((type && type.indexOf('html') !== -1) || typeof d === "string") {
-									return this._append_html_data(obj, $($.parseHTML(d)).filter(notTextOrCommentNode), function (status) { callback.call(this, status); });
-									// return callback.call(this, this._append_html_data(obj, $(d)));
-								}
-								this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'core', 'id' : 'core_04', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id, 'xhr' : x }) };
-								this.settings.core.error.call(this, this._data.core.last_error);
-								return callback.call(this, false);
-							}.bind(this))
-						.fail(function (f) {
-								this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'core', 'id' : 'core_04', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id, 'xhr' : f }) };
-								callback.call(this, false);
-								this.settings.core.error.call(this, this._data.core.last_error);
-							}.bind(this));
-				}
-				if ($.vakata.is_array(s)) {
-					t = $.extend(true, [], s);
-				} else if ($.isPlainObject(s)) {
-					t = $.extend(true, {}, s);
-				} else {
-					t = s;
-				}
-				if(obj.id === $.jstree.root) {
-					return this._append_json_data(obj, t, function (status) {
-						callback.call(this, status);
-					});
-				}
-				else {
-					this._data.core.last_error = { 'error' : 'nodata', 'plugin' : 'core', 'id' : 'core_05', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id }) };
-					this.settings.core.error.call(this, this._data.core.last_error);
-					return callback.call(this, false);
-				}
-				//return callback.call(this, (obj.id === $.jstree.root ? this._append_json_data(obj, t) : false) );
-			}
-			if(typeof s === 'string') {
-				if(obj.id === $.jstree.root) {
-					return this._append_html_data(obj, $($.parseHTML(s)).filter(notTextOrCommentNode), function (status) {
-						callback.call(this, status);
-					});
-				}
-				else {
-					this._data.core.last_error = { 'error' : 'nodata', 'plugin' : 'core', 'id' : 'core_06', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id }) };
-					this.settings.core.error.call(this, this._data.core.last_error);
-					return callback.call(this, false);
-				}
-				//return callback.call(this, (obj.id === $.jstree.root ? this._append_html_data(obj, $(s)) : false) );
-			}
-			return callback.call(this, false);
-		},
-		/**
-		 * adds a node to the list of nodes to redraw. Used only internally.
-		 * @private
-		 * @name _node_changed(obj [, callback])
-		 * @param  {mixed} obj
-		 */
-		_node_changed : function (obj) {
-			obj = this.get_node(obj);
-      if (obj && $.inArray(obj.id, this._model.changed) === -1) {
-				this._model.changed.push(obj.id);
-			}
-		},
-		/**
-		 * appends HTML content to the tree. Used internally.
-		 * @private
-		 * @name _append_html_data(obj, data)
-		 * @param  {mixed} obj the node to append to
-		 * @param  {String} data the HTML string to parse and append
-		 * @trigger model.jstree, changed.jstree
-		 */
-		_append_html_data : function (dom, data, cb) {
-			dom = this.get_node(dom);
-			dom.children = [];
-			dom.children_d = [];
-			var dat = data.is('ul') ? data.children() : data,
-				par = dom.id,
-				chd = [],
-				dpc = [],
-				m = this._model.data,
-				p = m[par],
-				s = this._data.core.selected.length,
-				tmp, i, j;
-			dat.each(function (i, v) {
-				tmp = this._parse_model_from_html($(v), par, p.parents.concat());
-				if(tmp) {
-					chd.push(tmp);
-					dpc.push(tmp);
-					if(m[tmp].children_d.length) {
-						dpc = dpc.concat(m[tmp].children_d);
-					}
-				}
-			}.bind(this));
-			p.children = chd;
-			p.children_d = dpc;
-			for(i = 0, j = p.parents.length; i < j; i++) {
-				m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);
-			}
-			/**
-			 * triggered when new data is inserted to the tree model
-			 * @event
-			 * @name model.jstree
-			 * @param {Array} nodes an array of node IDs
-			 * @param {String} parent the parent ID of the nodes
-			 */
-			this.trigger('model', { "nodes" : dpc, 'parent' : par });
-			if(par !== $.jstree.root) {
-				this._node_changed(par);
-				this.redraw();
-			}
-			else {
-				this.get_container_ul().children('.jstree-initial-node').remove();
-				this.redraw(true);
-			}
-			if(this._data.core.selected.length !== s) {
-				this.trigger('changed', { 'action' : 'model', 'selected' : this._data.core.selected });
-			}
-			cb.call(this, true);
-		},
-		/**
-		 * appends JSON content to the tree. Used internally.
-		 * @private
-		 * @name _append_json_data(obj, data)
-		 * @param  {mixed} obj the node to append to
-		 * @param  {String} data the JSON object to parse and append
-		 * @param  {Boolean} force_processing internal param - do not set
-		 * @trigger model.jstree, changed.jstree
-		 */
-		_append_json_data : function (dom, data, cb, force_processing) {
-			if(this.element === null) { return; }
-			dom = this.get_node(dom);
-			dom.children = [];
-			dom.children_d = [];
-			// *%$@!!!
-			if(data.d) {
-				data = data.d;
-				if(typeof data === "string") {
-					data = JSON.parse(data);
-				}
-			}
-			if(!$.vakata.is_array(data)) { data = [data]; }
-			var w = null,
-				args = {
-					'df'	: this._model.default_state,
-					'dat'	: data,
-					'par'	: dom.id,
-					'm'		: this._model.data,
-					't_id'	: this._id,
-					't_cnt'	: this._cnt,
-					'sel'	: this._data.core.selected
-				},
-				inst = this,
-				func = function (data, undefined) {
-					if(data.data) { data = data.data; }
-					var dat = data.dat,
-						par = data.par,
-						chd = [],
-						dpc = [],
-						add = [],
-						df = data.df,
-						t_id = data.t_id,
-						t_cnt = data.t_cnt,
-						m = data.m,
-						p = m[par],
-						sel = data.sel,
-						tmp, i, j, rslt,
-						parse_flat = function (d, p, ps) {
-							if(!ps) { ps = []; }
-							else { ps = ps.concat(); }
-							if(p) { ps.unshift(p); }
-							var tid = d.id.toString(),
-								i, j, c, e,
-								tmp = {
-									id			: tid,
-									text		: d.text || '',
-									icon		: d.icon !== undefined ? d.icon : true,
-									parent		: p,
-									parents		: ps,
-									children	: d.children || [],
-									children_d	: d.children_d || [],
-									data		: d.data,
-									state		: { },
-									li_attr		: { id : false },
-									a_attr		: { href : '#' },
-									original	: false
-								};
-							for(i in df) {
-								if(df.hasOwnProperty(i)) {
-									tmp.state[i] = df[i];
-								}
-							}
-							if(d && d.data && d.data.jstree && d.data.jstree.icon) {
-								tmp.icon = d.data.jstree.icon;
-							}
-							if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") {
-								tmp.icon = true;
-							}
-							if(d && d.data) {
-								tmp.data = d.data;
-								if(d.data.jstree) {
-									for(i in d.data.jstree) {
-										if(d.data.jstree.hasOwnProperty(i)) {
-											tmp.state[i] = d.data.jstree[i];
-										}
-									}
-								}
-							}
-							if(d && typeof d.state === 'object') {
-								for (i in d.state) {
-									if(d.state.hasOwnProperty(i)) {
-										tmp.state[i] = d.state[i];
-									}
-								}
-							}
-							if(d && typeof d.li_attr === 'object') {
-								for (i in d.li_attr) {
-									if(d.li_attr.hasOwnProperty(i)) {
-										tmp.li_attr[i] = d.li_attr[i];
-									}
-								}
-							}
-							if(!tmp.li_attr.id) {
-								tmp.li_attr.id = tid;
-							}
-							if(d && typeof d.a_attr === 'object') {
-								for (i in d.a_attr) {
-									if(d.a_attr.hasOwnProperty(i)) {
-										tmp.a_attr[i] = d.a_attr[i];
-									}
-								}
-							}
-							if(d && d.children && d.children === true) {
-								tmp.state.loaded = false;
-								tmp.children = [];
-								tmp.children_d = [];
-							}
-							m[tmp.id] = tmp;
-							for(i = 0, j = tmp.children.length; i < j; i++) {
-								c = parse_flat(m[tmp.children[i]], tmp.id, ps);
-								e = m[c];
-								tmp.children_d.push(c);
-								if(e.children_d.length) {
-									tmp.children_d = tmp.children_d.concat(e.children_d);
-								}
-							}
-							delete d.data;
-							delete d.children;
-							m[tmp.id].original = d;
-							if(tmp.state.selected) {
-								add.push(tmp.id);
-							}
-							return tmp.id;
-						},
-						parse_nest = function (d, p, ps) {
-							if(!ps) { ps = []; }
-							else { ps = ps.concat(); }
-							if(p) { ps.unshift(p); }
-							var tid = false, i, j, c, e, tmp;
-							do {
-								tid = 'j' + t_id + '_' + (++t_cnt);
-							} while(m[tid]);
-
-							tmp = {
-								id			: false,
-								text		: typeof d === 'string' ? d : '',
-								icon		: typeof d === 'object' && d.icon !== undefined ? d.icon : true,
-								parent		: p,
-								parents		: ps,
-								children	: [],
-								children_d	: [],
-								data		: null,
-								state		: { },
-								li_attr		: { id : false },
-								a_attr		: { href : '#' },
-								original	: false
-							};
-							for(i in df) {
-								if(df.hasOwnProperty(i)) {
-									tmp.state[i] = df[i];
-								}
-							}
-							if(d && (d.id || d.id === 0)) { tmp.id = d.id.toString(); }
-							if(d && d.text) { tmp.text = d.text; }
-							if(d && d.data && d.data.jstree && d.data.jstree.icon) {
-								tmp.icon = d.data.jstree.icon;
-							}
-							if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") {
-								tmp.icon = true;
-							}
-							if(d && d.data) {
-								tmp.data = d.data;
-								if(d.data.jstree) {
-									for(i in d.data.jstree) {
-										if(d.data.jstree.hasOwnProperty(i)) {
-											tmp.state[i] = d.data.jstree[i];
-										}
-									}
-								}
-							}
-							if(d && typeof d.state === 'object') {
-								for (i in d.state) {
-									if(d.state.hasOwnProperty(i)) {
-										tmp.state[i] = d.state[i];
-									}
-								}
-							}
-							if(d && typeof d.li_attr === 'object') {
-								for (i in d.li_attr) {
-									if(d.li_attr.hasOwnProperty(i)) {
-										tmp.li_attr[i] = d.li_attr[i];
-									}
-								}
-							}
-							if(tmp.li_attr.id && !(tmp.id || tmp.id === 0)) {
-								tmp.id = tmp.li_attr.id.toString();
-							}
-							if(!(tmp.id || tmp.id === 0)) {
-								tmp.id = tid;
-							}
-							if(!tmp.li_attr.id) {
-								tmp.li_attr.id = tmp.id;
-							}
-							if(d && typeof d.a_attr === 'object') {
-								for (i in d.a_attr) {
-									if(d.a_attr.hasOwnProperty(i)) {
-										tmp.a_attr[i] = d.a_attr[i];
-									}
-								}
-							}
-							if(d && d.children && d.children.length) {
-								for(i = 0, j = d.children.length; i < j; i++) {
-									c = parse_nest(d.children[i], tmp.id, ps);
-									e = m[c];
-									tmp.children.push(c);
-									if(e.children_d.length) {
-										tmp.children_d = tmp.children_d.concat(e.children_d);
-									}
-								}
-								tmp.children_d = tmp.children_d.concat(tmp.children);
-							}
-							if(d && d.children && d.children === true) {
-								tmp.state.loaded = false;
-								tmp.children = [];
-								tmp.children_d = [];
-							}
-							delete d.data;
-							delete d.children;
-							tmp.original = d;
-							m[tmp.id] = tmp;
-							if(tmp.state.selected) {
-								add.push(tmp.id);
-							}
-							return tmp.id;
-						};
-
-					if(dat.length && dat[0].id !== undefined && dat[0].parent !== undefined) {
-						// Flat JSON support (for easy import from DB):
-						// 1) convert to object (foreach)
-						for(i = 0, j = dat.length; i < j; i++) {
-							if(!dat[i].children) {
-								dat[i].children = [];
-							}
-							if(!dat[i].state) {
-								dat[i].state = {};
-							}
-							m[dat[i].id.toString()] = dat[i];
-						}
-						// 2) populate children (foreach)
-						for(i = 0, j = dat.length; i < j; i++) {
-							if (!m[dat[i].parent.toString()]) {
-								if (typeof inst !== "undefined") {
-									inst._data.core.last_error = { 'error' : 'parse', 'plugin' : 'core', 'id' : 'core_07', 'reason' : 'Node with invalid parent', 'data' : JSON.stringify({ 'id' : dat[i].id.toString(), 'parent' : dat[i].parent.toString() }) };
-									inst.settings.core.error.call(inst, inst._data.core.last_error);
-								}
-								continue;
-							}
-
-							m[dat[i].parent.toString()].children.push(dat[i].id.toString());
-							// populate parent.children_d
-							p.children_d.push(dat[i].id.toString());
-						}
-						// 3) normalize && populate parents and children_d with recursion
-						for(i = 0, j = p.children.length; i < j; i++) {
-							tmp = parse_flat(m[p.children[i]], par, p.parents.concat());
-							dpc.push(tmp);
-							if(m[tmp].children_d.length) {
-								dpc = dpc.concat(m[tmp].children_d);
-							}
-						}
-						for(i = 0, j = p.parents.length; i < j; i++) {
-							m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);
-						}
-						// ?) three_state selection - p.state.selected && t - (if three_state foreach(dat => ch) -> foreach(parents) if(parent.selected) child.selected = true;
-						rslt = {
-							'cnt' : t_cnt,
-							'mod' : m,
-							'sel' : sel,
-							'par' : par,
-							'dpc' : dpc,
-							'add' : add
-						};
-					}
-					else {
-						for(i = 0, j = dat.length; i < j; i++) {
-							tmp = parse_nest(dat[i], par, p.parents.concat());
-							if(tmp) {
-								chd.push(tmp);
-								dpc.push(tmp);
-								if(m[tmp].children_d.length) {
-									dpc = dpc.concat(m[tmp].children_d);
-								}
-							}
-						}
-						p.children = chd;
-						p.children_d = dpc;
-						for(i = 0, j = p.parents.length; i < j; i++) {
-							m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);
-						}
-						rslt = {
-							'cnt' : t_cnt,
-							'mod' : m,
-							'sel' : sel,
-							'par' : par,
-							'dpc' : dpc,
-							'add' : add
-						};
-					}
-					if(typeof window === 'undefined' || typeof window.document === 'undefined') {
-						postMessage(rslt);
-					}
-					else {
-						return rslt;
-					}
-				},
-				rslt = function (rslt, worker) {
-					if(this.element === null) { return; }
-					this._cnt = rslt.cnt;
-					var i, m = this._model.data;
-					for (i in m) {
-						if (m.hasOwnProperty(i) && m[i].state && m[i].state.loading && rslt.mod[i]) {
-							rslt.mod[i].state.loading = true;
-						}
-					}
-					this._model.data = rslt.mod; // breaks the reference in load_node - careful
-
-					if(worker) {
-						var j, a = rslt.add, r = rslt.sel, s = this._data.core.selected.slice();
-						m = this._model.data;
-						// if selection was changed while calculating in worker
-						if(r.length !== s.length || $.vakata.array_unique(r.concat(s)).length !== r.length) {
-							// deselect nodes that are no longer selected
-							for(i = 0, j = r.length; i < j; i++) {
-								if($.inArray(r[i], a) === -1 && $.inArray(r[i], s) === -1) {
-									m[r[i]].state.selected = false;
-								}
-							}
-							// select nodes that were selected in the mean time
-							for(i = 0, j = s.length; i < j; i++) {
-								if($.inArray(s[i], r) === -1) {
-									m[s[i]].state.selected = true;
-								}
-							}
-						}
-					}
-					if(rslt.add.length) {
-						this._data.core.selected = this._data.core.selected.concat(rslt.add);
-					}
-
-					this.trigger('model', { "nodes" : rslt.dpc, 'parent' : rslt.par });
-
-					if(rslt.par !== $.jstree.root) {
-						this._node_changed(rslt.par);
-						this.redraw();
-					}
-					else {
-						// this.get_container_ul().children('.jstree-initial-node').remove();
-						this.redraw(true);
-					}
-					if(rslt.add.length) {
-						this.trigger('changed', { 'action' : 'model', 'selected' : this._data.core.selected });
-					}
-
-					// If no worker, try to mimic worker behavioour, by invoking cb asynchronously
-					if (!worker && setImmediate) {
-						setImmediate(function(){
-							cb.call(inst, true);
-						});
-					}
-					else {
-						cb.call(inst, true);
-					}
-				};
-			if(this.settings.core.worker && window.Blob && window.URL && window.Worker) {
-				try {
-					if(this._wrk === null) {
-						this._wrk = window.URL.createObjectURL(
-							new window.Blob(
-								['self.onmessage = ' + func.toString()],
-								{type:"text/javascript"}
-							)
-						);
-					}
-					if(!this._data.core.working || force_processing) {
-						this._data.core.working = true;
-						w = new window.Worker(this._wrk);
-						w.onmessage = function (e) {
-							rslt.call(this, e.data, true);
-							try { w.terminate(); w = null; } catch(ignore) { }
-							if(this._data.core.worker_queue.length) {
-								this._append_json_data.apply(this, this._data.core.worker_queue.shift());
-							}
-							else {
-								this._data.core.working = false;
-							}
-						}.bind(this);
-						w.onerror = function (e) {
-							rslt.call(this, func(args), false);
-							if(this._data.core.worker_queue.length) {
-								this._append_json_data.apply(this, this._data.core.worker_queue.shift());
-							}
-							else {
-								this._data.core.working = false;
-							}
-						}.bind(this);
-						if(!args.par) {
-							if(this._data.core.worker_queue.length) {
-								this._append_json_data.apply(this, this._data.core.worker_queue.shift());
-							}
-							else {
-								this._data.core.working = false;
-							}
-						}
-						else {
-							w.postMessage(args);
-						}
-					}
-					else {
-						this._data.core.worker_queue.push([dom, data, cb, true]);
-					}
-				}
-				catch(e) {
-					rslt.call(this, func(args), false);
-					if(this._data.core.worker_queue.length) {
-						this._append_json_data.apply(this, this._data.core.worker_queue.shift());
-					}
-					else {
-						this._data.core.working = false;
-					}
-				}
-			}
-			else {
-				rslt.call(this, func(args), false);
-			}
-		},
-		/**
-		 * parses a node from a jQuery object and appends them to the in memory tree model. Used internally.
-		 * @private
-		 * @name _parse_model_from_html(d [, p, ps])
-		 * @param  {jQuery} d the jQuery object to parse
-		 * @param  {String} p the parent ID
-		 * @param  {Array} ps list of all parents
-		 * @return {String} the ID of the object added to the model
-		 */
-		_parse_model_from_html : function (d, p, ps) {
-			if(!ps) { ps = []; }
-			else { ps = [].concat(ps); }
-			if(p) { ps.unshift(p); }
-			var c, e, m = this._model.data,
-				data = {
-					id			: false,
-					text		: false,
-					icon		: true,
-					parent		: p,
-					parents		: ps,
-					children	: [],
-					children_d	: [],
-					data		: null,
-					state		: { },
-					li_attr		: { id : false },
-					a_attr		: { href : '#' },
-					original	: false
-				}, i, tmp, tid;
-			for(i in this._model.default_state) {
-				if(this._model.default_state.hasOwnProperty(i)) {
-					data.state[i] = this._model.default_state[i];
-				}
-			}
-			tmp = $.vakata.attributes(d, true);
-			$.each(tmp, function (i, v) {
-				v = $.vakata.trim(v);
-				if(!v.length) { return true; }
-				data.li_attr[i] = v;
-				if(i === 'id') {
-					data.id = v.toString();
-				}
-			});
-			tmp = d.children('a').first();
-			if(tmp.length) {
-				tmp = $.vakata.attributes(tmp, true);
-				$.each(tmp, function (i, v) {
-					v = $.vakata.trim(v);
-					if(v.length) {
-						data.a_attr[i] = v;
-					}
-				});
-			}
-			tmp = d.children("a").first().length ? d.children("a").first().clone() : d.clone();
-			tmp.children("ins, i, ul").remove();
-			tmp = tmp.html();
-			tmp = $('<div></div>').html(tmp);
-			data.text = this.settings.core.force_text ? tmp.text() : tmp.html();
-			tmp = d.data();
-			data.data = tmp ? $.extend(true, {}, tmp) : null;
-			data.state.opened = d.hasClass('jstree-open');
-			data.state.selected = d.children('a').hasClass('jstree-clicked');
-			data.state.disabled = d.children('a').hasClass('jstree-disabled');
-			if(data.data && data.data.jstree) {
-				for(i in data.data.jstree) {
-					if(data.data.jstree.hasOwnProperty(i)) {
-						data.state[i] = data.data.jstree[i];
-					}
-				}
-			}
-			tmp = d.children("a").children(".jstree-themeicon");
-			if(tmp.length) {
-				data.icon = tmp.hasClass('jstree-themeicon-hidden') ? false : tmp.attr('rel');
-			}
-			if(data.state.icon !== undefined) {
-				data.icon = data.state.icon;
-			}
-			if(data.icon === undefined || data.icon === null || data.icon === "") {
-				data.icon = true;
-			}
-			tmp = d.children("ul").children("li");
-			do {
-				tid = 'j' + this._id + '_' + (++this._cnt);
-			} while(m[tid]);
-			data.id = data.li_attr.id ? data.li_attr.id.toString() : tid;
-			if(tmp.length) {
-				tmp.each(function (i, v) {
-					c = this._parse_model_from_html($(v), data.id, ps);
-					e = this._model.data[c];
-					data.children.push(c);
-					if(e.children_d.length) {
-						data.children_d = data.children_d.concat(e.children_d);
-					}
-				}.bind(this));
-				data.children_d = data.children_d.concat(data.children);
-			}
-			else {
-				if(d.hasClass('jstree-closed')) {
-					data.state.loaded = false;
-				}
-			}
-			if(data.li_attr['class']) {
-				data.li_attr['class'] = data.li_attr['class'].replace('jstree-closed','').replace('jstree-open','');
-			}
-			if(data.a_attr['class']) {
-				data.a_attr['class'] = data.a_attr['class'].replace('jstree-clicked','').replace('jstree-disabled','');
-			}
-			m[data.id] = data;
-			if(data.state.selected) {
-				this._data.core.selected.push(data.id);
-			}
-			return data.id;
-		},
-		/**
-		 * parses a node from a JSON object (used when dealing with flat data, which has no nesting of children, but has id and parent properties) and appends it to the in memory tree model. Used internally.
-		 * @private
-		 * @name _parse_model_from_flat_json(d [, p, ps])
-		 * @param  {Object} d the JSON object to parse
-		 * @param  {String} p the parent ID
-		 * @param  {Array} ps list of all parents
-		 * @return {String} the ID of the object added to the model
-		 */
-		_parse_model_from_flat_json : function (d, p, ps) {
-			if(!ps) { ps = []; }
-			else { ps = ps.concat(); }
-			if(p) { ps.unshift(p); }
-			var tid = d.id.toString(),
-				m = this._model.data,
-				df = this._model.default_state,
-				i, j, c, e,
-				tmp = {
-					id			: tid,
-					text		: d.text || '',
-					icon		: d.icon !== undefined ? d.icon : true,
-					parent		: p,
-					parents		: ps,
-					children	: d.children || [],
-					children_d	: d.children_d || [],
-					data		: d.data,
-					state		: { },
-					li_attr		: { id : false },
-					a_attr		: { href : '#' },
-					original	: false
-				};
-			for(i in df) {
-				if(df.hasOwnProperty(i)) {
-					tmp.state[i] = df[i];
-				}
-			}
-			if(d && d.data && d.data.jstree && d.data.jstree.icon) {
-				tmp.icon = d.data.jstree.icon;
-			}
-			if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") {
-				tmp.icon = true;
-			}
-			if(d && d.data) {
-				tmp.data = d.data;
-				if(d.data.jstree) {
-					for(i in d.data.jstree) {
-						if(d.data.jstree.hasOwnProperty(i)) {
-							tmp.state[i] = d.data.jstree[i];
-						}
-					}
-				}
-			}
-			if(d && typeof d.state === 'object') {
-				for (i in d.state) {
-					if(d.state.hasOwnProperty(i)) {
-						tmp.state[i] = d.state[i];
-					}
-				}
-			}
-			if(d && typeof d.li_attr === 'object') {
-				for (i in d.li_attr) {
-					if(d.li_attr.hasOwnProperty(i)) {
-						tmp.li_attr[i] = d.li_attr[i];
-					}
-				}
-			}
-			if(!tmp.li_attr.id) {
-				tmp.li_attr.id = tid;
-			}
-			if(d && typeof d.a_attr === 'object') {
-				for (i in d.a_attr) {
-					if(d.a_attr.hasOwnProperty(i)) {
-						tmp.a_attr[i] = d.a_attr[i];
-					}
-				}
-			}
-			if(d && d.children && d.children === true) {
-				tmp.state.loaded = false;
-				tmp.children = [];
-				tmp.children_d = [];
-			}
-			m[tmp.id] = tmp;
-			for(i = 0, j = tmp.children.length; i < j; i++) {
-				c = this._parse_model_from_flat_json(m[tmp.children[i]], tmp.id, ps);
-				e = m[c];
-				tmp.children_d.push(c);
-				if(e.children_d.length) {
-					tmp.children_d = tmp.children_d.concat(e.children_d);
-				}
-			}
-			delete d.data;
-			delete d.children;
-			m[tmp.id].original = d;
-			if(tmp.state.selected) {
-				this._data.core.selected.push(tmp.id);
-			}
-			return tmp.id;
-		},
-		/**
-		 * parses a node from a JSON object and appends it to the in memory tree model. Used internally.
-		 * @private
-		 * @name _parse_model_from_json(d [, p, ps])
-		 * @param  {Object} d the JSON object to parse
-		 * @param  {String} p the parent ID
-		 * @param  {Array} ps list of all parents
-		 * @return {String} the ID of the object added to the model
-		 */
-		_parse_model_from_json : function (d, p, ps) {
-			if(!ps) { ps = []; }
-			else { ps = ps.concat(); }
-			if(p) { ps.unshift(p); }
-			var tid = false, i, j, c, e, m = this._model.data, df = this._model.default_state, tmp;
-			do {
-				tid = 'j' + this._id + '_' + (++this._cnt);
-			} while(m[tid]);
-
-			tmp = {
-				id			: false,
-				text		: typeof d === 'string' ? d : '',
-				icon		: typeof d === 'object' && d.icon !== undefined ? d.icon : true,
-				parent		: p,
-				parents		: ps,
-				children	: [],
-				children_d	: [],
-				data		: null,
-				state		: { },
-				li_attr		: { id : false },
-				a_attr		: { href : '#' },
-				original	: false
-			};
-			for(i in df) {
-				if(df.hasOwnProperty(i)) {
-					tmp.state[i] = df[i];
-				}
-			}
-			if(d && (d.id || d.id === 0)) { tmp.id = d.id.toString(); }
-			if(d && d.text) { tmp.text = d.text; }
-			if(d && d.data && d.data.jstree && d.data.jstree.icon) {
-				tmp.icon = d.data.jstree.icon;
-			}
-			if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") {
-				tmp.icon = true;
-			}
-			if(d && d.data) {
-				tmp.data = d.data;
-				if(d.data.jstree) {
-					for(i in d.data.jstree) {
-						if(d.data.jstree.hasOwnProperty(i)) {
-							tmp.state[i] = d.data.jstree[i];
-						}
-					}
-				}
-			}
-			if(d && typeof d.state === 'object') {
-				for (i in d.state) {
-					if(d.state.hasOwnProperty(i)) {
-						tmp.state[i] = d.state[i];
-					}
-				}
-			}
-			if(d && typeof d.li_attr === 'object') {
-				for (i in d.li_attr) {
-					if(d.li_attr.hasOwnProperty(i)) {
-						tmp.li_attr[i] = d.li_attr[i];
-					}
-				}
-			}
-			if(tmp.li_attr.id && !(tmp.id || tmp.id === 0)) {
-				tmp.id = tmp.li_attr.id.toString();
-			}
-			if(!(tmp.id || tmp.id === 0)) {
-				tmp.id = tid;
-			}
-			if(!tmp.li_attr.id) {
-				tmp.li_attr.id = tmp.id;
-			}
-			if(d && typeof d.a_attr === 'object') {
-				for (i in d.a_attr) {
-					if(d.a_attr.hasOwnProperty(i)) {
-						tmp.a_attr[i] = d.a_attr[i];
-					}
-				}
-			}
-			if(d && d.children && d.children.length) {
-				for(i = 0, j = d.children.length; i < j; i++) {
-					c = this._parse_model_from_json(d.children[i], tmp.id, ps);
-					e = m[c];
-					tmp.children.push(c);
-					if(e.children_d.length) {
-						tmp.children_d = tmp.children_d.concat(e.children_d);
-					}
-				}
-				tmp.children_d = tmp.children.concat(tmp.children_d);
-			}
-			if(d && d.children && d.children === true) {
-				tmp.state.loaded = false;
-				tmp.children = [];
-				tmp.children_d = [];
-			}
-			delete d.data;
-			delete d.children;
-			tmp.original = d;
-			m[tmp.id] = tmp;
-			if(tmp.state.selected) {
-				this._data.core.selected.push(tmp.id);
-			}
-			return tmp.id;
-		},
-		/**
-		 * redraws all nodes that need to be redrawn. Used internally.
-		 * @private
-		 * @name _redraw()
-		 * @trigger redraw.jstree
-		 */
-		_redraw : function () {
-			var nodes = this._model.force_full_redraw ? this._model.data[$.jstree.root].children.concat([]) : this._model.changed.concat([]),
-				f = document.createElement('UL'), tmp, i, j, fe = this._data.core.focused;
-			for(i = 0, j = nodes.length; i < j; i++) {
-				tmp = this.redraw_node(nodes[i], true, this._model.force_full_redraw);
-				if(tmp && this._model.force_full_redraw) {
-					f.appendChild(tmp);
-				}
-			}
-			if(this._model.force_full_redraw) {
-				f.className = this.get_container_ul()[0].className;
-				f.setAttribute('role','presentation');
-				this.element.empty().append(f);
-				//this.get_container_ul()[0].appendChild(f);
-			}
-			if(fe !== null && this.settings.core.restore_focus) {
-				tmp = this.get_node(fe, true);
-				if(tmp && tmp.length && tmp.children('.jstree-anchor')[0] !== document.activeElement) {
-					tmp.children('.jstree-anchor').trigger('focus');
-				}
-				else {
-					this._data.core.focused = null;
-				}
-			}
-			this._model.force_full_redraw = false;
-			this._model.changed = [];
-			/**
-			 * triggered after nodes are redrawn
-			 * @event
-			 * @name redraw.jstree
-			 * @param {array} nodes the redrawn nodes
-			 */
-			this.trigger('redraw', { "nodes" : nodes });
-		},
-		/**
-		 * redraws all nodes that need to be redrawn or optionally - the whole tree
-		 * @name redraw([full])
-		 * @param {Boolean} full if set to `true` all nodes are redrawn.
-		 */
-		redraw : function (full) {
-			if(full) {
-				this._model.force_full_redraw = true;
-			}
-			//if(this._model.redraw_timeout) {
-			//	clearTimeout(this._model.redraw_timeout);
-			//}
-			//this._model.redraw_timeout = setTimeout($.proxy(this._redraw, this),0);
-			this._redraw();
-		},
-		/**
-		 * redraws a single node's children. Used internally.
-		 * @private
-		 * @name draw_children(node)
-		 * @param {mixed} node the node whose children will be redrawn
-		 */
-		draw_children : function (node) {
-			var obj = this.get_node(node),
-				i = false,
-				j = false,
-				k = false,
-				d = document;
-			if(!obj) { return false; }
-			if(obj.id === $.jstree.root) { return this.redraw(true); }
-			node = this.get_node(node, true);
-			if(!node || !node.length) { return false; } // TODO: quick toggle
-
-			node.children('.jstree-children').remove();
-			node = node[0];
-			if(obj.children.length && obj.state.loaded) {
-				k = d.createElement('UL');
-				k.setAttribute('role', 'group');
-				k.className = 'jstree-children';
-				for(i = 0, j = obj.children.length; i < j; i++) {
-					k.appendChild(this.redraw_node(obj.children[i], true, true));
-				}
-				node.appendChild(k);
-			}
-		},
-		/**
-		 * redraws a single node. Used internally.
-		 * @private
-		 * @name redraw_node(node, deep, is_callback, force_render)
-		 * @param {mixed} node the node to redraw
-		 * @param {Boolean} deep should child nodes be redrawn too
-		 * @param {Boolean} is_callback is this a recursion call
-		 * @param {Boolean} force_render should children of closed parents be drawn anyway
-		 */
-		redraw_node : function (node, deep, is_callback, force_render) {
-			var obj = this.get_node(node),
-				par = false,
-				ind = false,
-				old = false,
-				i = false,
-				j = false,
-				k = false,
-				c = '',
-				d = document,
-				m = this._model.data,
-				f = false,
-				s = false,
-				tmp = null,
-				t = 0,
-				l = 0,
-				has_children = false,
-				last_sibling = false;
-			if(!obj) { return false; }
-			if(obj.id === $.jstree.root) {  return this.redraw(true); }
-			deep = deep || obj.children.length === 0;
-			node = !document.querySelector ? document.getElementById(obj.id) : this.element[0].querySelector('#' + ("0123456789".indexOf(obj.id[0]) !== -1 ? '\\3' + obj.id[0] + ' ' + obj.id.substr(1).replace($.jstree.idregex,'\\$&') : obj.id.replace($.jstree.idregex,'\\$&')) ); //, this.element);
-			if(!node) {
-				deep = true;
-				//node = d.createElement('LI');
-				if(!is_callback) {
-					par = obj.parent !== $.jstree.root ? $('#' + obj.parent.replace($.jstree.idregex,'\\$&'), this.element)[0] : null;
-					if(par !== null && (!par || !m[obj.parent].state.opened)) {
-						return false;
-					}
-					ind = $.inArray(obj.id, par === null ? m[$.jstree.root].children : m[obj.parent].children);
-				}
-			}
-			else {
-				node = $(node);
-				if(!is_callback) {
-					par = node.parent().parent()[0];
-					if(par === this.element[0]) {
-						par = null;
-					}
-					ind = node.index();
-				}
-				// m[obj.id].data = node.data(); // use only node's data, no need to touch jquery storage
-				if(!deep && obj.children.length && !node.children('.jstree-children').length) {
-					deep = true;
-				}
-				if(!deep) {
-					old = node.children('.jstree-children')[0];
-				}
-				f = node.children('.jstree-anchor')[0] === document.activeElement;
-				node.remove();
-				//node = d.createElement('LI');
-				//node = node[0];
-			}
-			node = this._data.core.node.cloneNode(true);
-			// node is DOM, deep is boolean
-
-			c = 'jstree-node ';
-			for(i in obj.li_attr) {
-				if(obj.li_attr.hasOwnProperty(i)) {
-					if(i === 'id') { continue; }
-					if(i !== 'class') {
-						node.setAttribute(i, obj.li_attr[i]);
-					}
-					else {
-						c += obj.li_attr[i];
-					}
-				}
-			}
-			if(!obj.a_attr.id) {
-				obj.a_attr.id = obj.id + '_anchor';
-			}
-			node.childNodes[1].setAttribute('aria-selected', !!obj.state.selected);
-			node.childNodes[1].setAttribute('aria-level', obj.parents.length);
-			if(this.settings.core.compute_elements_positions) {
-				node.childNodes[1].setAttribute('aria-setsize', m[obj.parent].children.length);
-				node.childNodes[1].setAttribute('aria-posinset', m[obj.parent].children.indexOf(obj.id) + 1);
-			}
-			if(obj.state.disabled) {
-				node.childNodes[1].setAttribute('aria-disabled', true);
-			}
-
-			for(i = 0, j = obj.children.length; i < j; i++) {
-				if(!m[obj.children[i]].state.hidden) {
-					has_children = true;
-					break;
-				}
-			}
-			if(obj.parent !== null && m[obj.parent] && !obj.state.hidden) {
-				i = $.inArray(obj.id, m[obj.parent].children);
-				last_sibling = obj.id;
-				if(i !== -1) {
-					i++;
-					for(j = m[obj.parent].children.length; i < j; i++) {
-						if(!m[m[obj.parent].children[i]].state.hidden) {
-							last_sibling = m[obj.parent].children[i];
-						}
-						if(last_sibling !== obj.id) {
-							break;
-						}
-					}
-				}
-			}
-
-			if(obj.state.hidden) {
-				c += ' jstree-hidden';
-			}
-			if (obj.state.loading) {
-				c += ' jstree-loading';
-			}
-			if(obj.state.loaded && !has_children) {
-				c += ' jstree-leaf';
-			}
-			else {
-				c += obj.state.opened && obj.state.loaded ? ' jstree-open' : ' jstree-closed';
-				node.childNodes[1].setAttribute('aria-expanded', (obj.state.opened && obj.state.loaded) );
-			}
-			if(last_sibling === obj.id) {
-				c += ' jstree-last';
-			}
-			node.id = obj.id;
-			node.className = c;
-			c = ( obj.state.selected ? ' jstree-clicked' : '') + ( obj.state.disabled ? ' jstree-disabled' : '');
-			for(j in obj.a_attr) {
-				if(obj.a_attr.hasOwnProperty(j)) {
-					if(j === 'href' && obj.a_attr[j] === '#') { continue; }
-					if(j !== 'class') {
-						node.childNodes[1].setAttribute(j, obj.a_attr[j]);
-					}
-					else {
-						c += ' ' + obj.a_attr[j];
-					}
-				}
-			}
-			if(c.length) {
-				node.childNodes[1].className = 'jstree-anchor ' + c;
-			}
-			if((obj.icon && obj.icon !== true) || obj.icon === false) {
-				if(obj.icon === false) {
-					node.childNodes[1].childNodes[0].className += ' jstree-themeicon-hidden';
-				}
-				else if(obj.icon.indexOf('/') === -1 && obj.icon.indexOf('.') === -1) {
-					node.childNodes[1].childNodes[0].className += ' ' + obj.icon + ' jstree-themeicon-custom';
-				}
-				else {
-					node.childNodes[1].childNodes[0].style.backgroundImage = 'url("'+obj.icon+'")';
-					node.childNodes[1].childNodes[0].style.backgroundPosition = 'center center';
-					node.childNodes[1].childNodes[0].style.backgroundSize = 'auto';
-					node.childNodes[1].childNodes[0].className += ' jstree-themeicon-custom';
-				}
-			}
-
-			if(this.settings.core.force_text) {
-				node.childNodes[1].appendChild(d.createTextNode(obj.text));
-			}
-			else {
-				node.childNodes[1].innerHTML += obj.text;
-			}
-
-
-			if(deep && obj.children.length && (obj.state.opened || force_render) && obj.state.loaded) {
-				k = d.createElement('UL');
-				k.setAttribute('role', 'group');
-				k.className = 'jstree-children';
-				for(i = 0, j = obj.children.length; i < j; i++) {
-					k.appendChild(this.redraw_node(obj.children[i], deep, true));
-				}
-				node.appendChild(k);
-			}
-			if(old) {
-				node.appendChild(old);
-			}
-			if(!is_callback) {
-				// append back using par / ind
-				if(!par) {
-					par = this.element[0];
-				}
-				for(i = 0, j = par.childNodes.length; i < j; i++) {
-					if(par.childNodes[i] && par.childNodes[i].className && par.childNodes[i].className.indexOf('jstree-children') !== -1) {
-						tmp = par.childNodes[i];
-						break;
-					}
-				}
-				if(!tmp) {
-					tmp = d.createElement('UL');
-					tmp.setAttribute('role', 'group');
-					tmp.className = 'jstree-children';
-					par.appendChild(tmp);
-				}
-				par = tmp;
-
-				if(ind < par.childNodes.length) {
-					par.insertBefore(node, par.childNodes[ind]);
-				}
-				else {
-					par.appendChild(node);
-				}
-				if(f) {
-					t = this.element[0].scrollTop;
-					l = this.element[0].scrollLeft;
-					node.childNodes[1].focus();
-					this.element[0].scrollTop = t;
-					this.element[0].scrollLeft = l;
-				}
-			}
-			if(obj.state.opened && !obj.state.loaded) {
-				obj.state.opened = false;
-				setTimeout(function () {
-					this.open_node(obj.id, false, 0);
-				}.bind(this), 0);
-			}
-			return node;
-		},
-		/**
-		 * opens a node, revealing its children. If the node is not loaded it will be loaded and opened once ready.
-		 * @name open_node(obj [, callback, animation])
-		 * @param {mixed} obj the node to open
-		 * @param {Function} callback a function to execute once the node is opened
-		 * @param {Number} animation the animation duration in milliseconds when opening the node (overrides the `core.animation` setting). Use `false` for no animation.
-		 * @trigger open_node.jstree, after_open.jstree, before_open.jstree
-		 */
-		open_node : function (obj, callback, animation) {
-			var t1, t2, d, t;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.open_node(obj[t1], callback, animation);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			animation = animation === undefined ? this.settings.core.animation : animation;
-			if(!this.is_closed(obj)) {
-				if(callback) {
-					callback.call(this, obj, false);
-				}
-				return false;
-			}
-			if(!this.is_loaded(obj)) {
-				if(this.is_loading(obj)) {
-					return setTimeout(function () {
-						this.open_node(obj, callback, animation);
-					}.bind(this), 500);
-				}
-				this.load_node(obj, function (o, ok) {
-					return ok ? this.open_node(o, callback, animation) : (callback ? callback.call(this, o, false) : false);
-				});
-			}
-			else {
-				d = this.get_node(obj, true);
-				t = this;
-				if(d.length) {
-					if(animation && d.children(".jstree-children").length) {
-						d.children(".jstree-children").stop(true, true);
-					}
-					if(obj.children.length && !this._firstChild(d.children('.jstree-children')[0])) {
-						this.draw_children(obj);
-						//d = this.get_node(obj, true);
-					}
-					if(!animation) {
-						this.trigger('before_open', { "node" : obj });
-						d[0].className = d[0].className.replace('jstree-closed', 'jstree-open');
-						d[0].childNodes[1].setAttribute("aria-expanded", true);
-					}
-					else {
-						this.trigger('before_open', { "node" : obj });
-						d
-							.children(".jstree-children").css("display","none").end()
-							.removeClass("jstree-closed").addClass("jstree-open")
-								.children('.jstree-anchor').attr("aria-expanded", true).end()
-							.children(".jstree-children").stop(true, true)
-								.slideDown(animation, function () {
-									this.style.display = "";
-									if (t.element) {
-										t.trigger("after_open", { "node" : obj });
-									}
-								});
-					}
-				}
-				obj.state.opened = true;
-				if(callback) {
-					callback.call(this, obj, true);
-				}
-				if(!d.length) {
-					/**
-					 * triggered when a node is about to be opened (if the node is supposed to be in the DOM, it will be, but it won't be visible yet)
-					 * @event
-					 * @name before_open.jstree
-					 * @param {Object} node the opened node
-					 */
-					this.trigger('before_open', { "node" : obj });
-				}
-				/**
-				 * triggered when a node is opened (if there is an animation it will not be completed yet)
-				 * @event
-				 * @name open_node.jstree
-				 * @param {Object} node the opened node
-				 */
-				this.trigger('open_node', { "node" : obj });
-				if(!animation || !d.length) {
-					/**
-					 * triggered when a node is opened and the animation is complete
-					 * @event
-					 * @name after_open.jstree
-					 * @param {Object} node the opened node
-					 */
-					this.trigger("after_open", { "node" : obj });
-				}
-				return true;
-			}
-		},
-		/**
-		 * opens every parent of a node (node should be loaded)
-		 * @name _open_to(obj)
-		 * @param {mixed} obj the node to reveal
-		 * @private
-		 */
-		_open_to : function (obj) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			var i, j, p = obj.parents;
-			for(i = 0, j = p.length; i < j; i+=1) {
-				if(i !== $.jstree.root) {
-					this.open_node(p[i], false, 0);
-				}
-			}
-			return $('#' + obj.id.replace($.jstree.idregex,'\\$&'), this.element);
-		},
-		/**
-		 * closes a node, hiding its children
-		 * @name close_node(obj [, animation])
-		 * @param {mixed} obj the node to close
-		 * @param {Number} animation the animation duration in milliseconds when closing the node (overrides the `core.animation` setting). Use `false` for no animation.
-		 * @trigger close_node.jstree, after_close.jstree
-		 */
-		close_node : function (obj, animation) {
-			var t1, t2, t, d;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.close_node(obj[t1], animation);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			if(this.is_closed(obj)) {
-				return false;
-			}
-			animation = animation === undefined ? this.settings.core.animation : animation;
-			t = this;
-			d = this.get_node(obj, true);
-
-			obj.state.opened = false;
-			/**
-			 * triggered when a node is closed (if there is an animation it will not be complete yet)
-			 * @event
-			 * @name close_node.jstree
-			 * @param {Object} node the closed node
-			 */
-			this.trigger('close_node',{ "node" : obj });
-			if(!d.length) {
-				/**
-				 * triggered when a node is closed and the animation is complete
-				 * @event
-				 * @name after_close.jstree
-				 * @param {Object} node the closed node
-				 */
-				this.trigger("after_close", { "node" : obj });
-			}
-			else {
-				if(!animation) {
-					d[0].className = d[0].className.replace('jstree-open', 'jstree-closed');
-					d.children('.jstree-anchor').attr("aria-expanded", false);
-					d.children('.jstree-children').remove();
-					this.trigger("after_close", { "node" : obj });
-				}
-				else {
-					d
-						.children(".jstree-children").attr("style","display:block !important").end()
-						.removeClass("jstree-open").addClass("jstree-closed")
-							.children('.jstree-anchor').attr("aria-expanded", false).end()
-						.children(".jstree-children").stop(true, true).slideUp(animation, function () {
-							this.style.display = "";
-							d.children('.jstree-children').remove();
-							if (t.element) {
-								t.trigger("after_close", { "node" : obj });
-							}
-						});
-				}
-			}
-		},
-		/**
-		 * toggles a node - closing it if it is open, opening it if it is closed
-		 * @name toggle_node(obj)
-		 * @param {mixed} obj the node to toggle
-		 */
-		toggle_node : function (obj) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.toggle_node(obj[t1]);
-				}
-				return true;
-			}
-			if(this.is_closed(obj)) {
-				return this.open_node(obj);
-			}
-			if(this.is_open(obj)) {
-				return this.close_node(obj);
-			}
-		},
-		/**
-		 * opens all nodes within a node (or the tree), revealing their children. If the node is not loaded it will be loaded and opened once ready.
-		 * @name open_all([obj, animation, original_obj])
-		 * @param {mixed} obj the node to open recursively, omit to open all nodes in the tree
-		 * @param {Number} animation the animation duration in milliseconds when opening the nodes, the default is no animation
-		 * @param {jQuery} reference to the node that started the process (internal use)
-		 * @trigger open_all.jstree
-		 */
-		open_all : function (obj, animation, original_obj) {
-			if(!obj) { obj = $.jstree.root; }
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			var dom = obj.id === $.jstree.root ? this.get_container_ul() : this.get_node(obj, true), i, j, _this;
-			if(!dom.length) {
-				for(i = 0, j = obj.children_d.length; i < j; i++) {
-					if(this.is_closed(this._model.data[obj.children_d[i]])) {
-						this._model.data[obj.children_d[i]].state.opened = true;
-					}
-				}
-				return this.trigger('open_all', { "node" : obj });
-			}
-			original_obj = original_obj || dom;
-			_this = this;
-			dom = this.is_closed(obj) ? dom.find('.jstree-closed').addBack() : dom.find('.jstree-closed');
-			dom.each(function () {
-				_this.open_node(
-					this,
-					function(node, status) { if(status && this.is_parent(node)) { this.open_all(node, animation, original_obj); } },
-					animation || 0
-				);
-			});
-			if(original_obj.find('.jstree-closed').length === 0) {
-				/**
-				 * triggered when an `open_all` call completes
-				 * @event
-				 * @name open_all.jstree
-				 * @param {Object} node the opened node
-				 */
-				this.trigger('open_all', { "node" : this.get_node(original_obj) });
-			}
-		},
-		/**
-		 * closes all nodes within a node (or the tree), revealing their children
-		 * @name close_all([obj, animation])
-		 * @param {mixed} obj the node to close recursively, omit to close all nodes in the tree
-		 * @param {Number} animation the animation duration in milliseconds when closing the nodes, the default is no animation
-		 * @trigger close_all.jstree
-		 */
-		close_all : function (obj, animation) {
-			if(!obj) { obj = $.jstree.root; }
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			var dom = obj.id === $.jstree.root ? this.get_container_ul() : this.get_node(obj, true),
-				_this = this, i, j;
-			if(dom.length) {
-				dom = this.is_open(obj) ? dom.find('.jstree-open').addBack() : dom.find('.jstree-open');
-				$(dom.get().reverse()).each(function () { _this.close_node(this, animation || 0); });
-			}
-			for(i = 0, j = obj.children_d.length; i < j; i++) {
-				this._model.data[obj.children_d[i]].state.opened = false;
-			}
-			/**
-			 * triggered when an `close_all` call completes
-			 * @event
-			 * @name close_all.jstree
-			 * @param {Object} node the closed node
-			 */
-			this.trigger('close_all', { "node" : obj });
-		},
-		/**
-		 * checks if a node is disabled (not selectable)
-		 * @name is_disabled(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_disabled : function (obj) {
-			obj = this.get_node(obj);
-			return obj && obj.state && obj.state.disabled;
-		},
-		/**
-		 * enables a node - so that it can be selected
-		 * @name enable_node(obj)
-		 * @param {mixed} obj the node to enable
-		 * @trigger enable_node.jstree
-		 */
-		enable_node : function (obj) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.enable_node(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			obj.state.disabled = false;
-			this.get_node(obj,true).children('.jstree-anchor').removeClass('jstree-disabled').attr('aria-disabled', false);
-			/**
-			 * triggered when an node is enabled
-			 * @event
-			 * @name enable_node.jstree
-			 * @param {Object} node the enabled node
-			 */
-			this.trigger('enable_node', { 'node' : obj });
-		},
-		/**
-		 * disables a node - so that it can not be selected
-		 * @name disable_node(obj)
-		 * @param {mixed} obj the node to disable
-		 * @trigger disable_node.jstree
-		 */
-		disable_node : function (obj) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.disable_node(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			obj.state.disabled = true;
-			this.get_node(obj,true).children('.jstree-anchor').addClass('jstree-disabled').attr('aria-disabled', true);
-			/**
-			 * triggered when an node is disabled
-			 * @event
-			 * @name disable_node.jstree
-			 * @param {Object} node the disabled node
-			 */
-			this.trigger('disable_node', { 'node' : obj });
-		},
-		/**
-		 * determines if a node is hidden
-		 * @name is_hidden(obj)
-		 * @param {mixed} obj the node
-		 */
-		is_hidden : function (obj) {
-			obj = this.get_node(obj);
-			return obj.state.hidden === true;
-		},
-		/**
-		 * hides a node - it is still in the structure but will not be visible
-		 * @name hide_node(obj)
-		 * @param {mixed} obj the node to hide
-		 * @param {Boolean} skip_redraw internal parameter controlling if redraw is called
-		 * @trigger hide_node.jstree
-		 */
-		hide_node : function (obj, skip_redraw) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.hide_node(obj[t1], true);
-				}
-				if (!skip_redraw) {
-					this.redraw();
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			if(!obj.state.hidden) {
-				obj.state.hidden = true;
-				this._node_changed(obj.parent);
-				if(!skip_redraw) {
-					this.redraw();
-				}
-				/**
-				 * triggered when an node is hidden
-				 * @event
-				 * @name hide_node.jstree
-				 * @param {Object} node the hidden node
-				 */
-				this.trigger('hide_node', { 'node' : obj });
-			}
-		},
-		/**
-		 * shows a node
-		 * @name show_node(obj)
-		 * @param {mixed} obj the node to show
-		 * @param {Boolean} skip_redraw internal parameter controlling if redraw is called
-		 * @trigger show_node.jstree
-		 */
-		show_node : function (obj, skip_redraw) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.show_node(obj[t1], true);
-				}
-				if (!skip_redraw) {
-					this.redraw();
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			if(obj.state.hidden) {
-				obj.state.hidden = false;
-				this._node_changed(obj.parent);
-				if(!skip_redraw) {
-					this.redraw();
-				}
-				/**
-				 * triggered when an node is shown
-				 * @event
-				 * @name show_node.jstree
-				 * @param {Object} node the shown node
-				 */
-				this.trigger('show_node', { 'node' : obj });
-			}
-		},
-		/**
-		 * hides all nodes
-		 * @name hide_all()
-		 * @trigger hide_all.jstree
-		 */
-		hide_all : function (skip_redraw) {
-			var i, m = this._model.data, ids = [];
-			for(i in m) {
-				if(m.hasOwnProperty(i) && i !== $.jstree.root && !m[i].state.hidden) {
-					m[i].state.hidden = true;
-					ids.push(i);
-				}
-			}
-			this._model.force_full_redraw = true;
-			if(!skip_redraw) {
-				this.redraw();
-			}
-			/**
-			 * triggered when all nodes are hidden
-			 * @event
-			 * @name hide_all.jstree
-			 * @param {Array} nodes the IDs of all hidden nodes
-			 */
-			this.trigger('hide_all', { 'nodes' : ids });
-			return ids;
-		},
-		/**
-		 * shows all nodes
-		 * @name show_all()
-		 * @trigger show_all.jstree
-		 */
-		show_all : function (skip_redraw) {
-			var i, m = this._model.data, ids = [];
-			for(i in m) {
-				if(m.hasOwnProperty(i) && i !== $.jstree.root && m[i].state.hidden) {
-					m[i].state.hidden = false;
-					ids.push(i);
-				}
-			}
-			this._model.force_full_redraw = true;
-			if(!skip_redraw) {
-				this.redraw();
-			}
-			/**
-			 * triggered when all nodes are shown
-			 * @event
-			 * @name show_all.jstree
-			 * @param {Array} nodes the IDs of all shown nodes
-			 */
-			this.trigger('show_all', { 'nodes' : ids });
-			return ids;
-		},
-		/**
-		 * called when a node is selected by the user. Used internally.
-		 * @private
-		 * @name activate_node(obj, e)
-		 * @param {mixed} obj the node
-		 * @param {Object} e the related event
-		 * @trigger activate_node.jstree, changed.jstree
-		 */
-		activate_node : function (obj, e) {
-			if(this.is_disabled(obj)) {
-				return false;
-			}
-			if(!e || typeof e !== 'object') {
-				e = {};
-			}
-
-			// ensure last_clicked is still in the DOM, make it fresh (maybe it was moved?) and make sure it is still selected, if not - make last_clicked the last selected node
-			this._data.core.last_clicked = this._data.core.last_clicked && this._data.core.last_clicked.id !== undefined ? this.get_node(this._data.core.last_clicked.id) : null;
-			if(this._data.core.last_clicked && !this._data.core.last_clicked.state.selected) { this._data.core.last_clicked = null; }
-			if(!this._data.core.last_clicked && this._data.core.selected.length) { this._data.core.last_clicked = this.get_node(this._data.core.selected[this._data.core.selected.length - 1]); }
-
-			if(!this.settings.core.multiple || (!e.metaKey && !e.ctrlKey && !e.shiftKey) || (e.shiftKey && (!this._data.core.last_clicked || !this.get_parent(obj) || this.get_parent(obj) !== this._data.core.last_clicked.parent ) )) {
-				if(!this.settings.core.multiple && (e.metaKey || e.ctrlKey || e.shiftKey) && this.is_selected(obj)) {
-					this.deselect_node(obj, false, e);
-				}
-				else {
-					if (this.settings.core.allow_reselect || !this.is_selected(obj) || this._data.core.selected.length !== 1) {
-						this.deselect_all(true);
-						this.select_node(obj, false, false, e);
-					}
-					this._data.core.last_clicked = this.get_node(obj);
-				}
-			}
-			else {
-				if(e.shiftKey) {
-					var o = this.get_node(obj).id,
-						l = this._data.core.last_clicked.id,
-						p = this.get_node(this._data.core.last_clicked.parent).children,
-						c = false,
-						i, j;
-					for(i = 0, j = p.length; i < j; i += 1) {
-						// separate IFs work whem o and l are the same
-						if(p[i] === o) {
-							c = !c;
-						}
-						if(p[i] === l) {
-							c = !c;
-						}
-						if(!this.is_disabled(p[i]) && (c || p[i] === o || p[i] === l)) {
-							if (!this.is_hidden(p[i])) {
-								this.select_node(p[i], true, false, e);
-							}
-						}
-						else {
-							if (!e.ctrlKey) {
-								this.deselect_node(p[i], true, e);
-							}
-						}
-					}
-					this.trigger('changed', { 'action' : 'select_node', 'node' : this.get_node(obj), 'selected' : this._data.core.selected, 'event' : e });
-				}
-				else {
-					if(!this.is_selected(obj)) {
-						if (e.ctrlKey) {
-							this._data.core.last_clicked = this.get_node(obj);
-						}
-						this.select_node(obj, false, false, e);
-					}
-					else {
-						this.deselect_node(obj, false, e);
-					}
-				}
-			}
-			/**
-			 * triggered when an node is clicked or intercated with by the user
-			 * @event
-			 * @name activate_node.jstree
-			 * @param {Object} node
-			 * @param {Object} event the ooriginal event (if any) which triggered the call (may be an empty object)
-			 */
-			this.trigger('activate_node', { 'node' : this.get_node(obj), 'event' : e });
-		},
-		/**
-		 * applies the hover state on a node, called when a node is hovered by the user. Used internally.
-		 * @private
-		 * @name hover_node(obj)
-		 * @param {mixed} obj
-		 * @trigger hover_node.jstree
-		 */
-		hover_node : function (obj) {
-			obj = this.get_node(obj, true);
-			if(!obj || !obj.length || obj.children('.jstree-hovered').length) {
-				return false;
-			}
-			var o = this.element.find('.jstree-hovered'), t = this.element;
-			if(o && o.length) { this.dehover_node(o); }
-
-			obj.children('.jstree-anchor').addClass('jstree-hovered');
-			/**
-			 * triggered when an node is hovered
-			 * @event
-			 * @name hover_node.jstree
-			 * @param {Object} node
-			 */
-			this.trigger('hover_node', { 'node' : this.get_node(obj) });
-			setTimeout(function () { t.attr('aria-activedescendant', obj[0].id); }, 0);
-		},
-		/**
-		 * removes the hover state from a nodecalled when a node is no longer hovered by the user. Used internally.
-		 * @private
-		 * @name dehover_node(obj)
-		 * @param {mixed} obj
-		 * @trigger dehover_node.jstree
-		 */
-		dehover_node : function (obj) {
-			obj = this.get_node(obj, true);
-			if(!obj || !obj.length || !obj.children('.jstree-hovered').length) {
-				return false;
-			}
-			obj.children('.jstree-anchor').removeClass('jstree-hovered');
-			/**
-			 * triggered when an node is no longer hovered
-			 * @event
-			 * @name dehover_node.jstree
-			 * @param {Object} node
-			 */
-			this.trigger('dehover_node', { 'node' : this.get_node(obj) });
-		},
-		/**
-		 * select a node
-		 * @name select_node(obj [, supress_event, prevent_open])
-		 * @param {mixed} obj an array can be used to select multiple nodes
-		 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
-		 * @param {Boolean} prevent_open if set to `true` parents of the selected node won't be opened
-		 * @trigger select_node.jstree, changed.jstree
-		 */
-		select_node : function (obj, supress_event, prevent_open, e) {
-			var dom, t1, t2, th;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.select_node(obj[t1], supress_event, prevent_open, e);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(!obj.state.selected) {
-				obj.state.selected = true;
-				this._data.core.selected.push(obj.id);
-				if(!prevent_open) {
-					dom = this._open_to(obj);
-				}
-				if(dom && dom.length) {
-					dom.children('.jstree-anchor').addClass('jstree-clicked').attr('aria-selected', true);
-				}
-				/**
-				 * triggered when an node is selected
-				 * @event
-				 * @name select_node.jstree
-				 * @param {Object} node
-				 * @param {Array} selected the current selection
-				 * @param {Object} event the event (if any) that triggered this select_node
-				 */
-				this.trigger('select_node', { 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
-				if(!supress_event) {
-					/**
-					 * triggered when selection changes
-					 * @event
-					 * @name changed.jstree
-					 * @param {Object} node
-					 * @param {Object} action the action that caused the selection to change
-					 * @param {Array} selected the current selection
-					 * @param {Object} event the event (if any) that triggered this changed event
-					 */
-					this.trigger('changed', { 'action' : 'select_node', 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
-				}
-			}
-		},
-		/**
-		 * deselect a node
-		 * @name deselect_node(obj [, supress_event])
-		 * @param {mixed} obj an array can be used to deselect multiple nodes
-		 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
-		 * @trigger deselect_node.jstree, changed.jstree
-		 */
-		deselect_node : function (obj, supress_event, e) {
-			var t1, t2, dom;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.deselect_node(obj[t1], supress_event, e);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(obj.state.selected) {
-				obj.state.selected = false;
-				this._data.core.selected = $.vakata.array_remove_item(this._data.core.selected, obj.id);
-				if(dom.length) {
-					dom.children('.jstree-anchor').removeClass('jstree-clicked').attr('aria-selected', false);
-				}
-				/**
-				 * triggered when an node is deselected
-				 * @event
-				 * @name deselect_node.jstree
-				 * @param {Object} node
-				 * @param {Array} selected the current selection
-				 * @param {Object} event the event (if any) that triggered this deselect_node
-				 */
-				this.trigger('deselect_node', { 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
-				if(!supress_event) {
-					this.trigger('changed', { 'action' : 'deselect_node', 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
-				}
-			}
-		},
-		/**
-		 * select all nodes in the tree
-		 * @name select_all([supress_event])
-		 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
-		 * @trigger select_all.jstree, changed.jstree
-		 */
-		select_all : function (supress_event) {
-			var tmp = this._data.core.selected.concat([]), i, j;
-			this._data.core.selected = this._model.data[$.jstree.root].children_d.concat();
-			for(i = 0, j = this._data.core.selected.length; i < j; i++) {
-				if(this._model.data[this._data.core.selected[i]]) {
-					this._model.data[this._data.core.selected[i]].state.selected = true;
-				}
-			}
-			this.redraw(true);
-			/**
-			 * triggered when all nodes are selected
-			 * @event
-			 * @name select_all.jstree
-			 * @param {Array} selected the current selection
-			 */
-			this.trigger('select_all', { 'selected' : this._data.core.selected });
-			if(!supress_event) {
-				this.trigger('changed', { 'action' : 'select_all', 'selected' : this._data.core.selected, 'old_selection' : tmp });
-			}
-		},
-		/**
-		 * deselect all selected nodes
-		 * @name deselect_all([supress_event])
-		 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
-		 * @trigger deselect_all.jstree, changed.jstree
-		 */
-		deselect_all : function (supress_event) {
-			var tmp = this._data.core.selected.concat([]), i, j;
-			for(i = 0, j = this._data.core.selected.length; i < j; i++) {
-				if(this._model.data[this._data.core.selected[i]]) {
-					this._model.data[this._data.core.selected[i]].state.selected = false;
-				}
-			}
-			this._data.core.selected = [];
-			this.element.find('.jstree-clicked').removeClass('jstree-clicked').attr('aria-selected', false);
-			/**
-			 * triggered when all nodes are deselected
-			 * @event
-			 * @name deselect_all.jstree
-			 * @param {Object} node the previous selection
-			 * @param {Array} selected the current selection
-			 */
-			this.trigger('deselect_all', { 'selected' : this._data.core.selected, 'node' : tmp });
-			if(!supress_event) {
-				this.trigger('changed', { 'action' : 'deselect_all', 'selected' : this._data.core.selected, 'old_selection' : tmp });
-			}
-		},
-		/**
-		 * checks if a node is selected
-		 * @name is_selected(obj)
-		 * @param  {mixed}  obj
-		 * @return {Boolean}
-		 */
-		is_selected : function (obj) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			return obj.state.selected;
-		},
-		/**
-		 * get an array of all selected nodes
-		 * @name get_selected([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 */
-		get_selected : function (full) {
-			return full ? $.map(this._data.core.selected, function (i) { return this.get_node(i); }.bind(this)) : this._data.core.selected.slice();
-		},
-		/**
-		 * get an array of all top level selected nodes (ignoring children of selected nodes)
-		 * @name get_top_selected([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 */
-		get_top_selected : function (full) {
-			var tmp = this.get_selected(true),
-				obj = {}, i, j, k, l;
-			for(i = 0, j = tmp.length; i < j; i++) {
-				obj[tmp[i].id] = tmp[i];
-			}
-			for(i = 0, j = tmp.length; i < j; i++) {
-				for(k = 0, l = tmp[i].children_d.length; k < l; k++) {
-					if(obj[tmp[i].children_d[k]]) {
-						delete obj[tmp[i].children_d[k]];
-					}
-				}
-			}
-			tmp = [];
-			for(i in obj) {
-				if(obj.hasOwnProperty(i)) {
-					tmp.push(i);
-				}
-			}
-			return full ? $.map(tmp, function (i) { return this.get_node(i); }.bind(this)) : tmp;
-		},
-		/**
-		 * get an array of all bottom level selected nodes (ignoring selected parents)
-		 * @name get_bottom_selected([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 */
-		get_bottom_selected : function (full) {
-			var tmp = this.get_selected(true),
-				obj = [], i, j;
-			for(i = 0, j = tmp.length; i < j; i++) {
-				if(!tmp[i].children.length) {
-					obj.push(tmp[i].id);
-				}
-			}
-			return full ? $.map(obj, function (i) { return this.get_node(i); }.bind(this)) : obj;
-		},
-		/**
-		 * gets the current state of the tree so that it can be restored later with `set_state(state)`. Used internally.
-		 * @name get_state()
-		 * @private
-		 * @return {Object}
-		 */
-		get_state : function () {
-			var state	= {
-				'core' : {
-					'open' : [],
-					'loaded' : [],
-					'scroll' : {
-						'left' : this.element.scrollLeft(),
-						'top' : this.element.scrollTop()
-					},
-					/*!
-					'themes' : {
-						'name' : this.get_theme(),
-						'icons' : this._data.core.themes.icons,
-						'dots' : this._data.core.themes.dots
-					},
-					*/
-					'selected' : []
-				}
-			}, i;
-			for(i in this._model.data) {
-				if(this._model.data.hasOwnProperty(i)) {
-					if(i !== $.jstree.root) {
-						if(this._model.data[i].state.loaded && this.settings.core.loaded_state) {
-							state.core.loaded.push(i);
-						}
-						if(this._model.data[i].state.opened) {
-							state.core.open.push(i);
-						}
-						if(this._model.data[i].state.selected) {
-							state.core.selected.push(i);
-						}
-					}
-				}
-			}
-			return state;
-		},
-		/**
-		 * sets the state of the tree. Used internally.
-		 * @name set_state(state [, callback])
-		 * @private
-		 * @param {Object} state the state to restore. Keep in mind this object is passed by reference and jstree will modify it.
-		 * @param {Function} callback an optional function to execute once the state is restored.
-		 * @trigger set_state.jstree
-		 */
-		set_state : function (state, callback) {
-			if(state) {
-				if(state.core && state.core.selected && state.core.initial_selection === undefined) {
-					state.core.initial_selection = this._data.core.selected.concat([]).sort().join(',');
-				}
-				if(state.core) {
-					var res, n, t, _this, i;
-					if(state.core.loaded) {
-						if(!this.settings.core.loaded_state || !$.vakata.is_array(state.core.loaded) || !state.core.loaded.length) {
-							delete state.core.loaded;
-							this.set_state(state, callback);
-						}
-						else {
-							this._load_nodes(state.core.loaded, function (nodes) {
-								delete state.core.loaded;
-								this.set_state(state, callback);
-							});
-						}
-						return false;
-					}
-					if(state.core.open) {
-						if(!$.vakata.is_array(state.core.open) || !state.core.open.length) {
-							delete state.core.open;
-							this.set_state(state, callback);
-						}
-						else {
-							this._load_nodes(state.core.open, function (nodes) {
-								this.open_node(nodes, false, 0);
-								delete state.core.open;
-								this.set_state(state, callback);
-							});
-						}
-						return false;
-					}
-					if(state.core.scroll) {
-						if(state.core.scroll && state.core.scroll.left !== undefined) {
-							this.element.scrollLeft(state.core.scroll.left);
-						}
-						if(state.core.scroll && state.core.scroll.top !== undefined) {
-							this.element.scrollTop(state.core.scroll.top);
-						}
-						delete state.core.scroll;
-						this.set_state(state, callback);
-						return false;
-					}
-					if(state.core.selected) {
-						_this = this;
-						if (state.core.initial_selection === undefined ||
-							state.core.initial_selection === this._data.core.selected.concat([]).sort().join(',')
-						) {
-							this.deselect_all();
-							$.each(state.core.selected, function (i, v) {
-								_this.select_node(v, false, true);
-							});
-						}
-						delete state.core.initial_selection;
-						delete state.core.selected;
-						this.set_state(state, callback);
-						return false;
-					}
-					for(i in state) {
-						if(state.hasOwnProperty(i) && i !== "core" && $.inArray(i, this.settings.plugins) === -1) {
-							delete state[i];
-						}
-					}
-					if($.isEmptyObject(state.core)) {
-						delete state.core;
-						this.set_state(state, callback);
-						return false;
-					}
-				}
-				if($.isEmptyObject(state)) {
-					state = null;
-					if(callback) { callback.call(this); }
-					/**
-					 * triggered when a `set_state` call completes
-					 * @event
-					 * @name set_state.jstree
-					 */
-					this.trigger('set_state');
-					return false;
-				}
-				return true;
-			}
-			return false;
-		},
-		/**
-		 * refreshes the tree - all nodes are reloaded with calls to `load_node`.
-		 * @name refresh()
-		 * @param {Boolean} skip_loading an option to skip showing the loading indicator
-		 * @param {Mixed} forget_state if set to `true` state will not be reapplied, if set to a function (receiving the current state as argument) the result of that function will be used as state
-		 * @trigger refresh.jstree
-		 */
-		refresh : function (skip_loading, forget_state) {
-			this._data.core.state = forget_state === true ? {} : this.get_state();
-			if(forget_state && $.vakata.is_function(forget_state)) { this._data.core.state = forget_state.call(this, this._data.core.state); }
-			this._cnt = 0;
-			this._model.data = {};
-			this._model.data[$.jstree.root] = {
-				id : $.jstree.root,
-				parent : null,
-				parents : [],
-				children : [],
-				children_d : [],
-				state : { loaded : false }
-			};
-			this._data.core.selected = [];
-			this._data.core.last_clicked = null;
-			this._data.core.focused = null;
-
-			var c = this.get_container_ul()[0].className;
-			if(!skip_loading) {
-				this.element.html("<"+"ul class='"+c+"' role='group'><"+"li class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='none' id='j"+this._id+"_loading'><i class='jstree-icon jstree-ocl'></i><"+"a class='jstree-anchor' role='treeitem' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>" + this.get_string("Loading ...") + "</a></li></ul>");
-				this.element.attr('aria-activedescendant','j'+this._id+'_loading');
-			}
-			this.load_node($.jstree.root, function (o, s) {
-				if(s) {
-					this.get_container_ul()[0].className = c;
-					if(this._firstChild(this.get_container_ul()[0])) {
-						this.element.attr('aria-activedescendant',this._firstChild(this.get_container_ul()[0]).id);
-					}
-					this.set_state($.extend(true, {}, this._data.core.state), function () {
-						/**
-						 * triggered when a `refresh` call completes
-						 * @event
-						 * @name refresh.jstree
-						 */
-						this.trigger('refresh');
-					});
-				}
-				this._data.core.state = null;
-			});
-		},
-		/**
-		 * refreshes a node in the tree (reload its children) all opened nodes inside that node are reloaded with calls to `load_node`.
-		 * @name refresh_node(obj)
-		 * @param  {mixed} obj the node
-		 * @trigger refresh_node.jstree
-		 */
-		refresh_node : function (obj) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			var opened = [], to_load = [], s = this._data.core.selected.concat([]);
-			to_load.push(obj.id);
-			if(obj.state.opened === true) { opened.push(obj.id); }
-			this.get_node(obj, true).find('.jstree-open').each(function() { to_load.push(this.id); opened.push(this.id); });
-			this._load_nodes(to_load, function (nodes) {
-				this.open_node(opened, false, 0);
-				this.select_node(s);
-				/**
-				 * triggered when a node is refreshed
-				 * @event
-				 * @name refresh_node.jstree
-				 * @param {Object} node - the refreshed node
-				 * @param {Array} nodes - an array of the IDs of the nodes that were reloaded
-				 */
-				this.trigger('refresh_node', { 'node' : obj, 'nodes' : nodes });
-			}.bind(this), false, true);
-		},
-		/**
-		 * set (change) the ID of a node
-		 * @name set_id(obj, id)
-		 * @param  {mixed} obj the node
-		 * @param  {String} id the new ID
-		 * @return {Boolean}
-		 * @trigger set_id.jstree
-		 */
-		set_id : function (obj, id) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			var i, j, m = this._model.data, old = obj.id;
-			id = id.toString();
-			// update parents (replace current ID with new one in children and children_d)
-			m[obj.parent].children[$.inArray(obj.id, m[obj.parent].children)] = id;
-			for(i = 0, j = obj.parents.length; i < j; i++) {
-				m[obj.parents[i]].children_d[$.inArray(obj.id, m[obj.parents[i]].children_d)] = id;
-			}
-			// update children (replace current ID with new one in parent and parents)
-			for(i = 0, j = obj.children.length; i < j; i++) {
-				m[obj.children[i]].parent = id;
-			}
-			for(i = 0, j = obj.children_d.length; i < j; i++) {
-				m[obj.children_d[i]].parents[$.inArray(obj.id, m[obj.children_d[i]].parents)] = id;
-			}
-			i = $.inArray(obj.id, this._data.core.selected);
-			if(i !== -1) { this._data.core.selected[i] = id; }
-			// update model and obj itself (obj.id, this._model.data[KEY])
-			i = this.get_node(obj.id, true);
-			if(i) {
-				i.attr('id', id); //.children('.jstree-anchor').attr('id', id + '_anchor').end().attr('aria-labelledby', id + '_anchor');
-				if(this.element.attr('aria-activedescendant') === obj.id) {
-					this.element.attr('aria-activedescendant', id);
-				}
-			}
-			delete m[obj.id];
-			obj.id = id;
-			obj.li_attr.id = id;
-			m[id] = obj;
-			/**
-			 * triggered when a node id value is changed
-			 * @event
-			 * @name set_id.jstree
-			 * @param {Object} node
-			 * @param {String} old the old id
-			 */
-			this.trigger('set_id',{ "node" : obj, "new" : obj.id, "old" : old });
-			return true;
-		},
-		/**
-		 * get the text value of a node
-		 * @name get_text(obj)
-		 * @param  {mixed} obj the node
-		 * @return {String}
-		 */
-		get_text : function (obj) {
-			obj = this.get_node(obj);
-			return (!obj || obj.id === $.jstree.root) ? false : obj.text;
-		},
-		/**
-		 * set the text value of a node. Used internally, please use `rename_node(obj, val)`.
-		 * @private
-		 * @name set_text(obj, val)
-		 * @param  {mixed} obj the node, you can pass an array to set the text on multiple nodes
-		 * @param  {String} val the new text value
-		 * @return {Boolean}
-		 * @trigger set_text.jstree
-		 */
-		set_text : function (obj, val) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.set_text(obj[t1], val);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			obj.text = val;
-			if(this.get_node(obj, true).length) {
-				this.redraw_node(obj.id);
-			}
-			/**
-			 * triggered when a node text value is changed
-			 * @event
-			 * @name set_text.jstree
-			 * @param {Object} obj
-			 * @param {String} text the new value
-			 */
-			this.trigger('set_text',{ "obj" : obj, "text" : val });
-			return true;
-		},
-		/**
-		 * gets a JSON representation of a node (or the whole tree)
-		 * @name get_json([obj, options])
-		 * @param  {mixed} obj
-		 * @param  {Object} options
-		 * @param  {Boolean} options.no_state do not return state information
-		 * @param  {Boolean} options.no_id do not return ID
-		 * @param  {Boolean} options.no_children do not include children
-		 * @param  {Boolean} options.no_data do not include node data
-		 * @param  {Boolean} options.no_li_attr do not include LI attributes
-		 * @param  {Boolean} options.no_a_attr do not include A attributes
-		 * @param  {Boolean} options.flat return flat JSON instead of nested
-		 * @return {Object}
-		 */
-		get_json : function (obj, options, flat) {
-			obj = this.get_node(obj || $.jstree.root);
-			if(!obj) { return false; }
-			if(options && options.flat && !flat) { flat = []; }
-			var tmp = {
-				'id' : obj.id,
-				'text' : obj.text,
-				'icon' : this.get_icon(obj),
-				'li_attr' : $.extend(true, {}, obj.li_attr),
-				'a_attr' : $.extend(true, {}, obj.a_attr),
-				'state' : {},
-				'data' : options && options.no_data ? false : $.extend(true, $.vakata.is_array(obj.data)?[]:{}, obj.data)
-				//( this.get_node(obj, true).length ? this.get_node(obj, true).data() : obj.data ),
-			}, i, j;
-			if(options && options.flat) {
-				tmp.parent = obj.parent;
-			}
-			else {
-				tmp.children = [];
-			}
-			if(!options || !options.no_state) {
-				for(i in obj.state) {
-					if(obj.state.hasOwnProperty(i)) {
-						tmp.state[i] = obj.state[i];
-					}
-				}
-			} else {
-				delete tmp.state;
-			}
-			if(options && options.no_li_attr) {
-				delete tmp.li_attr;
-			}
-			if(options && options.no_a_attr) {
-				delete tmp.a_attr;
-			}
-			if(options && options.no_id) {
-				delete tmp.id;
-				if(tmp.li_attr && tmp.li_attr.id) {
-					delete tmp.li_attr.id;
-				}
-				if(tmp.a_attr && tmp.a_attr.id) {
-					delete tmp.a_attr.id;
-				}
-			}
-			if(options && options.flat && obj.id !== $.jstree.root) {
-				flat.push(tmp);
-			}
-			if(!options || !options.no_children) {
-				for(i = 0, j = obj.children.length; i < j; i++) {
-					if(options && options.flat) {
-						this.get_json(obj.children[i], options, flat);
-					}
-					else {
-						tmp.children.push(this.get_json(obj.children[i], options));
-					}
-				}
-			}
-			return options && options.flat ? flat : (obj.id === $.jstree.root ? tmp.children : tmp);
-		},
-		/**
-		 * create a new node (do not confuse with load_node)
-		 * @name create_node([par, node, pos, callback, is_loaded])
-		 * @param  {mixed}   par       the parent node (to create a root node use either "#" (string) or `null`)
-		 * @param  {mixed}   node      the data for the new node (a valid JSON object, or a simple string with the name)
-		 * @param  {mixed}   pos       the index at which to insert the node, "first" and "last" are also supported, default is "last"
-		 * @param  {Function} callback a function to be called once the node is created
-		 * @param  {Boolean} is_loaded internal argument indicating if the parent node was succesfully loaded
-		 * @return {String}            the ID of the newly create node
-		 * @trigger model.jstree, create_node.jstree
-		 */
-		create_node : function (par, node, pos, callback, is_loaded) {
-			if(par === null) { par = $.jstree.root; }
-			par = this.get_node(par);
-			if(!par) { return false; }
-			pos = pos === undefined ? "last" : pos;
-			if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
-				return this.load_node(par, function () { this.create_node(par, node, pos, callback, true); });
-			}
-			if(!node) { node = { "text" : this.get_string('New node') }; }
-			if(typeof node === "string") {
-				node = { "text" : node };
-			} else {
-				node = $.extend(true, {}, node);
-			}
-			if(node.text === undefined) { node.text = this.get_string('New node'); }
-			var tmp, dpc, i, j;
-
-			if(par.id === $.jstree.root) {
-				if(pos === "before") { pos = "first"; }
-				if(pos === "after") { pos = "last"; }
-			}
-			switch(pos) {
-				case "before":
-					tmp = this.get_node(par.parent);
-					pos = $.inArray(par.id, tmp.children);
-					par = tmp;
-					break;
-				case "after" :
-					tmp = this.get_node(par.parent);
-					pos = $.inArray(par.id, tmp.children) + 1;
-					par = tmp;
-					break;
-				case "inside":
-				case "first":
-					pos = 0;
-					break;
-				case "last":
-					pos = par.children.length;
-					break;
-				default:
-					if(!pos) { pos = 0; }
-					break;
-			}
-			if(pos > par.children.length) { pos = par.children.length; }
-			if(node.id === undefined) { node.id = true; }
-			if(!this.check("create_node", node, par, pos)) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			if(node.id === true) { delete node.id; }
-			node = this._parse_model_from_json(node, par.id, par.parents.concat());
-			if(!node) { return false; }
-			tmp = this.get_node(node);
-			dpc = [];
-			dpc.push(node);
-			dpc = dpc.concat(tmp.children_d);
-			this.trigger('model', { "nodes" : dpc, "parent" : par.id });
-
-			par.children_d = par.children_d.concat(dpc);
-			for(i = 0, j = par.parents.length; i < j; i++) {
-				this._model.data[par.parents[i]].children_d = this._model.data[par.parents[i]].children_d.concat(dpc);
-			}
-			node = tmp;
-			tmp = [];
-			for(i = 0, j = par.children.length; i < j; i++) {
-				tmp[i >= pos ? i+1 : i] = par.children[i];
-			}
-			tmp[pos] = node.id;
-			par.children = tmp;
-
-			this.redraw_node(par, true);
-			/**
-			 * triggered when a node is created
-			 * @event
-			 * @name create_node.jstree
-			 * @param {Object} node
-			 * @param {String} parent the parent's ID
-			 * @param {Number} position the position of the new node among the parent's children
-			 */
-			this.trigger('create_node', { "node" : this.get_node(node), "parent" : par.id, "position" : pos });
-			if(callback) { callback.call(this, this.get_node(node)); }
-			return node.id;
-		},
-		/**
-		 * set the text value of a node
-		 * @name rename_node(obj, val)
-		 * @param  {mixed} obj the node, you can pass an array to rename multiple nodes to the same name
-		 * @param  {String} val the new text value
-		 * @return {Boolean}
-		 * @trigger rename_node.jstree
-		 */
-		rename_node : function (obj, val) {
-			var t1, t2, old;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.rename_node(obj[t1], val);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			old = obj.text;
-			if(!this.check("rename_node", obj, this.get_parent(obj), val)) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			this.set_text(obj, val); // .apply(this, Array.prototype.slice.call(arguments))
-			/**
-			 * triggered when a node is renamed
-			 * @event
-			 * @name rename_node.jstree
-			 * @param {Object} node
-			 * @param {String} text the new value
-			 * @param {String} old the old value
-			 */
-			this.trigger('rename_node', { "node" : obj, "text" : val, "old" : old });
-			return true;
-		},
-		/**
-		 * remove a node
-		 * @name delete_node(obj)
-		 * @param  {mixed} obj the node, you can pass an array to delete multiple nodes
-		 * @return {Boolean}
-		 * @trigger delete_node.jstree, changed.jstree
-		 */
-		delete_node : function (obj) {
-			var t1, t2, par, pos, tmp, i, j, k, l, c, top, lft;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.delete_node(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			par = this.get_node(obj.parent);
-			pos = $.inArray(obj.id, par.children);
-			c = false;
-			if(!this.check("delete_node", obj, par, pos)) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			if(pos !== -1) {
-				par.children = $.vakata.array_remove(par.children, pos);
-			}
-			tmp = obj.children_d.concat([]);
-			tmp.push(obj.id);
-			for(i = 0, j = obj.parents.length; i < j; i++) {
-				this._model.data[obj.parents[i]].children_d = $.vakata.array_filter(this._model.data[obj.parents[i]].children_d, function (v) {
-					return $.inArray(v, tmp) === -1;
-				});
-			}
-			for(k = 0, l = tmp.length; k < l; k++) {
-				if(this._model.data[tmp[k]].state.selected) {
-					c = true;
-					break;
-				}
-			}
-			if (c) {
-				this._data.core.selected = $.vakata.array_filter(this._data.core.selected, function (v) {
-					return $.inArray(v, tmp) === -1;
-				});
-			}
-			/**
-			 * triggered when a node is deleted
-			 * @event
-			 * @name delete_node.jstree
-			 * @param {Object} node
-			 * @param {String} parent the parent's ID
-			 */
-			this.trigger('delete_node', { "node" : obj, "parent" : par.id });
-			if(c) {
-				this.trigger('changed', { 'action' : 'delete_node', 'node' : obj, 'selected' : this._data.core.selected, 'parent' : par.id });
-			}
-			for(k = 0, l = tmp.length; k < l; k++) {
-				delete this._model.data[tmp[k]];
-			}
-			if($.inArray(this._data.core.focused, tmp) !== -1) {
-				this._data.core.focused = null;
-				top = this.element[0].scrollTop;
-				lft = this.element[0].scrollLeft;
-				if(par.id === $.jstree.root) {
-					if (this._model.data[$.jstree.root].children[0]) {
-						this.get_node(this._model.data[$.jstree.root].children[0], true).children('.jstree-anchor').trigger('focus');
-					}
-				}
-				else {
-					this.get_node(par, true).children('.jstree-anchor').trigger('focus');
-				}
-				this.element[0].scrollTop  = top;
-				this.element[0].scrollLeft = lft;
-			}
-			this.redraw_node(par, true);
-			return true;
-		},
-		/**
-		 * check if an operation is premitted on the tree. Used internally.
-		 * @private
-		 * @name check(chk, obj, par, pos)
-		 * @param  {String} chk the operation to check, can be "create_node", "rename_node", "delete_node", "copy_node" or "move_node"
-		 * @param  {mixed} obj the node
-		 * @param  {mixed} par the parent
-		 * @param  {mixed} pos the position to insert at, or if "rename_node" - the new name
-		 * @param  {mixed} more some various additional information, for example if a "move_node" operations is triggered by DND this will be the hovered node
-		 * @return {Boolean}
-		 */
-		check : function (chk, obj, par, pos, more) {
-			obj = obj && obj.id ? obj : this.get_node(obj);
-			par = par && par.id ? par : this.get_node(par);
-			var tmp = chk.match(/^(move_node|copy_node|create_node)$/i) ? par : obj,
-				chc = this.settings.core.check_callback;
-			if(chk === "move_node" || chk === "copy_node") {
-				if((!more || !more.is_multi) && (chk === "move_node" && $.inArray(obj.id, par.children) === pos)) {
-					this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_08', 'reason' : 'Moving node to its current position', 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-					return false;
-				}
-				if((!more || !more.is_multi) && (obj.id === par.id || (chk === "move_node" && $.inArray(obj.id, par.children) === pos) || $.inArray(par.id, obj.children_d) !== -1)) {
-					this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_01', 'reason' : 'Moving parent inside child', 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-					return false;
-				}
-			}
-			if(tmp && tmp.data) { tmp = tmp.data; }
-			if(tmp && tmp.functions && (tmp.functions[chk] === false || tmp.functions[chk] === true)) {
-				if(tmp.functions[chk] === false) {
-					this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_02', 'reason' : 'Node data prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-				}
-				return tmp.functions[chk];
-			}
-			if(chc === false || ($.vakata.is_function(chc) && chc.call(this, chk, obj, par, pos, more) === false) || (chc && chc[chk] === false)) {
-				this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_03', 'reason' : 'User config for core.check_callback prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-				return false;
-			}
-			return true;
-		},
-		/**
-		 * get the last error
-		 * @name last_error()
-		 * @return {Object}
-		 */
-		last_error : function () {
-			return this._data.core.last_error;
-		},
-		/**
-		 * move a node to a new parent
-		 * @name move_node(obj, par [, pos, callback, is_loaded])
-		 * @param  {mixed} obj the node to move, pass an array to move multiple nodes
-		 * @param  {mixed} par the new parent
-		 * @param  {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0`
-		 * @param  {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position
-		 * @param  {Boolean} is_loaded internal parameter indicating if the parent node has been loaded
-		 * @param  {Boolean} skip_redraw internal parameter indicating if the tree should be redrawn
-		 * @param  {Boolean} instance internal parameter indicating if the node comes from another instance
-		 * @trigger move_node.jstree
-		 */
-		move_node : function (obj, par, pos, callback, is_loaded, skip_redraw, origin) {
-			var t1, t2, old_par, old_pos, new_par, old_ins, is_multi, dpc, tmp, i, j, k, l, p;
-
-			par = this.get_node(par);
-			pos = pos === undefined ? 0 : pos;
-			if(!par) { return false; }
-			if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
-				return this.load_node(par, function () { this.move_node(obj, par, pos, callback, true, false, origin); });
-			}
-
-			if($.vakata.is_array(obj)) {
-				if(obj.length === 1) {
-					obj = obj[0];
-				}
-				else {
-					//obj = obj.slice();
-					for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-						if((tmp = this.move_node(obj[t1], par, pos, callback, is_loaded, false, origin))) {
-							par = tmp;
-							pos = "after";
-						}
-					}
-					this.redraw();
-					return true;
-				}
-			}
-			obj = obj && (obj.id !== undefined) ? obj : this.get_node(obj);
-
-			if(!obj || obj.id === $.jstree.root) { return false; }
-
-			old_par = (obj.parent || $.jstree.root).toString();
-			new_par = (!pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root) ? par : this.get_node(par.parent);
-			old_ins = origin ? origin : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id));
-			is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id);
-			old_pos = old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1;
-			if(old_ins && old_ins._id) {
-				obj = old_ins._model.data[obj.id];
-			}
-
-			if(is_multi) {
-				if((tmp = this.copy_node(obj, par, pos, callback, is_loaded, false, origin))) {
-					if(old_ins) { old_ins.delete_node(obj); }
-					return tmp;
-				}
-				return false;
-			}
-			//var m = this._model.data;
-			if(par.id === $.jstree.root) {
-				if(pos === "before") { pos = "first"; }
-				if(pos === "after") { pos = "last"; }
-			}
-			switch(pos) {
-				case "before":
-					pos = $.inArray(par.id, new_par.children);
-					break;
-				case "after" :
-					pos = $.inArray(par.id, new_par.children) + 1;
-					break;
-				case "inside":
-				case "first":
-					pos = 0;
-					break;
-				case "last":
-					pos = new_par.children.length;
-					break;
-				default:
-					if(!pos) { pos = 0; }
-					break;
-			}
-			if(pos > new_par.children.length) { pos = new_par.children.length; }
-			if(!this.check("move_node", obj, new_par, pos, { 'core' : true, 'origin' : origin, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			if(obj.parent === new_par.id) {
-				dpc = new_par.children.concat();
-				tmp = $.inArray(obj.id, dpc);
-				if(tmp !== -1) {
-					dpc = $.vakata.array_remove(dpc, tmp);
-					if(pos > tmp) { pos--; }
-				}
-				tmp = [];
-				for(i = 0, j = dpc.length; i < j; i++) {
-					tmp[i >= pos ? i+1 : i] = dpc[i];
-				}
-				tmp[pos] = obj.id;
-				new_par.children = tmp;
-				this._node_changed(new_par.id);
-				this.redraw(new_par.id === $.jstree.root);
-			}
-			else {
-				// clean old parent and up
-				tmp = obj.children_d.concat();
-				tmp.push(obj.id);
-				for(i = 0, j = obj.parents.length; i < j; i++) {
-					dpc = [];
-					p = old_ins._model.data[obj.parents[i]].children_d;
-					for(k = 0, l = p.length; k < l; k++) {
-						if($.inArray(p[k], tmp) === -1) {
-							dpc.push(p[k]);
-						}
-					}
-					old_ins._model.data[obj.parents[i]].children_d = dpc;
-				}
-				old_ins._model.data[old_par].children = $.vakata.array_remove_item(old_ins._model.data[old_par].children, obj.id);
-
-				// insert into new parent and up
-				for(i = 0, j = new_par.parents.length; i < j; i++) {
-					this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(tmp);
-				}
-				dpc = [];
-				for(i = 0, j = new_par.children.length; i < j; i++) {
-					dpc[i >= pos ? i+1 : i] = new_par.children[i];
-				}
-				dpc[pos] = obj.id;
-				new_par.children = dpc;
-				new_par.children_d.push(obj.id);
-				new_par.children_d = new_par.children_d.concat(obj.children_d);
-
-				// update object
-				obj.parent = new_par.id;
-				tmp = new_par.parents.concat();
-				tmp.unshift(new_par.id);
-				p = obj.parents.length;
-				obj.parents = tmp;
-
-				// update object children
-				tmp = tmp.concat();
-				for(i = 0, j = obj.children_d.length; i < j; i++) {
-					this._model.data[obj.children_d[i]].parents = this._model.data[obj.children_d[i]].parents.slice(0,p*-1);
-					Array.prototype.push.apply(this._model.data[obj.children_d[i]].parents, tmp);
-				}
-
-				if(old_par === $.jstree.root || new_par.id === $.jstree.root) {
-					this._model.force_full_redraw = true;
-				}
-				if(!this._model.force_full_redraw) {
-					this._node_changed(old_par);
-					this._node_changed(new_par.id);
-				}
-				if(!skip_redraw) {
-					this.redraw();
-				}
-			}
-			if(callback) { callback.call(this, obj, new_par, pos); }
-			/**
-			 * triggered when a node is moved
-			 * @event
-			 * @name move_node.jstree
-			 * @param {Object} node
-			 * @param {String} parent the parent's ID
-			 * @param {Number} position the position of the node among the parent's children
-			 * @param {String} old_parent the old parent of the node
-			 * @param {Number} old_position the old position of the node
-			 * @param {Boolean} is_multi do the node and new parent belong to different instances
-			 * @param {jsTree} old_instance the instance the node came from
-			 * @param {jsTree} new_instance the instance of the new parent
-			 */
-			this.trigger('move_node', { "node" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_pos, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this });
-			return obj.id;
-		},
-		/**
-		 * copy a node to a new parent
-		 * @name copy_node(obj, par [, pos, callback, is_loaded])
-		 * @param  {mixed} obj the node to copy, pass an array to copy multiple nodes
-		 * @param  {mixed} par the new parent
-		 * @param  {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0`
-		 * @param  {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position
-		 * @param  {Boolean} is_loaded internal parameter indicating if the parent node has been loaded
-		 * @param  {Boolean} skip_redraw internal parameter indicating if the tree should be redrawn
-		 * @param  {Boolean} instance internal parameter indicating if the node comes from another instance
-		 * @trigger model.jstree copy_node.jstree
-		 */
-		copy_node : function (obj, par, pos, callback, is_loaded, skip_redraw, origin) {
-			var t1, t2, dpc, tmp, i, j, node, old_par, new_par, old_ins, is_multi;
-
-			par = this.get_node(par);
-			pos = pos === undefined ? 0 : pos;
-			if(!par) { return false; }
-			if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
-				return this.load_node(par, function () { this.copy_node(obj, par, pos, callback, true, false, origin); });
-			}
-
-			if($.vakata.is_array(obj)) {
-				if(obj.length === 1) {
-					obj = obj[0];
-				}
-				else {
-					//obj = obj.slice();
-					for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-						if((tmp = this.copy_node(obj[t1], par, pos, callback, is_loaded, true, origin))) {
-							par = tmp;
-							pos = "after";
-						}
-					}
-					this.redraw();
-					return true;
-				}
-			}
-			obj = obj && (obj.id !== undefined) ? obj : this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-
-			old_par = (obj.parent || $.jstree.root).toString();
-			new_par = (!pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root) ? par : this.get_node(par.parent);
-			old_ins = origin ? origin : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id));
-			is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id);
-
-			if(old_ins && old_ins._id) {
-				obj = old_ins._model.data[obj.id];
-			}
-
-			if(par.id === $.jstree.root) {
-				if(pos === "before") { pos = "first"; }
-				if(pos === "after") { pos = "last"; }
-			}
-			switch(pos) {
-				case "before":
-					pos = $.inArray(par.id, new_par.children);
-					break;
-				case "after" :
-					pos = $.inArray(par.id, new_par.children) + 1;
-					break;
-				case "inside":
-				case "first":
-					pos = 0;
-					break;
-				case "last":
-					pos = new_par.children.length;
-					break;
-				default:
-					if(!pos) { pos = 0; }
-					break;
-			}
-			if(pos > new_par.children.length) { pos = new_par.children.length; }
-			if(!this.check("copy_node", obj, new_par, pos, { 'core' : true, 'origin' : origin, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			node = old_ins ? old_ins.get_json(obj, { no_id : true, no_data : true, no_state : true }) : obj;
-			if(!node) { return false; }
-			if(node.id === true) { delete node.id; }
-			node = this._parse_model_from_json(node, new_par.id, new_par.parents.concat());
-			if(!node) { return false; }
-			tmp = this.get_node(node);
-			if(obj && obj.state && obj.state.loaded === false) { tmp.state.loaded = false; }
-			dpc = [];
-			dpc.push(node);
-			dpc = dpc.concat(tmp.children_d);
-			this.trigger('model', { "nodes" : dpc, "parent" : new_par.id });
-
-			// insert into new parent and up
-			for(i = 0, j = new_par.parents.length; i < j; i++) {
-				this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(dpc);
-			}
-			dpc = [];
-			for(i = 0, j = new_par.children.length; i < j; i++) {
-				dpc[i >= pos ? i+1 : i] = new_par.children[i];
-			}
-			dpc[pos] = tmp.id;
-			new_par.children = dpc;
-			new_par.children_d.push(tmp.id);
-			new_par.children_d = new_par.children_d.concat(tmp.children_d);
-
-			if(new_par.id === $.jstree.root) {
-				this._model.force_full_redraw = true;
-			}
-			if(!this._model.force_full_redraw) {
-				this._node_changed(new_par.id);
-			}
-			if(!skip_redraw) {
-				this.redraw(new_par.id === $.jstree.root);
-			}
-			if(callback) { callback.call(this, tmp, new_par, pos); }
-			/**
-			 * triggered when a node is copied
-			 * @event
-			 * @name copy_node.jstree
-			 * @param {Object} node the copied node
-			 * @param {Object} original the original node
-			 * @param {String} parent the parent's ID
-			 * @param {Number} position the position of the node among the parent's children
-			 * @param {String} old_parent the old parent of the node
-			 * @param {Number} old_position the position of the original node
-			 * @param {Boolean} is_multi do the node and new parent belong to different instances
-			 * @param {jsTree} old_instance the instance the node came from
-			 * @param {jsTree} new_instance the instance of the new parent
-			 */
-			this.trigger('copy_node', { "node" : tmp, "original" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1,'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this });
-			return tmp.id;
-		},
-		/**
-		 * cut a node (a later call to `paste(obj)` would move the node)
-		 * @name cut(obj)
-		 * @param  {mixed} obj multiple objects can be passed using an array
-		 * @trigger cut.jstree
-		 */
-		cut : function (obj) {
-			if(!obj) { obj = this._data.core.selected.concat(); }
-			if(!$.vakata.is_array(obj)) { obj = [obj]; }
-			if(!obj.length) { return false; }
-			var tmp = [], o, t1, t2;
-			for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-				o = this.get_node(obj[t1]);
-				if(o && (o.id || o.id === 0) && o.id !== $.jstree.root) { tmp.push(o); }
-			}
-			if(!tmp.length) { return false; }
-			ccp_node = tmp;
-			ccp_inst = this;
-			ccp_mode = 'move_node';
-			/**
-			 * triggered when nodes are added to the buffer for moving
-			 * @event
-			 * @name cut.jstree
-			 * @param {Array} node
-			 */
-			this.trigger('cut', { "node" : obj });
-		},
-		/**
-		 * copy a node (a later call to `paste(obj)` would copy the node)
-		 * @name copy(obj)
-		 * @param  {mixed} obj multiple objects can be passed using an array
-		 * @trigger copy.jstree
-		 */
-		copy : function (obj) {
-			if(!obj) { obj = this._data.core.selected.concat(); }
-			if(!$.vakata.is_array(obj)) { obj = [obj]; }
-			if(!obj.length) { return false; }
-			var tmp = [], o, t1, t2;
-			for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-				o = this.get_node(obj[t1]);
-				if(o && (o.id !== undefined) && o.id !== $.jstree.root) { tmp.push(o); }
-			}
-			if(!tmp.length) { return false; }
-			ccp_node = tmp;
-			ccp_inst = this;
-			ccp_mode = 'copy_node';
-			/**
-			 * triggered when nodes are added to the buffer for copying
-			 * @event
-			 * @name copy.jstree
-			 * @param {Array} node
-			 */
-			this.trigger('copy', { "node" : obj });
-		},
-		/**
-		 * get the current buffer (any nodes that are waiting for a paste operation)
-		 * @name get_buffer()
-		 * @return {Object} an object consisting of `mode` ("copy_node" or "move_node"), `node` (an array of objects) and `inst` (the instance)
-		 */
-		get_buffer : function () {
-			return { 'mode' : ccp_mode, 'node' : ccp_node, 'inst' : ccp_inst };
-		},
-		/**
-		 * check if there is something in the buffer to paste
-		 * @name can_paste()
-		 * @return {Boolean}
-		 */
-		can_paste : function () {
-			return ccp_mode !== false && ccp_node !== false; // && ccp_inst._model.data[ccp_node];
-		},
-		/**
-		 * copy or move the previously cut or copied nodes to a new parent
-		 * @name paste(obj [, pos])
-		 * @param  {mixed} obj the new parent
-		 * @param  {mixed} pos the position to insert at (besides integer, "first" and "last" are supported), defaults to integer `0`
-		 * @trigger paste.jstree
-		 */
-		paste : function (obj, pos) {
-			obj = this.get_node(obj);
-			if(!obj || !ccp_mode || !ccp_mode.match(/^(copy_node|move_node)$/) || !ccp_node) { return false; }
-			if(this[ccp_mode](ccp_node, obj, pos, false, false, false, ccp_inst)) {
-				/**
-				 * triggered when paste is invoked
-				 * @event
-				 * @name paste.jstree
-				 * @param {String} parent the ID of the receiving node
-				 * @param {Array} node the nodes in the buffer
-				 * @param {String} mode the performed operation - "copy_node" or "move_node"
-				 */
-				this.trigger('paste', { "parent" : obj.id, "node" : ccp_node, "mode" : ccp_mode });
-			}
-			ccp_node = false;
-			ccp_mode = false;
-			ccp_inst = false;
-		},
-		/**
-		 * clear the buffer of previously copied or cut nodes
-		 * @name clear_buffer()
-		 * @trigger clear_buffer.jstree
-		 */
-		clear_buffer : function () {
-			ccp_node = false;
-			ccp_mode = false;
-			ccp_inst = false;
-			/**
-			 * triggered when the copy / cut buffer is cleared
-			 * @event
-			 * @name clear_buffer.jstree
-			 */
-			this.trigger('clear_buffer');
-		},
-		/**
-		 * put a node in edit mode (input field to rename the node)
-		 * @name edit(obj [, default_text, callback])
-		 * @param  {mixed} obj
-		 * @param  {String} default_text the text to populate the input with (if omitted or set to a non-string value the node's text value is used)
-		 * @param  {Function} callback a function to be called once the text box is blurred, it is called in the instance's scope and receives the node, a status parameter (true if the rename is successful, false otherwise), a boolean indicating if the user cancelled the edit and the original unescaped value provided by the user. You can also access the node's title using .text
-		 */
-		edit : function (obj, default_text, callback) {
-			var rtl, w, a, s, t, h1, h2, fn, tmp, cancel = false;
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			if(!this.check("edit", obj, this.get_parent(obj))) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			tmp = obj;
-			default_text = typeof default_text === 'string' ? default_text : obj.text;
-			this.set_text(obj, "");
-			obj = this._open_to(obj);
-			tmp.text = default_text;
-
-			rtl = this._data.core.rtl;
-			w  = this.element.width();
-			this._data.core.focused = tmp.id;
-			a  = obj.children('.jstree-anchor').trigger('focus');
-			s  = $('<span></span>');
-			/*!
-			oi = obj.children("i:visible"),
-			ai = a.children("i:visible"),
-			w1 = oi.width() * oi.length,
-			w2 = ai.width() * ai.length,
-			*/
-			t  = default_text;
-			h1 = $("<"+"div></div>", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo(document.body);
-			h2 = $("<"+"input />", {
-						"value" : t,
-						"class" : "jstree-rename-input",
-						// "size" : t.length,
-						"css" : {
-							"padding" : "0",
-							"border" : "1px solid silver",
-							"box-sizing" : "border-box",
-							"display" : "inline-block",
-							"height" : (this._data.core.li_height) + "px",
-							"lineHeight" : (this._data.core.li_height) + "px",
-							"width" : "150px" // will be set a bit further down
-						},
-						"on" : {
-							"blur" : function (e) {
-								e.stopImmediatePropagation();
-								e.preventDefault();
-								var i = s.children(".jstree-rename-input"),
-									v = i.val(),
-									f = this.settings.core.force_text,
-									nv;
-								if(v === "") { v = t; }
-								h1.remove();
-								s.replaceWith(a);
-								s.remove();
-								t = f ? t : $('<div></div>').append($.parseHTML(t)).html();
-								obj = this.get_node(obj);
-								this.set_text(obj, t);
-								nv = !!this.rename_node(obj, f ? $('<div></div>').text(v).text() : $('<div></div>').append($.parseHTML(v)).html());
-								if(!nv) {
-									this.set_text(obj, t); // move this up? and fix #483
-								}
-								this._data.core.focused = tmp.id;
-								setTimeout(function () {
-									var node = this.get_node(tmp.id, true);
-									if(node.length) {
-										this._data.core.focused = tmp.id;
-										node.children('.jstree-anchor').trigger('focus');
-									}
-								}.bind(this), 0);
-								if(callback) {
-									callback.call(this, tmp, nv, cancel, v);
-								}
-								h2 = null;
-							}.bind(this),
-							"keydown" : function (e) {
-								var key = e.which;
-								if(key === 27) {
-									cancel = true;
-									this.value = t;
-								}
-								if(key === 27 || key === 13 || key === 37 || key === 38 || key === 39 || key === 40 || key === 32) {
-									e.stopImmediatePropagation();
-								}
-								if(key === 27 || key === 13) {
-									e.preventDefault();
-									this.blur();
-								}
-							},
-							"click" : function (e) { e.stopImmediatePropagation(); },
-							"mousedown" : function (e) { e.stopImmediatePropagation(); },
-							"keyup" : function (e) {
-								h2.width(Math.min(h1.text("pW" + this.value).width(),w));
-							},
-							"keypress" : function(e) {
-								if(e.which === 13) { return false; }
-							}
-						}
-					});
-				fn = {
-						fontFamily		: a.css('fontFamily')		|| '',
-						fontSize		: a.css('fontSize')			|| '',
-						fontWeight		: a.css('fontWeight')		|| '',
-						fontStyle		: a.css('fontStyle')		|| '',
-						fontStretch		: a.css('fontStretch')		|| '',
-						fontVariant		: a.css('fontVariant')		|| '',
-						letterSpacing	: a.css('letterSpacing')	|| '',
-						wordSpacing		: a.css('wordSpacing')		|| ''
-				};
-			s.attr('class', a.attr('class')).append(a.contents().clone()).append(h2);
-			a.replaceWith(s);
-			h1.css(fn);
-			h2.css(fn).width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select();
-			$(document).one('mousedown.jstree touchstart.jstree dnd_start.vakata', function (e) {
-				if (h2 && e.target !== h2) {
-					$(h2).trigger('blur');
-				}
-			});
-		},
-
-
-		/**
-		 * changes the theme
-		 * @name set_theme(theme_name [, theme_url])
-		 * @param {String} theme_name the name of the new theme to apply
-		 * @param {mixed} theme_url  the location of the CSS file for this theme. Omit or set to `false` if you manually included the file. Set to `true` to autoload from the `core.themes.dir` directory.
-		 * @trigger set_theme.jstree
-		 */
-		set_theme : function (theme_name, theme_url) {
-			if(!theme_name) { return false; }
-			if(theme_url === true) {
-				var dir = this.settings.core.themes.dir;
-				if(!dir) { dir = $.jstree.path + '/themes'; }
-				theme_url = dir + '/' + theme_name + '/style.css';
-			}
-			if(theme_url && $.inArray(theme_url, themes_loaded) === -1) {
-				$('head').append('<'+'link rel="stylesheet" href="' + theme_url + '" type="text/css" />');
-				themes_loaded.push(theme_url);
-			}
-			if(this._data.core.themes.name) {
-				this.element.removeClass('jstree-' + this._data.core.themes.name);
-			}
-			this._data.core.themes.name = theme_name;
-			this.element.addClass('jstree-' + theme_name);
-			this.element[this.settings.core.themes.responsive ? 'addClass' : 'removeClass' ]('jstree-' + theme_name + '-responsive');
-			/**
-			 * triggered when a theme is set
-			 * @event
-			 * @name set_theme.jstree
-			 * @param {String} theme the new theme
-			 */
-			this.trigger('set_theme', { 'theme' : theme_name });
-		},
-		/**
-		 * gets the name of the currently applied theme name
-		 * @name get_theme()
-		 * @return {String}
-		 */
-		get_theme : function () { return this._data.core.themes.name; },
-		/**
-		 * changes the theme variant (if the theme has variants)
-		 * @name set_theme_variant(variant_name)
-		 * @param {String|Boolean} variant_name the variant to apply (if `false` is used the current variant is removed)
-		 */
-		set_theme_variant : function (variant_name) {
-			if(this._data.core.themes.variant) {
-				this.element.removeClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant);
-			}
-			this._data.core.themes.variant = variant_name;
-			if(variant_name) {
-				this.element.addClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant);
-			}
-		},
-		/**
-		 * gets the name of the currently applied theme variant
-		 * @name get_theme()
-		 * @return {String}
-		 */
-		get_theme_variant : function () { return this._data.core.themes.variant; },
-		/**
-		 * shows a striped background on the container (if the theme supports it)
-		 * @name show_stripes()
-		 */
-		show_stripes : function () {
-			this._data.core.themes.stripes = true;
-			this.get_container_ul().addClass("jstree-striped");
-			/**
-			 * triggered when stripes are shown
-			 * @event
-			 * @name show_stripes.jstree
-			 */
-			this.trigger('show_stripes');
-		},
-		/**
-		 * hides the striped background on the container
-		 * @name hide_stripes()
-		 */
-		hide_stripes : function () {
-			this._data.core.themes.stripes = false;
-			this.get_container_ul().removeClass("jstree-striped");
-			/**
-			 * triggered when stripes are hidden
-			 * @event
-			 * @name hide_stripes.jstree
-			 */
-			this.trigger('hide_stripes');
-		},
-		/**
-		 * toggles the striped background on the container
-		 * @name toggle_stripes()
-		 */
-		toggle_stripes : function () { if(this._data.core.themes.stripes) { this.hide_stripes(); } else { this.show_stripes(); } },
-		/**
-		 * shows the connecting dots (if the theme supports it)
-		 * @name show_dots()
-		 */
-		show_dots : function () {
-			this._data.core.themes.dots = true;
-			this.get_container_ul().removeClass("jstree-no-dots");
-			/**
-			 * triggered when dots are shown
-			 * @event
-			 * @name show_dots.jstree
-			 */
-			this.trigger('show_dots');
-		},
-		/**
-		 * hides the connecting dots
-		 * @name hide_dots()
-		 */
-		hide_dots : function () {
-			this._data.core.themes.dots = false;
-			this.get_container_ul().addClass("jstree-no-dots");
-			/**
-			 * triggered when dots are hidden
-			 * @event
-			 * @name hide_dots.jstree
-			 */
-			this.trigger('hide_dots');
-		},
-		/**
-		 * toggles the connecting dots
-		 * @name toggle_dots()
-		 */
-		toggle_dots : function () { if(this._data.core.themes.dots) { this.hide_dots(); } else { this.show_dots(); } },
-		/**
-		 * show the node icons
-		 * @name show_icons()
-		 */
-		show_icons : function () {
-			this._data.core.themes.icons = true;
-			this.get_container_ul().removeClass("jstree-no-icons");
-			/**
-			 * triggered when icons are shown
-			 * @event
-			 * @name show_icons.jstree
-			 */
-			this.trigger('show_icons');
-		},
-		/**
-		 * hide the node icons
-		 * @name hide_icons()
-		 */
-		hide_icons : function () {
-			this._data.core.themes.icons = false;
-			this.get_container_ul().addClass("jstree-no-icons");
-			/**
-			 * triggered when icons are hidden
-			 * @event
-			 * @name hide_icons.jstree
-			 */
-			this.trigger('hide_icons');
-		},
-		/**
-		 * toggle the node icons
-		 * @name toggle_icons()
-		 */
-		toggle_icons : function () { if(this._data.core.themes.icons) { this.hide_icons(); } else { this.show_icons(); } },
-		/**
-		 * show the node ellipsis
-		 * @name show_icons()
-		 */
-		show_ellipsis : function () {
-			this._data.core.themes.ellipsis = true;
-			this.get_container_ul().addClass("jstree-ellipsis");
-			/**
-			 * triggered when ellisis is shown
-			 * @event
-			 * @name show_ellipsis.jstree
-			 */
-			this.trigger('show_ellipsis');
-		},
-		/**
-		 * hide the node ellipsis
-		 * @name hide_ellipsis()
-		 */
-		hide_ellipsis : function () {
-			this._data.core.themes.ellipsis = false;
-			this.get_container_ul().removeClass("jstree-ellipsis");
-			/**
-			 * triggered when ellisis is hidden
-			 * @event
-			 * @name hide_ellipsis.jstree
-			 */
-			this.trigger('hide_ellipsis');
-		},
-		/**
-		 * toggle the node ellipsis
-		 * @name toggle_icons()
-		 */
-		toggle_ellipsis : function () { if(this._data.core.themes.ellipsis) { this.hide_ellipsis(); } else { this.show_ellipsis(); } },
-		/**
-		 * set the node icon for a node
-		 * @name set_icon(obj, icon)
-		 * @param {mixed} obj
-		 * @param {String} icon the new icon - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class
-		 */
-		set_icon : function (obj, icon) {
-			var t1, t2, dom, old;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.set_icon(obj[t1], icon);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) { return false; }
-			old = obj.icon;
-			obj.icon = icon === true || icon === null || icon === undefined || icon === '' ? true : icon;
-			dom = this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon");
-			if(icon === false) {
-				dom.removeClass('jstree-themeicon-custom ' + old).css("background","").removeAttr("rel");
-				this.hide_icon(obj);
-			}
-			else if(icon === true || icon === null || icon === undefined || icon === '') {
-				dom.removeClass('jstree-themeicon-custom ' + old).css("background","").removeAttr("rel");
-				if(old === false) { this.show_icon(obj); }
-			}
-			else if(icon.indexOf("/") === -1 && icon.indexOf(".") === -1) {
-				dom.removeClass(old).css("background","");
-				dom.addClass(icon + ' jstree-themeicon-custom').attr("rel",icon);
-				if(old === false) { this.show_icon(obj); }
-			}
-			else {
-				dom.removeClass(old).css("background","");
-				dom.addClass('jstree-themeicon-custom').css("background", "url('" + icon + "') center center no-repeat").attr("rel",icon);
-				if(old === false) { this.show_icon(obj); }
-			}
-			return true;
-		},
-		/**
-		 * get the node icon for a node
-		 * @name get_icon(obj)
-		 * @param {mixed} obj
-		 * @return {String}
-		 */
-		get_icon : function (obj) {
-			obj = this.get_node(obj);
-			return (!obj || obj.id === $.jstree.root) ? false : obj.icon;
-		},
-		/**
-		 * hide the icon on an individual node
-		 * @name hide_icon(obj)
-		 * @param {mixed} obj
-		 */
-		hide_icon : function (obj) {
-			var t1, t2;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.hide_icon(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj === $.jstree.root) { return false; }
-			obj.icon = false;
-			this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon").addClass('jstree-themeicon-hidden');
-			return true;
-		},
-		/**
-		 * show the icon on an individual node
-		 * @name show_icon(obj)
-		 * @param {mixed} obj
-		 */
-		show_icon : function (obj) {
-			var t1, t2, dom;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.show_icon(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj === $.jstree.root) { return false; }
-			dom = this.get_node(obj, true);
-			obj.icon = dom.length ? dom.children(".jstree-anchor").children(".jstree-themeicon").attr('rel') : true;
-			if(!obj.icon) { obj.icon = true; }
-			dom.children(".jstree-anchor").children(".jstree-themeicon").removeClass('jstree-themeicon-hidden');
-			return true;
-		}
-	};
-
-	// helpers
-	$.vakata = {};
-	// collect attributes
-	$.vakata.attributes = function(node, with_values) {
-		node = $(node)[0];
-		var attr = with_values ? {} : [];
-		if(node && node.attributes) {
-			$.each(node.attributes, function (i, v) {
-				if($.inArray(v.name.toLowerCase(),['style','contenteditable','hasfocus','tabindex']) !== -1) { return; }
-				if(v.value !== null && $.vakata.trim(v.value) !== '') {
-					if(with_values) { attr[v.name] = v.value; }
-					else { attr.push(v.name); }
-				}
-			});
-		}
-		return attr;
-	};
-	$.vakata.array_unique = function(array) {
-		var a = [], i, j, l, o = {};
-		for(i = 0, l = array.length; i < l; i++) {
-			if(o[array[i]] === undefined) {
-				a.push(array[i]);
-				o[array[i]] = true;
-			}
-		}
-		return a;
-	};
-	// remove item from array
-	$.vakata.array_remove = function(array, from) {
-		array.splice(from, 1);
-		return array;
-		//var rest = array.slice((to || from) + 1 || array.length);
-		//array.length = from < 0 ? array.length + from : from;
-		//array.push.apply(array, rest);
-		//return array;
-	};
-	// remove item from array
-	$.vakata.array_remove_item = function(array, item) {
-		var tmp = $.inArray(item, array);
-		return tmp !== -1 ? $.vakata.array_remove(array, tmp) : array;
-	};
-	$.vakata.array_filter = function(c,a,b,d,e) {
-		if (c.filter) {
-			return c.filter(a, b);
-		}
-		d=[];
-		for (e in c) {
-			if (~~e+''===e+'' && e>=0 && a.call(b,c[e],+e,c)) {
-				d.push(c[e]);
-			}
-		}
-		return d;
-	};
-	$.vakata.trim = function (text) {
-		return String.prototype.trim ? 
-			String.prototype.trim.call(text.toString()) :
-			text.toString().replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
-	};
-	$.vakata.is_function = function(obj) {
-		return typeof obj === "function" && typeof obj.nodeType !== "number";
-	};
-	$.vakata.is_array = Array.isArray || function (obj) {
-		return Object.prototype.toString.call(obj) === "[object Array]";
-	};
-
-	// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind#polyfill
-	if (!Function.prototype.bind) {
-		Function.prototype.bind = function () {
-			var thatFunc = this, thatArg = arguments[0];
-			var args = Array.prototype.slice.call(arguments, 1);
-			if (typeof thatFunc !== 'function') {
-				// closest thing possible to the ECMAScript 5
-				// internal IsCallable function
-				throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
-			}
-			return function(){
-				var funcArgs = args.concat(Array.prototype.slice.call(arguments));
-				return thatFunc.apply(thatArg, funcArgs);
-			};
-		};
-	}
-}));
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.massload.js b/public/ext/vakata-jstree-3.3.17/src/jstree.massload.js
deleted file mode 100644
index d276c1f92a..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.massload.js
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * ### Massload plugin
- *
- * Adds massload functionality to jsTree, so that multiple nodes can be loaded in a single request (only useful with lazy loading).
- */
-/*globals jQuery, define, exports, require, document */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.massload', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.massload) { return; }
-
-	/**
-	 * massload configuration
-	 *
-	 * It is possible to set this to a standard jQuery-like AJAX config.
-	 * In addition to the standard jQuery ajax options here you can supply functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node IDs need to be loaded, the return value of those functions will be used.
-	 *
-	 * You can also set this to a function, that function will receive the node IDs being loaded as argument and a second param which is a function (callback) which should be called with the result.
-	 *
-	 * Both the AJAX and the function approach rely on the same return value - an object where the keys are the node IDs, and the value is the children of that node as an array.
-	 *
-	 *	{
-	 *		"id1" : [{ "text" : "Child of ID1", "id" : "c1" }, { "text" : "Another child of ID1", "id" : "c2" }],
-	 *		"id2" : [{ "text" : "Child of ID2", "id" : "c3" }]
-	 *	}
-	 * 
-	 * @name $.jstree.defaults.massload
-	 * @plugin massload
-	 */
-	$.jstree.defaults.massload = null;
-	$.jstree.plugins.massload = function (options, parent) {
-		this.init = function (el, options) {
-			this._data.massload = {};
-			parent.init.call(this, el, options);
-		};
-		this._load_nodes = function (nodes, callback, is_callback, force_reload) {
-			var s = this.settings.massload,				
-				toLoad = [],
-				m = this._model.data,
-				i, j, dom;
-			if (!is_callback) {
-				for(i = 0, j = nodes.length; i < j; i++) {
-					if(!m[nodes[i]] || ( (!m[nodes[i]].state.loaded && !m[nodes[i]].state.failed) || force_reload) ) {
-						toLoad.push(nodes[i]);
-						dom = this.get_node(nodes[i], true);
-						if (dom && dom.length) {
-							dom.addClass("jstree-loading").attr('aria-busy',true);
-						}
-					}
-				}
-				this._data.massload = {};
-				if (toLoad.length) {
-					if($.vakata.is_function(s)) {
-						return s.call(this, toLoad, function (data) {
-							var i, j;
-							if(data) {
-								for(i in data) {
-									if(data.hasOwnProperty(i)) {
-										this._data.massload[i] = data[i];
-									}
-								}
-							}
-							for(i = 0, j = nodes.length; i < j; i++) {
-								dom = this.get_node(nodes[i], true);
-								if (dom && dom.length) {
-									dom.removeClass("jstree-loading").attr('aria-busy',false);
-								}
-							}
-							parent._load_nodes.call(this, nodes, callback, is_callback, force_reload);
-						}.bind(this));
-					}
-					if(typeof s === 'object' && s && s.url) {
-						s = $.extend(true, {}, s);
-						if($.vakata.is_function(s.url)) {
-							s.url = s.url.call(this, toLoad);
-						}
-						if($.vakata.is_function(s.data)) {
-							s.data = s.data.call(this, toLoad);
-						}
-						return $.ajax(s)
-							.done(function (data,t,x) {
-									var i, j;
-									if(data) {
-										for(i in data) {
-											if(data.hasOwnProperty(i)) {
-												this._data.massload[i] = data[i];
-											}
-										}
-									}
-									for(i = 0, j = nodes.length; i < j; i++) {
-										dom = this.get_node(nodes[i], true);
-										if (dom && dom.length) {
-											dom.removeClass("jstree-loading").attr('aria-busy',false);
-										}
-									}
-									parent._load_nodes.call(this, nodes, callback, is_callback, force_reload);
-								}.bind(this))
-							.fail(function (f) {
-									parent._load_nodes.call(this, nodes, callback, is_callback, force_reload);
-								}.bind(this));
-					}
-				}
-			}
-			return parent._load_nodes.call(this, nodes, callback, is_callback, force_reload);
-		};
-		this._load_node = function (obj, callback) {
-			var data = this._data.massload[obj.id],
-				rslt = null, dom;
-			if(data) {
-				rslt = this[typeof data === 'string' ? '_append_html_data' : '_append_json_data'](
-					obj,
-					typeof data === 'string' ? $($.parseHTML(data)).filter(function () { return this.nodeType !== 3; }) : data,
-					function (status) { callback.call(this, status); }
-				);
-				dom = this.get_node(obj.id, true);
-				if (dom && dom.length) {
-					dom.removeClass("jstree-loading").attr('aria-busy',false);
-				}
-				delete this._data.massload[obj.id];
-				return rslt;
-			}
-			return parent._load_node.call(this, obj, callback);
-		};
-	};
-}));
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.search.js b/public/ext/vakata-jstree-3.3.17/src/jstree.search.js
deleted file mode 100644
index e72919441e..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.search.js
+++ /dev/null
@@ -1,421 +0,0 @@
-/**
- * ### Search plugin
- *
- * Adds search functionality to jsTree.
- */
-/*globals jQuery, define, exports, require, document */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.search', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.search) { return; }
-
-	/**
-	 * stores all defaults for the search plugin
-	 * @name $.jstree.defaults.search
-	 * @plugin search
-	 */
-	$.jstree.defaults.search = {
-		/**
-		 * a jQuery-like AJAX config, which jstree uses if a server should be queried for results.
-		 *
-		 * A `str` (which is the search string) parameter will be added with the request, an optional `inside` parameter will be added if the search is limited to a node id. The expected result is a JSON array with nodes that need to be opened so that matching nodes will be revealed.
-		 * Leave this setting as `false` to not query the server. You can also set this to a function, which will be invoked in the instance's scope and receive 3 parameters - the search string, the callback to call with the array of nodes to load, and the optional node ID to limit the search to
-		 * @name $.jstree.defaults.search.ajax
-		 * @plugin search
-		 */
-		ajax : false,
-		/**
-		 * Indicates if the search should be fuzzy or not (should `chnd3` match `child node 3`). Default is `false`.
-		 * @name $.jstree.defaults.search.fuzzy
-		 * @plugin search
-		 */
-		fuzzy : false,
-		/**
-		 * Indicates if the search should be case sensitive. Default is `false`.
-		 * @name $.jstree.defaults.search.case_sensitive
-		 * @plugin search
-		 */
-		case_sensitive : false,
-		/**
-		 * Indicates if the tree should be filtered (by default) to show only matching nodes (keep in mind this can be a heavy on large trees in old browsers).
-		 * This setting can be changed at runtime when calling the search method. Default is `false`.
-		 * @name $.jstree.defaults.search.show_only_matches
-		 * @plugin search
-		 */
-		show_only_matches : false,
-		/**
-		 * Indicates if the children of matched element are shown (when show_only_matches is true)
-		 * This setting can be changed at runtime when calling the search method. Default is `false`.
-		 * @name $.jstree.defaults.search.show_only_matches_children
-		 * @plugin search
-		 */
-		show_only_matches_children : false,
-		/**
-		 * Indicates if all nodes opened to reveal the search result, should be closed when the search is cleared or a new search is performed. Default is `true`.
-		 * @name $.jstree.defaults.search.close_opened_onclear
-		 * @plugin search
-		 */
-		close_opened_onclear : true,
-		/**
-		 * Indicates if only leaf nodes should be included in search results. Default is `false`.
-		 * @name $.jstree.defaults.search.search_leaves_only
-		 * @plugin search
-		 */
-		search_leaves_only : false,
-		/**
-		 * If set to a function it wil be called in the instance's scope with two arguments - search string and node (where node will be every node in the structure, so use with caution).
-		 * If the function returns a truthy value the node will be considered a match (it might not be displayed if search_only_leaves is set to true and the node is not a leaf). Default is `false`.
-		 * @name $.jstree.defaults.search.search_callback
-		 * @plugin search
-		 */
-		search_callback : false
-	};
-
-	$.jstree.plugins.search = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-
-			this._data.search.str = "";
-			this._data.search.dom = $();
-			this._data.search.res = [];
-			this._data.search.opn = [];
-			this._data.search.som = false;
-			this._data.search.smc = false;
-			this._data.search.hdn = [];
-
-			this.element
-				.on("search.jstree", function (e, data) {
-						if(this._data.search.som && data.res.length) {
-							var m = this._model.data, i, j, p = [], k, l;
-							for(i = 0, j = data.res.length; i < j; i++) {
-								if(m[data.res[i]] && !m[data.res[i]].state.hidden) {
-									p.push(data.res[i]);
-									p = p.concat(m[data.res[i]].parents);
-									if(this._data.search.smc) {
-										for (k = 0, l = m[data.res[i]].children_d.length; k < l; k++) {
-											if (m[m[data.res[i]].children_d[k]] && !m[m[data.res[i]].children_d[k]].state.hidden) {
-												p.push(m[data.res[i]].children_d[k]);
-											}
-										}
-									}
-								}
-							}
-							p = $.vakata.array_remove_item($.vakata.array_unique(p), $.jstree.root);
-							this._data.search.hdn = this.hide_all(true);
-							this.show_node(p, true);
-							this.redraw(true);
-						}
-					}.bind(this))
-				.on("clear_search.jstree", function (e, data) {
-						if(this._data.search.som && data.res.length) {
-							this.show_node(this._data.search.hdn, true);
-							this.redraw(true);
-						}
-					}.bind(this));
-		};
-		/**
-		 * used to search the tree nodes for a given string
-		 * @name search(str [, skip_async])
-		 * @param {String} str the search string
-		 * @param {Boolean} skip_async if set to true server will not be queried even if configured
-		 * @param {Boolean} show_only_matches if set to true only matching nodes will be shown (keep in mind this can be very slow on large trees or old browsers)
-		 * @param {mixed} inside an optional node to whose children to limit the search
-		 * @param {Boolean} append if set to true the results of this search are appended to the previous search
-		 * @plugin search
-		 * @trigger search.jstree
-		 */
-		this.search = function (str, skip_async, show_only_matches, inside, append, show_only_matches_children) {
-			if(str === false || $.vakata.trim(str.toString()) === "") {
-				return this.clear_search();
-			}
-			inside = this.get_node(inside);
-			inside = inside && (inside.id || inside.id === 0) ? inside.id : null;
-			str = str.toString();
-			var s = this.settings.search,
-				a = s.ajax ? s.ajax : false,
-				m = this._model.data,
-				f = null,
-				r = [],
-				p = [], i, j;
-			if(this._data.search.res.length && !append) {
-				this.clear_search();
-			}
-			if(show_only_matches === undefined) {
-				show_only_matches = s.show_only_matches;
-			}
-			if(show_only_matches_children === undefined) {
-				show_only_matches_children = s.show_only_matches_children;
-			}
-			if(!skip_async && a !== false) {
-				if($.vakata.is_function(a)) {
-					return a.call(this, str, function (d) {
-							if(d && d.d) { d = d.d; }
-							this._load_nodes(!$.vakata.is_array(d) ? [] : $.vakata.array_unique(d), function () {
-								this.search(str, true, show_only_matches, inside, append, show_only_matches_children);
-							});
-						}.bind(this), inside);
-				}
-				else {
-					a = $.extend({}, a);
-					if(!a.data) { a.data = {}; }
-					a.data.str = str;
-					if(inside) {
-						a.data.inside = inside;
-					}
-					if (this._data.search.lastRequest) {
-						this._data.search.lastRequest.abort();
-					}
-					this._data.search.lastRequest = $.ajax(a)
-						.fail(function () {
-							this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'search', 'id' : 'search_01', 'reason' : 'Could not load search parents', 'data' : JSON.stringify(a) };
-							this.settings.core.error.call(this, this._data.core.last_error);
-						}.bind(this))
-						.done(function (d) {
-							if(d && d.d) { d = d.d; }
-							this._load_nodes(!$.vakata.is_array(d) ? [] : $.vakata.array_unique(d), function () {
-								this.search(str, true, show_only_matches, inside, append, show_only_matches_children);
-							});
-						}.bind(this));
-					return this._data.search.lastRequest;
-				}
-			}
-			if(!append) {
-				this._data.search.str = str;
-				this._data.search.dom = $();
-				this._data.search.res = [];
-				this._data.search.opn = [];
-				this._data.search.som = show_only_matches;
-				this._data.search.smc = show_only_matches_children;
-			}
-
-			f = new $.vakata.search(str, true, { caseSensitive : s.case_sensitive, fuzzy : s.fuzzy });
-			$.each(m[inside ? inside : $.jstree.root].children_d, function (ii, i) {
-				var v = m[i];
-				if(v.text && !v.state.hidden && (!s.search_leaves_only || (v.state.loaded && v.children.length === 0)) && ( (s.search_callback && s.search_callback.call(this, str, v)) || (!s.search_callback && f.search(v.text).isMatch) ) ) {
-					r.push(i);
-					p = p.concat(v.parents);
-				}
-			});
-			if(r.length) {
-				p = $.vakata.array_unique(p);
-				for(i = 0, j = p.length; i < j; i++) {
-					if(p[i] !== $.jstree.root && m[p[i]] && this.open_node(p[i], null, 0) === true) {
-						this._data.search.opn.push(p[i]);
-					}
-				}
-				if(!append) {
-					this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #')));
-					this._data.search.res = r;
-				}
-				else {
-					this._data.search.dom = this._data.search.dom.add($(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #'))));
-					this._data.search.res = $.vakata.array_unique(this._data.search.res.concat(r));
-				}
-				this._data.search.dom.children(".jstree-anchor").addClass('jstree-search');
-			}
-			/**
-			 * triggered after search is complete
-			 * @event
-			 * @name search.jstree
-			 * @param {jQuery} nodes a jQuery collection of matching nodes
-			 * @param {String} str the search string
-			 * @param {Array} res a collection of objects represeing the matching nodes
-			 * @plugin search
-			 */
-			this.trigger('search', { nodes : this._data.search.dom, str : str, res : this._data.search.res, show_only_matches : show_only_matches });
-		};
-		/**
-		 * used to clear the last search (removes classes and shows all nodes if filtering is on)
-		 * @name clear_search()
-		 * @plugin search
-		 * @trigger clear_search.jstree
-		 */
-		this.clear_search = function () {
-			if(this.settings.search.close_opened_onclear) {
-				this.close_node(this._data.search.opn, 0);
-			}
-			/**
-			 * triggered after search is complete
-			 * @event
-			 * @name clear_search.jstree
-			 * @param {jQuery} nodes a jQuery collection of matching nodes (the result from the last search)
-			 * @param {String} str the search string (the last search string)
-			 * @param {Array} res a collection of objects represeing the matching nodes (the result from the last search)
-			 * @plugin search
-			 */
-			this.trigger('clear_search', { 'nodes' : this._data.search.dom, str : this._data.search.str, res : this._data.search.res });
-			if(this._data.search.res.length) {
-				this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(this._data.search.res, function (v) {
-					return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&');
-				}).join(', #')));
-				this._data.search.dom.children(".jstree-anchor").removeClass("jstree-search");
-			}
-			this._data.search.str = "";
-			this._data.search.res = [];
-			this._data.search.opn = [];
-			this._data.search.dom = $();
-		};
-
-		this.redraw_node = function(obj, deep, callback, force_render) {
-			obj = parent.redraw_node.apply(this, arguments);
-			if(obj) {
-				if($.inArray(obj.id, this._data.search.res) !== -1) {
-					var i, j, tmp = null;
-					for(i = 0, j = obj.childNodes.length; i < j; i++) {
-						if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
-							tmp = obj.childNodes[i];
-							break;
-						}
-					}
-					if(tmp) {
-						tmp.className += ' jstree-search';
-					}
-				}
-			}
-			return obj;
-		};
-	};
-
-	// helpers
-	(function ($) {
-		// from http://kiro.me/projects/fuse.html
-		$.vakata.search = function(pattern, txt, options) {
-			options = options || {};
-			options = $.extend({}, $.vakata.search.defaults, options);
-			if(options.fuzzy !== false) {
-				options.fuzzy = true;
-			}
-			pattern = options.caseSensitive ? pattern : pattern.toLowerCase();
-			var MATCH_LOCATION	= options.location,
-				MATCH_DISTANCE	= options.distance,
-				MATCH_THRESHOLD	= options.threshold,
-				patternLen = pattern.length,
-				matchmask, pattern_alphabet, match_bitapScore, search;
-			if(patternLen > 32) {
-				options.fuzzy = false;
-			}
-			if(options.fuzzy) {
-				matchmask = 1 << (patternLen - 1);
-				pattern_alphabet = (function () {
-					var mask = {},
-						i = 0;
-					for (i = 0; i < patternLen; i++) {
-						mask[pattern.charAt(i)] = 0;
-					}
-					for (i = 0; i < patternLen; i++) {
-						mask[pattern.charAt(i)] |= 1 << (patternLen - i - 1);
-					}
-					return mask;
-				}());
-				match_bitapScore = function (e, x) {
-					var accuracy = e / patternLen,
-						proximity = Math.abs(MATCH_LOCATION - x);
-					if(!MATCH_DISTANCE) {
-						return proximity ? 1.0 : accuracy;
-					}
-					return accuracy + (proximity / MATCH_DISTANCE);
-				};
-			}
-			search = function (text) {
-				text = options.caseSensitive ? text.toString() : text.toString().toLowerCase();
-				if(pattern === text || text.indexOf(pattern) !== -1) {
-					return {
-						isMatch: true,
-						score: 0
-					};
-				}
-				if(!options.fuzzy) {
-					return {
-						isMatch: false,
-						score: 1
-					};
-				}
-				var i, j,
-					textLen = text.length,
-					scoreThreshold = MATCH_THRESHOLD,
-					bestLoc = text.indexOf(pattern, MATCH_LOCATION),
-					binMin, binMid,
-					binMax = patternLen + textLen,
-					lastRd, start, finish, rd, charMatch,
-					score = 1,
-					locations = [];
-				if (bestLoc !== -1) {
-					scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold);
-					bestLoc = text.lastIndexOf(pattern, MATCH_LOCATION + patternLen);
-					if (bestLoc !== -1) {
-						scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold);
-					}
-				}
-				bestLoc = -1;
-				for (i = 0; i < patternLen; i++) {
-					binMin = 0;
-					binMid = binMax;
-					while (binMin < binMid) {
-						if (match_bitapScore(i, MATCH_LOCATION + binMid) <= scoreThreshold) {
-							binMin = binMid;
-						} else {
-							binMax = binMid;
-						}
-						binMid = Math.floor((binMax - binMin) / 2 + binMin);
-					}
-					binMax = binMid;
-					start = Math.max(1, MATCH_LOCATION - binMid + 1);
-					finish = Math.min(MATCH_LOCATION + binMid, textLen) + patternLen;
-					rd = new Array(finish + 2);
-					rd[finish + 1] = (1 << i) - 1;
-					for (j = finish; j >= start; j--) {
-						charMatch = pattern_alphabet[text.charAt(j - 1)];
-						if (i === 0) {
-							rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;
-						} else {
-							rd[j] = ((rd[j + 1] << 1) | 1) & charMatch | (((lastRd[j + 1] | lastRd[j]) << 1) | 1) | lastRd[j + 1];
-						}
-						if (rd[j] & matchmask) {
-							score = match_bitapScore(i, j - 1);
-							if (score <= scoreThreshold) {
-								scoreThreshold = score;
-								bestLoc = j - 1;
-								locations.push(bestLoc);
-								if (bestLoc > MATCH_LOCATION) {
-									start = Math.max(1, 2 * MATCH_LOCATION - bestLoc);
-								} else {
-									break;
-								}
-							}
-						}
-					}
-					if (match_bitapScore(i + 1, MATCH_LOCATION) > scoreThreshold) {
-						break;
-					}
-					lastRd = rd;
-				}
-				return {
-					isMatch: bestLoc >= 0,
-					score: score
-				};
-			};
-			return txt === true ? { 'search' : search } : search(txt);
-		};
-		$.vakata.search.defaults = {
-			location : 0,
-			distance : 100,
-			threshold : 0.6,
-			fuzzy : false,
-			caseSensitive : false
-		};
-	}($));
-
-	// include the search plugin by default
-	// $.jstree.defaults.plugins.push("search");
-}));
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.sort.js b/public/ext/vakata-jstree-3.3.17/src/jstree.sort.js
deleted file mode 100644
index d631381539..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.sort.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * ### Sort plugin
- *
- * Automatically sorts all siblings in the tree according to a sorting function.
- */
-/*globals jQuery, define, exports, require */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.sort', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.sort) { return; }
-
-	/**
-	 * the settings function used to sort the nodes.
-	 * It is executed in the tree's context, accepts two nodes as arguments and should return `1` or `-1`.
-	 * @name $.jstree.defaults.sort
-	 * @plugin sort
-	 */
-	$.jstree.defaults.sort = function (a, b) {
-		//return this.get_type(a) === this.get_type(b) ? (this.get_text(a) > this.get_text(b) ? 1 : -1) : this.get_type(a) >= this.get_type(b);
-		return this.get_text(a) > this.get_text(b) ? 1 : -1;
-	};
-	$.jstree.plugins.sort = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-			this.element
-				.on("model.jstree", function (e, data) {
-						this.sort(data.parent, true);
-					}.bind(this))
-				.on("rename_node.jstree create_node.jstree", function (e, data) {
-						this.sort(data.parent || data.node.parent, false);
-						this.redraw_node(data.parent || data.node.parent, true);
-					}.bind(this))
-				.on("move_node.jstree copy_node.jstree", function (e, data) {
-						this.sort(data.parent, false);
-						this.redraw_node(data.parent, true);
-					}.bind(this));
-		};
-		/**
-		 * used to sort a node's children
-		 * @private
-		 * @name sort(obj [, deep])
-		 * @param  {mixed} obj the node
-		 * @param {Boolean} deep if set to `true` nodes are sorted recursively.
-		 * @plugin sort
-		 * @trigger search.jstree
-		 */
-		this.sort = function (obj, deep) {
-			var i, j;
-			obj = this.get_node(obj);
-			if(obj && obj.children && obj.children.length) {
-				obj.children.sort(this.settings.sort.bind(this));
-				if(deep) {
-					for(i = 0, j = obj.children_d.length; i < j; i++) {
-						this.sort(obj.children_d[i], false);
-					}
-				}
-			}
-		};
-	};
-
-	// include the sort plugin by default
-	// $.jstree.defaults.plugins.push("sort");
-}));
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.state.js b/public/ext/vakata-jstree-3.3.17/src/jstree.state.js
deleted file mode 100644
index 69ae813044..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.state.js
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * ### State plugin
- *
- * Saves the state of the tree (selected nodes, opened nodes) on the user's computer using available options (localStorage, cookies, etc)
- */
-/*globals jQuery, define, exports, require */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.state', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.state) { return; }
-
-	var to = false;
-	/**
-	 * stores all defaults for the state plugin
-	 * @name $.jstree.defaults.state
-	 * @plugin state
-	 */
-	$.jstree.defaults.state = {
-		/**
-		 * A string for the key to use when saving the current tree (change if using multiple trees in your project). Defaults to `jstree`.
-		 * @name $.jstree.defaults.state.key
-		 * @plugin state
-		 */
-		key		: 'jstree',
-		/**
-		 * A space separated list of events that trigger a state save. Defaults to `changed.jstree open_node.jstree close_node.jstree`.
-		 * @name $.jstree.defaults.state.events
-		 * @plugin state
-		 */
-		events	: 'changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree',
-		/**
-		 * Time in milliseconds after which the state will expire. Defaults to 'false' meaning - no expire.
-		 * @name $.jstree.defaults.state.ttl
-		 * @plugin state
-		 */
-		ttl		: false,
-		/**
-		 * A function that will be executed prior to restoring state with one argument - the state object. Can be used to clear unwanted parts of the state.
-		 * @name $.jstree.defaults.state.filter
-		 * @plugin state
-		 */
-		filter	: false,
-		/**
-		 * Should loaded nodes be restored (setting this to true means that it is possible that the whole tree will be loaded for some users - use with caution). Defaults to `false`
-		 * @name $.jstree.defaults.state.preserve_loaded
-		 * @plugin state
-		 */
-		preserve_loaded : false
-	};
-	$.jstree.plugins.state = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-			var bind = function () {
-				this.element.on(this.settings.state.events, function () {
-					if(to) { clearTimeout(to); }
-					to = setTimeout(function () { this.save_state(); }.bind(this), 100);
-				}.bind(this));
-				/**
-				 * triggered when the state plugin is finished restoring the state (and immediately after ready if there is no state to restore).
-				 * @event
-				 * @name state_ready.jstree
-				 * @plugin state
-				 */
-				this.trigger('state_ready');
-			}.bind(this);
-			this.element
-				.on("ready.jstree", function (e, data) {
-						this.element.one("restore_state.jstree", bind);
-						if(!this.restore_state()) { bind(); }
-					}.bind(this));
-		};
-		/**
-		 * save the state
-		 * @name save_state()
-		 * @plugin state
-		 */
-		this.save_state = function () {
-			var tm = this.get_state();
-			if (!this.settings.state.preserve_loaded) {
-				delete tm.core.loaded;
-			}
-			var st = { 'state' : tm, 'ttl' : this.settings.state.ttl, 'sec' : +(new Date()) };
-			$.vakata.storage.set(this.settings.state.key, JSON.stringify(st));
-		};
-		/**
-		 * restore the state from the user's computer
-		 * @name restore_state()
-		 * @plugin state
-		 */
-		this.restore_state = function () {
-			var k = $.vakata.storage.get(this.settings.state.key);
-			if(!!k) { try { k = JSON.parse(k); } catch(ex) { return false; } }
-			if(!!k && k.ttl && k.sec && +(new Date()) - k.sec > k.ttl) { return false; }
-			if(!!k && k.state) { k = k.state; }
-			if(!!k && $.vakata.is_function(this.settings.state.filter)) { k = this.settings.state.filter.call(this, k); }
-			if(!!k) {
-				if (!this.settings.state.preserve_loaded) {
-					delete k.core.loaded;
-				}
-				this.element.one("set_state.jstree", function (e, data) { data.instance.trigger('restore_state', { 'state' : $.extend(true, {}, k) }); });
-				this.set_state(k);
-				return true;
-			}
-			return false;
-		};
-		/**
-		 * clear the state on the user's computer
-		 * @name clear_state()
-		 * @plugin state
-		 */
-		this.clear_state = function () {
-			return $.vakata.storage.del(this.settings.state.key);
-		};
-	};
-
-	(function ($, undefined) {
-		$.vakata.storage = {
-			// simply specifying the functions in FF throws an error
-			set : function (key, val) { return window.localStorage.setItem(key, val); },
-			get : function (key) { return window.localStorage.getItem(key); },
-			del : function (key) { return window.localStorage.removeItem(key); }
-		};
-	}($));
-
-	// include the state plugin by default
-	// $.jstree.defaults.plugins.push("state");
-}));
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.types.js b/public/ext/vakata-jstree-3.3.17/src/jstree.types.js
deleted file mode 100644
index 7e11af9400..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.types.js
+++ /dev/null
@@ -1,372 +0,0 @@
-/**
- * ### Types plugin
- *
- * Makes it possible to add predefined types for groups of nodes, which make it possible to easily control nesting rules and icon for each group.
- */
-/*globals jQuery, define, exports, require */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.types', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.types) { return; }
-
-	/**
-	 * An object storing all types as key value pairs, where the key is the type name and the value is an object that could contain following keys (all optional).
-	 *
-	 * * `max_children` the maximum number of immediate children this node type can have. Do not specify or set to `-1` for unlimited.
-	 * * `max_depth` the maximum number of nesting this node type can have. A value of `1` would mean that the node can have children, but no grandchildren. Do not specify or set to `-1` for unlimited.
-	 * * `valid_children` an array of node type strings, that nodes of this type can have as children. Do not specify or set to `-1` for no limits.
-	 * * `icon` a string - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class. Omit to use the default icon from your theme.
-	 * * `li_attr` an object of values which will be used to add HTML attributes on the resulting LI DOM node (merged with the node's own data)
-	 * * `a_attr` an object of values which will be used to add HTML attributes on the resulting A DOM node (merged with the node's own data)
-	 *
-	 * There are two predefined types:
-	 *
-	 * * `#` represents the root of the tree, for example `max_children` would control the maximum number of root nodes.
-	 * * `default` represents the default node - any settings here will be applied to all nodes that do not have a type specified.
-	 *
-	 * @name $.jstree.defaults.types
-	 * @plugin types
-	 */
-	$.jstree.defaults.types = {
-		'default' : {}
-	};
-	$.jstree.defaults.types[$.jstree.root] = {};
-
-	$.jstree.plugins.types = function (options, parent) {
-		this.init = function (el, options) {
-			var i, j;
-			if(options && options.types && options.types['default']) {
-				for(i in options.types) {
-					if(i !== "default" && i !== $.jstree.root && options.types.hasOwnProperty(i)) {
-						for(j in options.types['default']) {
-							if(options.types['default'].hasOwnProperty(j) && options.types[i][j] === undefined) {
-								options.types[i][j] = options.types['default'][j];
-							}
-						}
-					}
-				}
-			}
-			parent.init.call(this, el, options);
-			this._model.data[$.jstree.root].type = $.jstree.root;
-		};
-		this.refresh = function (skip_loading, forget_state) {
-			parent.refresh.call(this, skip_loading, forget_state);
-			this._model.data[$.jstree.root].type = $.jstree.root;
-		};
-		this.bind = function () {
-			this.element
-				.on('model.jstree', function (e, data) {
-						var m = this._model.data,
-							dpc = data.nodes,
-							t = this.settings.types,
-							i, j, c = 'default', k;
-						for(i = 0, j = dpc.length; i < j; i++) {
-							c = 'default';
-							if(m[dpc[i]].original && m[dpc[i]].original.type && t[m[dpc[i]].original.type]) {
-								c = m[dpc[i]].original.type;
-							}
-							if(m[dpc[i]].data && m[dpc[i]].data.jstree && m[dpc[i]].data.jstree.type && t[m[dpc[i]].data.jstree.type]) {
-								c = m[dpc[i]].data.jstree.type;
-							}
-							m[dpc[i]].type = c;
-							if(m[dpc[i]].icon === true && t[c].icon !== undefined) {
-								m[dpc[i]].icon = t[c].icon;
-							}
-							if(t[c].li_attr !== undefined && typeof t[c].li_attr === 'object') {
-								for (k in t[c].li_attr) {
-									if (t[c].li_attr.hasOwnProperty(k)) {
-										if (k === 'id') {
-											continue;
-										}
-										else if (m[dpc[i]].li_attr[k] === undefined) {
-											m[dpc[i]].li_attr[k] = t[c].li_attr[k];
-										}
-										else if (k === 'class') {
-											m[dpc[i]].li_attr['class'] = t[c].li_attr['class'] + ' ' + m[dpc[i]].li_attr['class'];
-										}
-									}
-								}
-							}
-							if(t[c].a_attr !== undefined && typeof t[c].a_attr === 'object') {
-								for (k in t[c].a_attr) {
-									if (t[c].a_attr.hasOwnProperty(k)) {
-										if (k === 'id') {
-											continue;
-										}
-										else if (m[dpc[i]].a_attr[k] === undefined) {
-											m[dpc[i]].a_attr[k] = t[c].a_attr[k];
-										}
-										else if (k === 'href' && m[dpc[i]].a_attr[k] === '#') {
-											m[dpc[i]].a_attr['href'] = t[c].a_attr['href'];
-										}
-										else if (k === 'class') {
-											m[dpc[i]].a_attr['class'] = t[c].a_attr['class'] + ' ' + m[dpc[i]].a_attr['class'];
-										}
-									}
-								}
-							}
-						}
-						m[$.jstree.root].type = $.jstree.root;
-					}.bind(this));
-			parent.bind.call(this);
-		};
-		this.get_json = function (obj, options, flat) {
-			var i, j,
-				m = this._model.data,
-				opt = options ? $.extend(true, {}, options, {no_id:false}) : {},
-				tmp = parent.get_json.call(this, obj, opt, flat);
-			if(tmp === false) { return false; }
-			if($.vakata.is_array(tmp)) {
-				for(i = 0, j = tmp.length; i < j; i++) {
-					tmp[i].type = (tmp[i].id || tmp[i].id === 0) && m[tmp[i].id] && m[tmp[i].id].type ? m[tmp[i].id].type : "default";
-					if(options && options.no_id) {
-						delete tmp[i].id;
-						if(tmp[i].li_attr && tmp[i].li_attr.id) {
-							delete tmp[i].li_attr.id;
-						}
-						if(tmp[i].a_attr && tmp[i].a_attr.id) {
-							delete tmp[i].a_attr.id;
-						}
-					}
-				}
-			}
-			else {
-				tmp.type = (tmp.id || tmp.id === 0) && m[tmp.id] && m[tmp.id].type ? m[tmp.id].type : "default";
-				if(options && options.no_id) {
-					tmp = this._delete_ids(tmp);
-				}
-			}
-			return tmp;
-		};
-		this._delete_ids = function (tmp) {
-			if($.vakata.is_array(tmp)) {
-				for(var i = 0, j = tmp.length; i < j; i++) {
-					tmp[i] = this._delete_ids(tmp[i]);
-				}
-				return tmp;
-			}
-			delete tmp.id;
-			if(tmp.li_attr && tmp.li_attr.id) {
-				delete tmp.li_attr.id;
-			}
-			if(tmp.a_attr && tmp.a_attr.id) {
-				delete tmp.a_attr.id;
-			}
-			if(tmp.children && $.vakata.is_array(tmp.children)) {
-				tmp.children = this._delete_ids(tmp.children);
-			}
-			return tmp;
-		};
-		this.check = function (chk, obj, par, pos, more) {
-			if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; }
-			obj = obj && (obj.id || obj.id === 0) ? obj : this.get_node(obj);
-			par = par && (par.id || par.id === 0) ? par : this.get_node(par);
-			var m = obj && (obj.id || obj.id === 0) ? (more && more.origin ? more.origin : $.jstree.reference(obj.id)) : null, tmp, d, i, j;
-			m = m && m._model && m._model.data ? m._model.data : null;
-			switch(chk) {
-				case "create_node":
-				case "move_node":
-				case "copy_node":
-					if(chk !== 'move_node' || $.inArray(obj.id, par.children) === -1) {
-						tmp = this.get_rules(par);
-						if(tmp.max_children !== undefined && tmp.max_children !== -1 && tmp.max_children === par.children.length) {
-							this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_01', 'reason' : 'max_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-							return false;
-						}
-						if(tmp.valid_children !== undefined && tmp.valid_children !== -1 && $.inArray((obj.type || 'default'), tmp.valid_children) === -1) {
-							this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_02', 'reason' : 'valid_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-							return false;
-						}
-						if(m && obj.children_d && obj.parents) {
-							d = 0;
-							for(i = 0, j = obj.children_d.length; i < j; i++) {
-								d = Math.max(d, m[obj.children_d[i]].parents.length);
-							}
-							d = d - obj.parents.length + 1;
-						}
-						if(d <= 0 || d === undefined) { d = 1; }
-						do {
-							if(tmp.max_depth !== undefined && tmp.max_depth !== -1 && tmp.max_depth < d) {
-								this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_03', 'reason' : 'max_depth prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-								return false;
-							}
-							par = this.get_node(par.parent);
-							tmp = this.get_rules(par);
-							d++;
-						} while(par);
-					}
-					break;
-			}
-			return true;
-		};
-		/**
-		 * used to retrieve the type settings object for a node
-		 * @name get_rules(obj)
-		 * @param {mixed} obj the node to find the rules for
-		 * @return {Object}
-		 * @plugin types
-		 */
-		this.get_rules = function (obj) {
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			var tmp = this.get_type(obj, true);
-			if(tmp.max_depth === undefined) { tmp.max_depth = -1; }
-			if(tmp.max_children === undefined) { tmp.max_children = -1; }
-			if(tmp.valid_children === undefined) { tmp.valid_children = -1; }
-			return tmp;
-		};
-		/**
-		 * used to retrieve the type string or settings object for a node
-		 * @name get_type(obj [, rules])
-		 * @param {mixed} obj the node to find the rules for
-		 * @param {Boolean} rules if set to `true` instead of a string the settings object will be returned
-		 * @return {String|Object}
-		 * @plugin types
-		 */
-		this.get_type = function (obj, rules) {
-			obj = this.get_node(obj);
-			return (!obj) ? false : ( rules ? $.extend({ 'type' : obj.type }, this.settings.types[obj.type]) : obj.type);
-		};
-		/**
-		 * used to change a node's type
-		 * @name set_type(obj, type)
-		 * @param {mixed} obj the node to change
-		 * @param {String} type the new type
-		 * @plugin types
-		 */
-		this.set_type = function (obj, type) {
-			var m = this._model.data, t, t1, t2, old_type, old_icon, k, d, a;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.set_type(obj[t1], type);
-				}
-				return true;
-			}
-			t = this.settings.types;
-			obj = this.get_node(obj);
-			if(!t[type] || !obj) { return false; }
-			d = this.get_node(obj, true);
-			if (d && d.length) {
-				a = d.children('.jstree-anchor');
-			}
-			old_type = obj.type;
-			old_icon = this.get_icon(obj);
-			obj.type = type;
-			if(old_icon === true || !t[old_type] || (t[old_type].icon !== undefined && old_icon === t[old_type].icon)) {
-				this.set_icon(obj, t[type].icon !== undefined ? t[type].icon : true);
-			}
-
-			// remove old type props
-			if(t[old_type] && t[old_type].li_attr !== undefined && typeof t[old_type].li_attr === 'object') {
-				for (k in t[old_type].li_attr) {
-					if (t[old_type].li_attr.hasOwnProperty(k)) {
-						if (k === 'id') {
-							continue;
-						}
-						else if (k === 'class') {
-							m[obj.id].li_attr['class'] = (m[obj.id].li_attr['class'] || '').replace(t[old_type].li_attr[k], '');
-							if (d) { d.removeClass(t[old_type].li_attr[k]); }
-						}
-						else if (m[obj.id].li_attr[k] === t[old_type].li_attr[k]) {
-							m[obj.id].li_attr[k] = null;
-							if (d) { d.removeAttr(k); }
-						}
-					}
-				}
-			}
-			if(t[old_type] && t[old_type].a_attr !== undefined && typeof t[old_type].a_attr === 'object') {
-				for (k in t[old_type].a_attr) {
-					if (t[old_type].a_attr.hasOwnProperty(k)) {
-						if (k === 'id') {
-							continue;
-						}
-						else if (k === 'class') {
-							m[obj.id].a_attr['class'] = (m[obj.id].a_attr['class'] || '').replace(t[old_type].a_attr[k], '');
-							if (a) { a.removeClass(t[old_type].a_attr[k]); }
-						}
-						else if (m[obj.id].a_attr[k] === t[old_type].a_attr[k]) {
-							if (k === 'href') {
-								m[obj.id].a_attr[k] = '#';
-								if (a) { a.attr('href', '#'); }
-							}
-							else {
-								delete m[obj.id].a_attr[k];
-								if (a) { a.removeAttr(k); }
-							}
-						}
-					}
-				}
-			}
-
-			// add new props
-			if(t[type].li_attr !== undefined && typeof t[type].li_attr === 'object') {
-				for (k in t[type].li_attr) {
-					if (t[type].li_attr.hasOwnProperty(k)) {
-						if (k === 'id') {
-							continue;
-						}
-						else if (m[obj.id].li_attr[k] === undefined) {
-							m[obj.id].li_attr[k] = t[type].li_attr[k];
-							if (d) {
-								if (k === 'class') {
-									d.addClass(t[type].li_attr[k]);
-								}
-								else {
-									d.attr(k, t[type].li_attr[k]);
-								}
-							}
-						}
-						else if (k === 'class') {
-							m[obj.id].li_attr['class'] = t[type].li_attr[k] + ' ' + m[obj.id].li_attr['class'];
-							if (d) { d.addClass(t[type].li_attr[k]); }
-						}
-					}
-				}
-			}
-			if(t[type].a_attr !== undefined && typeof t[type].a_attr === 'object') {
-				for (k in t[type].a_attr) {
-					if (t[type].a_attr.hasOwnProperty(k)) {
-						if (k === 'id') {
-							continue;
-						}
-						else if (m[obj.id].a_attr[k] === undefined) {
-							m[obj.id].a_attr[k] = t[type].a_attr[k];
-							if (a) {
-								if (k === 'class') {
-									a.addClass(t[type].a_attr[k]);
-								}
-								else {
-									a.attr(k, t[type].a_attr[k]);
-								}
-							}
-						}
-						else if (k === 'href' && m[obj.id].a_attr[k] === '#') {
-							m[obj.id].a_attr['href'] = t[type].a_attr['href'];
-							if (a) { a.attr('href', t[type].a_attr['href']); }
-						}
-						else if (k === 'class') {
-							m[obj.id].a_attr['class'] = t[type].a_attr['class'] + ' ' + m[obj.id].a_attr['class'];
-							if (a) { a.addClass(t[type].a_attr[k]); }
-						}
-					}
-				}
-			}
-
-			return true;
-		};
-	};
-	// include the types plugin by default
-	// $.jstree.defaults.plugins.push("types");
-}));
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.unique.js b/public/ext/vakata-jstree-3.3.17/src/jstree.unique.js
deleted file mode 100644
index 684c9d7705..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.unique.js
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- * ### Unique plugin
- *
- * Enforces that no nodes with the same name can coexist as siblings.
- */
-/*globals jQuery, define, exports, require */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.unique', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.unique) { return; }
-
-	/**
-	 * stores all defaults for the unique plugin
-	 * @name $.jstree.defaults.unique
-	 * @plugin unique
-	 */
-	$.jstree.defaults.unique = {
-		/**
-		 * Indicates if the comparison should be case sensitive. Default is `false`.
-		 * @name $.jstree.defaults.unique.case_sensitive
-		 * @plugin unique
-		 */
-		case_sensitive : false,
-		/**
-		 * Indicates if white space should be trimmed before the comparison. Default is `false`.
-		 * @name $.jstree.defaults.unique.trim_whitespace
-		 * @plugin unique
-		 */
-		trim_whitespace : false,
-		/**
-		 * A callback executed in the instance's scope when a new node is created with no name and a node with the default name already exists, the two arguments are the conflicting name and the counter. The default will produce results like `New node (2)`.
-		 * @name $.jstree.defaults.unique.duplicate
-		 * @plugin unique
-		 */
-		duplicate : function (name, counter) {
-			return name + ' (' + counter + ')';
-		}
-	};
-
-	$.jstree.plugins.unique = function (options, parent) {
-		this.check = function (chk, obj, par, pos, more) {
-			if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; }
-			obj = obj && (obj.id || obj.id === 0) ? obj : this.get_node(obj);
-			par = par && (par.id || par.id === 0) ? par : this.get_node(par);
-			if(!par || !par.children) { return true; }
-			var n = chk === "rename_node" ? pos : obj.text,
-				c = [],
-				s = this.settings.unique.case_sensitive,
-				w = this.settings.unique.trim_whitespace,
-				m = this._model.data, i, j, t;
-			for(i = 0, j = par.children.length; i < j; i++) {
-				t = m[par.children[i]].text;
-				if (!s) {
-					t = t.toLowerCase();
-				}
-				if (w) {
-					t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
-				}
-				c.push(t);
-			}
-			if(!s) { n = n.toLowerCase(); }
-			if (w) { n = n.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); }
-			switch(chk) {
-				case "delete_node":
-					return true;
-				case "rename_node":
-					t = obj.text || '';
-					if (!s) {
-						t = t.toLowerCase();
-					}
-					if (w) {
-						t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
-					}
-					i = ($.inArray(n, c) === -1 || (obj.text && t === n));
-					if(!i) {
-						this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_01', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-					}
-					return i;
-				case "create_node":
-					i = ($.inArray(n, c) === -1);
-					if(!i) {
-						this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_04', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-					}
-					return i;
-				case "copy_node":
-					i = ($.inArray(n, c) === -1);
-					if(!i) {
-						this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_02', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-					}
-					return i;
-				case "move_node":
-					i = ( (obj.parent === par.id && (!more || !more.is_multi)) || $.inArray(n, c) === -1);
-					if(!i) {
-						this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_03', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) };
-					}
-					return i;
-			}
-			return true;
-		};
-		this.create_node = function (par, node, pos, callback, is_loaded) {
-			if(!node || (typeof node === 'object' && node.text === undefined)) {
-				if(par === null) {
-					par = $.jstree.root;
-				}
-				par = this.get_node(par);
-				if(!par) {
-					return parent.create_node.call(this, par, node, pos, callback, is_loaded);
-				}
-				pos = pos === undefined ? "last" : pos;
-				if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
-					return parent.create_node.call(this, par, node, pos, callback, is_loaded);
-				}
-				if(!node) { node = {}; }
-				var tmp, n, dpc, i, j, m = this._model.data, s = this.settings.unique.case_sensitive, w = this.settings.unique.trim_whitespace, cb = this.settings.unique.duplicate, t;
-				n = tmp = this.get_string('New node');
-				dpc = [];
-				for(i = 0, j = par.children.length; i < j; i++) {
-					t = m[par.children[i]].text;
-					if (!s) {
-						t = t.toLowerCase();
-					}
-					if (w) {
-						t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
-					}
-					dpc.push(t);
-				}
-				i = 1;
-				t = n;
-				if (!s) {
-					t = t.toLowerCase();
-				}
-				if (w) {
-					t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
-				}
-				while($.inArray(t, dpc) !== -1) {
-					n = cb.call(this, tmp, (++i)).toString();
-					t = n;
-					if (!s) {
-						t = t.toLowerCase();
-					}
-					if (w) {
-						t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
-					}
-				}
-				node.text = n;
-			}
-			return parent.create_node.call(this, par, node, pos, callback, is_loaded);
-		};
-	};
-
-	// include the unique plugin by default
-	// $.jstree.defaults.plugins.push("unique");
-}));
diff --git a/public/ext/vakata-jstree-3.3.17/src/jstree.wholerow.js b/public/ext/vakata-jstree-3.3.17/src/jstree.wholerow.js
deleted file mode 100644
index bb6b0560fc..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/jstree.wholerow.js
+++ /dev/null
@@ -1,122 +0,0 @@
-/**
- * ### Wholerow plugin
- *
- * Makes each node appear block level. Making selection easier. May cause slow down for large trees in old browsers.
- */
-/*globals jQuery, define, exports, require */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.wholerow', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.wholerow) { return; }
-
-	var div = document.createElement('DIV');
-	div.setAttribute('unselectable','on');
-	div.setAttribute('role','presentation');
-	div.className = 'jstree-wholerow';
-	div.innerHTML = '&#160;';
-	$.jstree.plugins.wholerow = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-
-			this.element
-				.on('ready.jstree set_state.jstree', function () {
-						this.hide_dots();
-					}.bind(this))
-				.on("init.jstree loading.jstree ready.jstree", function () {
-						//div.style.height = this._data.core.li_height + 'px';
-						this.get_container_ul().addClass('jstree-wholerow-ul');
-					}.bind(this))
-				.on("deselect_all.jstree", function (e, data) {
-						this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked');
-					}.bind(this))
-				.on("changed.jstree", function (e, data) {
-						this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked');
-						var tmp = false, i, j;
-						for(i = 0, j = data.selected.length; i < j; i++) {
-							tmp = this.get_node(data.selected[i], true);
-							if(tmp && tmp.length) {
-								tmp.children('.jstree-wholerow').addClass('jstree-wholerow-clicked');
-							}
-						}
-					}.bind(this))
-				.on("open_node.jstree", function (e, data) {
-						this.get_node(data.node, true).find('.jstree-clicked').parent().children('.jstree-wholerow').addClass('jstree-wholerow-clicked');
-					}.bind(this))
-				.on("hover_node.jstree dehover_node.jstree", function (e, data) {
-						if(e.type === "hover_node" && this.is_disabled(data.node)) { return; }
-						this.get_node(data.node, true).children('.jstree-wholerow')[e.type === "hover_node"?"addClass":"removeClass"]('jstree-wholerow-hovered');
-					}.bind(this))
-				.on("contextmenu.jstree", ".jstree-wholerow", function (e) {
-						if (this._data.contextmenu) {
-							e.preventDefault();
-							var tmp = $.Event('contextmenu', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey, pageX : e.pageX, pageY : e.pageY });
-							$(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp);
-						}
-					}.bind(this))
-				/*!
-				.on("mousedown.jstree touchstart.jstree", ".jstree-wholerow", function (e) {
-						if(e.target === e.currentTarget) {
-							var a = $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor");
-							e.target = a[0];
-							a.trigger(e);
-						}
-					})
-				*/
-				.on("click.jstree", ".jstree-wholerow", function (e) {
-						e.stopImmediatePropagation();
-						var tmp = $.Event('click', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey });
-						$(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).trigger('focus');
-					})
-				.on("dblclick.jstree", ".jstree-wholerow", function (e) {
-						e.stopImmediatePropagation();
-						var tmp = $.Event('dblclick', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey });
-						$(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).trigger('focus');
-					})
-				.on("click.jstree", ".jstree-leaf > .jstree-ocl", function (e) {
-						e.stopImmediatePropagation();
-						var tmp = $.Event('click', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey });
-						$(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).trigger('focus');
-					}.bind(this))
-				.on("mouseover.jstree", ".jstree-wholerow, .jstree-icon", function (e) {
-						e.stopImmediatePropagation();
-						if(!this.is_disabled(e.currentTarget)) {
-							this.hover_node(e.currentTarget);
-						}
-						return false;
-					}.bind(this))
-				.on("mouseleave.jstree", ".jstree-node", function (e) {
-						this.dehover_node(e.currentTarget);
-					}.bind(this));
-		};
-		this.teardown = function () {
-			if(this.settings.wholerow) {
-				this.element.find(".jstree-wholerow").remove();
-			}
-			parent.teardown.call(this);
-		};
-		this.redraw_node = function(obj, deep, callback, force_render) {
-			obj = parent.redraw_node.apply(this, arguments);
-			if(obj) {
-				var tmp = div.cloneNode(true);
-				//tmp.style.height = this._data.core.li_height + 'px';
-				if($.inArray(obj.id, this._data.core.selected) !== -1) { tmp.className += ' jstree-wholerow-clicked'; }
-				if(this._data.core.focused && this._data.core.focused === obj.id) { tmp.className += ' jstree-wholerow-hovered'; }
-				obj.insertBefore(tmp, obj.childNodes[0]);
-			}
-			return obj;
-		};
-	};
-	// include the wholerow plugin by default
-	// $.jstree.defaults.plugins.push("wholerow");
-}));
diff --git a/public/ext/vakata-jstree-3.3.17/src/misc.js b/public/ext/vakata-jstree-3.3.17/src/misc.js
deleted file mode 100644
index ce1622d4ce..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/misc.js
+++ /dev/null
@@ -1,766 +0,0 @@
-/* global jQuery */
-
-// disable all events
-(function ($, undefined) {
-	"use strict";
-	$.jstree.plugins.trigger = function (options, parent) {
-		this.init = function (el, options) {
-			// do not forget parent
-			parent.init.call(this, el, options);
-			this._data.trigger.disabled = false;
-		};
-		this.trigger = function (ev, data) {
-			if(!this._data.trigger.disabled) {
-				parent.trigger.call(this, ev, data);
-			}
-		};
-		this.disable_events = function () { this._data.trigger.disabled = true; };
-		this.enable_events = function () { this._data.trigger.disabled = false; };
-	};
-})(jQuery);
-
-// mapping
-(function ($, undefined) {
-	"use strict";
-	// use this if you need any options
-	$.jstree.defaults.mapper = {
-		option_key : "option_value"
-	};
-	$.jstree.plugins.mapper = function () {
-		this._parse_model_from_json = function (d, p, ps) {
-			// d is the node from the server, it will be called recursively for children,
-			// so you do not need to process at once
-			/* // for example
-			for(var i in d) {
-				if(d.hasOwnProperty(i)) {
-					d[i.toLowerCase()] = d[i];
-				}
-			}
-			*/
-			return parent._parse_model_from_json.call(this, d, p, ps);
-		};
-	};
-})(jQuery);
-
-// no hover
-(function ($, undefined) {
-	"use strict";
-	$.jstree.plugins.nohover = function () {
-		this.hover_node = $.noop;
-	};
-})(jQuery);
-
-// force multiple select
-(function ($, undefined) {
-	"use strict";
-	$.jstree.defaults.multiselect = {};
-	$.jstree.plugins.multiselect = function (options, parent) {
-		this.activate_node = function (obj, e) {
-			e.ctrlKey = true;
-			parent.activate_node.call(this, obj, e);
-		};
-	};
-})(jQuery);
-
-// real checkboxes
-(function ($, undefined) {
-	"use strict";
-
-	var inp = document.createElement("INPUT");
-	inp.type = "checkbox";
-	inp.className = "jstree-checkbox jstree-realcheckbox";
-
-	$.jstree.defaults.realcheckboxes = {};
-
-	$.jstree.plugins.realcheckboxes = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-			this._data.realcheckboxes.uto = false;
-			this.element
-				.on('changed.jstree uncheck_node.jstree check_node.jstree uncheck_all.jstree check_all.jstree move_node.jstree copy_node.jstree redraw.jstree open_node.jstree ready.jstree loaded.jstree', function () {
-						// only if undetermined is in setting
-						if(this._data.realcheckboxes.uto) { clearTimeout(this._data.realcheckboxes.uto); }
-						this._data.realcheckboxes.uto = setTimeout(this._realcheckboxes.bind(this), 50);
-					}.bind(this));
-		};
-		this.redraw_node = function(obj, deep, callback, force_draw) {
-			obj = parent.redraw_node.call(this, obj, deep, callback, force_draw);
-			if(obj) {
-				var i, j, tmp = null, chk = inp.cloneNode(true);
-				for(i = 0, j = obj.childNodes.length; i < j; i++) {
-					if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
-						tmp = obj.childNodes[i];
-						break;
-					}
-				}
-				if(tmp) {
-					for(i = 0, j = tmp.childNodes.length; i < j; i++) {
-						if(tmp.childNodes[i] && tmp.childNodes[i].className && tmp.childNodes[i].className.indexOf("jstree-checkbox") !== -1) {
-							tmp = tmp.childNodes[i];
-							break;
-						}
-					}
-				}
-				if(tmp && tmp.tagName === "I") {
-					tmp.style.backgroundColor = "transparent";
-					tmp.style.backgroundImage = "none";
-					tmp.appendChild(chk);
-				}
-			}
-			return obj;
-		};
-		this._realcheckboxes = function () {
-			var ts = this.settings.checkbox.tie_selection;
-			console.log(ts);
-			$('.jstree-realcheckbox').each(function () {
-				this.checked = (!ts && this.parentNode.parentNode.className.indexOf("jstree-checked") !== -1) || (ts && this.parentNode.parentNode.className.indexOf('jstree-clicked') !== -1);
-				this.indeterminate = this.parentNode.className.indexOf("jstree-undetermined") !== -1;
-				this.disabled = this.parentNode.parentNode.className.indexOf("disabled") !== -1;
-			});
-		};
-	};
-})(jQuery);
-
-// no state
-(function ($, undefined) {
-	"use strict";
-	$.jstree.plugins.nostate = function () {
-		this.set_state = function (state, callback) {
-			if(callback) { callback.call(this); }
-			this.trigger('set_state');
-		};
-	};
-})(jQuery);
-
-// no selected in state
-(function ($, undefined) {
-	"use strict";
-	$.jstree.plugins.noselectedstate = function (options, parent) {
-		this.get_state = function () {
-			var state = parent.get_state.call(this);
-			delete state.core.selected;
-			return state;
-		};
-	};
-})(jQuery);
-
-// additional icon on node (outside of anchor)
-(function ($, undefined) {
-	"use strict";
-	var img = document.createElement('IMG');
-	//img.src = "http://www.dpcd.vic.gov.au/__data/assets/image/0004/30667/help.gif";
-	img.className = "jstree-questionmark";
-
-	$.jstree.defaults.questionmark = $.noop;
-	$.jstree.plugins.questionmark = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-			this.element
-				.on("click.jstree", ".jstree-questionmark", function (e) {
-						e.stopImmediatePropagation();
-						this.settings.questionmark.call(this, this.get_node(e.target));
-					}.bind(this));
-		};
-		this.teardown = function () {
-			if(this.settings.questionmark) {
-				this.element.find(".jstree-questionmark").remove();
-			}
-			parent.teardown.call(this);
-		};
-		this.redraw_node = function(obj, deep, callback, force_draw) {
-			obj = parent.redraw_node.call(this, obj, deep, callback, force_draw);
-			if(obj) {
-				var tmp = img.cloneNode(true);
-				obj.insertBefore(tmp, obj.childNodes[2]);
-			}
-			return obj;
-		};
-	};
-})(jQuery);
-
-// auto numbering
-(function ($, undefined) {
-	"use strict";
-	var span = document.createElement('SPAN');
-	span.className = "jstree-numbering";
-
-	$.jstree.defaults.numbering = {};
-	$.jstree.plugins.numbering = function (options, parent) {
-		this.teardown = function () {
-			if(this.settings.questionmark) {
-				this.element.find(".jstree-numbering").remove();
-			}
-			parent.teardown.call(this);
-		};
-		this.get_number = function (obj) {
-			obj = this.get_node(obj);
-			var ind = $.inArray(obj.id, this.get_node(obj.parent).children) + 1;
-			return obj.parent === '#' ? ind : this.get_number(obj.parent) + '.' + ind;
-		};
-		this.redraw_node = function(obj, deep, callback, force_draw) {
-			var i, j, tmp = null, elm = null, org = this.get_number(obj);
-			obj = parent.redraw_node.call(this, obj, deep, callback, force_draw);
-			if(obj) {
-				for(i = 0, j = obj.childNodes.length; i < j; i++) {
-					if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
-						tmp = obj.childNodes[i];
-						break;
-					}
-				}
-				if(tmp) {
-					elm = span.cloneNode(true);
-					elm.innerHTML = org + '. ';
-					tmp.insertBefore(elm, tmp.childNodes[tmp.childNodes.length - 1]);
-				}
-			}
-			return obj;
-		};
-	};
-})(jQuery);
-
-// additional icon on node (inside anchor)
-(function ($, undefined) {
-	"use strict";
-	var _s = document.createElement('SPAN');
-	_s.className = 'fa-stack jstree-stackedicon';
-	var _i = document.createElement('I');
-	_i.className = 'jstree-icon';
-	_i.setAttribute('role', 'presentation');
-
-	$.jstree.plugins.stackedicon = function (options, parent) {
-		this.teardown = function () {
-			this.element.find(".jstree-stackedicon").remove();
-			parent.teardown.call(this);
-		};
-		this.redraw_node = function(obj, deep, is_callback, force_render) {
-			obj = parent.redraw_node.apply(this, arguments);
-			if(obj) {
-				var i, j, tmp = null, icon = null, temp = null;
-				for(i = 0, j = obj.childNodes.length; i < j; i++) {
-					if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
-						tmp = obj.childNodes[i];
-						break;
-					}
-				}
-				if(tmp) {
-					if(this._model.data[obj.id].state.icons && this._model.data[obj.id].state.icons.length) {
-						icon = _s.cloneNode(false);
-						for(i = 0, j = this._model.data[obj.id].state.icons.length; i < j; i++) {
-							temp = _i.cloneNode(false);
-							temp.className += ' ' + this._model.data[obj.id].state.icons[i];
-							icon.appendChild(temp);
-						}
-						tmp.insertBefore(icon, tmp.childNodes[0]);
-					}
-				}
-			}
-			return obj;
-		};
-	};
-})(jQuery);
-
-// selecting a node opens it
-(function ($, undefined) {
-	"use strict";
-	$.jstree.plugins.selectopens = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-			this.element.on('select_node.jstree', function (e, data) { data.instance.open_node(data.node); });
-		};
-	};
-})(jQuery);
-
-// object as data
-(function ($, undefined) {
-	"use strict";
-	$.jstree.defaults.datamodel = {};
-	$.jstree.plugins.datamodel = function (options, parent) {
-		this.init = function (el, options) {
-			this._data.datamodel = {};
-			parent.init.call(this, el, options);
-		};
-		this._datamodel = function (id, nodes, callback) {
-			var i = 0, j = nodes.length, tmp = [], obj = null;
-			for(; i < j; i++) {
-				this._data.datamodel[nodes[i].getID()] = nodes[i];
-				obj = {
-					id : nodes[i].getID(),
-					text : nodes[i].getText(),
-					children : nodes[i].hasChildren()
-				};
-				if(nodes[i].getExtra) {
-					obj = nodes[i].getExtra(obj); // icon, type
-				}
-				tmp.push(obj);
-			}
-			return this._append_json_data(id, tmp, function (status) {
-				callback.call(this, status);
-			}.bind(this));
-		};
-		this._load_node = function (obj, callback) {
-			var id = obj.id;
-			var nd = obj.id === "#" ? this.settings.core.data : this._data.datamodel[obj.id].getChildren(function (nodes) {
-				this._datamodel(id, nodes, callback);
-			}.bind(this));
-			if($.vakata.is_array(nd)) {
-				this._datamodel(id, nd, callback);
-			}
-		};
-	};
-})(jQuery);
-/*
-	demo of the above
-	function treeNode(val) {
-		var id = ++treeNode.counter;
-		this.getID = function () {
-			return id;
-		};
-		this.getText = function () {
-			return val.toString();
-		};
-		this.getExtra = function (obj) {
-			obj.icon = false;
-			return obj;
-		};
-		this.hasChildren = function () {
-			return true;
-		};
-		this.getChildren = function () {
-			return [
-				new treeNode(Math.pow(val, 2)),
-				new treeNode(Math.sqrt(val)),
-			];
-		};
-	}
-	treeNode.counter = 0;
-
-	$('#jstree').jstree({
-		'core': {
-			'data': [
-						new treeNode(2),
-						new treeNode(3),
-						new treeNode(4),
-						new treeNode(5)
-					]
-		},
-		plugins : ['datamodel']
-	});
-*/
-
-// untested sample plugin to keep all nodes in the DOM
-(function ($, undefined) {
-	"use strict";
-	$.jstree.plugins.dom = function (options, parent) {
-		this.redraw_node = function (node, deep, is_callback, force_render) {
-			return parent.redraw_node.call(this, node, deep, is_callback, true);
-		};
-		this.close_node = function (obj, animation) {
-			var t1, t2, t, d;
-			if($.vakata.is_array(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.close_node(obj[t1], animation);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === $.jstree.root) {
-				return false;
-			}
-			if(this.is_closed(obj)) {
-				return false;
-			}
-			animation = animation === undefined ? this.settings.core.animation : animation;
-			t = this;
-			d = this.get_node(obj, true);
-			if(d.length) {
-				if(!animation) {
-					d[0].className = d[0].className.replace('jstree-open', 'jstree-closed');
-					d.attr("aria-expanded", false);
-				}
-				else {
-					d
-						.children(".jstree-children").attr("style","display:block !important").end()
-						.removeClass("jstree-open").addClass("jstree-closed").attr("aria-expanded", false)
-						.children(".jstree-children").stop(true, true).slideUp(animation, function () {
-							this.style.display = "";
-							t.trigger("after_close", { "node" : obj });
-						});
-				}
-			}
-			obj.state.opened = false;
-			this.trigger('close_node',{ "node" : obj });
-			if(!animation || !d.length) {
-				this.trigger("after_close", { "node" : obj });
-			}
-		};
-	};
-})(jQuery);
-
-// customize plugin by @Lusito
-// https://github.com/Lusito/jstree/blob/node-customize/src/jstree-node-customize.js
-/**
- * ### Node Customize plugin
- *
- * Allows to customize nodes when they are drawn.
- */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.node_customize', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.node_customize) { return; }
-
-	/**
-	 * the settings object.
-	 * key is the attribute name to select the customizer function from switch.
-	 * switch is a key => function(el, node) map.
-	 * default: function(el, node) will be called if the type could not be mapped
-	 * @name $.jstree.defaults.node_customize
-	 * @plugin node_customize
-	 */
-	$.jstree.defaults.node_customize = {
-		"key": "type",
-		"switch": {},
-		"default": null
-	};
-
-	$.jstree.plugins.node_customize = function (options, parent) {
-		this.redraw_node = function (obj, deep, callback, force_draw) {
-			var el = parent.redraw_node.apply(this, arguments);
-			if (el) {
-				var node = this.get_node(obj);
-				var cfg = this.settings.node_customize;
-				var key = cfg.key;
-				var type =  (node && node.original && node.original[key]);
-				var customizer = (type && cfg.switch[type]) || cfg.default;
-				if(customizer)
-					customizer(el, node);
-			}
-			return el;
-		};
-	}
-}));
-
-
-// parentsload plugin by @ashl1
-/**
- * ### Parentsload plugin
- *
- * Change load_node() functionality in jsTree, to possible load not yes downloaded node with all it parent in a single request (only useful with lazy loading).
- *
- * version 1.0.0 (Alexey Shildyakov - ashl1future@gmail.com)
- * 2015: Compatible with jsTree-3.2.1
- */
-/*globals jQuery, define, exports, require, document */
-(function (factory) {
-        "use strict";
-        if (typeof define === 'function' && define.amd) {
-                define('jstree.parentsload', ['jquery','./jstree.js'], factory);
-        }
-        else if(typeof exports === 'object') {
-                factory(require('jquery'), require('./jstree.js'));
-        }
-        else {
-                factory(jQuery, jQuery.jstree);
-        }
-}(function ($, jstree, undefined) {
-        "use strict";
-
-        if($.jstree.plugins.parentsload) { return; }
-
-        /**
-         * parentsload configuration
-         *
-         * The configuration syntax is almost the same as for core.data option. You must set parenstload.data the following:
-         *
-         * parentsload: {
-         *      data: function(){} // this function overwrites core data.data options
-         * }
-         *
-         * OR
-         *
-         * parentsload: {
-         *      data: {
-         *              url: function(node){} OR string,
-         *              data: function(node){} OR associative array as json{data} jQuery parameter
-         *      }
-         * }
-         *
-         * In last case at least on of 'url' or 'data' must be presented.
-         *
-         * At first, the plugin load_node() detects if the node already downloaded. If is - uses the core.data settings, if not - uses parentsload.data settings
-         * to fetch in one query the specified node and all its parent. The data must be in the first mentioned JSON format with set nested children[].
-         * Each node level should consist of all nodes on the level to properly work with the tree in the future. Otherwise, you must manually call load_node
-         * on every parent node to fetch all children nodes on that level.
-         *
-         * @name $.jstree.defaults.parentsload
-         * @plugin parentsload
-         */
-        $.jstree.defaults.parentsload = null;
-        $.jstree.plugins.parentsload = function (options, parent) {
-                this.init = function (el, options) {
-                        parent.init.call(this, el, options);
-                        this.patch_data()
-                };
-                this.patch_data = function(){
-                        var parentsloadSettings = this.settings.parentsload;
-                        var jsTreeDataSettings = this.settings.core.data;
-                        var self = this;
-
-                        var callError = function(number, message) {
-                                self._data.core.last_error = { 'error' : 'configuration', 'plugin' : 'parentsload', 'id' : 'parentsload_' + number, 'reason' : message, 'data' : JSON.stringify({config: parentsloadSettings}) };
-                                self.settings.core.error.call(self, self._data.core.last_error);
-                        }
-
-                        if(!parentsloadSettings) {
-                                callError('01', 'The configuration must be presented')
-                                return
-                        }
-                        parentsloadSettings = parentsloadSettings.data;
-
-                        var patchSettingsProperty = function (propertyName) {
-                                var property = parentsloadSettings[propertyName],
-                                    coreProperty = jsTreeDataSettings[propertyName];
-                                if (property) {
-                                        jsTreeDataSettings[propertyName] = function(node) {
-                                                if (this.get_node(node).parentsload_required) {
-                                                        if ($.vakata.is_function(property)) {
-                                                                return property.call(this, node)
-                                                        } else {// (typeof property === 'string')
-                                                                return property
-                                                        }
-                                                } else {
-                                                        if ($.vakata.is_function(coreProperty)) {
-                                                                return coreProperty.call(this, node)
-                                                        } else { // (typeof coreProperty === 'string')
-                                                                return coreProperty
-                                                        }
-                                                }
-                                        }
-                                } /* else {
-                                        use jstree the same data[propertyName] settings
-                                }*/
-                        }
-
-                        if($.vakata.is_function(parentsloadSettings)) {
-                                this.settings.data = parentsloadSettings
-                        } else if (typeof parentsloadSettings === 'object') {
-                                if (! (parentsloadSettings.url || parentsloadSettings.data)) {
-                                        callError('02', 'The "data.url" or "data.data" must be presented in configuration')
-                                        return
-                                }
-                                patchSettingsProperty('url')
-                                patchSettingsProperty('data')
-
-                        } else {
-                                callError('03', 'The appropriate "data.url" or "data.data" must be presented in configuration')
-                        }
-                }
-
-                this.load_node = function (obj, callback) {
-                        if($.vakata.is_array(obj)) {
-                                // FIXME: _load_nodes will not load nodes not presented in the tree
-                                this._load_nodes(obj.slice(), callback);
-                                return true;
-                        }
-                        var foundObj = this.get_node(obj);
-                        if (foundObj) {
-                                return parent.load_node.apply(this, arguments)
-                        } else {
-                                // node hasn't been loaded
-                                var id = (obj.id || obj.id === 0) ? obj.id : obj;
-                                this._model.data[id] = {
-                                        id : id,
-                                        parent : '#',
-                                        parents : [],
-                                        children : [],
-                                        children_d : [],
-                                        state : { loaded : false },
-                                        li_attr : {},
-                                        a_attr : {},
-                                        parentsload_required : true,
-                                };
-                                return parent.load_node.call(this, obj, function(obj, status){
-                                        obj.parentsload_required = !status
-                                        callback.call(this, obj, status)
-                                })
-                        }
-                }
-        };
-}));
-
-// conditional deselect
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.conditionaldeselect', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.conditionaldeselect) { return; }
-	$.jstree.defaults.conditionaldeselect = function () { return true; };
-	$.jstree.plugins.conditionaldeselect = function (options, parent) {
-		// own function
-		this.deselect_node = function (obj, supress_event, e) {
-			if(this.settings.conditionaldeselect.call(this, this.get_node(obj), e)) {
-				return parent.deselect_node.call(this, obj, supress_event, e);
-			}
-		};
-	};
-
-}));
-
-// conditional close
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.conditionalclose', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery, jQuery.jstree);
-	}
-}(function ($, jstree, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.conditionalclose) { return; }
-	$.jstree.defaults.conditionalclose = function () { return true; };
-	$.jstree.plugins.conditionalclose = function (options, parent) {
-		// own function
-		this.close_node = function (obj, animation) {
-			if(this.settings.conditionalclose.close.call(this, this.get_node(obj), e)) {
-				return parent.deselect_node.call(this, obj, animation);
-			}
-		};
-	};
-
-}));
-
-// separate items and badges plugin by vdkkia (vahidkiani88@gmail.com)
-// https://github.com/vdkkia/jstree
-//
-//CSS:
-//.separator{border-bottom:1px solid;border-image-source:linear-gradient(45deg,rgba(0,0,0,0),rgba(0,0,0,.1),rgba(0,0,0,0));border-image-slice:1;width:100%;left:0;color:#aaa;font-size:10px;font-weight:400;float:right;text-align:right;padding-right:20px;position:absolute;z-index:-1}.treeaction{color:#555;margin-left:3px;padding:2px;font-weight:700;font-size:10px;border:none;background-color:#fff;transition:all .2s ease-in-out;text-decoration:none;float:right;margin-right:2px;top:4px}.treeaction:hover{color:green;text-decoration:none;transform:scale(1.5)}
-(function (factory) {
-}(function ($, jstree, undefined) {
-	"use strict";
-	$.jstree.plugins.node_customize = function (options, parent) {
-		this.redraw_node = function (obj, deep, callback, force_draw) {
-			var el = parent.redraw_node.apply(this, arguments);
-			if (el) {
-				var node = this.get_node(obj);
-				var cfg = this.settings.node_customize;
-				var key = cfg.key;
-				var type =  (node && node.original && node.original[key]);
-				var customizer = (type && cfg.switch[type]) || cfg.default;
-				if(customizer)
-					customizer(el, node);
-			}
-			return el;
-		};
-	}
-}));
-
-// Use material icons
-// Plugin by KSD-France (https://github.com/KSD-France/, dev@ksd.fr)
-(function ($, undefined) {
-	"use strict";
-
-	$.jstree.plugins.material = function (options, parent) {
-		this.teardown = function () {
-			this.element.find(".material-icons").remove();
-			parent.teardown.call(this);
-		};
-
-		this.redraw_node = function (obj, deep, is_callback, force_render) {
-			obj = parent.redraw_node.apply(this, arguments);
-
-			if (obj) {
-				var i,
-				    j,
-				    tmp = null,
-				    icon = null,
-				    temp = null;
-				    
-				for(i = 0, j = obj.childNodes.length; i < j; i++) {
-					if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
-						tmp = obj.childNodes[i];
-						break;
-					}
-				}
-
-				if (tmp) {
-					if (this._model.data[obj.id].icon && this._model.data[obj.id].icon.length) {
-						tmp.childNodes[0].className += " material-icons";
-						tmp.childNodes[0].innerHTML = this._model.data[obj.id].icon;
-					}
-				}
-			}
-
-			return obj;
-		}
-	}
-})(jQuery);
-
-// overwrite select_all
-(function ($, undefined) {
-	"use strict";
-
-	if($.jstree.plugins.select_all) { return; }
-	$.jstree.defaults.select_all = {
-		hidden : true,
-		disabled : true
-	};
-
-	$.jstree.plugins.select_all = function (options, parent) {
-		this._select_all = function (id) {
-			var obj = this.get_node(id), i, j, c, s = this.settings.select_all;
-			if (!obj || !obj.children || !obj.children.length) {
-				return;
-			}
-			for (i = 0, j = obj.children.length; i < j; i++) {
-				c = this.get_node(obj.children[i]);
-				if (c && !c.state.selected && (s.disabled || !c.state.disabled) && (s.hidden || !c.state.hidden)) {
-					this._data.core.selected.push(c.id);
-					if (c.children && c.children.length) {
-						this._select_all(c.id);
-					}
-				}
-			}
-		};
-		this.select_all = function (supress_event) {
-			var tmp = this._data.core.selected.concat([]), i, j;
-			this._select_all('#');
-			this.redraw(true);
-			/**
-			 * triggered when all nodes are selected
-			 * @event
-			 * @name select_all.jstree
-			 * @param {Array} selected the current selection
-			 */
-			this.trigger('select_all', { 'selected' : this._data.core.selected });
-			if(!supress_event) {
-				this.trigger('changed', { 'action' : 'select_all', 'selected' : this._data.core.selected, 'old_selection' : tmp });
-			}
-		};
-	}
-})(jQuery);
diff --git a/public/ext/vakata-jstree-3.3.17/src/outro.js b/public/ext/vakata-jstree-3.3.17/src/outro.js
deleted file mode 100644
index 57d3e4820a..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/outro.js
+++ /dev/null
@@ -1 +0,0 @@
-}));
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/src/sample.js b/public/ext/vakata-jstree-3.3.17/src/sample.js
deleted file mode 100644
index 340891a01c..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/sample.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/*global jQuery */
-// wrap in IIFE and pass jQuery as $
-(function ($, undefined) {
-	"use strict";
-
-	// some private plugin stuff if needed
-	var private_var = null;
-
-	// extending the defaults
-	$.jstree.defaults.sample = {
-		sample_option : 'sample_val'
-	};
-
-	// the actual plugin code
-	$.jstree.plugins.sample = function (options, parent) {
-		// own function
-		this.sample_function = function (arg) {
-			// you can chain this method if needed and available
-			if(parent.sample_function) { parent.sample_function.call(this, arg); }
-		};
-
-		// *SPECIAL* FUNCTIONS
-		this.init = function (el, options) {
-			// do not forget parent
-			parent.init.call(this, el, options);
-		};
-		// bind events if needed
-		this.bind = function () {
-			// call parent function first
-			parent.bind.call(this);
-			// do(stuff);
-		};
-		// unbind events if needed (all in jquery namespace are taken care of by the core)
-		this.unbind = function () {
-			// do(stuff);
-			// call parent function last
-			parent.unbind.call(this);
-		};
-		this.teardown = function () {
-			// do not forget parent
-			parent.teardown.call(this);
-		};
-		// state management - get and restore
-		this.get_state = function () {
-			// always get state from parent first
-			var state = parent.get_state.call(this);
-			// add own stuff to state
-			state.sample = { 'var' : 'val' };
-			return state;
-		};
-		this.set_state = function (state, callback) {
-			// only process your part if parent returns true
-			// there will be multiple times with false
-			if(parent.set_state.call(this, state, callback)) {
-				// check the key you set above
-				if(state.sample) {
-					// do(stuff); // like calling this.sample_function(state.sample.var);
-					// remove your part of the state, call again and RETURN FALSE, the next cycle will be TRUE
-					delete state.sample;
-					this.set_state(state, callback);
-					return false;
-				}
-				// return true if your state is gone (cleared in the previous step)
-				return true;
-			}
-			// parent was false - return false too
-			return false;
-		};
-		// node transportation
-		this.get_json = function (obj, options, flat) {
-			// get the node from the parent
-			var tmp = parent.get_json.call(this, obj, options, flat), i, j;
-			if($.vakata.is_array(tmp)) {
-				for(i = 0, j = tmp.length; i < j; i++) {
-					tmp[i].sample = 'value';
-				}
-			}
-			else {
-				tmp.sample = 'value';
-			}
-			// return the original / modified node
-			return tmp;
-		};
-	};
-
-	// attach to document ready if needed
-	$(function () {
-		// do(stuff);
-	});
-
-	// you can include the sample plugin in all instances by default
-	$.jstree.defaults.plugins.push("sample");
-})(jQuery);
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/base.less b/public/ext/vakata-jstree-3.3.17/src/themes/base.less
deleted file mode 100644
index 1e9444b434..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/themes/base.less
+++ /dev/null
@@ -1,95 +0,0 @@
-// base jstree
-.jstree-node, .jstree-children, .jstree-container-ul { display:block; margin:0; padding:0; list-style-type:none; list-style-image:none; }
-.jstree-node { white-space:nowrap; }
-.jstree-anchor { display:inline-block; color:black; white-space:nowrap; padding:0 4px 0 1px; margin:0; vertical-align:top; }
-.jstree-anchor:focus { outline:0; }
-.jstree-anchor, .jstree-anchor:link, .jstree-anchor:visited, .jstree-anchor:hover, .jstree-anchor:active { text-decoration:none; color:inherit; }
-.jstree-icon { display:inline-block; text-decoration:none; margin:0; padding:0; vertical-align:top; text-align:center; }
-.jstree-icon:empty { display:inline-block; text-decoration:none; margin:0; padding:0; vertical-align:top; text-align:center; }
-.jstree-ocl { cursor:pointer; }
-.jstree-leaf > .jstree-ocl { cursor:default; }
-.jstree .jstree-open > .jstree-children { display:block; }
-.jstree .jstree-closed > .jstree-children,
-.jstree .jstree-leaf > .jstree-children { display:none; }
-.jstree-anchor > .jstree-themeicon { margin-right:2px; }
-.jstree-no-icons .jstree-themeicon,
-.jstree-anchor > .jstree-themeicon-hidden { display:none; }
-.jstree-hidden, .jstree-node.jstree-hidden { display:none; }
-
-// base jstree rtl
-.jstree-rtl {
-	.jstree-anchor { padding:0 1px 0 4px; }
-	.jstree-anchor > .jstree-themeicon { margin-left:2px; margin-right:0; }
-	.jstree-node { margin-left:0; }
-	.jstree-container-ul > .jstree-node { margin-right:0; }
-}
-
-// base jstree wholerow
-.jstree-wholerow-ul {
-	position:relative;
-	display:inline-block;
-	min-width:100%;
-	.jstree-leaf > .jstree-ocl { cursor:pointer; }
-	.jstree-anchor, .jstree-icon { position:relative; }
-	.jstree-wholerow { width:100%; cursor:pointer; position:absolute; left:0; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; }
-}
-
-// base contextmenu
-.jstree-contextmenu .jstree-anchor {
-	-webkit-user-select: none; /* disable selection/Copy of UIWebView */
-	-webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */
-	user-select: none;
-}
-.vakata-context {
-	display:none;
-	&, ul { margin:0; padding:2px; position:absolute; background:#f5f5f5; border:1px solid #979797; box-shadow:2px 2px 2px #999999; }
-	ul { list-style:none; left:100%; margin-top:-2.7em; margin-left:-4px; }
-	.vakata-context-right ul { left:auto; right:100%; margin-left:auto; margin-right:-4px; }
-	li {
-		list-style:none;
-		> a {
-			display:block; padding:0 2em 0 2em; text-decoration:none; width:auto; color:black; white-space:nowrap; line-height:2.4em; text-shadow:1px 1px 0 white; border-radius:1px;
-			&:hover { position:relative; background-color:#e8eff7; box-shadow:0 0 2px #0a6aa1; }
-			&.vakata-context-parent { background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw=="); background-position:right center; background-repeat:no-repeat; }
-		}
-		> a:focus { outline:0; }
-	}
-	.vakata-context-no-icons { margin-left:0; }
-	.vakata-context-hover > a { position:relative; background-color:#e8eff7; box-shadow:0 0 2px #0a6aa1; }
-	.vakata-context-separator {
-		> a, > a:hover { background:white; border:0; border-top:1px solid #e2e3e3; height:1px; min-height:1px; max-height:1px; padding:0; margin:0 0 0 2.4em; border-left:1px solid #e0e0e0; text-shadow:0 0 0 transparent; box-shadow:0 0 0 transparent; border-radius:0; }
-	}
-	.vakata-contextmenu-disabled {
-		a, a:hover { color:silver; background-color:transparent; border:0; box-shadow:0 0 0; }
-		> a > i { filter: grayscale(100%); }
-	}
-	li > a {
-		> i { text-decoration:none; display:inline-block; width:2.4em; height:2.4em; background:transparent; margin:0 0 0 -2em; vertical-align:top; text-align:center; line-height:2.4em; }
-		> i:empty { width:2.4em; line-height:2.4em; }
-		.vakata-contextmenu-sep { display:inline-block; width:1px; height:2.4em; background:white; margin:0 0.5em 0 0; border-left:1px solid #e2e3e3; }
-	}
-	.vakata-contextmenu-shortcut { font-size:0.8em; color:silver; opacity:0.5; display:none; }
-}
-.vakata-context-rtl {
-	ul { left:auto; right:100%; margin-left:auto; margin-right:-4px; }
-	li > a.vakata-context-parent { background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7"); background-position:left center; background-repeat:no-repeat; }
-	.vakata-context-separator > a { margin:0 2.4em 0 0; border-left:0; border-right:1px solid #e2e3e3;}
-	.vakata-context-left ul { right:auto; left:100%; margin-left:-4px; margin-right:auto; }
-	li > a {
-		> i { margin:0 -2em 0 0; }
-		.vakata-contextmenu-sep { margin:0 0 0 0.5em; border-left-color:white; background:#e2e3e3; }
-	}
-}
-
-// base drag'n'drop
-#jstree-marker { position: absolute; top:0; left:0; margin:-5px 0 0 0; padding:0; border-right:0; border-top:5px solid transparent; border-bottom:5px solid transparent; border-left:5px solid; width:0; height:0; font-size:0; line-height:0; }
-#jstree-dnd {
-	line-height:16px;
-	margin:0;
-	padding:4px;
-	.jstree-icon,
-	.jstree-copy { display:inline-block; text-decoration:none; margin:0 2px 0 0; padding:0; width:16px; height:16px; }
-	.jstree-ok { background:green; }
-	.jstree-er { background:red; }
-	.jstree-copy { margin:0 2px 0 2px; }
-}
diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/default-dark/32px.png b/public/ext/vakata-jstree-3.3.17/src/themes/default-dark/32px.png
deleted file mode 100644
index 60395729ef6cfda914b211d5a45c9d2c083b3175..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1525
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
Ve7B44_jjPe*wfX|Wt~$(6957l+<gE5

diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/default-dark/40px.png b/public/ext/vakata-jstree-3.3.17/src/themes/default-dark/40px.png
deleted file mode 100644
index 002af360d04324dd30ef3c19116c738da7e06105..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 11488
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
GgeCwKh}^ya

diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/default-dark/style.css b/public/ext/vakata-jstree-3.3.17/src/themes/default-dark/style.css
deleted file mode 100644
index 68ec9e33bf..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/themes/default-dark/style.css
+++ /dev/null
@@ -1,1150 +0,0 @@
-/* jsTree default dark theme */
-.jstree-node,
-.jstree-children,
-.jstree-container-ul {
-  display: block;
-  margin: 0;
-  padding: 0;
-  list-style-type: none;
-  list-style-image: none;
-}
-.jstree-node {
-  white-space: nowrap;
-}
-.jstree-anchor {
-  display: inline-block;
-  color: black;
-  white-space: nowrap;
-  padding: 0 4px 0 1px;
-  margin: 0;
-  vertical-align: top;
-}
-.jstree-anchor:focus {
-  outline: 0;
-}
-.jstree-anchor,
-.jstree-anchor:link,
-.jstree-anchor:visited,
-.jstree-anchor:hover,
-.jstree-anchor:active {
-  text-decoration: none;
-  color: inherit;
-}
-.jstree-icon {
-  display: inline-block;
-  text-decoration: none;
-  margin: 0;
-  padding: 0;
-  vertical-align: top;
-  text-align: center;
-}
-.jstree-icon:empty {
-  display: inline-block;
-  text-decoration: none;
-  margin: 0;
-  padding: 0;
-  vertical-align: top;
-  text-align: center;
-}
-.jstree-ocl {
-  cursor: pointer;
-}
-.jstree-leaf > .jstree-ocl {
-  cursor: default;
-}
-.jstree .jstree-open > .jstree-children {
-  display: block;
-}
-.jstree .jstree-closed > .jstree-children,
-.jstree .jstree-leaf > .jstree-children {
-  display: none;
-}
-.jstree-anchor > .jstree-themeicon {
-  margin-right: 2px;
-}
-.jstree-no-icons .jstree-themeicon,
-.jstree-anchor > .jstree-themeicon-hidden {
-  display: none;
-}
-.jstree-hidden,
-.jstree-node.jstree-hidden {
-  display: none;
-}
-.jstree-rtl .jstree-anchor {
-  padding: 0 1px 0 4px;
-}
-.jstree-rtl .jstree-anchor > .jstree-themeicon {
-  margin-left: 2px;
-  margin-right: 0;
-}
-.jstree-rtl .jstree-node {
-  margin-left: 0;
-}
-.jstree-rtl .jstree-container-ul > .jstree-node {
-  margin-right: 0;
-}
-.jstree-wholerow-ul {
-  position: relative;
-  display: inline-block;
-  min-width: 100%;
-}
-.jstree-wholerow-ul .jstree-leaf > .jstree-ocl {
-  cursor: pointer;
-}
-.jstree-wholerow-ul .jstree-anchor,
-.jstree-wholerow-ul .jstree-icon {
-  position: relative;
-}
-.jstree-wholerow-ul .jstree-wholerow {
-  width: 100%;
-  cursor: pointer;
-  position: absolute;
-  left: 0;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.jstree-contextmenu .jstree-anchor {
-  -webkit-user-select: none;
-  /* disable selection/Copy of UIWebView */
-  -webkit-touch-callout: none;
-  /* disable the IOS popup when long-press on a link */
-  user-select: none;
-}
-.vakata-context {
-  display: none;
-}
-.vakata-context,
-.vakata-context ul {
-  margin: 0;
-  padding: 2px;
-  position: absolute;
-  background: #f5f5f5;
-  border: 1px solid #979797;
-  box-shadow: 2px 2px 2px #999999;
-}
-.vakata-context ul {
-  list-style: none;
-  left: 100%;
-  margin-top: -2.7em;
-  margin-left: -4px;
-}
-.vakata-context .vakata-context-right ul {
-  left: auto;
-  right: 100%;
-  margin-left: auto;
-  margin-right: -4px;
-}
-.vakata-context li {
-  list-style: none;
-}
-.vakata-context li > a {
-  display: block;
-  padding: 0 2em 0 2em;
-  text-decoration: none;
-  width: auto;
-  color: black;
-  white-space: nowrap;
-  line-height: 2.4em;
-  text-shadow: 1px 1px 0 white;
-  border-radius: 1px;
-}
-.vakata-context li > a:hover {
-  position: relative;
-  background-color: #e8eff7;
-  box-shadow: 0 0 2px #0a6aa1;
-}
-.vakata-context li > a.vakata-context-parent {
-  background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");
-  background-position: right center;
-  background-repeat: no-repeat;
-}
-.vakata-context li > a:focus {
-  outline: 0;
-}
-.vakata-context .vakata-context-no-icons {
-  margin-left: 0;
-}
-.vakata-context .vakata-context-hover > a {
-  position: relative;
-  background-color: #e8eff7;
-  box-shadow: 0 0 2px #0a6aa1;
-}
-.vakata-context .vakata-context-separator > a,
-.vakata-context .vakata-context-separator > a:hover {
-  background: white;
-  border: 0;
-  border-top: 1px solid #e2e3e3;
-  height: 1px;
-  min-height: 1px;
-  max-height: 1px;
-  padding: 0;
-  margin: 0 0 0 2.4em;
-  border-left: 1px solid #e0e0e0;
-  text-shadow: 0 0 0 transparent;
-  box-shadow: 0 0 0 transparent;
-  border-radius: 0;
-}
-.vakata-context .vakata-contextmenu-disabled a,
-.vakata-context .vakata-contextmenu-disabled a:hover {
-  color: silver;
-  background-color: transparent;
-  border: 0;
-  box-shadow: 0 0 0;
-}
-.vakata-context .vakata-contextmenu-disabled > a > i {
-  filter: grayscale(100%);
-}
-.vakata-context li > a > i {
-  text-decoration: none;
-  display: inline-block;
-  width: 2.4em;
-  height: 2.4em;
-  background: transparent;
-  margin: 0 0 0 -2em;
-  vertical-align: top;
-  text-align: center;
-  line-height: 2.4em;
-}
-.vakata-context li > a > i:empty {
-  width: 2.4em;
-  line-height: 2.4em;
-}
-.vakata-context li > a .vakata-contextmenu-sep {
-  display: inline-block;
-  width: 1px;
-  height: 2.4em;
-  background: white;
-  margin: 0 0.5em 0 0;
-  border-left: 1px solid #e2e3e3;
-}
-.vakata-context .vakata-contextmenu-shortcut {
-  font-size: 0.8em;
-  color: silver;
-  opacity: 0.5;
-  display: none;
-}
-.vakata-context-rtl ul {
-  left: auto;
-  right: 100%;
-  margin-left: auto;
-  margin-right: -4px;
-}
-.vakata-context-rtl li > a.vakata-context-parent {
-  background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-.vakata-context-rtl .vakata-context-separator > a {
-  margin: 0 2.4em 0 0;
-  border-left: 0;
-  border-right: 1px solid #e2e3e3;
-}
-.vakata-context-rtl .vakata-context-left ul {
-  right: auto;
-  left: 100%;
-  margin-left: -4px;
-  margin-right: auto;
-}
-.vakata-context-rtl li > a > i {
-  margin: 0 -2em 0 0;
-}
-.vakata-context-rtl li > a .vakata-contextmenu-sep {
-  margin: 0 0 0 0.5em;
-  border-left-color: white;
-  background: #e2e3e3;
-}
-#jstree-marker {
-  position: absolute;
-  top: 0;
-  left: 0;
-  margin: -5px 0 0 0;
-  padding: 0;
-  border-right: 0;
-  border-top: 5px solid transparent;
-  border-bottom: 5px solid transparent;
-  border-left: 5px solid;
-  width: 0;
-  height: 0;
-  font-size: 0;
-  line-height: 0;
-}
-#jstree-dnd {
-  line-height: 16px;
-  margin: 0;
-  padding: 4px;
-}
-#jstree-dnd .jstree-icon,
-#jstree-dnd .jstree-copy {
-  display: inline-block;
-  text-decoration: none;
-  margin: 0 2px 0 0;
-  padding: 0;
-  width: 16px;
-  height: 16px;
-}
-#jstree-dnd .jstree-ok {
-  background: green;
-}
-#jstree-dnd .jstree-er {
-  background: red;
-}
-#jstree-dnd .jstree-copy {
-  margin: 0 2px 0 2px;
-}
-.jstree-default-dark .jstree-node,
-.jstree-default-dark .jstree-icon {
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-.jstree-default-dark .jstree-anchor,
-.jstree-default-dark .jstree-animated,
-.jstree-default-dark .jstree-wholerow {
-  transition: background-color 0.15s, box-shadow 0.15s;
-}
-.jstree-default-dark .jstree-hovered {
-  background: #555;
-  border-radius: 2px;
-  box-shadow: inset 0 0 1px #555;
-}
-.jstree-default-dark .jstree-context {
-  background: #555;
-  border-radius: 2px;
-  box-shadow: inset 0 0 1px #555;
-}
-.jstree-default-dark .jstree-clicked {
-  background: #5fa2db;
-  border-radius: 2px;
-  box-shadow: inset 0 0 1px #666666;
-}
-.jstree-default-dark .jstree-no-icons .jstree-anchor > .jstree-themeicon {
-  display: none;
-}
-.jstree-default-dark .jstree-disabled {
-  background: transparent;
-  color: #666666;
-}
-.jstree-default-dark .jstree-disabled.jstree-hovered {
-  background: transparent;
-  box-shadow: none;
-}
-.jstree-default-dark .jstree-disabled.jstree-clicked {
-  background: #333333;
-}
-.jstree-default-dark .jstree-disabled > .jstree-icon {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default-dark .jstree-search {
-  font-style: italic;
-  color: #ffffff;
-  font-weight: bold;
-}
-.jstree-default-dark .jstree-no-checkboxes .jstree-checkbox {
-  display: none !important;
-}
-.jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked {
-  background: transparent;
-  box-shadow: none;
-}
-.jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered {
-  background: #555;
-}
-.jstree-default-dark.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked {
-  background: transparent;
-}
-.jstree-default-dark.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered {
-  background: #555;
-}
-.jstree-default-dark > .jstree-striped {
-  min-width: 100%;
-  display: inline-block;
-  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat;
-}
-.jstree-default-dark > .jstree-wholerow-ul .jstree-hovered,
-.jstree-default-dark > .jstree-wholerow-ul .jstree-clicked {
-  background: transparent;
-  box-shadow: none;
-  border-radius: 0;
-}
-.jstree-default-dark .jstree-wholerow {
-  -moz-box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.jstree-default-dark .jstree-wholerow-hovered {
-  background: #555;
-}
-.jstree-default-dark .jstree-wholerow-clicked {
-  background: #5fa2db;
-  background: -webkit-linear-gradient(top, #5fa2db 0%, #5fa2db 100%);
-  background: linear-gradient(to bottom, #5fa2db 0%, #5fa2db 100%);
-}
-.jstree-default-dark .jstree-node {
-  min-height: 24px;
-  line-height: 24px;
-  margin-left: 24px;
-  min-width: 24px;
-}
-.jstree-default-dark .jstree-anchor {
-  line-height: 24px;
-  height: 24px;
-}
-.jstree-default-dark .jstree-icon {
-  width: 24px;
-  height: 24px;
-  line-height: 24px;
-}
-.jstree-default-dark .jstree-icon:empty {
-  width: 24px;
-  height: 24px;
-  line-height: 24px;
-}
-.jstree-default-dark.jstree-rtl .jstree-node {
-  margin-right: 24px;
-}
-.jstree-default-dark .jstree-wholerow {
-  height: 24px;
-}
-.jstree-default-dark .jstree-node,
-.jstree-default-dark .jstree-icon {
-  background-image: url("32px.png");
-}
-.jstree-default-dark .jstree-node {
-  background-position: -292px -4px;
-  background-repeat: repeat-y;
-}
-.jstree-default-dark .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark .jstree-open > .jstree-ocl {
-  background-position: -132px -4px;
-}
-.jstree-default-dark .jstree-closed > .jstree-ocl {
-  background-position: -100px -4px;
-}
-.jstree-default-dark .jstree-leaf > .jstree-ocl {
-  background-position: -68px -4px;
-}
-.jstree-default-dark .jstree-themeicon {
-  background-position: -260px -4px;
-}
-.jstree-default-dark > .jstree-no-dots .jstree-node,
-.jstree-default-dark > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-dark > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -36px -4px;
-}
-.jstree-default-dark > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -4px -4px;
-}
-.jstree-default-dark .jstree-disabled {
-  background: transparent;
-}
-.jstree-default-dark .jstree-disabled.jstree-hovered {
-  background: transparent;
-}
-.jstree-default-dark .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default-dark .jstree-checkbox {
-  background-position: -164px -4px;
-}
-.jstree-default-dark .jstree-checkbox:hover {
-  background-position: -164px -36px;
-}
-.jstree-default-dark.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-.jstree-default-dark .jstree-checked > .jstree-checkbox {
-  background-position: -228px -4px;
-}
-.jstree-default-dark.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-.jstree-default-dark .jstree-checked > .jstree-checkbox:hover {
-  background-position: -228px -36px;
-}
-.jstree-default-dark .jstree-anchor > .jstree-undetermined {
-  background-position: -196px -4px;
-}
-.jstree-default-dark .jstree-anchor > .jstree-undetermined:hover {
-  background-position: -196px -36px;
-}
-.jstree-default-dark .jstree-checkbox-disabled {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default-dark > .jstree-striped {
-  background-size: auto 48px;
-}
-.jstree-default-dark.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-  background-position: 100% 1px;
-  background-repeat: repeat-y;
-}
-.jstree-default-dark.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark.jstree-rtl .jstree-open > .jstree-ocl {
-  background-position: -132px -36px;
-}
-.jstree-default-dark.jstree-rtl .jstree-closed > .jstree-ocl {
-  background-position: -100px -36px;
-}
-.jstree-default-dark.jstree-rtl .jstree-leaf > .jstree-ocl {
-  background-position: -68px -36px;
-}
-.jstree-default-dark.jstree-rtl > .jstree-no-dots .jstree-node,
-.jstree-default-dark.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-dark.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -36px -36px;
-}
-.jstree-default-dark.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -4px -36px;
-}
-.jstree-default-dark .jstree-themeicon-custom {
-  background-color: transparent;
-  background-image: none;
-  background-position: 0 0;
-}
-.jstree-default-dark > .jstree-container-ul .jstree-loading > .jstree-ocl {
-  background: url("throbber.gif") center center no-repeat;
-}
-.jstree-default-dark .jstree-file {
-  background: url("32px.png") -100px -68px no-repeat;
-}
-.jstree-default-dark .jstree-folder {
-  background: url("32px.png") -260px -4px no-repeat;
-}
-.jstree-default-dark > .jstree-container-ul > .jstree-node {
-  margin-left: 0;
-  margin-right: 0;
-}
-#jstree-dnd.jstree-default-dark {
-  line-height: 24px;
-  padding: 0 4px;
-}
-#jstree-dnd.jstree-default-dark .jstree-ok,
-#jstree-dnd.jstree-default-dark .jstree-er {
-  background-image: url("32px.png");
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-#jstree-dnd.jstree-default-dark i {
-  background: transparent;
-  width: 24px;
-  height: 24px;
-  line-height: 24px;
-}
-#jstree-dnd.jstree-default-dark .jstree-ok {
-  background-position: -4px -68px;
-}
-#jstree-dnd.jstree-default-dark .jstree-er {
-  background-position: -36px -68px;
-}
-.jstree-default-dark .jstree-ellipsis {
-  overflow: hidden;
-}
-.jstree-default-dark .jstree-ellipsis .jstree-anchor {
-  width: calc(100% - 24px + 5px);
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.jstree-default-dark.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-}
-.jstree-default-dark.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-small .jstree-node {
-  min-height: 18px;
-  line-height: 18px;
-  margin-left: 18px;
-  min-width: 18px;
-}
-.jstree-default-dark-small .jstree-anchor {
-  line-height: 18px;
-  height: 18px;
-}
-.jstree-default-dark-small .jstree-icon {
-  width: 18px;
-  height: 18px;
-  line-height: 18px;
-}
-.jstree-default-dark-small .jstree-icon:empty {
-  width: 18px;
-  height: 18px;
-  line-height: 18px;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-node {
-  margin-right: 18px;
-}
-.jstree-default-dark-small .jstree-wholerow {
-  height: 18px;
-}
-.jstree-default-dark-small .jstree-node,
-.jstree-default-dark-small .jstree-icon {
-  background-image: url("32px.png");
-}
-.jstree-default-dark-small .jstree-node {
-  background-position: -295px -7px;
-  background-repeat: repeat-y;
-}
-.jstree-default-dark-small .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-small .jstree-open > .jstree-ocl {
-  background-position: -135px -7px;
-}
-.jstree-default-dark-small .jstree-closed > .jstree-ocl {
-  background-position: -103px -7px;
-}
-.jstree-default-dark-small .jstree-leaf > .jstree-ocl {
-  background-position: -71px -7px;
-}
-.jstree-default-dark-small .jstree-themeicon {
-  background-position: -263px -7px;
-}
-.jstree-default-dark-small > .jstree-no-dots .jstree-node,
-.jstree-default-dark-small > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-dark-small > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -39px -7px;
-}
-.jstree-default-dark-small > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -7px -7px;
-}
-.jstree-default-dark-small .jstree-disabled {
-  background: transparent;
-}
-.jstree-default-dark-small .jstree-disabled.jstree-hovered {
-  background: transparent;
-}
-.jstree-default-dark-small .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default-dark-small .jstree-checkbox {
-  background-position: -167px -7px;
-}
-.jstree-default-dark-small .jstree-checkbox:hover {
-  background-position: -167px -39px;
-}
-.jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-.jstree-default-dark-small .jstree-checked > .jstree-checkbox {
-  background-position: -231px -7px;
-}
-.jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-.jstree-default-dark-small .jstree-checked > .jstree-checkbox:hover {
-  background-position: -231px -39px;
-}
-.jstree-default-dark-small .jstree-anchor > .jstree-undetermined {
-  background-position: -199px -7px;
-}
-.jstree-default-dark-small .jstree-anchor > .jstree-undetermined:hover {
-  background-position: -199px -39px;
-}
-.jstree-default-dark-small .jstree-checkbox-disabled {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default-dark-small > .jstree-striped {
-  background-size: auto 36px;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-  background-position: 100% 1px;
-  background-repeat: repeat-y;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-open > .jstree-ocl {
-  background-position: -135px -39px;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-closed > .jstree-ocl {
-  background-position: -103px -39px;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-leaf > .jstree-ocl {
-  background-position: -71px -39px;
-}
-.jstree-default-dark-small.jstree-rtl > .jstree-no-dots .jstree-node,
-.jstree-default-dark-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-dark-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -39px -39px;
-}
-.jstree-default-dark-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -7px -39px;
-}
-.jstree-default-dark-small .jstree-themeicon-custom {
-  background-color: transparent;
-  background-image: none;
-  background-position: 0 0;
-}
-.jstree-default-dark-small > .jstree-container-ul .jstree-loading > .jstree-ocl {
-  background: url("throbber.gif") center center no-repeat;
-}
-.jstree-default-dark-small .jstree-file {
-  background: url("32px.png") -103px -71px no-repeat;
-}
-.jstree-default-dark-small .jstree-folder {
-  background: url("32px.png") -263px -7px no-repeat;
-}
-.jstree-default-dark-small > .jstree-container-ul > .jstree-node {
-  margin-left: 0;
-  margin-right: 0;
-}
-#jstree-dnd.jstree-default-dark-small {
-  line-height: 18px;
-  padding: 0 4px;
-}
-#jstree-dnd.jstree-default-dark-small .jstree-ok,
-#jstree-dnd.jstree-default-dark-small .jstree-er {
-  background-image: url("32px.png");
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-#jstree-dnd.jstree-default-dark-small i {
-  background: transparent;
-  width: 18px;
-  height: 18px;
-  line-height: 18px;
-}
-#jstree-dnd.jstree-default-dark-small .jstree-ok {
-  background-position: -7px -71px;
-}
-#jstree-dnd.jstree-default-dark-small .jstree-er {
-  background-position: -39px -71px;
-}
-.jstree-default-dark-small .jstree-ellipsis {
-  overflow: hidden;
-}
-.jstree-default-dark-small .jstree-ellipsis .jstree-anchor {
-  width: calc(100% - 18px + 5px);
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==");
-}
-.jstree-default-dark-small.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-large .jstree-node {
-  min-height: 32px;
-  line-height: 32px;
-  margin-left: 32px;
-  min-width: 32px;
-}
-.jstree-default-dark-large .jstree-anchor {
-  line-height: 32px;
-  height: 32px;
-}
-.jstree-default-dark-large .jstree-icon {
-  width: 32px;
-  height: 32px;
-  line-height: 32px;
-}
-.jstree-default-dark-large .jstree-icon:empty {
-  width: 32px;
-  height: 32px;
-  line-height: 32px;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-node {
-  margin-right: 32px;
-}
-.jstree-default-dark-large .jstree-wholerow {
-  height: 32px;
-}
-.jstree-default-dark-large .jstree-node,
-.jstree-default-dark-large .jstree-icon {
-  background-image: url("32px.png");
-}
-.jstree-default-dark-large .jstree-node {
-  background-position: -288px 0px;
-  background-repeat: repeat-y;
-}
-.jstree-default-dark-large .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-large .jstree-open > .jstree-ocl {
-  background-position: -128px 0px;
-}
-.jstree-default-dark-large .jstree-closed > .jstree-ocl {
-  background-position: -96px 0px;
-}
-.jstree-default-dark-large .jstree-leaf > .jstree-ocl {
-  background-position: -64px 0px;
-}
-.jstree-default-dark-large .jstree-themeicon {
-  background-position: -256px 0px;
-}
-.jstree-default-dark-large > .jstree-no-dots .jstree-node,
-.jstree-default-dark-large > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-dark-large > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -32px 0px;
-}
-.jstree-default-dark-large > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: 0px 0px;
-}
-.jstree-default-dark-large .jstree-disabled {
-  background: transparent;
-}
-.jstree-default-dark-large .jstree-disabled.jstree-hovered {
-  background: transparent;
-}
-.jstree-default-dark-large .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default-dark-large .jstree-checkbox {
-  background-position: -160px 0px;
-}
-.jstree-default-dark-large .jstree-checkbox:hover {
-  background-position: -160px -32px;
-}
-.jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-.jstree-default-dark-large .jstree-checked > .jstree-checkbox {
-  background-position: -224px 0px;
-}
-.jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-.jstree-default-dark-large .jstree-checked > .jstree-checkbox:hover {
-  background-position: -224px -32px;
-}
-.jstree-default-dark-large .jstree-anchor > .jstree-undetermined {
-  background-position: -192px 0px;
-}
-.jstree-default-dark-large .jstree-anchor > .jstree-undetermined:hover {
-  background-position: -192px -32px;
-}
-.jstree-default-dark-large .jstree-checkbox-disabled {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default-dark-large > .jstree-striped {
-  background-size: auto 64px;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-  background-position: 100% 1px;
-  background-repeat: repeat-y;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-open > .jstree-ocl {
-  background-position: -128px -32px;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-closed > .jstree-ocl {
-  background-position: -96px -32px;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-leaf > .jstree-ocl {
-  background-position: -64px -32px;
-}
-.jstree-default-dark-large.jstree-rtl > .jstree-no-dots .jstree-node,
-.jstree-default-dark-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-dark-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -32px -32px;
-}
-.jstree-default-dark-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: 0px -32px;
-}
-.jstree-default-dark-large .jstree-themeicon-custom {
-  background-color: transparent;
-  background-image: none;
-  background-position: 0 0;
-}
-.jstree-default-dark-large > .jstree-container-ul .jstree-loading > .jstree-ocl {
-  background: url("throbber.gif") center center no-repeat;
-}
-.jstree-default-dark-large .jstree-file {
-  background: url("32px.png") -96px -64px no-repeat;
-}
-.jstree-default-dark-large .jstree-folder {
-  background: url("32px.png") -256px 0px no-repeat;
-}
-.jstree-default-dark-large > .jstree-container-ul > .jstree-node {
-  margin-left: 0;
-  margin-right: 0;
-}
-#jstree-dnd.jstree-default-dark-large {
-  line-height: 32px;
-  padding: 0 4px;
-}
-#jstree-dnd.jstree-default-dark-large .jstree-ok,
-#jstree-dnd.jstree-default-dark-large .jstree-er {
-  background-image: url("32px.png");
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-#jstree-dnd.jstree-default-dark-large i {
-  background: transparent;
-  width: 32px;
-  height: 32px;
-  line-height: 32px;
-}
-#jstree-dnd.jstree-default-dark-large .jstree-ok {
-  background-position: 0px -64px;
-}
-#jstree-dnd.jstree-default-dark-large .jstree-er {
-  background-position: -32px -64px;
-}
-.jstree-default-dark-large .jstree-ellipsis {
-  overflow: hidden;
-}
-.jstree-default-dark-large .jstree-ellipsis .jstree-anchor {
-  width: calc(100% - 32px + 5px);
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==");
-}
-.jstree-default-dark-large.jstree-rtl .jstree-last {
-  background-image: none;
-}
-@media (max-width: 768px) {
-  #jstree-dnd.jstree-dnd-responsive {
-    line-height: 40px;
-    font-weight: bold;
-    font-size: 1.1em;
-    text-shadow: 1px 1px white;
-  }
-  #jstree-dnd.jstree-dnd-responsive > i {
-    background: transparent;
-    width: 40px;
-    height: 40px;
-  }
-  #jstree-dnd.jstree-dnd-responsive > .jstree-ok {
-    background-image: url("40px.png");
-    background-position: 0 -200px;
-    background-size: 120px 240px;
-  }
-  #jstree-dnd.jstree-dnd-responsive > .jstree-er {
-    background-image: url("40px.png");
-    background-position: -40px -200px;
-    background-size: 120px 240px;
-  }
-  #jstree-marker.jstree-dnd-responsive {
-    border-left-width: 10px;
-    border-top-width: 10px;
-    border-bottom-width: 10px;
-    margin-top: -10px;
-  }
-}
-@media (max-width: 768px) {
-  .jstree-default-dark-responsive {
-    /*
-	.jstree-open > .jstree-ocl,
-	.jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; }
-	*/
-  }
-  .jstree-default-dark-responsive .jstree-icon {
-    background-image: url("40px.png");
-  }
-  .jstree-default-dark-responsive .jstree-node,
-  .jstree-default-dark-responsive .jstree-leaf > .jstree-ocl {
-    background: transparent;
-  }
-  .jstree-default-dark-responsive .jstree-node {
-    min-height: 40px;
-    line-height: 40px;
-    margin-left: 40px;
-    min-width: 40px;
-    white-space: nowrap;
-  }
-  .jstree-default-dark-responsive .jstree-anchor {
-    line-height: 40px;
-    height: 40px;
-  }
-  .jstree-default-dark-responsive .jstree-icon,
-  .jstree-default-dark-responsive .jstree-icon:empty {
-    width: 40px;
-    height: 40px;
-    line-height: 40px;
-  }
-  .jstree-default-dark-responsive > .jstree-container-ul > .jstree-node {
-    margin-left: 0;
-  }
-  .jstree-default-dark-responsive.jstree-rtl .jstree-node {
-    margin-left: 0;
-    margin-right: 40px;
-    background: transparent;
-  }
-  .jstree-default-dark-responsive.jstree-rtl .jstree-container-ul > .jstree-node {
-    margin-right: 0;
-  }
-  .jstree-default-dark-responsive .jstree-ocl,
-  .jstree-default-dark-responsive .jstree-themeicon,
-  .jstree-default-dark-responsive .jstree-checkbox {
-    background-size: 120px 240px;
-  }
-  .jstree-default-dark-responsive .jstree-leaf > .jstree-ocl,
-  .jstree-default-dark-responsive.jstree-rtl .jstree-leaf > .jstree-ocl {
-    background: transparent;
-  }
-  .jstree-default-dark-responsive .jstree-open > .jstree-ocl {
-    background-position: 0 0 !important;
-  }
-  .jstree-default-dark-responsive .jstree-closed > .jstree-ocl {
-    background-position: 0 -40px !important;
-  }
-  .jstree-default-dark-responsive.jstree-rtl .jstree-closed > .jstree-ocl {
-    background-position: -40px 0 !important;
-  }
-  .jstree-default-dark-responsive .jstree-themeicon {
-    background-position: -40px -40px;
-  }
-  .jstree-default-dark-responsive .jstree-checkbox,
-  .jstree-default-dark-responsive .jstree-checkbox:hover {
-    background-position: -40px -80px;
-  }
-  .jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-  .jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-  .jstree-default-dark-responsive .jstree-checked > .jstree-checkbox,
-  .jstree-default-dark-responsive .jstree-checked > .jstree-checkbox:hover {
-    background-position: 0 -80px;
-  }
-  .jstree-default-dark-responsive .jstree-anchor > .jstree-undetermined,
-  .jstree-default-dark-responsive .jstree-anchor > .jstree-undetermined:hover {
-    background-position: 0 -120px;
-  }
-  .jstree-default-dark-responsive .jstree-anchor {
-    font-weight: bold;
-    font-size: 1.1em;
-    text-shadow: 1px 1px white;
-  }
-  .jstree-default-dark-responsive > .jstree-striped {
-    background: transparent;
-  }
-  .jstree-default-dark-responsive .jstree-wholerow {
-    border-top: 1px solid #666;
-    border-bottom: 1px solid #000;
-    background: #333333;
-    height: 40px;
-  }
-  .jstree-default-dark-responsive .jstree-wholerow-hovered {
-    background: #555;
-  }
-  .jstree-default-dark-responsive .jstree-wholerow-clicked {
-    background: #5fa2db;
-  }
-  .jstree-default-dark-responsive .jstree-children .jstree-last > .jstree-wholerow {
-    box-shadow: inset 0 -6px 3px -5px #111111;
-  }
-  .jstree-default-dark-responsive .jstree-children .jstree-open > .jstree-wholerow {
-    box-shadow: inset 0 6px 3px -5px #111111;
-    border-top: 0;
-  }
-  .jstree-default-dark-responsive .jstree-children .jstree-open + .jstree-open {
-    box-shadow: none;
-  }
-  .jstree-default-dark-responsive .jstree-node,
-  .jstree-default-dark-responsive .jstree-icon,
-  .jstree-default-dark-responsive .jstree-node > .jstree-ocl,
-  .jstree-default-dark-responsive .jstree-themeicon,
-  .jstree-default-dark-responsive .jstree-checkbox {
-    background-image: url("40px.png");
-    background-size: 120px 240px;
-  }
-  .jstree-default-dark-responsive .jstree-node {
-    background-position: -80px 0;
-    background-repeat: repeat-y;
-  }
-  .jstree-default-dark-responsive .jstree-last {
-    background-image: none;
-  }
-  .jstree-default-dark-responsive .jstree-leaf > .jstree-ocl {
-    background-position: -40px -120px;
-  }
-  .jstree-default-dark-responsive .jstree-last > .jstree-ocl {
-    background-position: -40px -160px;
-  }
-  .jstree-default-dark-responsive .jstree-themeicon-custom {
-    background-color: transparent;
-    background-image: none;
-    background-position: 0 0;
-  }
-  .jstree-default-dark-responsive .jstree-file {
-    background: url("40px.png") 0 -160px no-repeat;
-    background-size: 120px 240px;
-  }
-  .jstree-default-dark-responsive .jstree-folder {
-    background: url("40px.png") -40px -40px no-repeat;
-    background-size: 120px 240px;
-  }
-  .jstree-default-dark-responsive > .jstree-container-ul > .jstree-node {
-    margin-left: 0;
-    margin-right: 0;
-  }
-}
-.jstree-default-dark {
-  background: #333;
-}
-.jstree-default-dark .jstree-anchor {
-  color: #999;
-  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.5);
-}
-.jstree-default-dark .jstree-clicked,
-.jstree-default-dark .jstree-checked {
-  color: white;
-}
-.jstree-default-dark .jstree-hovered {
-  color: white;
-}
-#jstree-marker.jstree-default-dark {
-  border-left-color: #999;
-  background: transparent;
-}
-.jstree-default-dark .jstree-anchor > .jstree-icon {
-  opacity: 0.75;
-}
-.jstree-default-dark .jstree-clicked > .jstree-icon,
-.jstree-default-dark .jstree-hovered > .jstree-icon,
-.jstree-default-dark .jstree-checked > .jstree-icon {
-  opacity: 1;
-}
-.jstree-default-dark.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-}
-.jstree-default-dark.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-small.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==");
-}
-.jstree-default-dark-small.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-dark-large.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==");
-}
-.jstree-default-dark-large.jstree-rtl .jstree-last {
-  background-image: none;
-}
diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/default-dark/style.less b/public/ext/vakata-jstree-3.3.17/src/themes/default-dark/style.less
deleted file mode 100644
index 165dc972fc..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/themes/default-dark/style.less
+++ /dev/null
@@ -1,50 +0,0 @@
-/* jsTree default dark theme */
-@theme-name:				default-dark;
-@hovered-bg-color:			#555;
-@hovered-shadow-color:		#555;
-@disabled-color:			#666666;
-@disabled-bg-color:			#333333;
-@clicked-bg-color:			#5fa2db;
-@clicked-shadow-color:		#666666;
-@clicked-gradient-color-1:	#5fa2db;
-@clicked-gradient-color-2:	#5fa2db;
-@search-result-color:		#ffffff;
-@mobile-wholerow-bg-color:	#333333;
-@mobile-wholerow-shadow:	#111111;
-@mobile-wholerow-bordert:	#666;
-@mobile-wholerow-borderb:	#000;
-@responsive:				true;
-@image-path:				"";
-@base-height:				40px;
-
-@import "../mixins.less";
-@import "../base.less";
-@import "../main.less";
-
-.jstree-@{theme-name} {
-	background:#333;
-	.jstree-anchor { color:#999; text-shadow:1px 1px 0 rgba(0,0,0,0.5); }
-	.jstree-clicked, .jstree-checked { color:white; }
-	.jstree-hovered { color:white; }
-	#jstree-marker& {
-		border-left-color:#999;
-		background:transparent;
-	}
-	.jstree-anchor > .jstree-icon { opacity:0.75; }
-	.jstree-clicked > .jstree-icon,
-	.jstree-hovered > .jstree-icon,
-	.jstree-checked > .jstree-icon { opacity:1; }
-}
-// theme variants
-.jstree-@{theme-name} {
-	&.jstree-rtl .jstree-node { background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); }
-	&.jstree-rtl .jstree-last { background-image:none;  }
-}
-.jstree-@{theme-name}-small {
-	&.jstree-rtl .jstree-node { background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); }
-	&.jstree-rtl .jstree-last { background-image:none;  }
-}
-.jstree-@{theme-name}-large {
-	&.jstree-rtl .jstree-node { background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); }
-	&.jstree-rtl .jstree-last { background-image:none;  }
-}
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/default-dark/throbber.gif b/public/ext/vakata-jstree-3.3.17/src/themes/default-dark/throbber.gif
deleted file mode 100644
index 2e310e8be219965cda00a2e1e9f3077838152c73..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1849
zcmZ?wbhEHb6krfw_`<+oY;3%0)hbI%%Z!W+2M34F&d!2@f>o<lH8eELm@y+FA|fCl
zV8Ma~2?+_ymoM+{@2{w+U?2r3{^#~{4GDI33~)8lGhk+9U|>-EC*@p}npl#WqEMb$
zlA(~8l~|FJpO~VTnU|K&p!k!8lZ%0YK?h_D$dL@J<q8T+Oq_~OS1`FaaU6G?u-ZeW
z^TCNjYlJo*Ox(b{%%$m&z%vJhxNRbiFC%_T2w39qafec9bJONPWzKUCof>1T=bz<1
zY`98@M}jr~yp@rPR2j1a3ztfbjxh^AHy1BUQ@k=02O9%#3QL123!CwDCGKKVZthe?
zY;Gw7xh2yf)w0jUk>jMJK+mSGBOed&3F@zwOen}uk?3_!RCQ2b?K%Fkz+)u`$6SF8
z6?@&78V{8QcZvu!Ggc_KvhuR99Mao=x1}voB&|=7#fK?giJ6tFfXmpaIlPfYfQ7pw
zw#J8zH^yvIbxqYQi@D~}=2)Fl0dmSso>a>|78edzC64}0T`kQAjEZzti!Ue)I3m){
z)W9Gjk+tPe!UqchHul#-ha3brERw`Lgme_NE<Q4l&|Sv+A=fQj;@uO=y*>d;T#dDv
zxCAtsn4FY&*|^hst2?xu!sGQj>zQ~R;#E4E>b#2@%^i!dI|dvsH%(G4`&tw^JU%L&
z))MNM=DrZvukX;ju|t<nK&a8AL4bwz@X7)K6TY4x?eBYZh1lo6*jlib<HYiWivb$b
z%s84KE|@FzAyog50w)KzmJUmcCJVEMwtlQqj(@9uo0ent#QMoy+}=}qx?&yc%*+;;
zVGWlYP`G4DfWk$I<M>Cp(^^99(%d|I_c1W*Ub8UpU=eEC*kJ2ty^!a^DZ!8y*Ebgg
z_KK|&eOD+dAoXI&+l{I7cwU9(dmF`vM}4~66V|!KFe^QrCDoy%)I(ptJi)%TGp$Z}
zQs*?YDU+44I-m~ZfSo$2mVHf19L*o4j%abUS@RSGZB}J!*`RE|wq#bqLWKiT>W7nO
zYAg|Bp5o=;AS1V5{NPq05h;DcgPF`G0v(4E_J*yM>SSSddbBT$g`c;ywnZtKot-t&
zFH@g~J(itEQ?pl>orA$AHK(4FojW(PmVt$xH#ap}8>^ElK~C}%NVV)cq{QL-+3bkc
zp%qHzu4kvUG&;CzX!xjIDJaZxh-zKl`E!?`0#D0(Rfn}K0<7h0qBIo*S_*QQHMsiQ
z8?UVG<KQU#TB;>1#?Bt3mdqx=$)3Q@uc@iQ!_LfJTp#Z>fu+MPK8BB7ozFejoTEnt
zyKBH18tfV-EuC%!jU!t7H2yf5Mhh8AFm6&<8nx-NXJUpToBQ-tsTC4co8EXCbfoS#
zJ8;M$tR{3dE6YcdUE5r8H?^v&@SUCgx<G=5i!+9u)t!O4f|HZCmcc=rrG|xvhl!uv
zR-236aI!9^YoaMrjwW`ufI~)e&XX1M)E(z|ubj00!L44MMce-Ju}toCjnT+yp0iTT
z+Ek(Ufq<!yOXm^E27?!Jn~j?i*BIyub&F2esw=~HQFh@0i7707hnovLOhg1&!#D+0
zc{7>Wnfdv-3ZjFQYB-sCm^k<*Ds#<b;^a4D&5SBfF4w{xPhi*Rcu&##x$Ov3_X>mg
z+=;WSuXkVAz!+)Kn3Q1hGH;0-_n{R|NeoR%yDMb&vFdC*ctuch-^2wQPmAq4EBxf5
z2B#4FiM<<S6<D}A*i^afnAv$bSh;z)jI>zT`I)+y*!VNGxH<J%S*-+SYO63amtl8J
zDJa!|U6T{NO64KfCNF`)=*5Q$d5mW!1V;bhGZk+9VI|4eHT46FXN01`fg(p23ke?Q
zvegq#im=}C2uRBm-1j7tA#e&yf3stNLxHq_GaIj}3j=Qen*a-cpotj|D^nK}Z)S2P
zlK_WbmO(jhizfCg1&<{?p2B@AxOCi^xYv0JFcfL5m+_il!Nbw+{Nag~U{`ya(-xhX
zQhlwj)Ff=US{r+|+?Eu|*vJ!Jrz@~$V!}loPM-E@UzbSeys=|u5@56D;<X6!v(e#Z
jZWXXG4B;1uWn<!+k<2o2x;k%RwhEU6$TilWiU^DWviT4R

diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/default/32px.png b/public/ext/vakata-jstree-3.3.17/src/themes/default/32px.png
deleted file mode 100644
index ac74418d2843d0233fc67c04a59462caa82bd860..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8740
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

diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/default/40px.png b/public/ext/vakata-jstree-3.3.17/src/themes/default/40px.png
deleted file mode 100644
index 29273260075f1654bb86a9e3f42c3f32ab5a2d23..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6055
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

diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/default/style.css b/public/ext/vakata-jstree-3.3.17/src/themes/default/style.css
deleted file mode 100644
index d851cd5f24..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/themes/default/style.css
+++ /dev/null
@@ -1,1106 +0,0 @@
-/* jsTree default theme */
-.jstree-node,
-.jstree-children,
-.jstree-container-ul {
-  display: block;
-  margin: 0;
-  padding: 0;
-  list-style-type: none;
-  list-style-image: none;
-}
-.jstree-node {
-  white-space: nowrap;
-}
-.jstree-anchor {
-  display: inline-block;
-  color: black;
-  white-space: nowrap;
-  padding: 0 4px 0 1px;
-  margin: 0;
-  vertical-align: top;
-}
-.jstree-anchor:focus {
-  outline: 0;
-}
-.jstree-anchor,
-.jstree-anchor:link,
-.jstree-anchor:visited,
-.jstree-anchor:hover,
-.jstree-anchor:active {
-  text-decoration: none;
-  color: inherit;
-}
-.jstree-icon {
-  display: inline-block;
-  text-decoration: none;
-  margin: 0;
-  padding: 0;
-  vertical-align: top;
-  text-align: center;
-}
-.jstree-icon:empty {
-  display: inline-block;
-  text-decoration: none;
-  margin: 0;
-  padding: 0;
-  vertical-align: top;
-  text-align: center;
-}
-.jstree-ocl {
-  cursor: pointer;
-}
-.jstree-leaf > .jstree-ocl {
-  cursor: default;
-}
-.jstree .jstree-open > .jstree-children {
-  display: block;
-}
-.jstree .jstree-closed > .jstree-children,
-.jstree .jstree-leaf > .jstree-children {
-  display: none;
-}
-.jstree-anchor > .jstree-themeicon {
-  margin-right: 2px;
-}
-.jstree-no-icons .jstree-themeicon,
-.jstree-anchor > .jstree-themeicon-hidden {
-  display: none;
-}
-.jstree-hidden,
-.jstree-node.jstree-hidden {
-  display: none;
-}
-.jstree-rtl .jstree-anchor {
-  padding: 0 1px 0 4px;
-}
-.jstree-rtl .jstree-anchor > .jstree-themeicon {
-  margin-left: 2px;
-  margin-right: 0;
-}
-.jstree-rtl .jstree-node {
-  margin-left: 0;
-}
-.jstree-rtl .jstree-container-ul > .jstree-node {
-  margin-right: 0;
-}
-.jstree-wholerow-ul {
-  position: relative;
-  display: inline-block;
-  min-width: 100%;
-}
-.jstree-wholerow-ul .jstree-leaf > .jstree-ocl {
-  cursor: pointer;
-}
-.jstree-wholerow-ul .jstree-anchor,
-.jstree-wholerow-ul .jstree-icon {
-  position: relative;
-}
-.jstree-wholerow-ul .jstree-wholerow {
-  width: 100%;
-  cursor: pointer;
-  position: absolute;
-  left: 0;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.jstree-contextmenu .jstree-anchor {
-  -webkit-user-select: none;
-  /* disable selection/Copy of UIWebView */
-  -webkit-touch-callout: none;
-  /* disable the IOS popup when long-press on a link */
-  user-select: none;
-}
-.vakata-context {
-  display: none;
-}
-.vakata-context,
-.vakata-context ul {
-  margin: 0;
-  padding: 2px;
-  position: absolute;
-  background: #f5f5f5;
-  border: 1px solid #979797;
-  box-shadow: 2px 2px 2px #999999;
-}
-.vakata-context ul {
-  list-style: none;
-  left: 100%;
-  margin-top: -2.7em;
-  margin-left: -4px;
-}
-.vakata-context .vakata-context-right ul {
-  left: auto;
-  right: 100%;
-  margin-left: auto;
-  margin-right: -4px;
-}
-.vakata-context li {
-  list-style: none;
-}
-.vakata-context li > a {
-  display: block;
-  padding: 0 2em 0 2em;
-  text-decoration: none;
-  width: auto;
-  color: black;
-  white-space: nowrap;
-  line-height: 2.4em;
-  text-shadow: 1px 1px 0 white;
-  border-radius: 1px;
-}
-.vakata-context li > a:hover {
-  position: relative;
-  background-color: #e8eff7;
-  box-shadow: 0 0 2px #0a6aa1;
-}
-.vakata-context li > a.vakata-context-parent {
-  background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");
-  background-position: right center;
-  background-repeat: no-repeat;
-}
-.vakata-context li > a:focus {
-  outline: 0;
-}
-.vakata-context .vakata-context-no-icons {
-  margin-left: 0;
-}
-.vakata-context .vakata-context-hover > a {
-  position: relative;
-  background-color: #e8eff7;
-  box-shadow: 0 0 2px #0a6aa1;
-}
-.vakata-context .vakata-context-separator > a,
-.vakata-context .vakata-context-separator > a:hover {
-  background: white;
-  border: 0;
-  border-top: 1px solid #e2e3e3;
-  height: 1px;
-  min-height: 1px;
-  max-height: 1px;
-  padding: 0;
-  margin: 0 0 0 2.4em;
-  border-left: 1px solid #e0e0e0;
-  text-shadow: 0 0 0 transparent;
-  box-shadow: 0 0 0 transparent;
-  border-radius: 0;
-}
-.vakata-context .vakata-contextmenu-disabled a,
-.vakata-context .vakata-contextmenu-disabled a:hover {
-  color: silver;
-  background-color: transparent;
-  border: 0;
-  box-shadow: 0 0 0;
-}
-.vakata-context .vakata-contextmenu-disabled > a > i {
-  filter: grayscale(100%);
-}
-.vakata-context li > a > i {
-  text-decoration: none;
-  display: inline-block;
-  width: 2.4em;
-  height: 2.4em;
-  background: transparent;
-  margin: 0 0 0 -2em;
-  vertical-align: top;
-  text-align: center;
-  line-height: 2.4em;
-}
-.vakata-context li > a > i:empty {
-  width: 2.4em;
-  line-height: 2.4em;
-}
-.vakata-context li > a .vakata-contextmenu-sep {
-  display: inline-block;
-  width: 1px;
-  height: 2.4em;
-  background: white;
-  margin: 0 0.5em 0 0;
-  border-left: 1px solid #e2e3e3;
-}
-.vakata-context .vakata-contextmenu-shortcut {
-  font-size: 0.8em;
-  color: silver;
-  opacity: 0.5;
-  display: none;
-}
-.vakata-context-rtl ul {
-  left: auto;
-  right: 100%;
-  margin-left: auto;
-  margin-right: -4px;
-}
-.vakata-context-rtl li > a.vakata-context-parent {
-  background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-.vakata-context-rtl .vakata-context-separator > a {
-  margin: 0 2.4em 0 0;
-  border-left: 0;
-  border-right: 1px solid #e2e3e3;
-}
-.vakata-context-rtl .vakata-context-left ul {
-  right: auto;
-  left: 100%;
-  margin-left: -4px;
-  margin-right: auto;
-}
-.vakata-context-rtl li > a > i {
-  margin: 0 -2em 0 0;
-}
-.vakata-context-rtl li > a .vakata-contextmenu-sep {
-  margin: 0 0 0 0.5em;
-  border-left-color: white;
-  background: #e2e3e3;
-}
-#jstree-marker {
-  position: absolute;
-  top: 0;
-  left: 0;
-  margin: -5px 0 0 0;
-  padding: 0;
-  border-right: 0;
-  border-top: 5px solid transparent;
-  border-bottom: 5px solid transparent;
-  border-left: 5px solid;
-  width: 0;
-  height: 0;
-  font-size: 0;
-  line-height: 0;
-}
-#jstree-dnd {
-  line-height: 16px;
-  margin: 0;
-  padding: 4px;
-}
-#jstree-dnd .jstree-icon,
-#jstree-dnd .jstree-copy {
-  display: inline-block;
-  text-decoration: none;
-  margin: 0 2px 0 0;
-  padding: 0;
-  width: 16px;
-  height: 16px;
-}
-#jstree-dnd .jstree-ok {
-  background: green;
-}
-#jstree-dnd .jstree-er {
-  background: red;
-}
-#jstree-dnd .jstree-copy {
-  margin: 0 2px 0 2px;
-}
-.jstree-default .jstree-node,
-.jstree-default .jstree-icon {
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-.jstree-default .jstree-anchor,
-.jstree-default .jstree-animated,
-.jstree-default .jstree-wholerow {
-  transition: background-color 0.15s, box-shadow 0.15s;
-}
-.jstree-default .jstree-hovered {
-  background: #e7f4f9;
-  border-radius: 2px;
-  box-shadow: inset 0 0 1px #cccccc;
-}
-.jstree-default .jstree-context {
-  background: #e7f4f9;
-  border-radius: 2px;
-  box-shadow: inset 0 0 1px #cccccc;
-}
-.jstree-default .jstree-clicked {
-  background: #beebff;
-  border-radius: 2px;
-  box-shadow: inset 0 0 1px #999999;
-}
-.jstree-default .jstree-no-icons .jstree-anchor > .jstree-themeicon {
-  display: none;
-}
-.jstree-default .jstree-disabled {
-  background: transparent;
-  color: #666666;
-}
-.jstree-default .jstree-disabled.jstree-hovered {
-  background: transparent;
-  box-shadow: none;
-}
-.jstree-default .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default .jstree-disabled > .jstree-icon {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default .jstree-search {
-  font-style: italic;
-  color: #8b0000;
-  font-weight: bold;
-}
-.jstree-default .jstree-no-checkboxes .jstree-checkbox {
-  display: none !important;
-}
-.jstree-default.jstree-checkbox-no-clicked .jstree-clicked {
-  background: transparent;
-  box-shadow: none;
-}
-.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered {
-  background: #e7f4f9;
-}
-.jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked {
-  background: transparent;
-}
-.jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered {
-  background: #e7f4f9;
-}
-.jstree-default > .jstree-striped {
-  min-width: 100%;
-  display: inline-block;
-  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat;
-}
-.jstree-default > .jstree-wholerow-ul .jstree-hovered,
-.jstree-default > .jstree-wholerow-ul .jstree-clicked {
-  background: transparent;
-  box-shadow: none;
-  border-radius: 0;
-}
-.jstree-default .jstree-wholerow {
-  -moz-box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.jstree-default .jstree-wholerow-hovered {
-  background: #e7f4f9;
-}
-.jstree-default .jstree-wholerow-clicked {
-  background: #beebff;
-  background: -webkit-linear-gradient(top, #beebff 0%, #a8e4ff 100%);
-  background: linear-gradient(to bottom, #beebff 0%, #a8e4ff 100%);
-}
-.jstree-default .jstree-node {
-  min-height: 24px;
-  line-height: 24px;
-  margin-left: 24px;
-  min-width: 24px;
-}
-.jstree-default .jstree-anchor {
-  line-height: 24px;
-  height: 24px;
-}
-.jstree-default .jstree-icon {
-  width: 24px;
-  height: 24px;
-  line-height: 24px;
-}
-.jstree-default .jstree-icon:empty {
-  width: 24px;
-  height: 24px;
-  line-height: 24px;
-}
-.jstree-default.jstree-rtl .jstree-node {
-  margin-right: 24px;
-}
-.jstree-default .jstree-wholerow {
-  height: 24px;
-}
-.jstree-default .jstree-node,
-.jstree-default .jstree-icon {
-  background-image: url("32px.png");
-}
-.jstree-default .jstree-node {
-  background-position: -292px -4px;
-  background-repeat: repeat-y;
-}
-.jstree-default .jstree-last {
-  background-image: none;
-}
-.jstree-default .jstree-open > .jstree-ocl {
-  background-position: -132px -4px;
-}
-.jstree-default .jstree-closed > .jstree-ocl {
-  background-position: -100px -4px;
-}
-.jstree-default .jstree-leaf > .jstree-ocl {
-  background-position: -68px -4px;
-}
-.jstree-default .jstree-themeicon {
-  background-position: -260px -4px;
-}
-.jstree-default > .jstree-no-dots .jstree-node,
-.jstree-default > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -36px -4px;
-}
-.jstree-default > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -4px -4px;
-}
-.jstree-default .jstree-disabled {
-  background: transparent;
-}
-.jstree-default .jstree-disabled.jstree-hovered {
-  background: transparent;
-}
-.jstree-default .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default .jstree-checkbox {
-  background-position: -164px -4px;
-}
-.jstree-default .jstree-checkbox:hover {
-  background-position: -164px -36px;
-}
-.jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-.jstree-default .jstree-checked > .jstree-checkbox {
-  background-position: -228px -4px;
-}
-.jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-.jstree-default .jstree-checked > .jstree-checkbox:hover {
-  background-position: -228px -36px;
-}
-.jstree-default .jstree-anchor > .jstree-undetermined {
-  background-position: -196px -4px;
-}
-.jstree-default .jstree-anchor > .jstree-undetermined:hover {
-  background-position: -196px -36px;
-}
-.jstree-default .jstree-checkbox-disabled {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default > .jstree-striped {
-  background-size: auto 48px;
-}
-.jstree-default.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-  background-position: 100% 1px;
-  background-repeat: repeat-y;
-}
-.jstree-default.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default.jstree-rtl .jstree-open > .jstree-ocl {
-  background-position: -132px -36px;
-}
-.jstree-default.jstree-rtl .jstree-closed > .jstree-ocl {
-  background-position: -100px -36px;
-}
-.jstree-default.jstree-rtl .jstree-leaf > .jstree-ocl {
-  background-position: -68px -36px;
-}
-.jstree-default.jstree-rtl > .jstree-no-dots .jstree-node,
-.jstree-default.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -36px -36px;
-}
-.jstree-default.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -4px -36px;
-}
-.jstree-default .jstree-themeicon-custom {
-  background-color: transparent;
-  background-image: none;
-  background-position: 0 0;
-}
-.jstree-default > .jstree-container-ul .jstree-loading > .jstree-ocl {
-  background: url("throbber.gif") center center no-repeat;
-}
-.jstree-default .jstree-file {
-  background: url("32px.png") -100px -68px no-repeat;
-}
-.jstree-default .jstree-folder {
-  background: url("32px.png") -260px -4px no-repeat;
-}
-.jstree-default > .jstree-container-ul > .jstree-node {
-  margin-left: 0;
-  margin-right: 0;
-}
-#jstree-dnd.jstree-default {
-  line-height: 24px;
-  padding: 0 4px;
-}
-#jstree-dnd.jstree-default .jstree-ok,
-#jstree-dnd.jstree-default .jstree-er {
-  background-image: url("32px.png");
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-#jstree-dnd.jstree-default i {
-  background: transparent;
-  width: 24px;
-  height: 24px;
-  line-height: 24px;
-}
-#jstree-dnd.jstree-default .jstree-ok {
-  background-position: -4px -68px;
-}
-#jstree-dnd.jstree-default .jstree-er {
-  background-position: -36px -68px;
-}
-.jstree-default .jstree-ellipsis {
-  overflow: hidden;
-}
-.jstree-default .jstree-ellipsis .jstree-anchor {
-  width: calc(100% - 24px + 5px);
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.jstree-default.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-}
-.jstree-default.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-small .jstree-node {
-  min-height: 18px;
-  line-height: 18px;
-  margin-left: 18px;
-  min-width: 18px;
-}
-.jstree-default-small .jstree-anchor {
-  line-height: 18px;
-  height: 18px;
-}
-.jstree-default-small .jstree-icon {
-  width: 18px;
-  height: 18px;
-  line-height: 18px;
-}
-.jstree-default-small .jstree-icon:empty {
-  width: 18px;
-  height: 18px;
-  line-height: 18px;
-}
-.jstree-default-small.jstree-rtl .jstree-node {
-  margin-right: 18px;
-}
-.jstree-default-small .jstree-wholerow {
-  height: 18px;
-}
-.jstree-default-small .jstree-node,
-.jstree-default-small .jstree-icon {
-  background-image: url("32px.png");
-}
-.jstree-default-small .jstree-node {
-  background-position: -295px -7px;
-  background-repeat: repeat-y;
-}
-.jstree-default-small .jstree-last {
-  background-image: none;
-}
-.jstree-default-small .jstree-open > .jstree-ocl {
-  background-position: -135px -7px;
-}
-.jstree-default-small .jstree-closed > .jstree-ocl {
-  background-position: -103px -7px;
-}
-.jstree-default-small .jstree-leaf > .jstree-ocl {
-  background-position: -71px -7px;
-}
-.jstree-default-small .jstree-themeicon {
-  background-position: -263px -7px;
-}
-.jstree-default-small > .jstree-no-dots .jstree-node,
-.jstree-default-small > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-small > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -39px -7px;
-}
-.jstree-default-small > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -7px -7px;
-}
-.jstree-default-small .jstree-disabled {
-  background: transparent;
-}
-.jstree-default-small .jstree-disabled.jstree-hovered {
-  background: transparent;
-}
-.jstree-default-small .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default-small .jstree-checkbox {
-  background-position: -167px -7px;
-}
-.jstree-default-small .jstree-checkbox:hover {
-  background-position: -167px -39px;
-}
-.jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-.jstree-default-small .jstree-checked > .jstree-checkbox {
-  background-position: -231px -7px;
-}
-.jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-.jstree-default-small .jstree-checked > .jstree-checkbox:hover {
-  background-position: -231px -39px;
-}
-.jstree-default-small .jstree-anchor > .jstree-undetermined {
-  background-position: -199px -7px;
-}
-.jstree-default-small .jstree-anchor > .jstree-undetermined:hover {
-  background-position: -199px -39px;
-}
-.jstree-default-small .jstree-checkbox-disabled {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default-small > .jstree-striped {
-  background-size: auto 36px;
-}
-.jstree-default-small.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-  background-position: 100% 1px;
-  background-repeat: repeat-y;
-}
-.jstree-default-small.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-small.jstree-rtl .jstree-open > .jstree-ocl {
-  background-position: -135px -39px;
-}
-.jstree-default-small.jstree-rtl .jstree-closed > .jstree-ocl {
-  background-position: -103px -39px;
-}
-.jstree-default-small.jstree-rtl .jstree-leaf > .jstree-ocl {
-  background-position: -71px -39px;
-}
-.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-node,
-.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -39px -39px;
-}
-.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: -7px -39px;
-}
-.jstree-default-small .jstree-themeicon-custom {
-  background-color: transparent;
-  background-image: none;
-  background-position: 0 0;
-}
-.jstree-default-small > .jstree-container-ul .jstree-loading > .jstree-ocl {
-  background: url("throbber.gif") center center no-repeat;
-}
-.jstree-default-small .jstree-file {
-  background: url("32px.png") -103px -71px no-repeat;
-}
-.jstree-default-small .jstree-folder {
-  background: url("32px.png") -263px -7px no-repeat;
-}
-.jstree-default-small > .jstree-container-ul > .jstree-node {
-  margin-left: 0;
-  margin-right: 0;
-}
-#jstree-dnd.jstree-default-small {
-  line-height: 18px;
-  padding: 0 4px;
-}
-#jstree-dnd.jstree-default-small .jstree-ok,
-#jstree-dnd.jstree-default-small .jstree-er {
-  background-image: url("32px.png");
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-#jstree-dnd.jstree-default-small i {
-  background: transparent;
-  width: 18px;
-  height: 18px;
-  line-height: 18px;
-}
-#jstree-dnd.jstree-default-small .jstree-ok {
-  background-position: -7px -71px;
-}
-#jstree-dnd.jstree-default-small .jstree-er {
-  background-position: -39px -71px;
-}
-.jstree-default-small .jstree-ellipsis {
-  overflow: hidden;
-}
-.jstree-default-small .jstree-ellipsis .jstree-anchor {
-  width: calc(100% - 18px + 5px);
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.jstree-default-small.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==");
-}
-.jstree-default-small.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-large .jstree-node {
-  min-height: 32px;
-  line-height: 32px;
-  margin-left: 32px;
-  min-width: 32px;
-}
-.jstree-default-large .jstree-anchor {
-  line-height: 32px;
-  height: 32px;
-}
-.jstree-default-large .jstree-icon {
-  width: 32px;
-  height: 32px;
-  line-height: 32px;
-}
-.jstree-default-large .jstree-icon:empty {
-  width: 32px;
-  height: 32px;
-  line-height: 32px;
-}
-.jstree-default-large.jstree-rtl .jstree-node {
-  margin-right: 32px;
-}
-.jstree-default-large .jstree-wholerow {
-  height: 32px;
-}
-.jstree-default-large .jstree-node,
-.jstree-default-large .jstree-icon {
-  background-image: url("32px.png");
-}
-.jstree-default-large .jstree-node {
-  background-position: -288px 0px;
-  background-repeat: repeat-y;
-}
-.jstree-default-large .jstree-last {
-  background-image: none;
-}
-.jstree-default-large .jstree-open > .jstree-ocl {
-  background-position: -128px 0px;
-}
-.jstree-default-large .jstree-closed > .jstree-ocl {
-  background-position: -96px 0px;
-}
-.jstree-default-large .jstree-leaf > .jstree-ocl {
-  background-position: -64px 0px;
-}
-.jstree-default-large .jstree-themeicon {
-  background-position: -256px 0px;
-}
-.jstree-default-large > .jstree-no-dots .jstree-node,
-.jstree-default-large > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-large > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -32px 0px;
-}
-.jstree-default-large > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: 0px 0px;
-}
-.jstree-default-large .jstree-disabled {
-  background: transparent;
-}
-.jstree-default-large .jstree-disabled.jstree-hovered {
-  background: transparent;
-}
-.jstree-default-large .jstree-disabled.jstree-clicked {
-  background: #efefef;
-}
-.jstree-default-large .jstree-checkbox {
-  background-position: -160px 0px;
-}
-.jstree-default-large .jstree-checkbox:hover {
-  background-position: -160px -32px;
-}
-.jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-.jstree-default-large .jstree-checked > .jstree-checkbox {
-  background-position: -224px 0px;
-}
-.jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-.jstree-default-large .jstree-checked > .jstree-checkbox:hover {
-  background-position: -224px -32px;
-}
-.jstree-default-large .jstree-anchor > .jstree-undetermined {
-  background-position: -192px 0px;
-}
-.jstree-default-large .jstree-anchor > .jstree-undetermined:hover {
-  background-position: -192px -32px;
-}
-.jstree-default-large .jstree-checkbox-disabled {
-  opacity: 0.8;
-  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
-  /* Firefox 10+ */
-  filter: gray;
-  /* IE6-9 */
-  -webkit-filter: grayscale(100%);
-  /* Chrome 19+ & Safari 6+ */
-}
-.jstree-default-large > .jstree-striped {
-  background-size: auto 64px;
-}
-.jstree-default-large.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
-  background-position: 100% 1px;
-  background-repeat: repeat-y;
-}
-.jstree-default-large.jstree-rtl .jstree-last {
-  background-image: none;
-}
-.jstree-default-large.jstree-rtl .jstree-open > .jstree-ocl {
-  background-position: -128px -32px;
-}
-.jstree-default-large.jstree-rtl .jstree-closed > .jstree-ocl {
-  background-position: -96px -32px;
-}
-.jstree-default-large.jstree-rtl .jstree-leaf > .jstree-ocl {
-  background-position: -64px -32px;
-}
-.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-node,
-.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
-  background: transparent;
-}
-.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
-  background-position: -32px -32px;
-}
-.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
-  background-position: 0px -32px;
-}
-.jstree-default-large .jstree-themeicon-custom {
-  background-color: transparent;
-  background-image: none;
-  background-position: 0 0;
-}
-.jstree-default-large > .jstree-container-ul .jstree-loading > .jstree-ocl {
-  background: url("throbber.gif") center center no-repeat;
-}
-.jstree-default-large .jstree-file {
-  background: url("32px.png") -96px -64px no-repeat;
-}
-.jstree-default-large .jstree-folder {
-  background: url("32px.png") -256px 0px no-repeat;
-}
-.jstree-default-large > .jstree-container-ul > .jstree-node {
-  margin-left: 0;
-  margin-right: 0;
-}
-#jstree-dnd.jstree-default-large {
-  line-height: 32px;
-  padding: 0 4px;
-}
-#jstree-dnd.jstree-default-large .jstree-ok,
-#jstree-dnd.jstree-default-large .jstree-er {
-  background-image: url("32px.png");
-  background-repeat: no-repeat;
-  background-color: transparent;
-}
-#jstree-dnd.jstree-default-large i {
-  background: transparent;
-  width: 32px;
-  height: 32px;
-  line-height: 32px;
-}
-#jstree-dnd.jstree-default-large .jstree-ok {
-  background-position: 0px -64px;
-}
-#jstree-dnd.jstree-default-large .jstree-er {
-  background-position: -32px -64px;
-}
-.jstree-default-large .jstree-ellipsis {
-  overflow: hidden;
-}
-.jstree-default-large .jstree-ellipsis .jstree-anchor {
-  width: calc(100% - 32px + 5px);
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.jstree-default-large.jstree-rtl .jstree-node {
-  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==");
-}
-.jstree-default-large.jstree-rtl .jstree-last {
-  background-image: none;
-}
-@media (max-width: 768px) {
-  #jstree-dnd.jstree-dnd-responsive {
-    line-height: 40px;
-    font-weight: bold;
-    font-size: 1.1em;
-    text-shadow: 1px 1px white;
-  }
-  #jstree-dnd.jstree-dnd-responsive > i {
-    background: transparent;
-    width: 40px;
-    height: 40px;
-  }
-  #jstree-dnd.jstree-dnd-responsive > .jstree-ok {
-    background-image: url("40px.png");
-    background-position: 0 -200px;
-    background-size: 120px 240px;
-  }
-  #jstree-dnd.jstree-dnd-responsive > .jstree-er {
-    background-image: url("40px.png");
-    background-position: -40px -200px;
-    background-size: 120px 240px;
-  }
-  #jstree-marker.jstree-dnd-responsive {
-    border-left-width: 10px;
-    border-top-width: 10px;
-    border-bottom-width: 10px;
-    margin-top: -10px;
-  }
-}
-@media (max-width: 768px) {
-  .jstree-default-responsive {
-    /*
-	.jstree-open > .jstree-ocl,
-	.jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; }
-	*/
-  }
-  .jstree-default-responsive .jstree-icon {
-    background-image: url("40px.png");
-  }
-  .jstree-default-responsive .jstree-node,
-  .jstree-default-responsive .jstree-leaf > .jstree-ocl {
-    background: transparent;
-  }
-  .jstree-default-responsive .jstree-node {
-    min-height: 40px;
-    line-height: 40px;
-    margin-left: 40px;
-    min-width: 40px;
-    white-space: nowrap;
-  }
-  .jstree-default-responsive .jstree-anchor {
-    line-height: 40px;
-    height: 40px;
-  }
-  .jstree-default-responsive .jstree-icon,
-  .jstree-default-responsive .jstree-icon:empty {
-    width: 40px;
-    height: 40px;
-    line-height: 40px;
-  }
-  .jstree-default-responsive > .jstree-container-ul > .jstree-node {
-    margin-left: 0;
-  }
-  .jstree-default-responsive.jstree-rtl .jstree-node {
-    margin-left: 0;
-    margin-right: 40px;
-    background: transparent;
-  }
-  .jstree-default-responsive.jstree-rtl .jstree-container-ul > .jstree-node {
-    margin-right: 0;
-  }
-  .jstree-default-responsive .jstree-ocl,
-  .jstree-default-responsive .jstree-themeicon,
-  .jstree-default-responsive .jstree-checkbox {
-    background-size: 120px 240px;
-  }
-  .jstree-default-responsive .jstree-leaf > .jstree-ocl,
-  .jstree-default-responsive.jstree-rtl .jstree-leaf > .jstree-ocl {
-    background: transparent;
-  }
-  .jstree-default-responsive .jstree-open > .jstree-ocl {
-    background-position: 0 0 !important;
-  }
-  .jstree-default-responsive .jstree-closed > .jstree-ocl {
-    background-position: 0 -40px !important;
-  }
-  .jstree-default-responsive.jstree-rtl .jstree-closed > .jstree-ocl {
-    background-position: -40px 0 !important;
-  }
-  .jstree-default-responsive .jstree-themeicon {
-    background-position: -40px -40px;
-  }
-  .jstree-default-responsive .jstree-checkbox,
-  .jstree-default-responsive .jstree-checkbox:hover {
-    background-position: -40px -80px;
-  }
-  .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-  .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-  .jstree-default-responsive .jstree-checked > .jstree-checkbox,
-  .jstree-default-responsive .jstree-checked > .jstree-checkbox:hover {
-    background-position: 0 -80px;
-  }
-  .jstree-default-responsive .jstree-anchor > .jstree-undetermined,
-  .jstree-default-responsive .jstree-anchor > .jstree-undetermined:hover {
-    background-position: 0 -120px;
-  }
-  .jstree-default-responsive .jstree-anchor {
-    font-weight: bold;
-    font-size: 1.1em;
-    text-shadow: 1px 1px white;
-  }
-  .jstree-default-responsive > .jstree-striped {
-    background: transparent;
-  }
-  .jstree-default-responsive .jstree-wholerow {
-    border-top: 1px solid rgba(255, 255, 255, 0.7);
-    border-bottom: 1px solid rgba(64, 64, 64, 0.2);
-    background: #ebebeb;
-    height: 40px;
-  }
-  .jstree-default-responsive .jstree-wholerow-hovered {
-    background: #e7f4f9;
-  }
-  .jstree-default-responsive .jstree-wholerow-clicked {
-    background: #beebff;
-  }
-  .jstree-default-responsive .jstree-children .jstree-last > .jstree-wholerow {
-    box-shadow: inset 0 -6px 3px -5px #666666;
-  }
-  .jstree-default-responsive .jstree-children .jstree-open > .jstree-wholerow {
-    box-shadow: inset 0 6px 3px -5px #666666;
-    border-top: 0;
-  }
-  .jstree-default-responsive .jstree-children .jstree-open + .jstree-open {
-    box-shadow: none;
-  }
-  .jstree-default-responsive .jstree-node,
-  .jstree-default-responsive .jstree-icon,
-  .jstree-default-responsive .jstree-node > .jstree-ocl,
-  .jstree-default-responsive .jstree-themeicon,
-  .jstree-default-responsive .jstree-checkbox {
-    background-image: url("40px.png");
-    background-size: 120px 240px;
-  }
-  .jstree-default-responsive .jstree-node {
-    background-position: -80px 0;
-    background-repeat: repeat-y;
-  }
-  .jstree-default-responsive .jstree-last {
-    background-image: none;
-  }
-  .jstree-default-responsive .jstree-leaf > .jstree-ocl {
-    background-position: -40px -120px;
-  }
-  .jstree-default-responsive .jstree-last > .jstree-ocl {
-    background-position: -40px -160px;
-  }
-  .jstree-default-responsive .jstree-themeicon-custom {
-    background-color: transparent;
-    background-image: none;
-    background-position: 0 0;
-  }
-  .jstree-default-responsive .jstree-file {
-    background: url("40px.png") 0 -160px no-repeat;
-    background-size: 120px 240px;
-  }
-  .jstree-default-responsive .jstree-folder {
-    background: url("40px.png") -40px -40px no-repeat;
-    background-size: 120px 240px;
-  }
-  .jstree-default-responsive > .jstree-container-ul > .jstree-node {
-    margin-left: 0;
-    margin-right: 0;
-  }
-}
diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/default/style.less b/public/ext/vakata-jstree-3.3.17/src/themes/default/style.less
deleted file mode 100644
index 88b6cab279..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/themes/default/style.less
+++ /dev/null
@@ -1,22 +0,0 @@
-/* jsTree default theme */
-@theme-name:				default;
-@hovered-bg-color:			#e7f4f9;
-@hovered-shadow-color:		#cccccc;
-@disabled-color:			#666666;
-@disabled-bg-color:			#efefef;
-@clicked-bg-color:			#beebff;
-@clicked-shadow-color:		#999999;
-@clicked-gradient-color-1:	#beebff;
-@clicked-gradient-color-2:	#a8e4ff;
-@search-result-color:		#8b0000;
-@mobile-wholerow-bg-color:	#ebebeb;
-@mobile-wholerow-shadow:	#666666;
-@mobile-wholerow-bordert:	rgba(255,255,255,0.7);
-@mobile-wholerow-borderb:	rgba(64,64,64,0.2);
-@responsive:				true;
-@image-path:				"";
-@base-height:				40px;
-
-@import "../mixins.less";
-@import "../base.less";
-@import "../main.less";
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/default/throbber.gif b/public/ext/vakata-jstree-3.3.17/src/themes/default/throbber.gif
deleted file mode 100644
index 5b33f7e54f4e55b6b8774d86d96895db9af044b4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1849
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

diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/main.less b/public/ext/vakata-jstree-3.3.17/src/themes/main.less
deleted file mode 100644
index d1aad79629..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/themes/main.less
+++ /dev/null
@@ -1,77 +0,0 @@
-.jstree-@{theme-name} {
-	.jstree-node,
-	.jstree-icon { background-repeat:no-repeat; background-color:transparent; }
-	.jstree-anchor,
-	.jstree-animated,
-	.jstree-wholerow { transition:background-color 0.15s, box-shadow 0.15s; }
-	.jstree-hovered { background:@hovered-bg-color; border-radius:2px; box-shadow:inset 0 0 1px @hovered-shadow-color; }
-	.jstree-context { background:@hovered-bg-color; border-radius:2px; box-shadow:inset 0 0 1px @hovered-shadow-color; }
-	.jstree-clicked { background:@clicked-bg-color; border-radius:2px; box-shadow:inset 0 0 1px @clicked-shadow-color; }
-	.jstree-no-icons .jstree-anchor > .jstree-themeicon { display:none; }
-	.jstree-disabled {
-		background:transparent; color:@disabled-color;
-		&.jstree-hovered { background:transparent; box-shadow:none; }
-		&.jstree-clicked { background:@disabled-bg-color; }
-		> .jstree-icon { opacity:0.8; filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ }
-	}
-	// search
-	.jstree-search { font-style:italic; color:@search-result-color; font-weight:bold; }
-	// checkboxes
-	.jstree-no-checkboxes .jstree-checkbox { display:none !important; }
-	&.jstree-checkbox-no-clicked {
-		.jstree-clicked {
-			background:transparent;
-			box-shadow:none;
-			&.jstree-hovered { background:@hovered-bg-color; }
-		}
-		> .jstree-wholerow-ul .jstree-wholerow-clicked {
-			background:transparent;
-			&.jstree-wholerow-hovered { background:@hovered-bg-color; }
-		}
-	}
-	// stripes
-	> .jstree-striped { min-width:100%; display:inline-block; background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat; }
-	// wholerow
-	> .jstree-wholerow-ul .jstree-hovered,
-	> .jstree-wholerow-ul .jstree-clicked { background:transparent; box-shadow:none; border-radius:0; }
-	.jstree-wholerow { -moz-box-sizing:border-box; -webkit-box-sizing:border-box; box-sizing:border-box; }
-	.jstree-wholerow-hovered { background:@hovered-bg-color; }
-	.jstree-wholerow-clicked { .gradient(@clicked-gradient-color-1, @clicked-gradient-color-2); }
-}
-
-// theme variants
-.jstree-@{theme-name} {
-	.jstree-theme(24px, "@{image-path}32px.png", 32px);
-	&.jstree-rtl .jstree-node { background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); }
-	&.jstree-rtl .jstree-last { background-image:none;  }
-}
-.jstree-@{theme-name}-small {
-	.jstree-theme(18px, "@{image-path}32px.png", 32px);
-	&.jstree-rtl .jstree-node { background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); }
-	&.jstree-rtl .jstree-last { background-image:none;  }
-}
-.jstree-@{theme-name}-large {
-	.jstree-theme(32px, "@{image-path}32px.png", 32px);
-	&.jstree-rtl .jstree-node { background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); }
-	&.jstree-rtl .jstree-last { background-image:none;  }
-}
-
-// mobile theme attempt
-@media (max-width: 768px) {
-	#jstree-dnd.jstree-dnd-responsive when (@responsive = true) {
-		line-height:@base-height; font-weight:bold; font-size:1.1em; text-shadow:1px 1px white;
-		> i { background:transparent; width:@base-height; height:@base-height; }
-		> .jstree-ok { background-image:url("@{image-path}@{base-height}.png"); background-position:0 -(@base-height * 5); background-size:(@base-height * 3) (@base-height * 6); }
-		> .jstree-er { background-image:url("@{image-path}@{base-height}.png"); background-position:-(@base-height * 1) -(@base-height * 5); background-size:(@base-height * 3) (@base-height * 6); }
-	}
-	#jstree-marker.jstree-dnd-responsive when (@responsive = true) {
-		border-left-width:10px;
-		border-top-width:10px;
-		border-bottom-width:10px;
-		margin-top:-10px;
-	}
-}
-
-.jstree-@{theme-name}-responsive when (@responsive = true) {
-	@import "responsive.less";
-}
diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/mixins.less b/public/ext/vakata-jstree-3.3.17/src/themes/mixins.less
deleted file mode 100644
index cd2dc6ae75..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/themes/mixins.less
+++ /dev/null
@@ -1,104 +0,0 @@
-.gradient (@color1; @color2) {
-	background:@color1;
-	background: -webkit-linear-gradient(top, @color1 0%,@color2 100%);
-	background: linear-gradient(to bottom, @color1 0%,@color2 100%);
-}
-
-.jstree-theme (@base-height, @image, @image-height) {
-	@correction: (@image-height - @base-height) / 2;
-
-	.jstree-node { min-height:@base-height; line-height:@base-height; margin-left:@base-height; min-width:@base-height; }
-	.jstree-anchor { line-height:@base-height; height:@base-height; }
-	.jstree-icon { width:@base-height; height:@base-height; line-height:@base-height; }
-	.jstree-icon:empty { width:@base-height; height:@base-height; line-height:@base-height; }
-	&.jstree-rtl .jstree-node { margin-right:@base-height; }
-	.jstree-wholerow { height:@base-height; }
-
-	.jstree-node,
-	.jstree-icon { background-image:url("@{image}"); }
-	.jstree-node { background-position:-(@image-height * 9 + @correction) -@correction; background-repeat:repeat-y; }
-	.jstree-last { background-image:none; }
-
-	.jstree-open > .jstree-ocl { background-position:-(@image-height * 4 + @correction) -@correction; }
-	.jstree-closed > .jstree-ocl { background-position:-(@image-height * 3 + @correction) -@correction; }
-	.jstree-leaf > .jstree-ocl { background-position:-(@image-height * 2 + @correction) -@correction; }
-
-	.jstree-themeicon { background-position:-(@image-height * 8 + @correction) -@correction; }
-
-	> .jstree-no-dots {
-		.jstree-node,
-		.jstree-leaf > .jstree-ocl { background:transparent; }
-		.jstree-open > .jstree-ocl { background-position:-(@image-height * 1 + @correction) -@correction; }
-		.jstree-closed > .jstree-ocl { background-position:-@correction -@correction; }
-	}
-
-	.jstree-disabled {
-		background:transparent;
-		&.jstree-hovered {
-			background:transparent;
-		}
-		&.jstree-clicked {
-			background:#efefef;
-		}
-	}
-
-	.jstree-checkbox {
-		background-position:-(@image-height * 5 + @correction) -@correction;
-		&:hover { background-position:-(@image-height * 5 + @correction) -(@image-height * 1 + @correction); }
-	}
-
-	&.jstree-checkbox-selection .jstree-clicked, .jstree-checked {
-		> .jstree-checkbox {
-			background-position:-(@image-height * 7 + @correction) -@correction;
-			&:hover { background-position:-(@image-height * 7 + @correction) -(@image-height * 1 + @correction); }
-		}
-	}
-	.jstree-anchor {
-		> .jstree-undetermined {
-			background-position:-(@image-height * 6 + @correction) -@correction;
-			&:hover {
-				background-position:-(@image-height * 6 + @correction) -(@image-height * 1 + @correction);
-			}
-		}
-	}
-	.jstree-checkbox-disabled { opacity:0.8; filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ }
-
-	> .jstree-striped { background-size:auto (@base-height * 2); }
-
-	&.jstree-rtl {
-		.jstree-node { background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat:repeat-y; }
-		.jstree-last { background-image:none; }
-		.jstree-open > .jstree-ocl { background-position:-(@image-height * 4 + @correction) -(@image-height * 1 + @correction); }
-		.jstree-closed > .jstree-ocl { background-position:-(@image-height * 3 + @correction) -(@image-height * 1 + @correction); }
-		.jstree-leaf > .jstree-ocl { background-position:-(@image-height * 2 + @correction) -(@image-height * 1 + @correction); }
-		> .jstree-no-dots {
-			.jstree-node,
-			.jstree-leaf > .jstree-ocl { background:transparent; }
-			.jstree-open > .jstree-ocl { background-position:-(@image-height * 1 + @correction) -(@image-height * 1 + @correction); }
-			.jstree-closed > .jstree-ocl { background-position:-@correction -(@image-height * 1 + @correction); }
-		}
-	}
-	.jstree-themeicon-custom { background-color:transparent; background-image:none; background-position:0 0; }
-
-	> .jstree-container-ul .jstree-loading > .jstree-ocl { background:url("@{image-path}throbber.gif") center center no-repeat; }
-
-	.jstree-file { background:url("@{image}") -(@image-height * 3 + @correction) -(@image-height * 2 + @correction) no-repeat; }
-	.jstree-folder { background:url("@{image}") -(@image-height * 8 + @correction) -(@correction) no-repeat; }
-
-	> .jstree-container-ul > .jstree-node { margin-left:0; margin-right:0; }
-
-	// drag'n'drop
-	#jstree-dnd& {
-		line-height:@base-height; padding:0 4px;
-		.jstree-ok,
-		.jstree-er { background-image:url("@{image-path}32px.png"); background-repeat:no-repeat; background-color:transparent; }
-		i { background:transparent; width:@base-height; height:@base-height; line-height:@base-height; }
-		.jstree-ok { background-position: -(@correction) -(@image-height * 2 + @correction); }
-		.jstree-er { background-position: -(@image-height * 1 + @correction) -(@image-height * 2 + @correction); }
-	}
-
-	// ellipsis
-	.jstree-ellipsis { overflow: hidden; }
-	// base height + PADDINGS!
-	.jstree-ellipsis .jstree-anchor { width: calc(100% ~"-" (@base-height + 5px)); text-overflow: ellipsis; overflow: hidden; }
-}
diff --git a/public/ext/vakata-jstree-3.3.17/src/themes/responsive.less b/public/ext/vakata-jstree-3.3.17/src/themes/responsive.less
deleted file mode 100644
index 5102b1b6b4..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/themes/responsive.less
+++ /dev/null
@@ -1,67 +0,0 @@
-@media (max-width: 768px) {
-	// background image
-	.jstree-icon { background-image:url("@{image-path}@{base-height}.png"); }
-
-	.jstree-node,
-	.jstree-leaf > .jstree-ocl { background:transparent; }
-
-	.jstree-node { min-height:@base-height; line-height:@base-height; margin-left:@base-height; min-width:@base-height; white-space:nowrap; }
-	.jstree-anchor { line-height:@base-height; height:@base-height; }
-	.jstree-icon, .jstree-icon:empty { width:@base-height; height:@base-height; line-height:@base-height; }
-
-	> .jstree-container-ul > .jstree-node { margin-left:0; }
-	&.jstree-rtl .jstree-node { margin-left:0; margin-right:@base-height; background:transparent; }
-	&.jstree-rtl .jstree-container-ul > .jstree-node { margin-right:0; }
-
-	.jstree-ocl,
-	.jstree-themeicon,
-	.jstree-checkbox { background-size:(@base-height * 3) (@base-height * 6); }
-	.jstree-leaf > .jstree-ocl,
-	&.jstree-rtl .jstree-leaf > .jstree-ocl { background:transparent; }
-	.jstree-open > .jstree-ocl { background-position:0 0 !important; }
-	.jstree-closed > .jstree-ocl { background-position:0 -(@base-height * 1) !important; }
-	&.jstree-rtl .jstree-closed > .jstree-ocl { background-position:-(@base-height * 1) 0 !important; }
-
-	.jstree-themeicon { background-position:-(@base-height * 1) -(@base-height * 1); }
-
-	.jstree-checkbox, .jstree-checkbox:hover { background-position:-(@base-height * 1) -(@base-height * 2); }
-	&.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
-	&.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
-	.jstree-checked > .jstree-checkbox,
-	.jstree-checked > .jstree-checkbox:hover { background-position:0 -(@base-height * 2); }
-	.jstree-anchor > .jstree-undetermined, .jstree-anchor > .jstree-undetermined:hover { background-position:0 -(@base-height * 3); }
-
-	.jstree-anchor { font-weight:bold; font-size:1.1em; text-shadow:1px 1px white; }
-
-	> .jstree-striped { background:transparent; }
-	.jstree-wholerow { border-top:1px solid @mobile-wholerow-bordert; border-bottom:1px solid @mobile-wholerow-borderb; background:@mobile-wholerow-bg-color; height:@base-height; }
-	.jstree-wholerow-hovered { background:@hovered-bg-color; }
-	.jstree-wholerow-clicked { background:@clicked-bg-color; }
-
-	// thanks to PHOTONUI
-	.jstree-children .jstree-last > .jstree-wholerow { box-shadow: inset 0 -6px 3px -5px @mobile-wholerow-shadow; }
-	.jstree-children .jstree-open > .jstree-wholerow { box-shadow: inset 0 6px 3px -5px @mobile-wholerow-shadow; border-top:0; }
-	.jstree-children .jstree-open + .jstree-open { box-shadow:none; }
-
-	// experiment
-	.jstree-node,
-	.jstree-icon,
-	.jstree-node > .jstree-ocl,
-	.jstree-themeicon,
-	.jstree-checkbox { background-image:url("@{image-path}@{base-height}.png"); background-size:(@base-height * 3) (@base-height * 6); }
-
-	.jstree-node { background-position:-(@base-height * 2) 0; background-repeat:repeat-y; }
-	.jstree-last { background-image:none; }
-	.jstree-leaf > .jstree-ocl { background-position:-(@base-height * 1) -(@base-height * 3); }
-	.jstree-last > .jstree-ocl { background-position:-(@base-height * 1) -(@base-height * 4); }
-	/*
-	.jstree-open > .jstree-ocl,
-	.jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; }
-	*/
-
-	.jstree-themeicon-custom { background-color:transparent; background-image:none; background-position:0 0; }
-	.jstree-file { background:url("@{image-path}@{base-height}.png") 0 -(@base-height * 4) no-repeat; background-size:(@base-height * 3) (@base-height * 6); }
-	.jstree-folder { background:url("@{image-path}@{base-height}.png") -(@base-height * 1) -(@base-height * 1) no-repeat; background-size:(@base-height * 3) (@base-height * 6); }
-
-	> .jstree-container-ul > .jstree-node { margin-left:0; margin-right:0; }
-}
diff --git a/public/ext/vakata-jstree-3.3.17/src/vakata-jstree.js b/public/ext/vakata-jstree-3.3.17/src/vakata-jstree.js
deleted file mode 100644
index b198110dd0..0000000000
--- a/public/ext/vakata-jstree-3.3.17/src/vakata-jstree.js
+++ /dev/null
@@ -1,38 +0,0 @@
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define('jstree.checkbox', ['jquery','./jstree.js'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'), require('./jstree.js'));
-	}
-	else {
-		factory(jQuery);
-	}
-}(function ($, undefined) {
-	"use strict";
-	if(window.customElements && Object && Object.create) {
-		var proto = Object.create(HTMLElement.prototype);
-		proto.createdCallback = function () {
-			var c = { core : {}, plugins : [] }, i;
-			for(i in $.jstree.plugins) {
-				if($.jstree.plugins.hasOwnProperty(i) && this.attributes[i]) {
-					c.plugins.push(i);
-					if(this.getAttribute(i) && JSON.parse(this.getAttribute(i))) {
-						c[i] = JSON.parse(this.getAttribute(i));
-					}
-				}
-			}
-			for(i in $.jstree.defaults.core) {
-				if($.jstree.defaults.core.hasOwnProperty(i) && this.attributes[i]) {
-					c.core[i] = JSON.parse(this.getAttribute(i)) || this.getAttribute(i);
-				}
-			}
-			$(this).jstree(c);
-		};
-		// proto.attributeChangedCallback = function (name, previous, value) { };
-		try {
-			window.customElements.define("vakata-jstree", function() {}, { prototype: proto });
-		} catch (ignore) { }
-	}
-}));
diff --git a/public/ext/vakata-jstree-3.3.17/test/unit/index.html b/public/ext/vakata-jstree-3.3.17/test/unit/index.html
deleted file mode 100644
index 3f8ca95234..0000000000
--- a/public/ext/vakata-jstree-3.3.17/test/unit/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta charset="utf-8">
-  <title>Basic Test Suite</title>
-  <!-- Load local QUnit. -->
-  <link rel="stylesheet" href="libs/qunit.css" media="screen">
-  <script src="libs/qunit.js"></script>
-</head>
-<body>
-  <div id="qunit"></div>
-  <div id="qunit-fixture">this had better work.</div>
-  <!-- Load local lib and tests. -->
-  <script src="test.js"></script>
-</body>
-</html>
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/test/unit/libs/qunit.css b/public/ext/vakata-jstree-3.3.17/test/unit/libs/qunit.css
deleted file mode 100644
index 2a6a02bf50..0000000000
--- a/public/ext/vakata-jstree-3.3.17/test/unit/libs/qunit.css
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
- * QUnit v1.12.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-/** Font Family and Sizes */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
-  font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
-}
-
-#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
-#qunit-tests { font-size: smaller; }
-
-
-/** Resets */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
-  margin: 0;
-  padding: 0;
-}
-
-
-/** Header */
-
-#qunit-header {
-  padding: 0.5em 0 0.5em 1em;
-
-  color: #8699a4;
-  background-color: #0d3349;
-
-  font-size: 1.5em;
-  line-height: 1em;
-  font-weight: normal;
-
-  border-radius: 5px 5px 0 0;
-  -moz-border-radius: 5px 5px 0 0;
-  -webkit-border-top-right-radius: 5px;
-  -webkit-border-top-left-radius: 5px;
-}
-
-#qunit-header a {
-  text-decoration: none;
-  color: #c2ccd1;
-}
-
-#qunit-header a:hover,
-#qunit-header a:focus {
-  color: #fff;
-}
-
-#qunit-testrunner-toolbar label {
-  display: inline-block;
-  padding: 0 .5em 0 .1em;
-}
-
-#qunit-banner {
-  height: 5px;
-}
-
-#qunit-testrunner-toolbar {
-  padding: 0.5em 0 0.5em 2em;
-  color: #5E740B;
-  background-color: #eee;
-  overflow: hidden;
-}
-
-#qunit-userAgent {
-  padding: 0.5em 0 0.5em 2.5em;
-  background-color: #2b81af;
-  color: #fff;
-  text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
-}
-
-#qunit-modulefilter-container {
-  float: right;
-}
-
-/** Tests: Pass/Fail */
-
-#qunit-tests {
-  list-style-position: inside;
-}
-
-#qunit-tests li {
-  padding: 0.4em 0.5em 0.4em 2.5em;
-  border-bottom: 1px solid #fff;
-  list-style-position: inside;
-}
-
-#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {
-  display: none;
-}
-
-#qunit-tests li strong {
-  cursor: pointer;
-}
-
-#qunit-tests li a {
-  padding: 0.5em;
-  color: #c2ccd1;
-  text-decoration: none;
-}
-#qunit-tests li a:hover,
-#qunit-tests li a:focus {
-  color: #000;
-}
-
-#qunit-tests li .runtime {
-  float: right;
-  font-size: smaller;
-}
-
-.qunit-assert-list {
-  margin-top: 0.5em;
-  padding: 0.5em;
-
-  background-color: #fff;
-
-  border-radius: 5px;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-}
-
-.qunit-collapsed {
-  display: none;
-}
-
-#qunit-tests table {
-  border-collapse: collapse;
-  margin-top: .2em;
-}
-
-#qunit-tests th {
-  text-align: right;
-  vertical-align: top;
-  padding: 0 .5em 0 0;
-}
-
-#qunit-tests td {
-  vertical-align: top;
-}
-
-#qunit-tests pre {
-  margin: 0;
-  white-space: pre-wrap;
-  word-wrap: break-word;
-}
-
-#qunit-tests del {
-  background-color: #e0f2be;
-  color: #374e0c;
-  text-decoration: none;
-}
-
-#qunit-tests ins {
-  background-color: #ffcaca;
-  color: #500;
-  text-decoration: none;
-}
-
-/*** Test Counts */
-
-#qunit-tests b.counts                       { color: black; }
-#qunit-tests b.passed                       { color: #5E740B; }
-#qunit-tests b.failed                       { color: #710909; }
-
-#qunit-tests li li {
-  padding: 5px;
-  background-color: #fff;
-  border-bottom: none;
-  list-style-position: inside;
-}
-
-/*** Passing Styles */
-
-#qunit-tests li li.pass {
-  color: #3c510c;
-  background-color: #fff;
-  border-left: 10px solid #C6E746;
-}
-
-#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
-#qunit-tests .pass .test-name               { color: #366097; }
-
-#qunit-tests .pass .test-actual,
-#qunit-tests .pass .test-expected           { color: #999999; }
-
-#qunit-banner.qunit-pass                    { background-color: #C6E746; }
-
-/*** Failing Styles */
-
-#qunit-tests li li.fail {
-  color: #710909;
-  background-color: #fff;
-  border-left: 10px solid #EE5757;
-  white-space: pre;
-}
-
-#qunit-tests > li:last-child {
-  border-radius: 0 0 5px 5px;
-  -moz-border-radius: 0 0 5px 5px;
-  -webkit-border-bottom-right-radius: 5px;
-  -webkit-border-bottom-left-radius: 5px;
-}
-
-#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }
-#qunit-tests .fail .test-name,
-#qunit-tests .fail .module-name             { color: #000000; }
-
-#qunit-tests .fail .test-actual             { color: #EE5757; }
-#qunit-tests .fail .test-expected           { color: green;   }
-
-#qunit-banner.qunit-fail                    { background-color: #EE5757; }
-
-
-/** Result */
-
-#qunit-testresult {
-  padding: 0.5em 0.5em 0.5em 2.5em;
-
-  color: #2b81af;
-  background-color: #D2E0E6;
-
-  border-bottom: 1px solid white;
-}
-#qunit-testresult .module-name {
-  font-weight: bold;
-}
-
-/** Fixture */
-
-#qunit-fixture {
-  position: absolute;
-  top: -10000px;
-  left: -10000px;
-  width: 1000px;
-  height: 1000px;
-}
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/test/unit/libs/qunit.js b/public/ext/vakata-jstree-3.3.17/test/unit/libs/qunit.js
deleted file mode 100644
index ba99f1ab00..0000000000
--- a/public/ext/vakata-jstree-3.3.17/test/unit/libs/qunit.js
+++ /dev/null
@@ -1,2212 +0,0 @@
-/**
- * QUnit v1.12.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2013 jQuery Foundation and other contributors
- * Released under the MIT license.
- * https://jquery.org/license/
- */
-
-(function( window ) {
-
-var QUnit,
-  assert,
-  config,
-  onErrorFnPrev,
-  testId = 0,
-  fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
-  toString = Object.prototype.toString,
-  hasOwn = Object.prototype.hasOwnProperty,
-  // Keep a local reference to Date (GH-283)
-  Date = window.Date,
-  setTimeout = window.setTimeout,
-  defined = {
-    setTimeout: typeof window.setTimeout !== "undefined",
-    sessionStorage: (function() {
-      var x = "qunit-test-string";
-      try {
-        sessionStorage.setItem( x, x );
-        sessionStorage.removeItem( x );
-        return true;
-      } catch( e ) {
-        return false;
-      }
-    }())
-  },
-  /**
-   * Provides a normalized error string, correcting an issue
-   * with IE 7 (and prior) where Error.prototype.toString is
-   * not properly implemented
-   *
-   * Based on http://es5.github.com/#x15.11.4.4
-   *
-   * @param {String|Error} error
-   * @return {String} error message
-   */
-  errorString = function( error ) {
-    var name, message,
-      errorString = error.toString();
-    if ( errorString.substring( 0, 7 ) === "[object" ) {
-      name = error.name ? error.name.toString() : "Error";
-      message = error.message ? error.message.toString() : "";
-      if ( name && message ) {
-        return name + ": " + message;
-      } else if ( name ) {
-        return name;
-      } else if ( message ) {
-        return message;
-      } else {
-        return "Error";
-      }
-    } else {
-      return errorString;
-    }
-  },
-  /**
-   * Makes a clone of an object using only Array or Object as base,
-   * and copies over the own enumerable properties.
-   *
-   * @param {Object} obj
-   * @return {Object} New object with only the own properties (recursively).
-   */
-  objectValues = function( obj ) {
-    // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
-    /*jshint newcap: false */
-    var key, val,
-      vals = QUnit.is( "array", obj ) ? [] : {};
-    for ( key in obj ) {
-      if ( hasOwn.call( obj, key ) ) {
-        val = obj[key];
-        vals[key] = val === Object(val) ? objectValues(val) : val;
-      }
-    }
-    return vals;
-  };
-
-function Test( settings ) {
-  extend( this, settings );
-  this.assertions = [];
-  this.testNumber = ++Test.count;
-}
-
-Test.count = 0;
-
-Test.prototype = {
-  init: function() {
-    var a, b, li,
-      tests = id( "qunit-tests" );
-
-    if ( tests ) {
-      b = document.createElement( "strong" );
-      b.innerHTML = this.nameHtml;
-
-      // `a` initialized at top of scope
-      a = document.createElement( "a" );
-      a.innerHTML = "Rerun";
-      a.href = QUnit.url({ testNumber: this.testNumber });
-
-      li = document.createElement( "li" );
-      li.appendChild( b );
-      li.appendChild( a );
-      li.className = "running";
-      li.id = this.id = "qunit-test-output" + testId++;
-
-      tests.appendChild( li );
-    }
-  },
-  setup: function() {
-    if (
-      // Emit moduleStart when we're switching from one module to another
-      this.module !== config.previousModule ||
-        // They could be equal (both undefined) but if the previousModule property doesn't
-        // yet exist it means this is the first test in a suite that isn't wrapped in a
-        // module, in which case we'll just emit a moduleStart event for 'undefined'.
-        // Without this, reporters can get testStart before moduleStart  which is a problem.
-        !hasOwn.call( config, "previousModule" )
-    ) {
-      if ( hasOwn.call( config, "previousModule" ) ) {
-        runLoggingCallbacks( "moduleDone", QUnit, {
-          name: config.previousModule,
-          failed: config.moduleStats.bad,
-          passed: config.moduleStats.all - config.moduleStats.bad,
-          total: config.moduleStats.all
-        });
-      }
-      config.previousModule = this.module;
-      config.moduleStats = { all: 0, bad: 0 };
-      runLoggingCallbacks( "moduleStart", QUnit, {
-        name: this.module
-      });
-    }
-
-    config.current = this;
-
-    this.testEnvironment = extend({
-      setup: function() {},
-      teardown: function() {}
-    }, this.moduleTestEnvironment );
-
-    this.started = +new Date();
-    runLoggingCallbacks( "testStart", QUnit, {
-      name: this.testName,
-      module: this.module
-    });
-
-    /*jshint camelcase:false */
-
-
-    /**
-     * Expose the current test environment.
-     *
-     * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead.
-     */
-    QUnit.current_testEnvironment = this.testEnvironment;
-
-    /*jshint camelcase:true */
-
-    if ( !config.pollution ) {
-      saveGlobal();
-    }
-    if ( config.notrycatch ) {
-      this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-      return;
-    }
-    try {
-      this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-    } catch( e ) {
-      QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-    }
-  },
-  run: function() {
-    config.current = this;
-
-    var running = id( "qunit-testresult" );
-
-    if ( running ) {
-      running.innerHTML = "Running: <br/>" + this.nameHtml;
-    }
-
-    if ( this.async ) {
-      QUnit.stop();
-    }
-
-    this.callbackStarted = +new Date();
-
-    if ( config.notrycatch ) {
-      this.callback.call( this.testEnvironment, QUnit.assert );
-      this.callbackRuntime = +new Date() - this.callbackStarted;
-      return;
-    }
-
-    try {
-      this.callback.call( this.testEnvironment, QUnit.assert );
-      this.callbackRuntime = +new Date() - this.callbackStarted;
-    } catch( e ) {
-      this.callbackRuntime = +new Date() - this.callbackStarted;
-
-      QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
-      // else next test will carry the responsibility
-      saveGlobal();
-
-      // Restart the tests if they're blocking
-      if ( config.blocking ) {
-        QUnit.start();
-      }
-    }
-  },
-  teardown: function() {
-    config.current = this;
-    if ( config.notrycatch ) {
-      if ( typeof this.callbackRuntime === "undefined" ) {
-        this.callbackRuntime = +new Date() - this.callbackStarted;
-      }
-      this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-      return;
-    } else {
-      try {
-        this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-      } catch( e ) {
-        QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-      }
-    }
-    checkPollution();
-  },
-  finish: function() {
-    config.current = this;
-    if ( config.requireExpects && this.expected === null ) {
-      QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
-    } else if ( this.expected !== null && this.expected !== this.assertions.length ) {
-      QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
-    } else if ( this.expected === null && !this.assertions.length ) {
-      QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
-    }
-
-    var i, assertion, a, b, time, li, ol,
-      test = this,
-      good = 0,
-      bad = 0,
-      tests = id( "qunit-tests" );
-
-    this.runtime = +new Date() - this.started;
-    config.stats.all += this.assertions.length;
-    config.moduleStats.all += this.assertions.length;
-
-    if ( tests ) {
-      ol = document.createElement( "ol" );
-      ol.className = "qunit-assert-list";
-
-      for ( i = 0; i < this.assertions.length; i++ ) {
-        assertion = this.assertions[i];
-
-        li = document.createElement( "li" );
-        li.className = assertion.result ? "pass" : "fail";
-        li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" );
-        ol.appendChild( li );
-
-        if ( assertion.result ) {
-          good++;
-        } else {
-          bad++;
-          config.stats.bad++;
-          config.moduleStats.bad++;
-        }
-      }
-
-      // store result when possible
-      if ( QUnit.config.reorder && defined.sessionStorage ) {
-        if ( bad ) {
-          sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad );
-        } else {
-          sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName );
-        }
-      }
-
-      if ( bad === 0 ) {
-        addClass( ol, "qunit-collapsed" );
-      }
-
-      // `b` initialized at top of scope
-      b = document.createElement( "strong" );
-      b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
-
-      addEvent(b, "click", function() {
-        var next = b.parentNode.lastChild,
-          collapsed = hasClass( next, "qunit-collapsed" );
-        ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
-      });
-
-      addEvent(b, "dblclick", function( e ) {
-        var target = e && e.target ? e.target : window.event.srcElement;
-        if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
-          target = target.parentNode;
-        }
-        if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
-          window.location = QUnit.url({ testNumber: test.testNumber });
-        }
-      });
-
-      // `time` initialized at top of scope
-      time = document.createElement( "span" );
-      time.className = "runtime";
-      time.innerHTML = this.runtime + " ms";
-
-      // `li` initialized at top of scope
-      li = id( this.id );
-      li.className = bad ? "fail" : "pass";
-      li.removeChild( li.firstChild );
-      a = li.firstChild;
-      li.appendChild( b );
-      li.appendChild( a );
-      li.appendChild( time );
-      li.appendChild( ol );
-
-    } else {
-      for ( i = 0; i < this.assertions.length; i++ ) {
-        if ( !this.assertions[i].result ) {
-          bad++;
-          config.stats.bad++;
-          config.moduleStats.bad++;
-        }
-      }
-    }
-
-    runLoggingCallbacks( "testDone", QUnit, {
-      name: this.testName,
-      module: this.module,
-      failed: bad,
-      passed: this.assertions.length - bad,
-      total: this.assertions.length,
-      duration: this.runtime
-    });
-
-    QUnit.reset();
-
-    config.current = undefined;
-  },
-
-  queue: function() {
-    var bad,
-      test = this;
-
-    synchronize(function() {
-      test.init();
-    });
-    function run() {
-      // each of these can by async
-      synchronize(function() {
-        test.setup();
-      });
-      synchronize(function() {
-        test.run();
-      });
-      synchronize(function() {
-        test.teardown();
-      });
-      synchronize(function() {
-        test.finish();
-      });
-    }
-
-    // `bad` initialized at top of scope
-    // defer when previous test run passed, if storage is available
-    bad = QUnit.config.reorder && defined.sessionStorage &&
-            +sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );
-
-    if ( bad ) {
-      run();
-    } else {
-      synchronize( run, true );
-    }
-  }
-};
-
-// Root QUnit object.
-// `QUnit` initialized at top of scope
-QUnit = {
-
-  // call on start of module test to prepend name to all tests
-  module: function( name, testEnvironment ) {
-    config.currentModule = name;
-    config.currentModuleTestEnvironment = testEnvironment;
-    config.modules[name] = true;
-  },
-
-  asyncTest: function( testName, expected, callback ) {
-    if ( arguments.length === 2 ) {
-      callback = expected;
-      expected = null;
-    }
-
-    QUnit.test( testName, expected, callback, true );
-  },
-
-  test: function( testName, expected, callback, async ) {
-    var test,
-      nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
-
-    if ( arguments.length === 2 ) {
-      callback = expected;
-      expected = null;
-    }
-
-    if ( config.currentModule ) {
-      nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
-    }
-
-    test = new Test({
-      nameHtml: nameHtml,
-      testName: testName,
-      expected: expected,
-      async: async,
-      callback: callback,
-      module: config.currentModule,
-      moduleTestEnvironment: config.currentModuleTestEnvironment,
-      stack: sourceFromStacktrace( 2 )
-    });
-
-    if ( !validTest( test ) ) {
-      return;
-    }
-
-    test.queue();
-  },
-
-  // Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
-  expect: function( asserts ) {
-    if (arguments.length === 1) {
-      config.current.expected = asserts;
-    } else {
-      return config.current.expected;
-    }
-  },
-
-  start: function( count ) {
-    // QUnit hasn't been initialized yet.
-    // Note: RequireJS (et al) may delay onLoad
-    if ( config.semaphore === undefined ) {
-      QUnit.begin(function() {
-        // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
-        setTimeout(function() {
-          QUnit.start( count );
-        });
-      });
-      return;
-    }
-
-    config.semaphore -= count || 1;
-    // don't start until equal number of stop-calls
-    if ( config.semaphore > 0 ) {
-      return;
-    }
-    // ignore if start is called more often then stop
-    if ( config.semaphore < 0 ) {
-      config.semaphore = 0;
-      QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
-      return;
-    }
-    // A slight delay, to avoid any current callbacks
-    if ( defined.setTimeout ) {
-      setTimeout(function() {
-        if ( config.semaphore > 0 ) {
-          return;
-        }
-        if ( config.timeout ) {
-          clearTimeout( config.timeout );
-        }
-
-        config.blocking = false;
-        process( true );
-      }, 13);
-    } else {
-      config.blocking = false;
-      process( true );
-    }
-  },
-
-  stop: function( count ) {
-    config.semaphore += count || 1;
-    config.blocking = true;
-
-    if ( config.testTimeout && defined.setTimeout ) {
-      clearTimeout( config.timeout );
-      config.timeout = setTimeout(function() {
-        QUnit.ok( false, "Test timed out" );
-        config.semaphore = 1;
-        QUnit.start();
-      }, config.testTimeout );
-    }
-  }
-};
-
-// `assert` initialized at top of scope
-// Assert helpers
-// All of these must either call QUnit.push() or manually do:
-// - runLoggingCallbacks( "log", .. );
-// - config.current.assertions.push({ .. });
-// We attach it to the QUnit object *after* we expose the public API,
-// otherwise `assert` will become a global variable in browsers (#341).
-assert = {
-  /**
-   * Asserts rough true-ish result.
-   * @name ok
-   * @function
-   * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
-   */
-  ok: function( result, msg ) {
-    if ( !config.current ) {
-      throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
-    }
-    result = !!result;
-    msg = msg || (result ? "okay" : "failed" );
-
-    var source,
-      details = {
-        module: config.current.module,
-        name: config.current.testName,
-        result: result,
-        message: msg
-      };
-
-    msg = "<span class='test-message'>" + escapeText( msg ) + "</span>";
-
-    if ( !result ) {
-      source = sourceFromStacktrace( 2 );
-      if ( source ) {
-        details.source = source;
-        msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr></table>";
-      }
-    }
-    runLoggingCallbacks( "log", QUnit, details );
-    config.current.assertions.push({
-      result: result,
-      message: msg
-    });
-  },
-
-  /**
-   * Assert that the first two arguments are equal, with an optional message.
-   * Prints out both actual and expected values.
-   * @name equal
-   * @function
-   * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
-   */
-  equal: function( actual, expected, message ) {
-    /*jshint eqeqeq:false */
-    QUnit.push( expected == actual, actual, expected, message );
-  },
-
-  /**
-   * @name notEqual
-   * @function
-   */
-  notEqual: function( actual, expected, message ) {
-    /*jshint eqeqeq:false */
-    QUnit.push( expected != actual, actual, expected, message );
-  },
-
-  /**
-   * @name propEqual
-   * @function
-   */
-  propEqual: function( actual, expected, message ) {
-    actual = objectValues(actual);
-    expected = objectValues(expected);
-    QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-  },
-
-  /**
-   * @name notPropEqual
-   * @function
-   */
-  notPropEqual: function( actual, expected, message ) {
-    actual = objectValues(actual);
-    expected = objectValues(expected);
-    QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-  },
-
-  /**
-   * @name deepEqual
-   * @function
-   */
-  deepEqual: function( actual, expected, message ) {
-    QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-  },
-
-  /**
-   * @name notDeepEqual
-   * @function
-   */
-  notDeepEqual: function( actual, expected, message ) {
-    QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-  },
-
-  /**
-   * @name strictEqual
-   * @function
-   */
-  strictEqual: function( actual, expected, message ) {
-    QUnit.push( expected === actual, actual, expected, message );
-  },
-
-  /**
-   * @name notStrictEqual
-   * @function
-   */
-  notStrictEqual: function( actual, expected, message ) {
-    QUnit.push( expected !== actual, actual, expected, message );
-  },
-
-  "throws": function( block, expected, message ) {
-    var actual,
-      expectedOutput = expected,
-      ok = false;
-
-    // 'expected' is optional
-    if ( typeof expected === "string" ) {
-      message = expected;
-      expected = null;
-    }
-
-    config.current.ignoreGlobalErrors = true;
-    try {
-      block.call( config.current.testEnvironment );
-    } catch (e) {
-      actual = e;
-    }
-    config.current.ignoreGlobalErrors = false;
-
-    if ( actual ) {
-      // we don't want to validate thrown error
-      if ( !expected ) {
-        ok = true;
-        expectedOutput = null;
-      // expected is a regexp
-      } else if ( QUnit.objectType( expected ) === "regexp" ) {
-        ok = expected.test( errorString( actual ) );
-      // expected is a constructor
-      } else if ( actual instanceof expected ) {
-        ok = true;
-      // expected is a validation function which returns true is validation passed
-      } else if ( expected.call( {}, actual ) === true ) {
-        expectedOutput = null;
-        ok = true;
-      }
-
-      QUnit.push( ok, actual, expectedOutput, message );
-    } else {
-      QUnit.pushFailure( message, null, "No exception was thrown." );
-    }
-  }
-};
-
-/**
- * @deprecated since 1.8.0
- * Kept assertion helpers in root for backwards compatibility.
- */
-extend( QUnit, assert );
-
-/**
- * @deprecated since 1.9.0
- * Kept root "raises()" for backwards compatibility.
- * (Note that we don't introduce assert.raises).
- */
-QUnit.raises = assert[ "throws" ];
-
-/**
- * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
- * Kept to avoid TypeErrors for undefined methods.
- */
-QUnit.equals = function() {
-  QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
-};
-QUnit.same = function() {
-  QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" );
-};
-
-// We want access to the constructor's prototype
-(function() {
-  function F() {}
-  F.prototype = QUnit;
-  QUnit = new F();
-  // Make F QUnit's constructor so that we can add to the prototype later
-  QUnit.constructor = F;
-}());
-
-/**
- * Config object: Maintain internal state
- * Later exposed as QUnit.config
- * `config` initialized at top of scope
- */
-config = {
-  // The queue of tests to run
-  queue: [],
-
-  // block until document ready
-  blocking: true,
-
-  // when enabled, show only failing tests
-  // gets persisted through sessionStorage and can be changed in UI via checkbox
-  hidepassed: false,
-
-  // by default, run previously failed tests first
-  // very useful in combination with "Hide passed tests" checked
-  reorder: true,
-
-  // by default, modify document.title when suite is done
-  altertitle: true,
-
-  // when enabled, all tests must call expect()
-  requireExpects: false,
-
-  // add checkboxes that are persisted in the query-string
-  // when enabled, the id is set to `true` as a `QUnit.config` property
-  urlConfig: [
-    {
-      id: "noglobals",
-      label: "Check for Globals",
-      tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
-    },
-    {
-      id: "notrycatch",
-      label: "No try-catch",
-      tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
-    }
-  ],
-
-  // Set of all modules.
-  modules: {},
-
-  // logging callback queues
-  begin: [],
-  done: [],
-  log: [],
-  testStart: [],
-  testDone: [],
-  moduleStart: [],
-  moduleDone: []
-};
-
-// Export global variables, unless an 'exports' object exists,
-// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
-if ( typeof exports === "undefined" ) {
-  extend( window, QUnit.constructor.prototype );
-
-  // Expose QUnit object
-  window.QUnit = QUnit;
-}
-
-// Initialize more QUnit.config and QUnit.urlParams
-(function() {
-  var i,
-    location = window.location || { search: "", protocol: "file:" },
-    params = location.search.slice( 1 ).split( "&" ),
-    length = params.length,
-    urlParams = {},
-    current;
-
-  if ( params[ 0 ] ) {
-    for ( i = 0; i < length; i++ ) {
-      current = params[ i ].split( "=" );
-      current[ 0 ] = decodeURIComponent( current[ 0 ] );
-      // allow just a key to turn on a flag, e.g., test.html?noglobals
-      current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
-      urlParams[ current[ 0 ] ] = current[ 1 ];
-    }
-  }
-
-  QUnit.urlParams = urlParams;
-
-  // String search anywhere in moduleName+testName
-  config.filter = urlParams.filter;
-
-  // Exact match of the module name
-  config.module = urlParams.module;
-
-  config.testNumber = parseInt( urlParams.testNumber, 10 ) || null;
-
-  // Figure out if we're running the tests from a server or not
-  QUnit.isLocal = location.protocol === "file:";
-}());
-
-// Extend QUnit object,
-// these after set here because they should not be exposed as global functions
-extend( QUnit, {
-  assert: assert,
-
-  config: config,
-
-  // Initialize the configuration options
-  init: function() {
-    extend( config, {
-      stats: { all: 0, bad: 0 },
-      moduleStats: { all: 0, bad: 0 },
-      started: +new Date(),
-      updateRate: 1000,
-      blocking: false,
-      autostart: true,
-      autorun: false,
-      filter: "",
-      queue: [],
-      semaphore: 1
-    });
-
-    var tests, banner, result,
-      qunit = id( "qunit" );
-
-    if ( qunit ) {
-      qunit.innerHTML =
-        "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
-        "<h2 id='qunit-banner'></h2>" +
-        "<div id='qunit-testrunner-toolbar'></div>" +
-        "<h2 id='qunit-userAgent'></h2>" +
-        "<ol id='qunit-tests'></ol>";
-    }
-
-    tests = id( "qunit-tests" );
-    banner = id( "qunit-banner" );
-    result = id( "qunit-testresult" );
-
-    if ( tests ) {
-      tests.innerHTML = "";
-    }
-
-    if ( banner ) {
-      banner.className = "";
-    }
-
-    if ( result ) {
-      result.parentNode.removeChild( result );
-    }
-
-    if ( tests ) {
-      result = document.createElement( "p" );
-      result.id = "qunit-testresult";
-      result.className = "result";
-      tests.parentNode.insertBefore( result, tests );
-      result.innerHTML = "Running...<br/>&nbsp;";
-    }
-  },
-
-  // Resets the test setup. Useful for tests that modify the DOM.
-  /*
-  DEPRECATED: Use multiple tests instead of resetting inside a test.
-  Use testStart or testDone for custom cleanup.
-  This method will throw an error in 2.0, and will be removed in 2.1
-  */
-  reset: function() {
-    var fixture = id( "qunit-fixture" );
-    if ( fixture ) {
-      fixture.innerHTML = config.fixture;
-    }
-  },
-
-  // Trigger an event on an element.
-  // @example triggerEvent( document.body, "click" );
-  triggerEvent: function( elem, type, event ) {
-    if ( document.createEvent ) {
-      event = document.createEvent( "MouseEvents" );
-      event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
-        0, 0, 0, 0, 0, false, false, false, false, 0, null);
-
-      elem.dispatchEvent( event );
-    } else if ( elem.fireEvent ) {
-      elem.fireEvent( "on" + type );
-    }
-  },
-
-  // Safe object type checking
-  is: function( type, obj ) {
-    return QUnit.objectType( obj ) === type;
-  },
-
-  objectType: function( obj ) {
-    if ( typeof obj === "undefined" ) {
-        return "undefined";
-    // consider: typeof null === object
-    }
-    if ( obj === null ) {
-        return "null";
-    }
-
-    var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
-      type = match && match[1] || "";
-
-    switch ( type ) {
-      case "Number":
-        if ( isNaN(obj) ) {
-          return "nan";
-        }
-        return "number";
-      case "String":
-      case "Boolean":
-      case "Array":
-      case "Date":
-      case "RegExp":
-      case "Function":
-        return type.toLowerCase();
-    }
-    if ( typeof obj === "object" ) {
-      return "object";
-    }
-    return undefined;
-  },
-
-  push: function( result, actual, expected, message ) {
-    if ( !config.current ) {
-      throw new Error( "assertion outside test context, was " + sourceFromStacktrace() );
-    }
-
-    var output, source,
-      details = {
-        module: config.current.module,
-        name: config.current.testName,
-        result: result,
-        message: message,
-        actual: actual,
-        expected: expected
-      };
-
-    message = escapeText( message ) || ( result ? "okay" : "failed" );
-    message = "<span class='test-message'>" + message + "</span>";
-    output = message;
-
-    if ( !result ) {
-      expected = escapeText( QUnit.jsDump.parse(expected) );
-      actual = escapeText( QUnit.jsDump.parse(actual) );
-      output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
-
-      if ( actual !== expected ) {
-        output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
-        output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
-      }
-
-      source = sourceFromStacktrace();
-
-      if ( source ) {
-        details.source = source;
-        output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-      }
-
-      output += "</table>";
-    }
-
-    runLoggingCallbacks( "log", QUnit, details );
-
-    config.current.assertions.push({
-      result: !!result,
-      message: output
-    });
-  },
-
-  pushFailure: function( message, source, actual ) {
-    if ( !config.current ) {
-      throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
-    }
-
-    var output,
-      details = {
-        module: config.current.module,
-        name: config.current.testName,
-        result: false,
-        message: message
-      };
-
-    message = escapeText( message ) || "error";
-    message = "<span class='test-message'>" + message + "</span>";
-    output = message;
-
-    output += "<table>";
-
-    if ( actual ) {
-      output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
-    }
-
-    if ( source ) {
-      details.source = source;
-      output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-    }
-
-    output += "</table>";
-
-    runLoggingCallbacks( "log", QUnit, details );
-
-    config.current.assertions.push({
-      result: false,
-      message: output
-    });
-  },
-
-  url: function( params ) {
-    params = extend( extend( {}, QUnit.urlParams ), params );
-    var key,
-      querystring = "?";
-
-    for ( key in params ) {
-      if ( hasOwn.call( params, key ) ) {
-        querystring += encodeURIComponent( key ) + "=" +
-          encodeURIComponent( params[ key ] ) + "&";
-      }
-    }
-    return window.location.protocol + "//" + window.location.host +
-      window.location.pathname + querystring.slice( 0, -1 );
-  },
-
-  extend: extend,
-  id: id,
-  addEvent: addEvent,
-  addClass: addClass,
-  hasClass: hasClass,
-  removeClass: removeClass
-  // load, equiv, jsDump, diff: Attached later
-});
-
-/**
- * @deprecated: Created for backwards compatibility with test runner that set the hook function
- * into QUnit.{hook}, instead of invoking it and passing the hook function.
- * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.
- * Doing this allows us to tell if the following methods have been overwritten on the actual
- * QUnit object.
- */
-extend( QUnit.constructor.prototype, {
-
-  // Logging callbacks; all receive a single argument with the listed properties
-  // run test/logs.html for any related changes
-  begin: registerLoggingCallback( "begin" ),
-
-  // done: { failed, passed, total, runtime }
-  done: registerLoggingCallback( "done" ),
-
-  // log: { result, actual, expected, message }
-  log: registerLoggingCallback( "log" ),
-
-  // testStart: { name }
-  testStart: registerLoggingCallback( "testStart" ),
-
-  // testDone: { name, failed, passed, total, duration }
-  testDone: registerLoggingCallback( "testDone" ),
-
-  // moduleStart: { name }
-  moduleStart: registerLoggingCallback( "moduleStart" ),
-
-  // moduleDone: { name, failed, passed, total }
-  moduleDone: registerLoggingCallback( "moduleDone" )
-});
-
-if ( typeof document === "undefined" || document.readyState === "complete" ) {
-  config.autorun = true;
-}
-
-QUnit.load = function() {
-  runLoggingCallbacks( "begin", QUnit, {} );
-
-  // Initialize the config, saving the execution queue
-  var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
-    urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
-    numModules = 0,
-    moduleNames = [],
-    moduleFilterHtml = "",
-    urlConfigHtml = "",
-    oldconfig = extend( {}, config );
-
-  QUnit.init();
-  extend(config, oldconfig);
-
-  config.blocking = false;
-
-  len = config.urlConfig.length;
-
-  for ( i = 0; i < len; i++ ) {
-    val = config.urlConfig[i];
-    if ( typeof val === "string" ) {
-      val = {
-        id: val,
-        label: val,
-        tooltip: "[no tooltip available]"
-      };
-    }
-    config[ val.id ] = QUnit.urlParams[ val.id ];
-    urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
-      "' name='" + escapeText( val.id ) +
-      "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) +
-      " title='" + escapeText( val.tooltip ) +
-      "'><label for='qunit-urlconfig-" + escapeText( val.id ) +
-      "' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
-  }
-  for ( i in config.modules ) {
-    if ( config.modules.hasOwnProperty( i ) ) {
-      moduleNames.push(i);
-    }
-  }
-  numModules = moduleNames.length;
-  moduleNames.sort( function( a, b ) {
-    return a.localeCompare( b );
-  });
-  moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
-    ( config.module === undefined  ? "selected='selected'" : "" ) +
-    ">< All Modules ></option>";
-
-
-  for ( i = 0; i < numModules; i++) {
-      moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(moduleNames[i]) ) + "' " +
-        ( config.module === moduleNames[i] ? "selected='selected'" : "" ) +
-        ">" + escapeText(moduleNames[i]) + "</option>";
-  }
-  moduleFilterHtml += "</select>";
-
-  // `userAgent` initialized at top of scope
-  userAgent = id( "qunit-userAgent" );
-  if ( userAgent ) {
-    userAgent.innerHTML = navigator.userAgent;
-  }
-
-  // `banner` initialized at top of scope
-  banner = id( "qunit-header" );
-  if ( banner ) {
-    banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "'>" + banner.innerHTML + "</a> ";
-  }
-
-  // `toolbar` initialized at top of scope
-  toolbar = id( "qunit-testrunner-toolbar" );
-  if ( toolbar ) {
-    // `filter` initialized at top of scope
-    filter = document.createElement( "input" );
-    filter.type = "checkbox";
-    filter.id = "qunit-filter-pass";
-
-    addEvent( filter, "click", function() {
-      var tmp,
-        ol = document.getElementById( "qunit-tests" );
-
-      if ( filter.checked ) {
-        ol.className = ol.className + " hidepass";
-      } else {
-        tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
-        ol.className = tmp.replace( / hidepass /, " " );
-      }
-      if ( defined.sessionStorage ) {
-        if (filter.checked) {
-          sessionStorage.setItem( "qunit-filter-passed-tests", "true" );
-        } else {
-          sessionStorage.removeItem( "qunit-filter-passed-tests" );
-        }
-      }
-    });
-
-    if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {
-      filter.checked = true;
-      // `ol` initialized at top of scope
-      ol = document.getElementById( "qunit-tests" );
-      ol.className = ol.className + " hidepass";
-    }
-    toolbar.appendChild( filter );
-
-    // `label` initialized at top of scope
-    label = document.createElement( "label" );
-    label.setAttribute( "for", "qunit-filter-pass" );
-    label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." );
-    label.innerHTML = "Hide passed tests";
-    toolbar.appendChild( label );
-
-    urlConfigCheckboxesContainer = document.createElement("span");
-    urlConfigCheckboxesContainer.innerHTML = urlConfigHtml;
-    urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input");
-    // For oldIE support:
-    // * Add handlers to the individual elements instead of the container
-    // * Use "click" instead of "change"
-    // * Fallback from event.target to event.srcElement
-    addEvents( urlConfigCheckboxes, "click", function( event ) {
-      var params = {},
-        target = event.target || event.srcElement;
-      params[ target.name ] = target.checked ? true : undefined;
-      window.location = QUnit.url( params );
-    });
-    toolbar.appendChild( urlConfigCheckboxesContainer );
-
-    if (numModules > 1) {
-      moduleFilter = document.createElement( "span" );
-      moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
-      moduleFilter.innerHTML = moduleFilterHtml;
-      addEvent( moduleFilter.lastChild, "change", function() {
-        var selectBox = moduleFilter.getElementsByTagName("select")[0],
-          selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
-
-        window.location = QUnit.url({
-          module: ( selectedModule === "" ) ? undefined : selectedModule,
-          // Remove any existing filters
-          filter: undefined,
-          testNumber: undefined
-        });
-      });
-      toolbar.appendChild(moduleFilter);
-    }
-  }
-
-  // `main` initialized at top of scope
-  main = id( "qunit-fixture" );
-  if ( main ) {
-    config.fixture = main.innerHTML;
-  }
-
-  if ( config.autostart ) {
-    QUnit.start();
-  }
-};
-
-addEvent( window, "load", QUnit.load );
-
-// `onErrorFnPrev` initialized at top of scope
-// Preserve other handlers
-onErrorFnPrev = window.onerror;
-
-// Cover uncaught exceptions
-// Returning true will suppress the default browser handler,
-// returning false will let it run.
-window.onerror = function ( error, filePath, linerNr ) {
-  var ret = false;
-  if ( onErrorFnPrev ) {
-    ret = onErrorFnPrev( error, filePath, linerNr );
-  }
-
-  // Treat return value as window.onerror itself does,
-  // Only do our handling if not suppressed.
-  if ( ret !== true ) {
-    if ( QUnit.config.current ) {
-      if ( QUnit.config.current.ignoreGlobalErrors ) {
-        return true;
-      }
-      QUnit.pushFailure( error, filePath + ":" + linerNr );
-    } else {
-      QUnit.test( "global failure", extend( function() {
-        QUnit.pushFailure( error, filePath + ":" + linerNr );
-      }, { validTest: validTest } ) );
-    }
-    return false;
-  }
-
-  return ret;
-};
-
-function done() {
-  config.autorun = true;
-
-  // Log the last module results
-  if ( config.currentModule ) {
-    runLoggingCallbacks( "moduleDone", QUnit, {
-      name: config.currentModule,
-      failed: config.moduleStats.bad,
-      passed: config.moduleStats.all - config.moduleStats.bad,
-      total: config.moduleStats.all
-    });
-  }
-  delete config.previousModule;
-
-  var i, key,
-    banner = id( "qunit-banner" ),
-    tests = id( "qunit-tests" ),
-    runtime = +new Date() - config.started,
-    passed = config.stats.all - config.stats.bad,
-    html = [
-      "Tests completed in ",
-      runtime,
-      " milliseconds.<br/>",
-      "<span class='passed'>",
-      passed,
-      "</span> assertions of <span class='total'>",
-      config.stats.all,
-      "</span> passed, <span class='failed'>",
-      config.stats.bad,
-      "</span> failed."
-    ].join( "" );
-
-  if ( banner ) {
-    banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" );
-  }
-
-  if ( tests ) {
-    id( "qunit-testresult" ).innerHTML = html;
-  }
-
-  if ( config.altertitle && typeof document !== "undefined" && document.title ) {
-    // show ✖ for good, ✔ for bad suite result in title
-    // use escape sequences in case file gets loaded with non-utf-8-charset
-    document.title = [
-      ( config.stats.bad ? "\u2716" : "\u2714" ),
-      document.title.replace( /^[\u2714\u2716] /i, "" )
-    ].join( " " );
-  }
-
-  // clear own sessionStorage items if all tests passed
-  if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
-    // `key` & `i` initialized at top of scope
-    for ( i = 0; i < sessionStorage.length; i++ ) {
-      key = sessionStorage.key( i++ );
-      if ( key.indexOf( "qunit-test-" ) === 0 ) {
-        sessionStorage.removeItem( key );
-      }
-    }
-  }
-
-  // scroll back to top to show results
-  if ( window.scrollTo ) {
-    window.scrollTo(0, 0);
-  }
-
-  runLoggingCallbacks( "done", QUnit, {
-    failed: config.stats.bad,
-    passed: passed,
-    total: config.stats.all,
-    runtime: runtime
-  });
-}
-
-/** @return Boolean: true if this test should be ran */
-function validTest( test ) {
-  var include,
-    filter = config.filter && config.filter.toLowerCase(),
-    module = config.module && config.module.toLowerCase(),
-    fullName = (test.module + ": " + test.testName).toLowerCase();
-
-  // Internally-generated tests are always valid
-  if ( test.callback && test.callback.validTest === validTest ) {
-    delete test.callback.validTest;
-    return true;
-  }
-
-  if ( config.testNumber ) {
-    return test.testNumber === config.testNumber;
-  }
-
-  if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
-    return false;
-  }
-
-  if ( !filter ) {
-    return true;
-  }
-
-  include = filter.charAt( 0 ) !== "!";
-  if ( !include ) {
-    filter = filter.slice( 1 );
-  }
-
-  // If the filter matches, we need to honour include
-  if ( fullName.indexOf( filter ) !== -1 ) {
-    return include;
-  }
-
-  // Otherwise, do the opposite
-  return !include;
-}
-
-// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)
-// Later Safari and IE10 are supposed to support error.stack as well
-// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
-function extractStacktrace( e, offset ) {
-  offset = offset === undefined ? 3 : offset;
-
-  var stack, include, i;
-
-  if ( e.stacktrace ) {
-    // Opera
-    return e.stacktrace.split( "\n" )[ offset + 3 ];
-  } else if ( e.stack ) {
-    // Firefox, Chrome
-    stack = e.stack.split( "\n" );
-    if (/^error$/i.test( stack[0] ) ) {
-      stack.shift();
-    }
-    if ( fileName ) {
-      include = [];
-      for ( i = offset; i < stack.length; i++ ) {
-        if ( stack[ i ].indexOf( fileName ) !== -1 ) {
-          break;
-        }
-        include.push( stack[ i ] );
-      }
-      if ( include.length ) {
-        return include.join( "\n" );
-      }
-    }
-    return stack[ offset ];
-  } else if ( e.sourceURL ) {
-    // Safari, PhantomJS
-    // hopefully one day Safari provides actual stacktraces
-    // exclude useless self-reference for generated Error objects
-    if ( /qunit.js$/.test( e.sourceURL ) ) {
-      return;
-    }
-    // for actual exceptions, this is useful
-    return e.sourceURL + ":" + e.line;
-  }
-}
-function sourceFromStacktrace( offset ) {
-  try {
-    throw new Error();
-  } catch ( e ) {
-    return extractStacktrace( e, offset );
-  }
-}
-
-/**
- * Escape text for attribute or text content.
- */
-function escapeText( s ) {
-  if ( !s ) {
-    return "";
-  }
-  s = s + "";
-  // Both single quotes and double quotes (for attributes)
-  return s.replace( /['"<>&]/g, function( s ) {
-    switch( s ) {
-      case "'":
-        return "&#039;";
-      case "\"":
-        return "&quot;";
-      case "<":
-        return "&lt;";
-      case ">":
-        return "&gt;";
-      case "&":
-        return "&amp;";
-    }
-  });
-}
-
-function synchronize( callback, last ) {
-  config.queue.push( callback );
-
-  if ( config.autorun && !config.blocking ) {
-    process( last );
-  }
-}
-
-function process( last ) {
-  function next() {
-    process( last );
-  }
-  var start = new Date().getTime();
-  config.depth = config.depth ? config.depth + 1 : 1;
-
-  while ( config.queue.length && !config.blocking ) {
-    if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
-      config.queue.shift()();
-    } else {
-      setTimeout( next, 13 );
-      break;
-    }
-  }
-  config.depth--;
-  if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
-    done();
-  }
-}
-
-function saveGlobal() {
-  config.pollution = [];
-
-  if ( config.noglobals ) {
-    for ( var key in window ) {
-      if ( hasOwn.call( window, key ) ) {
-        // in Opera sometimes DOM element ids show up here, ignore them
-        if ( /^qunit-test-output/.test( key ) ) {
-          continue;
-        }
-        config.pollution.push( key );
-      }
-    }
-  }
-}
-
-function checkPollution() {
-  var newGlobals,
-    deletedGlobals,
-    old = config.pollution;
-
-  saveGlobal();
-
-  newGlobals = diff( config.pollution, old );
-  if ( newGlobals.length > 0 ) {
-    QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );
-  }
-
-  deletedGlobals = diff( old, config.pollution );
-  if ( deletedGlobals.length > 0 ) {
-    QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );
-  }
-}
-
-// returns a new Array with the elements that are in a but not in b
-function diff( a, b ) {
-  var i, j,
-    result = a.slice();
-
-  for ( i = 0; i < result.length; i++ ) {
-    for ( j = 0; j < b.length; j++ ) {
-      if ( result[i] === b[j] ) {
-        result.splice( i, 1 );
-        i--;
-        break;
-      }
-    }
-  }
-  return result;
-}
-
-function extend( a, b ) {
-  for ( var prop in b ) {
-    if ( hasOwn.call( b, prop ) ) {
-      // Avoid "Member not found" error in IE8 caused by messing with window.constructor
-      if ( !( prop === "constructor" && a === window ) ) {
-        if ( b[ prop ] === undefined ) {
-          delete a[ prop ];
-        } else {
-          a[ prop ] = b[ prop ];
-        }
-      }
-    }
-  }
-
-  return a;
-}
-
-/**
- * @param {HTMLElement} elem
- * @param {string} type
- * @param {Function} fn
- */
-function addEvent( elem, type, fn ) {
-  // Standards-based browsers
-  if ( elem.addEventListener ) {
-    elem.addEventListener( type, fn, false );
-  // IE
-  } else {
-    elem.attachEvent( "on" + type, fn );
-  }
-}
-
-/**
- * @param {Array|NodeList} elems
- * @param {string} type
- * @param {Function} fn
- */
-function addEvents( elems, type, fn ) {
-  var i = elems.length;
-  while ( i-- ) {
-    addEvent( elems[i], type, fn );
-  }
-}
-
-function hasClass( elem, name ) {
-  return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
-}
-
-function addClass( elem, name ) {
-  if ( !hasClass( elem, name ) ) {
-    elem.className += (elem.className ? " " : "") + name;
-  }
-}
-
-function removeClass( elem, name ) {
-  var set = " " + elem.className + " ";
-  // Class name may appear multiple times
-  while ( set.indexOf(" " + name + " ") > -1 ) {
-    set = set.replace(" " + name + " " , " ");
-  }
-  // If possible, trim it for prettiness, but not necessarily
-  elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, "");
-}
-
-function id( name ) {
-  return !!( typeof document !== "undefined" && document && document.getElementById ) &&
-    document.getElementById( name );
-}
-
-function registerLoggingCallback( key ) {
-  return function( callback ) {
-    config[key].push( callback );
-  };
-}
-
-// Supports deprecated method of completely overwriting logging callbacks
-function runLoggingCallbacks( key, scope, args ) {
-  var i, callbacks;
-  if ( QUnit.hasOwnProperty( key ) ) {
-    QUnit[ key ].call(scope, args );
-  } else {
-    callbacks = config[ key ];
-    for ( i = 0; i < callbacks.length; i++ ) {
-      callbacks[ i ].call( scope, args );
-    }
-  }
-}
-
-// Test for equality any JavaScript type.
-// Author: Philippe Rathé <prathe@gmail.com>
-QUnit.equiv = (function() {
-
-  // Call the o related callback with the given arguments.
-  function bindCallbacks( o, callbacks, args ) {
-    var prop = QUnit.objectType( o );
-    if ( prop ) {
-      if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
-        return callbacks[ prop ].apply( callbacks, args );
-      } else {
-        return callbacks[ prop ]; // or undefined
-      }
-    }
-  }
-
-  // the real equiv function
-  var innerEquiv,
-    // stack to decide between skip/abort functions
-    callers = [],
-    // stack to avoiding loops from circular referencing
-    parents = [],
-    parentsB = [],
-
-    getProto = Object.getPrototypeOf || function ( obj ) {
-      /*jshint camelcase:false */
-      return obj.__proto__;
-    },
-    callbacks = (function () {
-
-      // for string, boolean, number and null
-      function useStrictEquality( b, a ) {
-        /*jshint eqeqeq:false */
-        if ( b instanceof a.constructor || a instanceof b.constructor ) {
-          // to catch short annotation VS 'new' annotation of a
-          // declaration
-          // e.g. var i = 1;
-          // var j = new Number(1);
-          return a == b;
-        } else {
-          return a === b;
-        }
-      }
-
-      return {
-        "string": useStrictEquality,
-        "boolean": useStrictEquality,
-        "number": useStrictEquality,
-        "null": useStrictEquality,
-        "undefined": useStrictEquality,
-
-        "nan": function( b ) {
-          return isNaN( b );
-        },
-
-        "date": function( b, a ) {
-          return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
-        },
-
-        "regexp": function( b, a ) {
-          return QUnit.objectType( b ) === "regexp" &&
-            // the regex itself
-            a.source === b.source &&
-            // and its modifiers
-            a.global === b.global &&
-            // (gmi) ...
-            a.ignoreCase === b.ignoreCase &&
-            a.multiline === b.multiline &&
-            a.sticky === b.sticky;
-        },
-
-        // - skip when the property is a method of an instance (OOP)
-        // - abort otherwise,
-        // initial === would have catch identical references anyway
-        "function": function() {
-          var caller = callers[callers.length - 1];
-          return caller !== Object && typeof caller !== "undefined";
-        },
-
-        "array": function( b, a ) {
-          var i, j, len, loop, aCircular, bCircular;
-
-          // b could be an object literal here
-          if ( QUnit.objectType( b ) !== "array" ) {
-            return false;
-          }
-
-          len = a.length;
-          if ( len !== b.length ) {
-            // safe and faster
-            return false;
-          }
-
-          // track reference to avoid circular references
-          parents.push( a );
-          parentsB.push( b );
-          for ( i = 0; i < len; i++ ) {
-            loop = false;
-            for ( j = 0; j < parents.length; j++ ) {
-              aCircular = parents[j] === a[i];
-              bCircular = parentsB[j] === b[i];
-              if ( aCircular || bCircular ) {
-                if ( a[i] === b[i] || aCircular && bCircular ) {
-                  loop = true;
-                } else {
-                  parents.pop();
-                  parentsB.pop();
-                  return false;
-                }
-              }
-            }
-            if ( !loop && !innerEquiv(a[i], b[i]) ) {
-              parents.pop();
-              parentsB.pop();
-              return false;
-            }
-          }
-          parents.pop();
-          parentsB.pop();
-          return true;
-        },
-
-        "object": function( b, a ) {
-          /*jshint forin:false */
-          var i, j, loop, aCircular, bCircular,
-            // Default to true
-            eq = true,
-            aProperties = [],
-            bProperties = [];
-
-          // comparing constructors is more strict than using
-          // instanceof
-          if ( a.constructor !== b.constructor ) {
-            // Allow objects with no prototype to be equivalent to
-            // objects with Object as their constructor.
-            if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||
-              ( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {
-                return false;
-            }
-          }
-
-          // stack constructor before traversing properties
-          callers.push( a.constructor );
-
-          // track reference to avoid circular references
-          parents.push( a );
-          parentsB.push( b );
-
-          // be strict: don't ensure hasOwnProperty and go deep
-          for ( i in a ) {
-            loop = false;
-            for ( j = 0; j < parents.length; j++ ) {
-              aCircular = parents[j] === a[i];
-              bCircular = parentsB[j] === b[i];
-              if ( aCircular || bCircular ) {
-                if ( a[i] === b[i] || aCircular && bCircular ) {
-                  loop = true;
-                } else {
-                  eq = false;
-                  break;
-                }
-              }
-            }
-            aProperties.push(i);
-            if ( !loop && !innerEquiv(a[i], b[i]) ) {
-              eq = false;
-              break;
-            }
-          }
-
-          parents.pop();
-          parentsB.pop();
-          callers.pop(); // unstack, we are done
-
-          for ( i in b ) {
-            bProperties.push( i ); // collect b's properties
-          }
-
-          // Ensures identical properties name
-          return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
-        }
-      };
-    }());
-
-  innerEquiv = function() { // can take multiple arguments
-    var args = [].slice.apply( arguments );
-    if ( args.length < 2 ) {
-      return true; // end transition
-    }
-
-    return (function( a, b ) {
-      if ( a === b ) {
-        return true; // catch the most you can
-      } else if ( a === null || b === null || typeof a === "undefined" ||
-          typeof b === "undefined" ||
-          QUnit.objectType(a) !== QUnit.objectType(b) ) {
-        return false; // don't lose time with error prone cases
-      } else {
-        return bindCallbacks(a, callbacks, [ b, a ]);
-      }
-
-      // apply transition with (1..n) arguments
-    }( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) );
-  };
-
-  return innerEquiv;
-}());
-
-/**
- * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
- * http://flesler.blogspot.com Licensed under BSD
- * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
- *
- * @projectDescription Advanced and extensible data dumping for Javascript.
- * @version 1.0.0
- * @author Ariel Flesler
- * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
- */
-QUnit.jsDump = (function() {
-  function quote( str ) {
-    return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\"";
-  }
-  function literal( o ) {
-    return o + "";
-  }
-  function join( pre, arr, post ) {
-    var s = jsDump.separator(),
-      base = jsDump.indent(),
-      inner = jsDump.indent(1);
-    if ( arr.join ) {
-      arr = arr.join( "," + s + inner );
-    }
-    if ( !arr ) {
-      return pre + post;
-    }
-    return [ pre, inner + arr, base + post ].join(s);
-  }
-  function array( arr, stack ) {
-    var i = arr.length, ret = new Array(i);
-    this.up();
-    while ( i-- ) {
-      ret[i] = this.parse( arr[i] , undefined , stack);
-    }
-    this.down();
-    return join( "[", ret, "]" );
-  }
-
-  var reName = /^function (\w+)/,
-    jsDump = {
-      // type is used mostly internally, you can fix a (custom)type in advance
-      parse: function( obj, type, stack ) {
-        stack = stack || [ ];
-        var inStack, res,
-          parser = this.parsers[ type || this.typeOf(obj) ];
-
-        type = typeof parser;
-        inStack = inArray( obj, stack );
-
-        if ( inStack !== -1 ) {
-          return "recursion(" + (inStack - stack.length) + ")";
-        }
-        if ( type === "function" )  {
-          stack.push( obj );
-          res = parser.call( this, obj, stack );
-          stack.pop();
-          return res;
-        }
-        return ( type === "string" ) ? parser : this.parsers.error;
-      },
-      typeOf: function( obj ) {
-        var type;
-        if ( obj === null ) {
-          type = "null";
-        } else if ( typeof obj === "undefined" ) {
-          type = "undefined";
-        } else if ( QUnit.is( "regexp", obj) ) {
-          type = "regexp";
-        } else if ( QUnit.is( "date", obj) ) {
-          type = "date";
-        } else if ( QUnit.is( "function", obj) ) {
-          type = "function";
-        } else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {
-          type = "window";
-        } else if ( obj.nodeType === 9 ) {
-          type = "document";
-        } else if ( obj.nodeType ) {
-          type = "node";
-        } else if (
-          // native arrays
-          toString.call( obj ) === "[object Array]" ||
-          // NodeList objects
-          ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
-        ) {
-          type = "array";
-        } else if ( obj.constructor === Error.prototype.constructor ) {
-          type = "error";
-        } else {
-          type = typeof obj;
-        }
-        return type;
-      },
-      separator: function() {
-        return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
-      },
-      // extra can be a number, shortcut for increasing-calling-decreasing
-      indent: function( extra ) {
-        if ( !this.multiline ) {
-          return "";
-        }
-        var chr = this.indentChar;
-        if ( this.HTML ) {
-          chr = chr.replace( /\t/g, "   " ).replace( / /g, "&nbsp;" );
-        }
-        return new Array( this.depth + ( extra || 0 ) ).join(chr);
-      },
-      up: function( a ) {
-        this.depth += a || 1;
-      },
-      down: function( a ) {
-        this.depth -= a || 1;
-      },
-      setParser: function( name, parser ) {
-        this.parsers[name] = parser;
-      },
-      // The next 3 are exposed so you can use them
-      quote: quote,
-      literal: literal,
-      join: join,
-      //
-      depth: 1,
-      // This is the list of parsers, to modify them, use jsDump.setParser
-      parsers: {
-        window: "[Window]",
-        document: "[Document]",
-        error: function(error) {
-          return "Error(\"" + error.message + "\")";
-        },
-        unknown: "[Unknown]",
-        "null": "null",
-        "undefined": "undefined",
-        "function": function( fn ) {
-          var ret = "function",
-            // functions never have name in IE
-            name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
-
-          if ( name ) {
-            ret += " " + name;
-          }
-          ret += "( ";
-
-          ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" );
-          return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" );
-        },
-        array: array,
-        nodelist: array,
-        "arguments": array,
-        object: function( map, stack ) {
-          /*jshint forin:false */
-          var ret = [ ], keys, key, val, i;
-          QUnit.jsDump.up();
-          keys = [];
-          for ( key in map ) {
-            keys.push( key );
-          }
-          keys.sort();
-          for ( i = 0; i < keys.length; i++ ) {
-            key = keys[ i ];
-            val = map[ key ];
-            ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) );
-          }
-          QUnit.jsDump.down();
-          return join( "{", ret, "}" );
-        },
-        node: function( node ) {
-          var len, i, val,
-            open = QUnit.jsDump.HTML ? "&lt;" : "<",
-            close = QUnit.jsDump.HTML ? "&gt;" : ">",
-            tag = node.nodeName.toLowerCase(),
-            ret = open + tag,
-            attrs = node.attributes;
-
-          if ( attrs ) {
-            for ( i = 0, len = attrs.length; i < len; i++ ) {
-              val = attrs[i].nodeValue;
-              // IE6 includes all attributes in .attributes, even ones not explicitly set.
-              // Those have values like undefined, null, 0, false, "" or "inherit".
-              if ( val && val !== "inherit" ) {
-                ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
-              }
-            }
-          }
-          ret += close;
-
-          // Show content of TextNode or CDATASection
-          if ( node.nodeType === 3 || node.nodeType === 4 ) {
-            ret += node.nodeValue;
-          }
-
-          return ret + open + "/" + tag + close;
-        },
-        // function calls it internally, it's the arguments part of the function
-        functionArgs: function( fn ) {
-          var args,
-            l = fn.length;
-
-          if ( !l ) {
-            return "";
-          }
-
-          args = new Array(l);
-          while ( l-- ) {
-            // 97 is 'a'
-            args[l] = String.fromCharCode(97+l);
-          }
-          return " " + args.join( ", " ) + " ";
-        },
-        // object calls it internally, the key part of an item in a map
-        key: quote,
-        // function calls it internally, it's the content of the function
-        functionCode: "[code]",
-        // node calls it internally, it's an html attribute value
-        attribute: quote,
-        string: quote,
-        date: quote,
-        regexp: literal,
-        number: literal,
-        "boolean": literal
-      },
-      // if true, entities are escaped ( <, >, \t, space and \n )
-      HTML: false,
-      // indentation unit
-      indentChar: "  ",
-      // if true, items in a collection, are separated by a \n, else just a space.
-      multiline: true
-    };
-
-  return jsDump;
-}());
-
-// from jquery.js
-function inArray( elem, array ) {
-  if ( array.indexOf ) {
-    return array.indexOf( elem );
-  }
-
-  for ( var i = 0, length = array.length; i < length; i++ ) {
-    if ( array[ i ] === elem ) {
-      return i;
-    }
-  }
-
-  return -1;
-}
-
-/*
- * Javascript Diff Algorithm
- *  By John Resig (http://ejohn.org/)
- *  Modified by Chu Alan "sprite"
- *
- * Released under the MIT license.
- *
- * More Info:
- *  http://ejohn.org/projects/javascript-diff-algorithm/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
- */
-QUnit.diff = (function() {
-  /*jshint eqeqeq:false, eqnull:true */
-  function diff( o, n ) {
-    var i,
-      ns = {},
-      os = {};
-
-    for ( i = 0; i < n.length; i++ ) {
-      if ( !hasOwn.call( ns, n[i] ) ) {
-        ns[ n[i] ] = {
-          rows: [],
-          o: null
-        };
-      }
-      ns[ n[i] ].rows.push( i );
-    }
-
-    for ( i = 0; i < o.length; i++ ) {
-      if ( !hasOwn.call( os, o[i] ) ) {
-        os[ o[i] ] = {
-          rows: [],
-          n: null
-        };
-      }
-      os[ o[i] ].rows.push( i );
-    }
-
-    for ( i in ns ) {
-      if ( hasOwn.call( ns, i ) ) {
-        if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
-          n[ ns[i].rows[0] ] = {
-            text: n[ ns[i].rows[0] ],
-            row: os[i].rows[0]
-          };
-          o[ os[i].rows[0] ] = {
-            text: o[ os[i].rows[0] ],
-            row: ns[i].rows[0]
-          };
-        }
-      }
-    }
-
-    for ( i = 0; i < n.length - 1; i++ ) {
-      if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&
-            n[ i + 1 ] == o[ n[i].row + 1 ] ) {
-
-        n[ i + 1 ] = {
-          text: n[ i + 1 ],
-          row: n[i].row + 1
-        };
-        o[ n[i].row + 1 ] = {
-          text: o[ n[i].row + 1 ],
-          row: i + 1
-        };
-      }
-    }
-
-    for ( i = n.length - 1; i > 0; i-- ) {
-      if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&
-            n[ i - 1 ] == o[ n[i].row - 1 ]) {
-
-        n[ i - 1 ] = {
-          text: n[ i - 1 ],
-          row: n[i].row - 1
-        };
-        o[ n[i].row - 1 ] = {
-          text: o[ n[i].row - 1 ],
-          row: i - 1
-        };
-      }
-    }
-
-    return {
-      o: o,
-      n: n
-    };
-  }
-
-  return function( o, n ) {
-    o = o.replace( /\s+$/, "" );
-    n = n.replace( /\s+$/, "" );
-
-    var i, pre,
-      str = "",
-      out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ),
-      oSpace = o.match(/\s+/g),
-      nSpace = n.match(/\s+/g);
-
-    if ( oSpace == null ) {
-      oSpace = [ " " ];
-    }
-    else {
-      oSpace.push( " " );
-    }
-
-    if ( nSpace == null ) {
-      nSpace = [ " " ];
-    }
-    else {
-      nSpace.push( " " );
-    }
-
-    if ( out.n.length === 0 ) {
-      for ( i = 0; i < out.o.length; i++ ) {
-        str += "<del>" + out.o[i] + oSpace[i] + "</del>";
-      }
-    }
-    else {
-      if ( out.n[0].text == null ) {
-        for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {
-          str += "<del>" + out.o[n] + oSpace[n] + "</del>";
-        }
-      }
-
-      for ( i = 0; i < out.n.length; i++ ) {
-        if (out.n[i].text == null) {
-          str += "<ins>" + out.n[i] + nSpace[i] + "</ins>";
-        }
-        else {
-          // `pre` initialized at top of scope
-          pre = "";
-
-          for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {
-            pre += "<del>" + out.o[n] + oSpace[n] + "</del>";
-          }
-          str += " " + out.n[i].text + nSpace[i] + pre;
-        }
-      }
-    }
-
-    return str;
-  };
-}());
-
-// for CommonJS environments, export everything
-if ( typeof exports !== "undefined" ) {
-  extend( exports, QUnit.constructor.prototype );
-}
-
-// get at whatever the global object is, like window in browsers
-}( (function() {return this;}.call()) ));
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/test/unit/test.js b/public/ext/vakata-jstree-3.3.17/test/unit/test.js
deleted file mode 100644
index 96aa22c399..0000000000
--- a/public/ext/vakata-jstree-3.3.17/test/unit/test.js
+++ /dev/null
@@ -1,11 +0,0 @@
-test('basic test', function() {
-  expect(1);
-  ok(true, 'this had better work.');
-});
-
-
-test('can access the DOM', function() {
-  expect(1);
-  var fixture = document.getElementById('qunit-fixture');
-  equal(fixture.innerText || fixture.textContent, 'this had better work.', 'should be able to access the DOM.');
-});
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/test/visual/desktop/index.html b/public/ext/vakata-jstree-3.3.17/test/visual/desktop/index.html
deleted file mode 100644
index baeb64e349..0000000000
--- a/public/ext/vakata-jstree-3.3.17/test/visual/desktop/index.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-	<meta charset="UTF-8">
-	<title>Light theme visual tests</title>
-	<link rel="stylesheet" href="./../../../dist/themes/default/style.min.css">
-	<link rel="stylesheet" href="./../../../dist/themes/default-dark/style.min.css">
-	<style>.tree { border:1px solid black; padding:10px; width:300px; margin:20px; float:left; min-height:200px; }</style>
-</head>
-<body style="background:white;">
-	<div class="tree" id="empty"></div>
-	<div class="tree" id="core"><ul><li>asdf</li></ul></div>
-	<div class="tree" id="tree">
-		<ul>
-			<li>Node 01
-				<ul>
-					<li>Node</li>
-					<li>Node</li>
-				</ul>
-			</li>
-			<li>Node 02</li>
-			<li data-jstree='{"opened" : true}'>Node 03
-				<ul>
-					<li>Node</li>
-					<li>Node</li>
-				</ul>
-			</li>
-			<li>Node 04</li>
-			<li>Node 05</li>
-		</ul>
-	</div>
-	<div class="tree" id="full"><ul><li data-jstree='{ "selected" : true, "type" : "file" }'>full</li><li>asdf</li></ul></div>
-	<div class="tree" id="dark"><ul><li data-jstree='{ "selected" : true, "type" : "file"}'>full</li><li>asdf</li></ul></div>
-
-	<script src="./../../../dist/libs/jquery.js"></script>
-	<script src="./../../../dist/jstree.min.js"></script>
-	<script>
-	$('#empty').jstree();
-	$('#tree, #core').jstree();
-	$('#full').jstree({ plugins : ["checkbox","sort","types","wholerow"], "types" : { "file" : { "icon" : "jstree-file" } } });
-	$('#dark').jstree({ plugins : ["checkbox","sort","types","wholerow"], "core" : { "themes" : { "name" : "default-dark" } }, "types" : { "file" : { "icon" : "jstree-file" } } });
-	</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/test/visual/mobile/index.html b/public/ext/vakata-jstree-3.3.17/test/visual/mobile/index.html
deleted file mode 100644
index b84baff5f8..0000000000
--- a/public/ext/vakata-jstree-3.3.17/test/visual/mobile/index.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-	<meta charset="UTF-8">
-	<title>Mobile theme visual tests</title>
-	<link rel="stylesheet" href="./../../../dist/themes/default/style.min.css">
-	<link rel="stylesheet" href="./../../../dist/themes/default-dark/style.min.css">
-	<style>.tree { border:1px solid black; padding:10px; width:300px; margin:20px; float:left; min-height:200px; }</style>
-</head>
-<body style="background:white;">
-	<div class="tree" id="tree">
-		<ul>
-			<li>Node 01
-				<ul>
-					<li>Node</li>
-					<li>Node</li>
-				</ul>
-			</li>
-			<li>Node 02</li>
-			<li data-jstree='{"opened" : true}'>Node 03
-				<ul>
-					<li>Node</li>
-					<li>Node</li>
-				</ul>
-			</li>
-			<li>Node 04</li>
-			<li>Node 05</li>
-		</ul>
-	</div>
-	<div class="tree" id="full"><ul><li data-jstree='{ "selected" : true, "type" : "file" }'>full</li><li>asdf</li></ul></div>
-	<div class="tree" id="dark"><ul><li data-jstree='{ "selected" : true, "type" : "file"}'>full</li><li>asdf</li></ul></div>
-
-	<script src="./../../../dist/libs/jquery.js"></script>
-	<script src="./../../../dist/jstree.min.js"></script>
-	<script>
-	$.jstree.defaults.core.themes.responsive = true;
-	$('#tree').jstree();
-	$('#full').jstree({ plugins : ["checkbox","sort","types","wholerow"], "types" : { "file" : { "icon" : "jstree-file" } } });
-	$('#dark').jstree({ plugins : ["checkbox","sort","types","wholerow"], "core" : { "themes" : { "name" : "default-dark" } }, "types" : { "file" : { "icon" : "jstree-file" } } });
-	</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/public/ext/vakata-jstree-3.3.17/test/visual/screenshots/desktop/.png b/public/ext/vakata-jstree-3.3.17/test/visual/screenshots/desktop/.png
deleted file mode 100644
index 55ccf189b5d73f58e4ab6fca9ac859f891112b40..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 10643
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

diff --git a/public/ext/vakata-jstree-3.3.17/test/visual/screenshots/desktop/desktop.png b/public/ext/vakata-jstree-3.3.17/test/visual/screenshots/desktop/desktop.png
deleted file mode 100644
index d6ececdbd989f50897e0858a3d71bd795ad096e9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 19310
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

diff --git a/public/ext/vakata-jstree-3.3.17/test/visual/screenshots/desktop/home.png b/public/ext/vakata-jstree-3.3.17/test/visual/screenshots/desktop/home.png
deleted file mode 100644
index 55ccf189b5d73f58e4ab6fca9ac859f891112b40..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 10643
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

diff --git a/public/ext/vakata-jstree-3.3.17/test/visual/screenshots/mobile/.png b/public/ext/vakata-jstree-3.3.17/test/visual/screenshots/mobile/.png
deleted file mode 100644
index c8cd05ad1d4e39de5e1a3443646a444faed88002..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6373
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

diff --git a/public/ext/vakata-jstree-3.3.17/test/visual/screenshots/mobile/home.png b/public/ext/vakata-jstree-3.3.17/test/visual/screenshots/mobile/home.png
deleted file mode 100644
index c8cd05ad1d4e39de5e1a3443646a444faed88002..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6373
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

diff --git a/public/ext/vakata-jstree-3.3.17/test/visual/screenshots/mobile/mobile.png b/public/ext/vakata-jstree-3.3.17/test/visual/screenshots/mobile/mobile.png
deleted file mode 100644
index dcc76a00649db10b5e88ccfa0e296d1ada598232..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 16220
zcmeAS@N?(olHy`uVBq!ia0y~yV9a1(V9w%TV_;xdu<7D=1_lO}VkgfK4h{~E8jh3>
z1_lPs0*}aI1_r((Aj~*bn@^g7L4m>3#WAE}&fB~7Q*M{nKL35aJnfHipKOx)GR92_
z8&dM_WOiwHtXx)|d7^c*l>YX(7o{)F)<$woy2*6uUQByl`K?yD&DGNRyM*3~z4opb
znDwv7{B22Ozr}?qPYc|2{ag<4oGV*$<e_`S3I5xiy~fG?U-s6&cz(u1>TFNlp7bv@
zbBv!?ELp$r{`)6K&j0-J`EQNt@y|B?3=G9=RkchE4Zk={7$jU5Fdoog;$?6X%wRC+
za$s%<WRYU%QM$m8AkxUju$a0^RxHeuzfd?QPhN<@=cCQ~rEho1Wvu)<nYrO>nq_my
zG7AP`oU&pc*Ou42_S&&BWJJcZN-<m$!s`4hyLh)eue2(B#3IkfkZ|_ZN%d7Fvz}LW
zxhVa56~2F!kDBuJQs3GuVJbp_YLi#~j!_T@Fq--1lO*GYjJv%HvLEYs_S=4&ap>WO
znG?6X-o^V^XXPhuRtA~%r=J$dEKlATBk?@y_qVr~|NZ^_b>H{B>y?k^mDsuW$z)1B
zxyr%9WL5a6Wo5lALq?t@Z;W|kp4jtE;d@_&O3BN=kGk;b=bmrx@87?eJjbp!ikbQK
zJ9(!AySC0@TesTs#nQSL%jefcJuKLfU3{szxw-1gMR)5u8HU%FcS%-R_9<U4-I{-Y
z-?H10vnR7PxLrFd;y&|vC0G05sy7>t&&u1Le}7+J|B|;pg-@nPeAJ${u2MrHyv#@|
z{^#!ymvb3skDmO{vL_`YReh>=#u548p9Kdi!X^jCU!Ja$Ki~1_=E+%GPRAs<{F~hV
z?0-#z;OWc<yCfZ_8%|nxeEEwd>gQ(%?D!L4rB<&JdRJx2l;@SRIND7gR%-WeR{6PT
z)*9PuSyLa&%$xAM^3<`VGwNMB?;JYo_Qay^&*wT}#_a36xVN}0na#x}s`LM*?9~&8
zPDxI&ij%Qy=NGHb{PB&)+e^D_&o6GZ=@N=(BFe9&E>Kmvd*Q<jHT6}=w@c2fzty<K
zR<qYUO6*<V>Y7*kUZlK?XSi#nzu@z=T#(8Djg>ijjQXZo@2c39FfYbQxleidr_lP}
zAxn0h^+?)v@||1OH_^b$_xX2b`kK}hd0qbYpOInBja_^tlIBG^&$|7t^_X4m`YGMA
z$>zUwkM`@zPkYupI=CgNF8$sKYtcfJSF0)tFMj^g;J51Df$cV;f<5Wpzl%(7>0G+G
zIm@PS;<cMO-1a&f+}6H!*k1Ix>&jeFS+Ukhk)iCD*15S0&9Z-YR<m%2#eZp=k_B6o
z4lQSH@6s>oR}GOl5Vl-V>+_L|8?D4SgRSJey}4dpV4SZq{~M2ZzinRCEY=sjrP3LX
z?r_atH2HIQ*^y_w)tjxN(|<(m@le;S4O(6_Dd=&j`|0kGZQ6YYWS5(~nr3n}W8I<s
z+p7YLCocH*E85avgW1~C4#Ll$a%j%%HSc_owDaY$&4<=<`B!|}^D6vs>7{+PQh7V3
zC%#QwXnbvBsd&btJxu#v?3pSXTK6_L?A-%J*$<hWfq8G=t-5V0W2i55>7bjo@gerD
zT~}{4RKC`_aHNv+Y?zBq#Ld7b!6j=Vj(<5By!7X@Iev3>&Q-S@_bPw&bCFiA+IEwf
zbG&6%`&5Ta`*byDdY|mNbu6B)v-G}l%j))h(EdGd-XxKbKN^+Cer?Ok`?^gc-Fkb~
z^);I`IQ=VDm2Xba5}G*a<WJ?xtlRUh@4s60@9mR=6)}f5&bVW>y+_|>`m{Xl_(x&y
zU4O@%+t;Y~>h^Z&*jKg|6}tl&_FkL*{^-UlzM7z%YJKlx-@n<{7&fG>o$cV=s~kJ;
znuZ9Mt(7rD#J*C|jLgC%zrQspG??bc)-Ljjw7jJ5H|N4cW%nwvbh|*-16gZMJ9r=U
zsDHpL|Ke*V!-1}~yEXY3BJ?RPAg}DIJzRHMX<~=bOrN{YnHn1=olKd2o}<CFXTk0>
zrFYv3r!4`ORl6(P7}g}Q+;yDy{N;&>%D&Ap{jYcFx>^Zvyg1S+T%(}3!OyVi-2$hD
z8{SyxyQ@u}_`Fi~wtd4rkd~TN<_%X9Sa=!SKuT)t*8lzez5I*Ba{u|)4jc&DpI+?M
z^F!48x{XMWwzcHc^?z!$l+w4P-Ltk))R&C9>G@Ph>f`YcyBLFcS5vNB|Dt;Oc6z|a
zH%r9c8HpB#{1rSj>%*j|hyDyR4sh(!{~<E>%aclBuIch#$Di~sSv9+5(kB~#;fEX4
zZ1SHLPE&~wnY{IQ)Y_sshlM}c_}|<i^0{AQ;_5sj`*V|?WL@dh*jf;OK+0*sZ(oBI
z2|v%jTj7?aogVV4qVS1~UBsWI4{samXs*5SF{rMXQ#RP}-qCoYr{TM-wz1XOEf8e7
zo8NZaBvN<ACBywn%i3px%8SAmebe1euzztl+hJc~68Be?WlbW>F8S6;r;e@WEOvkH
zFRnAmJL5><laPI{^5=JjY?t)(F~51&<Ltg^Gulr0X0LiUIe6AN&rd&1@~v)dcRxI7
z$pSvvh^KeVFF3R8^8dMLvS~15=FvaAPLcEe^B$Y})uu8o>|;Wd;eO-%C$Te`_09_0
zFPOZ_{KHvQw<rBeMM338RMI+&>adq?=QY=EzG=n3{8;yKJ~^S<V^P<_S6kewlrB{e
z2v88nIK8h*b;=nnyU@7153@>A);~IYY2GO@OI1Gc=k?9)d{f+3+R0jogy_tjR;{ye
z@xm1~rk4e#Rz7+$<Iu*7tP}lSR_Ls~H8Ho)>gLr7t(5_@r^PHe7VGJFRKBCjE?M{W
zY6o^E#@55R(a{_Deu&JSb0KoM$fXjWjU^GnQ@>}OdX+QxVfIg@xtG*SwZubBtmDeJ
z?D42fS^bE^ChYT-D<ythS5L02U*B|e@m0YqasQjzi#TPAmwq_%D7E51)L{|#``nr{
zWAC|cy;Jfy@?lu3`kqs(xX*u<T0eQ+8TISNYivKqO$$0AKlxGQ+O(+(39OB7g?B%>
z?5&Udv2}ao&eO$vmIl6?l(lX4th~~n(H`v5e;2FQY<T82WsZ>Y;#pAz!9IEu6Ld|k
z=`h{(pS89lV#B7zCzij6*x2`S^70U$EWhP`V(K!7l9yV>#fL0C`=n32cm~$eM_YgP
z>NnL@UO@pL7n@f4$%N^|+Dr@H{OCx1P?QBX(;88hUH(gy`ef>TGRs5y9$(>o^k=H9
z>cS;^a$*ja_|zSr`1psYH@oQhs?W;=oldTK<mkEdul%)zkLI>44V8VG>wNN4ugcNN
zjN^q*dgOELR3CO{8A*q4*z*37j$3Kp&OJs;=Dj-VoA9=9kKX?HrH?IatGj)!m+r2b
zc;Q@iA;X3wOWr5>W=JixuUC7u?jBQL#Sp>kM!ojg{1um&CwjQd^jY?<xY5DkWXh(~
z=`077+%CjE+m(0N!aGQ9^2FD>Vr`Te!VH_<DV+aY^5n$CWsd8Pm)@PGB+J24^5_Vs
zW#8sY!7K?kc1by=8%gf{*qa|yCJ_E>*HRI#)@|=MhapO%qCI;5dCO&%D+iuTG3s(r
zn)-h7$t6sU2lnK~To1L7iTn1NVL|M)%Lhsgo8lxQSN?3>adjUb!>+`$=N+$i=R~Rq
zWm+i3y?i}QdH(tA|Ns83zI8mvZ@%5y#>S;}=bvG1^6V+EaEde9vT5=uRg*{kD{FQn
z*sMOeV*N|+Y1_{)cy!ZK_tw*<$8G91YrnWN=tO*0e&IH8ZEfAdjvbM6qVK-H^(eUH
z(&Xp9D~t|K?mH>(8EVd{`m}PM+Mz_>ihHLX>v-;4p_bjhHR|byHuWc!^EMS~K9dhr
z3g7IjrL<h_+@vRcR;&IBHf~Kj%f4%>>EW#t^Hk5ReOK-aZwBo-b#sbU98dm_gpbqP
z^3QKrvL)&G>94+;MLFv?%?szMc&dKo%9g+L`7=_^vhTVoZGCEDp6R*Q-<%%8n@0IH
zQ)XVOSS;H9Zb#6hDW6|woGt0qw+fTo%l|&|=@qUE&e?Vsf?iL|d-~}9uD;?(4a@u~
zFZ=Xn=tXEuztHjc#LAkh_w7Vi<{3|#k+*60#96hjSH66A&Wj4>oj>PNiQlC2;d8yi
z{W>QG?$kP0Ys}ueH7AxOD(k%NrCPz~Lh&U*R~t*B4C|W%raiB3{&-2m30(U9|MT;1
z$dQXHRzEuGdj2xA)ygX7`!Pu_|01FeR&3j%AHMjk(p+2X{J6?}Th66r@AGwiVsW*5
z;maEjpY5+;czn%w!P2X)yXHTN5%Wq5mG#&yCF_~-Z-@EvBM%?_$^USn@sh?>cpK_X
ze5uqTBmWrVvjI~teT;|-3TWs1q4IM}`i_b>AIp3;w@h04V!FJCcG-@az5};5uVd0(
zt8?kE#B(KLn^a+wyDR_gz1lsin`P_u{V(2#%w4lHAi~Z)fj6qWaoRNTm;ZW;BRx*$
z?D1p~KkaKiPc$#IV$qIAi~d|Kn7bvvzfJmGYDDik#xVB}z1tbrL{D#=7S(N1sQ1zJ
z`Pw%tK4s@`E@J0@+2HTpQ<PmEes|s1r}>JqIa?N3)dVO`)wj~yQxIwO{gT;%s4aQS
zx~Bal@yB-F?CN0Ew(hFw>JxoE!>)3b$@JNmS57`!+5aITGjq27s!M4_-jh%6JhJiB
z7WY)m__Jl7^&Tu$@}2&xwNK3b$JAPXe@`y0x-B#Ay}7yN)Md4)f0y)WPvgsON|lK?
zeC_OPRnyC>&0RJXuP#5U)ji2=yW?^tLCu+S>|ezcaF_m#Ui<vMpIpyzQ<?6QYl~0+
zI8>bZa@(h6+pCs~6uLb>-@N`=Sm}c1X_pV|<Jc0?TVn2hZW<Hsfwq0s=DWjKKvm8|
zNE_^{?*hhzwTc%Q60Xdux6e4u#?Jor#p3>Nzf2g`1ojZyDb4M8z3t1vK!#r|_&ckQ
zghMxYVD$9<b_$w2D~#QqI7d};^2q{c-V3Td3x3adUTIbI#N)EU^~byNyeINOI&(6|
zBVTGV)%FUO$ZLymo$mWwlwu@VIq&+$zs#>?m0#E$Ti(aK&9I4$VX=hc_l@XHtj7&=
zgp})!UNYrpeSFH#?WuPC{H_y{YiEAv^FQI;7FHItv&HR?;Z%O{o^(^mucoz}7r1*C
zBsTb8^z@%+zOdlu!V;f<9;<eFYG|JSY$C{)edu$TT)O8cSJTL9odX(7ywOdLtf%YC
z+)XE)`1&cQVV=^34XG7AlZCHt%(Z$J{?<Y2g*uDWx0Xq#j%h#6*tu9a%WA?oRg*^+
zMOyJ+xBI)Uy4|C)Z1$VHC28@3AAd9Mby|=(N#APaD+jB!Gxj@boEHDnRG4b(KW}=d
z&5W=!@6SkAE?4Svixt(^tC}Zw!Sm|wt7_9FCfZL6Gnl9Q_ViVaiEjNHx(-h$yXPj$
z!6L%Ja%<E2I8N2gUH((U%Xdi0-dz1-!<OZnT>Ux^AH6DZ(3#y!+pfl{Kx0LOmG1Wl
zCwJ$-pHnVXytL2$k?`@+B7Li61vw>-OM;;tq{c`0K;6aNQvRx<QAbNX6I402C^kAc
zJT%DWURBfO=l5bwFjuD4vIwg+ou{fzQ%lWapNAe@<@Iv1)zogSS+eV`qvBLT@2#_7
z>c47ZYC3nalg?4+a>JvHkDa{I9$%d*t9!!Nf9<ao4>|qkh5t>OYf{zdaM&)s<ld=1
zt^ME3w97wC0F^M`w~76j^>*2^$b0SglrL;hHecJ8d>@uC56`u$^g6oaS;?!E!h6a#
zVY`Gciic(z?|gjpbS+ZGe0k&HE3XM5ElcZOa5C`<2MN0O*)Q8-t#!Qc6<guIQ+<;H
zg5u29C0MELe|)0wPuJ4su5{b0_i`k>(nR^awBG*Tz$f}%MQ80RjeKdZs-?*y&lk!b
zpJ-ecuzF{qV1(xJ*PnhnTJ>GtynR7Q?Da3MJM!kwpZon0!>{8-QYY@qAPx6Ca+_)g
zYFI!LFvVRO@W{~*7f~IdPM0YsQ(oDLbFfVDQQKYP=1`x+(pwpGJy#;#^HhpaQSA2a
zbe1prZWn6Le72FbELxH|;dNo`_N5-|OpJ3a3Z42MulXX<xbGOpu6|Lj*3{#bmPRvs
zY|g*F@vre~pJ0jn<KVrFw<R2z8v=V4{Eo1jfBoOz-_}(<mzVozCnT&abnxpG+@JJv
zR(n%ns`}zjQ}_G3KIyr3rn+7IiK?@<^~xA0<$p6ywR0caJgeu|tbHsmSluod93W<_
zLo7k0u}$~jf~KeTyBAA&KB=lSbMP0;xM5_o>}2Pw8)mYfSC=X9ei3Hkt#<NEeLS^r
z%bkmYrm`N-g`^5)ET^vjb$hwe)m%5B%f4miL7Ufi{P^1tr+C5Or1;#BQiZu;XYMOZ
zdCFaPaL1;3>gP{u$@yqMD}UCzCs@#Z@wzT?aa(`>7fW8<&6@1pb3)!*TjKn*Z%?zP
zcr130IGX6QJ8v-`3lkR$Q|`_1^(~Vkk1jv8+B&AU?@ee;#I4|)N}y^qtLMQ&=B1+Y
zXk7@e%spS`o7QZoD7+{x8*E{=OW~5HZ2wYK*3uUah56NOs!L;gmrvqa`)HTS1|gPP
z6AEUOvVQ)Ft^2U+-0H5-sVLotReNF!S>#q%W@TBaw?=fezf0<3KGr(r%(2zl)=?8?
z&x`sRcvyIz&H7(QtuntbHMZ5FjYD{TdY`NN!SuGT@8&)Hd)*f#y5~jl9^c0uRwnXO
zL{_`ay7tqQF3+<subh0e$Gu`riTWaNRd~F6`tPF7<f)ncr-Js)dV6W(;j2>>R&sd%
zy&%jYrAAcqe%0Qa22;*x$xR8l^*>Qo>z-#s)YZUyW>da+9oIPLY~81v{%1j0@nfY8
zL4DVses3<3S)QKn_;Qz?_@k^FmHK=O>UEYk{yEEtG@6<h@-n$*5m$n=GWAAX{X<?h
zdZ;Y&Q49XQ(?MZDiqXxd#!Lx<$}jYaVO89T(z|-|1Q}LKIF?VqQ_C6j2$ry;<u}GJ
zV#+W09tCe^T*C%-v|tJQ)6bP}@9*Eg__#&wuPtnB(|*~`4o*6<K4RCig$Xe?Pp+tW
z`aW3Da<S>>dk;A)PhL3Xr#1aThyAio51T%&QCqxknSSIwyXLNR^{XY*S9Z*~xN_-s
zW}al0yW%xnepR3LaJHW2Uz+^MJ?N^hlV|0;<(&l)!t=I&vhbdyzv|?z<h5az=N@ua
z&Rd=n)AiGR$_dk(byKDqMEvF`+0O|bWb`<E>gGiBK}MU<{A|}OxAzC4+!p*k3vWiR
z_t<-G=EO@Ciw|zFUiWkPyx^oKGrk?WZC1u!)#dPgaX`?`ic}fh@+~Jz8bjt76=2K5
zv;Nh=Mhw<j_QyQh;3rq*aMAW`8OIt~$Y8-Lz9qztGMXb-s2Q6*($AaCT<7sRXIl}|
zr}?tce~)?`n6NME=*4rlS1>m=Ff}?vf4i!^FeU8c%1^KO!WS!7i^@-1#e89oP<!|1
zomi{btYzS_N5j_S#oS7BVQpuT?_qQN%1q~ZX>GamdeY7ox4yTbWksUmW{l0hv@U?F
z+0T<h?OfH>ORj0Qn#cz0$X;`Kx_8zl@VMkYkL6!H=bmyEJ==F(R#$(LR(`ll<MFI{
zvu2(1Txhj8{(l^6xBF`46?^M6%U><I^m5A|znp`gk3OC=_rsQ1u9^<(4US&?j;Mwq
zt?5IPpNH<3^7H-iEn~;SxVEkBlDun@S)`7Zo)-T4FZJQ|dudPk<SsGJ*IIl>^=gi}
z>D^bK_D$e3`{nNcV}X;_x#ic7-CO-f$MNXqo_QO~1Ygu$%5go?G*#Bs&h>cLM(_DH
zOOt|%tx7jpJQR@AzT5etd)1bicRoIPx-aHYMCz@@o2IN!+g<Xepj6dE>r%<e_!k+4
zE%7(Mf0?pm!6SD~{cGk-chw12+~WN{&R7NrJlB`>Jo>ZYu|?4_elz)}zZT6pb4*m{
z?QMDC?FEbVE#ju%Uw^4^&b+;@%U<t_-RqI@e6IyV#Kt*npUkC^=4gJsa+{j>SU8jc
znll}!GKoW<;$$xkij%Dw)4A*0(rz<lGbq2<_W;s?*NCapkezHlX;q$(*Qw7ozAcAm
zeb_Vgc;uv-K;LU}*;`K)^7)_mY?Jyp=#2d$m%M*zD?eI^haFBnBAG4L_|6<w(?>>F
zHU}N=R(}5B;3IwB`|}b#GmrKy&)R<JM@UTM`N`qGx6X<;ap)I(QD=<Y63F%U`pR}}
zl1h2Z)8O-}eJ6d7KPi{7>`VTW&J^Xm;CCSU^u^K-qWjUtBbBmlUAnVnnUtO7(wB2o
zo|e2ysk&$UE`$3wTaWUE+Ea*zL)z1y_Y*3ADXgwASUaQspN1*g`~_OcG9m4}*4-DD
zOH0kPHOsx!U*|o^Dp67VJ=wycwsw2h;@Ith>`aWTOpV*#tPTeaas@xVD!b0j{hOAZ
z&fAqa6N4WW6#g@>c;S$FwB4Vbk5$xr`BORX7a1B_@n=n3Qs-G<w%)rgpImn=*t0dv
zD)vox)}`*S{-A%Uik{&1dC@|F?4Wp7E1A68yP8T5Er0Q(<($>h3CohZmL8t9Vo!K*
zSo-T8pVQ(mwLYH4R>X*YeIL4^VvAMNt=I8?GBjSE^j;=X==OA)`%M<9Y=K~zTKy#{
zW^u7MFE+u3CZDa}ma)SRG`7q8-Dr(1?_uenBBeEMg6!9rn0g<H9CX=R9}6CqY;G?(
zu>6!pxhJRzvfav9=F&m8{~tKzLp)Z+9a&?3KL#`=pmgEy67>GL$o^MdogX4z`nf=d
zBlW*O6*{hUS#Ijm8q?cLliOEoI|fZ$cKVT%d$;nRQ~Q=LS78;kkD9ebFW$rF_>=W6
zR?CkVW-j`c=b6w88Y`5Y_1L2JGha?w-q*N-hdxI&+p4}7ECF@Wuk2Yac4t@Y|8FmU
zZlBElxRCdFQqk)>M*BX*MD1Ez(;2<@^lIl-JB~`5=`L?%+10GWD%HSyI#Z#3Gx8j;
zWd_3wrDqEm6J!;rH_8a=p0`yM1{^P}DvV%=2;L=^VP_!55Or9D9chG<9&^xSPj+7k
z*v|jL!f!i2C&RLedDkzM#qw{t^6MnyfvU}O9JPXFaLkxLW|0eIV37L+S_^<W!5-rO
zP9^8+)z#tEwOkArCiP02Z>ycZjQQ`QZvAh+L>LyRn%}P}zWx0q?jSPSdnRwMRq?Z)
zb8{>gv&+|PSo-$;zTbIw>wdr8_4nIt>zXvz@As<LpPOSD{C(%`{Qa@t@0Q1hpJRSe
z-go`!`T0dM%b)h|sd~5bxmAtX-RnAa-Y?x`<ZC`0RIM+(Q~UkyuHWx=TUW^)h`RjB
z>cvx&2@d5KvmV7<d*`wJ@f@kdExmP@IvtGJ@2bA#dN|WKz2yDg@7o^sEOA<RVWWlj
z(c-7fO^s8N`F3%iDn6I0Eg5-@ZQq{#SI>F!^YFYVp8xyKs&9-7iX|M&4;~79<@N98
z{tu>eWqvYkXcR0F-?A$zdFSt#x2?OJ7B0AW@uJz>z}l4|UVV>CzDShX&b;#CpP_Bg
zuW!D`_buu?@jA;qpr~a3u~X77rhj>U{@(iCyQ-%-1otf1Xt!5yQRnCSwcn@jySt&Z
zeOtbyPHlMa=h^kvt8;8LUK;;8GT&ygudP+=0y(DMuiEyjZ&vl&|788^oB71XK;h~7
zbDophzQ4IT&Fe_xz2q+D+VkJF=U@IAzti#dc8|@|Kkc=XUC<<G;!|m4xoWO;dD#AU
zl{<cZUhHWb`T5V`?;-Q0eV>WRKX_QZWpi4dmF(y27tZyo|4iiug?GuycN3&v@G|il
z%k4{F{;l8h|HCtLZ1SBFJ%63q{nePiX8VqVlRaw--UxcWzuxj(bo<Q>q1M~-FDAVF
z`u<<fl6cT8`>)Gug@2tn)O@FO|Ge5a_L>pD%p}gA`rZ8B+dMz{o8&iv42jPjb#Kdq
zcNIN!Jv&8S>Q+>7qyHqkrOBO}cYV1t`^(4umFxd?s=Q3}osuO}7w$1@?-J?yhlj0V
z-V21Mm#lqu8|2u&g~mKe7YrV+`#t|^xAD9^i~V2ZTHo7S@#Xif?Jv{cY5X&k{T+CB
z!{`4O56`-~lskM%eZ{|w%5PbQJMJ9s*xKW8c!K)Z&iYp;KGuiIuZvU)|7zvxH~0F?
z`+EKXHVew%{|T+l+}U0^*MIxkZy}9(3Kt9(Jv%n>`~GPA?X?cYrQ1)x7Ty2D+^YWB
zcJI$8>KB~1-{d<xZnt~>t4BAP?m8^ky+Ans?9PAp-hH04?6kMGjAy$1^(%*b=lNu9
z*^;IFze}+9o}#DY+pqbTj@?$;wcO<4o4(~<v+u{x{N{1|&#wc|Pyaso^5eO`3J$jg
zUg$;qSmvf(X}+s<{mW~!zn7nnmHNB%lKkC3%lE(C?}p9HUw7>5w!QvZ+lrT$y}Pr1
z<K;`$_SP#`=&%1Xr{sG5udaXh=j-gN`^;<o)$y;-N2SCaJ60XG-4T0xUr74QyRque
zbgwe6dGL3^?j>{I@4mC{d*rqsaWb>F-Cc94Yx|!yX<I#KdvRN&>Dw;%E{@)kdwM~e
zS#D5e?D02CZ+$)8d}~wf?o-`%pTgH=<ee7FowYY4cIC#*+mBL9e`@b4c-XbWmsR_y
z^tbhe*Y0h&pR}NHYnS<(_{Z;dzuy<?>-&LI)uI03UW;9C_Wgcm{D0v_hMa^hW`<i0
zntTi|lv(gD_c`@tZp-s?b6<beWN`3~+8dZ^nRDN>V(VdbW`^9N&&RH9i}qvo?O(9}
zW77Kb3=C1l>A%@8oN;7s2*ofqwMvwI*Xz&xyM7&NemCj1?EgE9V=bf^Saz|`vzUBQ
zINeD1XuzbtJJYYcyUi?Xr_FH9;ONCv^>@85j_jQ{?eU)9-wrIYurE|wEd1Tgs<7&G
z(W84E&(;;13trG<+12fLM;dHI{{G+J8v5=`pYuJ!@|>8`-zVn#Ry|q&FI)7}&w2CM
zH^d3P(92ApBVBu++rRd6_OB;<1(kS97>X~%2FxqgTP=P+>|3DzvHacEdtQBxUb}qX
zPt&<SP6*aM*r9#Au&UPTz^;QFyST;r=G+!d_ZH_r?`ylvUyj#!65Fi~hjPc&;w-Nt
zxeN8I&A-n0ciMLUo>P0De7Ue<@%DE*^{!v0hQ)m=Ncouk%9d@7BFn7?^>ZmDU*_*E
zyy$VeYR-Fa+f6TC$IJh}qV;XYW#`3pf2X@IIgp<|wU=FW=dU;OpM3eWG_EQ<=>Ny~
z(EWcu&R#nGdUcLyI(vz9@dev3>4(DK-LyV#m3jVt?rF1{yaSRKba$7n&pGZt@6!K@
zB|nb)GGCf{iEH0OTf4Wnlx&Na{yd$3S9Z#jxKD-&YZWfoZZkLp3g_JN_Sb&h5gnUV
z{yyjbQ*-#a%<+r0E8TAu&AGeZXyy7pT_wlGUf%T1y{WoknZePE$zSy(qWV4uh5h+x
z!|(p(+F!%k&0lh@o?XAjzx2!D^PrVKadpm>a+UvNzP3-=X*Sm~fxq$H#;|F3u67r%
zziz+%Zmj3uyUB&D-uKxaM^@GgT$;-+eop!Km&Q)csmDL)-;R<=WPUB!Xtp47iS*G*
zOY^;JB*T}AXYKp@Q1oT@^i!Wtd^UXCSm&^ycZK-NeO<;4t{htww@!R_+G2lRf86cY
z#SA=&qV0ye^Z89`_CGC^O=svfXnNP=w<o@>_4|X2-RjFr*G+vZCwIMG|F2=~wq0t!
zcVF(lZhgI)CqkQ}M0`s!>#;-E*R-mZpAO2Oc{i5RR`+G-MD{QF_jEkhxyia87QSS!
zzyF-<)&GCDAHDwn_W2OGD=$2p?yvhEF}+S^fvn8=&tZE?N?qAYWVTkF(6_t(aPrGV
zW#{DAKe_uM>f$T+IMb&VR{JhVhnjho=S6>rh_kA7{Izh&^}Ok2ywl|7Pn~yH<*iQb
z?>DNMUfgl>r~AcEd>8Q}BD3DX`fg=$_HEtejb|LoPfq+jDYvs^`J<deYrY)4dCY(Q
z?gc-C6-uw&x>{Ykxt3{~;n9n(tM^J5#2%MCpwzQq_nQ;7CsXS)-rRo2cl~dU6T@ri
z#&?ZHIrsPRg(rQe)N=S;Fj0Wv)&gO1&Y8{VtN&)k9X0&yeDACH0ja{zhi)f?pD$T3
zzjoEf_Q^~Qn(KddZhL>JWWoN=y!YaS4@iBSX2<>I^|${e>-`xSs*Zi>)neFiuV673
z!y0Ccl7X&E5Xo--fd{pzGc-PGiXaKYp3ZwMRy?-YYoWuiMl+Uw%k#>+b}9^OJbelo
zXu4LFiV20c^mjww<C5PK7!takSL)_o|LWi!q#*F(Xd>f+=SDMqPTw{<%1G1-+^<jk
z4uusSS8UjtWLeI!?NrGE>yOOL2ciyQ?;|V=FI-dpv!?E(e^`NxdvkMhtkvR0P74<}
zEe!a+v$2tpm*+#Z><c!gyQ!^Cj=Rg>Uz=xJ{pDQwzRgRo|G66fcj~g`%fB8G_AjyN
z`&kqB{Z4Uz-tM>CcAdBX_v7)d|NnmP{^!m7!kuMT_q48f<);(MmHN2dPqXvMWK`8{
zzgsrj&E389)s>a1-_K@9N5~$}{(71FcB#Yhm#3{+!lj<K-jaOT*vMG><FI_(S4-1R
zKOXnL7M}mZ<?u_P1@fszGpE^`Onc}n4q8ESBvPv{;r-6%^R~I<7ZhwrE}Yi&{8R|X
zh9aNBl7sK=?tb3-;p1`n>mMH<e`?|9z5ct6zk9#j+Bc84-OjuG?(Xi=cXxJ%&b@wh
zbvSsX?$i6vPCvEiV`F2B`e(^_<~YYL?r(2y8o&Sj_;`Qz;Wl0=DXFZNAcj@lpNh-1
zOcC`Gj^z<{^W(QfC95i*YF%IX-1`2?&d$zIU&Wj|I|BFr-o1bKqwCurHOv25ur7A@
zwTsDDN-xhYc@g`&B>Cm-?ta@PllyJrcQ@WEc@cXn{GNmV%kFp2r@nm`$>eL;^lpP+
zTyyN(eY*>5cbvYyVD-Fum-=rf+rRcN&40emX1(`xy{Y?FAN%=p|9|G4lh1qJS}Onh
z;=MUq7dRS^?J~8nSm670-j0{0Rk@i@-iUtMmFN6%{lU-Y>(;A1a(Hiev~gdE^}70J
zr|Xye-meq8?@h+<Z@jkF>IsTWcUj;5O0QF2#$9E`dhvj7zSWZQQ1!N@%lBz~|9tb<
z`S=<i{<$?SPj9CFzkPUDarn=b$4d$yGXBXA-?680$!zySyPi**a;JU&;@sQYw!VGN
zaH~<XPftUH>(uklr=EXa9ku_?y1yp3(s%ElR^9h+d;8aQwU=Jn?~9lJ`=X-oU&Zyg
zzi!?(7c<}S(sx(({oYCQF8pw}kGhlgu1nAEd(6|X<?kj<`ThRajpKI9CWrs)EYr2|
z`1bkNk@<G3o_pQ5Gk^IinSb83R&MdIZ}I{!6x=Sv255+wn47D6N=Zfitp8N@cKJQK
z+qRS9e$KYJyTbb2jkRZ<=1%?j*y-OYz1Uq#a?PhMS1WtH{N6V&+s|jyzbxHf<#xVm
zUfHSj*WYR7{qGO%&-(oA^^*KLXaAl%EAMjmZK%AwAnSb2>uYO!<|PU>zH8dK(=v8%
z)zvd~r)<uzezRG)@!pQY$D86N|J}3tvbf%hrEl$*^4BN0Sc~O-_%qq6JaPWEe0@LP
z7Wa7<#P7B*oolW7Kl^#_wDr5+S$PV5H%!u1z7RX%{B!NZ*t4_Qud?lm-5xOg`^@vt
zZ*SVaY3km<OTJarDr;)Z?UuIN|J;!G_dsmb-#yRgUte7R^3_K9>gjbq)$=E9i7sz@
zuJYacboBl|e_UgyY^j|IY92PeGdN!Oq;lT6*xk#V7H(LzvUBH7%d_XsWhEpy%r?)@
zJFR==Y3(-a3(d{Vw>BhNYAa>s$()>bae95gg=(psng5SD@3Q~SCj0NGb;;(q_2K*e
zoS$M_?<l@y_0tzcpDnL3=?RtHc<^9>-S3;{wdSACE-MQ&Ha6Ct<@dqH-`LoA>WsQ?
zo9E}A*7$X6Yxb<UbFX^q@4a$u{mq+^vAfH1CGB7H<?8F7(-0}SyDqxq@gd*5s>yt^
zRg?23ZF#%&{fpb;DlaW<zxSAY{xbdR)l1Qn_x#&tKE>>Q_{?uRDpl4rSD*g9v+(0S
z#%9nM!p`F7U#4x}<9dBv?B%DYr+>ZoeP4L}kM{Z<Ys|f?-dEpWeR{gS_WbkNpP!vw
zUAK72CQvY(IkV+&*_#@>_?hf^zG2Vj?F!yq=2`XEu{I^$@423b`Lt)V`S(@qm)oZl
zyQ5%not4Zr->2b!&BN<|@0WRd$8w4Kz7G@D{l8iM^6Yy175w}6?Kty}^X=t#^)lCw
z|NHZL(vr9KKlQ&n+`fNZ(G_rx*><_=#r`_q^ZHim3$|C-zW`;Js{6n1Etj<}d$DwS
z+@%K(7MSJVTeEQCLe=M)r!Ommg7C#$`}(;3|9|h_|H}NZyo}5hce_u5bM5Q*treGF
z`sjDfn;RRQ_kWGvzje*a$=u?48EI*5L8VK*DxaSE_V%`^iOCZ0>3X5tH0}3Qetvf9
z`+2+HIZsWax944bdV2cS%Fk)J_v7X;%$zwha?6^$j0_L!@^>)@{ke3`7v1BZC0HWP
z!^86;c>b>`_dd`2o^iZSc308UF1`4Dd)CzQ@bP7xo~HZjAb;Hg|N38-b9Z}0%&W>Q
zUtoJa`r@84%SEeirX^;G>n*&!r*d=L$F6Xl-*+1FlKFOdv$3;(ed%8xC9W59VO#F)
zEs2NQPDwpk9lrkB-&wO~2QLh`(8ephCHJ;j?2dwkYYV5XTCFQ{JoB}<d^zhHIpr66
zTJFEDuCLpgxA$w<-OA^4r(Tu)%EQBxak!25*CX-$D?qy^?*F>B{gzbv@xqe7U$4J@
zHakD>x6GF|UTF~bbK2hnS_bTQok8{D&J|PdPuy;D{&R?i$PX9M1>G~6<CLrZR@Tn#
zv2VDVJV^j)ngyfPcIu1O3m>)1uY(yHrj<Nmv$@>J*M1nhFU3=xZOSrc+uy<N;Gw-)
zXLjG-=lu+0QPVPgp+&o&rLB8$>ka?xyvIB|S(mR#KehOi$8Oc@@V(=?s7dwDMSGk+
zpMU#0P2m5}+~_aw=I^RK`S#x5>g8K2Z};`h=fCitqh$KovoROfy-qK=tsDJ?JAd!u
zrPu!)J9+%e+ncZ0=U2r!w(iW9y0c;B+UMJ@=y%_GYgNj}u<A#7miXBitM%3Y`=d+V
z#NS&OU-7!Yd%b1xJ4s*r@V|Q;&TGH8*7(_~>bc+97_0j$gJUnfdD;!;#@6jif6lO`
zoMo4Hn%>;&>s!lSe!ISJ&(rI3EWh{sbAGk*REd-2Ir;s+&+huWRUah(Rp(Ni;(Gbp
zTZ8vYRn1-Z?SnY$hIxW7^k&T7dFh(P^r^~o_nY1RR-AYB!@9Y@wqCq0l(~R;M)SL-
z*z4!dbbp>%eEx;`|6gm^%+2QQzq{e(uVsaLzq?PWn;Puc`&WH0&ry$RtFl*f%<dNi
z`=4ix@aHILuZ(ltes@#qz2yBrucvP<eZE$A|GvOE|L->cU-16f_S2Ft{;C)AzpvVP
zjL$>fzSM7ahsgyomR*O_^y6c;L?u5waq~0RuBxY#%<^uU<y+2uYH{8A-G_D4Uz^{1
z_~LQ=k9}=saoZ2s=3m+U?|k@cS$*yL`pA>^|MvZ>TRHvhF4y`0mPbF|zwBPJwvF}z
z@fpqUHY}aCZmRO1ba$p*r4RPltT%XH*j+eniEniNmGl4aW&XYM{?Fe%>ywwyyYk?|
zG0}HhrJm>4e`~4xw@}{W)~fn#PZutY|8?d2*ZIp&-?v%0{Qs}=SN5PWgk9}oZa*HE
z?~mNhHz!=tKHch^^`7osA8+x0QJ%g2)imAW&-=>ao}c`@XX@J@$JSOQXFhooTkB|k
zcT41?FIUR<FPHyw{<8PJKZnj-ohHY8jcb`j)r(hCy?_0f_*3xTkGuKT((V4wsC)U=
z?6HpL{67IJ9v07g{_=VK`!8MkV%L`a?bM$W^n&}+clqgY#q8yJi~b9|(91AcbZ1BE
z?0=wePTs$v{@&yLKen0cRGqysza}+q&gbiCrUqLUzTMuizT!)C-QJLy%Oa;$em;6B
z``%Z<rFpZjRL}cgxYX{SzIT6I*r)#Uucw+8U-|#~%=WMO`_E}ez7`Ia0o9YH=H|<@
zudmabzy6%3^|^+9(Ki-uwEx+~)#{Ww`_uJ1cjj=l9$I8^9+bH66-`dlkI#8sSv7C_
z3z=!ZLw|qPJso`i`uRVJe)qL%f3Iz?^ZtFz@72o5^;;6;e%9H3xxa6{{&cyWv;J<L
zw#>d^YlmQo_><3-vAe_e#8w|}<NZ8O+x^$||6jKJ`@3-dg*$iV*qopI*g{H5>eBxI
zpWVNfBp%;masT(WXwyHlW<M1@xAm*d>HR8UQjy0CO)R#2`oDDB`#TG7{kPhFXIs4e
zr~P*WXSvU-fB5m2s61<gHAjhf%<eK@V`F39`Q>vMZQtHq(*MuZE&2VgLQyVOUOv88
z$?E%eX`K7M=d0+a`<r~j*Khkj|LeTxFJE0<JvCnKw5fr?0^Zeglo$hC7wk^R%UdV(
z;^4tw;y+~49qxb5ySA}?-@5q!H_cz%aE_lZ{(R?5?O*2hf0b{QUQUbMR}*<XcKfB$
zW4)qWtg(BmLN{;TtUaq+PD*N$@rJI*&E4T&w=4-?SHpi`m(v34Gm;V^3j;2^d9wx-
z(wcphx2GxnJw3lNMtc2i!~Ctsw%(M_`hGforFdM0W8dS9%gcOo<Ie`#ou3|8m3g!=
z?yN|=%GZDMJPz<N-A$am?cR$2Rx__gf4j3{=1fUmK0dAbtsiGgTb^q$i~YaJwg370
zbFVHf_5SsczkY@9Y_pg8>dUvj{Pk@gyL;{e?$)R4kKEW%xY#WB-kwjwI|>)aT|8B`
zd)q5@ulky^Yu8WM7xm}!>b#hmW}m&s8@4t%l+Sp~^Wr3T<=)bQfbjKkSGo1~Ecm{^
za<|=A{`<MV(mc0*3Qzy~&piM7(Qa{2GSiLT_To;f({Z;8;p<`|0~dV$xo2C<{zIqB
zzfQaP_kHlM-t(UK|NZ*@ReXKL*1EjsZ-1TL@8xlS-<tIvxAZ-K*Lx=a|6KlMW$bp1
zPp>|$&cB}j?;PXbW0Oneep|o1t!?eR;5A2ycujfP>V3r@XT_OWtT;Vg|8?6!#lOE|
zZ*MJp?8d8OnEtvlPIcCF{qrw>y<UI4Trci&dHVLO4AJJRRa~u2X=!O;GB2DKZg|Aq
zQ}yb%mBq}<+x?b5v)%KvO}6T9?EVE;o)>l5|52Y+x$(!gW%|`q{q=3;uFm;B%le<a
z?3^omuIKN2_`Wo)=zr7kuHVepn3(ReI?vv&QTc1nzpK(_FH@z>UK|yVzjCx&T>JFP
zS(^FA78Wa{^L99%KgaW`e_z>3<@uZuGLGlhR&+UEI>oH}@>uxKlE?dh1RQ=I&6&OT
zy7_JO1j)vClg{2Qd(pqIEbjf??XK2kJTF_t<1TpX?_E-3ci*6mnVDHiM&?TC_1NXp
z_r6KBs?S~g??tw;?C%3%=Ra$CGldJiXl!IWd-iPUgEI~PTo&xk_`FT_*O@D#dy`(M
z?tS%(aqnCA_~^*Hf#(k#XfVsYwM4(>vt;diYvW({w)V>YHF^8Vqc$TW!_|EClz8q1
zwm)uPNp+sR{Y7N%MPp;uzlW#m>HREQa_+z!v)KP$md(vluRcg^;gvRjIW0QxTIu!J
z?TZAzJUcskYwm3`OXlfT1!WHZ6))I6vS5~#<z0W||BrJG`zBPUiB|7WOMl>XH?@gj
zTED~Mq>RsEyt(%_eQ9IZ)l|Nj8ENI$<>CvQr|W+K&F`iAu>bla-2WBEetG=gw(H9o
z7<4l~M?dy3l6#T=?`}L~Ca}?A!Q0;^vM>Dp9AMZGwxNp|U%Q0XyLdIQ?zbHs9~<1^
zQe<=f^R6m~<1e2*WH>M<Y_s*1ho2*soZipRkZ?AM1_|n4eYESJ_Cxa<_AoFoFnGH9
KxvX<aXaWFlj5z23

diff --git a/public/js/app.js b/public/js/app.js
index 1a98256c76..c5b8cc7df5 100755
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -2,8 +2,8 @@ $(function ()
 {
     WidgetInitializer.add('jstree', 'jstree', function ()
     {
-        WidgetInitializer.includeJs(unicaenVue.url('ext/vakata-jstree-3.3.17/dist/jstree.min.js'));
-        WidgetInitializer.includeCss(unicaenVue.url('ext/vakata-jstree-3.3.17/dist/themes/default/style.min.css'));
+        WidgetInitializer.includeJs(unicaenVue.url('vendor/jstree/jstree.min.js'));
+        WidgetInitializer.includeCss(unicaenVue.url('vendor/jstree/themes/default/style.min.css'));
     });
 
     WidgetInitializer.add('table-sort', 'tableSort', function ()
-- 
GitLab